diff --git a/doc/cowtest/cowtest.md b/doc/cowtest/cowtest.md index fc954aac99365251206236a7b064ff1d9d731801..e65f9c3b6a8e912f614ce186c1dda68bf428464e 100644 --- a/doc/cowtest/cowtest.md +++ b/doc/cowtest/cowtest.md @@ -313,6 +313,6 @@ int main() { 测试结果: - + 这个结果说明了æ“作系统ä¸çš„ **写时å¤åˆ¶ (Copy-On-Write, COW)** 技术的应用。写时å¤åˆ¶æ˜¯ä¸€ç§å†…å˜ç®¡ç†ä¼˜åŒ–ç–略,旨在æé«˜å¤šè¿›ç¨‹æ“作的效率,特别是在进程创建时。在这个例åä¸ï¼Œå½“父进程通过 `fork()` 创建å进程时,父å进程最åˆå…±äº«ç›¸åŒçš„内å˜åŒºåŸŸï¼Œå› æ¤å进程看到的值与父进程相åŒï¼Œéƒ½æ˜¯ `42`。然而,当å进程修改了这个值时,æ“作系统触å‘了写时å¤åˆ¶æœºåˆ¶ï¼Œå¯¼è‡´å进程的内å˜ç©ºé—´è¢«å¤åˆ¶å¹¶ä¿®æ”¹ä¸º `100`,而父进程的内å˜ç©ºé—´ä¿æŒä¸å˜ã€‚å› æ¤ï¼Œçˆ¶è¿›ç¨‹åœ¨å进程修改åŽçš„值ä»ç„¶æ˜¯ `42`,这表明在åè¿›ç¨‹è¿›è¡Œä¿®æ”¹æ—¶ï¼Œåªæœ‰å进程的内å˜è¢«å®žé™…ä¿®æ”¹ï¼Œè€Œçˆ¶è¿›ç¨‹çš„å†…å˜æ²¡æœ‰å—到影å“ã€‚è¿™ç§æœºåˆ¶é€šè¿‡å»¶è¿Ÿå®žé™…å¤åˆ¶å†…å˜ï¼Œç›´åˆ°è¿›ç¨‹å†™å…¥æ•°æ®æ—¶æ‰å¤åˆ¶ï¼Œä»Žè€ŒèŠ‚çœäº†å†…å˜å’Œæé«˜äº†æ€§èƒ½ã€‚ \ No newline at end of file diff --git a/doc/lock/lock.md b/doc/lock/lock.md index 8035416f2ce9cebf54f34ed13aa81fed0b6bc2cc..46ef60783aee170058fe5041fe83f5135bfecee6 100644 --- a/doc/lock/lock.md +++ b/doc/lock/lock.md @@ -2,7 +2,7 @@ 在并å‘ç¼–ç¨‹ä¸æˆ‘们ç»å¸¸ç”¨åˆ°é”æ¥è§£å†³åŒæ¥äº’æ–¥é—®é¢˜ï¼Œä½†æ˜¯ä¸€ä¸ªå¤šæ ¸æœºå™¨ä¸Šå¯¹é”的使用ä¸å½“会带æ¥å¾ˆå¤šçš„æ‰€è°“ “lock contention†问题。在这里我们对涉åŠåˆ°é”的数æ®ç»“构进行修改从而é™ä½Žå¯¹é”的竞争。在原æ¥çš„æ“ä½œç³»ç»Ÿä¸ï¼Œç©ºé—²çš„物ç†å†…å˜ kmem 组织æˆä¸€ä¸ªç©ºé—²é“¾è¡¨ kmem.freelistï¼ŒåŒæ—¶ç”¨ä¸€ä¸ªé” kmem.lock ä¿æŠ¤ freelist,所有对 kmem.freelist 的访问都需è¦å…ˆå–å¾—é”,所以会产生很多竞争。 - + å› æ¤ï¼Œåœ¨è¿™é‡Œæˆ‘们对数æ®ç»“构进行了更改,给æ¯ä¸€ä¸ªCPUå•独开一个 freelist 和对应的 lockï¼Œè¿™æ ·åªæœ‰åŒä¸€ä¸ª CPU ä¸Šçš„è¿›ç¨‹åŒæ—¶èŽ·å–å¯¹åº”é”æ‰ä¼šäº§ç”Ÿç«žäº‰ã€‚ @@ -321,6 +321,6 @@ int main(int argc, char *argv[]) 测试结果: - + - \ No newline at end of file + \ No newline at end of file diff --git "a/doc/lock/\351\227\256\351\242\230.png" b/doc/lock/problem.png similarity index 100% rename from "doc/lock/\351\227\256\351\242\230.png" rename to doc/lock/problem.png diff --git a/doc/page table/page table.md b/doc/page table/page table.md index c4ecfbb695304e84cc9da545a5f012270904b94f..a4fa51026af45a4b2e215388d19f2d57774122a6 100644 --- a/doc/page table/page table.md +++ b/doc/page table/page table.md @@ -4,7 +4,7 @@ é¦–å…ˆåœ¨å†…æ ¸çš„proc.h䏿·»åŠ ä¸€é¡¹æŒ‡é’ˆæ¥ä¿å˜è¿™ä¸ªå…±äº«é¡µé¢çš„地å€ï¼Œåœ¨proc.hè¿™ä¸ªå¤´æ–‡ä»¶ä¸ºå†…æ ¸å’Œç”¨æˆ·ç©ºé—´ç¨‹åºæä¾›äº†å¿…è¦çš„æŽ¥å£å’Œä¿¡æ¯ï¼Œä»¥ç¡®ä¿è¿›ç¨‹çš„创建ã€è°ƒåº¦ã€åŒæ¥å’Œå…¶ä»–管ç†ä»»åŠ¡èƒ½å¤Ÿæ£ç¡®æ‰§è¡Œã€‚ - + ``` struct proc { @@ -94,4 +94,4 @@ main(int argc, char *argv[]) { 测试结果: - \ No newline at end of file + \ No newline at end of file diff --git a/doc/shared_var/shared_var.md b/doc/shared_var/shared_var.md index 9c2ed61bfad2a36a31358f9af07e10421831a8c7..1d0d81c9d607857f4d4abe419e5b01b80cc5a45b 100644 --- a/doc/shared_var/shared_var.md +++ b/doc/shared_var/shared_var.md @@ -174,4 +174,4 @@ main(void) 测试结果: - \ No newline at end of file + \ No newline at end of file diff --git a/fs.img b/fs.img index de29745c9f5504439984964be74874bd4212a540..b442962c2d18201b0731de3c79b1b82f6c284165 100644 Binary files a/fs.img and b/fs.img differ diff --git a/kernel/bio.o b/kernel/bio.o index 00f4a78f374d82862073b91afab1ce3973d26feb..334ac1b714305d11789d03013fc91810b81b8b15 100644 Binary files a/kernel/bio.o and b/kernel/bio.o differ diff --git a/kernel/console.o b/kernel/console.o index 0a9df90c433c86481a0a3267e1e11327ada2757d..898ed441a3a702f785db4082225e28216d6f961d 100644 Binary files a/kernel/console.o and b/kernel/console.o differ diff --git a/kernel/exec.o b/kernel/exec.o index 9bc725a939075019d9b2fb204a2fbec0ea55b5e9..b476c8f93681b489f20a8dba2a9662a05a4bd5af 100644 Binary files a/kernel/exec.o and b/kernel/exec.o differ diff --git a/kernel/file.o b/kernel/file.o index 14f10f4af99b4eec36facbf85ddcebf5b48d0551..4db570ef422bf57ce4ae03a4eb66741a18065b68 100644 Binary files a/kernel/file.o and b/kernel/file.o differ diff --git a/kernel/fs.o b/kernel/fs.o index b9f22f29dd175762b105441756278e191da6ca07..575454d78ee892450114a7fd3f568714d710bc47 100644 Binary files a/kernel/fs.o and b/kernel/fs.o differ diff --git a/kernel/kalloc.o b/kernel/kalloc.o index a9b0963b22fed77c3078d9397d46c51425c7277f..c397ae20bc58f3c1f9dca80bf9ba7302693daaf5 100644 Binary files a/kernel/kalloc.o and b/kernel/kalloc.o differ diff --git a/kernel/kernel b/kernel/kernel index bcce695fe6e2e2801f8f73fc96a638c979040304..e675cfe524d0111e3824e44df09255e20d81304a 100755 Binary files a/kernel/kernel and b/kernel/kernel differ diff --git a/kernel/kernel.asm b/kernel/kernel.asm index ca8be4c24c8822eeb89ebbc98757ccb05639ff06..77de5de13a410ad710d0624e2c85d2204b515154 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -82,11 +82,20 @@ Disassembly of section .text: 800000ce: 8082 ret 00000000800000d0 <consolewrite>: +// +// user write()s to the console go here. +// +int +consolewrite(int user_src, uint64 src, int n) +{ 800000d0: 715d addi sp,sp,-80 800000d2: e486 sd ra,72(sp) 800000d4: e0a2 sd s0,64(sp) 800000d6: f84a sd s2,48(sp) 800000d8: 0880 addi s0,sp,80 + int i; + + for(i = 0; i < n; i++){ 800000da: 04c05263 blez a2,8000011e <consolewrite+0x4e> 800000de: fc26 sd s1,56(sp) 800000e0: f44e sd s3,40(sp) @@ -96,6 +105,8 @@ Disassembly of section .text: 800000e8: 84ae mv s1,a1 800000ea: 89b2 mv s3,a2 800000ec: 4901 li s2,0 + char c; + if(either_copyin(&c, user_src, src+i, 1) == -1) 800000ee: 5afd li s5,-1 800000f0: 4685 li a3,1 800000f2: 8626 mv a2,s1 @@ -103,8 +114,11 @@ Disassembly of section .text: 800000f6: fbf40513 addi a0,s0,-65 800000fa: 5b8020ef jal 800026b2 <either_copyin> 800000fe: 03550263 beq a0,s5,80000122 <consolewrite+0x52> + break; + uartputc(c); 80000102: fbf44503 lbu a0,-65(s0) 80000106: 035000ef jal 8000093a <uartputc> + for(i = 0; i < n; i++){ 8000010a: 2905 addiw s2,s2,1 8000010c: 0485 addi s1,s1,1 8000010e: ff2991e3 bne s3,s2,800000f0 <consolewrite+0x20> @@ -120,6 +134,10 @@ Disassembly of section .text: 80000124: 79a2 ld s3,40(sp) 80000126: 7a02 ld s4,32(sp) 80000128: 6ae2 ld s5,24(sp) + } + + return i; +} 8000012a: 854a mv a0,s2 8000012c: 60a6 ld ra,72(sp) 8000012e: 6406 ld s0,64(sp) @@ -128,6 +146,12 @@ Disassembly of section .text: 80000134: 8082 ret 0000000080000136 <consoleread>: +// user_dist indicates whether dst is a user +// or kernel address. +// +int +consoleread(int user_dst, uint64 dst, int n) +{ 80000136: 711d addi sp,sp,-96 80000138: ec86 sd ra,88(sp) 8000013a: e8a2 sd s0,80(sp) @@ -141,28 +165,51 @@ Disassembly of section .text: 8000014a: 8aaa mv s5,a0 8000014c: 8a2e mv s4,a1 8000014e: 89b2 mv s3,a2 + uint target; + int c; + char cbuf; + + target = n; 80000150: 00060b1b sext.w s6,a2 + acquire(&cons.lock); 80000154: 00014517 auipc a0,0x14 80000158: 8fc50513 addi a0,a0,-1796 # 80013a50 <cons> 8000015c: 52f000ef jal 80000e8a <acquire> + while(n > 0){ + // wait until interrupt handler has put some + // input into cons.buffer. + while(cons.r == cons.w){ 80000160: 00014497 auipc s1,0x14 80000164: 8f048493 addi s1,s1,-1808 # 80013a50 <cons> + if(killed(myproc())){ + release(&cons.lock); + return -1; + } + sleep(&cons.r, &cons.lock); 80000168: 00014917 auipc s2,0x14 8000016c: 98090913 addi s2,s2,-1664 # 80013ae8 <cons+0x98> + while(n > 0){ 80000170: 0b305d63 blez s3,8000022a <consoleread+0xf4> + while(cons.r == cons.w){ 80000174: 0984a783 lw a5,152(s1) 80000178: 09c4a703 lw a4,156(s1) 8000017c: 0af71263 bne a4,a5,80000220 <consoleread+0xea> + if(killed(myproc())){ 80000180: 33d010ef jal 80001cbc <myproc> 80000184: 3c0020ef jal 80002544 <killed> 80000188: e12d bnez a0,800001ea <consoleread+0xb4> + sleep(&cons.r, &cons.lock); 8000018a: 85a6 mv a1,s1 8000018c: 854a mv a0,s2 8000018e: 17e020ef jal 8000230c <sleep> + while(cons.r == cons.w){ 80000192: 0984a783 lw a5,152(s1) 80000196: 09c4a703 lw a4,156(s1) 8000019a: fef703e3 beq a4,a5,80000180 <consoleread+0x4a> 8000019e: ec5e sd s7,24(sp) + } + + c = cons.buf[cons.r++ % INPUT_BUF_SIZE]; 800001a0: 00014717 auipc a4,0x14 800001a4: 8b070713 addi a4,a4,-1872 # 80013a50 <cons> 800001a8: 0017869b addiw a3,a5,1 @@ -171,9 +218,18 @@ Disassembly of section .text: 800001b4: 9736 add a4,a4,a3 800001b6: 01874703 lbu a4,24(a4) 800001ba: 00070b9b sext.w s7,a4 + + if(c == C('D')){ // end-of-file 800001be: 4691 li a3,4 800001c0: 04db8663 beq s7,a3,8000020c <consoleread+0xd6> + } + break; + } + + // copy the input byte to the user-space buffer. + cbuf = c; 800001c4: fae407a3 sb a4,-81(s0) + if(either_copyout(user_dst, dst, &cbuf, 1) == -1) 800001c8: 4685 li a3,1 800001ca: faf40613 addi a2,s0,-81 800001ce: 85d2 mv a1,s4 @@ -181,16 +237,30 @@ Disassembly of section .text: 800001d2: 496020ef jal 80002668 <either_copyout> 800001d6: 57fd li a5,-1 800001d8: 04f50863 beq a0,a5,80000228 <consoleread+0xf2> + break; + + dst++; 800001dc: 0a05 addi s4,s4,1 + --n; 800001de: 39fd addiw s3,s3,-1 + + if(c == '\n'){ 800001e0: 47a9 li a5,10 800001e2: 04fb8d63 beq s7,a5,8000023c <consoleread+0x106> 800001e6: 6be2 ld s7,24(sp) 800001e8: b761 j 80000170 <consoleread+0x3a> + release(&cons.lock); 800001ea: 00014517 auipc a0,0x14 800001ee: 86650513 addi a0,a0,-1946 # 80013a50 <cons> 800001f2: 531000ef jal 80000f22 <release> + return -1; 800001f6: 557d li a0,-1 + } + } + release(&cons.lock); + + return target - n; +} 800001f8: 60e6 ld ra,88(sp) 800001fa: 6446 ld s0,80(sp) 800001fc: 64a6 ld s1,72(sp) @@ -201,8 +271,10 @@ Disassembly of section .text: 80000206: 7b02 ld s6,32(sp) 80000208: 6125 addi sp,sp,96 8000020a: 8082 ret + if(n < target){ 8000020c: 0009871b sext.w a4,s3 80000210: 01677a63 bgeu a4,s6,80000224 <consoleread+0xee> + cons.r--; 80000214: 00014717 auipc a4,0x14 80000218: 8cf72a23 sw a5,-1836(a4) # 80013ae8 <cons+0x98> 8000021c: 6be2 ld s7,24(sp) @@ -212,26 +284,33 @@ Disassembly of section .text: 80000224: 6be2 ld s7,24(sp) 80000226: a011 j 8000022a <consoleread+0xf4> 80000228: 6be2 ld s7,24(sp) + release(&cons.lock); 8000022a: 00014517 auipc a0,0x14 8000022e: 82650513 addi a0,a0,-2010 # 80013a50 <cons> 80000232: 4f1000ef jal 80000f22 <release> + return target - n; 80000236: 413b053b subw a0,s6,s3 8000023a: bf7d j 800001f8 <consoleread+0xc2> 8000023c: 6be2 ld s7,24(sp) 8000023e: b7f5 j 8000022a <consoleread+0xf4> 0000000080000240 <consputc>: +{ 80000240: 1141 addi sp,sp,-16 80000242: e406 sd ra,8(sp) 80000244: e022 sd s0,0(sp) 80000246: 0800 addi s0,sp,16 + if(c == BACKSPACE){ 80000248: 10000793 li a5,256 8000024c: 00f50863 beq a0,a5,8000025c <consputc+0x1c> + uartputc_sync(c); 80000250: 604000ef jal 80000854 <uartputc_sync> +} 80000254: 60a2 ld ra,8(sp) 80000256: 6402 ld s0,0(sp) 80000258: 0141 addi sp,sp,16 8000025a: 8082 ret + uartputc_sync('\b'); uartputc_sync(' '); uartputc_sync('\b'); 8000025c: 4521 li a0,8 8000025e: 5f6000ef jal 80000854 <uartputc_sync> 80000262: 02000513 li a0,32 @@ -241,15 +320,24 @@ Disassembly of section .text: 80000270: b7d5 j 80000254 <consputc+0x14> 0000000080000272 <consoleintr>: +// do erase/kill processing, append to cons.buf, +// wake up consoleread() if a whole line has arrived. +// +void +consoleintr(int c) +{ 80000272: 1101 addi sp,sp,-32 80000274: ec06 sd ra,24(sp) 80000276: e822 sd s0,16(sp) 80000278: e426 sd s1,8(sp) 8000027a: 1000 addi s0,sp,32 8000027c: 84aa mv s1,a0 + acquire(&cons.lock); 8000027e: 00013517 auipc a0,0x13 80000282: 7d250513 addi a0,a0,2002 # 80013a50 <cons> 80000286: 405000ef jal 80000e8a <acquire> + + switch(c){ 8000028a: 47d5 li a5,21 8000028c: 08f48f63 beq s1,a5,8000032a <consoleintr+0xb8> 80000290: 0297c563 blt a5,s1,800002ba <consoleintr+0x48> @@ -257,17 +345,28 @@ Disassembly of section .text: 80000296: 0ef48463 beq s1,a5,8000037e <consoleintr+0x10c> 8000029a: 47c1 li a5,16 8000029c: 10f49563 bne s1,a5,800003a6 <consoleintr+0x134> + case C('P'): // Print process list. + procdump(); 800002a0: 45c020ef jal 800026fc <procdump> + } + } + break; + } + + release(&cons.lock); 800002a4: 00013517 auipc a0,0x13 800002a8: 7ac50513 addi a0,a0,1964 # 80013a50 <cons> 800002ac: 477000ef jal 80000f22 <release> +} 800002b0: 60e2 ld ra,24(sp) 800002b2: 6442 ld s0,16(sp) 800002b4: 64a2 ld s1,8(sp) 800002b6: 6105 addi sp,sp,32 800002b8: 8082 ret + switch(c){ 800002ba: 07f00793 li a5,127 800002be: 0cf48063 beq s1,a5,8000037e <consoleintr+0x10c> + if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){ 800002c2: 00013717 auipc a4,0x13 800002c6: 78e70713 addi a4,a4,1934 # 80013a50 <cons> 800002ca: 0a072783 lw a5,160(a4) @@ -275,10 +374,13 @@ Disassembly of section .text: 800002d2: 9f99 subw a5,a5,a4 800002d4: 07f00713 li a4,127 800002d8: fcf766e3 bltu a4,a5,800002a4 <consoleintr+0x32> + c = (c == '\r') ? '\n' : c; 800002dc: 47b5 li a5,13 800002de: 0cf48763 beq s1,a5,800003ac <consoleintr+0x13a> + consputc(c); 800002e2: 8526 mv a0,s1 800002e4: f5dff0ef jal 80000240 <consputc> + cons.buf[cons.e++ % INPUT_BUF_SIZE] = c; 800002e8: 00013797 auipc a5,0x13 800002ec: 76878793 addi a5,a5,1896 # 80013a50 <cons> 800002f0: 0a07a683 lw a3,160(a5) @@ -288,6 +390,7 @@ Disassembly of section .text: 80000300: 07f6f693 andi a3,a3,127 80000304: 97b6 add a5,a5,a3 80000306: 00978c23 sb s1,24(a5) + if(c == '\n' || c == C('D') || cons.e-cons.r == INPUT_BUF_SIZE){ 8000030a: 47a9 li a5,10 8000030c: 0cf48563 beq s1,a5,800003d6 <consoleintr+0x164> 80000310: 4791 li a5,4 @@ -299,22 +402,30 @@ Disassembly of section .text: 80000324: f8f710e3 bne a4,a5,800002a4 <consoleintr+0x32> 80000328: a07d j 800003d6 <consoleintr+0x164> 8000032a: e04a sd s2,0(sp) + while(cons.e != cons.w && 8000032c: 00013717 auipc a4,0x13 80000330: 72470713 addi a4,a4,1828 # 80013a50 <cons> 80000334: 0a072783 lw a5,160(a4) 80000338: 09c72703 lw a4,156(a4) + cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){ 8000033c: 00013497 auipc s1,0x13 80000340: 71448493 addi s1,s1,1812 # 80013a50 <cons> + while(cons.e != cons.w && 80000344: 4929 li s2,10 80000346: 02f70863 beq a4,a5,80000376 <consoleintr+0x104> + cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){ 8000034a: 37fd addiw a5,a5,-1 8000034c: 07f7f713 andi a4,a5,127 80000350: 9726 add a4,a4,s1 + while(cons.e != cons.w && 80000352: 01874703 lbu a4,24(a4) 80000356: 03270263 beq a4,s2,8000037a <consoleintr+0x108> + cons.e--; 8000035a: 0af4a023 sw a5,160(s1) + consputc(BACKSPACE); 8000035e: 10000513 li a0,256 80000362: edfff0ef jal 80000240 <consputc> + while(cons.e != cons.w && 80000366: 0a04a783 lw a5,160(s1) 8000036a: 09c4a703 lw a4,156(s1) 8000036e: fcf71ee3 bne a4,a5,8000034a <consoleintr+0xd8> @@ -324,21 +435,27 @@ Disassembly of section .text: 80000378: b735 j 800002a4 <consoleintr+0x32> 8000037a: 6902 ld s2,0(sp) 8000037c: b725 j 800002a4 <consoleintr+0x32> + if(cons.e != cons.w){ 8000037e: 00013717 auipc a4,0x13 80000382: 6d270713 addi a4,a4,1746 # 80013a50 <cons> 80000386: 0a072783 lw a5,160(a4) 8000038a: 09c72703 lw a4,156(a4) 8000038e: f0f70be3 beq a4,a5,800002a4 <consoleintr+0x32> + cons.e--; 80000392: 37fd addiw a5,a5,-1 80000394: 00013717 auipc a4,0x13 80000398: 74f72e23 sw a5,1884(a4) # 80013af0 <cons+0xa0> + consputc(BACKSPACE); 8000039c: 10000513 li a0,256 800003a0: ea1ff0ef jal 80000240 <consputc> 800003a4: b701 j 800002a4 <consoleintr+0x32> + if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){ 800003a6: ee048fe3 beqz s1,800002a4 <consoleintr+0x32> 800003aa: bf21 j 800002c2 <consoleintr+0x50> + consputc(c); 800003ac: 4529 li a0,10 800003ae: e93ff0ef jal 80000240 <consputc> + cons.buf[cons.e++ % INPUT_BUF_SIZE] = c; 800003b2: 00013797 auipc a5,0x13 800003b6: 69e78793 addi a5,a5,1694 # 80013a50 <cons> 800003ba: 0a07a703 lw a4,160(a5) @@ -349,47 +466,80 @@ Disassembly of section .text: 800003ce: 97ba add a5,a5,a4 800003d0: 4729 li a4,10 800003d2: 00e78c23 sb a4,24(a5) + cons.w = cons.e; 800003d6: 00013797 auipc a5,0x13 800003da: 70c7ab23 sw a2,1814(a5) # 80013aec <cons+0x9c> + wakeup(&cons.r); 800003de: 00013517 auipc a0,0x13 800003e2: 70a50513 addi a0,a0,1802 # 80013ae8 <cons+0x98> 800003e6: 773010ef jal 80002358 <wakeup> 800003ea: bd6d j 800002a4 <consoleintr+0x32> 00000000800003ec <consoleinit>: + +void +consoleinit(void) +{ 800003ec: 1141 addi sp,sp,-16 800003ee: e406 sd ra,8(sp) 800003f0: e022 sd s0,0(sp) 800003f2: 0800 addi s0,sp,16 + initlock(&cons.lock, "cons"); 800003f4: 00008597 auipc a1,0x8 800003f8: c0c58593 addi a1,a1,-1012 # 80008000 <etext> 800003fc: 00013517 auipc a0,0x13 80000400: 65450513 addi a0,a0,1620 # 80013a50 <cons> 80000404: 207000ef jal 80000e0a <initlock> + + uartinit(); 80000408: 3f4000ef jal 800007fc <uartinit> + + // connect read and write system calls + // to consoleread and consolewrite. + devsw[CONSOLE].read = consoleread; 8000040c: 0004c797 auipc a5,0x4c 80000410: 49478793 addi a5,a5,1172 # 8004c8a0 <devsw> 80000414: 00000717 auipc a4,0x0 80000418: d2270713 addi a4,a4,-734 # 80000136 <consoleread> 8000041c: eb98 sd a4,16(a5) + devsw[CONSOLE].write = consolewrite; 8000041e: 00000717 auipc a4,0x0 80000422: cb270713 addi a4,a4,-846 # 800000d0 <consolewrite> 80000426: ef98 sd a4,24(a5) +} 80000428: 60a2 ld ra,8(sp) 8000042a: 6402 ld s0,0(sp) 8000042c: 0141 addi sp,sp,16 8000042e: 8082 ret 0000000080000430 <printint>: + +static char digits[] = "0123456789abcdef"; + +static void +printint(long long xx, int base, int sign) +{ 80000430: 7179 addi sp,sp,-48 80000432: f406 sd ra,40(sp) 80000434: f022 sd s0,32(sp) 80000436: 1800 addi s0,sp,48 + char buf[16]; + int i; + unsigned long long x; + + if(sign && (sign = (xx < 0))) 80000438: c219 beqz a2,8000043e <printint+0xe> 8000043a: 08054063 bltz a0,800004ba <printint+0x8a> + x = -xx; + else + x = xx; 8000043e: 4881 li a7,0 80000440: fd040693 addi a3,s0,-48 + + i = 0; 80000444: 4781 li a5,0 + do { + buf[i++] = digits[x % base]; 80000446: 00009617 auipc a2,0x9 8000044a: 86a60613 addi a2,a2,-1942 # 80008cb0 <digits> 8000044e: 883e mv a6,a5 @@ -398,16 +548,22 @@ Disassembly of section .text: 80000456: 9732 add a4,a4,a2 80000458: 00074703 lbu a4,0(a4) 8000045c: 00e68023 sb a4,0(a3) + } while((x /= base) != 0); 80000460: 872a mv a4,a0 80000462: 02b55533 divu a0,a0,a1 80000466: 0685 addi a3,a3,1 80000468: feb773e3 bgeu a4,a1,8000044e <printint+0x1e> + + if(sign) 8000046c: 00088a63 beqz a7,80000480 <printint+0x50> + buf[i++] = '-'; 80000470: 1781 addi a5,a5,-32 80000472: 97a2 add a5,a5,s0 80000474: 02d00713 li a4,45 80000478: fee78823 sb a4,-16(a5) 8000047c: 0028079b addiw a5,a6,2 + + while(--i >= 0) 80000480: 02f05963 blez a5,800004b2 <printint+0x82> 80000484: ec26 sd s1,24(sp) 80000486: e84a sd s2,16(sp) @@ -419,21 +575,33 @@ Disassembly of section .text: 80000498: 1782 slli a5,a5,0x20 8000049a: 9381 srli a5,a5,0x20 8000049c: 40f90933 sub s2,s2,a5 + consputc(buf[i]); 800004a0: fff4c503 lbu a0,-1(s1) 800004a4: d9dff0ef jal 80000240 <consputc> + while(--i >= 0) 800004a8: 14fd addi s1,s1,-1 800004aa: ff249be3 bne s1,s2,800004a0 <printint+0x70> 800004ae: 64e2 ld s1,24(sp) 800004b0: 6942 ld s2,16(sp) +} 800004b2: 70a2 ld ra,40(sp) 800004b4: 7402 ld s0,32(sp) 800004b6: 6145 addi sp,sp,48 800004b8: 8082 ret + x = -xx; 800004ba: 40a00533 neg a0,a0 + if(sign && (sign = (xx < 0))) 800004be: 4885 li a7,1 + x = -xx; 800004c0: b741 j 80000440 <printint+0x10> 00000000800004c2 <printf>: +} + +// Print to the console. +int +printf(char *fmt, ...) +{ 800004c2: 7155 addi sp,sp,-208 800004c4: e506 sd ra,136(sp) 800004c6: e122 sd s0,128(sp) @@ -447,12 +615,22 @@ Disassembly of section .text: 800004d6: f41c sd a5,40(s0) 800004d8: 03043823 sd a6,48(s0) 800004dc: 03143c23 sd a7,56(s0) + va_list ap; + int i, cx, c0, c1, c2, locking; + char *s; + + locking = pr.locking; 800004e0: 00013797 auipc a5,0x13 800004e4: 6307a783 lw a5,1584(a5) # 80013b10 <pr+0x18> 800004e8: f6f43c23 sd a5,-136(s0) + if(locking) 800004ec: e3a1 bnez a5,8000052c <printf+0x6a> + acquire(&pr.lock); + + va_start(ap, fmt); 800004ee: 00840793 addi a5,s0,8 800004f2: f8f43423 sd a5,-120(s0) + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ 800004f6: 00054503 lbu a0,0(a0) 800004fa: 26050763 beqz a0,80000768 <printf+0x2a6> 800004fe: fca6 sd s1,120(sp) @@ -465,50 +643,109 @@ Disassembly of section .text: 8000050c: f86a sd s10,48(sp) 8000050e: f46e sd s11,40(sp) 80000510: 4981 li s3,0 + if(cx != '%'){ 80000512: 02500a93 li s5,37 + i++; + c0 = fmt[i+0] & 0xff; + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ 80000516: 06400b13 li s6,100 + printint(va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ 8000051a: 06c00c13 li s8,108 + printint(va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ 8000051e: 07500c93 li s9,117 + printint(va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ 80000522: 07800d13 li s10,120 + printint(va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ 80000526: 07000d93 li s11,112 8000052a: a815 j 8000055e <printf+0x9c> + acquire(&pr.lock); 8000052c: 00013517 auipc a0,0x13 80000530: 5cc50513 addi a0,a0,1484 # 80013af8 <pr> 80000534: 157000ef jal 80000e8a <acquire> + va_start(ap, fmt); 80000538: 00840793 addi a5,s0,8 8000053c: f8f43423 sd a5,-120(s0) + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ 80000540: 000a4503 lbu a0,0(s4) 80000544: fd4d bnez a0,800004fe <printf+0x3c> 80000546: a481 j 80000786 <printf+0x2c4> + consputc(cx); 80000548: cf9ff0ef jal 80000240 <consputc> + continue; 8000054c: 84ce mv s1,s3 + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ 8000054e: 0014899b addiw s3,s1,1 80000552: 013a07b3 add a5,s4,s3 80000556: 0007c503 lbu a0,0(a5) 8000055a: 1e050b63 beqz a0,80000750 <printf+0x28e> + if(cx != '%'){ 8000055e: ff5515e3 bne a0,s5,80000548 <printf+0x86> + i++; 80000562: 0019849b addiw s1,s3,1 + c0 = fmt[i+0] & 0xff; 80000566: 009a07b3 add a5,s4,s1 8000056a: 0007c903 lbu s2,0(a5) + if(c0) c1 = fmt[i+1] & 0xff; 8000056e: 1e090163 beqz s2,80000750 <printf+0x28e> 80000572: 0017c783 lbu a5,1(a5) + c1 = c2 = 0; 80000576: 86be mv a3,a5 + if(c1) c2 = fmt[i+2] & 0xff; 80000578: c789 beqz a5,80000582 <printf+0xc0> 8000057a: 009a0733 add a4,s4,s1 8000057e: 00274683 lbu a3,2(a4) + if(c0 == 'd'){ 80000582: 03690763 beq s2,s6,800005b0 <printf+0xee> + } else if(c0 == 'l' && c1 == 'd'){ 80000586: 05890163 beq s2,s8,800005c8 <printf+0x106> + } else if(c0 == 'u'){ 8000058a: 0d990b63 beq s2,s9,80000660 <printf+0x19e> + } else if(c0 == 'x'){ 8000058e: 13a90163 beq s2,s10,800006b0 <printf+0x1ee> + } else if(c0 == 'p'){ 80000592: 13b90b63 beq s2,s11,800006c8 <printf+0x206> + printptr(va_arg(ap, uint64)); + } else if(c0 == 's'){ 80000596: 07300793 li a5,115 8000059a: 16f90a63 beq s2,a5,8000070e <printf+0x24c> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + consputc(*s); + } else if(c0 == '%'){ 8000059e: 1b590463 beq s2,s5,80000746 <printf+0x284> + consputc('%'); + } else if(c0 == 0){ + break; + } else { + // Print unknown % sequence to draw attention. + consputc('%'); 800005a2: 8556 mv a0,s5 800005a4: c9dff0ef jal 80000240 <consputc> + consputc(c0); 800005a8: 854a mv a0,s2 800005aa: c97ff0ef jal 80000240 <consputc> 800005ae: b745 j 8000054e <printf+0x8c> + printint(va_arg(ap, int), 10, 1); 800005b0: f8843783 ld a5,-120(s0) 800005b4: 00878713 addi a4,a5,8 800005b8: f8e43423 sd a4,-120(s0) @@ -517,10 +754,15 @@ Disassembly of section .text: 800005c0: 4388 lw a0,0(a5) 800005c2: e6fff0ef jal 80000430 <printint> 800005c6: b761 j 8000054e <printf+0x8c> + } else if(c0 == 'l' && c1 == 'd'){ 800005c8: 03678663 beq a5,s6,800005f4 <printf+0x132> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ 800005cc: 05878263 beq a5,s8,80000610 <printf+0x14e> + } else if(c0 == 'l' && c1 == 'u'){ 800005d0: 0b978463 beq a5,s9,80000678 <printf+0x1b6> + } else if(c0 == 'l' && c1 == 'x'){ 800005d4: fda797e3 bne a5,s10,800005a2 <printf+0xe0> + printint(va_arg(ap, uint64), 16, 0); 800005d8: f8843783 ld a5,-120(s0) 800005dc: 00878713 addi a4,a5,8 800005e0: f8e43423 sd a4,-120(s0) @@ -528,8 +770,10 @@ Disassembly of section .text: 800005e6: 45c1 li a1,16 800005e8: 6388 ld a0,0(a5) 800005ea: e47ff0ef jal 80000430 <printint> + i += 1; 800005ee: 0029849b addiw s1,s3,2 800005f2: bfb1 j 8000054e <printf+0x8c> + printint(va_arg(ap, uint64), 10, 1); 800005f4: f8843783 ld a5,-120(s0) 800005f8: 00878713 addi a4,a5,8 800005fc: f8e43423 sd a4,-120(s0) @@ -537,14 +781,19 @@ Disassembly of section .text: 80000602: 45a9 li a1,10 80000604: 6388 ld a0,0(a5) 80000606: e2bff0ef jal 80000430 <printint> + i += 1; 8000060a: 0029849b addiw s1,s3,2 8000060e: b781 j 8000054e <printf+0x8c> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ 80000610: 06400793 li a5,100 80000614: 02f68863 beq a3,a5,80000644 <printf+0x182> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ 80000618: 07500793 li a5,117 8000061c: 06f68c63 beq a3,a5,80000694 <printf+0x1d2> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ 80000620: 07800793 li a5,120 80000624: f6f69fe3 bne a3,a5,800005a2 <printf+0xe0> + printint(va_arg(ap, uint64), 16, 0); 80000628: f8843783 ld a5,-120(s0) 8000062c: 00878713 addi a4,a5,8 80000630: f8e43423 sd a4,-120(s0) @@ -552,8 +801,10 @@ Disassembly of section .text: 80000636: 45c1 li a1,16 80000638: 6388 ld a0,0(a5) 8000063a: df7ff0ef jal 80000430 <printint> + i += 2; 8000063e: 0039849b addiw s1,s3,3 80000642: b731 j 8000054e <printf+0x8c> + printint(va_arg(ap, uint64), 10, 1); 80000644: f8843783 ld a5,-120(s0) 80000648: 00878713 addi a4,a5,8 8000064c: f8e43423 sd a4,-120(s0) @@ -561,8 +812,10 @@ Disassembly of section .text: 80000652: 45a9 li a1,10 80000654: 6388 ld a0,0(a5) 80000656: ddbff0ef jal 80000430 <printint> + i += 2; 8000065a: 0039849b addiw s1,s3,3 8000065e: bdc5 j 8000054e <printf+0x8c> + printint(va_arg(ap, int), 10, 0); 80000660: f8843783 ld a5,-120(s0) 80000664: 00878713 addi a4,a5,8 80000668: f8e43423 sd a4,-120(s0) @@ -571,6 +824,7 @@ Disassembly of section .text: 80000670: 4388 lw a0,0(a5) 80000672: dbfff0ef jal 80000430 <printint> 80000676: bde1 j 8000054e <printf+0x8c> + printint(va_arg(ap, uint64), 10, 0); 80000678: f8843783 ld a5,-120(s0) 8000067c: 00878713 addi a4,a5,8 80000680: f8e43423 sd a4,-120(s0) @@ -578,8 +832,10 @@ Disassembly of section .text: 80000686: 45a9 li a1,10 80000688: 6388 ld a0,0(a5) 8000068a: da7ff0ef jal 80000430 <printint> + i += 1; 8000068e: 0029849b addiw s1,s3,2 80000692: bd75 j 8000054e <printf+0x8c> + printint(va_arg(ap, uint64), 10, 0); 80000694: f8843783 ld a5,-120(s0) 80000698: 00878713 addi a4,a5,8 8000069c: f8e43423 sd a4,-120(s0) @@ -587,8 +843,10 @@ Disassembly of section .text: 800006a2: 45a9 li a1,10 800006a4: 6388 ld a0,0(a5) 800006a6: d8bff0ef jal 80000430 <printint> + i += 2; 800006aa: 0039849b addiw s1,s3,3 800006ae: b545 j 8000054e <printf+0x8c> + printint(va_arg(ap, int), 16, 0); 800006b0: f8843783 ld a5,-120(s0) 800006b4: 00878713 addi a4,a5,8 800006b8: f8e43423 sd a4,-120(s0) @@ -598,45 +856,63 @@ Disassembly of section .text: 800006c2: d6fff0ef jal 80000430 <printint> 800006c6: b561 j 8000054e <printf+0x8c> 800006c8: e4de sd s7,72(sp) + printptr(va_arg(ap, uint64)); 800006ca: f8843783 ld a5,-120(s0) 800006ce: 00878713 addi a4,a5,8 800006d2: f8e43423 sd a4,-120(s0) 800006d6: 0007b983 ld s3,0(a5) + consputc('0'); 800006da: 03000513 li a0,48 800006de: b63ff0ef jal 80000240 <consputc> + consputc('x'); 800006e2: 07800513 li a0,120 800006e6: b5bff0ef jal 80000240 <consputc> 800006ea: 4941 li s2,16 + consputc(digits[x >> (sizeof(uint64) * 8 - 4)]); 800006ec: 00008b97 auipc s7,0x8 800006f0: 5c4b8b93 addi s7,s7,1476 # 80008cb0 <digits> 800006f4: 03c9d793 srli a5,s3,0x3c 800006f8: 97de add a5,a5,s7 800006fa: 0007c503 lbu a0,0(a5) 800006fe: b43ff0ef jal 80000240 <consputc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) 80000702: 0992 slli s3,s3,0x4 80000704: 397d addiw s2,s2,-1 80000706: fe0917e3 bnez s2,800006f4 <printf+0x232> 8000070a: 6ba6 ld s7,72(sp) 8000070c: b589 j 8000054e <printf+0x8c> + if((s = va_arg(ap, char*)) == 0) 8000070e: f8843783 ld a5,-120(s0) 80000712: 00878713 addi a4,a5,8 80000716: f8e43423 sd a4,-120(s0) 8000071a: 0007b903 ld s2,0(a5) 8000071e: 00090d63 beqz s2,80000738 <printf+0x276> + for(; *s; s++) 80000722: 00094503 lbu a0,0(s2) 80000726: e20504e3 beqz a0,8000054e <printf+0x8c> + consputc(*s); 8000072a: b17ff0ef jal 80000240 <consputc> + for(; *s; s++) 8000072e: 0905 addi s2,s2,1 80000730: 00094503 lbu a0,0(s2) 80000734: f97d bnez a0,8000072a <printf+0x268> 80000736: bd21 j 8000054e <printf+0x8c> + s = "(null)"; 80000738: 00008917 auipc s2,0x8 8000073c: 8d090913 addi s2,s2,-1840 # 80008008 <etext+0x8> + for(; *s; s++) 80000740: 02800513 li a0,40 80000744: b7dd j 8000072a <printf+0x268> + consputc('%'); 80000746: 02500513 li a0,37 8000074a: af7ff0ef jal 80000240 <consputc> 8000074e: b501 j 8000054e <printf+0x8c> + } +#endif + } + va_end(ap); + + if(locking) 80000750: f7843783 ld a5,-136(s0) 80000754: e385 bnez a5,80000774 <printf+0x2b2> 80000756: 74e6 ld s1,120(sp) @@ -648,6 +924,10 @@ Disassembly of section .text: 80000762: 7ce2 ld s9,56(sp) 80000764: 7d42 ld s10,48(sp) 80000766: 7da2 ld s11,40(sp) + release(&pr.lock); + + return 0; +} 80000768: 4501 li a0,0 8000076a: 60aa ld ra,136(sp) 8000076c: 640a ld s0,128(sp) @@ -663,46 +943,65 @@ Disassembly of section .text: 80000780: 7ce2 ld s9,56(sp) 80000782: 7d42 ld s10,48(sp) 80000784: 7da2 ld s11,40(sp) + release(&pr.lock); 80000786: 00013517 auipc a0,0x13 8000078a: 37250513 addi a0,a0,882 # 80013af8 <pr> 8000078e: 794000ef jal 80000f22 <release> 80000792: bfd9 j 80000768 <printf+0x2a6> 0000000080000794 <panic>: + +void +panic(char *s) +{ 80000794: 1101 addi sp,sp,-32 80000796: ec06 sd ra,24(sp) 80000798: e822 sd s0,16(sp) 8000079a: e426 sd s1,8(sp) 8000079c: 1000 addi s0,sp,32 8000079e: 84aa mv s1,a0 + pr.locking = 0; 800007a0: 00013797 auipc a5,0x13 800007a4: 3607a823 sw zero,880(a5) # 80013b10 <pr+0x18> + printf("panic: "); 800007a8: 00008517 auipc a0,0x8 800007ac: 87050513 addi a0,a0,-1936 # 80008018 <etext+0x18> 800007b0: d13ff0ef jal 800004c2 <printf> + printf("%s\n", s); 800007b4: 85a6 mv a1,s1 800007b6: 00008517 auipc a0,0x8 800007ba: 86a50513 addi a0,a0,-1942 # 80008020 <etext+0x20> 800007be: d05ff0ef jal 800004c2 <printf> + panicked = 1; // freeze uart output from other CPUs 800007c2: 4785 li a5,1 800007c4: 0000b717 auipc a4,0xb 800007c8: 24f72623 sw a5,588(a4) # 8000ba10 <panicked> + for(;;) 800007cc: a001 j 800007cc <panic+0x38> 00000000800007ce <printfinit>: + ; +} + +void +printfinit(void) +{ 800007ce: 1101 addi sp,sp,-32 800007d0: ec06 sd ra,24(sp) 800007d2: e822 sd s0,16(sp) 800007d4: e426 sd s1,8(sp) 800007d6: 1000 addi s0,sp,32 + initlock(&pr.lock, "pr"); 800007d8: 00013497 auipc s1,0x13 800007dc: 32048493 addi s1,s1,800 # 80013af8 <pr> 800007e0: 00008597 auipc a1,0x8 800007e4: 84858593 addi a1,a1,-1976 # 80008028 <etext+0x28> 800007e8: 8526 mv a0,s1 800007ea: 620000ef jal 80000e0a <initlock> + pr.locking = 1; 800007ee: 4785 li a5,1 800007f0: cc9c sw a5,24(s1) +} 800007f2: 60e2 ld ra,24(sp) 800007f4: 6442 ld s0,16(sp) 800007f6: 64a2 ld s1,8(sp) @@ -710,125 +1009,67 @@ Disassembly of section .text: 800007fa: 8082 ret 00000000800007fc <uartinit>: - -void uartstart(); - -void -uartinit(void) -{ 800007fc: 1141 addi sp,sp,-16 800007fe: e406 sd ra,8(sp) 80000800: e022 sd s0,0(sp) 80000802: 0800 addi s0,sp,16 - // disable interrupts. - WriteReg(IER, 0x00); 80000804: 100007b7 lui a5,0x10000 80000808: 000780a3 sb zero,1(a5) # 10000001 <_entry-0x6fffffff> - - // special mode to set baud rate. - WriteReg(LCR, LCR_BAUD_LATCH); 8000080c: 10000737 lui a4,0x10000 80000810: f8000693 li a3,-128 80000814: 00d701a3 sb a3,3(a4) # 10000003 <_entry-0x6ffffffd> - - // LSB for baud rate of 38.4K. - WriteReg(0, 0x03); 80000818: 468d li a3,3 8000081a: 10000637 lui a2,0x10000 8000081e: 00d60023 sb a3,0(a2) # 10000000 <_entry-0x70000000> - - // MSB for baud rate of 38.4K. - WriteReg(1, 0x00); 80000822: 000780a3 sb zero,1(a5) - - // leave set-baud mode, - // and set word length to 8 bits, no parity. - WriteReg(LCR, LCR_EIGHT_BITS); 80000826: 00d701a3 sb a3,3(a4) - - // reset and enable FIFOs. - WriteReg(FCR, FCR_FIFO_ENABLE | FCR_FIFO_CLEAR); 8000082a: 10000737 lui a4,0x10000 8000082e: 461d li a2,7 80000830: 00c70123 sb a2,2(a4) # 10000002 <_entry-0x6ffffffe> - - // enable transmit and receive interrupts. - WriteReg(IER, IER_TX_ENABLE | IER_RX_ENABLE); 80000834: 00d780a3 sb a3,1(a5) - - initlock(&uart_tx_lock, "uart"); 80000838: 00007597 auipc a1,0x7 8000083c: 7f858593 addi a1,a1,2040 # 80008030 <etext+0x30> 80000840: 00013517 auipc a0,0x13 80000844: 2d850513 addi a0,a0,728 # 80013b18 <uart_tx_lock> 80000848: 5c2000ef jal 80000e0a <initlock> -} 8000084c: 60a2 ld ra,8(sp) 8000084e: 6402 ld s0,0(sp) 80000850: 0141 addi sp,sp,16 80000852: 8082 ret 0000000080000854 <uartputc_sync>: -// use interrupts, for use by kernel printf() and -// to echo characters. it spins waiting for the uart's -// output register to be empty. -void -uartputc_sync(int c) -{ 80000854: 1101 addi sp,sp,-32 80000856: ec06 sd ra,24(sp) 80000858: e822 sd s0,16(sp) 8000085a: e426 sd s1,8(sp) 8000085c: 1000 addi s0,sp,32 8000085e: 84aa mv s1,a0 - push_off(); 80000860: 5ea000ef jal 80000e4a <push_off> - - if(panicked){ 80000864: 0000b797 auipc a5,0xb 80000868: 1ac7a783 lw a5,428(a5) # 8000ba10 <panicked> 8000086c: e795 bnez a5,80000898 <uartputc_sync+0x44> - for(;;) - ; - } - - // wait for Transmit Holding Empty to be set in LSR. - while((ReadReg(LSR) & LSR_TX_IDLE) == 0) 8000086e: 10000737 lui a4,0x10000 80000872: 0715 addi a4,a4,5 # 10000005 <_entry-0x6ffffffb> 80000874: 00074783 lbu a5,0(a4) 80000878: 0207f793 andi a5,a5,32 8000087c: dfe5 beqz a5,80000874 <uartputc_sync+0x20> - ; - WriteReg(THR, c); 8000087e: 0ff4f513 zext.b a0,s1 80000882: 100007b7 lui a5,0x10000 80000886: 00a78023 sb a0,0(a5) # 10000000 <_entry-0x70000000> - - pop_off(); 8000088a: 644000ef jal 80000ece <pop_off> -} 8000088e: 60e2 ld ra,24(sp) 80000890: 6442 ld s0,16(sp) 80000892: 64a2 ld s1,8(sp) 80000894: 6105 addi sp,sp,32 80000896: 8082 ret - for(;;) 80000898: a001 j 80000898 <uartputc_sync+0x44> 000000008000089a <uartstart>: -// called from both the top- and bottom-half. -void -uartstart() -{ - while(1){ - if(uart_tx_w == uart_tx_r){ 8000089a: 0000b797 auipc a5,0xb 8000089e: 17e7b783 ld a5,382(a5) # 8000ba18 <uart_tx_r> 800008a2: 0000b717 auipc a4,0xb 800008a6: 17e73703 ld a4,382(a4) # 8000ba20 <uart_tx_w> 800008aa: 08f70263 beq a4,a5,8000092e <uartstart+0x94> -{ 800008ae: 7139 addi sp,sp,-64 800008b0: fc06 sd ra,56(sp) 800008b2: f822 sd s0,48(sp) @@ -839,60 +1080,32 @@ uartstart() 800008bc: e456 sd s5,8(sp) 800008be: e05a sd s6,0(sp) 800008c0: 0080 addi s0,sp,64 - // transmit buffer is empty. - ReadReg(ISR); - return; - } - - if((ReadReg(LSR) & LSR_TX_IDLE) == 0){ 800008c2: 10000937 lui s2,0x10000 800008c6: 0915 addi s2,s2,5 # 10000005 <_entry-0x6ffffffb> - // so we cannot give it another byte. - // it will interrupt when it's ready for a new byte. - return; - } - - int c = uart_tx_buf[uart_tx_r % UART_TX_BUF_SIZE]; 800008c8: 00013a97 auipc s5,0x13 800008cc: 250a8a93 addi s5,s5,592 # 80013b18 <uart_tx_lock> - uart_tx_r += 1; 800008d0: 0000b497 auipc s1,0xb 800008d4: 14848493 addi s1,s1,328 # 8000ba18 <uart_tx_r> - - // maybe uartputc() is waiting for space in the buffer. - wakeup(&uart_tx_r); - - WriteReg(THR, c); 800008d8: 10000a37 lui s4,0x10000 - if(uart_tx_w == uart_tx_r){ 800008dc: 0000b997 auipc s3,0xb 800008e0: 14498993 addi s3,s3,324 # 8000ba20 <uart_tx_w> - if((ReadReg(LSR) & LSR_TX_IDLE) == 0){ 800008e4: 00094703 lbu a4,0(s2) 800008e8: 02077713 andi a4,a4,32 800008ec: c71d beqz a4,8000091a <uartstart+0x80> - int c = uart_tx_buf[uart_tx_r % UART_TX_BUF_SIZE]; 800008ee: 01f7f713 andi a4,a5,31 800008f2: 9756 add a4,a4,s5 800008f4: 01874b03 lbu s6,24(a4) - uart_tx_r += 1; 800008f8: 0785 addi a5,a5,1 800008fa: e09c sd a5,0(s1) - wakeup(&uart_tx_r); 800008fc: 8526 mv a0,s1 800008fe: 25b010ef jal 80002358 <wakeup> - WriteReg(THR, c); 80000902: 016a0023 sb s6,0(s4) # 10000000 <_entry-0x70000000> - if(uart_tx_w == uart_tx_r){ 80000906: 609c ld a5,0(s1) 80000908: 0009b703 ld a4,0(s3) 8000090c: fcf71ce3 bne a4,a5,800008e4 <uartstart+0x4a> - ReadReg(ISR); 80000910: 100007b7 lui a5,0x10000 80000914: 0789 addi a5,a5,2 # 10000002 <_entry-0x6ffffffe> 80000916: 0007c783 lbu a5,0(a5) - } -} 8000091a: 70e2 ld ra,56(sp) 8000091c: 7442 ld s0,48(sp) 8000091e: 74a2 ld s1,40(sp) @@ -903,15 +1116,12 @@ uartstart() 80000928: 6b02 ld s6,0(sp) 8000092a: 6121 addi sp,sp,64 8000092c: 8082 ret - ReadReg(ISR); 8000092e: 100007b7 lui a5,0x10000 80000932: 0789 addi a5,a5,2 # 10000002 <_entry-0x6ffffffe> 80000934: 0007c783 lbu a5,0(a5) - return; 80000938: 8082 ret 000000008000093a <uartputc>: -{ 8000093a: 7179 addi sp,sp,-48 8000093c: f406 sd ra,40(sp) 8000093e: f022 sd s0,32(sp) @@ -921,54 +1131,42 @@ uartstart() 80000946: e052 sd s4,0(sp) 80000948: 1800 addi s0,sp,48 8000094a: 8a2a mv s4,a0 - acquire(&uart_tx_lock); 8000094c: 00013517 auipc a0,0x13 80000950: 1cc50513 addi a0,a0,460 # 80013b18 <uart_tx_lock> 80000954: 536000ef jal 80000e8a <acquire> - if(panicked){ 80000958: 0000b797 auipc a5,0xb 8000095c: 0b87a783 lw a5,184(a5) # 8000ba10 <panicked> 80000960: efbd bnez a5,800009de <uartputc+0xa4> - while(uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE){ 80000962: 0000b717 auipc a4,0xb 80000966: 0be73703 ld a4,190(a4) # 8000ba20 <uart_tx_w> 8000096a: 0000b797 auipc a5,0xb 8000096e: 0ae7b783 ld a5,174(a5) # 8000ba18 <uart_tx_r> 80000972: 02078793 addi a5,a5,32 - sleep(&uart_tx_r, &uart_tx_lock); 80000976: 00013997 auipc s3,0x13 8000097a: 1a298993 addi s3,s3,418 # 80013b18 <uart_tx_lock> 8000097e: 0000b497 auipc s1,0xb 80000982: 09a48493 addi s1,s1,154 # 8000ba18 <uart_tx_r> - while(uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE){ 80000986: 0000b917 auipc s2,0xb 8000098a: 09a90913 addi s2,s2,154 # 8000ba20 <uart_tx_w> 8000098e: 00e79d63 bne a5,a4,800009a8 <uartputc+0x6e> - sleep(&uart_tx_r, &uart_tx_lock); 80000992: 85ce mv a1,s3 80000994: 8526 mv a0,s1 80000996: 177010ef jal 8000230c <sleep> - while(uart_tx_w == uart_tx_r + UART_TX_BUF_SIZE){ 8000099a: 00093703 ld a4,0(s2) 8000099e: 609c ld a5,0(s1) 800009a0: 02078793 addi a5,a5,32 800009a4: fee787e3 beq a5,a4,80000992 <uartputc+0x58> - uart_tx_buf[uart_tx_w % UART_TX_BUF_SIZE] = c; 800009a8: 00013497 auipc s1,0x13 800009ac: 17048493 addi s1,s1,368 # 80013b18 <uart_tx_lock> 800009b0: 01f77793 andi a5,a4,31 800009b4: 97a6 add a5,a5,s1 800009b6: 01478c23 sb s4,24(a5) - uart_tx_w += 1; 800009ba: 0705 addi a4,a4,1 800009bc: 0000b797 auipc a5,0xb 800009c0: 06e7b223 sd a4,100(a5) # 8000ba20 <uart_tx_w> - uartstart(); 800009c4: ed7ff0ef jal 8000089a <uartstart> - release(&uart_tx_lock); 800009c8: 8526 mv a0,s1 800009ca: 558000ef jal 80000f22 <release> -} 800009ce: 70a2 ld ra,40(sp) 800009d0: 7402 ld s0,32(sp) 800009d2: 64e2 ld s1,24(sp) @@ -977,79 +1175,43 @@ uartstart() 800009d8: 6a02 ld s4,0(sp) 800009da: 6145 addi sp,sp,48 800009dc: 8082 ret - for(;;) 800009de: a001 j 800009de <uartputc+0xa4> 00000000800009e0 <uartgetc>: - -// read one input character from the UART. -// return -1 if none is waiting. -int -uartgetc(void) -{ 800009e0: 1141 addi sp,sp,-16 800009e2: e422 sd s0,8(sp) 800009e4: 0800 addi s0,sp,16 - if(ReadReg(LSR) & 0x01){ 800009e6: 100007b7 lui a5,0x10000 800009ea: 0795 addi a5,a5,5 # 10000005 <_entry-0x6ffffffb> 800009ec: 0007c783 lbu a5,0(a5) 800009f0: 8b85 andi a5,a5,1 800009f2: cb81 beqz a5,80000a02 <uartgetc+0x22> - // input data is ready. - return ReadReg(RHR); 800009f4: 100007b7 lui a5,0x10000 800009f8: 0007c503 lbu a0,0(a5) # 10000000 <_entry-0x70000000> - } else { - return -1; - } -} 800009fc: 6422 ld s0,8(sp) 800009fe: 0141 addi sp,sp,16 80000a00: 8082 ret - return -1; 80000a02: 557d li a0,-1 80000a04: bfe5 j 800009fc <uartgetc+0x1c> 0000000080000a06 <uartintr>: -// handle a uart interrupt, raised because input has -// arrived, or the uart is ready for more output, or -// both. called from devintr(). -void -uartintr(void) -{ 80000a06: 1101 addi sp,sp,-32 80000a08: ec06 sd ra,24(sp) 80000a0a: e822 sd s0,16(sp) 80000a0c: e426 sd s1,8(sp) 80000a0e: 1000 addi s0,sp,32 - // read and process incoming characters. - while(1){ - int c = uartgetc(); - if(c == -1) 80000a10: 54fd li s1,-1 80000a12: a019 j 80000a18 <uartintr+0x12> - break; - consoleintr(c); 80000a14: 85fff0ef jal 80000272 <consoleintr> - int c = uartgetc(); 80000a18: fc9ff0ef jal 800009e0 <uartgetc> - if(c == -1) 80000a1c: fe951ce3 bne a0,s1,80000a14 <uartintr+0xe> - } - - // send buffered characters. - acquire(&uart_tx_lock); 80000a20: 00013497 auipc s1,0x13 80000a24: 0f848493 addi s1,s1,248 # 80013b18 <uart_tx_lock> 80000a28: 8526 mv a0,s1 80000a2a: 460000ef jal 80000e8a <acquire> - uartstart(); 80000a2e: e6dff0ef jal 8000089a <uartstart> - release(&uart_tx_lock); 80000a32: 8526 mv a0,s1 80000a34: 4ee000ef jal 80000f22 <release> -} 80000a38: 60e2 ld ra,24(sp) 80000a3a: 6442 ld s0,16(sp) 80000a3c: 64a2 ld s1,8(sp) @@ -1057,17 +1219,31 @@ uartintr(void) 80000a40: 8082 ret 0000000080000a42 <getRefIdx>: +struct spinlock ref_lock; // åˆ«å¿˜äº†é” +int pm_ref[(PHYSTOP - KERNBASE)/PGSIZE]; // 记录物ç†é¡µçš„引用计数 + +// vaæ˜ å°„ä¸ºidx +uint64 +getRefIdx(uint64 pa){ 80000a42: 1141 addi sp,sp,-16 80000a44: e422 sd s0,8(sp) 80000a46: 0800 addi s0,sp,16 + return (pa-KERNBASE)/PGSIZE; 80000a48: 800007b7 lui a5,0x80000 80000a4c: 953e add a0,a0,a5 +} 80000a4e: 8131 srli a0,a0,0xc 80000a50: 6422 ld s0,8(sp) 80000a52: 0141 addi sp,sp,16 80000a54: 8082 ret 0000000080000a56 <refup>: + struct run *freelist; +} kmem[NCPU]; // NCPU 在 param.h ä¸å®šä¹‰ï¼Œè¡¨ç¤º CPU çš„æ•°é‡ + +//myos add +void +refup(void* pa){ 80000a56: 1101 addi sp,sp,-32 80000a58: ec06 sd ra,24(sp) 80000a5a: e822 sd s0,16(sp) @@ -1075,13 +1251,16 @@ uartintr(void) 80000a5e: e04a sd s2,0(sp) 80000a60: 1000 addi s0,sp,32 80000a62: 84aa mv s1,a0 + acquire(&ref_lock); 80000a64: 00013917 auipc s2,0x13 80000a68: 0ec90913 addi s2,s2,236 # 80013b50 <ref_lock> 80000a6c: 854a mv a0,s2 80000a6e: 41c000ef jal 80000e8a <acquire> + return (pa-KERNBASE)/PGSIZE; 80000a72: 800007b7 lui a5,0x80000 80000a76: 94be add s1,s1,a5 80000a78: 80b1 srli s1,s1,0xc + pm_ref[getRefIdx((uint64)pa)] ++; 80000a7a: 048a slli s1,s1,0x2 80000a7c: 00013797 auipc a5,0x13 80000a80: 1ec78793 addi a5,a5,492 # 80013c68 <pm_ref> @@ -1089,8 +1268,10 @@ uartintr(void) 80000a86: 4398 lw a4,0(a5) 80000a88: 2705 addiw a4,a4,1 80000a8a: c398 sw a4,0(a5) + release(&ref_lock); 80000a8c: 854a mv a0,s2 80000a8e: 494000ef jal 80000f22 <release> +} 80000a92: 60e2 ld ra,24(sp) 80000a94: 6442 ld s0,16(sp) 80000a96: 64a2 ld s1,8(sp) @@ -1099,6 +1280,9 @@ uartintr(void) 80000a9c: 8082 ret 0000000080000a9e <refdown>: + +void +refdown(void* pa){ 80000a9e: 1101 addi sp,sp,-32 80000aa0: ec06 sd ra,24(sp) 80000aa2: e822 sd s0,16(sp) @@ -1106,13 +1290,16 @@ uartintr(void) 80000aa6: e04a sd s2,0(sp) 80000aa8: 1000 addi s0,sp,32 80000aaa: 84aa mv s1,a0 + acquire(&ref_lock); 80000aac: 00013917 auipc s2,0x13 80000ab0: 0a490913 addi s2,s2,164 # 80013b50 <ref_lock> 80000ab4: 854a mv a0,s2 80000ab6: 3d4000ef jal 80000e8a <acquire> + return (pa-KERNBASE)/PGSIZE; 80000aba: 800007b7 lui a5,0x80000 80000abe: 94be add s1,s1,a5 80000ac0: 80b1 srli s1,s1,0xc + pm_ref[getRefIdx((uint64)pa)] --; 80000ac2: 048a slli s1,s1,0x2 80000ac4: 00013797 auipc a5,0x13 80000ac8: 1a478793 addi a5,a5,420 # 80013c68 <pm_ref> @@ -1120,8 +1307,10 @@ uartintr(void) 80000ace: 4398 lw a4,0(a5) 80000ad0: 377d addiw a4,a4,-1 80000ad2: c398 sw a4,0(a5) + release(&ref_lock); 80000ad4: 854a mv a0,s2 80000ad6: 44c000ef jal 80000f22 <release> +} 80000ada: 60e2 ld ra,24(sp) 80000adc: 6442 ld s0,16(sp) 80000ade: 64a2 ld s1,8(sp) @@ -1130,11 +1319,20 @@ uartintr(void) 80000ae4: 8082 ret 0000000080000ae6 <kfree>: +// which normally should have been returned by a +// call to kalloc(). (The exception is when +// initializing the allocator; see kinit above.) +void +kfree(void *pa) +{ 80000ae6: 7179 addi sp,sp,-48 80000ae8: f406 sd ra,40(sp) 80000aea: f022 sd s0,32(sp) 80000aec: ec26 sd s1,24(sp) 80000aee: 1800 addi s0,sp,48 + struct run *r; + + if(((uint64)pa % PGSIZE) != 0 || (char*)pa < end || (uint64)pa >= PHYSTOP) 80000af0: 03451793 slli a5,a0,0x34 80000af4: efb1 bnez a5,80000b50 <kfree+0x6a> 80000af6: 84aa mv s1,a0 @@ -1144,12 +1342,17 @@ uartintr(void) 80000b04: 47c5 li a5,17 80000b06: 07ee slli a5,a5,0x1b 80000b08: 04f57463 bgeu a0,a5,80000b50 <kfree+0x6a> + panic("kfree"); + + acquire(&ref_lock); 80000b0c: 00013517 auipc a0,0x13 80000b10: 04450513 addi a0,a0,68 # 80013b50 <ref_lock> 80000b14: 376000ef jal 80000e8a <acquire> + return (pa-KERNBASE)/PGSIZE; 80000b18: 800007b7 lui a5,0x80000 80000b1c: 97a6 add a5,a5,s1 80000b1e: 83b1 srli a5,a5,0xc + pm_ref[getRefIdx((uint64)pa)] --; 80000b20: 078a slli a5,a5,0x2 80000b22: 00013717 auipc a4,0x13 80000b26: 14670713 addi a4,a4,326 # 80013c68 <pm_ref> @@ -1158,10 +1361,18 @@ uartintr(void) 80000b2e: 377d addiw a4,a4,-1 80000b30: 0007069b sext.w a3,a4 80000b34: c398 sw a4,0(a5) + if(pm_ref[getRefIdx((uint64)pa)] <= 0){ 80000b36: 02d05563 blez a3,80000b60 <kfree+0x7a> + r->next = kmem->freelist; + kmem->freelist = r; + release(&kmem->lock); + } + + release(&ref_lock); 80000b3a: 00013517 auipc a0,0x13 80000b3e: 01650513 addi a0,a0,22 # 80013b50 <ref_lock> 80000b42: 3e0000ef jal 80000f22 <release> +} 80000b46: 70a2 ld ra,40(sp) 80000b48: 7402 ld s0,32(sp) 80000b4a: 64e2 ld s1,24(sp) @@ -1169,24 +1380,30 @@ uartintr(void) 80000b4e: 8082 ret 80000b50: e84a sd s2,16(sp) 80000b52: e44e sd s3,8(sp) + panic("kfree"); 80000b54: 00007517 auipc a0,0x7 80000b58: 4e450513 addi a0,a0,1252 # 80008038 <etext+0x38> 80000b5c: c39ff0ef jal 80000794 <panic> 80000b60: e84a sd s2,16(sp) 80000b62: e44e sd s3,8(sp) + memset(pa, 1, PGSIZE); 80000b64: 6605 lui a2,0x1 80000b66: 4585 li a1,1 80000b68: 8526 mv a0,s1 80000b6a: 3f4000ef jal 80000f5e <memset> + acquire(&kmem->lock); 80000b6e: 00013997 auipc s3,0x13 80000b72: fe298993 addi s3,s3,-30 # 80013b50 <ref_lock> 80000b76: 00013917 auipc s2,0x13 80000b7a: ff290913 addi s2,s2,-14 # 80013b68 <kmem> 80000b7e: 854a mv a0,s2 80000b80: 30a000ef jal 80000e8a <acquire> + r->next = kmem->freelist; 80000b84: 0309b783 ld a5,48(s3) 80000b88: e09c sd a5,0(s1) + kmem->freelist = r; 80000b8a: 0299b823 sd s1,48(s3) + release(&kmem->lock); 80000b8e: 854a mv a0,s2 80000b90: 392000ef jal 80000f22 <release> 80000b94: 6942 ld s2,16(sp) @@ -1194,31 +1411,39 @@ uartintr(void) 80000b98: b74d j 80000b3a <kfree+0x54> 0000000080000b9a <freerange>: +{ 80000b9a: 7179 addi sp,sp,-48 80000b9c: f406 sd ra,40(sp) 80000b9e: f022 sd s0,32(sp) 80000ba0: ec26 sd s1,24(sp) 80000ba2: 1800 addi s0,sp,48 + p = (char*)PGROUNDUP((uint64)pa_start); 80000ba4: 6785 lui a5,0x1 80000ba6: fff78713 addi a4,a5,-1 # fff <_entry-0x7ffff001> 80000baa: 00e504b3 add s1,a0,a4 80000bae: 777d lui a4,0xfffff 80000bb0: 8cf9 and s1,s1,a4 + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) 80000bb2: 94be add s1,s1,a5 80000bb4: 0295e263 bltu a1,s1,80000bd8 <freerange+0x3e> 80000bb8: e84a sd s2,16(sp) 80000bba: e44e sd s3,8(sp) 80000bbc: e052 sd s4,0(sp) 80000bbe: 892e mv s2,a1 + kfree(p); 80000bc0: 7a7d lui s4,0xfffff + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) 80000bc2: 6985 lui s3,0x1 + kfree(p); 80000bc4: 01448533 add a0,s1,s4 80000bc8: f1fff0ef jal 80000ae6 <kfree> + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) 80000bcc: 94ce add s1,s1,s3 80000bce: fe997be3 bgeu s2,s1,80000bc4 <freerange+0x2a> 80000bd2: 6942 ld s2,16(sp) 80000bd4: 69a2 ld s3,8(sp) 80000bd6: 6a02 ld s4,0(sp) +} 80000bd8: 70a2 ld ra,40(sp) 80000bda: 7402 ld s0,32(sp) 80000bdc: 64e2 ld s1,24(sp) @@ -1226,6 +1451,7 @@ uartintr(void) 80000be0: 8082 ret 0000000080000be2 <kinit>: +{ 80000be2: 7179 addi sp,sp,-48 80000be4: f406 sd ra,40(sp) 80000be6: f022 sd s0,32(sp) @@ -1233,27 +1459,33 @@ uartintr(void) 80000bea: e84a sd s2,16(sp) 80000bec: e44e sd s3,8(sp) 80000bee: 1800 addi s0,sp,48 + for (int i = 0; i < NCPU; i++) 80000bf0: 00013497 auipc s1,0x13 80000bf4: f7848493 addi s1,s1,-136 # 80013b68 <kmem> 80000bf8: 00013997 auipc s3,0x13 80000bfc: 07098993 addi s3,s3,112 # 80013c68 <pm_ref> + initlock(&kmem[i].lock, "kmem"); 80000c00: 00007917 auipc s2,0x7 80000c04: 44090913 addi s2,s2,1088 # 80008040 <etext+0x40> 80000c08: 85ca mv a1,s2 80000c0a: 8526 mv a0,s1 80000c0c: 1fe000ef jal 80000e0a <initlock> + for (int i = 0; i < NCPU; i++) 80000c10: 02048493 addi s1,s1,32 80000c14: ff349ae3 bne s1,s3,80000c08 <kinit+0x26> + initlock(&ref_lock, "pm_ref"); 80000c18: 00007597 auipc a1,0x7 80000c1c: 43058593 addi a1,a1,1072 # 80008048 <etext+0x48> 80000c20: 00013517 auipc a0,0x13 80000c24: f3050513 addi a0,a0,-208 # 80013b50 <ref_lock> 80000c28: 1e2000ef jal 80000e0a <initlock> + freerange(end, (void*)PHYSTOP); 80000c2c: 45c5 li a1,17 80000c2e: 05ee slli a1,a1,0x1b 80000c30: 0004d517 auipc a0,0x4d 80000c34: e0850513 addi a0,a0,-504 # 8004da38 <end> 80000c38: f63ff0ef jal 80000b9a <freerange> +} 80000c3c: 70a2 ld ra,40(sp) 80000c3e: 7402 ld s0,32(sp) 80000c40: 64e2 ld s1,24(sp) @@ -1263,6 +1495,12 @@ uartintr(void) 80000c48: 8082 ret 0000000080000c4a <kalloc>: +// Allocate one 4096-byte page of physical memory. +// Returns a pointer that the kernel can use. +// Returns 0 if the memory cannot be allocated. +void * +kalloc(void) +{ 80000c4a: 7139 addi sp,sp,-64 80000c4c: fc06 sd ra,56(sp) 80000c4e: f822 sd s0,48(sp) @@ -1270,42 +1508,67 @@ uartintr(void) 80000c52: f04a sd s2,32(sp) 80000c54: ec4e sd s3,24(sp) 80000c56: 0080 addi s0,sp,64 + struct run *r; + + push_off(); 80000c58: 1f2000ef jal 80000e4a <push_off> + int cpu = cpuid(); 80000c5c: 034010ef jal 80001c90 <cpuid> 80000c60: 84aa mv s1,a0 + pop_off(); 80000c62: 26c000ef jal 80000ece <pop_off> + + acquire(&kmem[cpu].lock); 80000c66: 00549913 slli s2,s1,0x5 80000c6a: 00013997 auipc s3,0x13 80000c6e: efe98993 addi s3,s3,-258 # 80013b68 <kmem> 80000c72: 99ca add s3,s3,s2 80000c74: 854e mv a0,s3 80000c76: 214000ef jal 80000e8a <acquire> + r = kmem[cpu].freelist; 80000c7a: 00013797 auipc a5,0x13 80000c7e: ed678793 addi a5,a5,-298 # 80013b50 <ref_lock> 80000c82: 97ca add a5,a5,s2 80000c84: 0307b903 ld s2,48(a5) + if(r) 80000c88: 04090763 beqz s2,80000cd6 <kalloc+0x8c> + kmem[cpu].freelist = r->next; 80000c8c: 00093703 ld a4,0(s2) + break; + } + } + r = kmem[cpu].freelist; + if (r) + kmem[cpu].freelist = r->next; 80000c90: 0496 slli s1,s1,0x5 80000c92: 00013797 auipc a5,0x13 80000c96: ebe78793 addi a5,a5,-322 # 80013b50 <ref_lock> 80000c9a: 97a6 add a5,a5,s1 80000c9c: fb98 sd a4,48(a5) + } + release(&kmem[cpu].lock); 80000c9e: 854e mv a0,s3 80000ca0: 282000ef jal 80000f22 <release> + + if(r){ + memset((char*)r, 5, PGSIZE); // fill with junk 80000ca4: 6605 lui a2,0x1 80000ca6: 4595 li a1,5 80000ca8: 854a mv a0,s2 80000caa: 2b4000ef jal 80000f5e <memset> + return (pa-KERNBASE)/PGSIZE; 80000cae: 800007b7 lui a5,0x80000 80000cb2: 97ca add a5,a5,s2 80000cb4: 83b1 srli a5,a5,0xc + pm_ref[getRefIdx((uint64)r)] = 1; // åˆå§‹åŒ–ä¸ç”¨åŠ é” 80000cb6: 078a slli a5,a5,0x2 80000cb8: 00013717 auipc a4,0x13 80000cbc: fb070713 addi a4,a4,-80 # 80013c68 <pm_ref> 80000cc0: 97ba add a5,a5,a4 80000cc2: 4705 li a4,1 80000cc4: c398 sw a4,0(a5) + } + return (void*)r; 80000cc6: 854a mv a0,s2 80000cc8: 70e2 ld ra,56(sp) 80000cca: 7442 ld s0,48(sp) @@ -1318,50 +1581,68 @@ uartintr(void) 80000cd8: e456 sd s5,8(sp) 80000cda: 00013a17 auipc s4,0x13 80000cde: e8ea0a13 addi s4,s4,-370 # 80013b68 <kmem> + for (int i = 0; i < NCPU; ++i) 80000ce2: 4901 li s2,0 + if (i == cpu) continue; 80000ce4: 07248663 beq s1,s2,80000d50 <kalloc+0x106> + acquire(&kmem[i].lock); 80000ce8: 8ad2 mv s5,s4 80000cea: 8552 mv a0,s4 80000cec: 19e000ef jal 80000e8a <acquire> + tmp = kmem[i].freelist; 80000cf0: 018a3603 ld a2,24(s4) + if (tmp == 0) { 80000cf4: ca39 beqz a2,80000d4a <kalloc+0x100> + tmp = kmem[i].freelist; 80000cf6: 87b2 mv a5,a2 80000cf8: 40000713 li a4,1024 + if (tmp->next) 80000cfc: 86be mv a3,a5 80000cfe: 639c ld a5,0(a5) 80000d00: c781 beqz a5,80000d08 <kalloc+0xbe> + for (int j = 0; j < 1024; j++) { 80000d02: 377d addiw a4,a4,-1 80000d04: ff65 bnez a4,80000cfc <kalloc+0xb2> 80000d06: 86be mv a3,a5 + kmem[cpu].freelist = kmem[i].freelist; 80000d08: 00013797 auipc a5,0x13 80000d0c: e4878793 addi a5,a5,-440 # 80013b50 <ref_lock> 80000d10: 00549713 slli a4,s1,0x5 80000d14: 973e add a4,a4,a5 80000d16: fb10 sd a2,48(a4) + kmem[i].freelist = tmp->next; 80000d18: 6298 ld a4,0(a3) 80000d1a: 0916 slli s2,s2,0x5 80000d1c: 97ca add a5,a5,s2 80000d1e: fb98 sd a4,48(a5) + tmp->next = 0; 80000d20: 0006b023 sd zero,0(a3) + release(&kmem[i].lock); 80000d24: 8556 mv a0,s5 80000d26: 1fc000ef jal 80000f22 <release> + r = kmem[cpu].freelist; 80000d2a: 00549713 slli a4,s1,0x5 80000d2e: 00013797 auipc a5,0x13 80000d32: e2278793 addi a5,a5,-478 # 80013b50 <ref_lock> 80000d36: 97ba add a5,a5,a4 80000d38: 0307b903 ld s2,48(a5) + if (r) 80000d3c: 02090163 beqz s2,80000d5e <kalloc+0x114> + kmem[cpu].freelist = r->next; 80000d40: 00093703 ld a4,0(s2) 80000d44: 6a42 ld s4,16(sp) 80000d46: 6aa2 ld s5,8(sp) 80000d48: b7a1 j 80000c90 <kalloc+0x46> + release(&kmem[i].lock); 80000d4a: 8552 mv a0,s4 80000d4c: 1d6000ef jal 80000f22 <release> + for (int i = 0; i < NCPU; ++i) 80000d50: 2905 addiw s2,s2,1 80000d52: 020a0a13 addi s4,s4,32 80000d56: 47a1 li a5,8 80000d58: f8f916e3 bne s2,a5,80000ce4 <kalloc+0x9a> 80000d5c: b7f9 j 80000d2a <kalloc+0xe0> + release(&kmem[cpu].lock); 80000d5e: 854e mv a0,s3 80000d60: 1c2000ef jal 80000f22 <release> 80000d64: 6a42 ld s4,16(sp) @@ -1369,6 +1650,7 @@ uartintr(void) 80000d68: bfb9 j 80000cc6 <kalloc+0x7c> 0000000080000d6a <cowcopy_pa>: +cowcopy_pa(void* pa){ 80000d6a: 7179 addi sp,sp,-48 80000d6c: f406 sd ra,40(sp) 80000d6e: f022 sd s0,32(sp) @@ -1377,12 +1659,15 @@ uartintr(void) 80000d74: e44e sd s3,8(sp) 80000d76: 1800 addi s0,sp,48 80000d78: 892a mv s2,a0 + acquire(&ref_lock); 80000d7a: 00013517 auipc a0,0x13 80000d7e: dd650513 addi a0,a0,-554 # 80013b50 <ref_lock> 80000d82: 108000ef jal 80000e8a <acquire> + return (pa-KERNBASE)/PGSIZE; 80000d86: 800004b7 lui s1,0x80000 80000d8a: 94ca add s1,s1,s2 80000d8c: 80b1 srli s1,s1,0xc + if(pm_ref[getRefIdx((uint64)pa)] <= 1){ 80000d8e: 00249713 slli a4,s1,0x2 80000d92: 00013797 auipc a5,0x13 80000d96: ed678793 addi a5,a5,-298 # 80013c68 <pm_ref> @@ -1390,12 +1675,16 @@ uartintr(void) 80000d9c: 4398 lw a4,0(a5) 80000d9e: 4785 li a5,1 80000da0: 04e7d163 bge a5,a4,80000de2 <cowcopy_pa+0x78> + char* new = kalloc(); 80000da4: ea7ff0ef jal 80000c4a <kalloc> 80000da8: 89aa mv s3,a0 + if(new == 0){ 80000daa: c521 beqz a0,80000df2 <cowcopy_pa+0x88> + memmove((void*)new, pa, PGSIZE); 80000dac: 6605 lui a2,0x1 80000dae: 85ca mv a1,s2 80000db0: 20a000ef jal 80000fba <memmove> + pm_ref[getRefIdx((uint64)pa)] --; 80000db4: 048a slli s1,s1,0x2 80000db6: 00013797 auipc a5,0x13 80000dba: eb278793 addi a5,a5,-334 # 80013c68 <pm_ref> @@ -1403,9 +1692,11 @@ uartintr(void) 80000dc0: 4398 lw a4,0(a5) 80000dc2: 377d addiw a4,a4,-1 80000dc4: c398 sw a4,0(a5) + release(&ref_lock); 80000dc6: 00013517 auipc a0,0x13 80000dca: d8a50513 addi a0,a0,-630 # 80013b50 <ref_lock> 80000dce: 154000ef jal 80000f22 <release> +} 80000dd2: 854e mv a0,s3 80000dd4: 70a2 ld ra,40(sp) 80000dd6: 7402 ld s0,32(sp) @@ -1414,14 +1705,18 @@ uartintr(void) 80000ddc: 69a2 ld s3,8(sp) 80000dde: 6145 addi sp,sp,48 80000de0: 8082 ret + release(&ref_lock); 80000de2: 00013517 auipc a0,0x13 80000de6: d6e50513 addi a0,a0,-658 # 80013b50 <ref_lock> 80000dea: 138000ef jal 80000f22 <release> + return pa; 80000dee: 89ca mv s3,s2 80000df0: b7cd j 80000dd2 <cowcopy_pa+0x68> + release(&ref_lock); 80000df2: 00013517 auipc a0,0x13 80000df6: d5e50513 addi a0,a0,-674 # 80013b50 <ref_lock> 80000dfa: 128000ef jal 80000f22 <release> + panic("out of memory"); 80000dfe: 00007517 auipc a0,0x7 80000e02: 25250513 addi a0,a0,594 # 80008050 <etext+0x50> 80000e06: 98fff0ef jal 80000794 <panic> @@ -1745,106 +2040,124 @@ uartintr(void) 800010f6: bfe5 j 800010ee <strlen+0x20> 00000000800010f8 <main>: +volatile static int started = 0; + +// start() jumps here in supervisor mode on all CPUs. +void +main() +{ 800010f8: 1141 addi sp,sp,-16 800010fa: e406 sd ra,8(sp) 800010fc: e022 sd s0,0(sp) 800010fe: 0800 addi s0,sp,16 + if (cpuid() == 0) { 80001100: 391000ef jal 80001c90 <cpuid> + userinit(); // first user process + + __sync_synchronize(); + started = 1; + } else { + while (started == 0) 80001104: 0000b717 auipc a4,0xb 80001108: 92470713 addi a4,a4,-1756 # 8000ba28 <started> + if (cpuid() == 0) { 8000110c: c51d beqz a0,8000113a <main+0x42> + while (started == 0) 8000110e: 431c lw a5,0(a4) 80001110: 2781 sext.w a5,a5 80001112: dff5 beqz a5,8000110e <main+0x16> + ; + + __sync_synchronize(); 80001114: 0330000f fence rw,rw + printf("hart %d starting\n", cpuid()); 80001118: 379000ef jal 80001c90 <cpuid> 8000111c: 85aa mv a1,a0 8000111e: 00007517 auipc a0,0x7 80001122: 47a50513 addi a0,a0,1146 # 80008598 <etext+0x598> 80001126: b9cff0ef jal 800004c2 <printf> + kvminithart(); // turn on paging 8000112a: 08c000ef jal 800011b6 <kvminithart> + trapinithart(); // install kernel trap vector 8000112e: 700010ef jal 8000282e <trapinithart> + plicinithart(); // ask PLIC for device interrupts 80001132: 1b7040ef jal 80005ae8 <plicinithart> + } + + scheduler(); 80001136: 03c010ef jal 80002172 <scheduler> + consoleinit(); 8000113a: ab2ff0ef jal 800003ec <consoleinit> + printfinit(); 8000113e: e90ff0ef jal 800007ce <printfinit> + printf( 80001142: 00007517 auipc a0,0x7 80001146: f4e50513 addi a0,a0,-178 # 80008090 <etext+0x90> 8000114a: b78ff0ef jal 800004c2 <printf> + printf("\n"); 8000114e: 00007517 auipc a0,0x7 80001152: 42a50513 addi a0,a0,1066 # 80008578 <etext+0x578> 80001156: b6cff0ef jal 800004c2 <printf> + printf("xv6 kernel is booting\n"); 8000115a: 00007517 auipc a0,0x7 8000115e: 42650513 addi a0,a0,1062 # 80008580 <etext+0x580> 80001162: b60ff0ef jal 800004c2 <printf> + printf("\n"); 80001166: 00007517 auipc a0,0x7 8000116a: 41250513 addi a0,a0,1042 # 80008578 <etext+0x578> 8000116e: b54ff0ef jal 800004c2 <printf> + kinit(); // physical page allocator 80001172: a71ff0ef jal 80000be2 <kinit> + kvminit(); // create kernel page table 80001176: 316000ef jal 8000148c <kvminit> + kvminithart(); // turn on paging 8000117a: 03c000ef jal 800011b6 <kvminithart> + procinit(); // process table 8000117e: 249000ef jal 80001bc6 <procinit> + trapinit(); // trap vectors 80001182: 688010ef jal 8000280a <trapinit> + trapinithart(); // install kernel trap vector 80001186: 6a8010ef jal 8000282e <trapinithart> + plicinit(); // set up interrupt controller 8000118a: 145040ef jal 80005ace <plicinit> + plicinithart(); // ask PLIC for device interrupts 8000118e: 15b040ef jal 80005ae8 <plicinithart> + binit(); // buffer cache 80001192: 527010ef jal 80002eb8 <binit> + iinit(); // inode table 80001196: 596020ef jal 8000372c <iinit> + fileinit(); // file table 8000119a: 344030ef jal 800044de <fileinit> + virtio_disk_init(); // emulated hard disk 8000119e: 23b040ef jal 80005bd8 <virtio_disk_init> + userinit(); // first user process 800011a2: 605000ef jal 80001fa6 <userinit> + __sync_synchronize(); 800011a6: 0330000f fence rw,rw + started = 1; 800011aa: 4785 li a5,1 800011ac: 0000b717 auipc a4,0xb 800011b0: 86f72e23 sw a5,-1924(a4) # 8000ba28 <started> 800011b4: b749 j 80001136 <main+0x3e> 00000000800011b6 <kvminithart>: - -// Switch h/w page table register to the kernel's page table, -// and enable paging. -void -kvminithart() -{ 800011b6: 1141 addi sp,sp,-16 800011b8: e422 sd s0,8(sp) 800011ba: 0800 addi s0,sp,16 -// flush the TLB. -static inline void -sfence_vma() -{ - // the zero, zero means flush all TLB entries. - asm volatile("sfence.vma zero, zero"); 800011bc: 12000073 sfence.vma - // wait for any previous writes to the page table memory to finish. - sfence_vma(); - - w_satp(MAKE_SATP(kernel_pagetable)); 800011c0: 0000b797 auipc a5,0xb 800011c4: 8707b783 ld a5,-1936(a5) # 8000ba30 <kernel_pagetable> 800011c8: 83b1 srli a5,a5,0xc 800011ca: 577d li a4,-1 800011cc: 177e slli a4,a4,0x3f 800011ce: 8fd9 or a5,a5,a4 - asm volatile("csrw satp, %0" : : "r" (x)); 800011d0: 18079073 csrw satp,a5 - asm volatile("sfence.vma zero, zero"); 800011d4: 12000073 sfence.vma - - // flush stale entries from the TLB. - sfence_vma(); -} 800011d8: 6422 ld s0,8(sp) 800011da: 0141 addi sp,sp,16 800011dc: 8082 ret 00000000800011de <walk>: -// 21..29 -- 9 bits of level-1 index. -// 12..20 -- 9 bits of level-0 index. -// 0..11 -- 12 bits of byte offset within the page. -pte_t * -walk(pagetable_t pagetable, uint64 va, int alloc) -{ 800011de: 7139 addi sp,sp,-64 800011e0: fc06 sd ra,56(sp) 800011e2: f822 sd s0,48(sp) @@ -1858,63 +2171,41 @@ walk(pagetable_t pagetable, uint64 va, int alloc) 800011f2: 84aa mv s1,a0 800011f4: 89ae mv s3,a1 800011f6: 8ab2 mv s5,a2 - if(va >= MAXVA) 800011f8: 57fd li a5,-1 800011fa: 83e9 srli a5,a5,0x1a 800011fc: 4a79 li s4,30 - panic("walk"); - - for(int level = 2; level > 0; level--) { 800011fe: 4b31 li s6,12 - if(va >= MAXVA) 80001200: 02b7fc63 bgeu a5,a1,80001238 <walk+0x5a> - panic("walk"); 80001204: 00007517 auipc a0,0x7 80001208: 3ac50513 addi a0,a0,940 # 800085b0 <etext+0x5b0> 8000120c: d88ff0ef jal 80000794 <panic> - pte_t *pte = &pagetable[PX(level, va)]; - if(*pte & PTE_V) { - pagetable = (pagetable_t)PTE2PA(*pte); - } else { - if(!alloc || (pagetable = (pde_t*)kalloc()) == 0) 80001210: 060a8263 beqz s5,80001274 <walk+0x96> 80001214: a37ff0ef jal 80000c4a <kalloc> 80001218: 84aa mv s1,a0 8000121a: c139 beqz a0,80001260 <walk+0x82> - return 0; - memset(pagetable, 0, PGSIZE); 8000121c: 6605 lui a2,0x1 8000121e: 4581 li a1,0 80001220: d3fff0ef jal 80000f5e <memset> - *pte = PA2PTE(pagetable) | PTE_V; 80001224: 00c4d793 srli a5,s1,0xc 80001228: 07aa slli a5,a5,0xa 8000122a: 0017e793 ori a5,a5,1 8000122e: 00f93023 sd a5,0(s2) - for(int level = 2; level > 0; level--) { 80001232: 3a5d addiw s4,s4,-9 80001234: 036a0063 beq s4,s6,80001254 <walk+0x76> - pte_t *pte = &pagetable[PX(level, va)]; 80001238: 0149d933 srl s2,s3,s4 8000123c: 1ff97913 andi s2,s2,511 80001240: 090e slli s2,s2,0x3 80001242: 9926 add s2,s2,s1 - if(*pte & PTE_V) { 80001244: 00093483 ld s1,0(s2) 80001248: 0014f793 andi a5,s1,1 8000124c: d3f1 beqz a5,80001210 <walk+0x32> - pagetable = (pagetable_t)PTE2PA(*pte); 8000124e: 80a9 srli s1,s1,0xa 80001250: 04b2 slli s1,s1,0xc 80001252: b7c5 j 80001232 <walk+0x54> - } - } - return &pagetable[PX(0, va)]; 80001254: 00c9d513 srli a0,s3,0xc 80001258: 1ff57513 andi a0,a0,511 8000125c: 050e slli a0,a0,0x3 8000125e: 9526 add a0,a0,s1 -} 80001260: 70e2 ld ra,56(sp) 80001262: 7442 ld s0,48(sp) 80001264: 74a2 ld s1,40(sp) @@ -1925,30 +2216,23 @@ walk(pagetable_t pagetable, uint64 va, int alloc) 8000126e: 6b02 ld s6,0(sp) 80001270: 6121 addi sp,sp,64 80001272: 8082 ret - return 0; 80001274: 4501 li a0,0 80001276: b7ed j 80001260 <walk+0x82> 0000000080001278 <iscowpage>: -iscowpage(uint64 va){ 80001278: 1101 addi sp,sp,-32 8000127a: ec06 sd ra,24(sp) 8000127c: e822 sd s0,16(sp) 8000127e: e426 sd s1,8(sp) 80001280: 1000 addi s0,sp,32 80001282: 84aa mv s1,a0 - struct proc* p = myproc(); 80001284: 239000ef jal 80001cbc <myproc> - va = PGROUNDDOWN((uint64)va); 80001288: 77fd lui a5,0xfffff 8000128a: 8cfd and s1,s1,a5 - if(va >= MAXVA) // è¦åœ¨walkä¹‹å‰ 8000128c: 57fd li a5,-1 8000128e: 83e9 srli a5,a5,0x1a 80001290: 0097f863 bgeu a5,s1,800012a0 <iscowpage+0x28> - return 0; 80001294: 4501 li a0,0 -} 80001296: 60e2 ld ra,24(sp) 80001298: 6442 ld s0,16(sp) 8000129a: 64a2 ld s1,8(sp) @@ -1956,19 +2240,14 @@ iscowpage(uint64 va){ 8000129e: 8082 ret 800012a0: e04a sd s2,0(sp) 800012a2: 892a mv s2,a0 - pte_t* pte = walk(p->pagetable,va,0); 800012a4: 4601 li a2,0 800012a6: 85a6 mv a1,s1 800012a8: 6d28 ld a0,88(a0) 800012aa: f35ff0ef jal 800011de <walk> 800012ae: 87aa mv a5,a0 - if(pte == 0) 800012b0: cd19 beqz a0,800012ce <iscowpage+0x56> - if((va < p->sz)&& (*pte & PTE_COW) && (*pte & PTE_V)) 800012b2: 05093703 ld a4,80(s2) - return 0; 800012b6: 4501 li a0,0 - if((va < p->sz)&& (*pte & PTE_COW) && (*pte & PTE_V)) 800012b8: 00e4fe63 bgeu s1,a4,800012d4 <iscowpage+0x5c> 800012bc: 6388 ld a0,0(a5) 800012be: 10157513 andi a0,a0,257 @@ -1976,7 +2255,6 @@ iscowpage(uint64 va){ 800012c6: 00153513 seqz a0,a0 800012ca: 6902 ld s2,0(sp) 800012cc: b7e9 j 80001296 <iscowpage+0x1e> - return 0; 800012ce: 4501 li a0,0 800012d0: 6902 ld s2,0(sp) 800012d2: b7d1 j 80001296 <iscowpage+0x1e> @@ -1984,64 +2262,34 @@ iscowpage(uint64 va){ 800012d6: b7c1 j 80001296 <iscowpage+0x1e> 00000000800012d8 <walkaddr>: -walkaddr(pagetable_t pagetable, uint64 va) -{ - pte_t *pte; - uint64 pa; - - if(va >= MAXVA) 800012d8: 57fd li a5,-1 800012da: 83e9 srli a5,a5,0x1a 800012dc: 00b7f463 bgeu a5,a1,800012e4 <walkaddr+0xc> - return 0; 800012e0: 4501 li a0,0 - return 0; - if((*pte & PTE_U) == 0) - return 0; - pa = PTE2PA(*pte); - return pa; -} 800012e2: 8082 ret -{ 800012e4: 1141 addi sp,sp,-16 800012e6: e406 sd ra,8(sp) 800012e8: e022 sd s0,0(sp) 800012ea: 0800 addi s0,sp,16 - pte = walk(pagetable, va, 0); 800012ec: 4601 li a2,0 800012ee: ef1ff0ef jal 800011de <walk> - if(pte == 0) 800012f2: c105 beqz a0,80001312 <walkaddr+0x3a> - if((*pte & PTE_V) == 0) 800012f4: 611c ld a5,0(a0) - if((*pte & PTE_U) == 0) 800012f6: 0117f693 andi a3,a5,17 800012fa: 4745 li a4,17 - return 0; 800012fc: 4501 li a0,0 - if((*pte & PTE_U) == 0) 800012fe: 00e68663 beq a3,a4,8000130a <walkaddr+0x32> -} 80001302: 60a2 ld ra,8(sp) 80001304: 6402 ld s0,0(sp) 80001306: 0141 addi sp,sp,16 80001308: 8082 ret - pa = PTE2PA(*pte); 8000130a: 83a9 srli a5,a5,0xa 8000130c: 00c79513 slli a0,a5,0xc - return pa; 80001310: bfcd j 80001302 <walkaddr+0x2a> - return 0; 80001312: 4501 li a0,0 80001314: b7fd j 80001302 <walkaddr+0x2a> 0000000080001316 <mappages>: -// va and size MUST be page-aligned. -// Returns 0 on success, -1 if walk() couldn't -// allocate a needed page-table page. -int -mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) -{ 80001316: 715d addi sp,sp,-80 80001318: e486 sd ra,72(sp) 8000131a: e0a2 sd s0,64(sp) @@ -2054,82 +2302,44 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) 80001328: e45e sd s7,8(sp) 8000132a: 0880 addi s0,sp,80 8000132c: 8b3a mv s6,a4 - uint64 a, last; - pte_t *pte; - - // ç¡®ä¿åœ°å€å¯¹é½ - va = (va / PGSIZE) * PGSIZE; 8000132e: 777d lui a4,0xfffff 80001330: 8df9 and a1,a1,a4 - - // ç¡®ä¿å¤§å°å¯¹é½ - size = (size + PGSIZE - 1) / PGSIZE * PGSIZE; 80001332: 6785 lui a5,0x1 80001334: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> 80001336: 00f609b3 add s3,a2,a5 8000133a: 00e9f9b3 and s3,s3,a4 - panic("mappages: va not aligned"); - - if((size % PGSIZE) != 0) - panic("mappages: size not aligned"); - - if(size == 0) 8000133e: 04098063 beqz s3,8000137e <mappages+0x68> 80001342: 8aaa mv s5,a0 - panic("mappages: size"); - - a = va; - last = va + size - PGSIZE; 80001344: 99ae add s3,s3,a1 80001346: 77fd lui a5,0xfffff 80001348: 99be add s3,s3,a5 - a = va; 8000134a: 892e mv s2,a1 8000134c: 40b68a33 sub s4,a3,a1 - if(*pte & PTE_V) - panic("mappages: remap"); - *pte = PA2PTE(pa) | perm | PTE_V; - if(a == last) - break; - a += PGSIZE; 80001350: 6b85 lui s7,0x1 80001352: 014904b3 add s1,s2,s4 - if((pte = walk(pagetable, a, 1)) == 0) 80001356: 4605 li a2,1 80001358: 85ca mv a1,s2 8000135a: 8556 mv a0,s5 8000135c: e83ff0ef jal 800011de <walk> 80001360: c91d beqz a0,80001396 <mappages+0x80> - if(*pte & PTE_V) 80001362: 611c ld a5,0(a0) 80001364: 8b85 andi a5,a5,1 80001366: e395 bnez a5,8000138a <mappages+0x74> - *pte = PA2PTE(pa) | perm | PTE_V; 80001368: 80b1 srli s1,s1,0xc 8000136a: 04aa slli s1,s1,0xa 8000136c: 0164e4b3 or s1,s1,s6 80001370: 0014e493 ori s1,s1,1 80001374: e104 sd s1,0(a0) - if(a == last) 80001376: 03390c63 beq s2,s3,800013ae <mappages+0x98> - a += PGSIZE; 8000137a: 995e add s2,s2,s7 - if((pte = walk(pagetable, a, 1)) == 0) 8000137c: bfd9 j 80001352 <mappages+0x3c> - panic("mappages: size"); 8000137e: 00007517 auipc a0,0x7 80001382: 23a50513 addi a0,a0,570 # 800085b8 <etext+0x5b8> 80001386: c0eff0ef jal 80000794 <panic> - panic("mappages: remap"); 8000138a: 00007517 auipc a0,0x7 8000138e: 23e50513 addi a0,a0,574 # 800085c8 <etext+0x5c8> 80001392: c02ff0ef jal 80000794 <panic> - return -1; 80001396: 557d li a0,-1 - pa += PGSIZE; - } - return 0; -} 80001398: 60a6 ld ra,72(sp) 8000139a: 6406 ld s0,64(sp) 8000139c: 74e2 ld s1,56(sp) @@ -2141,69 +2351,57 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) 800013a8: 6ba2 ld s7,8(sp) 800013aa: 6161 addi sp,sp,80 800013ac: 8082 ret - return 0; 800013ae: 4501 li a0,0 800013b0: b7e5 j 80001398 <mappages+0x82> 00000000800013b2 <kvmmap>: -{ 800013b2: 1141 addi sp,sp,-16 800013b4: e406 sd ra,8(sp) 800013b6: e022 sd s0,0(sp) 800013b8: 0800 addi s0,sp,16 800013ba: 87b6 mv a5,a3 - if(mappages(kpgtbl, va, sz, pa, perm) != 0) 800013bc: 86b2 mv a3,a2 800013be: 863e mv a2,a5 800013c0: f57ff0ef jal 80001316 <mappages> 800013c4: e509 bnez a0,800013ce <kvmmap+0x1c> -} 800013c6: 60a2 ld ra,8(sp) 800013c8: 6402 ld s0,0(sp) 800013ca: 0141 addi sp,sp,16 800013cc: 8082 ret - panic("kvmmap"); 800013ce: 00007517 auipc a0,0x7 800013d2: 20a50513 addi a0,a0,522 # 800085d8 <etext+0x5d8> 800013d6: bbeff0ef jal 80000794 <panic> 00000000800013da <kvmmake>: -{ 800013da: 1101 addi sp,sp,-32 800013dc: ec06 sd ra,24(sp) 800013de: e822 sd s0,16(sp) 800013e0: e426 sd s1,8(sp) 800013e2: e04a sd s2,0(sp) 800013e4: 1000 addi s0,sp,32 - kpgtbl = (pagetable_t) kalloc(); 800013e6: 865ff0ef jal 80000c4a <kalloc> 800013ea: 84aa mv s1,a0 - memset(kpgtbl, 0, PGSIZE); 800013ec: 6605 lui a2,0x1 800013ee: 4581 li a1,0 800013f0: b6fff0ef jal 80000f5e <memset> - kvmmap(kpgtbl, UART0, UART0, PGSIZE, PTE_R | PTE_W); 800013f4: 4719 li a4,6 800013f6: 6685 lui a3,0x1 800013f8: 10000637 lui a2,0x10000 800013fc: 100005b7 lui a1,0x10000 80001400: 8526 mv a0,s1 80001402: fb1ff0ef jal 800013b2 <kvmmap> - kvmmap(kpgtbl, VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W); 80001406: 4719 li a4,6 80001408: 6685 lui a3,0x1 8000140a: 10001637 lui a2,0x10001 8000140e: 100015b7 lui a1,0x10001 80001412: 8526 mv a0,s1 80001414: f9fff0ef jal 800013b2 <kvmmap> - kvmmap(kpgtbl, PLIC, PLIC, 0x4000000, PTE_R | PTE_W); 80001418: 4719 li a4,6 8000141a: 040006b7 lui a3,0x4000 8000141e: 0c000637 lui a2,0xc000 80001422: 0c0005b7 lui a1,0xc000 80001426: 8526 mv a0,s1 80001428: f8bff0ef jal 800013b2 <kvmmap> - kvmmap(kpgtbl, KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X); 8000142c: 00007917 auipc s2,0x7 80001430: bd490913 addi s2,s2,-1068 # 80008000 <etext> 80001434: 4729 li a4,10 @@ -2214,7 +2412,6 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) 80001442: 85b2 mv a1,a2 80001444: 8526 mv a0,s1 80001446: f6dff0ef jal 800013b2 <kvmmap> - kvmmap(kpgtbl, (uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W); 8000144a: 46c5 li a3,17 8000144c: 06ee slli a3,a3,0x1b 8000144e: 4719 li a4,6 @@ -2223,7 +2420,6 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) 80001456: 85ca mv a1,s2 80001458: 8526 mv a0,s1 8000145a: f59ff0ef jal 800013b2 <kvmmap> - kvmmap(kpgtbl, TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X); 8000145e: 4729 li a4,10 80001460: 6685 lui a3,0x1 80001462: 00006617 auipc a2,0x6 @@ -2233,10 +2429,8 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) 80001470: 05b2 slli a1,a1,0xc 80001472: 8526 mv a0,s1 80001474: f3fff0ef jal 800013b2 <kvmmap> - proc_mapstacks(kpgtbl); 80001478: 8526 mv a0,s1 8000147a: 6b4000ef jal 80001b2e <proc_mapstacks> -} 8000147e: 8526 mv a0,s1 80001480: 60e2 ld ra,24(sp) 80001482: 6442 ld s0,16(sp) @@ -2246,36 +2440,23 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) 8000148a: 8082 ret 000000008000148c <kvminit>: -{ 8000148c: 1141 addi sp,sp,-16 8000148e: e406 sd ra,8(sp) 80001490: e022 sd s0,0(sp) 80001492: 0800 addi s0,sp,16 - kernel_pagetable = kvmmake(); 80001494: f47ff0ef jal 800013da <kvmmake> 80001498: 0000a797 auipc a5,0xa 8000149c: 58a7bc23 sd a0,1432(a5) # 8000ba30 <kernel_pagetable> -} 800014a0: 60a2 ld ra,8(sp) 800014a2: 6402 ld s0,0(sp) 800014a4: 0141 addi sp,sp,16 800014a6: 8082 ret 00000000800014a8 <uvmunmap>: -// Remove npages of mappings starting from va. va must be -// page-aligned. The mappings must exist. -// Optionally free the physical memory. -void -uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) -{ 800014a8: 715d addi sp,sp,-80 800014aa: e486 sd ra,72(sp) 800014ac: e0a2 sd s0,64(sp) 800014ae: 0880 addi s0,sp,80 - uint64 a; - pte_t *pte; - - if((va % PGSIZE) != 0) 800014b0: 03459793 slli a5,a1,0x34 800014b4: e39d bnez a5,800014da <uvmunmap+0x32> 800014b6: f84a sd s2,48(sp) @@ -2287,18 +2468,9 @@ uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) 800014c2: 8a2a mv s4,a0 800014c4: 892e mv s2,a1 800014c6: 8ab6 mv s5,a3 - panic("uvmunmap: not aligned"); - - for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ 800014c8: 0632 slli a2,a2,0xc 800014ca: 00b609b3 add s3,a2,a1 - if((pte = walk(pagetable, a, 0)) == 0) - panic("uvmunmap: walk"); - if((*pte & PTE_V) == 0) - panic("uvmunmap: not mapped"); - if(PTE_FLAGS(*pte) == PTE_V) 800014ce: 4b85 li s7,1 - for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ 800014d0: 6b05 lui s6,0x1 800014d2: 0735ff63 bgeu a1,s3,80001550 <uvmunmap+0xa8> 800014d6: fc26 sd s1,56(sp) @@ -2310,50 +2482,34 @@ uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) 800014e2: ec56 sd s5,24(sp) 800014e4: e85a sd s6,16(sp) 800014e6: e45e sd s7,8(sp) - panic("uvmunmap: not aligned"); 800014e8: 00007517 auipc a0,0x7 800014ec: 0f850513 addi a0,a0,248 # 800085e0 <etext+0x5e0> 800014f0: aa4ff0ef jal 80000794 <panic> - panic("uvmunmap: walk"); 800014f4: 00007517 auipc a0,0x7 800014f8: 10450513 addi a0,a0,260 # 800085f8 <etext+0x5f8> 800014fc: a98ff0ef jal 80000794 <panic> - panic("uvmunmap: not mapped"); 80001500: 00007517 auipc a0,0x7 80001504: 10850513 addi a0,a0,264 # 80008608 <etext+0x608> 80001508: a8cff0ef jal 80000794 <panic> - panic("uvmunmap: not a leaf"); 8000150c: 00007517 auipc a0,0x7 80001510: 11450513 addi a0,a0,276 # 80008620 <etext+0x620> 80001514: a80ff0ef jal 80000794 <panic> - if(do_free){ - uint64 pa = PTE2PA(*pte); - kfree((void*)pa); - } - *pte = 0; 80001518: 0004b023 sd zero,0(s1) - for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ 8000151c: 995a add s2,s2,s6 8000151e: 03397863 bgeu s2,s3,8000154e <uvmunmap+0xa6> - if((pte = walk(pagetable, a, 0)) == 0) 80001522: 4601 li a2,0 80001524: 85ca mv a1,s2 80001526: 8552 mv a0,s4 80001528: cb7ff0ef jal 800011de <walk> 8000152c: 84aa mv s1,a0 8000152e: d179 beqz a0,800014f4 <uvmunmap+0x4c> - if((*pte & PTE_V) == 0) 80001530: 6108 ld a0,0(a0) 80001532: 00157793 andi a5,a0,1 80001536: d7e9 beqz a5,80001500 <uvmunmap+0x58> - if(PTE_FLAGS(*pte) == PTE_V) 80001538: 3ff57793 andi a5,a0,1023 8000153c: fd7788e3 beq a5,s7,8000150c <uvmunmap+0x64> - if(do_free){ 80001540: fc0a8ce3 beqz s5,80001518 <uvmunmap+0x70> - uint64 pa = PTE2PA(*pte); 80001544: 8129 srli a0,a0,0xa - kfree((void*)pa); 80001546: 0532 slli a0,a0,0xc 80001548: d9eff0ef jal 80000ae6 <kfree> 8000154c: b7f1 j 80001518 <uvmunmap+0x70> @@ -2364,15 +2520,12 @@ uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) 80001556: 6ae2 ld s5,24(sp) 80001558: 6b42 ld s6,16(sp) 8000155a: 6ba2 ld s7,8(sp) - } -} 8000155c: 60a6 ld ra,72(sp) 8000155e: 6406 ld s0,64(sp) 80001560: 6161 addi sp,sp,80 80001562: 8082 ret 0000000080001564 <startcowcopy>: -startcowcopy(uint64 va){ 80001564: 7179 addi sp,sp,-48 80001566: f406 sd ra,40(sp) 80001568: f022 sd s0,32(sp) @@ -2382,38 +2535,29 @@ startcowcopy(uint64 va){ 80001570: e052 sd s4,0(sp) 80001572: 1800 addi s0,sp,48 80001574: 84aa mv s1,a0 - struct proc* p = myproc(); 80001576: 746000ef jal 80001cbc <myproc> 8000157a: 892a mv s2,a0 - va = PGROUNDDOWN((uint64)va); 8000157c: 77fd lui a5,0xfffff 8000157e: 8cfd and s1,s1,a5 - pte_t* pte = walk(p->pagetable,va,0); 80001580: 4601 li a2,0 80001582: 85a6 mv a1,s1 80001584: 6d28 ld a0,88(a0) 80001586: c59ff0ef jal 800011de <walk> 8000158a: 89aa mv s3,a0 - uint64 pa = PTE2PA(*pte); 8000158c: 6108 ld a0,0(a0) 8000158e: 8129 srli a0,a0,0xa - void* new = cowcopy_pa((void*)pa); 80001590: 0532 slli a0,a0,0xc 80001592: fd8ff0ef jal 80000d6a <cowcopy_pa> - if((uint64)new == 0){ 80001596: c131 beqz a0,800015da <startcowcopy+0x76> 80001598: 8a2a mv s4,a0 - uint64 flags = (PTE_FLAGS(*pte) | PTE_W) & (~PTE_COW); 8000159a: 0009b983 ld s3,0(s3) 8000159e: 2fb9f993 andi s3,s3,763 800015a2: 0049e993 ori s3,s3,4 - uvmunmap(p->pagetable, va, 1, 0); // ä¸åŒ…å«kfreeï¼Œå› ä¸ºref--在cowcopy_paä¸å·²ç»è¿›è¡Œäº† 800015a6: 4681 li a3,0 800015a8: 4605 li a2,1 800015aa: 85a6 mv a1,s1 800015ac: 05893503 ld a0,88(s2) 800015b0: ef9ff0ef jal 800014a8 <uvmunmap> - if(mappages(p->pagetable, va, 1, (uint64)new, flags) == -1){ 800015b4: 874e mv a4,s3 800015b6: 86d2 mv a3,s4 800015b8: 4605 li a2,1 @@ -2422,7 +2566,6 @@ startcowcopy(uint64 va){ 800015c0: d57ff0ef jal 80001316 <mappages> 800015c4: 57fd li a5,-1 800015c6: 02f50063 beq a0,a5,800015e6 <startcowcopy+0x82> -} 800015ca: 70a2 ld ra,40(sp) 800015cc: 7402 ld s0,32(sp) 800015ce: 64e2 ld s1,24(sp) @@ -2431,43 +2574,27 @@ startcowcopy(uint64 va){ 800015d4: 6a02 ld s4,0(sp) 800015d6: 6145 addi sp,sp,48 800015d8: 8082 ret - panic("cowcopy_pa err\n"); 800015da: 00007517 auipc a0,0x7 800015de: 05e50513 addi a0,a0,94 # 80008638 <etext+0x638> 800015e2: 9b2ff0ef jal 80000794 <panic> - kfree(new); 800015e6: 8552 mv a0,s4 800015e8: cfeff0ef jal 80000ae6 <kfree> - panic("cow mappages failed"); 800015ec: 00007517 auipc a0,0x7 800015f0: 05c50513 addi a0,a0,92 # 80008648 <etext+0x648> 800015f4: 9a0ff0ef jal 80000794 <panic> 00000000800015f8 <uvmcreate>: - -// create an empty user page table. -// returns 0 if out of memory. -pagetable_t -uvmcreate() -{ 800015f8: 1101 addi sp,sp,-32 800015fa: ec06 sd ra,24(sp) 800015fc: e822 sd s0,16(sp) 800015fe: e426 sd s1,8(sp) 80001600: 1000 addi s0,sp,32 - pagetable_t pagetable; - pagetable = (pagetable_t) kalloc(); 80001602: e48ff0ef jal 80000c4a <kalloc> 80001606: 84aa mv s1,a0 - if(pagetable == 0) 80001608: c509 beqz a0,80001612 <uvmcreate+0x1a> - return 0; - memset(pagetable, 0, PGSIZE); 8000160a: 6605 lui a2,0x1 8000160c: 4581 li a1,0 8000160e: 951ff0ef jal 80000f5e <memset> - return pagetable; -} 80001612: 8526 mv a0,s1 80001614: 60e2 ld ra,24(sp) 80001616: 6442 ld s0,16(sp) @@ -2476,12 +2603,6 @@ uvmcreate() 8000161c: 8082 ret 000000008000161e <uvmfirst>: -// Load the user initcode into address 0 of pagetable, -// for the very first process. -// sz must be less than a page. -void -uvmfirst(pagetable_t pagetable, uchar *src, uint sz) -{ 8000161e: 7179 addi sp,sp,-48 80001620: f406 sd ra,40(sp) 80001622: f022 sd s0,32(sp) @@ -2490,35 +2611,26 @@ uvmfirst(pagetable_t pagetable, uchar *src, uint sz) 80001628: e44e sd s3,8(sp) 8000162a: e052 sd s4,0(sp) 8000162c: 1800 addi s0,sp,48 - char *mem; - - if(sz >= PGSIZE) 8000162e: 6785 lui a5,0x1 80001630: 04f67063 bgeu a2,a5,80001670 <uvmfirst+0x52> 80001634: 8a2a mv s4,a0 80001636: 89ae mv s3,a1 80001638: 84b2 mv s1,a2 - panic("uvmfirst: more than a page"); - mem = kalloc(); 8000163a: e10ff0ef jal 80000c4a <kalloc> 8000163e: 892a mv s2,a0 - memset(mem, 0, PGSIZE); 80001640: 6605 lui a2,0x1 80001642: 4581 li a1,0 80001644: 91bff0ef jal 80000f5e <memset> - mappages(pagetable, 0, PGSIZE, (uint64)mem, PTE_W|PTE_R|PTE_X|PTE_U); 80001648: 4779 li a4,30 8000164a: 86ca mv a3,s2 8000164c: 6605 lui a2,0x1 8000164e: 4581 li a1,0 80001650: 8552 mv a0,s4 80001652: cc5ff0ef jal 80001316 <mappages> - memmove(mem, src, sz); 80001656: 8626 mv a2,s1 80001658: 85ce mv a1,s3 8000165a: 854a mv a0,s2 8000165c: 95fff0ef jal 80000fba <memmove> -} 80001660: 70a2 ld ra,40(sp) 80001662: 7402 ld s0,32(sp) 80001664: 64e2 ld s1,24(sp) @@ -2527,31 +2639,19 @@ uvmfirst(pagetable_t pagetable, uchar *src, uint sz) 8000166a: 6a02 ld s4,0(sp) 8000166c: 6145 addi sp,sp,48 8000166e: 8082 ret - panic("uvmfirst: more than a page"); 80001670: 00007517 auipc a0,0x7 80001674: ff050513 addi a0,a0,-16 # 80008660 <etext+0x660> 80001678: 91cff0ef jal 80000794 <panic> 000000008000167c <uvmdealloc>: -// newsz. oldsz and newsz need not be page-aligned, nor does newsz -// need to be less than oldsz. oldsz can be larger than the actual -// process size. Returns the new process size. -uint64 -uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) -{ 8000167c: 1101 addi sp,sp,-32 8000167e: ec06 sd ra,24(sp) 80001680: e822 sd s0,16(sp) 80001682: e426 sd s1,8(sp) 80001684: 1000 addi s0,sp,32 - if(newsz >= oldsz) - return oldsz; 80001686: 84ae mv s1,a1 - if(newsz >= oldsz) 80001688: 00b67d63 bgeu a2,a1,800016a2 <uvmdealloc+0x26> 8000168c: 84b2 mv s1,a2 - - if(PGROUNDUP(newsz) < PGROUNDUP(oldsz)){ 8000168e: 6785 lui a5,0x1 80001690: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> 80001692: 00f60733 add a4,a2,a5 @@ -2560,22 +2660,14 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) 8000169a: 97ae add a5,a5,a1 8000169c: 8ff5 and a5,a5,a3 8000169e: 00f76863 bltu a4,a5,800016ae <uvmdealloc+0x32> - int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE; - uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1); - } - - return newsz; -} 800016a2: 8526 mv a0,s1 800016a4: 60e2 ld ra,24(sp) 800016a6: 6442 ld s0,16(sp) 800016a8: 64a2 ld s1,8(sp) 800016aa: 6105 addi sp,sp,32 800016ac: 8082 ret - int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE; 800016ae: 8f99 sub a5,a5,a4 800016b0: 83b1 srli a5,a5,0xc - uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1); 800016b2: 4685 li a3,1 800016b4: 0007861b sext.w a2,a5 800016b8: 85ba mv a1,a4 @@ -2583,9 +2675,7 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) 800016be: b7d5 j 800016a2 <uvmdealloc+0x26> 00000000800016c0 <uvmalloc>: - if(newsz < oldsz) 800016c0: 08b66f63 bltu a2,a1,8000175e <uvmalloc+0x9e> -{ 800016c4: 7139 addi sp,sp,-64 800016c6: fc06 sd ra,56(sp) 800016c8: f822 sd s0,48(sp) @@ -2595,30 +2685,23 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) 800016d0: 0080 addi s0,sp,64 800016d2: 8aaa mv s5,a0 800016d4: 8a32 mv s4,a2 - oldsz = PGROUNDUP(oldsz); 800016d6: 6785 lui a5,0x1 800016d8: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> 800016da: 95be add a1,a1,a5 800016dc: 77fd lui a5,0xfffff 800016de: 00f5f9b3 and s3,a1,a5 - for(a = oldsz; a < newsz; a += PGSIZE){ 800016e2: 08c9f063 bgeu s3,a2,80001762 <uvmalloc+0xa2> 800016e6: f426 sd s1,40(sp) 800016e8: f04a sd s2,32(sp) 800016ea: e05a sd s6,0(sp) 800016ec: 894e mv s2,s3 - if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){ 800016ee: 0126eb13 ori s6,a3,18 - mem = kalloc(); 800016f2: d58ff0ef jal 80000c4a <kalloc> 800016f6: 84aa mv s1,a0 - if(mem == 0){ 800016f8: c515 beqz a0,80001724 <uvmalloc+0x64> - memset(mem, 0, PGSIZE); 800016fa: 6605 lui a2,0x1 800016fc: 4581 li a1,0 800016fe: 861ff0ef jal 80000f5e <memset> - if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){ 80001702: 875a mv a4,s6 80001704: 86a6 mv a3,s1 80001706: 6605 lui a2,0x1 @@ -2626,27 +2709,22 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) 8000170a: 8556 mv a0,s5 8000170c: c0bff0ef jal 80001316 <mappages> 80001710: e915 bnez a0,80001744 <uvmalloc+0x84> - for(a = oldsz; a < newsz; a += PGSIZE){ 80001712: 6785 lui a5,0x1 80001714: 993e add s2,s2,a5 80001716: fd496ee3 bltu s2,s4,800016f2 <uvmalloc+0x32> - return newsz; 8000171a: 8552 mv a0,s4 8000171c: 74a2 ld s1,40(sp) 8000171e: 7902 ld s2,32(sp) 80001720: 6b02 ld s6,0(sp) 80001722: a811 j 80001736 <uvmalloc+0x76> - uvmdealloc(pagetable, a, oldsz); 80001724: 864e mv a2,s3 80001726: 85ca mv a1,s2 80001728: 8556 mv a0,s5 8000172a: f53ff0ef jal 8000167c <uvmdealloc> - return 0; 8000172e: 4501 li a0,0 80001730: 74a2 ld s1,40(sp) 80001732: 7902 ld s2,32(sp) 80001734: 6b02 ld s6,0(sp) -} 80001736: 70e2 ld ra,56(sp) 80001738: 7442 ld s0,48(sp) 8000173a: 69e2 ld s3,24(sp) @@ -2654,35 +2732,23 @@ uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) 8000173e: 6aa2 ld s5,8(sp) 80001740: 6121 addi sp,sp,64 80001742: 8082 ret - kfree(mem); 80001744: 8526 mv a0,s1 80001746: ba0ff0ef jal 80000ae6 <kfree> - uvmdealloc(pagetable, a, oldsz); 8000174a: 864e mv a2,s3 8000174c: 85ca mv a1,s2 8000174e: 8556 mv a0,s5 80001750: f2dff0ef jal 8000167c <uvmdealloc> - return 0; 80001754: 4501 li a0,0 80001756: 74a2 ld s1,40(sp) 80001758: 7902 ld s2,32(sp) 8000175a: 6b02 ld s6,0(sp) 8000175c: bfe9 j 80001736 <uvmalloc+0x76> - return oldsz; 8000175e: 852e mv a0,a1 -} 80001760: 8082 ret - return newsz; 80001762: 8532 mv a0,a2 80001764: bfc9 j 80001736 <uvmalloc+0x76> 0000000080001766 <freewalk>: - -// Recursively free page-table pages. -// All leaf mappings must already have been removed. -void -freewalk(pagetable_t pagetable) -{ 80001766: 7179 addi sp,sp,-48 80001768: f406 sd ra,40(sp) 8000176a: f022 sd s0,32(sp) @@ -2692,44 +2758,27 @@ freewalk(pagetable_t pagetable) 80001772: e052 sd s4,0(sp) 80001774: 1800 addi s0,sp,48 80001776: 8a2a mv s4,a0 - // there are 2^9 = 512 PTEs in a page table. - for(int i = 0; i < 512; i++){ 80001778: 84aa mv s1,a0 8000177a: 6905 lui s2,0x1 8000177c: 992a add s2,s2,a0 - pte_t pte = pagetable[i]; - if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ 8000177e: 4985 li s3,1 80001780: a819 j 80001796 <freewalk+0x30> - // this PTE points to a lower-level page table. - uint64 child = PTE2PA(pte); 80001782: 83a9 srli a5,a5,0xa - freewalk((pagetable_t)child); 80001784: 00c79513 slli a0,a5,0xc 80001788: fdfff0ef jal 80001766 <freewalk> - pagetable[i] = 0; 8000178c: 0004b023 sd zero,0(s1) - for(int i = 0; i < 512; i++){ 80001790: 04a1 addi s1,s1,8 80001792: 01248f63 beq s1,s2,800017b0 <freewalk+0x4a> - pte_t pte = pagetable[i]; 80001796: 609c ld a5,0(s1) - if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ 80001798: 00f7f713 andi a4,a5,15 8000179c: ff3703e3 beq a4,s3,80001782 <freewalk+0x1c> - } else if(pte & PTE_V){ 800017a0: 8b85 andi a5,a5,1 800017a2: d7fd beqz a5,80001790 <freewalk+0x2a> - panic("freewalk: leaf"); 800017a4: 00007517 auipc a0,0x7 800017a8: edc50513 addi a0,a0,-292 # 80008680 <etext+0x680> 800017ac: fe9fe0ef jal 80000794 <panic> - } - } - kfree((void*)pagetable); 800017b0: 8552 mv a0,s4 800017b2: b34ff0ef jal 80000ae6 <kfree> -} 800017b6: 70a2 ld ra,40(sp) 800017b8: 7402 ld s0,32(sp) 800017ba: 64e2 ld s1,24(sp) @@ -2740,31 +2789,20 @@ freewalk(pagetable_t pagetable) 800017c4: 8082 ret 00000000800017c6 <uvmfree>: - -// Free user memory pages, -// then free page-table pages. -void -uvmfree(pagetable_t pagetable, uint64 sz) -{ 800017c6: 1101 addi sp,sp,-32 800017c8: ec06 sd ra,24(sp) 800017ca: e822 sd s0,16(sp) 800017cc: e426 sd s1,8(sp) 800017ce: 1000 addi s0,sp,32 800017d0: 84aa mv s1,a0 - if(sz > 0) 800017d2: e989 bnez a1,800017e4 <uvmfree+0x1e> - uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1); - freewalk(pagetable); 800017d4: 8526 mv a0,s1 800017d6: f91ff0ef jal 80001766 <freewalk> -} 800017da: 60e2 ld ra,24(sp) 800017dc: 6442 ld s0,16(sp) 800017de: 64a2 ld s1,8(sp) 800017e0: 6105 addi sp,sp,32 800017e2: 8082 ret - uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1); 800017e4: 6785 lui a5,0x1 800017e6: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> 800017e8: 95be add a1,a1,a5 @@ -2775,22 +2813,11 @@ uvmfree(pagetable_t pagetable, uint64 sz) 800017f6: bff9 j 800017d4 <uvmfree+0xe> 00000000800017f8 <uvmcopy>: -// returns 0 on success, -1 on failure. -// frees any allocated pages on failure. -// kernel/vm.c -int -uvmcopy(pagetable_t old, pagetable_t new, uint64 sz) -{ 800017f8: 7139 addi sp,sp,-64 800017fa: fc06 sd ra,56(sp) 800017fc: f822 sd s0,48(sp) 800017fe: ec4e sd s3,24(sp) 80001800: 0080 addi s0,sp,64 - pte_t *pte; - uint64 pa, i; - uint flags; - - for(i = 0; i < sz; i += PGSIZE){ 80001802: c65d beqz a2,800018b0 <uvmcopy+0xb8> 80001804: f426 sd s1,40(sp) 80001806: f04a sd s2,32(sp) @@ -2802,25 +2829,13 @@ uvmcopy(pagetable_t old, pagetable_t new, uint64 sz) 80001812: 8a32 mv s4,a2 80001814: 4481 li s1,0 80001816: a83d j 80001854 <uvmcopy+0x5c> - if((pte = walk(old, i, 0)) == 0) - panic("uvmcopy: pte should exist"); 80001818: 00007517 auipc a0,0x7 8000181c: e7850513 addi a0,a0,-392 # 80008690 <etext+0x690> 80001820: f75fe0ef jal 80000794 <panic> - if((*pte & PTE_V) == 0) - panic("uvmcopy: page not present"); 80001824: 00007517 auipc a0,0x7 80001828: e8c50513 addi a0,a0,-372 # 800086b0 <etext+0x6b0> 8000182c: f69fe0ef jal 80000794 <panic> - // 如果该页本身就ä¸å¯å†™ï¼Œé‚£ä¹ˆå进程肯定也ä¸å¯å†™ï¼Œä¸ç”¨å¯¹å…¶è€ƒè™‘COW - if(*pte & PTE_W){ - *pte &= ~PTE_W; - *pte |= PTE_COW; - } - flags = PTE_FLAGS(*pte); 80001830: 6118 ld a4,0(a0) - // child - if(mappages(new, i, PGSIZE, (uint64)pa, flags) != 0){ 80001832: 3ff77713 andi a4,a4,1023 80001836: 86ca mv a3,s2 80001838: 6605 lui a2,0x1 @@ -2829,55 +2844,38 @@ uvmcopy(pagetable_t old, pagetable_t new, uint64 sz) 8000183e: ad9ff0ef jal 80001316 <mappages> 80001842: 89aa mv s3,a0 80001844: ed0d bnez a0,8000187e <uvmcopy+0x86> - goto err; - } - refup((void*)pa); 80001846: 854a mv a0,s2 80001848: a0eff0ef jal 80000a56 <refup> - for(i = 0; i < sz; i += PGSIZE){ 8000184c: 6785 lui a5,0x1 8000184e: 94be add s1,s1,a5 80001850: 0544fa63 bgeu s1,s4,800018a4 <uvmcopy+0xac> - if((pte = walk(old, i, 0)) == 0) 80001854: 4601 li a2,0 80001856: 85a6 mv a1,s1 80001858: 855a mv a0,s6 8000185a: 985ff0ef jal 800011de <walk> 8000185e: dd4d beqz a0,80001818 <uvmcopy+0x20> - if((*pte & PTE_V) == 0) 80001860: 611c ld a5,0(a0) 80001862: 0017f713 andi a4,a5,1 80001866: df5d beqz a4,80001824 <uvmcopy+0x2c> - pa = PTE2PA(*pte); 80001868: 00a7d913 srli s2,a5,0xa 8000186c: 0932 slli s2,s2,0xc - if(*pte & PTE_W){ 8000186e: 0047f713 andi a4,a5,4 80001872: df5d beqz a4,80001830 <uvmcopy+0x38> - *pte &= ~PTE_W; 80001874: 9bed andi a5,a5,-5 - *pte |= PTE_COW; 80001876: 1007e793 ori a5,a5,256 8000187a: e11c sd a5,0(a0) 8000187c: bf55 j 80001830 <uvmcopy+0x38> - } - return 0; - - err: - uvmunmap(new, 0, i / PGSIZE, 1); 8000187e: 4685 li a3,1 80001880: 00c4d613 srli a2,s1,0xc 80001884: 4581 li a1,0 80001886: 8556 mv a0,s5 80001888: c21ff0ef jal 800014a8 <uvmunmap> - return -1; 8000188c: 59fd li s3,-1 8000188e: 74a2 ld s1,40(sp) 80001890: 7902 ld s2,32(sp) 80001892: 6a42 ld s4,16(sp) 80001894: 6aa2 ld s5,8(sp) 80001896: 6b02 ld s6,0(sp) -} 80001898: 854e mv a0,s3 8000189a: 70e2 ld ra,56(sp) 8000189c: 7442 ld s0,48(sp) @@ -2890,52 +2888,30 @@ uvmcopy(pagetable_t old, pagetable_t new, uint64 sz) 800018aa: 6aa2 ld s5,8(sp) 800018ac: 6b02 ld s6,0(sp) 800018ae: b7ed j 80001898 <uvmcopy+0xa0> - return 0; 800018b0: 4981 li s3,0 800018b2: b7dd j 80001898 <uvmcopy+0xa0> 00000000800018b4 <uvmclear>: - -// mark a PTE invalid for user access. -// used by exec for the user stack guard page. -void -uvmclear(pagetable_t pagetable, uint64 va) -{ 800018b4: 1141 addi sp,sp,-16 800018b6: e406 sd ra,8(sp) 800018b8: e022 sd s0,0(sp) 800018ba: 0800 addi s0,sp,16 - pte_t *pte; - - pte = walk(pagetable, va, 0); 800018bc: 4601 li a2,0 800018be: 921ff0ef jal 800011de <walk> - if(pte == 0) 800018c2: c901 beqz a0,800018d2 <uvmclear+0x1e> - panic("uvmclear"); - *pte &= ~PTE_U; 800018c4: 611c ld a5,0(a0) 800018c6: 9bbd andi a5,a5,-17 800018c8: e11c sd a5,0(a0) -} 800018ca: 60a2 ld ra,8(sp) 800018cc: 6402 ld s0,0(sp) 800018ce: 0141 addi sp,sp,16 800018d0: 8082 ret - panic("uvmclear"); 800018d2: 00007517 auipc a0,0x7 800018d6: dfe50513 addi a0,a0,-514 # 800086d0 <etext+0x6d0> 800018da: ebbfe0ef jal 80000794 <panic> 00000000800018de <copyout>: -int -copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len) -{ - uint64 n, va0, pa0; - - while(len > 0){ 800018de: c2d9 beqz a3,80001964 <copyout+0x86> -{ 800018e0: 711d addi sp,sp,-96 800018e2: ec86 sd ra,88(sp) 800018e4: e8a2 sd s0,80(sp) @@ -2953,72 +2929,44 @@ copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len) 800018fc: 89ae mv s3,a1 800018fe: 8ab2 mv s5,a2 80001900: 8a36 mv s4,a3 - va0 = PGROUNDDOWN(dstva); 80001902: 7c7d lui s8,0xfffff - if(iscowpage(va0)){ // è¿™ - startcowcopy(va0); // 是 - pa0 = walkaddr(pagetable, va0); // åŠ - } // çš„ - - n = PGSIZE - (dstva - va0); 80001904: 6b05 lui s6,0x1 80001906: a815 j 8000193a <copyout+0x5c> - startcowcopy(va0); // 是 80001908: 854a mv a0,s2 8000190a: c5bff0ef jal 80001564 <startcowcopy> - pa0 = walkaddr(pagetable, va0); // åŠ 8000190e: 85ca mv a1,s2 80001910: 855e mv a0,s7 80001912: 9c7ff0ef jal 800012d8 <walkaddr> 80001916: 8caa mv s9,a0 80001918: a82d j 80001952 <copyout+0x74> - if(n > len) - n = len; - memmove((void *)(pa0 + (dstva - va0)), src, n); 8000191a: 412989b3 sub s3,s3,s2 8000191e: 0004861b sext.w a2,s1 80001922: 85d6 mv a1,s5 80001924: 01998533 add a0,s3,s9 80001928: e92ff0ef jal 80000fba <memmove> - - len -= n; 8000192c: 409a0a33 sub s4,s4,s1 - src += n; 80001930: 9aa6 add s5,s5,s1 - dstva = va0 + PGSIZE; 80001932: 016909b3 add s3,s2,s6 - while(len > 0){ 80001936: 020a0563 beqz s4,80001960 <copyout+0x82> - va0 = PGROUNDDOWN(dstva); 8000193a: 0189f933 and s2,s3,s8 - pa0 = walkaddr(pagetable, va0); 8000193e: 85ca mv a1,s2 80001940: 855e mv a0,s7 80001942: 997ff0ef jal 800012d8 <walkaddr> 80001946: 8caa mv s9,a0 - if(pa0 == 0) 80001948: c105 beqz a0,80001968 <copyout+0x8a> - if(iscowpage(va0)){ // è¿™ 8000194a: 854a mv a0,s2 8000194c: 92dff0ef jal 80001278 <iscowpage> 80001950: fd45 bnez a0,80001908 <copyout+0x2a> - n = PGSIZE - (dstva - va0); 80001952: 413904b3 sub s1,s2,s3 80001956: 94da add s1,s1,s6 - if(n > len) 80001958: fc9a71e3 bgeu s4,s1,8000191a <copyout+0x3c> 8000195c: 84d2 mv s1,s4 8000195e: bf75 j 8000191a <copyout+0x3c> - } - return 0; 80001960: 4501 li a0,0 80001962: a021 j 8000196a <copyout+0x8c> 80001964: 4501 li a0,0 -} 80001966: 8082 ret - return -1; 80001968: 557d li a0,-1 -} 8000196a: 60e6 ld ra,88(sp) 8000196c: 6446 ld s0,80(sp) 8000196e: 64a6 ld s1,72(sp) @@ -3034,14 +2982,7 @@ copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len) 80001982: 8082 ret 0000000080001984 <copyin>: -int -copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len) -{ - uint64 n, va0, pa0; - - while(len > 0){ 80001984: c6a5 beqz a3,800019ec <copyin+0x68> -{ 80001986: 715d addi sp,sp,-80 80001988: e486 sd ra,72(sp) 8000198a: e0a2 sd s0,64(sp) @@ -3058,56 +2999,33 @@ copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len) 800019a0: 8a2e mv s4,a1 800019a2: 8c32 mv s8,a2 800019a4: 89b6 mv s3,a3 - va0 = PGROUNDDOWN(srcva); 800019a6: 7bfd lui s7,0xfffff - pa0 = walkaddr(pagetable, va0); - if(pa0 == 0) - return -1; - n = PGSIZE - (srcva - va0); 800019a8: 6a85 lui s5,0x1 800019aa: a00d j 800019cc <copyin+0x48> - if(n > len) - n = len; - memmove(dst, (void *)(pa0 + (srcva - va0)), n); 800019ac: 018505b3 add a1,a0,s8 800019b0: 0004861b sext.w a2,s1 800019b4: 412585b3 sub a1,a1,s2 800019b8: 8552 mv a0,s4 800019ba: e00ff0ef jal 80000fba <memmove> - - len -= n; 800019be: 409989b3 sub s3,s3,s1 - dst += n; 800019c2: 9a26 add s4,s4,s1 - srcva = va0 + PGSIZE; 800019c4: 01590c33 add s8,s2,s5 - while(len > 0){ 800019c8: 02098063 beqz s3,800019e8 <copyin+0x64> - va0 = PGROUNDDOWN(srcva); 800019cc: 017c7933 and s2,s8,s7 - pa0 = walkaddr(pagetable, va0); 800019d0: 85ca mv a1,s2 800019d2: 855a mv a0,s6 800019d4: 905ff0ef jal 800012d8 <walkaddr> - if(pa0 == 0) 800019d8: cd01 beqz a0,800019f0 <copyin+0x6c> - n = PGSIZE - (srcva - va0); 800019da: 418904b3 sub s1,s2,s8 800019de: 94d6 add s1,s1,s5 - if(n > len) 800019e0: fc99f6e3 bgeu s3,s1,800019ac <copyin+0x28> 800019e4: 84ce mv s1,s3 800019e6: b7d9 j 800019ac <copyin+0x28> - } - return 0; 800019e8: 4501 li a0,0 800019ea: a021 j 800019f2 <copyin+0x6e> 800019ec: 4501 li a0,0 -} 800019ee: 8082 ret - return -1; 800019f0: 557d li a0,-1 -} 800019f2: 60a6 ld ra,72(sp) 800019f4: 6406 ld s0,64(sp) 800019f6: 74e2 ld s1,56(sp) @@ -3122,14 +3040,7 @@ copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len) 80001a08: 8082 ret 0000000080001a0a <copyinstr>: -copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) -{ - uint64 n, va0, pa0; - int got_null = 0; - - while(got_null == 0 && max > 0){ 80001a0a: c6dd beqz a3,80001ab8 <copyinstr+0xae> -{ 80001a0c: 715d addi sp,sp,-80 80001a0e: e486 sd ra,72(sp) 80001a10: e0a2 sd s0,64(sp) @@ -3145,35 +3056,13 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) 80001a24: 8b2e mv s6,a1 80001a26: 8bb2 mv s7,a2 80001a28: 8936 mv s2,a3 - va0 = PGROUNDDOWN(srcva); 80001a2a: 7afd lui s5,0xfffff - pa0 = walkaddr(pagetable, va0); - if(pa0 == 0) - return -1; - n = PGSIZE - (srcva - va0); 80001a2c: 6985 lui s3,0x1 80001a2e: a825 j 80001a66 <copyinstr+0x5c> - n = max; - - char *p = (char *) (pa0 + (srcva - va0)); - while(n > 0){ - if(*p == '\0'){ - *dst = '\0'; 80001a30: 00078023 sb zero,0(a5) # 1000 <_entry-0x7ffff000> 80001a34: 4785 li a5,1 - dst++; - } - - srcva = va0 + PGSIZE; - } - if(got_null){ 80001a36: 37fd addiw a5,a5,-1 80001a38: 0007851b sext.w a0,a5 - return 0; - } else { - return -1; - } -} 80001a3c: 60a6 ld ra,72(sp) 80001a3e: 6406 ld s0,64(sp) 80001a40: 74e2 ld s1,56(sp) @@ -3187,67 +3076,45 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) 80001a50: 8082 ret 80001a52: fff90713 addi a4,s2,-1 # fff <_entry-0x7ffff001> 80001a56: 9742 add a4,a4,a6 - --max; 80001a58: 40b70933 sub s2,a4,a1 - srcva = va0 + PGSIZE; 80001a5c: 01348bb3 add s7,s1,s3 - while(got_null == 0 && max > 0){ 80001a60: 04e58463 beq a1,a4,80001aa8 <copyinstr+0x9e> -{ 80001a64: 8b3e mv s6,a5 - va0 = PGROUNDDOWN(srcva); 80001a66: 015bf4b3 and s1,s7,s5 - pa0 = walkaddr(pagetable, va0); 80001a6a: 85a6 mv a1,s1 80001a6c: 8552 mv a0,s4 80001a6e: 86bff0ef jal 800012d8 <walkaddr> - if(pa0 == 0) 80001a72: cd0d beqz a0,80001aac <copyinstr+0xa2> - n = PGSIZE - (srcva - va0); 80001a74: 417486b3 sub a3,s1,s7 80001a78: 96ce add a3,a3,s3 - if(n > max) 80001a7a: 00d97363 bgeu s2,a3,80001a80 <copyinstr+0x76> 80001a7e: 86ca mv a3,s2 - char *p = (char *) (pa0 + (srcva - va0)); 80001a80: 955e add a0,a0,s7 80001a82: 8d05 sub a0,a0,s1 - while(n > 0){ 80001a84: c695 beqz a3,80001ab0 <copyinstr+0xa6> 80001a86: 87da mv a5,s6 80001a88: 885a mv a6,s6 - if(*p == '\0'){ 80001a8a: 41650633 sub a2,a0,s6 - while(n > 0){ 80001a8e: 96da add a3,a3,s6 80001a90: 85be mv a1,a5 - if(*p == '\0'){ 80001a92: 00f60733 add a4,a2,a5 80001a96: 00074703 lbu a4,0(a4) # fffffffffffff000 <end+0xffffffff7ffb15c8> 80001a9a: db59 beqz a4,80001a30 <copyinstr+0x26> - *dst = *p; 80001a9c: 00e78023 sb a4,0(a5) - dst++; 80001aa0: 0785 addi a5,a5,1 - while(n > 0){ 80001aa2: fed797e3 bne a5,a3,80001a90 <copyinstr+0x86> 80001aa6: b775 j 80001a52 <copyinstr+0x48> 80001aa8: 4781 li a5,0 80001aaa: b771 j 80001a36 <copyinstr+0x2c> - return -1; 80001aac: 557d li a0,-1 80001aae: b779 j 80001a3c <copyinstr+0x32> - srcva = va0 + PGSIZE; 80001ab0: 6b85 lui s7,0x1 80001ab2: 9ba6 add s7,s7,s1 80001ab4: 87da mv a5,s6 80001ab6: b77d j 80001a64 <copyinstr+0x5a> - int got_null = 0; 80001ab8: 4781 li a5,0 - if(got_null){ 80001aba: 37fd addiw a5,a5,-1 80001abc: 0007851b sext.w a0,a5 -} 80001ac0: 8082 ret 0000000080001ac2 <get_shared_var>: @@ -4584,6 +4451,11 @@ trapinithart(void) 8000282e: 1141 addi sp,sp,-16 80002830: e422 sd s0,8(sp) 80002832: 0800 addi s0,sp,16 +// Supervisor Trap-Vector Base Address +// low two bits are mode. +static inline void +w_stvec(uint64 x) +{ asm volatile("csrw stvec, %0" : : "r" (x)); 80002834: 00003797 auipc a5,0x3 80002838: 23c78793 addi a5,a5,572 # 80005a70 <kernelvec> @@ -4609,6 +4481,11 @@ usertrapret(void) 8000284e: c6eff0ef jal 80001cbc <myproc> asm volatile("csrr %0, sstatus" : "=r" (x) ); 80002852: 100027f3 csrr a5,sstatus + +// disable device interrupts +static inline void +intr_off() +{ w_sstatus(r_sstatus() & ~SSTATUS_SIE); 80002856: 9bf5 andi a5,a5,-3 asm volatile("csrw sstatus, %0" : : "r" (x)); @@ -4652,6 +4529,11 @@ usertrapret(void) 80002898: eb10 sd a2,16(a4) p->trapframe->kernel_hartid = r_tp(); // hartid for cpuid() 8000289a: 7138 ld a4,96(a0) +// this core's hartid (core number), the index into cpus[]. +static inline uint64 +r_tp() +{ + uint64 x; asm volatile("mv %0, tp" : "=r" (x) ); 8000289c: 8612 mv a2,tp 8000289e: f310 sd a2,32(a4) @@ -5405,19 +5287,31 @@ devintr() 80002e9c: 8082 ret 0000000080002e9e <HASHNUM>: + // head.next is most recent, head.prev is least. + struct buf head[NBUCKET]; // 哈希桶头 + struct spinlock hash_lock[NBUCKET]; // å“ˆå¸Œæ¡¶é” +} bcache; + +int HASHNUM(int blockno) { 80002e9e: 1141 addi sp,sp,-16 80002ea0: e422 sd s0,8(sp) 80002ea2: 0800 addi s0,sp,16 + return blockno % NBUCKET; 80002ea4: 41f5579b sraiw a5,a0,0x1f 80002ea8: 01b7d79b srliw a5,a5,0x1b 80002eac: 9d3d addw a0,a0,a5 80002eae: 897d andi a0,a0,31 +} 80002eb0: 9d1d subw a0,a0,a5 80002eb2: 6422 ld s0,8(sp) 80002eb4: 0141 addi sp,sp,16 80002eb6: 8082 ret 0000000080002eb8 <binit>: + + +void binit(void) +{ 80002eb8: 711d addi sp,sp,-96 80002eba: ec86 sd ra,88(sp) 80002ebc: e8a2 sd s0,80(sp) @@ -5431,23 +5325,36 @@ devintr() 80002ecc: e862 sd s8,16(sp) 80002ece: e466 sd s9,8(sp) 80002ed0: 1080 addi s0,sp,96 + struct buf *b; + + initlock(&bcache.lock, "bcache"); 80002ed2: 00006597 auipc a1,0x6 80002ed6: a7e58593 addi a1,a1,-1410 # 80008950 <etext+0x950> 80002eda: 00037517 auipc a0,0x37 80002ede: dee50513 addi a0,a0,-530 # 80039cc8 <bcache> 80002ee2: f29fd0ef jal 80000e0a <initlock> + + // 哈希桶和哈希桶é”åˆå§‹åŒ– + for (int i = 0; i < NBUCKET; i++) 80002ee6: 00048917 auipc s2,0x48 80002eea: b4a90913 addi s2,s2,-1206 # 8004aa30 <bcache+0x10d68> 80002eee: 0003f497 auipc s1,0x3f 80002ef2: 04248493 addi s1,s1,66 # 80041f30 <bcache+0x8268> 80002ef6: 8a4a mv s4,s2 + { + // snprintf(name, 20, "bcache.bucket.%d", i); + // printf("name:%s\n",); + initlock(&bcache.hash_lock[i], "bcache.bucket"); 80002ef8: 00006997 auipc s3,0x6 80002efc: a6098993 addi s3,s3,-1440 # 80008958 <etext+0x958> 80002f00: 85ce mv a1,s3 80002f02: 854a mv a0,s2 80002f04: f07fd0ef jal 80000e0a <initlock> + bcache.head[i].prev = &bcache.head[i]; 80002f08: e4a4 sd s1,72(s1) + bcache.head[i].next = &bcache.head[i]; 80002f0a: e8a4 sd s1,80(s1) + for (int i = 0; i < NBUCKET; i++) 80002f0c: 0961 addi s2,s2,24 80002f0e: 45848493 addi s1,s1,1112 80002f12: ff4497e3 bne s1,s4,80002f00 <binit+0x48> @@ -5458,37 +5365,55 @@ devintr() 80002f24: 00037a97 auipc s5,0x37 80002f28: da4a8a93 addi s5,s5,-604 # 80039cc8 <bcache> 80002f2c: 9abe add s5,s5,a5 + for (int i = 0; i < NBUF; i++) + { + b = &bcache.buf[i]; + // printf("blockno:%d\n",b->blockno); + hash_num = HASHNUM(b->blockno); + b->next = bcache.head[hash_num].next; 80002f2e: 00037997 auipc s3,0x37 80002f32: d9a98993 addi s3,s3,-614 # 80039cc8 <bcache> 80002f36: 45800c13 li s8,1112 80002f3a: 6ba1 lui s7,0x8 + b->prev = &bcache.head[hash_num]; 80002f3c: 6a21 lui s4,0x8 80002f3e: 268a0a13 addi s4,s4,616 # 8268 <_entry-0x7fff7d98> + initsleeplock(&b->lock, "buffer"); 80002f42: 00006b17 auipc s6,0x6 80002f46: a26b0b13 addi s6,s6,-1498 # 80008968 <etext+0x968> + b = &bcache.buf[i]; 80002f4a: ff048913 addi s2,s1,-16 + return blockno % NBUCKET; 80002f4e: ffc4a783 lw a5,-4(s1) 80002f52: 41f7d71b sraiw a4,a5,0x1f 80002f56: 01b7571b srliw a4,a4,0x1b 80002f5a: 9fb9 addw a5,a5,a4 80002f5c: 8bfd andi a5,a5,31 80002f5e: 9f99 subw a5,a5,a4 + b->next = bcache.head[hash_num].next; 80002f60: 038787b3 mul a5,a5,s8 80002f64: 00f98cb3 add s9,s3,a5 80002f68: 9cde add s9,s9,s7 80002f6a: 2b8cb703 ld a4,696(s9) 80002f6e: e0b8 sd a4,64(s1) + b->prev = &bcache.head[hash_num]; 80002f70: 97d2 add a5,a5,s4 80002f72: 97ce add a5,a5,s3 80002f74: fc9c sd a5,56(s1) + initsleeplock(&b->lock, "buffer"); 80002f76: 85da mv a1,s6 80002f78: 8526 mv a0,s1 80002f7a: 466010ef jal 800043e0 <initsleeplock> + bcache.head[hash_num].next->prev = b; 80002f7e: 2b8cb783 ld a5,696(s9) 80002f82: 0527b423 sd s2,72(a5) + bcache.head[hash_num].next = b; 80002f86: 2b2cbc23 sd s2,696(s9) + for (int i = 0; i < NBUF; i++) 80002f8a: 45848493 addi s1,s1,1112 80002f8e: fb549ee3 bne s1,s5,80002f4a <binit+0x92> + } +} 80002f92: 60e6 ld ra,88(sp) 80002f94: 6446 ld s0,80(sp) 80002f96: 64a6 ld s1,72(sp) @@ -5504,6 +5429,12 @@ devintr() 80002faa: 8082 ret 0000000080002fac <bread>: + + +// Return a locked buf with the contents of the indicated block. +struct buf* +bread(uint dev, uint blockno) +{ 80002fac: 711d addi sp,sp,-96 80002fae: ec86 sd ra,88(sp) 80002fb0: e8a2 sd s0,80(sp) @@ -5517,11 +5448,13 @@ devintr() 80002fc0: 1080 addi s0,sp,96 80002fc2: 89aa mv s3,a0 80002fc4: 8a2e mv s4,a1 + return blockno % NBUCKET; 80002fc6: 41f5d79b sraiw a5,a1,0x1f 80002fca: 01b7d79b srliw a5,a5,0x1b 80002fce: 00b78b3b addw s6,a5,a1 80002fd2: 01fb7b13 andi s6,s6,31 80002fd6: 40fb0b3b subw s6,s6,a5 + acquire(&bcache.hash_lock[hash_num]); 80002fda: 001b1a93 slli s5,s6,0x1 80002fde: 9ada add s5,s5,s6 80002fe0: 0a8e slli s5,s5,0x3 @@ -5533,6 +5466,7 @@ devintr() 80002ff2: 9ade add s5,s5,s7 80002ff4: 8556 mv a0,s5 80002ff6: e95fd0ef jal 80000e8a <acquire> + for (b = bcache.head[hash_num].next; b != &bcache.head[hash_num]; b = b->next) 80002ffa: 45800913 li s2,1112 80002ffe: 032b0933 mul s2,s6,s2 80003002: 012b8733 add a4,s7,s2 @@ -5544,13 +5478,17 @@ devintr() 80003014: 993e add s2,s2,a5 80003016: 995e add s2,s2,s7 80003018: 09249a63 bne s1,s2,800030ac <bread+0x100> + release(&bcache.hash_lock[hash_num]); 8000301c: 8556 mv a0,s5 8000301e: f05fd0ef jal 80000f22 <release> + acquire(&bcache.lock); 80003022: 00037517 auipc a0,0x37 80003026: ca650513 addi a0,a0,-858 # 80039cc8 <bcache> 8000302a: e61fd0ef jal 80000e8a <acquire> + acquire(&bcache.hash_lock[hash_num]); 8000302e: 8556 mv a0,s5 80003030: e5bfd0ef jal 80000e8a <acquire> + for (b = bcache.head[hash_num].next; b != &bcache.head[hash_num]; b = b->next) 80003034: 45800793 li a5,1112 80003038: 02fb07b3 mul a5,s6,a5 8000303c: 00037717 auipc a4,0x37 @@ -5562,72 +5500,101 @@ devintr() 8000304e: 09249363 bne s1,s2,800030d4 <bread+0x128> 80003052: e862 sd s8,16(sp) 80003054: e466 sd s9,8(sp) + release(&bcache.hash_lock[hash_num]); 80003056: 8556 mv a0,s5 80003058: ecbfd0ef jal 80000f22 <release> + for (int i = 0; i < NBUCKET; i++) 8000305c: 00048c17 auipc s8,0x48 80003060: 9d4c0c13 addi s8,s8,-1580 # 8004aa30 <bcache+0x10d68> 80003064: 0003fa97 auipc s5,0x3f 80003068: ecca8a93 addi s5,s5,-308 # 80041f30 <bcache+0x8268> 8000306c: 8ce2 mv s9,s8 + acquire(&bcache.hash_lock[i]); 8000306e: 8be2 mv s7,s8 80003070: 8562 mv a0,s8 80003072: e19fd0ef jal 80000e8a <acquire> + for (b = bcache.head[i].prev; b != &bcache.head[i]; b = b->prev) 80003076: 8756 mv a4,s5 80003078: 048ab483 ld s1,72(s5) 8000307c: 01548763 beq s1,s5,8000308a <bread+0xde> + if (b->refcnt==0) 80003080: 40bc lw a5,64(s1) 80003082: c3c1 beqz a5,80003102 <bread+0x156> + for (b = bcache.head[i].prev; b != &bcache.head[i]; b = b->prev) 80003084: 64a4 ld s1,72(s1) 80003086: fee49de3 bne s1,a4,80003080 <bread+0xd4> + release(&bcache.hash_lock[i]); 8000308a: 855e mv a0,s7 8000308c: e97fd0ef jal 80000f22 <release> + for (int i = 0; i < NBUCKET; i++) 80003090: 0c61 addi s8,s8,24 80003092: 458a8a93 addi s5,s5,1112 80003096: fd9a9ce3 bne s5,s9,8000306e <bread+0xc2> + panic("bget: no buffers"); 8000309a: 00006517 auipc a0,0x6 8000309e: 8d650513 addi a0,a0,-1834 # 80008970 <etext+0x970> 800030a2: ef2fd0ef jal 80000794 <panic> + for (b = bcache.head[hash_num].next; b != &bcache.head[hash_num]; b = b->next) 800030a6: 68a4 ld s1,80(s1) 800030a8: f7248ae3 beq s1,s2,8000301c <bread+0x70> + if (b->dev == dev && b->blockno == blockno) 800030ac: 449c lw a5,8(s1) 800030ae: ff379ce3 bne a5,s3,800030a6 <bread+0xfa> 800030b2: 44dc lw a5,12(s1) 800030b4: ff4799e3 bne a5,s4,800030a6 <bread+0xfa> + b->refcnt++; 800030b8: 40bc lw a5,64(s1) 800030ba: 2785 addiw a5,a5,1 800030bc: c0bc sw a5,64(s1) + release(&bcache.hash_lock[hash_num]); 800030be: 8556 mv a0,s5 800030c0: e63fd0ef jal 80000f22 <release> + acquiresleep(&b->lock); 800030c4: 01048513 addi a0,s1,16 800030c8: 34e010ef jal 80004416 <acquiresleep> + return b; 800030cc: a849 j 8000315e <bread+0x1b2> + for (b = bcache.head[hash_num].next; b != &bcache.head[hash_num]; b = b->next) 800030ce: 68a4 ld s1,80(s1) 800030d0: f92481e3 beq s1,s2,80003052 <bread+0xa6> + if (b->dev == dev && b->blockno == blockno) 800030d4: 449c lw a5,8(s1) 800030d6: ff379ce3 bne a5,s3,800030ce <bread+0x122> 800030da: 44dc lw a5,12(s1) 800030dc: ff4799e3 bne a5,s4,800030ce <bread+0x122> + b->refcnt++; 800030e0: 40bc lw a5,64(s1) 800030e2: 2785 addiw a5,a5,1 800030e4: c0bc sw a5,64(s1) + release(&bcache.lock); 800030e6: 00037517 auipc a0,0x37 800030ea: be250513 addi a0,a0,-1054 # 80039cc8 <bcache> 800030ee: e35fd0ef jal 80000f22 <release> + release(&bcache.hash_lock[hash_num]); 800030f2: 8556 mv a0,s5 800030f4: e2ffd0ef jal 80000f22 <release> + acquiresleep(&b->lock); 800030f8: 01048513 addi a0,s1,16 800030fc: 31a010ef jal 80004416 <acquiresleep> + return b; 80003100: a8b9 j 8000315e <bread+0x1b2> + b->dev=dev; 80003102: 0134a423 sw s3,8(s1) + b->blockno=blockno; 80003106: 0144a623 sw s4,12(s1) + b->valid=0; 8000310a: 0004a023 sw zero,0(s1) + b->refcnt=1; 8000310e: 4785 li a5,1 80003110: c0bc sw a5,64(s1) + b->prev->next=b->next; 80003112: 64b8 ld a4,72(s1) 80003114: 68bc ld a5,80(s1) 80003116: eb3c sd a5,80(a4) + b->next->prev=b->prev; 80003118: 64b8 ld a4,72(s1) 8000311a: e7b8 sd a4,72(a5) + b->next=bcache.head[hash_num].next; 8000311c: 00037997 auipc s3,0x37 80003120: bac98993 addi s3,s3,-1108 # 80039cc8 <bcache> 80003124: 45800793 li a5,1112 @@ -5637,20 +5604,36 @@ devintr() 80003130: 97da add a5,a5,s6 80003132: 2b87b703 ld a4,696(a5) # 82b8 <_entry-0x7fff7d48> 80003136: e8b8 sd a4,80(s1) + b->prev=&bcache.head[hash_num]; 80003138: 0524b423 sd s2,72(s1) + bcache.head[hash_num].next->prev=b; 8000313c: 2b87b703 ld a4,696(a5) 80003140: e724 sd s1,72(a4) + bcache.head[hash_num].next=b; 80003142: 2a97bc23 sd s1,696(a5) + release(&bcache.hash_lock[i]); 80003146: 855e mv a0,s7 80003148: ddbfd0ef jal 80000f22 <release> + release(&bcache.lock); 8000314c: 854e mv a0,s3 8000314e: dd5fd0ef jal 80000f22 <release> + acquiresleep(&b->lock); 80003152: 01048513 addi a0,s1,16 80003156: 2c0010ef jal 80004416 <acquiresleep> + return b; 8000315a: 6c42 ld s8,16(sp) 8000315c: 6ca2 ld s9,8(sp) + struct buf *b; + + b = bget(dev, blockno); + if(!b->valid) { 8000315e: 409c lw a5,0(s1) 80003160: cf89 beqz a5,8000317a <bread+0x1ce> + virtio_disk_rw(b, 0); + b->valid = 1; + } + return b; +} 80003162: 8526 mv a0,s1 80003164: 60e6 ld ra,88(sp) 80003166: 6446 ld s0,80(sp) @@ -5663,36 +5646,55 @@ devintr() 80003174: 6be2 ld s7,24(sp) 80003176: 6125 addi sp,sp,96 80003178: 8082 ret + virtio_disk_rw(b, 0); 8000317a: 4581 li a1,0 8000317c: 8526 mv a0,s1 8000317e: 453020ef jal 80005dd0 <virtio_disk_rw> + b->valid = 1; 80003182: 4785 li a5,1 80003184: c09c sw a5,0(s1) + return b; 80003186: bff1 j 80003162 <bread+0x1b6> 0000000080003188 <bwrite>: + +// Write b's contents to disk. Must be locked. +void +bwrite(struct buf *b) +{ 80003188: 1101 addi sp,sp,-32 8000318a: ec06 sd ra,24(sp) 8000318c: e822 sd s0,16(sp) 8000318e: e426 sd s1,8(sp) 80003190: 1000 addi s0,sp,32 80003192: 84aa mv s1,a0 + if(!holdingsleep(&b->lock)) 80003194: 0541 addi a0,a0,16 80003196: 2fe010ef jal 80004494 <holdingsleep> 8000319a: c911 beqz a0,800031ae <bwrite+0x26> + panic("bwrite"); + virtio_disk_rw(b, 1); 8000319c: 4585 li a1,1 8000319e: 8526 mv a0,s1 800031a0: 431020ef jal 80005dd0 <virtio_disk_rw> +} 800031a4: 60e2 ld ra,24(sp) 800031a6: 6442 ld s0,16(sp) 800031a8: 64a2 ld s1,8(sp) 800031aa: 6105 addi sp,sp,32 800031ac: 8082 ret + panic("bwrite"); 800031ae: 00005517 auipc a0,0x5 800031b2: 7da50513 addi a0,a0,2010 # 80008988 <etext+0x988> 800031b6: ddefd0ef jal 80000794 <panic> 00000000800031ba <brelse>: +// Release a locked buffer. +// Move to the head of the most-recently-used list. +// buf.c + +void brelse(struct buf *b) +{ 800031ba: 1101 addi sp,sp,-32 800031bc: ec06 sd ra,24(sp) 800031be: e822 sd s0,16(sp) @@ -5700,38 +5702,63 @@ devintr() 800031c2: e04a sd s2,0(sp) 800031c4: 1000 addi s0,sp,32 800031c6: 84aa mv s1,a0 + if (!holdingsleep(&b->lock)) 800031c8: 01050913 addi s2,a0,16 800031cc: 854a mv a0,s2 800031ce: 2c6010ef jal 80004494 <holdingsleep> 800031d2: c115 beqz a0,800031f6 <brelse+0x3c> + panic("brelse"); + + releasesleep(&b->lock); 800031d4: 854a mv a0,s2 800031d6: 286010ef jal 8000445c <releasesleep> + + // acquire(&bcache.lock); + + int hash_num = HASHNUM(b->blockno); 800031da: 44dc lw a5,12(s1) + // acquire(&bcache.hash_lock[hash_num]); + if (b->refcnt > 0) 800031dc: 40b8 lw a4,64(s1) 800031de: c315 beqz a4,80003202 <brelse+0x48> + { + b->refcnt--; 800031e0: 377d addiw a4,a4,-1 800031e2: 0007069b sext.w a3,a4 800031e6: c0b8 sw a4,64(s1) + } + if (b->refcnt == 0) 800031e8: ce89 beqz a3,80003202 <brelse+0x48> + b->next = bcache.head[hash_num].next; + b->prev = &bcache.head[hash_num]; + bcache.head[hash_num].next->prev = b; + bcache.head[hash_num].next = b; + } +} 800031ea: 60e2 ld ra,24(sp) 800031ec: 6442 ld s0,16(sp) 800031ee: 64a2 ld s1,8(sp) 800031f0: 6902 ld s2,0(sp) 800031f2: 6105 addi sp,sp,32 800031f4: 8082 ret + panic("brelse"); 800031f6: 00005517 auipc a0,0x5 800031fa: 79a50513 addi a0,a0,1946 # 80008990 <etext+0x990> 800031fe: d96fd0ef jal 80000794 <panic> + return blockno % NBUCKET; 80003202: 41f7d71b sraiw a4,a5,0x1f 80003206: 01b7571b srliw a4,a4,0x1b 8000320a: 9fb9 addw a5,a5,a4 8000320c: 8bfd andi a5,a5,31 8000320e: 9f99 subw a5,a5,a4 + b->next->prev = b->prev; 80003210: 68b4 ld a3,80(s1) 80003212: 64b8 ld a4,72(s1) 80003214: e6b8 sd a4,72(a3) + b->prev->next = b->next; 80003216: 68b4 ld a3,80(s1) 80003218: eb34 sd a3,80(a4) + b->next = bcache.head[hash_num].next; 8000321a: 00037617 auipc a2,0x37 8000321e: aae60613 addi a2,a2,-1362 # 80039cc8 <bcache> 80003222: 45800713 li a4,1112 @@ -5741,17 +5768,24 @@ devintr() 80003230: 9736 add a4,a4,a3 80003232: 2b873683 ld a3,696(a4) # 82b8 <_entry-0x7fff7d48> 80003236: e8b4 sd a3,80(s1) + b->prev = &bcache.head[hash_num]; 80003238: 66a1 lui a3,0x8 8000323a: 26868693 addi a3,a3,616 # 8268 <_entry-0x7fff7d98> 8000323e: 97b6 add a5,a5,a3 80003240: 97b2 add a5,a5,a2 80003242: e4bc sd a5,72(s1) + bcache.head[hash_num].next->prev = b; 80003244: 2b873783 ld a5,696(a4) 80003248: e7a4 sd s1,72(a5) + bcache.head[hash_num].next = b; 8000324a: 2a973c23 sd s1,696(a4) +} 8000324e: bf71 j 800031ea <brelse+0x30> 0000000080003250 <bpin>: + +void bpin(struct buf *b) +{ 80003250: 1101 addi sp,sp,-32 80003252: ec06 sd ra,24(sp) 80003254: e822 sd s0,16(sp) @@ -5759,11 +5793,14 @@ devintr() 80003258: e04a sd s2,0(sp) 8000325a: 1000 addi s0,sp,32 8000325c: 892a mv s2,a0 + return blockno % NBUCKET; 8000325e: 455c lw a5,12(a0) 80003260: 41f7d71b sraiw a4,a5,0x1f 80003264: 01b7571b srliw a4,a4,0x1b 80003268: 9fb9 addw a5,a5,a4 8000326a: 8bfd andi a5,a5,31 + int hash_num=HASHNUM(b->blockno); + acquire(&bcache.hash_lock[hash_num]); 8000326c: 9f99 subw a5,a5,a4 8000326e: 00179493 slli s1,a5,0x1 80003272: 94be add s1,s1,a5 @@ -5776,11 +5813,17 @@ devintr() 80003286: 94be add s1,s1,a5 80003288: 8526 mv a0,s1 8000328a: c01fd0ef jal 80000e8a <acquire> + b->refcnt++; 8000328e: 04092783 lw a5,64(s2) 80003292: 2785 addiw a5,a5,1 80003294: 04f92023 sw a5,64(s2) + release(&bcache.hash_lock[hash_num]); 80003298: 8526 mv a0,s1 8000329a: c89fd0ef jal 80000f22 <release> + // acquire(&bcache.lock); + // b->refcnt++; + // release(&bcache.lock); +} 8000329e: 60e2 ld ra,24(sp) 800032a0: 6442 ld s0,16(sp) 800032a2: 64a2 ld s1,8(sp) @@ -5789,6 +5832,9 @@ devintr() 800032a8: 8082 ret 00000000800032aa <bunpin>: + +void bunpin(struct buf *b) +{ 800032aa: 1101 addi sp,sp,-32 800032ac: ec06 sd ra,24(sp) 800032ae: e822 sd s0,16(sp) @@ -5796,11 +5842,14 @@ devintr() 800032b2: e04a sd s2,0(sp) 800032b4: 1000 addi s0,sp,32 800032b6: 892a mv s2,a0 + return blockno % NBUCKET; 800032b8: 455c lw a5,12(a0) 800032ba: 41f7d71b sraiw a4,a5,0x1f 800032be: 01b7571b srliw a4,a4,0x1b 800032c2: 9fb9 addw a5,a5,a4 800032c4: 8bfd andi a5,a5,31 + int hash_num=HASHNUM(b->blockno); + acquire(&bcache.hash_lock[hash_num]); 800032c6: 9f99 subw a5,a5,a4 800032c8: 00179493 slli s1,a5,0x1 800032cc: 94be add s1,s1,a5 @@ -5813,11 +5862,17 @@ devintr() 800032e0: 94be add s1,s1,a5 800032e2: 8526 mv a0,s1 800032e4: ba7fd0ef jal 80000e8a <acquire> + b->refcnt--; 800032e8: 04092783 lw a5,64(s2) 800032ec: 37fd addiw a5,a5,-1 800032ee: 04f92023 sw a5,64(s2) + release(&bcache.hash_lock[hash_num]); 800032f2: 8526 mv a0,s1 800032f4: c2ffd0ef jal 80000f22 <release> + // acquire(&bcache.lock); + // b->refcnt++; + // release(&bcache.lock); +} 800032f8: 60e2 ld ra,24(sp) 800032fa: 6442 ld s0,16(sp) 800032fc: 64a2 ld s1,8(sp) @@ -5826,6 +5881,12 @@ devintr() 80003302: 8082 ret 0000000080003304 <bfree>: +} + +// Free a disk block. +static void +bfree(int dev, uint b) +{ 80003304: 1101 addi sp,sp,-32 80003306: ec06 sd ra,24(sp) 80003308: e822 sd s0,16(sp) @@ -5833,14 +5894,21 @@ devintr() 8000330c: e04a sd s2,0(sp) 8000330e: 1000 addi s0,sp,32 80003310: 84ae mv s1,a1 + struct buf *bp; + int bi, m; + + bp = bread(dev, BBLOCK(b, sb)); 80003312: 00d5d59b srliw a1,a1,0xd 80003316: 00048797 auipc a5,0x48 8000331a: a367a783 lw a5,-1482(a5) # 8004ad4c <sb+0x1c> 8000331e: 9dbd addw a1,a1,a5 80003320: c8dff0ef jal 80002fac <bread> + bi = b % BPB; + m = 1 << (bi % 8); 80003324: 0074f713 andi a4,s1,7 80003328: 4785 li a5,1 8000332a: 00e797bb sllw a5,a5,a4 + if((bp->data[bi/8] & m) == 0) 8000332e: 14ce slli s1,s1,0x33 80003330: 90d9 srli s1,s1,0x36 80003332: 00950733 add a4,a0,s1 @@ -5848,29 +5916,37 @@ devintr() 8000333a: 00e7f6b3 and a3,a5,a4 8000333e: c29d beqz a3,80003364 <bfree+0x60> 80003340: 892a mv s2,a0 + panic("freeing free block"); + bp->data[bi/8] &= ~m; 80003342: 94aa add s1,s1,a0 80003344: fff7c793 not a5,a5 80003348: 8f7d and a4,a4,a5 8000334a: 04e48c23 sb a4,88(s1) + log_write(bp); 8000334e: 7c3000ef jal 80004310 <log_write> + brelse(bp); 80003352: 854a mv a0,s2 80003354: e67ff0ef jal 800031ba <brelse> +} 80003358: 60e2 ld ra,24(sp) 8000335a: 6442 ld s0,16(sp) 8000335c: 64a2 ld s1,8(sp) 8000335e: 6902 ld s2,0(sp) 80003360: 6105 addi sp,sp,32 80003362: 8082 ret + panic("freeing free block"); 80003364: 00005517 auipc a0,0x5 80003368: 63450513 addi a0,a0,1588 # 80008998 <etext+0x998> 8000336c: c28fd0ef jal 80000794 <panic> 0000000080003370 <balloc>: +{ 80003370: 711d addi sp,sp,-96 80003372: ec86 sd ra,88(sp) 80003374: e8a2 sd s0,80(sp) 80003376: e4a6 sd s1,72(sp) 80003378: 1080 addi s0,sp,96 + for(b = 0; b < sb.size; b += BPB){ 8000337a: 00048797 auipc a5,0x48 8000337e: 9ba7a783 lw a5,-1606(a5) # 8004ad34 <sb+0x4> 80003382: 0e078f63 beqz a5,80003480 <balloc+0x110> @@ -5884,32 +5960,45 @@ devintr() 80003394: e466 sd s9,8(sp) 80003396: 8baa mv s7,a0 80003398: 4a81 li s5,0 + bp = bread(dev, BBLOCK(b, sb)); 8000339a: 00048b17 auipc s6,0x48 8000339e: 996b0b13 addi s6,s6,-1642 # 8004ad30 <sb> + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ 800033a2: 4c01 li s8,0 + m = 1 << (bi % 8); 800033a4: 4985 li s3,1 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ 800033a6: 6a09 lui s4,0x2 + for(b = 0; b < sb.size; b += BPB){ 800033a8: 6c89 lui s9,0x2 800033aa: a0b5 j 80003416 <balloc+0xa6> + bp->data[bi/8] |= m; // Mark block in use. 800033ac: 97ca add a5,a5,s2 800033ae: 8e55 or a2,a2,a3 800033b0: 04c78c23 sb a2,88(a5) + log_write(bp); 800033b4: 854a mv a0,s2 800033b6: 75b000ef jal 80004310 <log_write> + brelse(bp); 800033ba: 854a mv a0,s2 800033bc: dffff0ef jal 800031ba <brelse> + bp = bread(dev, bno); 800033c0: 85a6 mv a1,s1 800033c2: 855e mv a0,s7 800033c4: be9ff0ef jal 80002fac <bread> 800033c8: 892a mv s2,a0 + memset(bp->data, 0, BSIZE); 800033ca: 40000613 li a2,1024 800033ce: 4581 li a1,0 800033d0: 05850513 addi a0,a0,88 800033d4: b8bfd0ef jal 80000f5e <memset> + log_write(bp); 800033d8: 854a mv a0,s2 800033da: 737000ef jal 80004310 <log_write> + brelse(bp); 800033de: 854a mv a0,s2 800033e0: ddbff0ef jal 800031ba <brelse> +} 800033e4: 6906 ld s2,64(sp) 800033e6: 79e2 ld s3,56(sp) 800033e8: 7a42 ld s4,48(sp) @@ -5918,18 +6007,22 @@ devintr() 800033ee: 6be2 ld s7,24(sp) 800033f0: 6c42 ld s8,16(sp) 800033f2: 6ca2 ld s9,8(sp) +} 800033f4: 8526 mv a0,s1 800033f6: 60e6 ld ra,88(sp) 800033f8: 6446 ld s0,80(sp) 800033fa: 64a6 ld s1,72(sp) 800033fc: 6125 addi sp,sp,96 800033fe: 8082 ret + brelse(bp); 80003400: 854a mv a0,s2 80003402: db9ff0ef jal 800031ba <brelse> + for(b = 0; b < sb.size; b += BPB){ 80003406: 015c87bb addw a5,s9,s5 8000340a: 00078a9b sext.w s5,a5 8000340e: 004b2703 lw a4,4(s6) 80003412: 04eaff63 bgeu s5,a4,80003470 <balloc+0x100> + bp = bread(dev, BBLOCK(b, sb)); 80003416: 41fad79b sraiw a5,s5,0x1f 8000341a: 0137d79b srliw a5,a5,0x13 8000341e: 015787bb addw a5,a5,s5 @@ -5939,12 +6032,15 @@ devintr() 8000342c: 855e mv a0,s7 8000342e: b7fff0ef jal 80002fac <bread> 80003432: 892a mv s2,a0 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ 80003434: 004b2503 lw a0,4(s6) 80003438: 000a849b sext.w s1,s5 8000343c: 8762 mv a4,s8 8000343e: fca4f1e3 bgeu s1,a0,80003400 <balloc+0x90> + m = 1 << (bi % 8); 80003442: 00777693 andi a3,a4,7 80003446: 00d996bb sllw a3,s3,a3 + if((bp->data[bi/8] & m) == 0){ // Is block free? 8000344a: 41f7579b sraiw a5,a4,0x1f 8000344e: 01d7d79b srliw a5,a5,0x1d 80003452: 9fb9 addw a5,a5,a4 @@ -5953,6 +6049,7 @@ devintr() 8000345c: 05864603 lbu a2,88(a2) 80003460: 00c6f5b3 and a1,a3,a2 80003464: d5a1 beqz a1,800033ac <balloc+0x3c> + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ 80003466: 2705 addiw a4,a4,1 80003468: 2485 addiw s1,s1,1 8000346a: fd471ae3 bne a4,s4,8000343e <balloc+0xce> @@ -5965,13 +6062,21 @@ devintr() 8000347a: 6be2 ld s7,24(sp) 8000347c: 6c42 ld s8,16(sp) 8000347e: 6ca2 ld s9,8(sp) + printf("balloc: out of blocks\n"); 80003480: 00005517 auipc a0,0x5 80003484: 53050513 addi a0,a0,1328 # 800089b0 <etext+0x9b0> 80003488: 83afd0ef jal 800004c2 <printf> + return 0; 8000348c: 4481 li s1,0 8000348e: b79d j 800033f4 <balloc+0x84> 0000000080003490 <bmap>: +// Return the disk block address of the nth block in inode ip. +// If there is no such block, bmap allocates one. +// returns 0 if out of disk space. +static uint +bmap(struct inode *ip, uint bn) +{ 80003490: 7139 addi sp,sp,-64 80003492: fc06 sd ra,56(sp) 80003494: f822 sd s0,48(sp) @@ -5980,13 +6085,26 @@ devintr() 8000349a: ec4e sd s3,24(sp) 8000349c: 0080 addi s0,sp,64 8000349e: 89aa mv s3,a0 + uint addr, *a; + struct buf *bp; + struct buf *bp2; + uint *a2; + + if(bn < NDIRECT){ 800034a0: 47a9 li a5,10 800034a2: 02b7ee63 bltu a5,a1,800034de <bmap+0x4e> + if((addr = ip->addrs[bn]) == 0){ 800034a6: 02059793 slli a5,a1,0x20 800034aa: 01e7d593 srli a1,a5,0x1e 800034ae: 00b504b3 add s1,a0,a1 800034b2: 0504a903 lw s2,80(s1) 800034b6: 00090a63 beqz s2,800034ca <bmap+0x3a> + brelse(bp2); + return addr; + } + + panic("bmap: out of range"); +} 800034ba: 854a mv a0,s2 800034bc: 70e2 ld ra,56(sp) 800034be: 7442 ld s0,48(sp) @@ -5995,108 +6113,147 @@ devintr() 800034c4: 69e2 ld s3,24(sp) 800034c6: 6121 addi sp,sp,64 800034c8: 8082 ret + addr = balloc(ip->dev); 800034ca: 4108 lw a0,0(a0) 800034cc: ea5ff0ef jal 80003370 <balloc> 800034d0: 0005091b sext.w s2,a0 + if(addr == 0) 800034d4: fe0903e3 beqz s2,800034ba <bmap+0x2a> + ip->addrs[bn] = addr; 800034d8: 0524a823 sw s2,80(s1) 800034dc: bff9 j 800034ba <bmap+0x2a> + bn -= NDIRECT; 800034de: ff55849b addiw s1,a1,-11 800034e2: 0004871b sext.w a4,s1 + if(bn < NINDIRECT){ 800034e6: 0ff00793 li a5,255 800034ea: 06e7e663 bltu a5,a4,80003556 <bmap+0xc6> + if((addr = ip->addrs[NDIRECT]) == 0){ 800034ee: 07c52903 lw s2,124(a0) 800034f2: 00091d63 bnez s2,8000350c <bmap+0x7c> + addr = balloc(ip->dev); 800034f6: 4108 lw a0,0(a0) 800034f8: e79ff0ef jal 80003370 <balloc> 800034fc: 0005091b sext.w s2,a0 + if(addr == 0) 80003500: fa090de3 beqz s2,800034ba <bmap+0x2a> 80003504: e852 sd s4,16(sp) + ip->addrs[NDIRECT] = addr; 80003506: 0729ae23 sw s2,124(s3) 8000350a: a011 j 8000350e <bmap+0x7e> 8000350c: e852 sd s4,16(sp) + bp = bread(ip->dev, addr); 8000350e: 85ca mv a1,s2 80003510: 0009a503 lw a0,0(s3) 80003514: a99ff0ef jal 80002fac <bread> 80003518: 8a2a mv s4,a0 + a = (uint*)bp->data; 8000351a: 05850793 addi a5,a0,88 + if((addr = a[bn]) == 0){ 8000351e: 02049713 slli a4,s1,0x20 80003522: 01e75493 srli s1,a4,0x1e 80003526: 94be add s1,s1,a5 80003528: 0004a903 lw s2,0(s1) 8000352c: 00090763 beqz s2,8000353a <bmap+0xaa> + brelse(bp); 80003530: 8552 mv a0,s4 80003532: c89ff0ef jal 800031ba <brelse> + return addr; 80003536: 6a42 ld s4,16(sp) 80003538: b749 j 800034ba <bmap+0x2a> + addr = balloc(ip->dev); 8000353a: 0009a503 lw a0,0(s3) 8000353e: e33ff0ef jal 80003370 <balloc> 80003542: 0005091b sext.w s2,a0 + if(addr){ 80003546: fe0905e3 beqz s2,80003530 <bmap+0xa0> + a[bn] = addr; 8000354a: 0124a023 sw s2,0(s1) + log_write(bp); 8000354e: 8552 mv a0,s4 80003550: 5c1000ef jal 80004310 <log_write> 80003554: bff1 j 80003530 <bmap+0xa0> 80003556: e852 sd s4,16(sp) 80003558: e456 sd s5,8(sp) + bn -= NINDIRECT; 8000355a: ef55859b addiw a1,a1,-267 8000355e: 0005871b sext.w a4,a1 + if(bn < NDOUBLE_INDIRECT){ 80003562: 67c1 lui a5,0x10 80003564: 0af77263 bgeu a4,a5,80003608 <bmap+0x178> + uint bn_level_1 = bn / NINDIRECT; 80003568: 0085d91b srliw s2,a1,0x8 + uint bn_level_2 = bn % NINDIRECT; 8000356c: 0ff5f493 zext.b s1,a1 + if((addr = ip->addrs[NDIRECT+1]) ==0) 80003570: 08052583 lw a1,128(a0) 80003574: c9b1 beqz a1,800035c8 <bmap+0x138> + bp = bread(ip->dev,addr); 80003576: 0009a503 lw a0,0(s3) 8000357a: a33ff0ef jal 80002fac <bread> 8000357e: 8a2a mv s4,a0 + a = (uint*)bp->data; 80003580: 05850793 addi a5,a0,88 + if((addr = a[bn_level_1]) ==0){ 80003584: 1902 slli s2,s2,0x20 80003586: 02095913 srli s2,s2,0x20 8000358a: 090a slli s2,s2,0x2 8000358c: 993e add s2,s2,a5 8000358e: 00092a83 lw s5,0(s2) 80003592: 040a8363 beqz s5,800035d8 <bmap+0x148> + brelse(bp); 80003596: 8552 mv a0,s4 80003598: c23ff0ef jal 800031ba <brelse> + bp2 = bread(ip->dev,addr); 8000359c: 85d6 mv a1,s5 8000359e: 0009a503 lw a0,0(s3) 800035a2: a0bff0ef jal 80002fac <bread> 800035a6: 8a2a mv s4,a0 + a2 = (uint*)bp2->data; 800035a8: 05850793 addi a5,a0,88 + if((addr = a2[bn_level_2])==0){ 800035ac: 00249593 slli a1,s1,0x2 800035b0: 00b784b3 add s1,a5,a1 800035b4: 0004a903 lw s2,0(s1) 800035b8: 02090c63 beqz s2,800035f0 <bmap+0x160> + brelse(bp2); 800035bc: 8552 mv a0,s4 800035be: bfdff0ef jal 800031ba <brelse> + return addr; 800035c2: 6a42 ld s4,16(sp) 800035c4: 6aa2 ld s5,8(sp) 800035c6: bdd5 j 800034ba <bmap+0x2a> + ip->addrs[NDIRECT +1] = addr = balloc(ip->dev); 800035c8: 4108 lw a0,0(a0) 800035ca: da7ff0ef jal 80003370 <balloc> 800035ce: 0005059b sext.w a1,a0 800035d2: 08b9a023 sw a1,128(s3) 800035d6: b745 j 80003576 <bmap+0xe6> + a[bn_level_1] = addr = balloc(ip->dev); 800035d8: 0009a503 lw a0,0(s3) 800035dc: d95ff0ef jal 80003370 <balloc> 800035e0: 00050a9b sext.w s5,a0 800035e4: 01592023 sw s5,0(s2) + log_write(bp); 800035e8: 8552 mv a0,s4 800035ea: 527000ef jal 80004310 <log_write> 800035ee: b765 j 80003596 <bmap+0x106> + a2[bn_level_2] = addr = balloc(ip->dev); 800035f0: 0009a503 lw a0,0(s3) 800035f4: d7dff0ef jal 80003370 <balloc> 800035f8: 0005091b sext.w s2,a0 800035fc: 0124a023 sw s2,0(s1) + log_write(bp2); 80003600: 8552 mv a0,s4 80003602: 50f000ef jal 80004310 <log_write> 80003606: bf5d j 800035bc <bmap+0x12c> + panic("bmap: out of range"); 80003608: 00005517 auipc a0,0x5 8000360c: 3c050513 addi a0,a0,960 # 800089c8 <etext+0x9c8> 80003610: 984fd0ef jal 80000794 <panic> 0000000080003614 <iget>: +{ 80003614: 7179 addi sp,sp,-48 80003616: f406 sd ra,40(sp) 80003618: f022 sd s0,32(sp) @@ -6107,43 +6264,61 @@ devintr() 80003622: 1800 addi s0,sp,48 80003624: 89aa mv s3,a0 80003626: 8a2e mv s4,a1 + acquire(&itable.lock); 80003628: 00047517 auipc a0,0x47 8000362c: 72850513 addi a0,a0,1832 # 8004ad50 <itable> 80003630: 85bfd0ef jal 80000e8a <acquire> + empty = 0; 80003634: 4901 li s2,0 + for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){ 80003636: 00047497 auipc s1,0x47 8000363a: 73248493 addi s1,s1,1842 # 8004ad68 <itable+0x18> 8000363e: 00049697 auipc a3,0x49 80003642: 1ba68693 addi a3,a3,442 # 8004c7f8 <log> 80003646: a039 j 80003654 <iget+0x40> + if(empty == 0 && ip->ref == 0) // Remember empty slot. 80003648: 02090963 beqz s2,8000367a <iget+0x66> + for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){ 8000364c: 08848493 addi s1,s1,136 80003650: 02d48863 beq s1,a3,80003680 <iget+0x6c> + if(ip->ref > 0 && ip->dev == dev && ip->inum == inum){ 80003654: 449c lw a5,8(s1) 80003656: fef059e3 blez a5,80003648 <iget+0x34> 8000365a: 4098 lw a4,0(s1) 8000365c: ff3716e3 bne a4,s3,80003648 <iget+0x34> 80003660: 40d8 lw a4,4(s1) 80003662: ff4713e3 bne a4,s4,80003648 <iget+0x34> + ip->ref++; 80003666: 2785 addiw a5,a5,1 # 10001 <_entry-0x7ffeffff> 80003668: c49c sw a5,8(s1) + release(&itable.lock); 8000366a: 00047517 auipc a0,0x47 8000366e: 6e650513 addi a0,a0,1766 # 8004ad50 <itable> 80003672: 8b1fd0ef jal 80000f22 <release> + return ip; 80003676: 8926 mv s2,s1 80003678: a02d j 800036a2 <iget+0x8e> + if(empty == 0 && ip->ref == 0) // Remember empty slot. 8000367a: fbe9 bnez a5,8000364c <iget+0x38> + empty = ip; 8000367c: 8926 mv s2,s1 8000367e: b7f9 j 8000364c <iget+0x38> + if(empty == 0) 80003680: 02090a63 beqz s2,800036b4 <iget+0xa0> + ip->dev = dev; 80003684: 01392023 sw s3,0(s2) + ip->inum = inum; 80003688: 01492223 sw s4,4(s2) + ip->ref = 1; 8000368c: 4785 li a5,1 8000368e: 00f92423 sw a5,8(s2) + ip->valid = 0; 80003692: 04092023 sw zero,64(s2) + release(&itable.lock); 80003696: 00047517 auipc a0,0x47 8000369a: 6ba50513 addi a0,a0,1722 # 8004ad50 <itable> 8000369e: 885fd0ef jal 80000f22 <release> +} 800036a2: 854a mv a0,s2 800036a4: 70a2 ld ra,40(sp) 800036a6: 7402 ld s0,32(sp) @@ -6153,11 +6328,13 @@ devintr() 800036ae: 6a02 ld s4,0(sp) 800036b0: 6145 addi sp,sp,48 800036b2: 8082 ret + panic("iget: no inodes"); 800036b4: 00005517 auipc a0,0x5 800036b8: 32c50513 addi a0,a0,812 # 800089e0 <etext+0x9e0> 800036bc: 8d8fd0ef jal 80000794 <panic> 00000000800036c0 <fsinit>: +fsinit(int dev) { 800036c0: 7179 addi sp,sp,-48 800036c2: f406 sd ra,40(sp) 800036c4: f022 sd s0,32(sp) @@ -6166,25 +6343,31 @@ devintr() 800036ca: e44e sd s3,8(sp) 800036cc: 1800 addi s0,sp,48 800036ce: 892a mv s2,a0 + bp = bread(dev, 1); 800036d0: 4585 li a1,1 800036d2: 8dbff0ef jal 80002fac <bread> 800036d6: 84aa mv s1,a0 + memmove(sb, bp->data, sizeof(*sb)); 800036d8: 00047997 auipc s3,0x47 800036dc: 65898993 addi s3,s3,1624 # 8004ad30 <sb> 800036e0: 02000613 li a2,32 800036e4: 05850593 addi a1,a0,88 800036e8: 854e mv a0,s3 800036ea: 8d1fd0ef jal 80000fba <memmove> + brelse(bp); 800036ee: 8526 mv a0,s1 800036f0: acbff0ef jal 800031ba <brelse> + if(sb.magic != FSMAGIC) 800036f4: 0009a703 lw a4,0(s3) 800036f8: 102037b7 lui a5,0x10203 800036fc: 04078793 addi a5,a5,64 # 10203040 <_entry-0x6fdfcfc0> 80003700: 02f71063 bne a4,a5,80003720 <fsinit+0x60> + initlog(dev, &sb); 80003704: 00047597 auipc a1,0x47 80003708: 62c58593 addi a1,a1,1580 # 8004ad30 <sb> 8000370c: 854a mv a0,s2 8000370e: 1fb000ef jal 80004108 <initlog> +} 80003712: 70a2 ld ra,40(sp) 80003714: 7402 ld s0,32(sp) 80003716: 64e2 ld s1,24(sp) @@ -6192,11 +6375,13 @@ devintr() 8000371a: 69a2 ld s3,8(sp) 8000371c: 6145 addi sp,sp,48 8000371e: 8082 ret + panic("invalid file system"); 80003720: 00005517 auipc a0,0x5 80003724: 2d050513 addi a0,a0,720 # 800089f0 <etext+0x9f0> 80003728: 86cfd0ef jal 80000794 <panic> 000000008000372c <iinit>: +{ 8000372c: 7179 addi sp,sp,-48 8000372e: f406 sd ra,40(sp) 80003730: f022 sd s0,32(sp) @@ -6204,22 +6389,27 @@ devintr() 80003734: e84a sd s2,16(sp) 80003736: e44e sd s3,8(sp) 80003738: 1800 addi s0,sp,48 + initlock(&itable.lock, "itable"); 8000373a: 00005597 auipc a1,0x5 8000373e: 2ce58593 addi a1,a1,718 # 80008a08 <etext+0xa08> 80003742: 00047517 auipc a0,0x47 80003746: 60e50513 addi a0,a0,1550 # 8004ad50 <itable> 8000374a: ec0fd0ef jal 80000e0a <initlock> + for(i = 0; i < NINODE; i++) { 8000374e: 00047497 auipc s1,0x47 80003752: 62a48493 addi s1,s1,1578 # 8004ad78 <itable+0x28> 80003756: 00049997 auipc s3,0x49 8000375a: 0b298993 addi s3,s3,178 # 8004c808 <log+0x10> + initsleeplock(&itable.inode[i].lock, "inode"); 8000375e: 00005917 auipc s2,0x5 80003762: 2b290913 addi s2,s2,690 # 80008a10 <etext+0xa10> 80003766: 85ca mv a1,s2 80003768: 8526 mv a0,s1 8000376a: 477000ef jal 800043e0 <initsleeplock> + for(i = 0; i < NINODE; i++) { 8000376e: 08848493 addi s1,s1,136 80003772: ff349ae3 bne s1,s3,80003766 <iinit+0x3a> +} 80003776: 70a2 ld ra,40(sp) 80003778: 7402 ld s0,32(sp) 8000377a: 64e2 ld s1,24(sp) @@ -6229,10 +6419,12 @@ devintr() 80003782: 8082 ret 0000000080003784 <ialloc>: +{ 80003784: 7139 addi sp,sp,-64 80003786: fc06 sd ra,56(sp) 80003788: f822 sd s0,48(sp) 8000378a: 0080 addi s0,sp,64 + for(inum = 1; inum < sb.ninodes; inum++){ 8000378c: 00047717 auipc a4,0x47 80003790: 5b072703 lw a4,1456(a4) # 8004ad3c <sb+0xc> 80003794: 4785 li a5,1 @@ -6246,6 +6438,7 @@ devintr() 800037a6: 8aaa mv s5,a0 800037a8: 8b2e mv s6,a1 800037aa: 4905 li s2,1 + bp = bread(dev, IBLOCK(inum, sb)); 800037ac: 00047a17 auipc s4,0x47 800037b0: 584a0a13 addi s4,s4,1412 # 8004ad30 <sb> 800037b4: 00495593 srli a1,s2,0x4 @@ -6254,13 +6447,17 @@ devintr() 800037be: 8556 mv a0,s5 800037c0: fecff0ef jal 80002fac <bread> 800037c4: 84aa mv s1,a0 + dip = (struct dinode*)bp->data + inum%IPB; 800037c6: 05850993 addi s3,a0,88 800037ca: 00f97793 andi a5,s2,15 800037ce: 079a slli a5,a5,0x6 800037d0: 99be add s3,s3,a5 + if(dip->type == 0){ // a free inode 800037d2: 00099783 lh a5,0(s3) 800037d6: cb9d beqz a5,8000380c <ialloc+0x88> + brelse(bp); 800037d8: 9e3ff0ef jal 800031ba <brelse> + for(inum = 1; inum < sb.ninodes; inum++){ 800037dc: 0905 addi s2,s2,1 800037de: 00ca2703 lw a4,12(s4) 800037e2: 0009079b sext.w a5,s2 @@ -6271,23 +6468,31 @@ devintr() 800037f0: 6a42 ld s4,16(sp) 800037f2: 6aa2 ld s5,8(sp) 800037f4: 6b02 ld s6,0(sp) + printf("ialloc: no inodes\n"); 800037f6: 00005517 auipc a0,0x5 800037fa: 22250513 addi a0,a0,546 # 80008a18 <etext+0xa18> 800037fe: cc5fc0ef jal 800004c2 <printf> + return 0; 80003802: 4501 li a0,0 +} 80003804: 70e2 ld ra,56(sp) 80003806: 7442 ld s0,48(sp) 80003808: 6121 addi sp,sp,64 8000380a: 8082 ret + memset(dip, 0, sizeof(*dip)); 8000380c: 04000613 li a2,64 80003810: 4581 li a1,0 80003812: 854e mv a0,s3 80003814: f4afd0ef jal 80000f5e <memset> + dip->type = type; 80003818: 01699023 sh s6,0(s3) + log_write(bp); // mark it allocated on the disk 8000381c: 8526 mv a0,s1 8000381e: 2f3000ef jal 80004310 <log_write> + brelse(bp); 80003822: 8526 mv a0,s1 80003824: 997ff0ef jal 800031ba <brelse> + return iget(dev, inum); 80003828: 0009059b sext.w a1,s2 8000382c: 8556 mv a0,s5 8000382e: de7ff0ef jal 80003614 <iget> @@ -6300,6 +6505,7 @@ devintr() 8000383e: b7d9 j 80003804 <ialloc+0x80> 0000000080003840 <iupdate>: +{ 80003840: 1101 addi sp,sp,-32 80003842: ec06 sd ra,24(sp) 80003844: e822 sd s0,16(sp) @@ -6307,6 +6513,7 @@ devintr() 80003848: e04a sd s2,0(sp) 8000384a: 1000 addi s0,sp,32 8000384c: 84aa mv s1,a0 + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); 8000384e: 415c lw a5,4(a0) 80003850: 0047d79b srliw a5,a5,0x4 80003854: 00047597 auipc a1,0x47 @@ -6315,29 +6522,39 @@ devintr() 8000385e: 4108 lw a0,0(a0) 80003860: f4cff0ef jal 80002fac <bread> 80003864: 892a mv s2,a0 + dip = (struct dinode*)bp->data + ip->inum%IPB; 80003866: 05850793 addi a5,a0,88 8000386a: 40d8 lw a4,4(s1) 8000386c: 8b3d andi a4,a4,15 8000386e: 071a slli a4,a4,0x6 80003870: 97ba add a5,a5,a4 + dip->type = ip->type; 80003872: 04449703 lh a4,68(s1) 80003876: 00e79023 sh a4,0(a5) + dip->major = ip->major; 8000387a: 04649703 lh a4,70(s1) 8000387e: 00e79123 sh a4,2(a5) + dip->minor = ip->minor; 80003882: 04849703 lh a4,72(s1) 80003886: 00e79223 sh a4,4(a5) + dip->nlink = ip->nlink; 8000388a: 04a49703 lh a4,74(s1) 8000388e: 00e79323 sh a4,6(a5) + dip->size = ip->size; 80003892: 44f8 lw a4,76(s1) 80003894: c798 sw a4,8(a5) + memmove(dip->addrs, ip->addrs, sizeof(ip->addrs)); 80003896: 03400613 li a2,52 8000389a: 05048593 addi a1,s1,80 8000389e: 00c78513 addi a0,a5,12 800038a2: f18fd0ef jal 80000fba <memmove> + log_write(bp); 800038a6: 854a mv a0,s2 800038a8: 269000ef jal 80004310 <log_write> + brelse(bp); 800038ac: 854a mv a0,s2 800038ae: 90dff0ef jal 800031ba <brelse> +} 800038b2: 60e2 ld ra,24(sp) 800038b4: 6442 ld s0,16(sp) 800038b6: 64a2 ld s1,8(sp) @@ -6346,21 +6563,26 @@ devintr() 800038bc: 8082 ret 00000000800038be <idup>: +{ 800038be: 1101 addi sp,sp,-32 800038c0: ec06 sd ra,24(sp) 800038c2: e822 sd s0,16(sp) 800038c4: e426 sd s1,8(sp) 800038c6: 1000 addi s0,sp,32 800038c8: 84aa mv s1,a0 + acquire(&itable.lock); 800038ca: 00047517 auipc a0,0x47 800038ce: 48650513 addi a0,a0,1158 # 8004ad50 <itable> 800038d2: db8fd0ef jal 80000e8a <acquire> + ip->ref++; 800038d6: 449c lw a5,8(s1) 800038d8: 2785 addiw a5,a5,1 800038da: c49c sw a5,8(s1) + release(&itable.lock); 800038dc: 00047517 auipc a0,0x47 800038e0: 47450513 addi a0,a0,1140 # 8004ad50 <itable> 800038e4: e3efd0ef jal 80000f22 <release> +} 800038e8: 8526 mv a0,s1 800038ea: 60e2 ld ra,24(sp) 800038ec: 6442 ld s0,16(sp) @@ -6369,29 +6591,36 @@ devintr() 800038f2: 8082 ret 00000000800038f4 <ilock>: +{ 800038f4: 1101 addi sp,sp,-32 800038f6: ec06 sd ra,24(sp) 800038f8: e822 sd s0,16(sp) 800038fa: e426 sd s1,8(sp) 800038fc: 1000 addi s0,sp,32 + if(ip == 0 || ip->ref < 1) 800038fe: cd19 beqz a0,8000391c <ilock+0x28> 80003900: 84aa mv s1,a0 80003902: 451c lw a5,8(a0) 80003904: 00f05c63 blez a5,8000391c <ilock+0x28> + acquiresleep(&ip->lock); 80003908: 0541 addi a0,a0,16 8000390a: 30d000ef jal 80004416 <acquiresleep> + if(ip->valid == 0){ 8000390e: 40bc lw a5,64(s1) 80003910: cf89 beqz a5,8000392a <ilock+0x36> +} 80003912: 60e2 ld ra,24(sp) 80003914: 6442 ld s0,16(sp) 80003916: 64a2 ld s1,8(sp) 80003918: 6105 addi sp,sp,32 8000391a: 8082 ret 8000391c: e04a sd s2,0(sp) + panic("ilock"); 8000391e: 00005517 auipc a0,0x5 80003922: 11250513 addi a0,a0,274 # 80008a30 <etext+0xa30> 80003926: e6ffc0ef jal 80000794 <panic> 8000392a: e04a sd s2,0(sp) + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); 8000392c: 40dc lw a5,4(s1) 8000392e: 0047d79b srliw a5,a5,0x4 80003932: 00047597 auipc a1,0x47 @@ -6400,44 +6629,57 @@ devintr() 8000393c: 4088 lw a0,0(s1) 8000393e: e6eff0ef jal 80002fac <bread> 80003942: 892a mv s2,a0 + dip = (struct dinode*)bp->data + ip->inum%IPB; 80003944: 05850593 addi a1,a0,88 80003948: 40dc lw a5,4(s1) 8000394a: 8bbd andi a5,a5,15 8000394c: 079a slli a5,a5,0x6 8000394e: 95be add a1,a1,a5 + ip->type = dip->type; 80003950: 00059783 lh a5,0(a1) 80003954: 04f49223 sh a5,68(s1) + ip->major = dip->major; 80003958: 00259783 lh a5,2(a1) 8000395c: 04f49323 sh a5,70(s1) + ip->minor = dip->minor; 80003960: 00459783 lh a5,4(a1) 80003964: 04f49423 sh a5,72(s1) + ip->nlink = dip->nlink; 80003968: 00659783 lh a5,6(a1) 8000396c: 04f49523 sh a5,74(s1) + ip->size = dip->size; 80003970: 459c lw a5,8(a1) 80003972: c4fc sw a5,76(s1) + memmove(ip->addrs, dip->addrs, sizeof(ip->addrs)); 80003974: 03400613 li a2,52 80003978: 05b1 addi a1,a1,12 8000397a: 05048513 addi a0,s1,80 8000397e: e3cfd0ef jal 80000fba <memmove> + brelse(bp); 80003982: 854a mv a0,s2 80003984: 837ff0ef jal 800031ba <brelse> + ip->valid = 1; 80003988: 4785 li a5,1 8000398a: c0bc sw a5,64(s1) + if(ip->type == 0) 8000398c: 04449783 lh a5,68(s1) 80003990: c399 beqz a5,80003996 <ilock+0xa2> 80003992: 6902 ld s2,0(sp) 80003994: bfbd j 80003912 <ilock+0x1e> + panic("ilock: no type"); 80003996: 00005517 auipc a0,0x5 8000399a: 0a250513 addi a0,a0,162 # 80008a38 <etext+0xa38> 8000399e: df7fc0ef jal 80000794 <panic> 00000000800039a2 <iunlock>: +{ 800039a2: 1101 addi sp,sp,-32 800039a4: ec06 sd ra,24(sp) 800039a6: e822 sd s0,16(sp) 800039a8: e426 sd s1,8(sp) 800039aa: e04a sd s2,0(sp) 800039ac: 1000 addi s0,sp,32 + if(ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) 800039ae: c505 beqz a0,800039d6 <iunlock+0x34> 800039b0: 84aa mv s1,a0 800039b2: 01050913 addi s2,a0,16 @@ -6446,19 +6688,28 @@ devintr() 800039bc: cd09 beqz a0,800039d6 <iunlock+0x34> 800039be: 449c lw a5,8(s1) 800039c0: 00f05b63 blez a5,800039d6 <iunlock+0x34> + releasesleep(&ip->lock); 800039c4: 854a mv a0,s2 800039c6: 297000ef jal 8000445c <releasesleep> +} 800039ca: 60e2 ld ra,24(sp) 800039cc: 6442 ld s0,16(sp) 800039ce: 64a2 ld s1,8(sp) 800039d0: 6902 ld s2,0(sp) 800039d2: 6105 addi sp,sp,32 800039d4: 8082 ret + panic("iunlock"); 800039d6: 00005517 auipc a0,0x5 800039da: 07250513 addi a0,a0,114 # 80008a48 <etext+0xa48> 800039de: db7fc0ef jal 80000794 <panic> 00000000800039e2 <itrunc>: + +// Truncate inode (discard contents). +// Caller must hold ip->lock. +void +itrunc(struct inode *ip) +{ 800039e2: 7179 addi sp,sp,-48 800039e4: f406 sd ra,40(sp) 800039e6: f022 sd s0,32(sp) @@ -6467,22 +6718,42 @@ devintr() 800039ec: e44e sd s3,8(sp) 800039ee: 1800 addi s0,sp,48 800039f0: 89aa mv s3,a0 + int i, j; + struct buf *bp; + uint *a; + + for(i = 0; i < NDIRECT; i++){ 800039f2: 05050493 addi s1,a0,80 800039f6: 07c50913 addi s2,a0,124 800039fa: a021 j 80003a02 <itrunc+0x20> 800039fc: 0491 addi s1,s1,4 800039fe: 01248b63 beq s1,s2,80003a14 <itrunc+0x32> + if(ip->addrs[i]){ 80003a02: 408c lw a1,0(s1) 80003a04: dde5 beqz a1,800039fc <itrunc+0x1a> + bfree(ip->dev, ip->addrs[i]); 80003a06: 0009a503 lw a0,0(s3) 80003a0a: 8fbff0ef jal 80003304 <bfree> + ip->addrs[i] = 0; 80003a0e: 0004a023 sw zero,0(s1) 80003a12: b7ed j 800039fc <itrunc+0x1a> + } + } + + if(ip->addrs[NDIRECT]){ 80003a14: 07c9a583 lw a1,124(s3) 80003a18: ed89 bnez a1,80003a32 <itrunc+0x50> + brelse(bp); + bfree(ip->dev, ip->addrs[NDIRECT]); + ip->addrs[NDIRECT] = 0; + } + + ip->size = 0; 80003a1a: 0409a623 sw zero,76(s3) + iupdate(ip); 80003a1e: 854e mv a0,s3 80003a20: e21ff0ef jal 80003840 <iupdate> +} 80003a24: 70a2 ld ra,40(sp) 80003a26: 7402 ld s0,32(sp) 80003a28: 64e2 ld s1,24(sp) @@ -6491,71 +6762,93 @@ devintr() 80003a2e: 6145 addi sp,sp,48 80003a30: 8082 ret 80003a32: e052 sd s4,0(sp) + bp = bread(ip->dev, ip->addrs[NDIRECT]); 80003a34: 0009a503 lw a0,0(s3) 80003a38: d74ff0ef jal 80002fac <bread> 80003a3c: 8a2a mv s4,a0 + for(j = 0; j < NINDIRECT; j++){ 80003a3e: 05850493 addi s1,a0,88 80003a42: 45850913 addi s2,a0,1112 80003a46: a021 j 80003a4e <itrunc+0x6c> 80003a48: 0491 addi s1,s1,4 80003a4a: 01248963 beq s1,s2,80003a5c <itrunc+0x7a> + if(a[j]) 80003a4e: 408c lw a1,0(s1) 80003a50: dde5 beqz a1,80003a48 <itrunc+0x66> + bfree(ip->dev, a[j]); 80003a52: 0009a503 lw a0,0(s3) 80003a56: 8afff0ef jal 80003304 <bfree> 80003a5a: b7fd j 80003a48 <itrunc+0x66> + brelse(bp); 80003a5c: 8552 mv a0,s4 80003a5e: f5cff0ef jal 800031ba <brelse> + bfree(ip->dev, ip->addrs[NDIRECT]); 80003a62: 07c9a583 lw a1,124(s3) 80003a66: 0009a503 lw a0,0(s3) 80003a6a: 89bff0ef jal 80003304 <bfree> + ip->addrs[NDIRECT] = 0; 80003a6e: 0609ae23 sw zero,124(s3) 80003a72: 6a02 ld s4,0(sp) 80003a74: b75d j 80003a1a <itrunc+0x38> 0000000080003a76 <iput>: +{ 80003a76: 1101 addi sp,sp,-32 80003a78: ec06 sd ra,24(sp) 80003a7a: e822 sd s0,16(sp) 80003a7c: e426 sd s1,8(sp) 80003a7e: 1000 addi s0,sp,32 80003a80: 84aa mv s1,a0 + acquire(&itable.lock); 80003a82: 00047517 auipc a0,0x47 80003a86: 2ce50513 addi a0,a0,718 # 8004ad50 <itable> 80003a8a: c00fd0ef jal 80000e8a <acquire> + if(ip->ref == 1 && ip->valid && ip->nlink == 0){ 80003a8e: 4498 lw a4,8(s1) 80003a90: 4785 li a5,1 80003a92: 02f70063 beq a4,a5,80003ab2 <iput+0x3c> + ip->ref--; 80003a96: 449c lw a5,8(s1) 80003a98: 37fd addiw a5,a5,-1 80003a9a: c49c sw a5,8(s1) + release(&itable.lock); 80003a9c: 00047517 auipc a0,0x47 80003aa0: 2b450513 addi a0,a0,692 # 8004ad50 <itable> 80003aa4: c7efd0ef jal 80000f22 <release> +} 80003aa8: 60e2 ld ra,24(sp) 80003aaa: 6442 ld s0,16(sp) 80003aac: 64a2 ld s1,8(sp) 80003aae: 6105 addi sp,sp,32 80003ab0: 8082 ret + if(ip->ref == 1 && ip->valid && ip->nlink == 0){ 80003ab2: 40bc lw a5,64(s1) 80003ab4: d3ed beqz a5,80003a96 <iput+0x20> 80003ab6: 04a49783 lh a5,74(s1) 80003aba: fff1 bnez a5,80003a96 <iput+0x20> 80003abc: e04a sd s2,0(sp) + acquiresleep(&ip->lock); 80003abe: 01048913 addi s2,s1,16 80003ac2: 854a mv a0,s2 80003ac4: 153000ef jal 80004416 <acquiresleep> + release(&itable.lock); 80003ac8: 00047517 auipc a0,0x47 80003acc: 28850513 addi a0,a0,648 # 8004ad50 <itable> 80003ad0: c52fd0ef jal 80000f22 <release> + itrunc(ip); 80003ad4: 8526 mv a0,s1 80003ad6: f0dff0ef jal 800039e2 <itrunc> + ip->type = 0; 80003ada: 04049223 sh zero,68(s1) + iupdate(ip); 80003ade: 8526 mv a0,s1 80003ae0: d61ff0ef jal 80003840 <iupdate> + ip->valid = 0; 80003ae4: 0404a023 sw zero,64(s1) + releasesleep(&ip->lock); 80003ae8: 854a mv a0,s2 80003aea: 173000ef jal 8000445c <releasesleep> + acquire(&itable.lock); 80003aee: 00047517 auipc a0,0x47 80003af2: 26250513 addi a0,a0,610 # 8004ad50 <itable> 80003af6: b94fd0ef jal 80000e8a <acquire> @@ -6563,15 +6856,19 @@ devintr() 80003afc: bf69 j 80003a96 <iput+0x20> 0000000080003afe <iunlockput>: +{ 80003afe: 1101 addi sp,sp,-32 80003b00: ec06 sd ra,24(sp) 80003b02: e822 sd s0,16(sp) 80003b04: e426 sd s1,8(sp) 80003b06: 1000 addi s0,sp,32 80003b08: 84aa mv s1,a0 + iunlock(ip); 80003b0a: e99ff0ef jal 800039a2 <iunlock> + iput(ip); 80003b0e: 8526 mv a0,s1 80003b10: f67ff0ef jal 80003a76 <iput> +} 80003b14: 60e2 ld ra,24(sp) 80003b16: 6442 ld s0,16(sp) 80003b18: 64a2 ld s1,8(sp) @@ -6579,26 +6876,45 @@ devintr() 80003b1c: 8082 ret 0000000080003b1e <stati>: + +// Copy stat information from inode. +// Caller must hold ip->lock. +void +stati(struct inode *ip, struct stat *st) +{ 80003b1e: 1141 addi sp,sp,-16 80003b20: e422 sd s0,8(sp) 80003b22: 0800 addi s0,sp,16 + st->dev = ip->dev; 80003b24: 411c lw a5,0(a0) 80003b26: c19c sw a5,0(a1) + st->ino = ip->inum; 80003b28: 415c lw a5,4(a0) 80003b2a: c1dc sw a5,4(a1) + st->type = ip->type; 80003b2c: 04451783 lh a5,68(a0) 80003b30: 00f59423 sh a5,8(a1) + st->nlink = ip->nlink; 80003b34: 04a51783 lh a5,74(a0) 80003b38: 00f59523 sh a5,10(a1) + st->size = ip->size; 80003b3c: 04c56783 lwu a5,76(a0) 80003b40: e99c sd a5,16(a1) +} 80003b42: 6422 ld s0,8(sp) 80003b44: 0141 addi sp,sp,16 80003b46: 8082 ret 0000000080003b48 <readi>: +readi(struct inode *ip, int user_dst, uint64 dst, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) 80003b48: 457c lw a5,76(a0) 80003b4a: 0ed7eb63 bltu a5,a3,80003c40 <readi+0xf8> +{ 80003b4e: 7159 addi sp,sp,-112 80003b50: f486 sd ra,104(sp) 80003b52: f0a2 sd s0,96(sp) @@ -6613,12 +6929,19 @@ devintr() 80003b64: 8a32 mv s4,a2 80003b66: 84b6 mv s1,a3 80003b68: 8aba mv s5,a4 + if(off > ip->size || off + n < off) 80003b6a: 9f35 addw a4,a4,a3 + return 0; 80003b6c: 4501 li a0,0 + if(off > ip->size || off + n < off) 80003b6e: 0cd76063 bltu a4,a3,80003c2e <readi+0xe6> 80003b72: e4ce sd s3,72(sp) + if(off + n > ip->size) 80003b74: 00e7f463 bgeu a5,a4,80003b7c <readi+0x34> + n = ip->size - off; 80003b78: 40d78abb subw s5,a5,a3 + + for(tot=0; tot<n; tot+=m, off+=m, dst+=m){ 80003b7c: 080a8f63 beqz s5,80003c1a <readi+0xd2> 80003b80: e8ca sd s2,80(sp) 80003b82: f062 sd s8,32(sp) @@ -6626,7 +6949,13 @@ devintr() 80003b86: e86a sd s10,16(sp) 80003b88: e46e sd s11,8(sp) 80003b8a: 4981 li s3,0 + uint addr = bmap(ip, off/BSIZE); + if(addr == 0) + break; + bp = bread(ip->dev, addr); + m = min(n - tot, BSIZE - off%BSIZE); 80003b8c: 40000c93 li s9,1024 + if(either_copyout(user_dst, dst, bp->data + (off % BSIZE), m) == -1) { 80003b90: 5c7d li s8,-1 80003b92: a80d j 80003bc4 <readi+0x7c> 80003b94: 020d1d93 slli s11,s10,0x20 @@ -6638,20 +6967,30 @@ devintr() 80003ba6: 855e mv a0,s7 80003ba8: ac1fe0ef jal 80002668 <either_copyout> 80003bac: 05850763 beq a0,s8,80003bfa <readi+0xb2> + brelse(bp); + tot = -1; + break; + } + brelse(bp); 80003bb0: 854a mv a0,s2 80003bb2: e08ff0ef jal 800031ba <brelse> + for(tot=0; tot<n; tot+=m, off+=m, dst+=m){ 80003bb6: 013d09bb addw s3,s10,s3 80003bba: 009d04bb addw s1,s10,s1 80003bbe: 9a6e add s4,s4,s11 80003bc0: 0559f763 bgeu s3,s5,80003c0e <readi+0xc6> + uint addr = bmap(ip, off/BSIZE); 80003bc4: 00a4d59b srliw a1,s1,0xa 80003bc8: 855a mv a0,s6 80003bca: 8c7ff0ef jal 80003490 <bmap> 80003bce: 0005059b sext.w a1,a0 + if(addr == 0) 80003bd2: c5b1 beqz a1,80003c1e <readi+0xd6> + bp = bread(ip->dev, addr); 80003bd4: 000b2503 lw a0,0(s6) 80003bd8: bd4ff0ef jal 80002fac <bread> 80003bdc: 892a mv s2,a0 + m = min(n - tot, BSIZE - off%BSIZE); 80003bde: 3ff4f713 andi a4,s1,1023 80003be2: 40ec87bb subw a5,s9,a4 80003be6: 413a86bb subw a3,s5,s3 @@ -6661,9 +7000,12 @@ devintr() 80003bf2: faf671e3 bgeu a2,a5,80003b94 <readi+0x4c> 80003bf6: 8d36 mv s10,a3 80003bf8: bf71 j 80003b94 <readi+0x4c> + brelse(bp); 80003bfa: 854a mv a0,s2 80003bfc: dbeff0ef jal 800031ba <brelse> + tot = -1; 80003c00: 59fd li s3,-1 + break; 80003c02: 6946 ld s2,80(sp) 80003c04: 7c02 ld s8,32(sp) 80003c06: 6ce2 ld s9,24(sp) @@ -6676,6 +7018,7 @@ devintr() 80003c14: 6d42 ld s10,16(sp) 80003c16: 6da2 ld s11,8(sp) 80003c18: a801 j 80003c28 <readi+0xe0> + for(tot=0; tot<n; tot+=m, off+=m, dst+=m){ 80003c1a: 89d6 mv s3,s5 80003c1c: a031 j 80003c28 <readi+0xe0> 80003c1e: 6946 ld s2,80(sp) @@ -6683,8 +7026,11 @@ devintr() 80003c22: 6ce2 ld s9,24(sp) 80003c24: 6d42 ld s10,16(sp) 80003c26: 6da2 ld s11,8(sp) + } + return tot; 80003c28: 0009851b sext.w a0,s3 80003c2c: 69a6 ld s3,72(sp) +} 80003c2e: 70a6 ld ra,104(sp) 80003c30: 7406 ld s0,96(sp) 80003c32: 64e6 ld s1,88(sp) @@ -6694,12 +7040,21 @@ devintr() 80003c3a: 7ba2 ld s7,40(sp) 80003c3c: 6165 addi sp,sp,112 80003c3e: 8082 ret + return 0; 80003c40: 4501 li a0,0 +} 80003c42: 8082 ret 0000000080003c44 <writei>: +writei(struct inode *ip, int user_src, uint64 src, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) 80003c44: 457c lw a5,76(a0) 80003c46: 10d7e163 bltu a5,a3,80003d48 <writei+0x104> +{ 80003c4a: 7159 addi sp,sp,-112 80003c4c: f486 sd ra,104(sp) 80003c4e: f0a2 sd s0,96(sp) @@ -6714,12 +7069,18 @@ devintr() 80003c60: 8a32 mv s4,a2 80003c62: 8936 mv s2,a3 80003c64: 8b3a mv s6,a4 + if(off > ip->size || off + n < off) 80003c66: 9f35 addw a4,a4,a3 80003c68: 0ed76263 bltu a4,a3,80003d4c <writei+0x108> + return -1; + if(off + n > MAXFILE*BSIZE) 80003c6c: 040437b7 lui a5,0x4043 80003c70: c0078793 addi a5,a5,-1024 # 4042c00 <_entry-0x7bfbd400> 80003c74: 0ce7ee63 bltu a5,a4,80003d50 <writei+0x10c> 80003c78: e4ce sd s3,72(sp) + return -1; + + for(tot=0; tot<n; tot+=m, off+=m, src+=m){ 80003c7a: 0a0b0f63 beqz s6,80003d38 <writei+0xf4> 80003c7e: eca6 sd s1,88(sp) 80003c80: f062 sd s8,32(sp) @@ -6727,7 +7088,13 @@ devintr() 80003c84: e86a sd s10,16(sp) 80003c86: e46e sd s11,8(sp) 80003c88: 4981 li s3,0 + uint addr = bmap(ip, off/BSIZE); + if(addr == 0) + break; + bp = bread(ip->dev, addr); + m = min(n - tot, BSIZE - off%BSIZE); 80003c8a: 40000c93 li s9,1024 + if(either_copyin(bp->data + (off % BSIZE), user_src, src, m) == -1) { 80003c8e: 5c7d li s8,-1 80003c90: a825 j 80003cc8 <writei+0x84> 80003c92: 020d1d93 slli s11,s10,0x20 @@ -6739,22 +7106,32 @@ devintr() 80003ca4: 953a add a0,a0,a4 80003ca6: a0dfe0ef jal 800026b2 <either_copyin> 80003caa: 05850a63 beq a0,s8,80003cfe <writei+0xba> + brelse(bp); + break; + } + log_write(bp); 80003cae: 8526 mv a0,s1 80003cb0: 660000ef jal 80004310 <log_write> + brelse(bp); 80003cb4: 8526 mv a0,s1 80003cb6: d04ff0ef jal 800031ba <brelse> + for(tot=0; tot<n; tot+=m, off+=m, src+=m){ 80003cba: 013d09bb addw s3,s10,s3 80003cbe: 012d093b addw s2,s10,s2 80003cc2: 9a6e add s4,s4,s11 80003cc4: 0569f063 bgeu s3,s6,80003d04 <writei+0xc0> + uint addr = bmap(ip, off/BSIZE); 80003cc8: 00a9559b srliw a1,s2,0xa 80003ccc: 8556 mv a0,s5 80003cce: fc2ff0ef jal 80003490 <bmap> 80003cd2: 0005059b sext.w a1,a0 + if(addr == 0) 80003cd6: c59d beqz a1,80003d04 <writei+0xc0> + bp = bread(ip->dev, addr); 80003cd8: 000aa503 lw a0,0(s5) 80003cdc: ad0ff0ef jal 80002fac <bread> 80003ce0: 84aa mv s1,a0 + m = min(n - tot, BSIZE - off%BSIZE); 80003ce2: 3ff97713 andi a4,s2,1023 80003ce6: 40ec87bb subw a5,s9,a4 80003cea: 413b06bb subw a3,s6,s3 @@ -6764,20 +7141,33 @@ devintr() 80003cf6: f8f67ee3 bgeu a2,a5,80003c92 <writei+0x4e> 80003cfa: 8d36 mv s10,a3 80003cfc: bf59 j 80003c92 <writei+0x4e> + brelse(bp); 80003cfe: 8526 mv a0,s1 80003d00: cbaff0ef jal 800031ba <brelse> + } + + if(off > ip->size) 80003d04: 04caa783 lw a5,76(s5) 80003d08: 0327fa63 bgeu a5,s2,80003d3c <writei+0xf8> + ip->size = off; 80003d0c: 052aa623 sw s2,76(s5) 80003d10: 64e6 ld s1,88(sp) 80003d12: 7c02 ld s8,32(sp) 80003d14: 6ce2 ld s9,24(sp) 80003d16: 6d42 ld s10,16(sp) 80003d18: 6da2 ld s11,8(sp) + + // write the i-node back to disk even if the size didn't change + // because the loop above might have called bmap() and added a new + // block to ip->addrs[]. + iupdate(ip); 80003d1a: 8556 mv a0,s5 80003d1c: b25ff0ef jal 80003840 <iupdate> + + return tot; 80003d20: 0009851b sext.w a0,s3 80003d24: 69a6 ld s3,72(sp) +} 80003d26: 70a6 ld ra,104(sp) 80003d28: 7406 ld s0,96(sp) 80003d2a: 6946 ld s2,80(sp) @@ -6787,6 +7177,7 @@ devintr() 80003d32: 7ba2 ld s7,40(sp) 80003d34: 6165 addi sp,sp,112 80003d36: 8082 ret + for(tot=0; tot<n; tot+=m, off+=m, src+=m){ 80003d38: 89da mv s3,s6 80003d3a: b7c5 j 80003d1a <writei+0xd6> 80003d3c: 64e6 ld s1,88(sp) @@ -6795,26 +7186,44 @@ devintr() 80003d42: 6d42 ld s10,16(sp) 80003d44: 6da2 ld s11,8(sp) 80003d46: bfd1 j 80003d1a <writei+0xd6> + return -1; 80003d48: 557d li a0,-1 +} 80003d4a: 8082 ret + return -1; 80003d4c: 557d li a0,-1 80003d4e: bfe1 j 80003d26 <writei+0xe2> + return -1; 80003d50: 557d li a0,-1 80003d52: bfd1 j 80003d26 <writei+0xe2> 0000000080003d54 <namecmp>: + +// Directories + +int +namecmp(const char *s, const char *t) +{ 80003d54: 1141 addi sp,sp,-16 80003d56: e406 sd ra,8(sp) 80003d58: e022 sd s0,0(sp) 80003d5a: 0800 addi s0,sp,16 + return strncmp(s, t, DIRSIZ); 80003d5c: 4639 li a2,14 80003d5e: accfd0ef jal 8000102a <strncmp> +} 80003d62: 60a2 ld ra,8(sp) 80003d64: 6402 ld s0,0(sp) 80003d66: 0141 addi sp,sp,16 80003d68: 8082 ret 0000000080003d6a <dirlookup>: + +// Look for a directory entry in a directory. +// If found, set *poff to byte offset of entry. +struct inode* +dirlookup(struct inode *dp, char *name, uint *poff) +{ 80003d6a: 7139 addi sp,sp,-64 80003d6c: fc06 sd ra,56(sp) 80003d6e: f822 sd s0,48(sp) @@ -6823,26 +7232,44 @@ devintr() 80003d74: ec4e sd s3,24(sp) 80003d76: e852 sd s4,16(sp) 80003d78: 0080 addi s0,sp,64 + uint off, inum; + struct dirent de; + + if(dp->type != T_DIR) 80003d7a: 04451703 lh a4,68(a0) 80003d7e: 4785 li a5,1 80003d80: 00f71a63 bne a4,a5,80003d94 <dirlookup+0x2a> 80003d84: 892a mv s2,a0 80003d86: 89ae mv s3,a1 80003d88: 8a32 mv s4,a2 + panic("dirlookup not DIR"); + + for(off = 0; off < dp->size; off += sizeof(de)){ 80003d8a: 457c lw a5,76(a0) 80003d8c: 4481 li s1,0 + inum = de.inum; + return iget(dp->dev, inum); + } + } + + return 0; 80003d8e: 4501 li a0,0 + for(off = 0; off < dp->size; off += sizeof(de)){ 80003d90: e39d bnez a5,80003db6 <dirlookup+0x4c> 80003d92: a095 j 80003df6 <dirlookup+0x8c> + panic("dirlookup not DIR"); 80003d94: 00005517 auipc a0,0x5 80003d98: cbc50513 addi a0,a0,-836 # 80008a50 <etext+0xa50> 80003d9c: 9f9fc0ef jal 80000794 <panic> + panic("dirlookup read"); 80003da0: 00005517 auipc a0,0x5 80003da4: cc850513 addi a0,a0,-824 # 80008a68 <etext+0xa68> 80003da8: 9edfc0ef jal 80000794 <panic> + for(off = 0; off < dp->size; off += sizeof(de)){ 80003dac: 24c1 addiw s1,s1,16 80003dae: 04c92783 lw a5,76(s2) 80003db2: 04f4f163 bgeu s1,a5,80003df4 <dirlookup+0x8a> + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) 80003db6: 4741 li a4,16 80003db8: 86a6 mv a3,s1 80003dba: fc040613 addi a2,s0,-64 @@ -6851,19 +7278,26 @@ devintr() 80003dc2: d87ff0ef jal 80003b48 <readi> 80003dc6: 47c1 li a5,16 80003dc8: fcf51ce3 bne a0,a5,80003da0 <dirlookup+0x36> + if(de.inum == 0) 80003dcc: fc045783 lhu a5,-64(s0) 80003dd0: dff1 beqz a5,80003dac <dirlookup+0x42> + if(namecmp(name, de.name) == 0){ 80003dd2: fc240593 addi a1,s0,-62 80003dd6: 854e mv a0,s3 80003dd8: f7dff0ef jal 80003d54 <namecmp> 80003ddc: f961 bnez a0,80003dac <dirlookup+0x42> + if(poff) 80003dde: 000a0463 beqz s4,80003de6 <dirlookup+0x7c> + *poff = off; 80003de2: 009a2023 sw s1,0(s4) + return iget(dp->dev, inum); 80003de6: fc045583 lhu a1,-64(s0) 80003dea: 00092503 lw a0,0(s2) 80003dee: 827ff0ef jal 80003614 <iget> 80003df2: a011 j 80003df6 <dirlookup+0x8c> + return 0; 80003df4: 4501 li a0,0 +} 80003df6: 70e2 ld ra,56(sp) 80003df8: 7442 ld s0,48(sp) 80003dfa: 74a2 ld s1,40(sp) @@ -6874,6 +7308,12 @@ devintr() 80003e04: 8082 ret 0000000080003e06 <namex>: +// If parent != 0, return the inode for the parent and copy the final +// path element into name, which must have room for DIRSIZ bytes. +// Must be called inside a transaction since it calls iput(). +static struct inode* +namex(char *path, int nameiparent, char *name) +{ 80003e06: 711d addi sp,sp,-96 80003e08: ec86 sd ra,88(sp) 80003e0a: e8a2 sd s0,80(sp) @@ -6890,25 +7330,46 @@ devintr() 80003e20: 84aa mv s1,a0 80003e22: 8b2e mv s6,a1 80003e24: 8ab2 mv s5,a2 + struct inode *ip, *next; + + if(*path == '/') 80003e26: 00054703 lbu a4,0(a0) 80003e2a: 02f00793 li a5,47 80003e2e: 00f70e63 beq a4,a5,80003e4a <namex+0x44> + ip = iget(ROOTDEV, ROOTINO); + else + ip = idup(myproc()->cwd); 80003e32: e8bfd0ef jal 80001cbc <myproc> 80003e36: 15853503 ld a0,344(a0) 80003e3a: a85ff0ef jal 800038be <idup> 80003e3e: 8a2a mv s4,a0 + while(*path == '/') 80003e40: 02f00913 li s2,47 + if(len >= DIRSIZ) 80003e44: 4c35 li s8,13 + + while((path = skipelem(path, name)) != 0){ + ilock(ip); + if(ip->type != T_DIR){ 80003e46: 4b85 li s7,1 80003e48: a871 j 80003ee4 <namex+0xde> + ip = iget(ROOTDEV, ROOTINO); 80003e4a: 4585 li a1,1 80003e4c: 4505 li a0,1 80003e4e: fc6ff0ef jal 80003614 <iget> 80003e52: 8a2a mv s4,a0 80003e54: b7f5 j 80003e40 <namex+0x3a> + iunlockput(ip); 80003e56: 8552 mv a0,s4 80003e58: ca7ff0ef jal 80003afe <iunlockput> + return 0; 80003e5c: 4a01 li s4,0 + if(nameiparent){ + iput(ip); + return 0; + } + return ip; +} 80003e5e: 8552 mv a0,s4 80003e60: 60e6 ld ra,88(sp) 80003e62: 6446 ld s0,80(sp) @@ -6923,73 +7384,104 @@ devintr() 80003e74: 6ca2 ld s9,8(sp) 80003e76: 6125 addi sp,sp,96 80003e78: 8082 ret + iunlock(ip); 80003e7a: 8552 mv a0,s4 80003e7c: b27ff0ef jal 800039a2 <iunlock> + return ip; 80003e80: bff9 j 80003e5e <namex+0x58> + iunlockput(ip); 80003e82: 8552 mv a0,s4 80003e84: c7bff0ef jal 80003afe <iunlockput> + return 0; 80003e88: 8a4e mv s4,s3 80003e8a: bfd1 j 80003e5e <namex+0x58> + len = path - s; 80003e8c: 40998633 sub a2,s3,s1 80003e90: 00060c9b sext.w s9,a2 + if(len >= DIRSIZ) 80003e94: 099c5063 bge s8,s9,80003f14 <namex+0x10e> + memmove(name, s, DIRSIZ); 80003e98: 4639 li a2,14 80003e9a: 85a6 mv a1,s1 80003e9c: 8556 mv a0,s5 80003e9e: 91cfd0ef jal 80000fba <memmove> 80003ea2: 84ce mv s1,s3 + while(*path == '/') 80003ea4: 0004c783 lbu a5,0(s1) 80003ea8: 01279763 bne a5,s2,80003eb6 <namex+0xb0> + path++; 80003eac: 0485 addi s1,s1,1 + while(*path == '/') 80003eae: 0004c783 lbu a5,0(s1) 80003eb2: ff278de3 beq a5,s2,80003eac <namex+0xa6> + ilock(ip); 80003eb6: 8552 mv a0,s4 80003eb8: a3dff0ef jal 800038f4 <ilock> + if(ip->type != T_DIR){ 80003ebc: 044a1783 lh a5,68(s4) 80003ec0: f9779be3 bne a5,s7,80003e56 <namex+0x50> + if(nameiparent && *path == '\0'){ 80003ec4: 000b0563 beqz s6,80003ece <namex+0xc8> 80003ec8: 0004c783 lbu a5,0(s1) 80003ecc: d7dd beqz a5,80003e7a <namex+0x74> + if((next = dirlookup(ip, name, 0)) == 0){ 80003ece: 4601 li a2,0 80003ed0: 85d6 mv a1,s5 80003ed2: 8552 mv a0,s4 80003ed4: e97ff0ef jal 80003d6a <dirlookup> 80003ed8: 89aa mv s3,a0 80003eda: d545 beqz a0,80003e82 <namex+0x7c> + iunlockput(ip); 80003edc: 8552 mv a0,s4 80003ede: c21ff0ef jal 80003afe <iunlockput> + ip = next; 80003ee2: 8a4e mv s4,s3 + while(*path == '/') 80003ee4: 0004c783 lbu a5,0(s1) 80003ee8: 01279763 bne a5,s2,80003ef6 <namex+0xf0> + path++; 80003eec: 0485 addi s1,s1,1 + while(*path == '/') 80003eee: 0004c783 lbu a5,0(s1) 80003ef2: ff278de3 beq a5,s2,80003eec <namex+0xe6> + if(*path == 0) 80003ef6: cb8d beqz a5,80003f28 <namex+0x122> + while(*path != '/' && *path != 0) 80003ef8: 0004c783 lbu a5,0(s1) 80003efc: 89a6 mv s3,s1 + len = path - s; 80003efe: 4c81 li s9,0 80003f00: 4601 li a2,0 + while(*path != '/' && *path != 0) 80003f02: 01278963 beq a5,s2,80003f14 <namex+0x10e> 80003f06: d3d9 beqz a5,80003e8c <namex+0x86> + path++; 80003f08: 0985 addi s3,s3,1 + while(*path != '/' && *path != 0) 80003f0a: 0009c783 lbu a5,0(s3) 80003f0e: ff279ce3 bne a5,s2,80003f06 <namex+0x100> 80003f12: bfad j 80003e8c <namex+0x86> + memmove(name, s, len); 80003f14: 2601 sext.w a2,a2 80003f16: 85a6 mv a1,s1 80003f18: 8556 mv a0,s5 80003f1a: 8a0fd0ef jal 80000fba <memmove> + name[len] = 0; 80003f1e: 9cd6 add s9,s9,s5 80003f20: 000c8023 sb zero,0(s9) # 2000 <_entry-0x7fffe000> 80003f24: 84ce mv s1,s3 80003f26: bfbd j 80003ea4 <namex+0x9e> + if(nameiparent){ 80003f28: f20b0be3 beqz s6,80003e5e <namex+0x58> + iput(ip); 80003f2c: 8552 mv a0,s4 80003f2e: b49ff0ef jal 80003a76 <iput> + return 0; 80003f32: 4a01 li s4,0 80003f34: b72d j 80003e5e <namex+0x58> 0000000080003f36 <dirlink>: +{ 80003f36: 7139 addi sp,sp,-64 80003f38: fc06 sd ra,56(sp) 80003f3a: f822 sd s0,48(sp) @@ -7000,13 +7492,16 @@ devintr() 80003f44: 892a mv s2,a0 80003f46: 8a2e mv s4,a1 80003f48: 89b2 mv s3,a2 + if((ip = dirlookup(dp, name, 0)) != 0){ 80003f4a: 4601 li a2,0 80003f4c: e1fff0ef jal 80003d6a <dirlookup> 80003f50: e535 bnez a0,80003fbc <dirlink+0x86> 80003f52: f426 sd s1,40(sp) + for(off = 0; off < dp->size; off += sizeof(de)){ 80003f54: 04c92483 lw s1,76(s2) 80003f58: c48d beqz s1,80003f82 <dirlink+0x4c> 80003f5a: 4481 li s1,0 + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) 80003f5c: 4741 li a4,16 80003f5e: 86a6 mv a3,s1 80003f60: fc040613 addi a2,s0,-64 @@ -7015,16 +7510,21 @@ devintr() 80003f68: be1ff0ef jal 80003b48 <readi> 80003f6c: 47c1 li a5,16 80003f6e: 04f51b63 bne a0,a5,80003fc4 <dirlink+0x8e> + if(de.inum == 0) 80003f72: fc045783 lhu a5,-64(s0) 80003f76: c791 beqz a5,80003f82 <dirlink+0x4c> + for(off = 0; off < dp->size; off += sizeof(de)){ 80003f78: 24c1 addiw s1,s1,16 80003f7a: 04c92783 lw a5,76(s2) 80003f7e: fcf4efe3 bltu s1,a5,80003f5c <dirlink+0x26> + strncpy(de.name, name, DIRSIZ); 80003f82: 4639 li a2,14 80003f84: 85d2 mv a1,s4 80003f86: fc240513 addi a0,s0,-62 80003f8a: 8d6fd0ef jal 80001060 <strncpy> + de.inum = inum; 80003f8e: fd341023 sh s3,-64(s0) + if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) 80003f92: 4741 li a4,16 80003f94: 86a6 mv a3,s1 80003f96: fc040613 addi a2,s0,-64 @@ -7035,6 +7535,7 @@ devintr() 80003fa4: 00a03533 snez a0,a0 80003fa8: 40a00533 neg a0,a0 80003fac: 74a2 ld s1,40(sp) +} 80003fae: 70e2 ld ra,56(sp) 80003fb0: 7442 ld s0,48(sp) 80003fb2: 7902 ld s2,32(sp) @@ -7042,69 +7543,102 @@ devintr() 80003fb6: 6a42 ld s4,16(sp) 80003fb8: 6121 addi sp,sp,64 80003fba: 8082 ret + iput(ip); 80003fbc: abbff0ef jal 80003a76 <iput> + return -1; 80003fc0: 557d li a0,-1 80003fc2: b7f5 j 80003fae <dirlink+0x78> + panic("dirlink read"); 80003fc4: 00005517 auipc a0,0x5 80003fc8: ab450513 addi a0,a0,-1356 # 80008a78 <etext+0xa78> 80003fcc: fc8fc0ef jal 80000794 <panic> 0000000080003fd0 <namei>: + +struct inode* +namei(char *path) +{ 80003fd0: 1101 addi sp,sp,-32 80003fd2: ec06 sd ra,24(sp) 80003fd4: e822 sd s0,16(sp) 80003fd6: 1000 addi s0,sp,32 + char name[DIRSIZ]; + return namex(path, 0, name); 80003fd8: fe040613 addi a2,s0,-32 80003fdc: 4581 li a1,0 80003fde: e29ff0ef jal 80003e06 <namex> +} 80003fe2: 60e2 ld ra,24(sp) 80003fe4: 6442 ld s0,16(sp) 80003fe6: 6105 addi sp,sp,32 80003fe8: 8082 ret 0000000080003fea <nameiparent>: + +struct inode* +nameiparent(char *path, char *name) +{ 80003fea: 1141 addi sp,sp,-16 80003fec: e406 sd ra,8(sp) 80003fee: e022 sd s0,0(sp) 80003ff0: 0800 addi s0,sp,16 80003ff2: 862e mv a2,a1 + return namex(path, 1, name); 80003ff4: 4585 li a1,1 80003ff6: e11ff0ef jal 80003e06 <namex> +} 80003ffa: 60a2 ld ra,8(sp) 80003ffc: 6402 ld s0,0(sp) 80003ffe: 0141 addi sp,sp,16 80004000: 8082 ret 0000000080004002 <write_head>: +// Write in-memory log header to disk. +// This is the true point at which the +// current transaction commits. +static void +write_head(void) +{ 80004002: 1101 addi sp,sp,-32 80004004: ec06 sd ra,24(sp) 80004006: e822 sd s0,16(sp) 80004008: e426 sd s1,8(sp) 8000400a: e04a sd s2,0(sp) 8000400c: 1000 addi s0,sp,32 + struct buf *buf = bread(log.dev, log.start); 8000400e: 00048917 auipc s2,0x48 80004012: 7ea90913 addi s2,s2,2026 # 8004c7f8 <log> 80004016: 01892583 lw a1,24(s2) 8000401a: 02892503 lw a0,40(s2) 8000401e: f8ffe0ef jal 80002fac <bread> 80004022: 84aa mv s1,a0 + struct logheader *hb = (struct logheader *) (buf->data); + int i; + hb->n = log.lh.n; 80004024: 02c92603 lw a2,44(s2) 80004028: cd30 sw a2,88(a0) + for (i = 0; i < log.lh.n; i++) { 8000402a: 00c05f63 blez a2,80004048 <write_head+0x46> 8000402e: 00048717 auipc a4,0x48 80004032: 7fa70713 addi a4,a4,2042 # 8004c828 <log+0x30> 80004036: 87aa mv a5,a0 80004038: 060a slli a2,a2,0x2 8000403a: 962a add a2,a2,a0 + hb->block[i] = log.lh.block[i]; 8000403c: 4314 lw a3,0(a4) 8000403e: cff4 sw a3,92(a5) + for (i = 0; i < log.lh.n; i++) { 80004040: 0711 addi a4,a4,4 80004042: 0791 addi a5,a5,4 80004044: fec79ce3 bne a5,a2,8000403c <write_head+0x3a> + } + bwrite(buf); 80004048: 8526 mv a0,s1 8000404a: 93eff0ef jal 80003188 <bwrite> + brelse(buf); 8000404e: 8526 mv a0,s1 80004050: 96aff0ef jal 800031ba <brelse> +} 80004054: 60e2 ld ra,24(sp) 80004056: 6442 ld s0,16(sp) 80004058: 64a2 ld s1,8(sp) @@ -7113,9 +7647,11 @@ devintr() 8000405e: 8082 ret 0000000080004060 <install_trans>: + for (tail = 0; tail < log.lh.n; tail++) { 80004060: 00048797 auipc a5,0x48 80004064: 7c47a783 lw a5,1988(a5) # 8004c824 <log+0x2c> 80004068: 08f05f63 blez a5,80004106 <install_trans+0xa6> +{ 8000406c: 7139 addi sp,sp,-64 8000406e: fc06 sd ra,56(sp) 80004070: f822 sd s0,48(sp) @@ -7129,38 +7665,50 @@ devintr() 80004080: 8b2a mv s6,a0 80004082: 00048a97 auipc s5,0x48 80004086: 7a6a8a93 addi s5,s5,1958 # 8004c828 <log+0x30> + for (tail = 0; tail < log.lh.n; tail++) { 8000408a: 4a01 li s4,0 + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block 8000408c: 00048997 auipc s3,0x48 80004090: 76c98993 addi s3,s3,1900 # 8004c7f8 <log> 80004094: a829 j 800040ae <install_trans+0x4e> + brelse(lbuf); 80004096: 854a mv a0,s2 80004098: 922ff0ef jal 800031ba <brelse> + brelse(dbuf); 8000409c: 8526 mv a0,s1 8000409e: 91cff0ef jal 800031ba <brelse> + for (tail = 0; tail < log.lh.n; tail++) { 800040a2: 2a05 addiw s4,s4,1 800040a4: 0a91 addi s5,s5,4 800040a6: 02c9a783 lw a5,44(s3) 800040aa: 04fa5463 bge s4,a5,800040f2 <install_trans+0x92> + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block 800040ae: 0189a583 lw a1,24(s3) 800040b2: 014585bb addw a1,a1,s4 800040b6: 2585 addiw a1,a1,1 800040b8: 0289a503 lw a0,40(s3) 800040bc: ef1fe0ef jal 80002fac <bread> 800040c0: 892a mv s2,a0 + struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst 800040c2: 000aa583 lw a1,0(s5) 800040c6: 0289a503 lw a0,40(s3) 800040ca: ee3fe0ef jal 80002fac <bread> 800040ce: 84aa mv s1,a0 + memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst 800040d0: 40000613 li a2,1024 800040d4: 05890593 addi a1,s2,88 800040d8: 05850513 addi a0,a0,88 800040dc: edffc0ef jal 80000fba <memmove> + bwrite(dbuf); // write dst to disk 800040e0: 8526 mv a0,s1 800040e2: 8a6ff0ef jal 80003188 <bwrite> + if(recovering == 0) 800040e6: fa0b18e3 bnez s6,80004096 <install_trans+0x36> + bunpin(dbuf); 800040ea: 8526 mv a0,s1 800040ec: 9beff0ef jal 800032aa <bunpin> 800040f0: b75d j 80004096 <install_trans+0x36> +} 800040f2: 70e2 ld ra,56(sp) 800040f4: 7442 ld s0,48(sp) 800040f6: 74a2 ld s1,40(sp) @@ -7174,6 +7722,7 @@ devintr() 80004106: 8082 ret 0000000080004108 <initlog>: +{ 80004108: 7179 addi sp,sp,-48 8000410a: f406 sd ra,40(sp) 8000410c: f022 sd s0,32(sp) @@ -7183,38 +7732,57 @@ devintr() 80004114: 1800 addi s0,sp,48 80004116: 892a mv s2,a0 80004118: 89ae mv s3,a1 + initlock(&log.lock, "log"); 8000411a: 00048497 auipc s1,0x48 8000411e: 6de48493 addi s1,s1,1758 # 8004c7f8 <log> 80004122: 00005597 auipc a1,0x5 80004126: 96658593 addi a1,a1,-1690 # 80008a88 <etext+0xa88> 8000412a: 8526 mv a0,s1 8000412c: cdffc0ef jal 80000e0a <initlock> + log.start = sb->logstart; 80004130: 0149a583 lw a1,20(s3) 80004134: cc8c sw a1,24(s1) + log.size = sb->nlog; 80004136: 0109a783 lw a5,16(s3) 8000413a: ccdc sw a5,28(s1) + log.dev = dev; 8000413c: 0324a423 sw s2,40(s1) + struct buf *buf = bread(log.dev, log.start); 80004140: 854a mv a0,s2 80004142: e6bfe0ef jal 80002fac <bread> + log.lh.n = lh->n; 80004146: 4d30 lw a2,88(a0) 80004148: d4d0 sw a2,44(s1) + for (i = 0; i < log.lh.n; i++) { 8000414a: 00c05f63 blez a2,80004168 <initlog+0x60> 8000414e: 87aa mv a5,a0 80004150: 00048717 auipc a4,0x48 80004154: 6d870713 addi a4,a4,1752 # 8004c828 <log+0x30> 80004158: 060a slli a2,a2,0x2 8000415a: 962a add a2,a2,a0 + log.lh.block[i] = lh->block[i]; 8000415c: 4ff4 lw a3,92(a5) 8000415e: c314 sw a3,0(a4) + for (i = 0; i < log.lh.n; i++) { 80004160: 0791 addi a5,a5,4 80004162: 0711 addi a4,a4,4 80004164: fec79ce3 bne a5,a2,8000415c <initlog+0x54> + brelse(buf); 80004168: 852ff0ef jal 800031ba <brelse> + +static void +recover_from_log(void) +{ + read_head(); + install_trans(1); // if committed, copy from log to disk 8000416c: 4505 li a0,1 8000416e: ef3ff0ef jal 80004060 <install_trans> + log.lh.n = 0; 80004172: 00048797 auipc a5,0x48 80004176: 6a07a923 sw zero,1714(a5) # 8004c824 <log+0x2c> + write_head(); // clear the log 8000417a: e89ff0ef jal 80004002 <write_head> +} 8000417e: 70a2 ld ra,40(sp) 80004180: 7402 ld s0,32(sp) 80004182: 64e2 ld s1,24(sp) @@ -7224,24 +7792,38 @@ devintr() 8000418a: 8082 ret 000000008000418c <begin_op>: +} + +// called at the start of each FS system call. +void +begin_op(void) +{ 8000418c: 1101 addi sp,sp,-32 8000418e: ec06 sd ra,24(sp) 80004190: e822 sd s0,16(sp) 80004192: e426 sd s1,8(sp) 80004194: e04a sd s2,0(sp) 80004196: 1000 addi s0,sp,32 + acquire(&log.lock); 80004198: 00048517 auipc a0,0x48 8000419c: 66050513 addi a0,a0,1632 # 8004c7f8 <log> 800041a0: cebfc0ef jal 80000e8a <acquire> + while(1){ + if(log.committing){ 800041a4: 00048497 auipc s1,0x48 800041a8: 65448493 addi s1,s1,1620 # 8004c7f8 <log> + sleep(&log, &log.lock); + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGSIZE){ 800041ac: 4979 li s2,30 800041ae: a029 j 800041b8 <begin_op+0x2c> + sleep(&log, &log.lock); 800041b0: 85a6 mv a1,s1 800041b2: 8526 mv a0,s1 800041b4: 958fe0ef jal 8000230c <sleep> + if(log.committing){ 800041b8: 50dc lw a5,36(s1) 800041ba: fbfd bnez a5,800041b0 <begin_op+0x24> + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGSIZE){ 800041bc: 5098 lw a4,32(s1) 800041be: 2705 addiw a4,a4,1 800041c0: 0027179b slliw a5,a4,0x2 @@ -7250,14 +7832,23 @@ devintr() 800041ca: 54d4 lw a3,44(s1) 800041cc: 9fb5 addw a5,a5,a3 800041ce: 00f95763 bge s2,a5,800041dc <begin_op+0x50> + // this op might exhaust log space; wait for commit. + sleep(&log, &log.lock); 800041d2: 85a6 mv a1,s1 800041d4: 8526 mv a0,s1 800041d6: 936fe0ef jal 8000230c <sleep> 800041da: bff9 j 800041b8 <begin_op+0x2c> + } else { + log.outstanding += 1; 800041dc: 00048517 auipc a0,0x48 800041e0: 61c50513 addi a0,a0,1564 # 8004c7f8 <log> 800041e4: d118 sw a4,32(a0) + release(&log.lock); 800041e6: d3dfc0ef jal 80000f22 <release> + break; + } + } +} 800041ea: 60e2 ld ra,24(sp) 800041ec: 6442 ld s0,16(sp) 800041ee: 64a2 ld s1,8(sp) @@ -7266,53 +7857,89 @@ devintr() 800041f4: 8082 ret 00000000800041f6 <end_op>: + +// called at the end of each FS system call. +// commits if this was the last outstanding operation. +void +end_op(void) +{ 800041f6: 7139 addi sp,sp,-64 800041f8: fc06 sd ra,56(sp) 800041fa: f822 sd s0,48(sp) 800041fc: f426 sd s1,40(sp) 800041fe: f04a sd s2,32(sp) 80004200: 0080 addi s0,sp,64 + int do_commit = 0; + + acquire(&log.lock); 80004202: 00048497 auipc s1,0x48 80004206: 5f648493 addi s1,s1,1526 # 8004c7f8 <log> 8000420a: 8526 mv a0,s1 8000420c: c7ffc0ef jal 80000e8a <acquire> + log.outstanding -= 1; 80004210: 509c lw a5,32(s1) 80004212: 37fd addiw a5,a5,-1 80004214: 0007891b sext.w s2,a5 80004218: d09c sw a5,32(s1) + if(log.committing) 8000421a: 50dc lw a5,36(s1) 8000421c: ef9d bnez a5,8000425a <end_op+0x64> + panic("log.committing"); + if(log.outstanding == 0){ 8000421e: 04091763 bnez s2,8000426c <end_op+0x76> + do_commit = 1; + log.committing = 1; 80004222: 00048497 auipc s1,0x48 80004226: 5d648493 addi s1,s1,1494 # 8004c7f8 <log> 8000422a: 4785 li a5,1 8000422c: d0dc sw a5,36(s1) + // begin_op() may be waiting for log space, + // and decrementing log.outstanding has decreased + // the amount of reserved space. + wakeup(&log); + } + release(&log.lock); 8000422e: 8526 mv a0,s1 80004230: cf3fc0ef jal 80000f22 <release> +} + +static void +commit() +{ + if (log.lh.n > 0) { 80004234: 54dc lw a5,44(s1) 80004236: 04f04b63 bgtz a5,8000428c <end_op+0x96> + acquire(&log.lock); 8000423a: 00048497 auipc s1,0x48 8000423e: 5be48493 addi s1,s1,1470 # 8004c7f8 <log> 80004242: 8526 mv a0,s1 80004244: c47fc0ef jal 80000e8a <acquire> + log.committing = 0; 80004248: 0204a223 sw zero,36(s1) + wakeup(&log); 8000424c: 8526 mv a0,s1 8000424e: 90afe0ef jal 80002358 <wakeup> + release(&log.lock); 80004252: 8526 mv a0,s1 80004254: ccffc0ef jal 80000f22 <release> +} 80004258: a025 j 80004280 <end_op+0x8a> 8000425a: ec4e sd s3,24(sp) 8000425c: e852 sd s4,16(sp) 8000425e: e456 sd s5,8(sp) + panic("log.committing"); 80004260: 00005517 auipc a0,0x5 80004264: 83050513 addi a0,a0,-2000 # 80008a90 <etext+0xa90> 80004268: d2cfc0ef jal 80000794 <panic> + wakeup(&log); 8000426c: 00048497 auipc s1,0x48 80004270: 58c48493 addi s1,s1,1420 # 8004c7f8 <log> 80004274: 8526 mv a0,s1 80004276: 8e2fe0ef jal 80002358 <wakeup> + release(&log.lock); 8000427a: 8526 mv a0,s1 8000427c: ca7fc0ef jal 80000f22 <release> +} 80004280: 70e2 ld ra,56(sp) 80004282: 7442 ld s0,48(sp) 80004284: 74a2 ld s1,40(sp) @@ -7322,8 +7949,10 @@ devintr() 8000428c: ec4e sd s3,24(sp) 8000428e: e852 sd s4,16(sp) 80004290: e456 sd s5,8(sp) + for (tail = 0; tail < log.lh.n; tail++) { 80004292: 00048a97 auipc s5,0x48 80004296: 596a8a93 addi s5,s5,1430 # 8004c828 <log+0x30> + struct buf *to = bread(log.dev, log.start+tail+1); // log block 8000429a: 00048a17 auipc s4,0x48 8000429e: 55ea0a13 addi s4,s4,1374 # 8004c7f8 <log> 800042a2: 018a2583 lw a1,24(s4) @@ -7332,29 +7961,40 @@ devintr() 800042ac: 028a2503 lw a0,40(s4) 800042b0: cfdfe0ef jal 80002fac <bread> 800042b4: 84aa mv s1,a0 + struct buf *from = bread(log.dev, log.lh.block[tail]); // cache block 800042b6: 000aa583 lw a1,0(s5) 800042ba: 028a2503 lw a0,40(s4) 800042be: ceffe0ef jal 80002fac <bread> 800042c2: 89aa mv s3,a0 + memmove(to->data, from->data, BSIZE); 800042c4: 40000613 li a2,1024 800042c8: 05850593 addi a1,a0,88 800042cc: 05848513 addi a0,s1,88 800042d0: cebfc0ef jal 80000fba <memmove> + bwrite(to); // write the log 800042d4: 8526 mv a0,s1 800042d6: eb3fe0ef jal 80003188 <bwrite> + brelse(from); 800042da: 854e mv a0,s3 800042dc: edffe0ef jal 800031ba <brelse> + brelse(to); 800042e0: 8526 mv a0,s1 800042e2: ed9fe0ef jal 800031ba <brelse> + for (tail = 0; tail < log.lh.n; tail++) { 800042e6: 2905 addiw s2,s2,1 800042e8: 0a91 addi s5,s5,4 800042ea: 02ca2783 lw a5,44(s4) 800042ee: faf94ae3 blt s2,a5,800042a2 <end_op+0xac> + write_log(); // Write modified blocks from cache to log + write_head(); // Write header to disk -- the real commit 800042f2: d11ff0ef jal 80004002 <write_head> + install_trans(0); // Now install writes to home locations 800042f6: 4501 li a0,0 800042f8: d69ff0ef jal 80004060 <install_trans> + log.lh.n = 0; 800042fc: 00048797 auipc a5,0x48 80004300: 5207a423 sw zero,1320(a5) # 8004c824 <log+0x2c> + write_head(); // Erase the transaction from the log 80004304: cffff0ef jal 80004002 <write_head> 80004308: 69e2 ld s3,24(sp) 8000430a: 6a42 ld s4,16(sp) @@ -7362,6 +8002,12 @@ devintr() 8000430e: b735 j 8000423a <end_op+0x44> 0000000080004310 <log_write>: +// modify bp->data[] +// log_write(bp) +// brelse(bp) +void +log_write(struct buf *b) +{ 80004310: 1101 addi sp,sp,-32 80004312: ec06 sd ra,24(sp) 80004314: e822 sd s0,16(sp) @@ -7369,10 +8015,14 @@ devintr() 80004318: e04a sd s2,0(sp) 8000431a: 1000 addi s0,sp,32 8000431c: 84aa mv s1,a0 + int i; + + acquire(&log.lock); 8000431e: 00048917 auipc s2,0x48 80004322: 4da90913 addi s2,s2,1242 # 8004c7f8 <log> 80004326: 854a mv a0,s2 80004328: b63fc0ef jal 80000e8a <acquire> + if (log.lh.n >= LOGSIZE || log.lh.n >= log.size - 1) 8000432c: 02c92603 lw a2,44(s2) 80004330: 47f5 li a5,29 80004332: 06c7c363 blt a5,a2,80004398 <log_write+0x88> @@ -7380,20 +8030,32 @@ devintr() 8000433a: 4de7a783 lw a5,1246(a5) # 8004c814 <log+0x1c> 8000433e: 37fd addiw a5,a5,-1 80004340: 04f65c63 bge a2,a5,80004398 <log_write+0x88> + panic("too big a transaction"); + if (log.outstanding < 1) 80004344: 00048797 auipc a5,0x48 80004348: 4d47a783 lw a5,1236(a5) # 8004c818 <log+0x20> 8000434c: 04f05c63 blez a5,800043a4 <log_write+0x94> + panic("log_write outside of trans"); + + for (i = 0; i < log.lh.n; i++) { 80004350: 4781 li a5,0 80004352: 04c05f63 blez a2,800043b0 <log_write+0xa0> + if (log.lh.block[i] == b->blockno) // log absorption 80004356: 44cc lw a1,12(s1) 80004358: 00048717 auipc a4,0x48 8000435c: 4d070713 addi a4,a4,1232 # 8004c828 <log+0x30> + for (i = 0; i < log.lh.n; i++) { 80004360: 4781 li a5,0 + if (log.lh.block[i] == b->blockno) // log absorption 80004362: 4314 lw a3,0(a4) 80004364: 04b68663 beq a3,a1,800043b0 <log_write+0xa0> + for (i = 0; i < log.lh.n; i++) { 80004368: 2785 addiw a5,a5,1 8000436a: 0711 addi a4,a4,4 8000436c: fef61be3 bne a2,a5,80004362 <log_write+0x52> + break; + } + log.lh.block[i] = b->blockno; 80004370: 0621 addi a2,a2,8 80004372: 060a slli a2,a2,0x2 80004374: 00048797 auipc a5,0x48 @@ -7401,20 +8063,26 @@ devintr() 8000437c: 97b2 add a5,a5,a2 8000437e: 44d8 lw a4,12(s1) 80004380: cb98 sw a4,16(a5) + if (i == log.lh.n) { // Add new block to log? + bpin(b); 80004382: 8526 mv a0,s1 80004384: ecdfe0ef jal 80003250 <bpin> + log.lh.n++; 80004388: 00048717 auipc a4,0x48 8000438c: 47070713 addi a4,a4,1136 # 8004c7f8 <log> 80004390: 575c lw a5,44(a4) 80004392: 2785 addiw a5,a5,1 80004394: d75c sw a5,44(a4) 80004396: a80d j 800043c8 <log_write+0xb8> + panic("too big a transaction"); 80004398: 00004517 auipc a0,0x4 8000439c: 70850513 addi a0,a0,1800 # 80008aa0 <etext+0xaa0> 800043a0: bf4fc0ef jal 80000794 <panic> + panic("log_write outside of trans"); 800043a4: 00004517 auipc a0,0x4 800043a8: 71450513 addi a0,a0,1812 # 80008ab8 <etext+0xab8> 800043ac: be8fc0ef jal 80000794 <panic> + log.lh.block[i] = b->blockno; 800043b0: 00878693 addi a3,a5,8 800043b4: 068a slli a3,a3,0x2 800043b6: 00048717 auipc a4,0x48 @@ -7422,10 +8090,14 @@ devintr() 800043be: 9736 add a4,a4,a3 800043c0: 44d4 lw a3,12(s1) 800043c2: cb14 sw a3,16(a4) + if (i == log.lh.n) { // Add new block to log? 800043c4: faf60fe3 beq a2,a5,80004382 <log_write+0x72> + } + release(&log.lock); 800043c8: 00048517 auipc a0,0x48 800043cc: 43050513 addi a0,a0,1072 # 8004c7f8 <log> 800043d0: b53fc0ef jal 80000f22 <release> +} 800043d4: 60e2 ld ra,24(sp) 800043d6: 6442 ld s0,16(sp) 800043d8: 64a2 ld s1,8(sp) @@ -7545,47 +8217,76 @@ devintr() 800044dc: bfd9 j 800044b2 <holdingsleep+0x1e> 00000000800044de <fileinit>: + struct file file[NFILE]; +} ftable; + +void +fileinit(void) +{ 800044de: 1141 addi sp,sp,-16 800044e0: e406 sd ra,8(sp) 800044e2: e022 sd s0,0(sp) 800044e4: 0800 addi s0,sp,16 + initlock(&ftable.lock, "ftable"); 800044e6: 00004597 auipc a1,0x4 800044ea: 60258593 addi a1,a1,1538 # 80008ae8 <etext+0xae8> 800044ee: 00048517 auipc a0,0x48 800044f2: 45250513 addi a0,a0,1106 # 8004c940 <ftable> 800044f6: 915fc0ef jal 80000e0a <initlock> +} 800044fa: 60a2 ld ra,8(sp) 800044fc: 6402 ld s0,0(sp) 800044fe: 0141 addi sp,sp,16 80004500: 8082 ret 0000000080004502 <filealloc>: + +// Allocate a file structure. +struct file* +filealloc(void) +{ 80004502: 1101 addi sp,sp,-32 80004504: ec06 sd ra,24(sp) 80004506: e822 sd s0,16(sp) 80004508: e426 sd s1,8(sp) 8000450a: 1000 addi s0,sp,32 + struct file *f; + + acquire(&ftable.lock); 8000450c: 00048517 auipc a0,0x48 80004510: 43450513 addi a0,a0,1076 # 8004c940 <ftable> 80004514: 977fc0ef jal 80000e8a <acquire> + for(f = ftable.file; f < ftable.file + NFILE; f++){ 80004518: 00048497 auipc s1,0x48 8000451c: 44048493 addi s1,s1,1088 # 8004c958 <ftable+0x18> 80004520: 00049717 auipc a4,0x49 80004524: 3d870713 addi a4,a4,984 # 8004d8f8 <disk> + if(f->ref == 0){ 80004528: 40dc lw a5,4(s1) 8000452a: cf89 beqz a5,80004544 <filealloc+0x42> + for(f = ftable.file; f < ftable.file + NFILE; f++){ 8000452c: 02848493 addi s1,s1,40 80004530: fee49ce3 bne s1,a4,80004528 <filealloc+0x26> + f->ref = 1; + release(&ftable.lock); + return f; + } + } + release(&ftable.lock); 80004534: 00048517 auipc a0,0x48 80004538: 40c50513 addi a0,a0,1036 # 8004c940 <ftable> 8000453c: 9e7fc0ef jal 80000f22 <release> + return 0; 80004540: 4481 li s1,0 80004542: a809 j 80004554 <filealloc+0x52> + f->ref = 1; 80004544: 4785 li a5,1 80004546: c0dc sw a5,4(s1) + release(&ftable.lock); 80004548: 00048517 auipc a0,0x48 8000454c: 3f850513 addi a0,a0,1016 # 8004c940 <ftable> 80004550: 9d3fc0ef jal 80000f22 <release> +} 80004554: 8526 mv a0,s1 80004556: 60e2 ld ra,24(sp) 80004558: 6442 ld s0,16(sp) @@ -7594,44 +8295,68 @@ devintr() 8000455e: 8082 ret 0000000080004560 <filedup>: + +// Increment ref count for file f. +struct file* +filedup(struct file *f) +{ 80004560: 1101 addi sp,sp,-32 80004562: ec06 sd ra,24(sp) 80004564: e822 sd s0,16(sp) 80004566: e426 sd s1,8(sp) 80004568: 1000 addi s0,sp,32 8000456a: 84aa mv s1,a0 + acquire(&ftable.lock); 8000456c: 00048517 auipc a0,0x48 80004570: 3d450513 addi a0,a0,980 # 8004c940 <ftable> 80004574: 917fc0ef jal 80000e8a <acquire> + if(f->ref < 1) 80004578: 40dc lw a5,4(s1) 8000457a: 02f05063 blez a5,8000459a <filedup+0x3a> + panic("filedup"); + f->ref++; 8000457e: 2785 addiw a5,a5,1 80004580: c0dc sw a5,4(s1) + release(&ftable.lock); 80004582: 00048517 auipc a0,0x48 80004586: 3be50513 addi a0,a0,958 # 8004c940 <ftable> 8000458a: 999fc0ef jal 80000f22 <release> + return f; +} 8000458e: 8526 mv a0,s1 80004590: 60e2 ld ra,24(sp) 80004592: 6442 ld s0,16(sp) 80004594: 64a2 ld s1,8(sp) 80004596: 6105 addi sp,sp,32 80004598: 8082 ret + panic("filedup"); 8000459a: 00004517 auipc a0,0x4 8000459e: 55650513 addi a0,a0,1366 # 80008af0 <etext+0xaf0> 800045a2: 9f2fc0ef jal 80000794 <panic> 00000000800045a6 <fileclose>: + +// Close file f. (Decrement ref count, close when reaches 0.) +void +fileclose(struct file *f) +{ 800045a6: 7139 addi sp,sp,-64 800045a8: fc06 sd ra,56(sp) 800045aa: f822 sd s0,48(sp) 800045ac: f426 sd s1,40(sp) 800045ae: 0080 addi s0,sp,64 800045b0: 84aa mv s1,a0 + struct file ff; + + acquire(&ftable.lock); 800045b2: 00048517 auipc a0,0x48 800045b6: 38e50513 addi a0,a0,910 # 8004c940 <ftable> 800045ba: 8d1fc0ef jal 80000e8a <acquire> + if(f->ref < 1) 800045be: 40dc lw a5,4(s1) 800045c0: 04f05a63 blez a5,80004614 <fileclose+0x6e> + panic("fileclose"); + if(--f->ref > 0){ 800045c4: 37fd addiw a5,a5,-1 800045c6: 0007871b sext.w a4,a5 800045ca: c0dc sw a5,4(s1) @@ -7640,17 +8365,28 @@ devintr() 800045d2: ec4e sd s3,24(sp) 800045d4: e852 sd s4,16(sp) 800045d6: e456 sd s5,8(sp) + release(&ftable.lock); + return; + } + ff = *f; 800045d8: 0004a903 lw s2,0(s1) 800045dc: 0094ca83 lbu s5,9(s1) 800045e0: 0104ba03 ld s4,16(s1) 800045e4: 0184b983 ld s3,24(s1) + f->ref = 0; 800045e8: 0004a223 sw zero,4(s1) + f->type = FD_NONE; 800045ec: 0004a023 sw zero,0(s1) + release(&ftable.lock); 800045f0: 00048517 auipc a0,0x48 800045f4: 35050513 addi a0,a0,848 # 8004c940 <ftable> 800045f8: 92bfc0ef jal 80000f22 <release> + + if(ff.type == FD_PIPE){ 800045fc: 4785 li a5,1 800045fe: 04f90063 beq s2,a5,8000463e <fileclose+0x98> + pipeclose(ff.pipe, ff.writable); + } else if(ff.type == FD_INODE || ff.type == FD_DEVICE){ 80004602: 3979 addiw s2,s2,-2 80004604: 4785 li a5,1 80004606: 0527f563 bgeu a5,s2,80004650 <fileclose+0xaa> @@ -7663,17 +8399,25 @@ devintr() 80004616: ec4e sd s3,24(sp) 80004618: e852 sd s4,16(sp) 8000461a: e456 sd s5,8(sp) + panic("fileclose"); 8000461c: 00004517 auipc a0,0x4 80004620: 4dc50513 addi a0,a0,1244 # 80008af8 <etext+0xaf8> 80004624: 970fc0ef jal 80000794 <panic> + release(&ftable.lock); 80004628: 00048517 auipc a0,0x48 8000462c: 31850513 addi a0,a0,792 # 8004c940 <ftable> 80004630: 8f3fc0ef jal 80000f22 <release> + begin_op(); + iput(ff.ip); + end_op(); + } +} 80004634: 70e2 ld ra,56(sp) 80004636: 7442 ld s0,48(sp) 80004638: 74a2 ld s1,40(sp) 8000463a: 6121 addi sp,sp,64 8000463c: 8082 ret + pipeclose(ff.pipe, ff.writable); 8000463e: 85d6 mv a1,s5 80004640: 8552 mv a0,s4 80004642: 336000ef jal 80004978 <pipeclose> @@ -7682,9 +8426,12 @@ devintr() 8000464a: 6a42 ld s4,16(sp) 8000464c: 6aa2 ld s5,8(sp) 8000464e: b7dd j 80004634 <fileclose+0x8e> + begin_op(); 80004650: b3dff0ef jal 8000418c <begin_op> + iput(ff.ip); 80004654: 854e mv a0,s3 80004656: c20ff0ef jal 80003a76 <iput> + end_op(); 8000465a: b9dff0ef jal 800041f6 <end_op> 8000465e: 7902 ld s2,32(sp) 80004660: 69e2 ld s3,24(sp) @@ -7693,6 +8440,12 @@ devintr() 80004666: b7f9 j 80004634 <fileclose+0x8e> 0000000080004668 <filestat>: + +// Get metadata about file f. +// addr is a user virtual address, pointing to a struct stat. +int +filestat(struct file *f, uint64 addr) +{ 80004668: 715d addi sp,sp,-80 8000466a: e486 sd ra,72(sp) 8000466c: e0a2 sd s0,64(sp) @@ -7701,20 +8454,28 @@ devintr() 80004672: 0880 addi s0,sp,80 80004674: 84aa mv s1,a0 80004676: 89ae mv s3,a1 + struct proc *p = myproc(); 80004678: e44fd0ef jal 80001cbc <myproc> + struct stat st; + + if(f->type == FD_INODE || f->type == FD_DEVICE){ 8000467c: 409c lw a5,0(s1) 8000467e: 37f9 addiw a5,a5,-2 80004680: 4705 li a4,1 80004682: 04f76063 bltu a4,a5,800046c2 <filestat+0x5a> 80004686: f84a sd s2,48(sp) 80004688: 892a mv s2,a0 + ilock(f->ip); 8000468a: 6c88 ld a0,24(s1) 8000468c: a68ff0ef jal 800038f4 <ilock> + stati(f->ip, &st); 80004690: fb840593 addi a1,s0,-72 80004694: 6c88 ld a0,24(s1) 80004696: c88ff0ef jal 80003b1e <stati> + iunlock(f->ip); 8000469a: 6c88 ld a0,24(s1) 8000469c: b06ff0ef jal 800039a2 <iunlock> + if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0) 800046a0: 46e1 li a3,24 800046a2: fb840613 addi a2,s0,-72 800046a6: 85ce mv a1,s3 @@ -7722,21 +8483,36 @@ devintr() 800046ac: a32fd0ef jal 800018de <copyout> 800046b0: 41f5551b sraiw a0,a0,0x1f 800046b4: 7942 ld s2,48(sp) + return -1; + return 0; + } + return -1; +} 800046b6: 60a6 ld ra,72(sp) 800046b8: 6406 ld s0,64(sp) 800046ba: 74e2 ld s1,56(sp) 800046bc: 79a2 ld s3,40(sp) 800046be: 6161 addi sp,sp,80 800046c0: 8082 ret + return -1; 800046c2: 557d li a0,-1 800046c4: bfcd j 800046b6 <filestat+0x4e> 00000000800046c6 <fileread>: + +// Read from file f. +// addr is a user virtual address. +int +fileread(struct file *f, uint64 addr, int n) +{ 800046c6: 7179 addi sp,sp,-48 800046c8: f406 sd ra,40(sp) 800046ca: f022 sd s0,32(sp) 800046cc: e84a sd s2,16(sp) 800046ce: 1800 addi s0,sp,48 + int r = 0; + + if(f->readable == 0) 800046d0: 00854783 lbu a5,8(a0) 800046d4: cfd1 beqz a5,80004770 <fileread+0xaa> 800046d6: ec26 sd s1,24(sp) @@ -7744,15 +8520,26 @@ devintr() 800046da: 84aa mv s1,a0 800046dc: 89ae mv s3,a1 800046de: 8932 mv s2,a2 + return -1; + + if(f->type == FD_PIPE){ 800046e0: 411c lw a5,0(a0) 800046e2: 4705 li a4,1 800046e4: 04e78363 beq a5,a4,8000472a <fileread+0x64> + r = piperead(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ 800046e8: 470d li a4,3 800046ea: 04e78763 beq a5,a4,80004738 <fileread+0x72> + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read) + return -1; + r = devsw[f->major].read(1, addr, n); + } else if(f->type == FD_INODE){ 800046ee: 4709 li a4,2 800046f0: 06e79a63 bne a5,a4,80004764 <fileread+0x9e> + ilock(f->ip); 800046f4: 6d08 ld a0,24(a0) 800046f6: 9feff0ef jal 800038f4 <ilock> + if((r = readi(f->ip, 1, addr, f->off, n)) > 0) 800046fa: 874a mv a4,s2 800046fc: 5094 lw a3,32(s1) 800046fe: 864e mv a2,s3 @@ -7761,25 +8548,35 @@ devintr() 80004704: c44ff0ef jal 80003b48 <readi> 80004708: 892a mv s2,a0 8000470a: 00a05563 blez a0,80004714 <fileread+0x4e> + f->off += r; 8000470e: 509c lw a5,32(s1) 80004710: 9fa9 addw a5,a5,a0 80004712: d09c sw a5,32(s1) + iunlock(f->ip); 80004714: 6c88 ld a0,24(s1) 80004716: a8cff0ef jal 800039a2 <iunlock> 8000471a: 64e2 ld s1,24(sp) 8000471c: 69a2 ld s3,8(sp) + } else { + panic("fileread"); + } + + return r; +} 8000471e: 854a mv a0,s2 80004720: 70a2 ld ra,40(sp) 80004722: 7402 ld s0,32(sp) 80004724: 6942 ld s2,16(sp) 80004726: 6145 addi sp,sp,48 80004728: 8082 ret + r = piperead(f->pipe, addr, n); 8000472a: 6908 ld a0,16(a0) 8000472c: 388000ef jal 80004ab4 <piperead> 80004730: 892a mv s2,a0 80004732: 64e2 ld s1,24(sp) 80004734: 69a2 ld s3,8(sp) 80004736: b7e5 j 8000471e <fileread+0x58> + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read) 80004738: 02451783 lh a5,36(a0) 8000473c: 03079693 slli a3,a5,0x30 80004740: 92c1 srli a3,a3,0x30 @@ -7791,17 +8588,21 @@ devintr() 80004752: 97ba add a5,a5,a4 80004754: 639c ld a5,0(a5) 80004756: c39d beqz a5,8000477c <fileread+0xb6> + r = devsw[f->major].read(1, addr, n); 80004758: 4505 li a0,1 8000475a: 9782 jalr a5 8000475c: 892a mv s2,a0 8000475e: 64e2 ld s1,24(sp) 80004760: 69a2 ld s3,8(sp) 80004762: bf75 j 8000471e <fileread+0x58> + panic("fileread"); 80004764: 00004517 auipc a0,0x4 80004768: 3a450513 addi a0,a0,932 # 80008b08 <etext+0xb08> 8000476c: 828fc0ef jal 80000794 <panic> + return -1; 80004770: 597d li s2,-1 80004772: b775 j 8000471e <fileread+0x58> + return -1; 80004774: 597d li s2,-1 80004776: 64e2 ld s1,24(sp) 80004778: 69a2 ld s3,8(sp) @@ -7812,8 +8613,15 @@ devintr() 80004782: bf71 j 8000471e <fileread+0x58> 0000000080004784 <filewrite>: +int +filewrite(struct file *f, uint64 addr, int n) +{ + int r, ret = 0; + + if(f->writable == 0) 80004784: 00954783 lbu a5,9(a0) 80004788: 10078b63 beqz a5,8000489e <filewrite+0x11a> +{ 8000478c: 715d addi sp,sp,-80 8000478e: e486 sd ra,72(sp) 80004790: e0a2 sd s0,64(sp) @@ -7824,28 +8632,48 @@ devintr() 8000479a: 892a mv s2,a0 8000479c: 8b2e mv s6,a1 8000479e: 8a32 mv s4,a2 + return -1; + + if(f->type == FD_PIPE){ 800047a0: 411c lw a5,0(a0) 800047a2: 4705 li a4,1 800047a4: 02e78763 beq a5,a4,800047d2 <filewrite+0x4e> + ret = pipewrite(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ 800047a8: 470d li a4,3 800047aa: 02e78863 beq a5,a4,800047da <filewrite+0x56> + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write) + return -1; + ret = devsw[f->major].write(1, addr, n); + } else if(f->type == FD_INODE){ 800047ae: 4709 li a4,2 800047b0: 0ce79c63 bne a5,a4,80004888 <filewrite+0x104> 800047b4: f44e sd s3,40(sp) + // and 2 blocks of slop for non-aligned writes. + // this really belongs lower down, since writei() + // might be writing a device like the console. + int max = ((MAXOPBLOCKS-1-1-2) / 2) * BSIZE; + int i = 0; + while(i < n){ 800047b6: 0ac05863 blez a2,80004866 <filewrite+0xe2> 800047ba: fc26 sd s1,56(sp) 800047bc: ec56 sd s5,24(sp) 800047be: e45e sd s7,8(sp) 800047c0: e062 sd s8,0(sp) + int i = 0; 800047c2: 4981 li s3,0 + int n1 = n - i; + if(n1 > max) 800047c4: 6b85 lui s7,0x1 800047c6: c00b8b93 addi s7,s7,-1024 # c00 <_entry-0x7ffff400> 800047ca: 6c05 lui s8,0x1 800047cc: c00c0c1b addiw s8,s8,-1024 # c00 <_entry-0x7ffff400> 800047d0: a8b5 j 8000484c <filewrite+0xc8> + ret = pipewrite(f->pipe, addr, n); 800047d2: 6908 ld a0,16(a0) 800047d4: 1fc000ef jal 800049d0 <pipewrite> 800047d8: a04d j 8000487a <filewrite+0xf6> + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write) 800047da: 02451783 lh a5,36(a0) 800047de: 03079693 slli a3,a5,0x30 800047e2: 92c1 srli a3,a3,0x30 @@ -7857,13 +8685,20 @@ devintr() 800047f4: 97ba add a5,a5,a4 800047f6: 679c ld a5,8(a5) 800047f8: c7dd beqz a5,800048a6 <filewrite+0x122> + ret = devsw[f->major].write(1, addr, n); 800047fa: 4505 li a0,1 800047fc: 9782 jalr a5 800047fe: a8b5 j 8000487a <filewrite+0xf6> + if(n1 > max) 80004800: 00048a9b sext.w s5,s1 + n1 = max; + + begin_op(); 80004804: 989ff0ef jal 8000418c <begin_op> + ilock(f->ip); 80004808: 01893503 ld a0,24(s2) 8000480c: 8e8ff0ef jal 800038f4 <ilock> + if ((r = writei(f->ip, 1, addr + i, f->off, n1)) > 0) 80004810: 8756 mv a4,s5 80004812: 02092683 lw a3,32(s2) 80004816: 01698633 add a2,s3,s6 @@ -7872,16 +8707,28 @@ devintr() 80004820: c24ff0ef jal 80003c44 <writei> 80004824: 84aa mv s1,a0 80004826: 00a05763 blez a0,80004834 <filewrite+0xb0> + f->off += r; 8000482a: 02092783 lw a5,32(s2) 8000482e: 9fa9 addw a5,a5,a0 80004830: 02f92023 sw a5,32(s2) + iunlock(f->ip); 80004834: 01893503 ld a0,24(s2) 80004838: 96aff0ef jal 800039a2 <iunlock> + end_op(); 8000483c: 9bbff0ef jal 800041f6 <end_op> + + if(r != n1){ 80004840: 029a9563 bne s5,s1,8000486a <filewrite+0xe6> + // error from writei + break; + } + i += r; 80004844: 013489bb addw s3,s1,s3 + while(i < n){ 80004848: 0149da63 bge s3,s4,8000485c <filewrite+0xd8> + int n1 = n - i; 8000484c: 413a04bb subw s1,s4,s3 + if(n1 > max) 80004850: 0004879b sext.w a5,s1 80004854: fafbd6e3 bge s7,a5,80004800 <filewrite+0x7c> 80004858: 84e2 mv s1,s8 @@ -7891,15 +8738,24 @@ devintr() 80004860: 6ba2 ld s7,8(sp) 80004862: 6c02 ld s8,0(sp) 80004864: a039 j 80004872 <filewrite+0xee> + int i = 0; 80004866: 4981 li s3,0 80004868: a029 j 80004872 <filewrite+0xee> 8000486a: 74e2 ld s1,56(sp) 8000486c: 6ae2 ld s5,24(sp) 8000486e: 6ba2 ld s7,8(sp) 80004870: 6c02 ld s8,0(sp) + } + ret = (i == n ? n : -1); 80004872: 033a1c63 bne s4,s3,800048aa <filewrite+0x126> 80004876: 8552 mv a0,s4 80004878: 79a2 ld s3,40(sp) + } else { + panic("filewrite"); + } + + return ret; +} 8000487a: 60a6 ld ra,72(sp) 8000487c: 6406 ld s0,64(sp) 8000487e: 7942 ld s2,48(sp) @@ -7912,20 +8768,31 @@ devintr() 8000488c: ec56 sd s5,24(sp) 8000488e: e45e sd s7,8(sp) 80004890: e062 sd s8,0(sp) + panic("filewrite"); 80004892: 00004517 auipc a0,0x4 80004896: 28650513 addi a0,a0,646 # 80008b18 <etext+0xb18> 8000489a: efbfb0ef jal 80000794 <panic> + return -1; 8000489e: 557d li a0,-1 +} 800048a0: 8082 ret + return -1; 800048a2: 557d li a0,-1 800048a4: bfd9 j 8000487a <filewrite+0xf6> 800048a6: 557d li a0,-1 800048a8: bfc9 j 8000487a <filewrite+0xf6> + ret = (i == n ? n : -1); 800048aa: 557d li a0,-1 800048ac: 79a2 ld s3,40(sp) 800048ae: b7f1 j 8000487a <filewrite+0xf6> 00000000800048b0 <pipealloc>: + int writeopen; // write fd is still open +}; + +int +pipealloc(struct file **f0, struct file **f1) +{ 800048b0: 7179 addi sp,sp,-48 800048b2: f406 sd ra,40(sp) 800048b4: f022 sd s0,32(sp) @@ -7934,8 +8801,13 @@ devintr() 800048ba: 1800 addi s0,sp,48 800048bc: 84aa mv s1,a0 800048be: 8a2e mv s4,a1 + struct pipe *pi; + + pi = 0; + *f0 = *f1 = 0; 800048c0: 0005b023 sd zero,0(a1) 800048c4: 00053023 sd zero,0(a0) + if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0) 800048c8: c3bff0ef jal 80004502 <filealloc> 800048cc: e088 sd a0,0(s1) 800048ce: c549 beqz a0,80004958 <pipealloc+0xa8> @@ -7943,38 +8815,60 @@ devintr() 800048d4: 00aa3023 sd a0,0(s4) 800048d8: cd25 beqz a0,80004950 <pipealloc+0xa0> 800048da: e84a sd s2,16(sp) + goto bad; + if((pi = (struct pipe*)kalloc()) == 0) 800048dc: b6efc0ef jal 80000c4a <kalloc> 800048e0: 892a mv s2,a0 800048e2: c12d beqz a0,80004944 <pipealloc+0x94> 800048e4: e44e sd s3,8(sp) + goto bad; + pi->readopen = 1; 800048e6: 4985 li s3,1 800048e8: 23352023 sw s3,544(a0) + pi->writeopen = 1; 800048ec: 23352223 sw s3,548(a0) + pi->nwrite = 0; 800048f0: 20052e23 sw zero,540(a0) + pi->nread = 0; 800048f4: 20052c23 sw zero,536(a0) + initlock(&pi->lock, "pipe"); 800048f8: 00004597 auipc a1,0x4 800048fc: 23058593 addi a1,a1,560 # 80008b28 <etext+0xb28> 80004900: d0afc0ef jal 80000e0a <initlock> + (*f0)->type = FD_PIPE; 80004904: 609c ld a5,0(s1) 80004906: 0137a023 sw s3,0(a5) + (*f0)->readable = 1; 8000490a: 609c ld a5,0(s1) 8000490c: 01378423 sb s3,8(a5) + (*f0)->writable = 0; 80004910: 609c ld a5,0(s1) 80004912: 000784a3 sb zero,9(a5) + (*f0)->pipe = pi; 80004916: 609c ld a5,0(s1) 80004918: 0127b823 sd s2,16(a5) + (*f1)->type = FD_PIPE; 8000491c: 000a3783 ld a5,0(s4) 80004920: 0137a023 sw s3,0(a5) + (*f1)->readable = 0; 80004924: 000a3783 ld a5,0(s4) 80004928: 00078423 sb zero,8(a5) + (*f1)->writable = 1; 8000492c: 000a3783 ld a5,0(s4) 80004930: 013784a3 sb s3,9(a5) + (*f1)->pipe = pi; 80004934: 000a3783 ld a5,0(s4) 80004938: 0127b823 sd s2,16(a5) + return 0; 8000493c: 4501 li a0,0 8000493e: 6942 ld s2,16(sp) 80004940: 69a2 ld s3,8(sp) 80004942: a01d j 80004968 <pipealloc+0xb8> + + bad: + if(pi) + kfree((char*)pi); + if(*f0) 80004944: 6088 ld a0,0(s1) 80004946: c119 beqz a0,8000494c <pipealloc+0x9c> 80004948: 6942 ld s2,16(sp) @@ -7983,23 +8877,36 @@ devintr() 8000494e: a029 j 80004958 <pipealloc+0xa8> 80004950: 6088 ld a0,0(s1) 80004952: c10d beqz a0,80004974 <pipealloc+0xc4> + fileclose(*f0); 80004954: c53ff0ef jal 800045a6 <fileclose> + if(*f1) 80004958: 000a3783 ld a5,0(s4) + fileclose(*f1); + return -1; 8000495c: 557d li a0,-1 + if(*f1) 8000495e: c789 beqz a5,80004968 <pipealloc+0xb8> + fileclose(*f1); 80004960: 853e mv a0,a5 80004962: c45ff0ef jal 800045a6 <fileclose> + return -1; 80004966: 557d li a0,-1 +} 80004968: 70a2 ld ra,40(sp) 8000496a: 7402 ld s0,32(sp) 8000496c: 64e2 ld s1,24(sp) 8000496e: 6a02 ld s4,0(sp) 80004970: 6145 addi sp,sp,48 80004972: 8082 ret + return -1; 80004974: 557d li a0,-1 80004976: bfcd j 80004968 <pipealloc+0xb8> 0000000080004978 <pipeclose>: + +void +pipeclose(struct pipe *pi, int writable) +{ 80004978: 1101 addi sp,sp,-32 8000497a: ec06 sd ra,24(sp) 8000497c: e822 sd s0,16(sp) @@ -8008,32 +8915,54 @@ devintr() 80004982: 1000 addi s0,sp,32 80004984: 84aa mv s1,a0 80004986: 892e mv s2,a1 + acquire(&pi->lock); 80004988: d02fc0ef jal 80000e8a <acquire> + if(writable){ 8000498c: 02090763 beqz s2,800049ba <pipeclose+0x42> + pi->writeopen = 0; 80004990: 2204a223 sw zero,548(s1) + wakeup(&pi->nread); 80004994: 21848513 addi a0,s1,536 80004998: 9c1fd0ef jal 80002358 <wakeup> + } else { + pi->readopen = 0; + wakeup(&pi->nwrite); + } + if(pi->readopen == 0 && pi->writeopen == 0){ 8000499c: 2204b783 ld a5,544(s1) 800049a0: e785 bnez a5,800049c8 <pipeclose+0x50> + release(&pi->lock); 800049a2: 8526 mv a0,s1 800049a4: d7efc0ef jal 80000f22 <release> + kfree((char*)pi); 800049a8: 8526 mv a0,s1 800049aa: 93cfc0ef jal 80000ae6 <kfree> + } else + release(&pi->lock); +} 800049ae: 60e2 ld ra,24(sp) 800049b0: 6442 ld s0,16(sp) 800049b2: 64a2 ld s1,8(sp) 800049b4: 6902 ld s2,0(sp) 800049b6: 6105 addi sp,sp,32 800049b8: 8082 ret + pi->readopen = 0; 800049ba: 2204a023 sw zero,544(s1) + wakeup(&pi->nwrite); 800049be: 21c48513 addi a0,s1,540 800049c2: 997fd0ef jal 80002358 <wakeup> 800049c6: bfd9 j 8000499c <pipeclose+0x24> + release(&pi->lock); 800049c8: 8526 mv a0,s1 800049ca: d58fc0ef jal 80000f22 <release> +} 800049ce: b7c5 j 800049ae <pipeclose+0x36> 00000000800049d0 <pipewrite>: + +int +pipewrite(struct pipe *pi, uint64 addr, int n) +{ 800049d0: 711d addi sp,sp,-96 800049d2: ec86 sd ra,88(sp) 800049d4: e8a2 sd s0,80(sp) @@ -8046,25 +8975,47 @@ devintr() 800049e2: 84aa mv s1,a0 800049e4: 8aae mv s5,a1 800049e6: 8a32 mv s4,a2 + int i = 0; + struct proc *pr = myproc(); 800049e8: ad4fd0ef jal 80001cbc <myproc> 800049ec: 89aa mv s3,a0 + + acquire(&pi->lock); 800049ee: 8526 mv a0,s1 800049f0: c9afc0ef jal 80000e8a <acquire> + while(i < n){ 800049f4: 0b405a63 blez s4,80004aa8 <pipewrite+0xd8> 800049f8: f05a sd s6,32(sp) 800049fa: ec5e sd s7,24(sp) 800049fc: e862 sd s8,16(sp) + int i = 0; 800049fe: 4901 li s2,0 + if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full + wakeup(&pi->nread); + sleep(&pi->nwrite, &pi->lock); + } else { + char ch; + if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) 80004a00: 5b7d li s6,-1 + wakeup(&pi->nread); 80004a02: 21848c13 addi s8,s1,536 + sleep(&pi->nwrite, &pi->lock); 80004a06: 21c48b93 addi s7,s1,540 80004a0a: a81d j 80004a40 <pipewrite+0x70> + release(&pi->lock); 80004a0c: 8526 mv a0,s1 80004a0e: d14fc0ef jal 80000f22 <release> + return -1; 80004a12: 597d li s2,-1 80004a14: 7b02 ld s6,32(sp) 80004a16: 6be2 ld s7,24(sp) 80004a18: 6c42 ld s8,16(sp) + } + wakeup(&pi->nread); + release(&pi->lock); + + return i; +} 80004a1a: 854a mv a0,s2 80004a1c: 60e6 ld ra,88(sp) 80004a1e: 6446 ld s0,80(sp) @@ -8075,27 +9026,34 @@ devintr() 80004a28: 7aa2 ld s5,40(sp) 80004a2a: 6125 addi sp,sp,96 80004a2c: 8082 ret + wakeup(&pi->nread); 80004a2e: 8562 mv a0,s8 80004a30: 929fd0ef jal 80002358 <wakeup> + sleep(&pi->nwrite, &pi->lock); 80004a34: 85a6 mv a1,s1 80004a36: 855e mv a0,s7 80004a38: 8d5fd0ef jal 8000230c <sleep> + while(i < n){ 80004a3c: 05495b63 bge s2,s4,80004a92 <pipewrite+0xc2> + if(pi->readopen == 0 || killed(pr)){ 80004a40: 2204a783 lw a5,544(s1) 80004a44: d7e1 beqz a5,80004a0c <pipewrite+0x3c> 80004a46: 854e mv a0,s3 80004a48: afdfd0ef jal 80002544 <killed> 80004a4c: f161 bnez a0,80004a0c <pipewrite+0x3c> + if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full 80004a4e: 2184a783 lw a5,536(s1) 80004a52: 21c4a703 lw a4,540(s1) 80004a56: 2007879b addiw a5,a5,512 80004a5a: fcf70ae3 beq a4,a5,80004a2e <pipewrite+0x5e> + if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) 80004a5e: 4685 li a3,1 80004a60: 01590633 add a2,s2,s5 80004a64: faf40593 addi a1,s0,-81 80004a68: 0589b503 ld a0,88(s3) 80004a6c: f19fc0ef jal 80001984 <copyin> 80004a70: 03650e63 beq a0,s6,80004aac <pipewrite+0xdc> + pi->data[pi->nwrite++ % PIPESIZE] = ch; 80004a74: 21c4a783 lw a5,540(s1) 80004a78: 0017871b addiw a4,a5,1 80004a7c: 20e4ae23 sw a4,540(s1) @@ -8103,16 +9061,21 @@ devintr() 80004a84: 97a6 add a5,a5,s1 80004a86: faf44703 lbu a4,-81(s0) 80004a8a: 00e78c23 sb a4,24(a5) + i++; 80004a8e: 2905 addiw s2,s2,1 80004a90: b775 j 80004a3c <pipewrite+0x6c> 80004a92: 7b02 ld s6,32(sp) 80004a94: 6be2 ld s7,24(sp) 80004a96: 6c42 ld s8,16(sp) + wakeup(&pi->nread); 80004a98: 21848513 addi a0,s1,536 80004a9c: 8bdfd0ef jal 80002358 <wakeup> + release(&pi->lock); 80004aa0: 8526 mv a0,s1 80004aa2: c80fc0ef jal 80000f22 <release> + return i; 80004aa6: bf95 j 80004a1a <pipewrite+0x4a> + int i = 0; 80004aa8: 4901 li s2,0 80004aaa: b7fd j 80004a98 <pipewrite+0xc8> 80004aac: 7b02 ld s6,32(sp) @@ -8121,6 +9084,10 @@ devintr() 80004ab2: b7dd j 80004a98 <pipewrite+0xc8> 0000000080004ab4 <piperead>: + +int +piperead(struct pipe *pi, uint64 addr, int n) +{ 80004ab4: 715d addi sp,sp,-80 80004ab6: e486 sd ra,72(sp) 80004ab8: e0a2 sd s0,64(sp) @@ -8133,22 +9100,37 @@ devintr() 80004ac6: 84aa mv s1,a0 80004ac8: 892e mv s2,a1 80004aca: 8ab2 mv s5,a2 + int i; + struct proc *pr = myproc(); 80004acc: 9f0fd0ef jal 80001cbc <myproc> 80004ad0: 8a2a mv s4,a0 + char ch; + + acquire(&pi->lock); 80004ad2: 8526 mv a0,s1 80004ad4: bb6fc0ef jal 80000e8a <acquire> + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty 80004ad8: 2184a703 lw a4,536(s1) 80004adc: 21c4a783 lw a5,540(s1) + if(killed(pr)){ + release(&pi->lock); + return -1; + } + sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep 80004ae0: 21848993 addi s3,s1,536 + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty 80004ae4: 02f71563 bne a4,a5,80004b0e <piperead+0x5a> 80004ae8: 2244a783 lw a5,548(s1) 80004aec: cb85 beqz a5,80004b1c <piperead+0x68> + if(killed(pr)){ 80004aee: 8552 mv a0,s4 80004af0: a55fd0ef jal 80002544 <killed> 80004af4: ed19 bnez a0,80004b12 <piperead+0x5e> + sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep 80004af6: 85a6 mv a1,s1 80004af8: 854e mv a0,s3 80004afa: 813fd0ef jal 8000230c <sleep> + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty 80004afe: 2184a703 lw a4,536(s1) 80004b02: 21c4a783 lw a5,540(s1) 80004b06: fef701e3 beq a4,a5,80004ae8 <piperead+0x34> @@ -8156,38 +9138,57 @@ devintr() 80004b0c: a809 j 80004b1e <piperead+0x6a> 80004b0e: e85a sd s6,16(sp) 80004b10: a039 j 80004b1e <piperead+0x6a> + release(&pi->lock); 80004b12: 8526 mv a0,s1 80004b14: c0efc0ef jal 80000f22 <release> + return -1; 80004b18: 59fd li s3,-1 80004b1a: a8b1 j 80004b76 <piperead+0xc2> 80004b1c: e85a sd s6,16(sp) + } + for(i = 0; i < n; i++){ //DOC: piperead-copy 80004b1e: 4981 li s3,0 + if(pi->nread == pi->nwrite) + break; + ch = pi->data[pi->nread++ % PIPESIZE]; + if(copyout(pr->pagetable, addr + i, &ch, 1) == -1) 80004b20: 5b7d li s6,-1 + for(i = 0; i < n; i++){ //DOC: piperead-copy 80004b22: 05505263 blez s5,80004b66 <piperead+0xb2> + if(pi->nread == pi->nwrite) 80004b26: 2184a783 lw a5,536(s1) 80004b2a: 21c4a703 lw a4,540(s1) 80004b2e: 02f70c63 beq a4,a5,80004b66 <piperead+0xb2> + ch = pi->data[pi->nread++ % PIPESIZE]; 80004b32: 0017871b addiw a4,a5,1 80004b36: 20e4ac23 sw a4,536(s1) 80004b3a: 1ff7f793 andi a5,a5,511 80004b3e: 97a6 add a5,a5,s1 80004b40: 0187c783 lbu a5,24(a5) 80004b44: faf40fa3 sb a5,-65(s0) + if(copyout(pr->pagetable, addr + i, &ch, 1) == -1) 80004b48: 4685 li a3,1 80004b4a: fbf40613 addi a2,s0,-65 80004b4e: 85ca mv a1,s2 80004b50: 058a3503 ld a0,88(s4) 80004b54: d8bfc0ef jal 800018de <copyout> 80004b58: 01650763 beq a0,s6,80004b66 <piperead+0xb2> + for(i = 0; i < n; i++){ //DOC: piperead-copy 80004b5c: 2985 addiw s3,s3,1 80004b5e: 0905 addi s2,s2,1 80004b60: fd3a93e3 bne s5,s3,80004b26 <piperead+0x72> 80004b64: 89d6 mv s3,s5 + break; + } + wakeup(&pi->nwrite); //DOC: piperead-wakeup 80004b66: 21c48513 addi a0,s1,540 80004b6a: feefd0ef jal 80002358 <wakeup> + release(&pi->lock); 80004b6e: 8526 mv a0,s1 80004b70: bb2fc0ef jal 80000f22 <release> 80004b74: 6b42 ld s6,16(sp) + return i; +} 80004b76: 854e mv a0,s3 80004b78: 60a6 ld ra,72(sp) 80004b7a: 6406 ld s0,64(sp) @@ -8200,20 +9201,37 @@ devintr() 80004b88: 8082 ret 0000000080004b8a <flags2perm>: +#include "elf.h" + +static int loadseg(pde_t *, uint64, struct inode *, uint, uint); + +int flags2perm(int flags) +{ 80004b8a: 1141 addi sp,sp,-16 80004b8c: e422 sd s0,8(sp) 80004b8e: 0800 addi s0,sp,16 80004b90: 87aa mv a5,a0 + int perm = 0; + if(flags & 0x1) 80004b92: 8905 andi a0,a0,1 80004b94: 050e slli a0,a0,0x3 + perm = PTE_X; + if(flags & 0x2) 80004b96: 8b89 andi a5,a5,2 80004b98: c399 beqz a5,80004b9e <flags2perm+0x14> + perm |= PTE_W; 80004b9a: 00456513 ori a0,a0,4 + return perm; +} 80004b9e: 6422 ld s0,8(sp) 80004ba0: 0141 addi sp,sp,16 80004ba2: 8082 ret 0000000080004ba4 <exec>: + +int +exec(char *path, char **argv) +{ 80004ba4: df010113 addi sp,sp,-528 80004ba8: 20113423 sd ra,520(sp) 80004bac: 20813023 sd s0,512(sp) @@ -8223,15 +9241,32 @@ devintr() 80004bb6: 892a mv s2,a0 80004bb8: dea43c23 sd a0,-520(s0) 80004bbc: e0b43023 sd a1,-512(s0) + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + struct elfhdr elf; + struct inode *ip; + struct proghdr ph; + pagetable_t pagetable = 0, oldpagetable; + struct proc *p = myproc(); 80004bc0: 8fcfd0ef jal 80001cbc <myproc> 80004bc4: 84aa mv s1,a0 + + begin_op(); 80004bc6: dc6ff0ef jal 8000418c <begin_op> + + if((ip = namei(path)) == 0){ 80004bca: 854a mv a0,s2 80004bcc: c04ff0ef jal 80003fd0 <namei> 80004bd0: c931 beqz a0,80004c24 <exec+0x80> 80004bd2: f3d2 sd s4,480(sp) 80004bd4: 8a2a mv s4,a0 + end_op(); + return -1; + } + ilock(ip); 80004bd6: d1ffe0ef jal 800038f4 <ilock> + + // Check ELF header + if(readi(ip, 0, (uint64)&elf, 0, sizeof(elf)) != sizeof(elf)) 80004bda: 04000713 li a4,64 80004bde: 4681 li a3,0 80004be0: e5040613 addi a2,s0,-432 @@ -8240,25 +9275,41 @@ devintr() 80004be8: f61fe0ef jal 80003b48 <readi> 80004bec: 04000793 li a5,64 80004bf0: 00f51a63 bne a0,a5,80004c04 <exec+0x60> + goto bad; + + if(elf.magic != ELF_MAGIC) 80004bf4: e5042703 lw a4,-432(s0) 80004bf8: 464c47b7 lui a5,0x464c4 80004bfc: 57f78793 addi a5,a5,1407 # 464c457f <_entry-0x39b3ba81> 80004c00: 02f70663 beq a4,a5,80004c2c <exec+0x88> + + bad: + if(pagetable) + proc_freepagetable(pagetable, sz); + if(ip){ + iunlockput(ip); 80004c04: 8552 mv a0,s4 80004c06: ef9fe0ef jal 80003afe <iunlockput> + end_op(); 80004c0a: decff0ef jal 800041f6 <end_op> + } + return -1; 80004c0e: 557d li a0,-1 80004c10: 7a1e ld s4,480(sp) +} 80004c12: 20813083 ld ra,520(sp) 80004c16: 20013403 ld s0,512(sp) 80004c1a: 74fe ld s1,504(sp) 80004c1c: 795e ld s2,496(sp) 80004c1e: 21010113 addi sp,sp,528 80004c22: 8082 ret + end_op(); 80004c24: dd2ff0ef jal 800041f6 <end_op> + return -1; 80004c28: 557d li a0,-1 80004c2a: b7e5 j 80004c12 <exec+0x6e> 80004c2c: ebda sd s6,464(sp) + if((pagetable = proc_pagetable(p)) == 0) 80004c2e: 8526 mv a0,s1 80004c30: 95cfd0ef jal 80001d8c <proc_pagetable> 80004c34: 8b2a mv s6,a0 @@ -8269,21 +9320,37 @@ devintr() 80004c40: e3e2 sd s8,448(sp) 80004c42: ff66 sd s9,440(sp) 80004c44: fb6a sd s10,432(sp) + for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){ 80004c46: e7042d03 lw s10,-400(s0) 80004c4a: e8845783 lhu a5,-376(s0) 80004c4e: 12078963 beqz a5,80004d80 <exec+0x1dc> 80004c52: f76e sd s11,424(sp) + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; 80004c54: 4901 li s2,0 + for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){ 80004c56: 4d81 li s11,0 + if(ph.vaddr % PGSIZE != 0) 80004c58: 6c85 lui s9,0x1 80004c5a: fffc8793 addi a5,s9,-1 # fff <_entry-0x7ffff001> 80004c5e: def43823 sd a5,-528(s0) + + for(i = 0; i < sz; i += PGSIZE){ + pa = walkaddr(pagetable, va + i); + if(pa == 0) + panic("loadseg: address should exist"); + if(sz - i < PGSIZE) 80004c62: 6a85 lui s5,0x1 80004c64: a085 j 80004cc4 <exec+0x120> + panic("loadseg: address should exist"); 80004c66: 00004517 auipc a0,0x4 80004c6a: eca50513 addi a0,a0,-310 # 80008b30 <etext+0xb30> 80004c6e: b27fb0ef jal 80000794 <panic> + if(sz - i < PGSIZE) 80004c72: 2481 sext.w s1,s1 + n = sz - i; + else + n = PGSIZE; + if(readi(ip, 0, (uint64)pa, offset+i, n) != n) 80004c74: 8726 mv a4,s1 80004c76: 012c06bb addw a3,s8,s2 80004c7a: 4581 li a1,0 @@ -8291,25 +9358,32 @@ devintr() 80004c7e: ecbfe0ef jal 80003b48 <readi> 80004c82: 2501 sext.w a0,a0 80004c84: 24a49a63 bne s1,a0,80004ed8 <exec+0x334> + for(i = 0; i < sz; i += PGSIZE){ 80004c88: 012a893b addw s2,s5,s2 80004c8c: 03397363 bgeu s2,s3,80004cb2 <exec+0x10e> + pa = walkaddr(pagetable, va + i); 80004c90: 02091593 slli a1,s2,0x20 80004c94: 9181 srli a1,a1,0x20 80004c96: 95de add a1,a1,s7 80004c98: 855a mv a0,s6 80004c9a: e3efc0ef jal 800012d8 <walkaddr> 80004c9e: 862a mv a2,a0 + if(pa == 0) 80004ca0: d179 beqz a0,80004c66 <exec+0xc2> + if(sz - i < PGSIZE) 80004ca2: 412984bb subw s1,s3,s2 80004ca6: 0004879b sext.w a5,s1 80004caa: fcfcf4e3 bgeu s9,a5,80004c72 <exec+0xce> 80004cae: 84d6 mv s1,s5 80004cb0: b7c9 j 80004c72 <exec+0xce> + sz = sz1; 80004cb2: e0843903 ld s2,-504(s0) + for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){ 80004cb6: 2d85 addiw s11,s11,1 80004cb8: 038d0d1b addiw s10,s10,56 80004cbc: e8845783 lhu a5,-376(s0) 80004cc0: 08fdd063 bge s11,a5,80004d40 <exec+0x19c> + if(readi(ip, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph)) 80004cc4: 2d01 sext.w s10,s10 80004cc6: 03800713 li a4,56 80004cca: 86ea mv a3,s10 @@ -8319,18 +9393,23 @@ devintr() 80004cd4: e75fe0ef jal 80003b48 <readi> 80004cd8: 03800793 li a5,56 80004cdc: 1cf51663 bne a0,a5,80004ea8 <exec+0x304> + if(ph.type != ELF_PROG_LOAD) 80004ce0: e1842783 lw a5,-488(s0) 80004ce4: 4705 li a4,1 80004ce6: fce798e3 bne a5,a4,80004cb6 <exec+0x112> + if(ph.memsz < ph.filesz) 80004cea: e4043483 ld s1,-448(s0) 80004cee: e3843783 ld a5,-456(s0) 80004cf2: 1af4ef63 bltu s1,a5,80004eb0 <exec+0x30c> + if(ph.vaddr + ph.memsz < ph.vaddr) 80004cf6: e2843783 ld a5,-472(s0) 80004cfa: 94be add s1,s1,a5 80004cfc: 1af4ee63 bltu s1,a5,80004eb8 <exec+0x314> + if(ph.vaddr % PGSIZE != 0) 80004d00: df043703 ld a4,-528(s0) 80004d04: 8ff9 and a5,a5,a4 80004d06: 1a079d63 bnez a5,80004ec0 <exec+0x31c> + if((sz1 = uvmalloc(pagetable, sz, ph.vaddr + ph.memsz, flags2perm(ph.flags))) == 0) 80004d0a: e1c42503 lw a0,-484(s0) 80004d0e: e7dff0ef jal 80004b8a <flags2perm> 80004d12: 86aa mv a3,a0 @@ -8340,26 +9419,35 @@ devintr() 80004d1a: 9a7fc0ef jal 800016c0 <uvmalloc> 80004d1e: e0a43423 sd a0,-504(s0) 80004d22: 1a050363 beqz a0,80004ec8 <exec+0x324> + if(loadseg(pagetable, ph.vaddr, ip, ph.off, ph.filesz) < 0) 80004d26: e2843b83 ld s7,-472(s0) 80004d2a: e2042c03 lw s8,-480(s0) 80004d2e: e3842983 lw s3,-456(s0) + for(i = 0; i < sz; i += PGSIZE){ 80004d32: 00098463 beqz s3,80004d3a <exec+0x196> 80004d36: 4901 li s2,0 80004d38: bfa1 j 80004c90 <exec+0xec> + sz = sz1; 80004d3a: e0843903 ld s2,-504(s0) 80004d3e: bfa5 j 80004cb6 <exec+0x112> 80004d40: 7dba ld s11,424(sp) + iunlockput(ip); 80004d42: 8552 mv a0,s4 80004d44: dbbfe0ef jal 80003afe <iunlockput> + end_op(); 80004d48: caeff0ef jal 800041f6 <end_op> + p = myproc(); 80004d4c: f71fc0ef jal 80001cbc <myproc> 80004d50: 8aaa mv s5,a0 + uint64 oldsz = p->sz; 80004d52: 05053c83 ld s9,80(a0) + sz = PGROUNDUP(sz); 80004d56: 6985 lui s3,0x1 80004d58: 19fd addi s3,s3,-1 # fff <_entry-0x7ffff001> 80004d5a: 99ca add s3,s3,s2 80004d5c: 77fd lui a5,0xfffff 80004d5e: 00f9f9b3 and s3,s3,a5 + if((sz1 = uvmalloc(pagetable, sz, sz + (USERSTACK+1)*PGSIZE, PTE_W)) == 0) 80004d62: 4691 li a3,4 80004d64: 6609 lui a2,0x2 80004d66: 964e add a2,a2,s3 @@ -8369,28 +9457,37 @@ devintr() 80004d70: 892a mv s2,a0 80004d72: e0a43423 sd a0,-504(s0) 80004d76: e519 bnez a0,80004d84 <exec+0x1e0> + if(pagetable) 80004d78: e1343423 sd s3,-504(s0) 80004d7c: 4a01 li s4,0 80004d7e: aab1 j 80004eda <exec+0x336> + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; 80004d80: 4901 li s2,0 80004d82: b7c1 j 80004d42 <exec+0x19e> + uvmclear(pagetable, sz-(USERSTACK+1)*PGSIZE); 80004d84: 75f9 lui a1,0xffffe 80004d86: 95aa add a1,a1,a0 80004d88: 855a mv a0,s6 80004d8a: b2bfc0ef jal 800018b4 <uvmclear> + stackbase = sp - USERSTACK*PGSIZE; 80004d8e: 7bfd lui s7,0xfffff 80004d90: 9bca add s7,s7,s2 + for(argc = 0; argv[argc]; argc++) { 80004d92: e0043783 ld a5,-512(s0) 80004d96: 6388 ld a0,0(a5) 80004d98: cd39 beqz a0,80004df6 <exec+0x252> 80004d9a: e9040993 addi s3,s0,-368 80004d9e: f9040c13 addi s8,s0,-112 80004da2: 4481 li s1,0 + sp -= strlen(argv[argc]) + 1; 80004da4: b2afc0ef jal 800010ce <strlen> 80004da8: 0015079b addiw a5,a0,1 80004dac: 40f907b3 sub a5,s2,a5 + sp -= sp % 16; // riscv sp must be 16-byte aligned 80004db0: ff07f913 andi s2,a5,-16 + if(sp < stackbase) 80004db4: 11796e63 bltu s2,s7,80004ed0 <exec+0x32c> + if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0) 80004db8: e0043d03 ld s10,-512(s0) 80004dbc: 000d3a03 ld s4,0(s10) 80004dc0: 8552 mv a0,s4 @@ -8401,62 +9498,88 @@ devintr() 80004dce: 855a mv a0,s6 80004dd0: b0ffc0ef jal 800018de <copyout> 80004dd4: 10054063 bltz a0,80004ed4 <exec+0x330> + ustack[argc] = sp; 80004dd8: 0129b023 sd s2,0(s3) + for(argc = 0; argv[argc]; argc++) { 80004ddc: 0485 addi s1,s1,1 80004dde: 008d0793 addi a5,s10,8 80004de2: e0f43023 sd a5,-512(s0) 80004de6: 008d3503 ld a0,8(s10) 80004dea: c909 beqz a0,80004dfc <exec+0x258> + if(argc >= MAXARG) 80004dec: 09a1 addi s3,s3,8 80004dee: fb899be3 bne s3,s8,80004da4 <exec+0x200> + ip = 0; 80004df2: 4a01 li s4,0 80004df4: a0dd j 80004eda <exec+0x336> + sp = sz; 80004df6: e0843903 ld s2,-504(s0) + for(argc = 0; argv[argc]; argc++) { 80004dfa: 4481 li s1,0 + ustack[argc] = 0; 80004dfc: 00349793 slli a5,s1,0x3 80004e00: f9078793 addi a5,a5,-112 # ffffffffffffef90 <end+0xffffffff7ffb1558> 80004e04: 97a2 add a5,a5,s0 80004e06: f007b023 sd zero,-256(a5) + sp -= (argc+1) * sizeof(uint64); 80004e0a: 00148693 addi a3,s1,1 80004e0e: 068e slli a3,a3,0x3 80004e10: 40d90933 sub s2,s2,a3 + sp -= sp % 16; 80004e14: ff097913 andi s2,s2,-16 + sz = sz1; 80004e18: e0843983 ld s3,-504(s0) + if(sp < stackbase) 80004e1c: f5796ee3 bltu s2,s7,80004d78 <exec+0x1d4> + if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0) 80004e20: e9040613 addi a2,s0,-368 80004e24: 85ca mv a1,s2 80004e26: 855a mv a0,s6 80004e28: ab7fc0ef jal 800018de <copyout> 80004e2c: 0e054263 bltz a0,80004f10 <exec+0x36c> + p->trapframe->a1 = sp; 80004e30: 060ab783 ld a5,96(s5) # 1060 <_entry-0x7fffefa0> 80004e34: 0727bc23 sd s2,120(a5) + for(last=s=path; *s; s++) 80004e38: df843783 ld a5,-520(s0) 80004e3c: 0007c703 lbu a4,0(a5) 80004e40: cf11 beqz a4,80004e5c <exec+0x2b8> 80004e42: 0785 addi a5,a5,1 + if(*s == '/') 80004e44: 02f00693 li a3,47 80004e48: a039 j 80004e56 <exec+0x2b2> + last = s+1; 80004e4a: def43c23 sd a5,-520(s0) + for(last=s=path; *s; s++) 80004e4e: 0785 addi a5,a5,1 80004e50: fff7c703 lbu a4,-1(a5) 80004e54: c701 beqz a4,80004e5c <exec+0x2b8> + if(*s == '/') 80004e56: fed71ce3 bne a4,a3,80004e4e <exec+0x2aa> 80004e5a: bfc5 j 80004e4a <exec+0x2a6> + safestrcpy(p->name, last, sizeof(p->name)); 80004e5c: 4641 li a2,16 80004e5e: df843583 ld a1,-520(s0) 80004e62: 160a8513 addi a0,s5,352 80004e66: a36fc0ef jal 8000109c <safestrcpy> + oldpagetable = p->pagetable; 80004e6a: 058ab503 ld a0,88(s5) + p->pagetable = pagetable; 80004e6e: 056abc23 sd s6,88(s5) + p->sz = sz; 80004e72: e0843783 ld a5,-504(s0) 80004e76: 04fab823 sd a5,80(s5) + p->trapframe->epc = elf.entry; // initial program counter = main 80004e7a: 060ab783 ld a5,96(s5) 80004e7e: e6843703 ld a4,-408(s0) 80004e82: ef98 sd a4,24(a5) + p->trapframe->sp = sp; // initial stack pointer 80004e84: 060ab783 ld a5,96(s5) 80004e88: 0327b823 sd s2,48(a5) + proc_freepagetable(oldpagetable, oldsz); 80004e8c: 85e6 mv a1,s9 80004e8e: fa5fc0ef jal 80001e32 <proc_freepagetable> + return argc; // this ends up in a0, the first argument to main(argc, argv) 80004e92: 0004851b sext.w a0,s1 80004e96: 79be ld s3,488(sp) 80004e98: 7a1e ld s4,480(sp) @@ -8482,15 +9605,20 @@ devintr() 80004ec8: e1243423 sd s2,-504(s0) 80004ecc: 7dba ld s11,424(sp) 80004ece: a031 j 80004eda <exec+0x336> + ip = 0; 80004ed0: 4a01 li s4,0 80004ed2: a021 j 80004eda <exec+0x336> 80004ed4: 4a01 li s4,0 + if(pagetable) 80004ed6: a011 j 80004eda <exec+0x336> 80004ed8: 7dba ld s11,424(sp) + proc_freepagetable(pagetable, sz); 80004eda: e0843583 ld a1,-504(s0) 80004ede: 855a mv a0,s6 80004ee0: f53fc0ef jal 80001e32 <proc_freepagetable> + return -1; 80004ee4: 557d li a0,-1 + if(ip){ 80004ee6: 000a1b63 bnez s4,80004efc <exec+0x358> 80004eea: 79be ld s3,488(sp) 80004eec: 7a1e ld s4,480(sp) @@ -8511,6 +9639,7 @@ devintr() 80004f0a: b9ed j 80004c04 <exec+0x60> 80004f0c: 6b5e ld s6,464(sp) 80004f0e: b9dd j 80004c04 <exec+0x60> + sz = sz1; 80004f10: e0843983 ld s3,-504(s0) 80004f14: b595 j 80004d78 <exec+0x1d4> @@ -9612,47 +10741,79 @@ devintr() ... 0000000080005ace <plicinit>: +// the riscv Platform Level Interrupt Controller (PLIC). +// + +void +plicinit(void) +{ 80005ace: 1141 addi sp,sp,-16 80005ad0: e422 sd s0,8(sp) 80005ad2: 0800 addi s0,sp,16 + // set desired IRQ priorities non-zero (otherwise disabled). + *(uint32*)(PLIC + UART0_IRQ*4) = 1; 80005ad4: 0c0007b7 lui a5,0xc000 80005ad8: 4705 li a4,1 80005ada: d798 sw a4,40(a5) + *(uint32*)(PLIC + VIRTIO0_IRQ*4) = 1; 80005adc: 0c0007b7 lui a5,0xc000 80005ae0: c3d8 sw a4,4(a5) +} 80005ae2: 6422 ld s0,8(sp) 80005ae4: 0141 addi sp,sp,16 80005ae6: 8082 ret 0000000080005ae8 <plicinithart>: + +void +plicinithart(void) +{ 80005ae8: 1141 addi sp,sp,-16 80005aea: e406 sd ra,8(sp) 80005aec: e022 sd s0,0(sp) 80005aee: 0800 addi s0,sp,16 + int hart = cpuid(); 80005af0: 9a0fc0ef jal 80001c90 <cpuid> + + // set enable bits for this hart's S-mode + // for the uart and virtio disk. + *(uint32*)PLIC_SENABLE(hart) = (1 << UART0_IRQ) | (1 << VIRTIO0_IRQ); 80005af4: 0085171b slliw a4,a0,0x8 80005af8: 0c0027b7 lui a5,0xc002 80005afc: 97ba add a5,a5,a4 80005afe: 40200713 li a4,1026 80005b02: 08e7a023 sw a4,128(a5) # c002080 <_entry-0x73ffdf80> + + // set this hart's S-mode priority threshold to 0. + *(uint32*)PLIC_SPRIORITY(hart) = 0; 80005b06: 00d5151b slliw a0,a0,0xd 80005b0a: 0c2017b7 lui a5,0xc201 80005b0e: 97aa add a5,a5,a0 80005b10: 0007a023 sw zero,0(a5) # c201000 <_entry-0x73dff000> +} 80005b14: 60a2 ld ra,8(sp) 80005b16: 6402 ld s0,0(sp) 80005b18: 0141 addi sp,sp,16 80005b1a: 8082 ret 0000000080005b1c <plic_claim>: + +// ask the PLIC what interrupt we should serve. +int +plic_claim(void) +{ 80005b1c: 1141 addi sp,sp,-16 80005b1e: e406 sd ra,8(sp) 80005b20: e022 sd s0,0(sp) 80005b22: 0800 addi s0,sp,16 + int hart = cpuid(); 80005b24: 96cfc0ef jal 80001c90 <cpuid> + int irq = *(uint32*)PLIC_SCLAIM(hart); 80005b28: 00d5151b slliw a0,a0,0xd 80005b2c: 0c2017b7 lui a5,0xc201 80005b30: 97aa add a5,a5,a0 + return irq; +} 80005b32: 43c8 lw a0,4(a5) 80005b34: 60a2 ld ra,8(sp) 80005b36: 6402 ld s0,0(sp) @@ -9660,17 +10821,25 @@ devintr() 80005b3a: 8082 ret 0000000080005b3c <plic_complete>: + +// tell the PLIC we've served this IRQ. +void +plic_complete(int irq) +{ 80005b3c: 1101 addi sp,sp,-32 80005b3e: ec06 sd ra,24(sp) 80005b40: e822 sd s0,16(sp) 80005b42: e426 sd s1,8(sp) 80005b44: 1000 addi s0,sp,32 80005b46: 84aa mv s1,a0 + int hart = cpuid(); 80005b48: 948fc0ef jal 80001c90 <cpuid> + *(uint32*)PLIC_SCLAIM(hart) = irq; 80005b4c: 00d5151b slliw a0,a0,0xd 80005b50: 0c2017b7 lui a5,0xc201 80005b54: 97aa add a5,a5,a0 80005b56: c3c4 sw s1,4(a5) +} 80005b58: 60e2 ld ra,24(sp) 80005b5a: 6442 ld s0,16(sp) 80005b5c: 64a2 ld s1,8(sp) @@ -9678,227 +10847,168 @@ devintr() 80005b60: 8082 ret 0000000080005b62 <free_desc>: -} - -// mark a descriptor as free. -static void -free_desc(int i) -{ 80005b62: 1141 addi sp,sp,-16 80005b64: e406 sd ra,8(sp) 80005b66: e022 sd s0,0(sp) 80005b68: 0800 addi s0,sp,16 - if(i >= NUM) 80005b6a: 479d li a5,7 80005b6c: 04a7ca63 blt a5,a0,80005bc0 <free_desc+0x5e> - panic("free_desc 1"); - if(disk.free[i]) 80005b70: 00048797 auipc a5,0x48 80005b74: d8878793 addi a5,a5,-632 # 8004d8f8 <disk> 80005b78: 97aa add a5,a5,a0 80005b7a: 0187c783 lbu a5,24(a5) 80005b7e: e7b9 bnez a5,80005bcc <free_desc+0x6a> - panic("free_desc 2"); - disk.desc[i].addr = 0; 80005b80: 00451693 slli a3,a0,0x4 80005b84: 00048797 auipc a5,0x48 80005b88: d7478793 addi a5,a5,-652 # 8004d8f8 <disk> 80005b8c: 6398 ld a4,0(a5) 80005b8e: 9736 add a4,a4,a3 80005b90: 00073023 sd zero,0(a4) - disk.desc[i].len = 0; 80005b94: 6398 ld a4,0(a5) 80005b96: 9736 add a4,a4,a3 80005b98: 00072423 sw zero,8(a4) - disk.desc[i].flags = 0; 80005b9c: 00071623 sh zero,12(a4) - disk.desc[i].next = 0; 80005ba0: 00071723 sh zero,14(a4) - disk.free[i] = 1; 80005ba4: 97aa add a5,a5,a0 80005ba6: 4705 li a4,1 80005ba8: 00e78c23 sb a4,24(a5) - wakeup(&disk.free[0]); 80005bac: 00048517 auipc a0,0x48 80005bb0: d6450513 addi a0,a0,-668 # 8004d910 <disk+0x18> 80005bb4: fa4fc0ef jal 80002358 <wakeup> -} 80005bb8: 60a2 ld ra,8(sp) 80005bba: 6402 ld s0,0(sp) 80005bbc: 0141 addi sp,sp,16 80005bbe: 8082 ret - panic("free_desc 1"); 80005bc0: 00003517 auipc a0,0x3 80005bc4: ff050513 addi a0,a0,-16 # 80008bb0 <etext+0xbb0> 80005bc8: bcdfa0ef jal 80000794 <panic> - panic("free_desc 2"); 80005bcc: 00003517 auipc a0,0x3 80005bd0: ff450513 addi a0,a0,-12 # 80008bc0 <etext+0xbc0> 80005bd4: bc1fa0ef jal 80000794 <panic> 0000000080005bd8 <virtio_disk_init>: -{ 80005bd8: 1101 addi sp,sp,-32 80005bda: ec06 sd ra,24(sp) 80005bdc: e822 sd s0,16(sp) 80005bde: e426 sd s1,8(sp) 80005be0: e04a sd s2,0(sp) 80005be2: 1000 addi s0,sp,32 - initlock(&disk.vdisk_lock, "virtio_disk"); 80005be4: 00003597 auipc a1,0x3 80005be8: fec58593 addi a1,a1,-20 # 80008bd0 <etext+0xbd0> 80005bec: 00048517 auipc a0,0x48 80005bf0: e3450513 addi a0,a0,-460 # 8004da20 <disk+0x128> 80005bf4: a16fb0ef jal 80000e0a <initlock> - if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 || 80005bf8: 100017b7 lui a5,0x10001 80005bfc: 4398 lw a4,0(a5) 80005bfe: 2701 sext.w a4,a4 80005c00: 747277b7 lui a5,0x74727 80005c04: 97678793 addi a5,a5,-1674 # 74726976 <_entry-0xb8d968a> 80005c08: 18f71063 bne a4,a5,80005d88 <virtio_disk_init+0x1b0> - *R(VIRTIO_MMIO_VERSION) != 2 || 80005c0c: 100017b7 lui a5,0x10001 80005c10: 0791 addi a5,a5,4 # 10001004 <_entry-0x6fffeffc> 80005c12: 439c lw a5,0(a5) 80005c14: 2781 sext.w a5,a5 - if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 || 80005c16: 4709 li a4,2 80005c18: 16e79863 bne a5,a4,80005d88 <virtio_disk_init+0x1b0> - *R(VIRTIO_MMIO_DEVICE_ID) != 2 || 80005c1c: 100017b7 lui a5,0x10001 80005c20: 07a1 addi a5,a5,8 # 10001008 <_entry-0x6fffeff8> 80005c22: 439c lw a5,0(a5) 80005c24: 2781 sext.w a5,a5 - *R(VIRTIO_MMIO_VERSION) != 2 || 80005c26: 16e79163 bne a5,a4,80005d88 <virtio_disk_init+0x1b0> - *R(VIRTIO_MMIO_VENDOR_ID) != 0x554d4551){ 80005c2a: 100017b7 lui a5,0x10001 80005c2e: 47d8 lw a4,12(a5) 80005c30: 2701 sext.w a4,a4 - *R(VIRTIO_MMIO_DEVICE_ID) != 2 || 80005c32: 554d47b7 lui a5,0x554d4 80005c36: 55178793 addi a5,a5,1361 # 554d4551 <_entry-0x2ab2baaf> 80005c3a: 14f71763 bne a4,a5,80005d88 <virtio_disk_init+0x1b0> - *R(VIRTIO_MMIO_STATUS) = status; 80005c3e: 100017b7 lui a5,0x10001 80005c42: 0607a823 sw zero,112(a5) # 10001070 <_entry-0x6fffef90> - *R(VIRTIO_MMIO_STATUS) = status; 80005c46: 4705 li a4,1 80005c48: dbb8 sw a4,112(a5) - *R(VIRTIO_MMIO_STATUS) = status; 80005c4a: 470d li a4,3 80005c4c: dbb8 sw a4,112(a5) - uint64 features = *R(VIRTIO_MMIO_DEVICE_FEATURES); 80005c4e: 10001737 lui a4,0x10001 80005c52: 4b14 lw a3,16(a4) - features &= ~(1 << VIRTIO_RING_F_INDIRECT_DESC); 80005c54: c7ffe737 lui a4,0xc7ffe 80005c58: 75f70713 addi a4,a4,1887 # ffffffffc7ffe75f <end+0xffffffff47fb0d27> - *R(VIRTIO_MMIO_DRIVER_FEATURES) = features; 80005c5c: 8ef9 and a3,a3,a4 80005c5e: 10001737 lui a4,0x10001 80005c62: d314 sw a3,32(a4) - *R(VIRTIO_MMIO_STATUS) = status; 80005c64: 472d li a4,11 80005c66: dbb8 sw a4,112(a5) - *R(VIRTIO_MMIO_STATUS) = status; 80005c68: 07078793 addi a5,a5,112 - status = *R(VIRTIO_MMIO_STATUS); 80005c6c: 439c lw a5,0(a5) 80005c6e: 0007891b sext.w s2,a5 - if(!(status & VIRTIO_CONFIG_S_FEATURES_OK)) 80005c72: 8ba1 andi a5,a5,8 80005c74: 12078063 beqz a5,80005d94 <virtio_disk_init+0x1bc> - *R(VIRTIO_MMIO_QUEUE_SEL) = 0; 80005c78: 100017b7 lui a5,0x10001 80005c7c: 0207a823 sw zero,48(a5) # 10001030 <_entry-0x6fffefd0> - if(*R(VIRTIO_MMIO_QUEUE_READY)) 80005c80: 100017b7 lui a5,0x10001 80005c84: 04478793 addi a5,a5,68 # 10001044 <_entry-0x6fffefbc> 80005c88: 439c lw a5,0(a5) 80005c8a: 2781 sext.w a5,a5 80005c8c: 10079a63 bnez a5,80005da0 <virtio_disk_init+0x1c8> - uint32 max = *R(VIRTIO_MMIO_QUEUE_NUM_MAX); 80005c90: 100017b7 lui a5,0x10001 80005c94: 03478793 addi a5,a5,52 # 10001034 <_entry-0x6fffefcc> 80005c98: 439c lw a5,0(a5) 80005c9a: 2781 sext.w a5,a5 - if(max == 0) 80005c9c: 10078863 beqz a5,80005dac <virtio_disk_init+0x1d4> - if(max < NUM) 80005ca0: 471d li a4,7 80005ca2: 10f77b63 bgeu a4,a5,80005db8 <virtio_disk_init+0x1e0> - disk.desc = kalloc(); 80005ca6: fa5fa0ef jal 80000c4a <kalloc> 80005caa: 00048497 auipc s1,0x48 80005cae: c4e48493 addi s1,s1,-946 # 8004d8f8 <disk> 80005cb2: e088 sd a0,0(s1) - disk.avail = kalloc(); 80005cb4: f97fa0ef jal 80000c4a <kalloc> 80005cb8: e488 sd a0,8(s1) - disk.used = kalloc(); 80005cba: f91fa0ef jal 80000c4a <kalloc> 80005cbe: 87aa mv a5,a0 80005cc0: e888 sd a0,16(s1) - if(!disk.desc || !disk.avail || !disk.used) 80005cc2: 6088 ld a0,0(s1) 80005cc4: 10050063 beqz a0,80005dc4 <virtio_disk_init+0x1ec> 80005cc8: 00048717 auipc a4,0x48 80005ccc: c3873703 ld a4,-968(a4) # 8004d900 <disk+0x8> 80005cd0: 0e070a63 beqz a4,80005dc4 <virtio_disk_init+0x1ec> 80005cd4: 0e078863 beqz a5,80005dc4 <virtio_disk_init+0x1ec> - memset(disk.desc, 0, PGSIZE); 80005cd8: 6605 lui a2,0x1 80005cda: 4581 li a1,0 80005cdc: a82fb0ef jal 80000f5e <memset> - memset(disk.avail, 0, PGSIZE); 80005ce0: 00048497 auipc s1,0x48 80005ce4: c1848493 addi s1,s1,-1000 # 8004d8f8 <disk> 80005ce8: 6605 lui a2,0x1 80005cea: 4581 li a1,0 80005cec: 6488 ld a0,8(s1) 80005cee: a70fb0ef jal 80000f5e <memset> - memset(disk.used, 0, PGSIZE); 80005cf2: 6605 lui a2,0x1 80005cf4: 4581 li a1,0 80005cf6: 6888 ld a0,16(s1) 80005cf8: a66fb0ef jal 80000f5e <memset> - *R(VIRTIO_MMIO_QUEUE_NUM) = NUM; 80005cfc: 100017b7 lui a5,0x10001 80005d00: 4721 li a4,8 80005d02: df98 sw a4,56(a5) - *R(VIRTIO_MMIO_QUEUE_DESC_LOW) = (uint64)disk.desc; 80005d04: 4098 lw a4,0(s1) 80005d06: 100017b7 lui a5,0x10001 80005d0a: 08e7a023 sw a4,128(a5) # 10001080 <_entry-0x6fffef80> - *R(VIRTIO_MMIO_QUEUE_DESC_HIGH) = (uint64)disk.desc >> 32; 80005d0e: 40d8 lw a4,4(s1) 80005d10: 100017b7 lui a5,0x10001 80005d14: 08e7a223 sw a4,132(a5) # 10001084 <_entry-0x6fffef7c> - *R(VIRTIO_MMIO_DRIVER_DESC_LOW) = (uint64)disk.avail; 80005d18: 649c ld a5,8(s1) 80005d1a: 0007869b sext.w a3,a5 80005d1e: 10001737 lui a4,0x10001 80005d22: 08d72823 sw a3,144(a4) # 10001090 <_entry-0x6fffef70> - *R(VIRTIO_MMIO_DRIVER_DESC_HIGH) = (uint64)disk.avail >> 32; 80005d26: 9781 srai a5,a5,0x20 80005d28: 10001737 lui a4,0x10001 80005d2c: 08f72a23 sw a5,148(a4) # 10001094 <_entry-0x6fffef6c> - *R(VIRTIO_MMIO_DEVICE_DESC_LOW) = (uint64)disk.used; 80005d30: 689c ld a5,16(s1) 80005d32: 0007869b sext.w a3,a5 80005d36: 10001737 lui a4,0x10001 80005d3a: 0ad72023 sw a3,160(a4) # 100010a0 <_entry-0x6fffef60> - *R(VIRTIO_MMIO_DEVICE_DESC_HIGH) = (uint64)disk.used >> 32; 80005d3e: 9781 srai a5,a5,0x20 80005d40: 10001737 lui a4,0x10001 80005d44: 0af72223 sw a5,164(a4) # 100010a4 <_entry-0x6fffef5c> - *R(VIRTIO_MMIO_QUEUE_READY) = 0x1; 80005d48: 10001737 lui a4,0x10001 80005d4c: 4785 li a5,1 80005d4e: c37c sw a5,68(a4) - disk.free[i] = 1; 80005d50: 00f48c23 sb a5,24(s1) 80005d54: 00f48ca3 sb a5,25(s1) 80005d58: 00f48d23 sb a5,26(s1) @@ -9907,50 +11017,35 @@ free_desc(int i) 80005d64: 00f48ea3 sb a5,29(s1) 80005d68: 00f48f23 sb a5,30(s1) 80005d6c: 00f48fa3 sb a5,31(s1) - status |= VIRTIO_CONFIG_S_DRIVER_OK; 80005d70: 00496913 ori s2,s2,4 - *R(VIRTIO_MMIO_STATUS) = status; 80005d74: 100017b7 lui a5,0x10001 80005d78: 0727a823 sw s2,112(a5) # 10001070 <_entry-0x6fffef90> -} 80005d7c: 60e2 ld ra,24(sp) 80005d7e: 6442 ld s0,16(sp) 80005d80: 64a2 ld s1,8(sp) 80005d82: 6902 ld s2,0(sp) 80005d84: 6105 addi sp,sp,32 80005d86: 8082 ret - panic("could not find virtio disk"); 80005d88: 00003517 auipc a0,0x3 80005d8c: e5850513 addi a0,a0,-424 # 80008be0 <etext+0xbe0> 80005d90: a05fa0ef jal 80000794 <panic> - panic("virtio disk FEATURES_OK unset"); 80005d94: 00003517 auipc a0,0x3 80005d98: e6c50513 addi a0,a0,-404 # 80008c00 <etext+0xc00> 80005d9c: 9f9fa0ef jal 80000794 <panic> - panic("virtio disk should not be ready"); 80005da0: 00003517 auipc a0,0x3 80005da4: e8050513 addi a0,a0,-384 # 80008c20 <etext+0xc20> 80005da8: 9edfa0ef jal 80000794 <panic> - panic("virtio disk has no queue 0"); 80005dac: 00003517 auipc a0,0x3 80005db0: e9450513 addi a0,a0,-364 # 80008c40 <etext+0xc40> 80005db4: 9e1fa0ef jal 80000794 <panic> - panic("virtio disk max queue too short"); 80005db8: 00003517 auipc a0,0x3 80005dbc: ea850513 addi a0,a0,-344 # 80008c60 <etext+0xc60> 80005dc0: 9d5fa0ef jal 80000794 <panic> - panic("virtio disk kalloc"); 80005dc4: 00003517 auipc a0,0x3 80005dc8: ebc50513 addi a0,a0,-324 # 80008c80 <etext+0xc80> 80005dcc: 9c9fa0ef jal 80000794 <panic> 0000000080005dd0 <virtio_disk_rw>: - return 0; -} - -void -virtio_disk_rw(struct buf *b, int write) -{ 80005dd0: 7159 addi sp,sp,-112 80005dd2: f486 sd ra,104(sp) 80005dd4: f0a2 sd s0,96(sp) @@ -9966,91 +11061,55 @@ virtio_disk_rw(struct buf *b, int write) 80005de8: 1880 addi s0,sp,112 80005dea: 8a2a mv s4,a0 80005dec: 8bae mv s7,a1 - uint64 sector = b->blockno * (BSIZE / 512); 80005dee: 00c52c83 lw s9,12(a0) 80005df2: 001c9c9b slliw s9,s9,0x1 80005df6: 1c82 slli s9,s9,0x20 80005df8: 020cdc93 srli s9,s9,0x20 - - acquire(&disk.vdisk_lock); 80005dfc: 00048517 auipc a0,0x48 80005e00: c2450513 addi a0,a0,-988 # 8004da20 <disk+0x128> 80005e04: 886fb0ef jal 80000e8a <acquire> - for(int i = 0; i < 3; i++){ 80005e08: 4981 li s3,0 - for(int i = 0; i < NUM; i++){ 80005e0a: 44a1 li s1,8 - disk.free[i] = 0; 80005e0c: 00048b17 auipc s6,0x48 80005e10: aecb0b13 addi s6,s6,-1300 # 8004d8f8 <disk> - for(int i = 0; i < 3; i++){ 80005e14: 4a8d li s5,3 - int idx[3]; - while(1){ - if(alloc3_desc(idx) == 0) { - break; - } - sleep(&disk.free[0], &disk.vdisk_lock); 80005e16: 00048c17 auipc s8,0x48 80005e1a: c0ac0c13 addi s8,s8,-1014 # 8004da20 <disk+0x128> 80005e1e: a8b9 j 80005e7c <virtio_disk_rw+0xac> - disk.free[i] = 0; 80005e20: 00fb0733 add a4,s6,a5 80005e24: 00070c23 sb zero,24(a4) # 10001018 <_entry-0x6fffefe8> - idx[i] = alloc_desc(); 80005e28: c19c sw a5,0(a1) - if(idx[i] < 0){ 80005e2a: 0207c563 bltz a5,80005e54 <virtio_disk_rw+0x84> - for(int i = 0; i < 3; i++){ 80005e2e: 2905 addiw s2,s2,1 80005e30: 0611 addi a2,a2,4 # 1004 <_entry-0x7fffeffc> 80005e32: 05590963 beq s2,s5,80005e84 <virtio_disk_rw+0xb4> - idx[i] = alloc_desc(); 80005e36: 85b2 mv a1,a2 - for(int i = 0; i < NUM; i++){ 80005e38: 00048717 auipc a4,0x48 80005e3c: ac070713 addi a4,a4,-1344 # 8004d8f8 <disk> 80005e40: 87ce mv a5,s3 - if(disk.free[i]){ 80005e42: 01874683 lbu a3,24(a4) 80005e46: fee9 bnez a3,80005e20 <virtio_disk_rw+0x50> - for(int i = 0; i < NUM; i++){ 80005e48: 2785 addiw a5,a5,1 80005e4a: 0705 addi a4,a4,1 80005e4c: fe979be3 bne a5,s1,80005e42 <virtio_disk_rw+0x72> - idx[i] = alloc_desc(); 80005e50: 57fd li a5,-1 80005e52: c19c sw a5,0(a1) - for(int j = 0; j < i; j++) 80005e54: 01205d63 blez s2,80005e6e <virtio_disk_rw+0x9e> - free_desc(idx[j]); 80005e58: f9042503 lw a0,-112(s0) 80005e5c: d07ff0ef jal 80005b62 <free_desc> - for(int j = 0; j < i; j++) 80005e60: 4785 li a5,1 80005e62: 0127d663 bge a5,s2,80005e6e <virtio_disk_rw+0x9e> - free_desc(idx[j]); 80005e66: f9442503 lw a0,-108(s0) 80005e6a: cf9ff0ef jal 80005b62 <free_desc> - sleep(&disk.free[0], &disk.vdisk_lock); 80005e6e: 85e2 mv a1,s8 80005e70: 00048517 auipc a0,0x48 80005e74: aa050513 addi a0,a0,-1376 # 8004d910 <disk+0x18> 80005e78: c94fc0ef jal 8000230c <sleep> - for(int i = 0; i < 3; i++){ 80005e7c: f9040613 addi a2,s0,-112 80005e80: 894e mv s2,s3 80005e82: bf55 j 80005e36 <virtio_disk_rw+0x66> - } - - // format the three descriptors. - // qemu's virtio-blk.c reads them. - - struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; 80005e84: f9042503 lw a0,-112(s0) 80005e88: 00451693 slli a3,a0,0x4 - - if(write) 80005e8c: 00048797 auipc a5,0x48 80005e90: a6c78793 addi a5,a5,-1428 # 8004d8f8 <disk> 80005e94: 00a50713 addi a4,a0,10 @@ -10058,130 +11117,77 @@ virtio_disk_rw(struct buf *b, int write) 80005e9a: 973e add a4,a4,a5 80005e9c: 01703633 snez a2,s7 80005ea0: c710 sw a2,8(a4) - buf0->type = VIRTIO_BLK_T_OUT; // write the disk - else - buf0->type = VIRTIO_BLK_T_IN; // read the disk - buf0->reserved = 0; 80005ea2: 00072623 sw zero,12(a4) - buf0->sector = sector; 80005ea6: 01973823 sd s9,16(a4) - - disk.desc[idx[0]].addr = (uint64) buf0; 80005eaa: 6398 ld a4,0(a5) 80005eac: 9736 add a4,a4,a3 - struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; 80005eae: 0a868613 addi a2,a3,168 80005eb2: 963e add a2,a2,a5 - disk.desc[idx[0]].addr = (uint64) buf0; 80005eb4: e310 sd a2,0(a4) - disk.desc[idx[0]].len = sizeof(struct virtio_blk_req); 80005eb6: 6390 ld a2,0(a5) 80005eb8: 00d605b3 add a1,a2,a3 80005ebc: 4741 li a4,16 80005ebe: c598 sw a4,8(a1) - disk.desc[idx[0]].flags = VRING_DESC_F_NEXT; 80005ec0: 4805 li a6,1 80005ec2: 01059623 sh a6,12(a1) - disk.desc[idx[0]].next = idx[1]; 80005ec6: f9442703 lw a4,-108(s0) 80005eca: 00e59723 sh a4,14(a1) - - disk.desc[idx[1]].addr = (uint64) b->data; 80005ece: 0712 slli a4,a4,0x4 80005ed0: 963a add a2,a2,a4 80005ed2: 058a0593 addi a1,s4,88 80005ed6: e20c sd a1,0(a2) - disk.desc[idx[1]].len = BSIZE; 80005ed8: 0007b883 ld a7,0(a5) 80005edc: 9746 add a4,a4,a7 80005ede: 40000613 li a2,1024 80005ee2: c710 sw a2,8(a4) - if(write) 80005ee4: 001bb613 seqz a2,s7 80005ee8: 0016161b slliw a2,a2,0x1 - disk.desc[idx[1]].flags = 0; // device reads b->data - else - disk.desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data - disk.desc[idx[1]].flags |= VRING_DESC_F_NEXT; 80005eec: 00166613 ori a2,a2,1 80005ef0: 00c71623 sh a2,12(a4) - disk.desc[idx[1]].next = idx[2]; 80005ef4: f9842583 lw a1,-104(s0) 80005ef8: 00b71723 sh a1,14(a4) - - disk.info[idx[0]].status = 0xff; // device writes 0 on success 80005efc: 00250613 addi a2,a0,2 80005f00: 0612 slli a2,a2,0x4 80005f02: 963e add a2,a2,a5 80005f04: 577d li a4,-1 80005f06: 00e60823 sb a4,16(a2) - disk.desc[idx[2]].addr = (uint64) &disk.info[idx[0]].status; 80005f0a: 0592 slli a1,a1,0x4 80005f0c: 98ae add a7,a7,a1 80005f0e: 03068713 addi a4,a3,48 80005f12: 973e add a4,a4,a5 80005f14: 00e8b023 sd a4,0(a7) - disk.desc[idx[2]].len = 1; 80005f18: 6398 ld a4,0(a5) 80005f1a: 972e add a4,a4,a1 80005f1c: 01072423 sw a6,8(a4) - disk.desc[idx[2]].flags = VRING_DESC_F_WRITE; // device writes the status 80005f20: 4689 li a3,2 80005f22: 00d71623 sh a3,12(a4) - disk.desc[idx[2]].next = 0; 80005f26: 00071723 sh zero,14(a4) - - // record struct buf for virtio_disk_intr(). - b->disk = 1; 80005f2a: 010a2223 sw a6,4(s4) - disk.info[idx[0]].b = b; 80005f2e: 01463423 sd s4,8(a2) - - // tell the device the first index in our chain of descriptors. - disk.avail->ring[disk.avail->idx % NUM] = idx[0]; 80005f32: 6794 ld a3,8(a5) 80005f34: 0026d703 lhu a4,2(a3) 80005f38: 8b1d andi a4,a4,7 80005f3a: 0706 slli a4,a4,0x1 80005f3c: 96ba add a3,a3,a4 80005f3e: 00a69223 sh a0,4(a3) - - __sync_synchronize(); 80005f42: 0330000f fence rw,rw - - // tell the device another avail ring entry is available. - disk.avail->idx += 1; // not % NUM ... 80005f46: 6798 ld a4,8(a5) 80005f48: 00275783 lhu a5,2(a4) 80005f4c: 2785 addiw a5,a5,1 80005f4e: 00f71123 sh a5,2(a4) - - __sync_synchronize(); 80005f52: 0330000f fence rw,rw - - *R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number 80005f56: 100017b7 lui a5,0x10001 80005f5a: 0407a823 sw zero,80(a5) # 10001050 <_entry-0x6fffefb0> - - // Wait for virtio_disk_intr() to say request has finished. - while(b->disk == 1) { 80005f5e: 004a2783 lw a5,4(s4) - sleep(b, &disk.vdisk_lock); 80005f62: 00048917 auipc s2,0x48 80005f66: abe90913 addi s2,s2,-1346 # 8004da20 <disk+0x128> - while(b->disk == 1) { 80005f6a: 4485 li s1,1 80005f6c: 01079a63 bne a5,a6,80005f80 <virtio_disk_rw+0x1b0> - sleep(b, &disk.vdisk_lock); 80005f70: 85ca mv a1,s2 80005f72: 8552 mv a0,s4 80005f74: b98fc0ef jal 8000230c <sleep> - while(b->disk == 1) { 80005f78: 004a2783 lw a5,4(s4) 80005f7c: fe978ae3 beq a5,s1,80005f70 <virtio_disk_rw+0x1a0> - } - - disk.info[idx[0]].b = 0; 80005f80: f9042903 lw s2,-112(s0) 80005f84: 00290713 addi a4,s2,2 80005f88: 0712 slli a4,a4,0x4 @@ -10189,28 +11195,20 @@ virtio_disk_rw(struct buf *b, int write) 80005f8e: 96e78793 addi a5,a5,-1682 # 8004d8f8 <disk> 80005f92: 97ba add a5,a5,a4 80005f94: 0007b423 sd zero,8(a5) - int flag = disk.desc[i].flags; 80005f98: 00048997 auipc s3,0x48 80005f9c: 96098993 addi s3,s3,-1696 # 8004d8f8 <disk> 80005fa0: 00491713 slli a4,s2,0x4 80005fa4: 0009b783 ld a5,0(s3) 80005fa8: 97ba add a5,a5,a4 80005faa: 00c7d483 lhu s1,12(a5) - int nxt = disk.desc[i].next; 80005fae: 854a mv a0,s2 80005fb0: 00e7d903 lhu s2,14(a5) - free_desc(i); 80005fb4: bafff0ef jal 80005b62 <free_desc> - if(flag & VRING_DESC_F_NEXT) 80005fb8: 8885 andi s1,s1,1 80005fba: f0fd bnez s1,80005fa0 <virtio_disk_rw+0x1d0> - free_chain(idx[0]); - - release(&disk.vdisk_lock); 80005fbc: 00048517 auipc a0,0x48 80005fc0: a6450513 addi a0,a0,-1436 # 8004da20 <disk+0x128> 80005fc4: f5ffa0ef jal 80000f22 <release> -} 80005fc8: 70a6 ld ra,104(sp) 80005fca: 7406 ld s0,96(sp) 80005fcc: 64e6 ld s1,88(sp) @@ -10226,95 +11224,60 @@ virtio_disk_rw(struct buf *b, int write) 80005fe0: 8082 ret 0000000080005fe2 <virtio_disk_intr>: - -void -virtio_disk_intr() -{ 80005fe2: 1101 addi sp,sp,-32 80005fe4: ec06 sd ra,24(sp) 80005fe6: e822 sd s0,16(sp) 80005fe8: e426 sd s1,8(sp) 80005fea: 1000 addi s0,sp,32 - acquire(&disk.vdisk_lock); 80005fec: 00048497 auipc s1,0x48 80005ff0: 90c48493 addi s1,s1,-1780 # 8004d8f8 <disk> 80005ff4: 00048517 auipc a0,0x48 80005ff8: a2c50513 addi a0,a0,-1492 # 8004da20 <disk+0x128> 80005ffc: e8ffa0ef jal 80000e8a <acquire> - // we've seen this interrupt, which the following line does. - // this may race with the device writing new entries to - // the "used" ring, in which case we may process the new - // completion entries in this interrupt, and have nothing to do - // in the next interrupt, which is harmless. - *R(VIRTIO_MMIO_INTERRUPT_ACK) = *R(VIRTIO_MMIO_INTERRUPT_STATUS) & 0x3; 80006000: 100017b7 lui a5,0x10001 80006004: 53b8 lw a4,96(a5) 80006006: 8b0d andi a4,a4,3 80006008: 100017b7 lui a5,0x10001 8000600c: d3f8 sw a4,100(a5) - - __sync_synchronize(); 8000600e: 0330000f fence rw,rw - - // the device increments disk.used->idx when it - // adds an entry to the used ring. - - while(disk.used_idx != disk.used->idx){ 80006012: 689c ld a5,16(s1) 80006014: 0204d703 lhu a4,32(s1) 80006018: 0027d783 lhu a5,2(a5) # 10001002 <_entry-0x6fffeffe> 8000601c: 04f70663 beq a4,a5,80006068 <virtio_disk_intr+0x86> - __sync_synchronize(); 80006020: 0330000f fence rw,rw - int id = disk.used->ring[disk.used_idx % NUM].id; 80006024: 6898 ld a4,16(s1) 80006026: 0204d783 lhu a5,32(s1) 8000602a: 8b9d andi a5,a5,7 8000602c: 078e slli a5,a5,0x3 8000602e: 97ba add a5,a5,a4 80006030: 43dc lw a5,4(a5) - - if(disk.info[id].status != 0) 80006032: 00278713 addi a4,a5,2 80006036: 0712 slli a4,a4,0x4 80006038: 9726 add a4,a4,s1 8000603a: 01074703 lbu a4,16(a4) 8000603e: e321 bnez a4,8000607e <virtio_disk_intr+0x9c> - panic("virtio_disk_intr status"); - - struct buf *b = disk.info[id].b; 80006040: 0789 addi a5,a5,2 80006042: 0792 slli a5,a5,0x4 80006044: 97a6 add a5,a5,s1 80006046: 6788 ld a0,8(a5) - b->disk = 0; // disk is done with buf 80006048: 00052223 sw zero,4(a0) - wakeup(b); 8000604c: b0cfc0ef jal 80002358 <wakeup> - - disk.used_idx += 1; 80006050: 0204d783 lhu a5,32(s1) 80006054: 2785 addiw a5,a5,1 80006056: 17c2 slli a5,a5,0x30 80006058: 93c1 srli a5,a5,0x30 8000605a: 02f49023 sh a5,32(s1) - while(disk.used_idx != disk.used->idx){ 8000605e: 6898 ld a4,16(s1) 80006060: 00275703 lhu a4,2(a4) 80006064: faf71ee3 bne a4,a5,80006020 <virtio_disk_intr+0x3e> - } - - release(&disk.vdisk_lock); 80006068: 00048517 auipc a0,0x48 8000606c: 9b850513 addi a0,a0,-1608 # 8004da20 <disk+0x128> 80006070: eb3fa0ef jal 80000f22 <release> -} 80006074: 60e2 ld ra,24(sp) 80006076: 6442 ld s0,16(sp) 80006078: 64a2 ld s1,8(sp) 8000607a: 6105 addi sp,sp,32 8000607c: 8082 ret - panic("virtio_disk_intr status"); 8000607e: 00003517 auipc a0,0x3 80006082: c1a50513 addi a0,a0,-998 # 80008c98 <etext+0xc98> 80006086: f0efa0ef jal 80000794 <panic> diff --git a/kernel/log.o b/kernel/log.o index 907a953e3787b02ff5607944ef8c9ae5ebd59441..35a4593832ca7aa6e9b68fca3d260fe666eb1102 100644 Binary files a/kernel/log.o and b/kernel/log.o differ diff --git a/kernel/main.o b/kernel/main.o index 1abf6ee65af36c6ed44eb28857476b05d1658f72..30273c63d199838a508c6b00611c025fa8c2cd1f 100644 Binary files a/kernel/main.o and b/kernel/main.o differ diff --git a/kernel/pipe.o b/kernel/pipe.o index 65a2b6ca39d0cee9396fb0aa0dc91dfaa0437537..94279ed34d8e4ab94a15205879ce05c53e0c6a32 100644 Binary files a/kernel/pipe.o and b/kernel/pipe.o differ diff --git a/kernel/plic.o b/kernel/plic.o index 7808614a5722d518056f8e81b42bfa05e4cdd1b9..b78a996968d9533d8835c2802eb3d174cdfd38cc 100644 Binary files a/kernel/plic.o and b/kernel/plic.o differ diff --git a/kernel/printf.o b/kernel/printf.o index 133965ee9e1f52c5033fab77a127a957dbc36283..0d7e12199e73537348c757dd7cb65c81fdbea9fc 100644 Binary files a/kernel/printf.o and b/kernel/printf.o differ diff --git a/kernel/trap.o b/kernel/trap.o index 711658691d077f727a6e6f87ae0791ddb1b2c30e..95667d4882b9e33226cc9c8bf54489220543721f 100644 Binary files a/kernel/trap.o and b/kernel/trap.o differ diff --git a/mkfs/mkfs b/mkfs/mkfs old mode 100644 new mode 100755 index 995c490ac9ef85d69c4555ed2bcab0a7c6477437..3a8fc77e7ca70b3d4f4967aa0f93908423b9519b Binary files a/mkfs/mkfs and b/mkfs/mkfs differ diff --git a/user/_cat b/user/_cat old mode 100644 new mode 100755 index ae25f8578b70aa14263772c8bef7c690bceaf714..006551816ef8ef9dfbe1537a6505c5fa8b358e38 Binary files a/user/_cat and b/user/_cat differ diff --git a/user/_cowtest b/user/_cowtest old mode 100644 new mode 100755 index 9c51f82326e2ef20148bd5bc709ba489a34aa401..ce2ce4b877808cc6918af7a1def03e4601e7d26b Binary files a/user/_cowtest and b/user/_cowtest differ diff --git a/user/_doubletest b/user/_doubletest old mode 100644 new mode 100755 index 1c3bbacff448198e30de73644dd93133e14c471f..c9c0b638b9406d7857e8e4916bf7352f875e53d7 Binary files a/user/_doubletest and b/user/_doubletest differ diff --git a/user/_echo b/user/_echo old mode 100644 new mode 100755 index 58356e699207b10d703eb05e18a5533a318b8ec4..84c58e2094f59feb3bdacbfe7811fe8f69858ec4 Binary files a/user/_echo and b/user/_echo differ diff --git a/user/_find b/user/_find old mode 100644 new mode 100755 index c3dc455fa5c69003a84ffd1336029353ac1733a5..c1dbb8f5f96f632bf62ae44bb3bb09a37a7771a1 Binary files a/user/_find and b/user/_find differ diff --git a/user/_forktest b/user/_forktest old mode 100644 new mode 100755 index e10977d903aff468a2105efc13af7b7e5571dbd0..8682c53e7d0a71828117cea2db4e4249e697ee66 Binary files a/user/_forktest and b/user/_forktest differ diff --git a/user/_grep b/user/_grep old mode 100644 new mode 100755 index 28e69eb3dd947c47188f95a62c0193d9fe588fef..61503477d6ed1716fb516c7059547b7a0705d94f Binary files a/user/_grep and b/user/_grep differ diff --git a/user/_grind b/user/_grind old mode 100644 new mode 100755 index a6549f2543a6f460230682c9d6e8a553abc9d5b1..0fc9b646b639534dff48547eed5d48c1d213c2cd Binary files a/user/_grind and b/user/_grind differ diff --git a/user/_init b/user/_init old mode 100644 new mode 100755 index 447361bcf808fdcddc17de943cc41582e6da3a84..79e48d9cba239a86fdbb775ead1f6eb487ddea23 Binary files a/user/_init and b/user/_init differ diff --git a/user/_kill b/user/_kill old mode 100644 new mode 100755 index bafdeba6ac45583623e80fec89a98b0a9b8a5942..1bb39c27a8e981635ab1b68ddd372f09e0486fc9 Binary files a/user/_kill and b/user/_kill differ diff --git a/user/_ln b/user/_ln old mode 100644 new mode 100755 index 5002dcbc22a38b3130f73f2b2e4f1dda3c8fb011..89cdc3956c9198d7c359f75f2e9f1ce9851d4ee4 Binary files a/user/_ln and b/user/_ln differ diff --git a/user/_locktest b/user/_locktest old mode 100644 new mode 100755 index 66ccf18fd559e9bcc7d7afe253801b47f9362942..51b31c3a0bf8c1eb7c862dd266693b2c0520fe52 Binary files a/user/_locktest and b/user/_locktest differ diff --git a/user/_ls b/user/_ls old mode 100644 new mode 100755 index c4fb32981bcf0289b0594c11d65240d583412ac9..121e10d95a93da6bf533ef8ac026fcb5c778e30d Binary files a/user/_ls and b/user/_ls differ diff --git a/user/_malloc_test b/user/_malloc_test old mode 100644 new mode 100755 index 739c13a7dd4683018e1b0ca64046205d0e00d974..5299f25c20c65648e87d67ca8a60a8ca075af1fe Binary files a/user/_malloc_test and b/user/_malloc_test differ diff --git a/user/_mkdir b/user/_mkdir old mode 100644 new mode 100755 index 7d7536cda8aae094d139f42ed9142012e6163109..a65412e1cd13410ad6ac53e0f180c0ecaddc4dac Binary files a/user/_mkdir and b/user/_mkdir differ diff --git a/user/_pgtbltest b/user/_pgtbltest old mode 100644 new mode 100755 index 2ed4b3ab69119c877a9cfac6b7c1f36104957810..41d662255fca44780950642d9b9767ea2a66f7d7 Binary files a/user/_pgtbltest and b/user/_pgtbltest differ diff --git a/user/_rm b/user/_rm old mode 100644 new mode 100755 index 3386f0b4d0539bd1fb1ad5392f82915965b91cb4..b4cb43b80acefec053e56d1b0c02fa74e81ee951 Binary files a/user/_rm and b/user/_rm differ diff --git a/user/_sh b/user/_sh old mode 100644 new mode 100755 index e511329df61c6794e796343509504f46c1f1aab0..2459d68d4fabf0c4852cab8d141cb0a9b4fa269d Binary files a/user/_sh and b/user/_sh differ diff --git a/user/_sleep b/user/_sleep old mode 100644 new mode 100755 index 66f4f54c675326232ba92de18c4cd028927342be..9f7804ec8cebaeb9c022e4d6d747ba92cd85e385 Binary files a/user/_sleep and b/user/_sleep differ diff --git a/user/_stressfs b/user/_stressfs old mode 100644 new mode 100755 index a4f93dff8367f821f01c69bec7b4083542b9bddc..8ab576177e8a33668aa4a612cb749b4968598c9e Binary files a/user/_stressfs and b/user/_stressfs differ diff --git a/user/_symlinktest b/user/_symlinktest old mode 100644 new mode 100755 index ede3b3d59743de4698e236be637092b685b99e96..7a54435ba63d6d2297faffe6270180bf30cdf3d2 Binary files a/user/_symlinktest and b/user/_symlinktest differ diff --git a/user/_usertests b/user/_usertests old mode 100644 new mode 100755 index 4def163d2106278c91855870e106281127d4507d..58ea7886bbf49144bea0193253eebfadb45df968 Binary files a/user/_usertests and b/user/_usertests differ diff --git a/user/_var_test b/user/_var_test old mode 100644 new mode 100755 index 447da66af08e7e132153f24e478a8e6542cfd8ec..c33428df7cea7f46eb046b11bb812e617063662d Binary files a/user/_var_test and b/user/_var_test differ diff --git a/user/_wc b/user/_wc old mode 100644 new mode 100755 index eeef601972193085f1f07c3b760d33f8b165d652..ce84a577aae2b74c6fc32e5b021844c1d149e3c2 Binary files a/user/_wc and b/user/_wc differ diff --git a/user/_zombie b/user/_zombie old mode 100644 new mode 100755 index ae845b80edf0fc7fa2f4dada627d149256a014ae..4a85456f69d97b8f7731acd35191430a52b4a5c0 Binary files a/user/_zombie and b/user/_zombie differ diff --git a/user/cat.asm b/user/cat.asm index 0d77192cd23c088342c459f754a47a82878d4d98..70e9bd484e5e1035b5c86925b210e13e71243367 100644 --- a/user/cat.asm +++ b/user/cat.asm @@ -568,245 +568,123 @@ memcpy(void *dst, const void *src, uint n) 34a: 8082 ret 000000000000034c <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 34c: 4885 li a7,1 - ecall 34e: 00000073 ecall - ret 352: 8082 ret 0000000000000354 <exit>: -.global exit -exit: - li a7, SYS_exit 354: 4889 li a7,2 - ecall 356: 00000073 ecall - ret 35a: 8082 ret 000000000000035c <wait>: -.global wait -wait: - li a7, SYS_wait 35c: 488d li a7,3 - ecall 35e: 00000073 ecall - ret 362: 8082 ret 0000000000000364 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 364: 4891 li a7,4 - ecall 366: 00000073 ecall - ret 36a: 8082 ret 000000000000036c <read>: -.global read -read: - li a7, SYS_read 36c: 4895 li a7,5 - ecall 36e: 00000073 ecall - ret 372: 8082 ret 0000000000000374 <write>: -.global write -write: - li a7, SYS_write 374: 48c1 li a7,16 - ecall 376: 00000073 ecall - ret 37a: 8082 ret 000000000000037c <close>: -.global close -close: - li a7, SYS_close 37c: 48d5 li a7,21 - ecall 37e: 00000073 ecall - ret 382: 8082 ret 0000000000000384 <kill>: -.global kill -kill: - li a7, SYS_kill 384: 4899 li a7,6 - ecall 386: 00000073 ecall - ret 38a: 8082 ret 000000000000038c <exec>: -.global exec -exec: - li a7, SYS_exec 38c: 489d li a7,7 - ecall 38e: 00000073 ecall - ret 392: 8082 ret 0000000000000394 <open>: -.global open -open: - li a7, SYS_open 394: 48bd li a7,15 - ecall 396: 00000073 ecall - ret 39a: 8082 ret 000000000000039c <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 39c: 48c5 li a7,17 - ecall 39e: 00000073 ecall - ret 3a2: 8082 ret 00000000000003a4 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 3a4: 48c9 li a7,18 - ecall 3a6: 00000073 ecall - ret 3aa: 8082 ret 00000000000003ac <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 3ac: 48a1 li a7,8 - ecall 3ae: 00000073 ecall - ret 3b2: 8082 ret 00000000000003b4 <link>: -.global link -link: - li a7, SYS_link 3b4: 48cd li a7,19 - ecall 3b6: 00000073 ecall - ret 3ba: 8082 ret 00000000000003bc <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 3bc: 48d1 li a7,20 - ecall 3be: 00000073 ecall - ret 3c2: 8082 ret 00000000000003c4 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 3c4: 48a5 li a7,9 - ecall 3c6: 00000073 ecall - ret 3ca: 8082 ret 00000000000003cc <dup>: -.global dup -dup: - li a7, SYS_dup 3cc: 48a9 li a7,10 - ecall 3ce: 00000073 ecall - ret 3d2: 8082 ret 00000000000003d4 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 3d4: 48ad li a7,11 - ecall 3d6: 00000073 ecall - ret 3da: 8082 ret 00000000000003dc <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 3dc: 48b1 li a7,12 - ecall 3de: 00000073 ecall - ret 3e2: 8082 ret 00000000000003e4 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 3e4: 48b5 li a7,13 - ecall 3e6: 00000073 ecall - ret 3ea: 8082 ret 00000000000003ec <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 3ec: 48b9 li a7,14 - ecall 3ee: 00000073 ecall - ret 3f2: 8082 ret 00000000000003f4 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 3f4: 48d9 li a7,22 - ecall 3f6: 00000073 ecall - ret 3fa: 8082 ret 00000000000003fc <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 3fc: 48dd li a7,23 - ecall 3fe: 00000073 ecall - ret 402: 8082 ret 0000000000000404 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 404: 48e1 li a7,24 - ecall 406: 00000073 ecall - ret 40a: 8082 ret 000000000000040c <putc>: @@ -1349,184 +1227,113 @@ printf(const char *fmt, ...) 7b4: 8082 ret 00000000000007b6 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 7b6: 1141 addi sp,sp,-16 7b8: e422 sd s0,8(sp) 7ba: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 7bc: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 7c0: 00001797 auipc a5,0x1 7c4: 8407b783 ld a5,-1984(a5) # 1000 <freep> 7c8: a02d j 7f2 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 7ca: 4618 lw a4,8(a2) 7cc: 9f2d addw a4,a4,a1 7ce: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 7d2: 6398 ld a4,0(a5) 7d4: 6310 ld a2,0(a4) 7d6: a83d j 814 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 7d8: ff852703 lw a4,-8(a0) 7dc: 9f31 addw a4,a4,a2 7de: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 7e0: ff053683 ld a3,-16(a0) 7e4: a091 j 828 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7e6: 6398 ld a4,0(a5) 7e8: 00e7e463 bltu a5,a4,7f0 <free+0x3a> 7ec: 00e6ea63 bltu a3,a4,800 <free+0x4a> -{ 7f0: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 7f2: fed7fae3 bgeu a5,a3,7e6 <free+0x30> 7f6: 6398 ld a4,0(a5) 7f8: 00e6e463 bltu a3,a4,800 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7fc: fee7eae3 bltu a5,a4,7f0 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 800: ff852583 lw a1,-8(a0) 804: 6390 ld a2,0(a5) 806: 02059813 slli a6,a1,0x20 80a: 01c85713 srli a4,a6,0x1c 80e: 9736 add a4,a4,a3 810: fae60de3 beq a2,a4,7ca <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 814: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 818: 4790 lw a2,8(a5) 81a: 02061593 slli a1,a2,0x20 81e: 01c5d713 srli a4,a1,0x1c 822: 973e add a4,a4,a5 824: fae68ae3 beq a3,a4,7d8 <free+0x22> - p->s.ptr = bp->s.ptr; 828: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 82a: 00000717 auipc a4,0x0 82e: 7cf73b23 sd a5,2006(a4) # 1000 <freep> -} 832: 6422 ld s0,8(sp) 834: 0141 addi sp,sp,16 836: 8082 ret 0000000000000838 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 838: 7139 addi sp,sp,-64 83a: fc06 sd ra,56(sp) 83c: f822 sd s0,48(sp) 83e: f426 sd s1,40(sp) 840: ec4e sd s3,24(sp) 842: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 844: 02051493 slli s1,a0,0x20 848: 9081 srli s1,s1,0x20 84a: 04bd addi s1,s1,15 84c: 8091 srli s1,s1,0x4 84e: 0014899b addiw s3,s1,1 852: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 854: 00000517 auipc a0,0x0 858: 7ac53503 ld a0,1964(a0) # 1000 <freep> 85c: c915 beqz a0,890 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 85e: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 860: 4798 lw a4,8(a5) 862: 08977a63 bgeu a4,s1,8f6 <malloc+0xbe> 866: f04a sd s2,32(sp) 868: e852 sd s4,16(sp) 86a: e456 sd s5,8(sp) 86c: e05a sd s6,0(sp) - if(nu < 4096) 86e: 8a4e mv s4,s3 870: 0009871b sext.w a4,s3 874: 6685 lui a3,0x1 876: 00d77363 bgeu a4,a3,87c <malloc+0x44> 87a: 6a05 lui s4,0x1 87c: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 880: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 884: 00000917 auipc s2,0x0 888: 77c90913 addi s2,s2,1916 # 1000 <freep> - if(p == (char*)-1) 88c: 5afd li s5,-1 88e: a081 j 8ce <malloc+0x96> 890: f04a sd s2,32(sp) 892: e852 sd s4,16(sp) 894: e456 sd s5,8(sp) 896: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 898: 00001797 auipc a5,0x1 89c: 97878793 addi a5,a5,-1672 # 1210 <base> 8a0: 00000717 auipc a4,0x0 8a4: 76f73023 sd a5,1888(a4) # 1000 <freep> 8a8: e39c sd a5,0(a5) - base.s.size = 0; 8aa: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 8ae: b7c1 j 86e <malloc+0x36> - prevp->s.ptr = p->s.ptr; 8b0: 6398 ld a4,0(a5) 8b2: e118 sd a4,0(a0) 8b4: a8a9 j 90e <malloc+0xd6> - hp->s.size = nu; 8b6: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 8ba: 0541 addi a0,a0,16 8bc: efbff0ef jal 7b6 <free> - return freep; 8c0: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 8c4: c12d beqz a0,926 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 8c6: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 8c8: 4798 lw a4,8(a5) 8ca: 02977263 bgeu a4,s1,8ee <malloc+0xb6> - if(p == freep) 8ce: 00093703 ld a4,0(s2) 8d2: 853e mv a0,a5 8d4: fef719e3 bne a4,a5,8c6 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 8d8: 8552 mv a0,s4 8da: b03ff0ef jal 3dc <sbrk> - if(p == (char*)-1) 8de: fd551ce3 bne a0,s5,8b6 <malloc+0x7e> - return 0; 8e2: 4501 li a0,0 8e4: 7902 ld s2,32(sp) 8e6: 6a42 ld s4,16(sp) @@ -1537,24 +1344,16 @@ malloc(uint nbytes) 8f0: 6a42 ld s4,16(sp) 8f2: 6aa2 ld s5,8(sp) 8f4: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 8f6: fae48de3 beq s1,a4,8b0 <malloc+0x78> - p->s.size -= nunits; 8fa: 4137073b subw a4,a4,s3 8fe: c798 sw a4,8(a5) - p += p->s.size; 900: 02071693 slli a3,a4,0x20 904: 01c6d713 srli a4,a3,0x1c 908: 97ba add a5,a5,a4 - p->s.size = nunits; 90a: 0137a423 sw s3,8(a5) - freep = prevp; 90e: 00000717 auipc a4,0x0 912: 6ea73923 sd a0,1778(a4) # 1000 <freep> - return (void*)(p + 1); 916: 01078513 addi a0,a5,16 - } -} 91a: 70e2 ld ra,56(sp) 91c: 7442 ld s0,48(sp) 91e: 74a2 ld s1,40(sp) diff --git a/user/cat.o b/user/cat.o index 735989bfcaf14da28fd4b4978a18ffa6d293d15d..8041d127bd0336bf60926ee5a43a4df30559fe2f 100644 Binary files a/user/cat.o and b/user/cat.o differ diff --git a/user/cowtest.asm b/user/cowtest.asm index 6d7ffa288e0e5bcba1d8724189bf58b76dd9953c..d3540309628f3ec12a1f5ebca5ffee02fefe2c21 100644 --- a/user/cowtest.asm +++ b/user/cowtest.asm @@ -539,245 +539,123 @@ memcpy(void *dst, const void *src, uint n) 304: 8082 ret 0000000000000306 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 306: 4885 li a7,1 - ecall 308: 00000073 ecall - ret 30c: 8082 ret 000000000000030e <exit>: -.global exit -exit: - li a7, SYS_exit 30e: 4889 li a7,2 - ecall 310: 00000073 ecall - ret 314: 8082 ret 0000000000000316 <wait>: -.global wait -wait: - li a7, SYS_wait 316: 488d li a7,3 - ecall 318: 00000073 ecall - ret 31c: 8082 ret 000000000000031e <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 31e: 4891 li a7,4 - ecall 320: 00000073 ecall - ret 324: 8082 ret 0000000000000326 <read>: -.global read -read: - li a7, SYS_read 326: 4895 li a7,5 - ecall 328: 00000073 ecall - ret 32c: 8082 ret 000000000000032e <write>: -.global write -write: - li a7, SYS_write 32e: 48c1 li a7,16 - ecall 330: 00000073 ecall - ret 334: 8082 ret 0000000000000336 <close>: -.global close -close: - li a7, SYS_close 336: 48d5 li a7,21 - ecall 338: 00000073 ecall - ret 33c: 8082 ret 000000000000033e <kill>: -.global kill -kill: - li a7, SYS_kill 33e: 4899 li a7,6 - ecall 340: 00000073 ecall - ret 344: 8082 ret 0000000000000346 <exec>: -.global exec -exec: - li a7, SYS_exec 346: 489d li a7,7 - ecall 348: 00000073 ecall - ret 34c: 8082 ret 000000000000034e <open>: -.global open -open: - li a7, SYS_open 34e: 48bd li a7,15 - ecall 350: 00000073 ecall - ret 354: 8082 ret 0000000000000356 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 356: 48c5 li a7,17 - ecall 358: 00000073 ecall - ret 35c: 8082 ret 000000000000035e <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 35e: 48c9 li a7,18 - ecall 360: 00000073 ecall - ret 364: 8082 ret 0000000000000366 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 366: 48a1 li a7,8 - ecall 368: 00000073 ecall - ret 36c: 8082 ret 000000000000036e <link>: -.global link -link: - li a7, SYS_link 36e: 48cd li a7,19 - ecall 370: 00000073 ecall - ret 374: 8082 ret 0000000000000376 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 376: 48d1 li a7,20 - ecall 378: 00000073 ecall - ret 37c: 8082 ret 000000000000037e <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 37e: 48a5 li a7,9 - ecall 380: 00000073 ecall - ret 384: 8082 ret 0000000000000386 <dup>: -.global dup -dup: - li a7, SYS_dup 386: 48a9 li a7,10 - ecall 388: 00000073 ecall - ret 38c: 8082 ret 000000000000038e <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 38e: 48ad li a7,11 - ecall 390: 00000073 ecall - ret 394: 8082 ret 0000000000000396 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 396: 48b1 li a7,12 - ecall 398: 00000073 ecall - ret 39c: 8082 ret 000000000000039e <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 39e: 48b5 li a7,13 - ecall 3a0: 00000073 ecall - ret 3a4: 8082 ret 00000000000003a6 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 3a6: 48b9 li a7,14 - ecall 3a8: 00000073 ecall - ret 3ac: 8082 ret 00000000000003ae <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 3ae: 48d9 li a7,22 - ecall 3b0: 00000073 ecall - ret 3b4: 8082 ret 00000000000003b6 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 3b6: 48dd li a7,23 - ecall 3b8: 00000073 ecall - ret 3bc: 8082 ret 00000000000003be <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 3be: 48e1 li a7,24 - ecall 3c0: 00000073 ecall - ret 3c4: 8082 ret 00000000000003c6 <putc>: @@ -1320,184 +1198,113 @@ printf(const char *fmt, ...) 76e: 8082 ret 0000000000000770 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 770: 1141 addi sp,sp,-16 772: e422 sd s0,8(sp) 774: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 776: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 77a: 00001797 auipc a5,0x1 77e: 8867b783 ld a5,-1914(a5) # 1000 <freep> 782: a02d j 7ac <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 784: 4618 lw a4,8(a2) 786: 9f2d addw a4,a4,a1 788: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 78c: 6398 ld a4,0(a5) 78e: 6310 ld a2,0(a4) 790: a83d j 7ce <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 792: ff852703 lw a4,-8(a0) 796: 9f31 addw a4,a4,a2 798: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 79a: ff053683 ld a3,-16(a0) 79e: a091 j 7e2 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7a0: 6398 ld a4,0(a5) 7a2: 00e7e463 bltu a5,a4,7aa <free+0x3a> 7a6: 00e6ea63 bltu a3,a4,7ba <free+0x4a> -{ 7aa: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 7ac: fed7fae3 bgeu a5,a3,7a0 <free+0x30> 7b0: 6398 ld a4,0(a5) 7b2: 00e6e463 bltu a3,a4,7ba <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7b6: fee7eae3 bltu a5,a4,7aa <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 7ba: ff852583 lw a1,-8(a0) 7be: 6390 ld a2,0(a5) 7c0: 02059813 slli a6,a1,0x20 7c4: 01c85713 srli a4,a6,0x1c 7c8: 9736 add a4,a4,a3 7ca: fae60de3 beq a2,a4,784 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 7ce: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 7d2: 4790 lw a2,8(a5) 7d4: 02061593 slli a1,a2,0x20 7d8: 01c5d713 srli a4,a1,0x1c 7dc: 973e add a4,a4,a5 7de: fae68ae3 beq a3,a4,792 <free+0x22> - p->s.ptr = bp->s.ptr; 7e2: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 7e4: 00001717 auipc a4,0x1 7e8: 80f73e23 sd a5,-2020(a4) # 1000 <freep> -} 7ec: 6422 ld s0,8(sp) 7ee: 0141 addi sp,sp,16 7f0: 8082 ret 00000000000007f2 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 7f2: 7139 addi sp,sp,-64 7f4: fc06 sd ra,56(sp) 7f6: f822 sd s0,48(sp) 7f8: f426 sd s1,40(sp) 7fa: ec4e sd s3,24(sp) 7fc: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 7fe: 02051493 slli s1,a0,0x20 802: 9081 srli s1,s1,0x20 804: 04bd addi s1,s1,15 806: 8091 srli s1,s1,0x4 808: 0014899b addiw s3,s1,1 80c: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 80e: 00000517 auipc a0,0x0 812: 7f253503 ld a0,2034(a0) # 1000 <freep> 816: c915 beqz a0,84a <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 818: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 81a: 4798 lw a4,8(a5) 81c: 08977a63 bgeu a4,s1,8b0 <malloc+0xbe> 820: f04a sd s2,32(sp) 822: e852 sd s4,16(sp) 824: e456 sd s5,8(sp) 826: e05a sd s6,0(sp) - if(nu < 4096) 828: 8a4e mv s4,s3 82a: 0009871b sext.w a4,s3 82e: 6685 lui a3,0x1 830: 00d77363 bgeu a4,a3,836 <malloc+0x44> 834: 6a05 lui s4,0x1 836: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 83a: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 83e: 00000917 auipc s2,0x0 842: 7c290913 addi s2,s2,1986 # 1000 <freep> - if(p == (char*)-1) 846: 5afd li s5,-1 848: a081 j 888 <malloc+0x96> 84a: f04a sd s2,32(sp) 84c: e852 sd s4,16(sp) 84e: e456 sd s5,8(sp) 850: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 852: 00000797 auipc a5,0x0 856: 7be78793 addi a5,a5,1982 # 1010 <base> 85a: 00000717 auipc a4,0x0 85e: 7af73323 sd a5,1958(a4) # 1000 <freep> 862: e39c sd a5,0(a5) - base.s.size = 0; 864: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 868: b7c1 j 828 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 86a: 6398 ld a4,0(a5) 86c: e118 sd a4,0(a0) 86e: a8a9 j 8c8 <malloc+0xd6> - hp->s.size = nu; 870: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 874: 0541 addi a0,a0,16 876: efbff0ef jal 770 <free> - return freep; 87a: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 87e: c12d beqz a0,8e0 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 880: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 882: 4798 lw a4,8(a5) 884: 02977263 bgeu a4,s1,8a8 <malloc+0xb6> - if(p == freep) 888: 00093703 ld a4,0(s2) 88c: 853e mv a0,a5 88e: fef719e3 bne a4,a5,880 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 892: 8552 mv a0,s4 894: b03ff0ef jal 396 <sbrk> - if(p == (char*)-1) 898: fd551ce3 bne a0,s5,870 <malloc+0x7e> - return 0; 89c: 4501 li a0,0 89e: 7902 ld s2,32(sp) 8a0: 6a42 ld s4,16(sp) @@ -1508,24 +1315,16 @@ malloc(uint nbytes) 8aa: 6a42 ld s4,16(sp) 8ac: 6aa2 ld s5,8(sp) 8ae: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 8b0: fae48de3 beq s1,a4,86a <malloc+0x78> - p->s.size -= nunits; 8b4: 4137073b subw a4,a4,s3 8b8: c798 sw a4,8(a5) - p += p->s.size; 8ba: 02071693 slli a3,a4,0x20 8be: 01c6d713 srli a4,a3,0x1c 8c2: 97ba add a5,a5,a4 - p->s.size = nunits; 8c4: 0137a423 sw s3,8(a5) - freep = prevp; 8c8: 00000717 auipc a4,0x0 8cc: 72a73c23 sd a0,1848(a4) # 1000 <freep> - return (void*)(p + 1); 8d0: 01078513 addi a0,a5,16 - } -} 8d4: 70e2 ld ra,56(sp) 8d6: 7442 ld s0,48(sp) 8d8: 74a2 ld s1,40(sp) diff --git a/user/cowtest.o b/user/cowtest.o index a17443ba5a88004f40a4eb07281ff3d098534385..ea2a5c0c50d6e9289bde48bea568e8033f1e9659 100644 Binary files a/user/cowtest.o and b/user/cowtest.o differ diff --git a/user/doubletest.asm b/user/doubletest.asm index ed1b2c9fcc4551251bce24fceee6f301fdd2b76b..b969d47c321420ce169745af2f807c5873b952b0 100644 --- a/user/doubletest.asm +++ b/user/doubletest.asm @@ -533,245 +533,123 @@ memcpy(void *dst, const void *src, uint n) 32e: 8082 ret 0000000000000330 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 330: 4885 li a7,1 - ecall 332: 00000073 ecall - ret 336: 8082 ret 0000000000000338 <exit>: -.global exit -exit: - li a7, SYS_exit 338: 4889 li a7,2 - ecall 33a: 00000073 ecall - ret 33e: 8082 ret 0000000000000340 <wait>: -.global wait -wait: - li a7, SYS_wait 340: 488d li a7,3 - ecall 342: 00000073 ecall - ret 346: 8082 ret 0000000000000348 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 348: 4891 li a7,4 - ecall 34a: 00000073 ecall - ret 34e: 8082 ret 0000000000000350 <read>: -.global read -read: - li a7, SYS_read 350: 4895 li a7,5 - ecall 352: 00000073 ecall - ret 356: 8082 ret 0000000000000358 <write>: -.global write -write: - li a7, SYS_write 358: 48c1 li a7,16 - ecall 35a: 00000073 ecall - ret 35e: 8082 ret 0000000000000360 <close>: -.global close -close: - li a7, SYS_close 360: 48d5 li a7,21 - ecall 362: 00000073 ecall - ret 366: 8082 ret 0000000000000368 <kill>: -.global kill -kill: - li a7, SYS_kill 368: 4899 li a7,6 - ecall 36a: 00000073 ecall - ret 36e: 8082 ret 0000000000000370 <exec>: -.global exec -exec: - li a7, SYS_exec 370: 489d li a7,7 - ecall 372: 00000073 ecall - ret 376: 8082 ret 0000000000000378 <open>: -.global open -open: - li a7, SYS_open 378: 48bd li a7,15 - ecall 37a: 00000073 ecall - ret 37e: 8082 ret 0000000000000380 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 380: 48c5 li a7,17 - ecall 382: 00000073 ecall - ret 386: 8082 ret 0000000000000388 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 388: 48c9 li a7,18 - ecall 38a: 00000073 ecall - ret 38e: 8082 ret 0000000000000390 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 390: 48a1 li a7,8 - ecall 392: 00000073 ecall - ret 396: 8082 ret 0000000000000398 <link>: -.global link -link: - li a7, SYS_link 398: 48cd li a7,19 - ecall 39a: 00000073 ecall - ret 39e: 8082 ret 00000000000003a0 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 3a0: 48d1 li a7,20 - ecall 3a2: 00000073 ecall - ret 3a6: 8082 ret 00000000000003a8 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 3a8: 48a5 li a7,9 - ecall 3aa: 00000073 ecall - ret 3ae: 8082 ret 00000000000003b0 <dup>: -.global dup -dup: - li a7, SYS_dup 3b0: 48a9 li a7,10 - ecall 3b2: 00000073 ecall - ret 3b6: 8082 ret 00000000000003b8 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 3b8: 48ad li a7,11 - ecall 3ba: 00000073 ecall - ret 3be: 8082 ret 00000000000003c0 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 3c0: 48b1 li a7,12 - ecall 3c2: 00000073 ecall - ret 3c6: 8082 ret 00000000000003c8 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 3c8: 48b5 li a7,13 - ecall 3ca: 00000073 ecall - ret 3ce: 8082 ret 00000000000003d0 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 3d0: 48b9 li a7,14 - ecall 3d2: 00000073 ecall - ret 3d6: 8082 ret 00000000000003d8 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 3d8: 48d9 li a7,22 - ecall 3da: 00000073 ecall - ret 3de: 8082 ret 00000000000003e0 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 3e0: 48dd li a7,23 - ecall 3e2: 00000073 ecall - ret 3e6: 8082 ret 00000000000003e8 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 3e8: 48e1 li a7,24 - ecall 3ea: 00000073 ecall - ret 3ee: 8082 ret 00000000000003f0 <putc>: @@ -1314,184 +1192,113 @@ printf(const char *fmt, ...) 798: 8082 ret 000000000000079a <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 79a: 1141 addi sp,sp,-16 79c: e422 sd s0,8(sp) 79e: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 7a0: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 7a4: 00001797 auipc a5,0x1 7a8: 85c7b783 ld a5,-1956(a5) # 1000 <freep> 7ac: a02d j 7d6 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 7ae: 4618 lw a4,8(a2) 7b0: 9f2d addw a4,a4,a1 7b2: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 7b6: 6398 ld a4,0(a5) 7b8: 6310 ld a2,0(a4) 7ba: a83d j 7f8 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 7bc: ff852703 lw a4,-8(a0) 7c0: 9f31 addw a4,a4,a2 7c2: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 7c4: ff053683 ld a3,-16(a0) 7c8: a091 j 80c <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7ca: 6398 ld a4,0(a5) 7cc: 00e7e463 bltu a5,a4,7d4 <free+0x3a> 7d0: 00e6ea63 bltu a3,a4,7e4 <free+0x4a> -{ 7d4: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 7d6: fed7fae3 bgeu a5,a3,7ca <free+0x30> 7da: 6398 ld a4,0(a5) 7dc: 00e6e463 bltu a3,a4,7e4 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7e0: fee7eae3 bltu a5,a4,7d4 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 7e4: ff852583 lw a1,-8(a0) 7e8: 6390 ld a2,0(a5) 7ea: 02059813 slli a6,a1,0x20 7ee: 01c85713 srli a4,a6,0x1c 7f2: 9736 add a4,a4,a3 7f4: fae60de3 beq a2,a4,7ae <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 7f8: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 7fc: 4790 lw a2,8(a5) 7fe: 02061593 slli a1,a2,0x20 802: 01c5d713 srli a4,a1,0x1c 806: 973e add a4,a4,a5 808: fae68ae3 beq a3,a4,7bc <free+0x22> - p->s.ptr = bp->s.ptr; 80c: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 80e: 00000717 auipc a4,0x0 812: 7ef73923 sd a5,2034(a4) # 1000 <freep> -} 816: 6422 ld s0,8(sp) 818: 0141 addi sp,sp,16 81a: 8082 ret 000000000000081c <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 81c: 7139 addi sp,sp,-64 81e: fc06 sd ra,56(sp) 820: f822 sd s0,48(sp) 822: f426 sd s1,40(sp) 824: ec4e sd s3,24(sp) 826: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 828: 02051493 slli s1,a0,0x20 82c: 9081 srli s1,s1,0x20 82e: 04bd addi s1,s1,15 830: 8091 srli s1,s1,0x4 832: 0014899b addiw s3,s1,1 836: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 838: 00000517 auipc a0,0x0 83c: 7c853503 ld a0,1992(a0) # 1000 <freep> 840: c915 beqz a0,874 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 842: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 844: 4798 lw a4,8(a5) 846: 08977a63 bgeu a4,s1,8da <malloc+0xbe> 84a: f04a sd s2,32(sp) 84c: e852 sd s4,16(sp) 84e: e456 sd s5,8(sp) 850: e05a sd s6,0(sp) - if(nu < 4096) 852: 8a4e mv s4,s3 854: 0009871b sext.w a4,s3 858: 6685 lui a3,0x1 85a: 00d77363 bgeu a4,a3,860 <malloc+0x44> 85e: 6a05 lui s4,0x1 860: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 864: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 868: 00000917 auipc s2,0x0 86c: 79890913 addi s2,s2,1944 # 1000 <freep> - if(p == (char*)-1) 870: 5afd li s5,-1 872: a081 j 8b2 <malloc+0x96> 874: f04a sd s2,32(sp) 876: e852 sd s4,16(sp) 878: e456 sd s5,8(sp) 87a: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 87c: 00000797 auipc a5,0x0 880: 79478793 addi a5,a5,1940 # 1010 <base> 884: 00000717 auipc a4,0x0 888: 76f73e23 sd a5,1916(a4) # 1000 <freep> 88c: e39c sd a5,0(a5) - base.s.size = 0; 88e: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 892: b7c1 j 852 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 894: 6398 ld a4,0(a5) 896: e118 sd a4,0(a0) 898: a8a9 j 8f2 <malloc+0xd6> - hp->s.size = nu; 89a: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 89e: 0541 addi a0,a0,16 8a0: efbff0ef jal 79a <free> - return freep; 8a4: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 8a8: c12d beqz a0,90a <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 8aa: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 8ac: 4798 lw a4,8(a5) 8ae: 02977263 bgeu a4,s1,8d2 <malloc+0xb6> - if(p == freep) 8b2: 00093703 ld a4,0(s2) 8b6: 853e mv a0,a5 8b8: fef719e3 bne a4,a5,8aa <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 8bc: 8552 mv a0,s4 8be: b03ff0ef jal 3c0 <sbrk> - if(p == (char*)-1) 8c2: fd551ce3 bne a0,s5,89a <malloc+0x7e> - return 0; 8c6: 4501 li a0,0 8c8: 7902 ld s2,32(sp) 8ca: 6a42 ld s4,16(sp) @@ -1502,24 +1309,16 @@ malloc(uint nbytes) 8d4: 6a42 ld s4,16(sp) 8d6: 6aa2 ld s5,8(sp) 8d8: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 8da: fae48de3 beq s1,a4,894 <malloc+0x78> - p->s.size -= nunits; 8de: 4137073b subw a4,a4,s3 8e2: c798 sw a4,8(a5) - p += p->s.size; 8e4: 02071693 slli a3,a4,0x20 8e8: 01c6d713 srli a4,a3,0x1c 8ec: 97ba add a5,a5,a4 - p->s.size = nunits; 8ee: 0137a423 sw s3,8(a5) - freep = prevp; 8f2: 00000717 auipc a4,0x0 8f6: 70a73723 sd a0,1806(a4) # 1000 <freep> - return (void*)(p + 1); 8fa: 01078513 addi a0,a5,16 - } -} 8fe: 70e2 ld ra,56(sp) 900: 7442 ld s0,48(sp) 902: 74a2 ld s1,40(sp) diff --git a/user/doubletest.o b/user/doubletest.o index 8ea7a054ab5a076151aaec8fce482c5362223c61..c2dc1d9bfcd6415224a6bfc9f4073e636df307ae 100644 Binary files a/user/doubletest.o and b/user/doubletest.o differ diff --git a/user/echo.asm b/user/echo.asm index 983fdbd80bd16369c3bb0c6d80933e976926d0d5..ff14623c4dcbbcbc6e6eccec66e3517110e09514 100644 --- a/user/echo.asm +++ b/user/echo.asm @@ -500,245 +500,123 @@ memcpy(void *dst, const void *src, uint n) 2da: 8082 ret 00000000000002dc <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 2dc: 4885 li a7,1 - ecall 2de: 00000073 ecall - ret 2e2: 8082 ret 00000000000002e4 <exit>: -.global exit -exit: - li a7, SYS_exit 2e4: 4889 li a7,2 - ecall 2e6: 00000073 ecall - ret 2ea: 8082 ret 00000000000002ec <wait>: -.global wait -wait: - li a7, SYS_wait 2ec: 488d li a7,3 - ecall 2ee: 00000073 ecall - ret 2f2: 8082 ret 00000000000002f4 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 2f4: 4891 li a7,4 - ecall 2f6: 00000073 ecall - ret 2fa: 8082 ret 00000000000002fc <read>: -.global read -read: - li a7, SYS_read 2fc: 4895 li a7,5 - ecall 2fe: 00000073 ecall - ret 302: 8082 ret 0000000000000304 <write>: -.global write -write: - li a7, SYS_write 304: 48c1 li a7,16 - ecall 306: 00000073 ecall - ret 30a: 8082 ret 000000000000030c <close>: -.global close -close: - li a7, SYS_close 30c: 48d5 li a7,21 - ecall 30e: 00000073 ecall - ret 312: 8082 ret 0000000000000314 <kill>: -.global kill -kill: - li a7, SYS_kill 314: 4899 li a7,6 - ecall 316: 00000073 ecall - ret 31a: 8082 ret 000000000000031c <exec>: -.global exec -exec: - li a7, SYS_exec 31c: 489d li a7,7 - ecall 31e: 00000073 ecall - ret 322: 8082 ret 0000000000000324 <open>: -.global open -open: - li a7, SYS_open 324: 48bd li a7,15 - ecall 326: 00000073 ecall - ret 32a: 8082 ret 000000000000032c <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 32c: 48c5 li a7,17 - ecall 32e: 00000073 ecall - ret 332: 8082 ret 0000000000000334 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 334: 48c9 li a7,18 - ecall 336: 00000073 ecall - ret 33a: 8082 ret 000000000000033c <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 33c: 48a1 li a7,8 - ecall 33e: 00000073 ecall - ret 342: 8082 ret 0000000000000344 <link>: -.global link -link: - li a7, SYS_link 344: 48cd li a7,19 - ecall 346: 00000073 ecall - ret 34a: 8082 ret 000000000000034c <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 34c: 48d1 li a7,20 - ecall 34e: 00000073 ecall - ret 352: 8082 ret 0000000000000354 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 354: 48a5 li a7,9 - ecall 356: 00000073 ecall - ret 35a: 8082 ret 000000000000035c <dup>: -.global dup -dup: - li a7, SYS_dup 35c: 48a9 li a7,10 - ecall 35e: 00000073 ecall - ret 362: 8082 ret 0000000000000364 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 364: 48ad li a7,11 - ecall 366: 00000073 ecall - ret 36a: 8082 ret 000000000000036c <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 36c: 48b1 li a7,12 - ecall 36e: 00000073 ecall - ret 372: 8082 ret 0000000000000374 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 374: 48b5 li a7,13 - ecall 376: 00000073 ecall - ret 37a: 8082 ret 000000000000037c <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 37c: 48b9 li a7,14 - ecall 37e: 00000073 ecall - ret 382: 8082 ret 0000000000000384 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 384: 48d9 li a7,22 - ecall 386: 00000073 ecall - ret 38a: 8082 ret 000000000000038c <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 38c: 48dd li a7,23 - ecall 38e: 00000073 ecall - ret 392: 8082 ret 0000000000000394 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 394: 48e1 li a7,24 - ecall 396: 00000073 ecall - ret 39a: 8082 ret 000000000000039c <putc>: @@ -1281,184 +1159,113 @@ printf(const char *fmt, ...) 744: 8082 ret 0000000000000746 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 746: 1141 addi sp,sp,-16 748: e422 sd s0,8(sp) 74a: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 74c: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 750: 00001797 auipc a5,0x1 754: 8b07b783 ld a5,-1872(a5) # 1000 <freep> 758: a02d j 782 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 75a: 4618 lw a4,8(a2) 75c: 9f2d addw a4,a4,a1 75e: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 762: 6398 ld a4,0(a5) 764: 6310 ld a2,0(a4) 766: a83d j 7a4 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 768: ff852703 lw a4,-8(a0) 76c: 9f31 addw a4,a4,a2 76e: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 770: ff053683 ld a3,-16(a0) 774: a091 j 7b8 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 776: 6398 ld a4,0(a5) 778: 00e7e463 bltu a5,a4,780 <free+0x3a> 77c: 00e6ea63 bltu a3,a4,790 <free+0x4a> -{ 780: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 782: fed7fae3 bgeu a5,a3,776 <free+0x30> 786: 6398 ld a4,0(a5) 788: 00e6e463 bltu a3,a4,790 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 78c: fee7eae3 bltu a5,a4,780 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 790: ff852583 lw a1,-8(a0) 794: 6390 ld a2,0(a5) 796: 02059813 slli a6,a1,0x20 79a: 01c85713 srli a4,a6,0x1c 79e: 9736 add a4,a4,a3 7a0: fae60de3 beq a2,a4,75a <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 7a4: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 7a8: 4790 lw a2,8(a5) 7aa: 02061593 slli a1,a2,0x20 7ae: 01c5d713 srli a4,a1,0x1c 7b2: 973e add a4,a4,a5 7b4: fae68ae3 beq a3,a4,768 <free+0x22> - p->s.ptr = bp->s.ptr; 7b8: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 7ba: 00001717 auipc a4,0x1 7be: 84f73323 sd a5,-1978(a4) # 1000 <freep> -} 7c2: 6422 ld s0,8(sp) 7c4: 0141 addi sp,sp,16 7c6: 8082 ret 00000000000007c8 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 7c8: 7139 addi sp,sp,-64 7ca: fc06 sd ra,56(sp) 7cc: f822 sd s0,48(sp) 7ce: f426 sd s1,40(sp) 7d0: ec4e sd s3,24(sp) 7d2: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 7d4: 02051493 slli s1,a0,0x20 7d8: 9081 srli s1,s1,0x20 7da: 04bd addi s1,s1,15 7dc: 8091 srli s1,s1,0x4 7de: 0014899b addiw s3,s1,1 7e2: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 7e4: 00001517 auipc a0,0x1 7e8: 81c53503 ld a0,-2020(a0) # 1000 <freep> 7ec: c915 beqz a0,820 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 7ee: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 7f0: 4798 lw a4,8(a5) 7f2: 08977a63 bgeu a4,s1,886 <malloc+0xbe> 7f6: f04a sd s2,32(sp) 7f8: e852 sd s4,16(sp) 7fa: e456 sd s5,8(sp) 7fc: e05a sd s6,0(sp) - if(nu < 4096) 7fe: 8a4e mv s4,s3 800: 0009871b sext.w a4,s3 804: 6685 lui a3,0x1 806: 00d77363 bgeu a4,a3,80c <malloc+0x44> 80a: 6a05 lui s4,0x1 80c: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 810: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 814: 00000917 auipc s2,0x0 818: 7ec90913 addi s2,s2,2028 # 1000 <freep> - if(p == (char*)-1) 81c: 5afd li s5,-1 81e: a081 j 85e <malloc+0x96> 820: f04a sd s2,32(sp) 822: e852 sd s4,16(sp) 824: e456 sd s5,8(sp) 826: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 828: 00000797 auipc a5,0x0 82c: 7e878793 addi a5,a5,2024 # 1010 <base> 830: 00000717 auipc a4,0x0 834: 7cf73823 sd a5,2000(a4) # 1000 <freep> 838: e39c sd a5,0(a5) - base.s.size = 0; 83a: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 83e: b7c1 j 7fe <malloc+0x36> - prevp->s.ptr = p->s.ptr; 840: 6398 ld a4,0(a5) 842: e118 sd a4,0(a0) 844: a8a9 j 89e <malloc+0xd6> - hp->s.size = nu; 846: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 84a: 0541 addi a0,a0,16 84c: efbff0ef jal 746 <free> - return freep; 850: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 854: c12d beqz a0,8b6 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 856: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 858: 4798 lw a4,8(a5) 85a: 02977263 bgeu a4,s1,87e <malloc+0xb6> - if(p == freep) 85e: 00093703 ld a4,0(s2) 862: 853e mv a0,a5 864: fef719e3 bne a4,a5,856 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 868: 8552 mv a0,s4 86a: b03ff0ef jal 36c <sbrk> - if(p == (char*)-1) 86e: fd551ce3 bne a0,s5,846 <malloc+0x7e> - return 0; 872: 4501 li a0,0 874: 7902 ld s2,32(sp) 876: 6a42 ld s4,16(sp) @@ -1469,24 +1276,16 @@ malloc(uint nbytes) 880: 6a42 ld s4,16(sp) 882: 6aa2 ld s5,8(sp) 884: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 886: fae48de3 beq s1,a4,840 <malloc+0x78> - p->s.size -= nunits; 88a: 4137073b subw a4,a4,s3 88e: c798 sw a4,8(a5) - p += p->s.size; 890: 02071693 slli a3,a4,0x20 894: 01c6d713 srli a4,a3,0x1c 898: 97ba add a5,a5,a4 - p->s.size = nunits; 89a: 0137a423 sw s3,8(a5) - freep = prevp; 89e: 00000717 auipc a4,0x0 8a2: 76a73123 sd a0,1890(a4) # 1000 <freep> - return (void*)(p + 1); 8a6: 01078513 addi a0,a5,16 - } -} 8aa: 70e2 ld ra,56(sp) 8ac: 7442 ld s0,48(sp) 8ae: 74a2 ld s1,40(sp) diff --git a/user/echo.o b/user/echo.o index b355c6571a49d2cdeeffa6ca2149ce09f8bc89a3..40663700af45c07d6efbf31b3b5c706385df410e 100644 Binary files a/user/echo.o and b/user/echo.o differ diff --git a/user/find.asm b/user/find.asm index c915d9f1d88d6c5b3c9d0cacf888bacd9185ce12..2d461a653414520d2ed6c7a72bf7320914f6ad0c 100644 --- a/user/find.asm +++ b/user/find.asm @@ -727,245 +727,123 @@ memcpy(void *dst, const void *src, uint n) 4c0: 8082 ret 00000000000004c2 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 4c2: 4885 li a7,1 - ecall 4c4: 00000073 ecall - ret 4c8: 8082 ret 00000000000004ca <exit>: -.global exit -exit: - li a7, SYS_exit 4ca: 4889 li a7,2 - ecall 4cc: 00000073 ecall - ret 4d0: 8082 ret 00000000000004d2 <wait>: -.global wait -wait: - li a7, SYS_wait 4d2: 488d li a7,3 - ecall 4d4: 00000073 ecall - ret 4d8: 8082 ret 00000000000004da <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 4da: 4891 li a7,4 - ecall 4dc: 00000073 ecall - ret 4e0: 8082 ret 00000000000004e2 <read>: -.global read -read: - li a7, SYS_read 4e2: 4895 li a7,5 - ecall 4e4: 00000073 ecall - ret 4e8: 8082 ret 00000000000004ea <write>: -.global write -write: - li a7, SYS_write 4ea: 48c1 li a7,16 - ecall 4ec: 00000073 ecall - ret 4f0: 8082 ret 00000000000004f2 <close>: -.global close -close: - li a7, SYS_close 4f2: 48d5 li a7,21 - ecall 4f4: 00000073 ecall - ret 4f8: 8082 ret 00000000000004fa <kill>: -.global kill -kill: - li a7, SYS_kill 4fa: 4899 li a7,6 - ecall 4fc: 00000073 ecall - ret 500: 8082 ret 0000000000000502 <exec>: -.global exec -exec: - li a7, SYS_exec 502: 489d li a7,7 - ecall 504: 00000073 ecall - ret 508: 8082 ret 000000000000050a <open>: -.global open -open: - li a7, SYS_open 50a: 48bd li a7,15 - ecall 50c: 00000073 ecall - ret 510: 8082 ret 0000000000000512 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 512: 48c5 li a7,17 - ecall 514: 00000073 ecall - ret 518: 8082 ret 000000000000051a <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 51a: 48c9 li a7,18 - ecall 51c: 00000073 ecall - ret 520: 8082 ret 0000000000000522 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 522: 48a1 li a7,8 - ecall 524: 00000073 ecall - ret 528: 8082 ret 000000000000052a <link>: -.global link -link: - li a7, SYS_link 52a: 48cd li a7,19 - ecall 52c: 00000073 ecall - ret 530: 8082 ret 0000000000000532 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 532: 48d1 li a7,20 - ecall 534: 00000073 ecall - ret 538: 8082 ret 000000000000053a <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 53a: 48a5 li a7,9 - ecall 53c: 00000073 ecall - ret 540: 8082 ret 0000000000000542 <dup>: -.global dup -dup: - li a7, SYS_dup 542: 48a9 li a7,10 - ecall 544: 00000073 ecall - ret 548: 8082 ret 000000000000054a <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 54a: 48ad li a7,11 - ecall 54c: 00000073 ecall - ret 550: 8082 ret 0000000000000552 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 552: 48b1 li a7,12 - ecall 554: 00000073 ecall - ret 558: 8082 ret 000000000000055a <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 55a: 48b5 li a7,13 - ecall 55c: 00000073 ecall - ret 560: 8082 ret 0000000000000562 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 562: 48b9 li a7,14 - ecall 564: 00000073 ecall - ret 568: 8082 ret 000000000000056a <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 56a: 48d9 li a7,22 - ecall 56c: 00000073 ecall - ret 570: 8082 ret 0000000000000572 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 572: 48dd li a7,23 - ecall 574: 00000073 ecall - ret 578: 8082 ret 000000000000057a <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 57a: 48e1 li a7,24 - ecall 57c: 00000073 ecall - ret 580: 8082 ret 0000000000000582 <putc>: @@ -1508,184 +1386,113 @@ printf(const char *fmt, ...) 92a: 8082 ret 000000000000092c <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 92c: 1141 addi sp,sp,-16 92e: e422 sd s0,8(sp) 930: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 932: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 936: 00000797 auipc a5,0x0 93a: 6ca7b783 ld a5,1738(a5) # 1000 <freep> 93e: a02d j 968 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 940: 4618 lw a4,8(a2) 942: 9f2d addw a4,a4,a1 944: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 948: 6398 ld a4,0(a5) 94a: 6310 ld a2,0(a4) 94c: a83d j 98a <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 94e: ff852703 lw a4,-8(a0) 952: 9f31 addw a4,a4,a2 954: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 956: ff053683 ld a3,-16(a0) 95a: a091 j 99e <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 95c: 6398 ld a4,0(a5) 95e: 00e7e463 bltu a5,a4,966 <free+0x3a> 962: 00e6ea63 bltu a3,a4,976 <free+0x4a> -{ 966: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 968: fed7fae3 bgeu a5,a3,95c <free+0x30> 96c: 6398 ld a4,0(a5) 96e: 00e6e463 bltu a3,a4,976 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 972: fee7eae3 bltu a5,a4,966 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 976: ff852583 lw a1,-8(a0) 97a: 6390 ld a2,0(a5) 97c: 02059813 slli a6,a1,0x20 980: 01c85713 srli a4,a6,0x1c 984: 9736 add a4,a4,a3 986: fae60de3 beq a2,a4,940 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 98a: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 98e: 4790 lw a2,8(a5) 990: 02061593 slli a1,a2,0x20 994: 01c5d713 srli a4,a1,0x1c 998: 973e add a4,a4,a5 99a: fae68ae3 beq a3,a4,94e <free+0x22> - p->s.ptr = bp->s.ptr; 99e: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 9a0: 00000717 auipc a4,0x0 9a4: 66f73023 sd a5,1632(a4) # 1000 <freep> -} 9a8: 6422 ld s0,8(sp) 9aa: 0141 addi sp,sp,16 9ac: 8082 ret 00000000000009ae <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 9ae: 7139 addi sp,sp,-64 9b0: fc06 sd ra,56(sp) 9b2: f822 sd s0,48(sp) 9b4: f426 sd s1,40(sp) 9b6: ec4e sd s3,24(sp) 9b8: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 9ba: 02051493 slli s1,a0,0x20 9be: 9081 srli s1,s1,0x20 9c0: 04bd addi s1,s1,15 9c2: 8091 srli s1,s1,0x4 9c4: 0014899b addiw s3,s1,1 9c8: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 9ca: 00000517 auipc a0,0x0 9ce: 63653503 ld a0,1590(a0) # 1000 <freep> 9d2: c915 beqz a0,a06 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 9d4: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 9d6: 4798 lw a4,8(a5) 9d8: 08977a63 bgeu a4,s1,a6c <malloc+0xbe> 9dc: f04a sd s2,32(sp) 9de: e852 sd s4,16(sp) 9e0: e456 sd s5,8(sp) 9e2: e05a sd s6,0(sp) - if(nu < 4096) 9e4: 8a4e mv s4,s3 9e6: 0009871b sext.w a4,s3 9ea: 6685 lui a3,0x1 9ec: 00d77363 bgeu a4,a3,9f2 <malloc+0x44> 9f0: 6a05 lui s4,0x1 9f2: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 9f6: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 9fa: 00000917 auipc s2,0x0 9fe: 60690913 addi s2,s2,1542 # 1000 <freep> - if(p == (char*)-1) a02: 5afd li s5,-1 a04: a081 j a44 <malloc+0x96> a06: f04a sd s2,32(sp) a08: e852 sd s4,16(sp) a0a: e456 sd s5,8(sp) a0c: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; a0e: 00000797 auipc a5,0x0 a12: 61278793 addi a5,a5,1554 # 1020 <base> a16: 00000717 auipc a4,0x0 a1a: 5ef73523 sd a5,1514(a4) # 1000 <freep> a1e: e39c sd a5,0(a5) - base.s.size = 0; a20: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ a24: b7c1 j 9e4 <malloc+0x36> - prevp->s.ptr = p->s.ptr; a26: 6398 ld a4,0(a5) a28: e118 sd a4,0(a0) a2a: a8a9 j a84 <malloc+0xd6> - hp->s.size = nu; a2c: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); a30: 0541 addi a0,a0,16 a32: efbff0ef jal 92c <free> - return freep; a36: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) a3a: c12d beqz a0,a9c <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ a3c: 611c ld a5,0(a0) - if(p->s.size >= nunits){ a3e: 4798 lw a4,8(a5) a40: 02977263 bgeu a4,s1,a64 <malloc+0xb6> - if(p == freep) a44: 00093703 ld a4,0(s2) a48: 853e mv a0,a5 a4a: fef719e3 bne a4,a5,a3c <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); a4e: 8552 mv a0,s4 a50: b03ff0ef jal 552 <sbrk> - if(p == (char*)-1) a54: fd551ce3 bne a0,s5,a2c <malloc+0x7e> - return 0; a58: 4501 li a0,0 a5a: 7902 ld s2,32(sp) a5c: 6a42 ld s4,16(sp) @@ -1696,24 +1503,16 @@ malloc(uint nbytes) a66: 6a42 ld s4,16(sp) a68: 6aa2 ld s5,8(sp) a6a: 6b02 ld s6,0(sp) - if(p->s.size == nunits) a6c: fae48de3 beq s1,a4,a26 <malloc+0x78> - p->s.size -= nunits; a70: 4137073b subw a4,a4,s3 a74: c798 sw a4,8(a5) - p += p->s.size; a76: 02071693 slli a3,a4,0x20 a7a: 01c6d713 srli a4,a3,0x1c a7e: 97ba add a5,a5,a4 - p->s.size = nunits; a80: 0137a423 sw s3,8(a5) - freep = prevp; a84: 00000717 auipc a4,0x0 a88: 56a73e23 sd a0,1404(a4) # 1000 <freep> - return (void*)(p + 1); a8c: 01078513 addi a0,a5,16 - } -} a90: 70e2 ld ra,56(sp) a92: 7442 ld s0,48(sp) a94: 74a2 ld s1,40(sp) diff --git a/user/find.o b/user/find.o index 4ecc03978cc5ec66acce342ade9f29f0a3b092e2..1643eae7667b802bfd4037011b5d8368c3b1901b 100644 Binary files a/user/find.o and b/user/find.o differ diff --git a/user/forktest.asm b/user/forktest.asm index f5222b05944e7dbf52d8f2f0a45f9b3092f349fe..a38b18a5f8e0698e1c6fed0d31d7dafaee46f224 100644 --- a/user/forktest.asm +++ b/user/forktest.asm @@ -571,243 +571,121 @@ memcpy(void *dst, const void *src, uint n) 336: 8082 ret 0000000000000338 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 338: 4885 li a7,1 - ecall 33a: 00000073 ecall - ret 33e: 8082 ret 0000000000000340 <exit>: -.global exit -exit: - li a7, SYS_exit 340: 4889 li a7,2 - ecall 342: 00000073 ecall - ret 346: 8082 ret 0000000000000348 <wait>: -.global wait -wait: - li a7, SYS_wait 348: 488d li a7,3 - ecall 34a: 00000073 ecall - ret 34e: 8082 ret 0000000000000350 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 350: 4891 li a7,4 - ecall 352: 00000073 ecall - ret 356: 8082 ret 0000000000000358 <read>: -.global read -read: - li a7, SYS_read 358: 4895 li a7,5 - ecall 35a: 00000073 ecall - ret 35e: 8082 ret 0000000000000360 <write>: -.global write -write: - li a7, SYS_write 360: 48c1 li a7,16 - ecall 362: 00000073 ecall - ret 366: 8082 ret 0000000000000368 <close>: -.global close -close: - li a7, SYS_close 368: 48d5 li a7,21 - ecall 36a: 00000073 ecall - ret 36e: 8082 ret 0000000000000370 <kill>: -.global kill -kill: - li a7, SYS_kill 370: 4899 li a7,6 - ecall 372: 00000073 ecall - ret 376: 8082 ret 0000000000000378 <exec>: -.global exec -exec: - li a7, SYS_exec 378: 489d li a7,7 - ecall 37a: 00000073 ecall - ret 37e: 8082 ret 0000000000000380 <open>: -.global open -open: - li a7, SYS_open 380: 48bd li a7,15 - ecall 382: 00000073 ecall - ret 386: 8082 ret 0000000000000388 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 388: 48c5 li a7,17 - ecall 38a: 00000073 ecall - ret 38e: 8082 ret 0000000000000390 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 390: 48c9 li a7,18 - ecall 392: 00000073 ecall - ret 396: 8082 ret 0000000000000398 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 398: 48a1 li a7,8 - ecall 39a: 00000073 ecall - ret 39e: 8082 ret 00000000000003a0 <link>: -.global link -link: - li a7, SYS_link 3a0: 48cd li a7,19 - ecall 3a2: 00000073 ecall - ret 3a6: 8082 ret 00000000000003a8 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 3a8: 48d1 li a7,20 - ecall 3aa: 00000073 ecall - ret 3ae: 8082 ret 00000000000003b0 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 3b0: 48a5 li a7,9 - ecall 3b2: 00000073 ecall - ret 3b6: 8082 ret 00000000000003b8 <dup>: -.global dup -dup: - li a7, SYS_dup 3b8: 48a9 li a7,10 - ecall 3ba: 00000073 ecall - ret 3be: 8082 ret 00000000000003c0 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 3c0: 48ad li a7,11 - ecall 3c2: 00000073 ecall - ret 3c6: 8082 ret 00000000000003c8 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 3c8: 48b1 li a7,12 - ecall 3ca: 00000073 ecall - ret 3ce: 8082 ret 00000000000003d0 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 3d0: 48b5 li a7,13 - ecall 3d2: 00000073 ecall - ret 3d6: 8082 ret 00000000000003d8 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 3d8: 48b9 li a7,14 - ecall 3da: 00000073 ecall - ret 3de: 8082 ret 00000000000003e0 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 3e0: 48d9 li a7,22 - ecall 3e2: 00000073 ecall - ret 3e6: 8082 ret 00000000000003e8 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 3e8: 48dd li a7,23 - ecall 3ea: 00000073 ecall - ret 3ee: 8082 ret 00000000000003f0 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 3f0: 48e1 li a7,24 - ecall 3f2: 00000073 ecall - ret 3f6: 8082 ret diff --git a/user/forktest.o b/user/forktest.o index f6f9dc062407fccaef4162ccdcbca0bb7c65241f..89cc5d555221377cf30fc6474cf8af84a2cb44b1 100644 Binary files a/user/forktest.o and b/user/forktest.o differ diff --git a/user/grep.asm b/user/grep.asm index 397cb5207da6f3c2e493d47a6f84332c64f6a170..1ba66e77af5cf2aa03cf6a5e872785dbfd74256d 100644 --- a/user/grep.asm +++ b/user/grep.asm @@ -742,245 +742,123 @@ memcpy(void *dst, const void *src, uint n) 4ba: 8082 ret 00000000000004bc <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 4bc: 4885 li a7,1 - ecall 4be: 00000073 ecall - ret 4c2: 8082 ret 00000000000004c4 <exit>: -.global exit -exit: - li a7, SYS_exit 4c4: 4889 li a7,2 - ecall 4c6: 00000073 ecall - ret 4ca: 8082 ret 00000000000004cc <wait>: -.global wait -wait: - li a7, SYS_wait 4cc: 488d li a7,3 - ecall 4ce: 00000073 ecall - ret 4d2: 8082 ret 00000000000004d4 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 4d4: 4891 li a7,4 - ecall 4d6: 00000073 ecall - ret 4da: 8082 ret 00000000000004dc <read>: -.global read -read: - li a7, SYS_read 4dc: 4895 li a7,5 - ecall 4de: 00000073 ecall - ret 4e2: 8082 ret 00000000000004e4 <write>: -.global write -write: - li a7, SYS_write 4e4: 48c1 li a7,16 - ecall 4e6: 00000073 ecall - ret 4ea: 8082 ret 00000000000004ec <close>: -.global close -close: - li a7, SYS_close 4ec: 48d5 li a7,21 - ecall 4ee: 00000073 ecall - ret 4f2: 8082 ret 00000000000004f4 <kill>: -.global kill -kill: - li a7, SYS_kill 4f4: 4899 li a7,6 - ecall 4f6: 00000073 ecall - ret 4fa: 8082 ret 00000000000004fc <exec>: -.global exec -exec: - li a7, SYS_exec 4fc: 489d li a7,7 - ecall 4fe: 00000073 ecall - ret 502: 8082 ret 0000000000000504 <open>: -.global open -open: - li a7, SYS_open 504: 48bd li a7,15 - ecall 506: 00000073 ecall - ret 50a: 8082 ret 000000000000050c <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 50c: 48c5 li a7,17 - ecall 50e: 00000073 ecall - ret 512: 8082 ret 0000000000000514 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 514: 48c9 li a7,18 - ecall 516: 00000073 ecall - ret 51a: 8082 ret 000000000000051c <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 51c: 48a1 li a7,8 - ecall 51e: 00000073 ecall - ret 522: 8082 ret 0000000000000524 <link>: -.global link -link: - li a7, SYS_link 524: 48cd li a7,19 - ecall 526: 00000073 ecall - ret 52a: 8082 ret 000000000000052c <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 52c: 48d1 li a7,20 - ecall 52e: 00000073 ecall - ret 532: 8082 ret 0000000000000534 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 534: 48a5 li a7,9 - ecall 536: 00000073 ecall - ret 53a: 8082 ret 000000000000053c <dup>: -.global dup -dup: - li a7, SYS_dup 53c: 48a9 li a7,10 - ecall 53e: 00000073 ecall - ret 542: 8082 ret 0000000000000544 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 544: 48ad li a7,11 - ecall 546: 00000073 ecall - ret 54a: 8082 ret 000000000000054c <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 54c: 48b1 li a7,12 - ecall 54e: 00000073 ecall - ret 552: 8082 ret 0000000000000554 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 554: 48b5 li a7,13 - ecall 556: 00000073 ecall - ret 55a: 8082 ret 000000000000055c <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 55c: 48b9 li a7,14 - ecall 55e: 00000073 ecall - ret 562: 8082 ret 0000000000000564 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 564: 48d9 li a7,22 - ecall 566: 00000073 ecall - ret 56a: 8082 ret 000000000000056c <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 56c: 48dd li a7,23 - ecall 56e: 00000073 ecall - ret 572: 8082 ret 0000000000000574 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 574: 48e1 li a7,24 - ecall 576: 00000073 ecall - ret 57a: 8082 ret 000000000000057c <putc>: @@ -1523,184 +1401,113 @@ printf(const char *fmt, ...) 924: 8082 ret 0000000000000926 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 926: 1141 addi sp,sp,-16 928: e422 sd s0,8(sp) 92a: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 92c: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 930: 00000797 auipc a5,0x0 934: 6d07b783 ld a5,1744(a5) # 1000 <freep> 938: a02d j 962 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 93a: 4618 lw a4,8(a2) 93c: 9f2d addw a4,a4,a1 93e: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 942: 6398 ld a4,0(a5) 944: 6310 ld a2,0(a4) 946: a83d j 984 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 948: ff852703 lw a4,-8(a0) 94c: 9f31 addw a4,a4,a2 94e: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 950: ff053683 ld a3,-16(a0) 954: a091 j 998 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 956: 6398 ld a4,0(a5) 958: 00e7e463 bltu a5,a4,960 <free+0x3a> 95c: 00e6ea63 bltu a3,a4,970 <free+0x4a> -{ 960: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 962: fed7fae3 bgeu a5,a3,956 <free+0x30> 966: 6398 ld a4,0(a5) 968: 00e6e463 bltu a3,a4,970 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 96c: fee7eae3 bltu a5,a4,960 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 970: ff852583 lw a1,-8(a0) 974: 6390 ld a2,0(a5) 976: 02059813 slli a6,a1,0x20 97a: 01c85713 srli a4,a6,0x1c 97e: 9736 add a4,a4,a3 980: fae60de3 beq a2,a4,93a <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 984: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 988: 4790 lw a2,8(a5) 98a: 02061593 slli a1,a2,0x20 98e: 01c5d713 srli a4,a1,0x1c 992: 973e add a4,a4,a5 994: fae68ae3 beq a3,a4,948 <free+0x22> - p->s.ptr = bp->s.ptr; 998: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 99a: 00000717 auipc a4,0x0 99e: 66f73323 sd a5,1638(a4) # 1000 <freep> -} 9a2: 6422 ld s0,8(sp) 9a4: 0141 addi sp,sp,16 9a6: 8082 ret 00000000000009a8 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 9a8: 7139 addi sp,sp,-64 9aa: fc06 sd ra,56(sp) 9ac: f822 sd s0,48(sp) 9ae: f426 sd s1,40(sp) 9b0: ec4e sd s3,24(sp) 9b2: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 9b4: 02051493 slli s1,a0,0x20 9b8: 9081 srli s1,s1,0x20 9ba: 04bd addi s1,s1,15 9bc: 8091 srli s1,s1,0x4 9be: 0014899b addiw s3,s1,1 9c2: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 9c4: 00000517 auipc a0,0x0 9c8: 63c53503 ld a0,1596(a0) # 1000 <freep> 9cc: c915 beqz a0,a00 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 9ce: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 9d0: 4798 lw a4,8(a5) 9d2: 08977a63 bgeu a4,s1,a66 <malloc+0xbe> 9d6: f04a sd s2,32(sp) 9d8: e852 sd s4,16(sp) 9da: e456 sd s5,8(sp) 9dc: e05a sd s6,0(sp) - if(nu < 4096) 9de: 8a4e mv s4,s3 9e0: 0009871b sext.w a4,s3 9e4: 6685 lui a3,0x1 9e6: 00d77363 bgeu a4,a3,9ec <malloc+0x44> 9ea: 6a05 lui s4,0x1 9ec: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 9f0: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 9f4: 00000917 auipc s2,0x0 9f8: 60c90913 addi s2,s2,1548 # 1000 <freep> - if(p == (char*)-1) 9fc: 5afd li s5,-1 9fe: a081 j a3e <malloc+0x96> a00: f04a sd s2,32(sp) a02: e852 sd s4,16(sp) a04: e456 sd s5,8(sp) a06: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; a08: 00001797 auipc a5,0x1 a0c: a0878793 addi a5,a5,-1528 # 1410 <base> a10: 00000717 auipc a4,0x0 a14: 5ef73823 sd a5,1520(a4) # 1000 <freep> a18: e39c sd a5,0(a5) - base.s.size = 0; a1a: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ a1e: b7c1 j 9de <malloc+0x36> - prevp->s.ptr = p->s.ptr; a20: 6398 ld a4,0(a5) a22: e118 sd a4,0(a0) a24: a8a9 j a7e <malloc+0xd6> - hp->s.size = nu; a26: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); a2a: 0541 addi a0,a0,16 a2c: efbff0ef jal 926 <free> - return freep; a30: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) a34: c12d beqz a0,a96 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ a36: 611c ld a5,0(a0) - if(p->s.size >= nunits){ a38: 4798 lw a4,8(a5) a3a: 02977263 bgeu a4,s1,a5e <malloc+0xb6> - if(p == freep) a3e: 00093703 ld a4,0(s2) a42: 853e mv a0,a5 a44: fef719e3 bne a4,a5,a36 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); a48: 8552 mv a0,s4 a4a: b03ff0ef jal 54c <sbrk> - if(p == (char*)-1) a4e: fd551ce3 bne a0,s5,a26 <malloc+0x7e> - return 0; a52: 4501 li a0,0 a54: 7902 ld s2,32(sp) a56: 6a42 ld s4,16(sp) @@ -1711,24 +1518,16 @@ malloc(uint nbytes) a60: 6a42 ld s4,16(sp) a62: 6aa2 ld s5,8(sp) a64: 6b02 ld s6,0(sp) - if(p->s.size == nunits) a66: fae48de3 beq s1,a4,a20 <malloc+0x78> - p->s.size -= nunits; a6a: 4137073b subw a4,a4,s3 a6e: c798 sw a4,8(a5) - p += p->s.size; a70: 02071693 slli a3,a4,0x20 a74: 01c6d713 srli a4,a3,0x1c a78: 97ba add a5,a5,a4 - p->s.size = nunits; a7a: 0137a423 sw s3,8(a5) - freep = prevp; a7e: 00000717 auipc a4,0x0 a82: 58a73123 sd a0,1410(a4) # 1000 <freep> - return (void*)(p + 1); a86: 01078513 addi a0,a5,16 - } -} a8a: 70e2 ld ra,56(sp) a8c: 7442 ld s0,48(sp) a8e: 74a2 ld s1,40(sp) diff --git a/user/grep.o b/user/grep.o index ef16acbfe9bf9d8e43eb025abe0d23cf2b2ddce4..1904f0168de5e190a0b49bf919fc292a19853c6d 100644 Binary files a/user/grep.o and b/user/grep.o differ diff --git a/user/grind.asm b/user/grind.asm index aec88588bbebf7fdcee5c937df7b00dc449f8ce9..589651e64cc9aa783c56e5f79f210089a52a29c1 100644 --- a/user/grind.asm +++ b/user/grind.asm @@ -1095,50 +1095,87 @@ main() 8e2: b7d5 j 8c6 <main+0x18> 00000000000008e4 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ 8e4: 1141 addi sp,sp,-16 8e6: e406 sd ra,8(sp) 8e8: e022 sd s0,0(sp) 8ea: 0800 addi s0,sp,16 + extern int main(); + main(); 8ec: fc3ff0ef jal 8ae <main> + exit(0); 8f0: 4501 li a0,0 8f2: 25c000ef jal b4e <exit> 00000000000008f6 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ 8f6: 1141 addi sp,sp,-16 8f8: e422 sd s0,8(sp) 8fa: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) 8fc: 87aa mv a5,a0 8fe: 0585 addi a1,a1,1 900: 0785 addi a5,a5,1 902: fff5c703 lbu a4,-1(a1) 906: fee78fa3 sb a4,-1(a5) 90a: fb75 bnez a4,8fe <strcpy+0x8> + ; + return os; +} 90c: 6422 ld s0,8(sp) 90e: 0141 addi sp,sp,16 910: 8082 ret 0000000000000912 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ 912: 1141 addi sp,sp,-16 914: e422 sd s0,8(sp) 916: 0800 addi s0,sp,16 + while(*p && *p == *q) 918: 00054783 lbu a5,0(a0) 91c: cb91 beqz a5,930 <strcmp+0x1e> 91e: 0005c703 lbu a4,0(a1) 922: 00f71763 bne a4,a5,930 <strcmp+0x1e> + p++, q++; 926: 0505 addi a0,a0,1 928: 0585 addi a1,a1,1 + while(*p && *p == *q) 92a: 00054783 lbu a5,0(a0) 92e: fbe5 bnez a5,91e <strcmp+0xc> + return (uchar)*p - (uchar)*q; 930: 0005c503 lbu a0,0(a1) +} 934: 40a7853b subw a0,a5,a0 938: 6422 ld s0,8(sp) 93a: 0141 addi sp,sp,16 93c: 8082 ret 000000000000093e <strlen>: + +uint +strlen(const char *s) +{ 93e: 1141 addi sp,sp,-16 940: e422 sd s0,8(sp) 942: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) 944: 00054783 lbu a5,0(a0) 948: cf91 beqz a5,964 <strlen+0x26> 94a: 0505 addi a0,a0,1 @@ -1149,46 +1186,77 @@ main() 956: ff65 bnez a4,94e <strlen+0x10> 958: 40a6853b subw a0,a3,a0 95c: 2505 addiw a0,a0,1 + ; + return n; +} 95e: 6422 ld s0,8(sp) 960: 0141 addi sp,sp,16 962: 8082 ret + for(n = 0; s[n]; n++) 964: 4501 li a0,0 966: bfe5 j 95e <strlen+0x20> 0000000000000968 <memset>: + +void* +memset(void *dst, int c, uint n) +{ 968: 1141 addi sp,sp,-16 96a: e422 sd s0,8(sp) 96c: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ 96e: ca19 beqz a2,984 <memset+0x1c> 970: 87aa mv a5,a0 972: 1602 slli a2,a2,0x20 974: 9201 srli a2,a2,0x20 976: 00a60733 add a4,a2,a0 + cdst[i] = c; 97a: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ 97e: 0785 addi a5,a5,1 980: fee79de3 bne a5,a4,97a <memset+0x12> + } + return dst; +} 984: 6422 ld s0,8(sp) 986: 0141 addi sp,sp,16 988: 8082 ret 000000000000098a <strchr>: + +char* +strchr(const char *s, char c) +{ 98a: 1141 addi sp,sp,-16 98c: e422 sd s0,8(sp) 98e: 0800 addi s0,sp,16 + for(; *s; s++) 990: 00054783 lbu a5,0(a0) 994: cb99 beqz a5,9aa <strchr+0x20> + if(*s == c) 996: 00f58763 beq a1,a5,9a4 <strchr+0x1a> + for(; *s; s++) 99a: 0505 addi a0,a0,1 99c: 00054783 lbu a5,0(a0) 9a0: fbfd bnez a5,996 <strchr+0xc> + return (char*)s; + return 0; 9a2: 4501 li a0,0 +} 9a4: 6422 ld s0,8(sp) 9a6: 0141 addi sp,sp,16 9a8: 8082 ret + return 0; 9aa: 4501 li a0,0 9ac: bfe5 j 9a4 <strchr+0x1a> 00000000000009ae <gets>: + +char* +gets(char *buf, int max) +{ 9ae: 711d addi sp,sp,-96 9b0: ec86 sd ra,88(sp) 9b2: e8a2 sd s0,80(sp) @@ -1202,28 +1270,48 @@ main() 9c2: 1080 addi s0,sp,96 9c4: 8baa mv s7,a0 9c6: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ 9c8: 892a mv s2,a0 9ca: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') 9cc: 4aa9 li s5,10 9ce: 4b35 li s6,13 + for(i=0; i+1 < max; ){ 9d0: 89a6 mv s3,s1 9d2: 2485 addiw s1,s1,1 9d4: 0344d663 bge s1,s4,a00 <gets+0x52> + cc = read(0, &c, 1); 9d8: 4605 li a2,1 9da: faf40593 addi a1,s0,-81 9de: 4501 li a0,0 9e0: 186000ef jal b66 <read> + if(cc < 1) 9e4: 00a05e63 blez a0,a00 <gets+0x52> + buf[i++] = c; 9e8: faf44783 lbu a5,-81(s0) 9ec: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') 9f0: 01578763 beq a5,s5,9fe <gets+0x50> 9f4: 0905 addi s2,s2,1 9f6: fd679de3 bne a5,s6,9d0 <gets+0x22> + buf[i++] = c; 9fa: 89a6 mv s3,s1 9fc: a011 j a00 <gets+0x52> 9fe: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; a00: 99de add s3,s3,s7 a02: 00098023 sb zero,0(s3) + return buf; +} a06: 855e mv a0,s7 a08: 60e6 ld ra,88(sp) a0a: 6446 ld s0,80(sp) @@ -1238,123 +1326,200 @@ main() a1c: 8082 ret 0000000000000a1e <stat>: + +int +stat(const char *n, struct stat *st) +{ a1e: 1101 addi sp,sp,-32 a20: ec06 sd ra,24(sp) a22: e822 sd s0,16(sp) a24: e04a sd s2,0(sp) a26: 1000 addi s0,sp,32 a28: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); a2a: 4581 li a1,0 a2c: 162000ef jal b8e <open> + if(fd < 0) a30: 02054263 bltz a0,a54 <stat+0x36> a34: e426 sd s1,8(sp) a36: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); a38: 85ca mv a1,s2 a3a: 16c000ef jal ba6 <fstat> a3e: 892a mv s2,a0 + close(fd); a40: 8526 mv a0,s1 a42: 134000ef jal b76 <close> + return r; a46: 64a2 ld s1,8(sp) +} a48: 854a mv a0,s2 a4a: 60e2 ld ra,24(sp) a4c: 6442 ld s0,16(sp) a4e: 6902 ld s2,0(sp) a50: 6105 addi sp,sp,32 a52: 8082 ret + return -1; a54: 597d li s2,-1 a56: bfcd j a48 <stat+0x2a> 0000000000000a58 <atoi>: + +int +atoi(const char *s) +{ a58: 1141 addi sp,sp,-16 a5a: e422 sd s0,8(sp) a5c: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') a5e: 00054683 lbu a3,0(a0) a62: fd06879b addiw a5,a3,-48 a66: 0ff7f793 zext.b a5,a5 a6a: 4625 li a2,9 a6c: 02f66863 bltu a2,a5,a9c <atoi+0x44> a70: 872a mv a4,a0 + n = 0; a72: 4501 li a0,0 + n = n*10 + *s++ - '0'; a74: 0705 addi a4,a4,1 a76: 0025179b slliw a5,a0,0x2 a7a: 9fa9 addw a5,a5,a0 a7c: 0017979b slliw a5,a5,0x1 a80: 9fb5 addw a5,a5,a3 a82: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') a86: 00074683 lbu a3,0(a4) a8a: fd06879b addiw a5,a3,-48 a8e: 0ff7f793 zext.b a5,a5 a92: fef671e3 bgeu a2,a5,a74 <atoi+0x1c> + return n; +} a96: 6422 ld s0,8(sp) a98: 0141 addi sp,sp,16 a9a: 8082 ret + n = 0; a9c: 4501 li a0,0 a9e: bfe5 j a96 <atoi+0x3e> 0000000000000aa0 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ aa0: 1141 addi sp,sp,-16 aa2: e422 sd s0,8(sp) aa4: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { aa6: 02b57463 bgeu a0,a1,ace <memmove+0x2e> + while(n-- > 0) aaa: 00c05f63 blez a2,ac8 <memmove+0x28> aae: 1602 slli a2,a2,0x20 ab0: 9201 srli a2,a2,0x20 ab2: 00c507b3 add a5,a0,a2 + dst = vdst; ab6: 872a mv a4,a0 + *dst++ = *src++; ab8: 0585 addi a1,a1,1 aba: 0705 addi a4,a4,1 abc: fff5c683 lbu a3,-1(a1) ac0: fed70fa3 sb a3,-1(a4) + while(n-- > 0) ac4: fef71ae3 bne a4,a5,ab8 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} ac8: 6422 ld s0,8(sp) aca: 0141 addi sp,sp,16 acc: 8082 ret + dst += n; ace: 00c50733 add a4,a0,a2 + src += n; ad2: 95b2 add a1,a1,a2 + while(n-- > 0) ad4: fec05ae3 blez a2,ac8 <memmove+0x28> ad8: fff6079b addiw a5,a2,-1 adc: 1782 slli a5,a5,0x20 ade: 9381 srli a5,a5,0x20 ae0: fff7c793 not a5,a5 ae4: 97ba add a5,a5,a4 + *--dst = *--src; ae6: 15fd addi a1,a1,-1 ae8: 177d addi a4,a4,-1 aea: 0005c683 lbu a3,0(a1) aee: 00d70023 sb a3,0(a4) + while(n-- > 0) af2: fee79ae3 bne a5,a4,ae6 <memmove+0x46> af6: bfc9 j ac8 <memmove+0x28> 0000000000000af8 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ af8: 1141 addi sp,sp,-16 afa: e422 sd s0,8(sp) afc: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { afe: ca05 beqz a2,b2e <memcmp+0x36> b00: fff6069b addiw a3,a2,-1 b04: 1682 slli a3,a3,0x20 b06: 9281 srli a3,a3,0x20 b08: 0685 addi a3,a3,1 b0a: 96aa add a3,a3,a0 + if (*p1 != *p2) { b0c: 00054783 lbu a5,0(a0) b10: 0005c703 lbu a4,0(a1) b14: 00e79863 bne a5,a4,b24 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; b18: 0505 addi a0,a0,1 + p2++; b1a: 0585 addi a1,a1,1 + while (n-- > 0) { b1c: fed518e3 bne a0,a3,b0c <memcmp+0x14> + } + return 0; b20: 4501 li a0,0 b22: a019 j b28 <memcmp+0x30> + return *p1 - *p2; b24: 40e7853b subw a0,a5,a4 +} b28: 6422 ld s0,8(sp) b2a: 0141 addi sp,sp,16 b2c: 8082 ret + return 0; b2e: 4501 li a0,0 b30: bfe5 j b28 <memcmp+0x30> 0000000000000b32 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ b32: 1141 addi sp,sp,-16 b34: e406 sd ra,8(sp) b36: e022 sd s0,0(sp) b38: 0800 addi s0,sp,16 + return memmove(dst, src, n); b3a: f67ff0ef jal aa0 <memmove> +} b3e: 60a2 ld ra,8(sp) b40: 6402 ld s0,0(sp) b42: 0141 addi sp,sp,16 @@ -1481,32 +1646,60 @@ main() c04: 8082 ret 0000000000000c06 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ c06: 1101 addi sp,sp,-32 c08: ec06 sd ra,24(sp) c0a: e822 sd s0,16(sp) c0c: 1000 addi s0,sp,32 c0e: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); c12: 4605 li a2,1 c14: fef40593 addi a1,s0,-17 c18: f57ff0ef jal b6e <write> +} c1c: 60e2 ld ra,24(sp) c1e: 6442 ld s0,16(sp) c20: 6105 addi sp,sp,32 c22: 8082 ret 0000000000000c24 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ c24: 7139 addi sp,sp,-64 c26: fc06 sd ra,56(sp) c28: f822 sd s0,48(sp) c2a: f426 sd s1,40(sp) c2c: 0080 addi s0,sp,64 c2e: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ c30: c299 beqz a3,c36 <printint+0x12> c32: 0805c963 bltz a1,cc4 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; c36: 2581 sext.w a1,a1 + neg = 0; c38: 4881 li a7,0 c3a: fc040693 addi a3,s0,-64 + } + + i = 0; c3e: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; c40: 2601 sext.w a2,a2 c42: 00001517 auipc a0,0x1 c46: 85e50513 addi a0,a0,-1954 # 14a0 <digits> @@ -1518,16 +1711,21 @@ main() c56: 97aa add a5,a5,a0 c58: 0007c783 lbu a5,0(a5) c5c: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); c60: 0005879b sext.w a5,a1 c64: 02c5d5bb divuw a1,a1,a2 c68: 0685 addi a3,a3,1 c6a: fec7f0e3 bgeu a5,a2,c4a <printint+0x26> + if(neg) c6e: 00088c63 beqz a7,c86 <printint+0x62> + buf[i++] = '-'; c72: fd070793 addi a5,a4,-48 c76: 00878733 add a4,a5,s0 c7a: 02d00793 li a5,45 c7e: fef70823 sb a5,-16(a4) c82: 0028071b addiw a4,a6,2 + + while(--i >= 0) c86: 02e05a63 blez a4,cba <printint+0x96> c8a: f04a sd s2,32(sp) c8c: ec4e sd s3,24(sp) @@ -1539,28 +1737,45 @@ main() c9e: 1702 slli a4,a4,0x20 ca0: 9301 srli a4,a4,0x20 ca2: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); ca6: fff94583 lbu a1,-1(s2) caa: 8526 mv a0,s1 cac: f5bff0ef jal c06 <putc> + while(--i >= 0) cb0: 197d addi s2,s2,-1 cb2: ff391ae3 bne s2,s3,ca6 <printint+0x82> cb6: 7902 ld s2,32(sp) cb8: 69e2 ld s3,24(sp) +} cba: 70e2 ld ra,56(sp) cbc: 7442 ld s0,48(sp) cbe: 74a2 ld s1,40(sp) cc0: 6121 addi sp,sp,64 cc2: 8082 ret + x = -xx; cc4: 40b005bb negw a1,a1 + neg = 1; cc8: 4885 li a7,1 + x = -xx; cca: bf85 j c3a <printint+0x16> 0000000000000ccc <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ ccc: 711d addi sp,sp,-96 cce: ec86 sd ra,88(sp) cd0: e8a2 sd s0,80(sp) cd2: e0ca sd s2,64(sp) cd4: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ cd6: 0005c903 lbu s2,0(a1) cda: 26090863 beqz s2,f4a <vprintf+0x27e> cde: e4a6 sd s1,72(sp) @@ -1574,51 +1789,110 @@ main() cee: 8b2a mv s6,a0 cf0: 8a2e mv s4,a1 cf2: 8bb2 mv s7,a2 + state = 0; cf4: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ cf6: 4481 li s1,0 cf8: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ cfa: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ cfe: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ d02: 06c00c93 li s9,108 d06: a005 j d26 <vprintf+0x5a> + putc(fd, c0); d08: 85ca mv a1,s2 d0a: 855a mv a0,s6 d0c: efbff0ef jal c06 <putc> d10: a019 j d16 <vprintf+0x4a> + } else if(state == '%'){ d12: 03598263 beq s3,s5,d36 <vprintf+0x6a> + for(i = 0; fmt[i]; i++){ d16: 2485 addiw s1,s1,1 d18: 8726 mv a4,s1 d1a: 009a07b3 add a5,s4,s1 d1e: 0007c903 lbu s2,0(a5) d22: 20090c63 beqz s2,f3a <vprintf+0x26e> + c0 = fmt[i] & 0xff; d26: 0009079b sext.w a5,s2 + if(state == 0){ d2a: fe0994e3 bnez s3,d12 <vprintf+0x46> + if(c0 == '%'){ d2e: fd579de3 bne a5,s5,d08 <vprintf+0x3c> + state = '%'; d32: 89be mv s3,a5 d34: b7cd j d16 <vprintf+0x4a> + if(c0) c1 = fmt[i+1] & 0xff; d36: 00ea06b3 add a3,s4,a4 d3a: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; d3e: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; d40: c681 beqz a3,d48 <vprintf+0x7c> d42: 9752 add a4,a4,s4 d44: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ d48: 03878f63 beq a5,s8,d86 <vprintf+0xba> + } else if(c0 == 'l' && c1 == 'd'){ d4c: 05978963 beq a5,s9,d9e <vprintf+0xd2> + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ d50: 07500713 li a4,117 d54: 0ee78363 beq a5,a4,e3a <vprintf+0x16e> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ d58: 07800713 li a4,120 d5c: 12e78563 beq a5,a4,e86 <vprintf+0x1ba> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ d60: 07000713 li a4,112 d64: 14e78a63 beq a5,a4,eb8 <vprintf+0x1ec> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ d68: 07300713 li a4,115 d6c: 18e78a63 beq a5,a4,f00 <vprintf+0x234> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ d70: 02500713 li a4,37 d74: 04e79563 bne a5,a4,dbe <vprintf+0xf2> + putc(fd, '%'); d78: 02500593 li a1,37 d7c: 855a mv a0,s6 d7e: e89ff0ef jal c06 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; d82: 4981 li s3,0 d84: bf49 j d16 <vprintf+0x4a> + printint(fd, va_arg(ap, int), 10, 1); d86: 008b8913 addi s2,s7,8 d8a: 4685 li a3,1 d8c: 4629 li a2,10 @@ -1626,60 +1900,87 @@ main() d92: 855a mv a0,s6 d94: e91ff0ef jal c24 <printint> d98: 8bca mv s7,s2 + state = 0; d9a: 4981 li s3,0 d9c: bfad j d16 <vprintf+0x4a> + } else if(c0 == 'l' && c1 == 'd'){ d9e: 06400793 li a5,100 da2: 02f68963 beq a3,a5,dd4 <vprintf+0x108> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ da6: 06c00793 li a5,108 daa: 04f68263 beq a3,a5,dee <vprintf+0x122> + } else if(c0 == 'l' && c1 == 'u'){ dae: 07500793 li a5,117 db2: 0af68063 beq a3,a5,e52 <vprintf+0x186> + } else if(c0 == 'l' && c1 == 'x'){ db6: 07800793 li a5,120 dba: 0ef68263 beq a3,a5,e9e <vprintf+0x1d2> + putc(fd, '%'); dbe: 02500593 li a1,37 dc2: 855a mv a0,s6 dc4: e43ff0ef jal c06 <putc> + putc(fd, c0); dc8: 85ca mv a1,s2 dca: 855a mv a0,s6 dcc: e3bff0ef jal c06 <putc> + state = 0; dd0: 4981 li s3,0 dd2: b791 j d16 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 1); dd4: 008b8913 addi s2,s7,8 dd8: 4685 li a3,1 dda: 4629 li a2,10 ddc: 000ba583 lw a1,0(s7) de0: 855a mv a0,s6 de2: e43ff0ef jal c24 <printint> + i += 1; de6: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); de8: 8bca mv s7,s2 + state = 0; dea: 4981 li s3,0 + i += 1; dec: b72d j d16 <vprintf+0x4a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ dee: 06400793 li a5,100 df2: 02f60763 beq a2,a5,e20 <vprintf+0x154> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ df6: 07500793 li a5,117 dfa: 06f60963 beq a2,a5,e6c <vprintf+0x1a0> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ dfe: 07800793 li a5,120 e02: faf61ee3 bne a2,a5,dbe <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); e06: 008b8913 addi s2,s7,8 e0a: 4681 li a3,0 e0c: 4641 li a2,16 e0e: 000ba583 lw a1,0(s7) e12: 855a mv a0,s6 e14: e11ff0ef jal c24 <printint> + i += 2; e18: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); e1a: 8bca mv s7,s2 + state = 0; e1c: 4981 li s3,0 + i += 2; e1e: bde5 j d16 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 1); e20: 008b8913 addi s2,s7,8 e24: 4685 li a3,1 e26: 4629 li a2,10 e28: 000ba583 lw a1,0(s7) e2c: 855a mv a0,s6 e2e: df7ff0ef jal c24 <printint> + i += 2; e32: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); e34: 8bca mv s7,s2 + state = 0; e36: 4981 li s3,0 + i += 2; e38: bdf9 j d16 <vprintf+0x4a> + printint(fd, va_arg(ap, int), 10, 0); e3a: 008b8913 addi s2,s7,8 e3e: 4681 li a3,0 e40: 4629 li a2,10 @@ -1687,28 +1988,40 @@ main() e46: 855a mv a0,s6 e48: dddff0ef jal c24 <printint> e4c: 8bca mv s7,s2 + state = 0; e4e: 4981 li s3,0 e50: b5d9 j d16 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 0); e52: 008b8913 addi s2,s7,8 e56: 4681 li a3,0 e58: 4629 li a2,10 e5a: 000ba583 lw a1,0(s7) e5e: 855a mv a0,s6 e60: dc5ff0ef jal c24 <printint> + i += 1; e64: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); e66: 8bca mv s7,s2 + state = 0; e68: 4981 li s3,0 + i += 1; e6a: b575 j d16 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 0); e6c: 008b8913 addi s2,s7,8 e70: 4681 li a3,0 e72: 4629 li a2,10 e74: 000ba583 lw a1,0(s7) e78: 855a mv a0,s6 e7a: dabff0ef jal c24 <printint> + i += 2; e7e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); e80: 8bca mv s7,s2 + state = 0; e82: 4981 li s3,0 + i += 2; e84: bd49 j d16 <vprintf+0x4a> + printint(fd, va_arg(ap, int), 16, 0); e86: 008b8913 addi s2,s7,8 e8a: 4681 li a3,0 e8c: 4641 li a2,16 @@ -1716,28 +2029,38 @@ main() e92: 855a mv a0,s6 e94: d91ff0ef jal c24 <printint> e98: 8bca mv s7,s2 + state = 0; e9a: 4981 li s3,0 e9c: bdad j d16 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 16, 0); e9e: 008b8913 addi s2,s7,8 ea2: 4681 li a3,0 ea4: 4641 li a2,16 ea6: 000ba583 lw a1,0(s7) eaa: 855a mv a0,s6 eac: d79ff0ef jal c24 <printint> + i += 1; eb0: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); eb2: 8bca mv s7,s2 + state = 0; eb4: 4981 li s3,0 + i += 1; eb6: b585 j d16 <vprintf+0x4a> eb8: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); eba: 008b8d13 addi s10,s7,8 ebe: 000bb983 ld s3,0(s7) + putc(fd, '0'); ec2: 03000593 li a1,48 ec6: 855a mv a0,s6 ec8: d3fff0ef jal c06 <putc> + putc(fd, 'x'); ecc: 07800593 li a1,120 ed0: 855a mv a0,s6 ed2: d35ff0ef jal c06 <putc> ed6: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); ed8: 00000b97 auipc s7,0x0 edc: 5c8b8b93 addi s7,s7,1480 # 14a0 <digits> ee0: 03c9d793 srli a5,s3,0x3c @@ -1745,31 +2068,44 @@ main() ee6: 0007c583 lbu a1,0(a5) eea: 855a mv a0,s6 eec: d1bff0ef jal c06 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) ef0: 0992 slli s3,s3,0x4 ef2: 397d addiw s2,s2,-1 ef4: fe0916e3 bnez s2,ee0 <vprintf+0x214> + printptr(fd, va_arg(ap, uint64)); ef8: 8bea mv s7,s10 + state = 0; efa: 4981 li s3,0 efc: 6d02 ld s10,0(sp) efe: bd21 j d16 <vprintf+0x4a> + if((s = va_arg(ap, char*)) == 0) f00: 008b8993 addi s3,s7,8 f04: 000bb903 ld s2,0(s7) f08: 00090f63 beqz s2,f26 <vprintf+0x25a> + for(; *s; s++) f0c: 00094583 lbu a1,0(s2) f10: c195 beqz a1,f34 <vprintf+0x268> + putc(fd, *s); f12: 855a mv a0,s6 f14: cf3ff0ef jal c06 <putc> + for(; *s; s++) f18: 0905 addi s2,s2,1 f1a: 00094583 lbu a1,0(s2) f1e: f9f5 bnez a1,f12 <vprintf+0x246> + if((s = va_arg(ap, char*)) == 0) f20: 8bce mv s7,s3 + state = 0; f22: 4981 li s3,0 f24: bbcd j d16 <vprintf+0x4a> + s = "(null)"; f26: 00000917 auipc s2,0x0 f2a: 51290913 addi s2,s2,1298 # 1438 <malloc+0x406> + for(; *s; s++) f2e: 02800593 li a1,40 f32: b7c5 j f12 <vprintf+0x246> + if((s = va_arg(ap, char*)) == 0) f34: 8bce mv s7,s3 + state = 0; f36: 4981 li s3,0 f38: bbf9 j d16 <vprintf+0x4a> f3a: 64a6 ld s1,72(sp) @@ -1780,6 +2116,9 @@ main() f44: 6be2 ld s7,24(sp) f46: 6c42 ld s8,16(sp) f48: 6ca2 ld s9,8(sp) + } + } +} f4a: 60e6 ld ra,88(sp) f4c: 6446 ld s0,80(sp) f4e: 6906 ld s2,64(sp) @@ -1787,6 +2126,10 @@ main() f52: 8082 ret 0000000000000f54 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ f54: 715d addi sp,sp,-80 f56: ec06 sd ra,24(sp) f58: e822 sd s0,16(sp) @@ -1797,15 +2140,24 @@ main() f62: ec1c sd a5,24(s0) f64: 03043023 sd a6,32(s0) f68: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); f6c: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); f70: 8622 mv a2,s0 f72: d5bff0ef jal ccc <vprintf> +} f76: 60e2 ld ra,24(sp) f78: 6442 ld s0,16(sp) f7a: 6161 addi sp,sp,80 f7c: 8082 ret 0000000000000f7e <printf>: + +void +printf(const char *fmt, ...) +{ f7e: 711d addi sp,sp,-96 f80: ec06 sd ra,24(sp) f82: e822 sd s0,16(sp) @@ -1817,11 +2169,16 @@ main() f8e: f41c sd a5,40(s0) f90: 03043823 sd a6,48(s0) f94: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); f98: 00840613 addi a2,s0,8 f9c: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); fa0: 85aa mv a1,a0 fa2: 4505 li a0,1 fa4: d29ff0ef jal ccc <vprintf> +} fa8: 60e2 ld ra,24(sp) faa: 6442 ld s0,16(sp) fac: 6125 addi sp,sp,96 diff --git a/user/grind.o b/user/grind.o index 08b22a84b9592085eae452e9c15750eb015c7e02..db5afaea5b5e4482fd4847be43d796abe9bf8be3 100644 Binary files a/user/grind.o and b/user/grind.o differ diff --git a/user/init.asm b/user/init.asm index a681a1c5182c8be4349bb337b8ebab464ffae28e..cc610976730f1ca48d85bf4134c829298520f0c4 100644 --- a/user/init.asm +++ b/user/init.asm @@ -537,245 +537,123 @@ memcpy(void *dst, const void *src, uint n) 31c: 8082 ret 000000000000031e <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 31e: 4885 li a7,1 - ecall 320: 00000073 ecall - ret 324: 8082 ret 0000000000000326 <exit>: -.global exit -exit: - li a7, SYS_exit 326: 4889 li a7,2 - ecall 328: 00000073 ecall - ret 32c: 8082 ret 000000000000032e <wait>: -.global wait -wait: - li a7, SYS_wait 32e: 488d li a7,3 - ecall 330: 00000073 ecall - ret 334: 8082 ret 0000000000000336 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 336: 4891 li a7,4 - ecall 338: 00000073 ecall - ret 33c: 8082 ret 000000000000033e <read>: -.global read -read: - li a7, SYS_read 33e: 4895 li a7,5 - ecall 340: 00000073 ecall - ret 344: 8082 ret 0000000000000346 <write>: -.global write -write: - li a7, SYS_write 346: 48c1 li a7,16 - ecall 348: 00000073 ecall - ret 34c: 8082 ret 000000000000034e <close>: -.global close -close: - li a7, SYS_close 34e: 48d5 li a7,21 - ecall 350: 00000073 ecall - ret 354: 8082 ret 0000000000000356 <kill>: -.global kill -kill: - li a7, SYS_kill 356: 4899 li a7,6 - ecall 358: 00000073 ecall - ret 35c: 8082 ret 000000000000035e <exec>: -.global exec -exec: - li a7, SYS_exec 35e: 489d li a7,7 - ecall 360: 00000073 ecall - ret 364: 8082 ret 0000000000000366 <open>: -.global open -open: - li a7, SYS_open 366: 48bd li a7,15 - ecall 368: 00000073 ecall - ret 36c: 8082 ret 000000000000036e <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 36e: 48c5 li a7,17 - ecall 370: 00000073 ecall - ret 374: 8082 ret 0000000000000376 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 376: 48c9 li a7,18 - ecall 378: 00000073 ecall - ret 37c: 8082 ret 000000000000037e <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 37e: 48a1 li a7,8 - ecall 380: 00000073 ecall - ret 384: 8082 ret 0000000000000386 <link>: -.global link -link: - li a7, SYS_link 386: 48cd li a7,19 - ecall 388: 00000073 ecall - ret 38c: 8082 ret 000000000000038e <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 38e: 48d1 li a7,20 - ecall 390: 00000073 ecall - ret 394: 8082 ret 0000000000000396 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 396: 48a5 li a7,9 - ecall 398: 00000073 ecall - ret 39c: 8082 ret 000000000000039e <dup>: -.global dup -dup: - li a7, SYS_dup 39e: 48a9 li a7,10 - ecall 3a0: 00000073 ecall - ret 3a4: 8082 ret 00000000000003a6 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 3a6: 48ad li a7,11 - ecall 3a8: 00000073 ecall - ret 3ac: 8082 ret 00000000000003ae <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 3ae: 48b1 li a7,12 - ecall 3b0: 00000073 ecall - ret 3b4: 8082 ret 00000000000003b6 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 3b6: 48b5 li a7,13 - ecall 3b8: 00000073 ecall - ret 3bc: 8082 ret 00000000000003be <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 3be: 48b9 li a7,14 - ecall 3c0: 00000073 ecall - ret 3c4: 8082 ret 00000000000003c6 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 3c6: 48d9 li a7,22 - ecall 3c8: 00000073 ecall - ret 3cc: 8082 ret 00000000000003ce <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 3ce: 48dd li a7,23 - ecall 3d0: 00000073 ecall - ret 3d4: 8082 ret 00000000000003d6 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 3d6: 48e1 li a7,24 - ecall 3d8: 00000073 ecall - ret 3dc: 8082 ret 00000000000003de <putc>: @@ -1318,184 +1196,113 @@ printf(const char *fmt, ...) 786: 8082 ret 0000000000000788 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 788: 1141 addi sp,sp,-16 78a: e422 sd s0,8(sp) 78c: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 78e: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 792: 00001797 auipc a5,0x1 796: 87e7b783 ld a5,-1922(a5) # 1010 <freep> 79a: a02d j 7c4 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 79c: 4618 lw a4,8(a2) 79e: 9f2d addw a4,a4,a1 7a0: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 7a4: 6398 ld a4,0(a5) 7a6: 6310 ld a2,0(a4) 7a8: a83d j 7e6 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 7aa: ff852703 lw a4,-8(a0) 7ae: 9f31 addw a4,a4,a2 7b0: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 7b2: ff053683 ld a3,-16(a0) 7b6: a091 j 7fa <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7b8: 6398 ld a4,0(a5) 7ba: 00e7e463 bltu a5,a4,7c2 <free+0x3a> 7be: 00e6ea63 bltu a3,a4,7d2 <free+0x4a> -{ 7c2: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 7c4: fed7fae3 bgeu a5,a3,7b8 <free+0x30> 7c8: 6398 ld a4,0(a5) 7ca: 00e6e463 bltu a3,a4,7d2 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7ce: fee7eae3 bltu a5,a4,7c2 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 7d2: ff852583 lw a1,-8(a0) 7d6: 6390 ld a2,0(a5) 7d8: 02059813 slli a6,a1,0x20 7dc: 01c85713 srli a4,a6,0x1c 7e0: 9736 add a4,a4,a3 7e2: fae60de3 beq a2,a4,79c <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 7e6: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 7ea: 4790 lw a2,8(a5) 7ec: 02061593 slli a1,a2,0x20 7f0: 01c5d713 srli a4,a1,0x1c 7f4: 973e add a4,a4,a5 7f6: fae68ae3 beq a3,a4,7aa <free+0x22> - p->s.ptr = bp->s.ptr; 7fa: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 7fc: 00001717 auipc a4,0x1 800: 80f73a23 sd a5,-2028(a4) # 1010 <freep> -} 804: 6422 ld s0,8(sp) 806: 0141 addi sp,sp,16 808: 8082 ret 000000000000080a <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 80a: 7139 addi sp,sp,-64 80c: fc06 sd ra,56(sp) 80e: f822 sd s0,48(sp) 810: f426 sd s1,40(sp) 812: ec4e sd s3,24(sp) 814: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 816: 02051493 slli s1,a0,0x20 81a: 9081 srli s1,s1,0x20 81c: 04bd addi s1,s1,15 81e: 8091 srli s1,s1,0x4 820: 0014899b addiw s3,s1,1 824: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 826: 00000517 auipc a0,0x0 82a: 7ea53503 ld a0,2026(a0) # 1010 <freep> 82e: c915 beqz a0,862 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 830: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 832: 4798 lw a4,8(a5) 834: 08977a63 bgeu a4,s1,8c8 <malloc+0xbe> 838: f04a sd s2,32(sp) 83a: e852 sd s4,16(sp) 83c: e456 sd s5,8(sp) 83e: e05a sd s6,0(sp) - if(nu < 4096) 840: 8a4e mv s4,s3 842: 0009871b sext.w a4,s3 846: 6685 lui a3,0x1 848: 00d77363 bgeu a4,a3,84e <malloc+0x44> 84c: 6a05 lui s4,0x1 84e: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 852: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 856: 00000917 auipc s2,0x0 85a: 7ba90913 addi s2,s2,1978 # 1010 <freep> - if(p == (char*)-1) 85e: 5afd li s5,-1 860: a081 j 8a0 <malloc+0x96> 862: f04a sd s2,32(sp) 864: e852 sd s4,16(sp) 866: e456 sd s5,8(sp) 868: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 86a: 00000797 auipc a5,0x0 86e: 7b678793 addi a5,a5,1974 # 1020 <base> 872: 00000717 auipc a4,0x0 876: 78f73f23 sd a5,1950(a4) # 1010 <freep> 87a: e39c sd a5,0(a5) - base.s.size = 0; 87c: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 880: b7c1 j 840 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 882: 6398 ld a4,0(a5) 884: e118 sd a4,0(a0) 886: a8a9 j 8e0 <malloc+0xd6> - hp->s.size = nu; 888: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 88c: 0541 addi a0,a0,16 88e: efbff0ef jal 788 <free> - return freep; 892: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 896: c12d beqz a0,8f8 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 898: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 89a: 4798 lw a4,8(a5) 89c: 02977263 bgeu a4,s1,8c0 <malloc+0xb6> - if(p == freep) 8a0: 00093703 ld a4,0(s2) 8a4: 853e mv a0,a5 8a6: fef719e3 bne a4,a5,898 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 8aa: 8552 mv a0,s4 8ac: b03ff0ef jal 3ae <sbrk> - if(p == (char*)-1) 8b0: fd551ce3 bne a0,s5,888 <malloc+0x7e> - return 0; 8b4: 4501 li a0,0 8b6: 7902 ld s2,32(sp) 8b8: 6a42 ld s4,16(sp) @@ -1506,24 +1313,16 @@ malloc(uint nbytes) 8c2: 6a42 ld s4,16(sp) 8c4: 6aa2 ld s5,8(sp) 8c6: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 8c8: fae48de3 beq s1,a4,882 <malloc+0x78> - p->s.size -= nunits; 8cc: 4137073b subw a4,a4,s3 8d0: c798 sw a4,8(a5) - p += p->s.size; 8d2: 02071693 slli a3,a4,0x20 8d6: 01c6d713 srli a4,a3,0x1c 8da: 97ba add a5,a5,a4 - p->s.size = nunits; 8dc: 0137a423 sw s3,8(a5) - freep = prevp; 8e0: 00000717 auipc a4,0x0 8e4: 72a73823 sd a0,1840(a4) # 1010 <freep> - return (void*)(p + 1); 8e8: 01078513 addi a0,a5,16 - } -} 8ec: 70e2 ld ra,56(sp) 8ee: 7442 ld s0,48(sp) 8f0: 74a2 ld s1,40(sp) diff --git a/user/init.o b/user/init.o index dd0900f4be953c105f955aad16c3071c93c163c9..d88a403559899aca58f8d6bc67d0571fc7bb80bf 100644 Binary files a/user/init.o and b/user/init.o differ diff --git a/user/kill.asm b/user/kill.asm index a51a0107bda024076f07921a98f50a55aa7180f6..0219a1d6dd2a2bb07292b2a176b6ea686badd07b 100644 --- a/user/kill.asm +++ b/user/kill.asm @@ -485,245 +485,123 @@ memcpy(void *dst, const void *src, uint n) 2b4: 8082 ret 00000000000002b6 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 2b6: 4885 li a7,1 - ecall 2b8: 00000073 ecall - ret 2bc: 8082 ret 00000000000002be <exit>: -.global exit -exit: - li a7, SYS_exit 2be: 4889 li a7,2 - ecall 2c0: 00000073 ecall - ret 2c4: 8082 ret 00000000000002c6 <wait>: -.global wait -wait: - li a7, SYS_wait 2c6: 488d li a7,3 - ecall 2c8: 00000073 ecall - ret 2cc: 8082 ret 00000000000002ce <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 2ce: 4891 li a7,4 - ecall 2d0: 00000073 ecall - ret 2d4: 8082 ret 00000000000002d6 <read>: -.global read -read: - li a7, SYS_read 2d6: 4895 li a7,5 - ecall 2d8: 00000073 ecall - ret 2dc: 8082 ret 00000000000002de <write>: -.global write -write: - li a7, SYS_write 2de: 48c1 li a7,16 - ecall 2e0: 00000073 ecall - ret 2e4: 8082 ret 00000000000002e6 <close>: -.global close -close: - li a7, SYS_close 2e6: 48d5 li a7,21 - ecall 2e8: 00000073 ecall - ret 2ec: 8082 ret 00000000000002ee <kill>: -.global kill -kill: - li a7, SYS_kill 2ee: 4899 li a7,6 - ecall 2f0: 00000073 ecall - ret 2f4: 8082 ret 00000000000002f6 <exec>: -.global exec -exec: - li a7, SYS_exec 2f6: 489d li a7,7 - ecall 2f8: 00000073 ecall - ret 2fc: 8082 ret 00000000000002fe <open>: -.global open -open: - li a7, SYS_open 2fe: 48bd li a7,15 - ecall 300: 00000073 ecall - ret 304: 8082 ret 0000000000000306 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 306: 48c5 li a7,17 - ecall 308: 00000073 ecall - ret 30c: 8082 ret 000000000000030e <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 30e: 48c9 li a7,18 - ecall 310: 00000073 ecall - ret 314: 8082 ret 0000000000000316 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 316: 48a1 li a7,8 - ecall 318: 00000073 ecall - ret 31c: 8082 ret 000000000000031e <link>: -.global link -link: - li a7, SYS_link 31e: 48cd li a7,19 - ecall 320: 00000073 ecall - ret 324: 8082 ret 0000000000000326 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 326: 48d1 li a7,20 - ecall 328: 00000073 ecall - ret 32c: 8082 ret 000000000000032e <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 32e: 48a5 li a7,9 - ecall 330: 00000073 ecall - ret 334: 8082 ret 0000000000000336 <dup>: -.global dup -dup: - li a7, SYS_dup 336: 48a9 li a7,10 - ecall 338: 00000073 ecall - ret 33c: 8082 ret 000000000000033e <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 33e: 48ad li a7,11 - ecall 340: 00000073 ecall - ret 344: 8082 ret 0000000000000346 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 346: 48b1 li a7,12 - ecall 348: 00000073 ecall - ret 34c: 8082 ret 000000000000034e <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 34e: 48b5 li a7,13 - ecall 350: 00000073 ecall - ret 354: 8082 ret 0000000000000356 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 356: 48b9 li a7,14 - ecall 358: 00000073 ecall - ret 35c: 8082 ret 000000000000035e <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 35e: 48d9 li a7,22 - ecall 360: 00000073 ecall - ret 364: 8082 ret 0000000000000366 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 366: 48dd li a7,23 - ecall 368: 00000073 ecall - ret 36c: 8082 ret 000000000000036e <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 36e: 48e1 li a7,24 - ecall 370: 00000073 ecall - ret 374: 8082 ret 0000000000000376 <putc>: @@ -1266,184 +1144,113 @@ printf(const char *fmt, ...) 71e: 8082 ret 0000000000000720 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 720: 1141 addi sp,sp,-16 722: e422 sd s0,8(sp) 724: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 726: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 72a: 00001797 auipc a5,0x1 72e: 8d67b783 ld a5,-1834(a5) # 1000 <freep> 732: a02d j 75c <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 734: 4618 lw a4,8(a2) 736: 9f2d addw a4,a4,a1 738: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 73c: 6398 ld a4,0(a5) 73e: 6310 ld a2,0(a4) 740: a83d j 77e <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 742: ff852703 lw a4,-8(a0) 746: 9f31 addw a4,a4,a2 748: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 74a: ff053683 ld a3,-16(a0) 74e: a091 j 792 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 750: 6398 ld a4,0(a5) 752: 00e7e463 bltu a5,a4,75a <free+0x3a> 756: 00e6ea63 bltu a3,a4,76a <free+0x4a> -{ 75a: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 75c: fed7fae3 bgeu a5,a3,750 <free+0x30> 760: 6398 ld a4,0(a5) 762: 00e6e463 bltu a3,a4,76a <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 766: fee7eae3 bltu a5,a4,75a <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 76a: ff852583 lw a1,-8(a0) 76e: 6390 ld a2,0(a5) 770: 02059813 slli a6,a1,0x20 774: 01c85713 srli a4,a6,0x1c 778: 9736 add a4,a4,a3 77a: fae60de3 beq a2,a4,734 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 77e: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 782: 4790 lw a2,8(a5) 784: 02061593 slli a1,a2,0x20 788: 01c5d713 srli a4,a1,0x1c 78c: 973e add a4,a4,a5 78e: fae68ae3 beq a3,a4,742 <free+0x22> - p->s.ptr = bp->s.ptr; 792: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 794: 00001717 auipc a4,0x1 798: 86f73623 sd a5,-1940(a4) # 1000 <freep> -} 79c: 6422 ld s0,8(sp) 79e: 0141 addi sp,sp,16 7a0: 8082 ret 00000000000007a2 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 7a2: 7139 addi sp,sp,-64 7a4: fc06 sd ra,56(sp) 7a6: f822 sd s0,48(sp) 7a8: f426 sd s1,40(sp) 7aa: ec4e sd s3,24(sp) 7ac: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 7ae: 02051493 slli s1,a0,0x20 7b2: 9081 srli s1,s1,0x20 7b4: 04bd addi s1,s1,15 7b6: 8091 srli s1,s1,0x4 7b8: 0014899b addiw s3,s1,1 7bc: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 7be: 00001517 auipc a0,0x1 7c2: 84253503 ld a0,-1982(a0) # 1000 <freep> 7c6: c915 beqz a0,7fa <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 7c8: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 7ca: 4798 lw a4,8(a5) 7cc: 08977a63 bgeu a4,s1,860 <malloc+0xbe> 7d0: f04a sd s2,32(sp) 7d2: e852 sd s4,16(sp) 7d4: e456 sd s5,8(sp) 7d6: e05a sd s6,0(sp) - if(nu < 4096) 7d8: 8a4e mv s4,s3 7da: 0009871b sext.w a4,s3 7de: 6685 lui a3,0x1 7e0: 00d77363 bgeu a4,a3,7e6 <malloc+0x44> 7e4: 6a05 lui s4,0x1 7e6: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 7ea: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 7ee: 00001917 auipc s2,0x1 7f2: 81290913 addi s2,s2,-2030 # 1000 <freep> - if(p == (char*)-1) 7f6: 5afd li s5,-1 7f8: a081 j 838 <malloc+0x96> 7fa: f04a sd s2,32(sp) 7fc: e852 sd s4,16(sp) 7fe: e456 sd s5,8(sp) 800: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 802: 00001797 auipc a5,0x1 806: 80e78793 addi a5,a5,-2034 # 1010 <base> 80a: 00000717 auipc a4,0x0 80e: 7ef73b23 sd a5,2038(a4) # 1000 <freep> 812: e39c sd a5,0(a5) - base.s.size = 0; 814: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 818: b7c1 j 7d8 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 81a: 6398 ld a4,0(a5) 81c: e118 sd a4,0(a0) 81e: a8a9 j 878 <malloc+0xd6> - hp->s.size = nu; 820: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 824: 0541 addi a0,a0,16 826: efbff0ef jal 720 <free> - return freep; 82a: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 82e: c12d beqz a0,890 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 830: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 832: 4798 lw a4,8(a5) 834: 02977263 bgeu a4,s1,858 <malloc+0xb6> - if(p == freep) 838: 00093703 ld a4,0(s2) 83c: 853e mv a0,a5 83e: fef719e3 bne a4,a5,830 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 842: 8552 mv a0,s4 844: b03ff0ef jal 346 <sbrk> - if(p == (char*)-1) 848: fd551ce3 bne a0,s5,820 <malloc+0x7e> - return 0; 84c: 4501 li a0,0 84e: 7902 ld s2,32(sp) 850: 6a42 ld s4,16(sp) @@ -1454,24 +1261,16 @@ malloc(uint nbytes) 85a: 6a42 ld s4,16(sp) 85c: 6aa2 ld s5,8(sp) 85e: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 860: fae48de3 beq s1,a4,81a <malloc+0x78> - p->s.size -= nunits; 864: 4137073b subw a4,a4,s3 868: c798 sw a4,8(a5) - p += p->s.size; 86a: 02071693 slli a3,a4,0x20 86e: 01c6d713 srli a4,a3,0x1c 872: 97ba add a5,a5,a4 - p->s.size = nunits; 874: 0137a423 sw s3,8(a5) - freep = prevp; 878: 00000717 auipc a4,0x0 87c: 78a73423 sd a0,1928(a4) # 1000 <freep> - return (void*)(p + 1); 880: 01078513 addi a0,a5,16 - } -} 884: 70e2 ld ra,56(sp) 886: 7442 ld s0,48(sp) 888: 74a2 ld s1,40(sp) diff --git a/user/kill.o b/user/kill.o index 9262438323702de3c6ae36b5763096dd010fb1af..b734a1550e57580c757ccf169c12e1bc05c97dbc 100644 Binary files a/user/kill.o and b/user/kill.o differ diff --git a/user/ln.asm b/user/ln.asm index f96ef7a13c13c490c3d9893024cc9852ab28b49f..d4098f3b72fbe06c7955e7a333a6e95353f260d3 100644 --- a/user/ln.asm +++ b/user/ln.asm @@ -480,245 +480,123 @@ memcpy(void *dst, const void *src, uint n) 2ae: 8082 ret 00000000000002b0 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 2b0: 4885 li a7,1 - ecall 2b2: 00000073 ecall - ret 2b6: 8082 ret 00000000000002b8 <exit>: -.global exit -exit: - li a7, SYS_exit 2b8: 4889 li a7,2 - ecall 2ba: 00000073 ecall - ret 2be: 8082 ret 00000000000002c0 <wait>: -.global wait -wait: - li a7, SYS_wait 2c0: 488d li a7,3 - ecall 2c2: 00000073 ecall - ret 2c6: 8082 ret 00000000000002c8 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 2c8: 4891 li a7,4 - ecall 2ca: 00000073 ecall - ret 2ce: 8082 ret 00000000000002d0 <read>: -.global read -read: - li a7, SYS_read 2d0: 4895 li a7,5 - ecall 2d2: 00000073 ecall - ret 2d6: 8082 ret 00000000000002d8 <write>: -.global write -write: - li a7, SYS_write 2d8: 48c1 li a7,16 - ecall 2da: 00000073 ecall - ret 2de: 8082 ret 00000000000002e0 <close>: -.global close -close: - li a7, SYS_close 2e0: 48d5 li a7,21 - ecall 2e2: 00000073 ecall - ret 2e6: 8082 ret 00000000000002e8 <kill>: -.global kill -kill: - li a7, SYS_kill 2e8: 4899 li a7,6 - ecall 2ea: 00000073 ecall - ret 2ee: 8082 ret 00000000000002f0 <exec>: -.global exec -exec: - li a7, SYS_exec 2f0: 489d li a7,7 - ecall 2f2: 00000073 ecall - ret 2f6: 8082 ret 00000000000002f8 <open>: -.global open -open: - li a7, SYS_open 2f8: 48bd li a7,15 - ecall 2fa: 00000073 ecall - ret 2fe: 8082 ret 0000000000000300 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 300: 48c5 li a7,17 - ecall 302: 00000073 ecall - ret 306: 8082 ret 0000000000000308 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 308: 48c9 li a7,18 - ecall 30a: 00000073 ecall - ret 30e: 8082 ret 0000000000000310 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 310: 48a1 li a7,8 - ecall 312: 00000073 ecall - ret 316: 8082 ret 0000000000000318 <link>: -.global link -link: - li a7, SYS_link 318: 48cd li a7,19 - ecall 31a: 00000073 ecall - ret 31e: 8082 ret 0000000000000320 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 320: 48d1 li a7,20 - ecall 322: 00000073 ecall - ret 326: 8082 ret 0000000000000328 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 328: 48a5 li a7,9 - ecall 32a: 00000073 ecall - ret 32e: 8082 ret 0000000000000330 <dup>: -.global dup -dup: - li a7, SYS_dup 330: 48a9 li a7,10 - ecall 332: 00000073 ecall - ret 336: 8082 ret 0000000000000338 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 338: 48ad li a7,11 - ecall 33a: 00000073 ecall - ret 33e: 8082 ret 0000000000000340 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 340: 48b1 li a7,12 - ecall 342: 00000073 ecall - ret 346: 8082 ret 0000000000000348 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 348: 48b5 li a7,13 - ecall 34a: 00000073 ecall - ret 34e: 8082 ret 0000000000000350 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 350: 48b9 li a7,14 - ecall 352: 00000073 ecall - ret 356: 8082 ret 0000000000000358 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 358: 48d9 li a7,22 - ecall 35a: 00000073 ecall - ret 35e: 8082 ret 0000000000000360 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 360: 48dd li a7,23 - ecall 362: 00000073 ecall - ret 366: 8082 ret 0000000000000368 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 368: 48e1 li a7,24 - ecall 36a: 00000073 ecall - ret 36e: 8082 ret 0000000000000370 <putc>: @@ -1261,184 +1139,113 @@ printf(const char *fmt, ...) 718: 8082 ret 000000000000071a <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 71a: 1141 addi sp,sp,-16 71c: e422 sd s0,8(sp) 71e: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 720: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 724: 00001797 auipc a5,0x1 728: 8dc7b783 ld a5,-1828(a5) # 1000 <freep> 72c: a02d j 756 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 72e: 4618 lw a4,8(a2) 730: 9f2d addw a4,a4,a1 732: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 736: 6398 ld a4,0(a5) 738: 6310 ld a2,0(a4) 73a: a83d j 778 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 73c: ff852703 lw a4,-8(a0) 740: 9f31 addw a4,a4,a2 742: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 744: ff053683 ld a3,-16(a0) 748: a091 j 78c <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 74a: 6398 ld a4,0(a5) 74c: 00e7e463 bltu a5,a4,754 <free+0x3a> 750: 00e6ea63 bltu a3,a4,764 <free+0x4a> -{ 754: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 756: fed7fae3 bgeu a5,a3,74a <free+0x30> 75a: 6398 ld a4,0(a5) 75c: 00e6e463 bltu a3,a4,764 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 760: fee7eae3 bltu a5,a4,754 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 764: ff852583 lw a1,-8(a0) 768: 6390 ld a2,0(a5) 76a: 02059813 slli a6,a1,0x20 76e: 01c85713 srli a4,a6,0x1c 772: 9736 add a4,a4,a3 774: fae60de3 beq a2,a4,72e <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 778: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 77c: 4790 lw a2,8(a5) 77e: 02061593 slli a1,a2,0x20 782: 01c5d713 srli a4,a1,0x1c 786: 973e add a4,a4,a5 788: fae68ae3 beq a3,a4,73c <free+0x22> - p->s.ptr = bp->s.ptr; 78c: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 78e: 00001717 auipc a4,0x1 792: 86f73923 sd a5,-1934(a4) # 1000 <freep> -} 796: 6422 ld s0,8(sp) 798: 0141 addi sp,sp,16 79a: 8082 ret 000000000000079c <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 79c: 7139 addi sp,sp,-64 79e: fc06 sd ra,56(sp) 7a0: f822 sd s0,48(sp) 7a2: f426 sd s1,40(sp) 7a4: ec4e sd s3,24(sp) 7a6: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 7a8: 02051493 slli s1,a0,0x20 7ac: 9081 srli s1,s1,0x20 7ae: 04bd addi s1,s1,15 7b0: 8091 srli s1,s1,0x4 7b2: 0014899b addiw s3,s1,1 7b6: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 7b8: 00001517 auipc a0,0x1 7bc: 84853503 ld a0,-1976(a0) # 1000 <freep> 7c0: c915 beqz a0,7f4 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 7c2: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 7c4: 4798 lw a4,8(a5) 7c6: 08977a63 bgeu a4,s1,85a <malloc+0xbe> 7ca: f04a sd s2,32(sp) 7cc: e852 sd s4,16(sp) 7ce: e456 sd s5,8(sp) 7d0: e05a sd s6,0(sp) - if(nu < 4096) 7d2: 8a4e mv s4,s3 7d4: 0009871b sext.w a4,s3 7d8: 6685 lui a3,0x1 7da: 00d77363 bgeu a4,a3,7e0 <malloc+0x44> 7de: 6a05 lui s4,0x1 7e0: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 7e4: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 7e8: 00001917 auipc s2,0x1 7ec: 81890913 addi s2,s2,-2024 # 1000 <freep> - if(p == (char*)-1) 7f0: 5afd li s5,-1 7f2: a081 j 832 <malloc+0x96> 7f4: f04a sd s2,32(sp) 7f6: e852 sd s4,16(sp) 7f8: e456 sd s5,8(sp) 7fa: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 7fc: 00001797 auipc a5,0x1 800: 81478793 addi a5,a5,-2028 # 1010 <base> 804: 00000717 auipc a4,0x0 808: 7ef73e23 sd a5,2044(a4) # 1000 <freep> 80c: e39c sd a5,0(a5) - base.s.size = 0; 80e: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 812: b7c1 j 7d2 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 814: 6398 ld a4,0(a5) 816: e118 sd a4,0(a0) 818: a8a9 j 872 <malloc+0xd6> - hp->s.size = nu; 81a: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 81e: 0541 addi a0,a0,16 820: efbff0ef jal 71a <free> - return freep; 824: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 828: c12d beqz a0,88a <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 82a: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 82c: 4798 lw a4,8(a5) 82e: 02977263 bgeu a4,s1,852 <malloc+0xb6> - if(p == freep) 832: 00093703 ld a4,0(s2) 836: 853e mv a0,a5 838: fef719e3 bne a4,a5,82a <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 83c: 8552 mv a0,s4 83e: b03ff0ef jal 340 <sbrk> - if(p == (char*)-1) 842: fd551ce3 bne a0,s5,81a <malloc+0x7e> - return 0; 846: 4501 li a0,0 848: 7902 ld s2,32(sp) 84a: 6a42 ld s4,16(sp) @@ -1449,24 +1256,16 @@ malloc(uint nbytes) 854: 6a42 ld s4,16(sp) 856: 6aa2 ld s5,8(sp) 858: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 85a: fae48de3 beq s1,a4,814 <malloc+0x78> - p->s.size -= nunits; 85e: 4137073b subw a4,a4,s3 862: c798 sw a4,8(a5) - p += p->s.size; 864: 02071693 slli a3,a4,0x20 868: 01c6d713 srli a4,a3,0x1c 86c: 97ba add a5,a5,a4 - p->s.size = nunits; 86e: 0137a423 sw s3,8(a5) - freep = prevp; 872: 00000717 auipc a4,0x0 876: 78a73723 sd a0,1934(a4) # 1000 <freep> - return (void*)(p + 1); 87a: 01078513 addi a0,a5,16 - } -} 87e: 70e2 ld ra,56(sp) 880: 7442 ld s0,48(sp) 882: 74a2 ld s1,40(sp) diff --git a/user/ln.o b/user/ln.o index 4c6fd0708515c19ee1831af975828734e64e5392..32992fb062f3608da9cda9ccfa3e017d394f6ca4 100644 Binary files a/user/ln.o and b/user/ln.o differ diff --git a/user/locktest.asm b/user/locktest.asm index 2a68c7a69f85ac43ff0a2baa560cff9d47e08586..7d467fd7eb62524157ceb047963b85960bb4c0d4 100644 --- a/user/locktest.asm +++ b/user/locktest.asm @@ -619,245 +619,123 @@ memcpy(void *dst, const void *src, uint n) 3d8: 8082 ret 00000000000003da <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 3da: 4885 li a7,1 - ecall 3dc: 00000073 ecall - ret 3e0: 8082 ret 00000000000003e2 <exit>: -.global exit -exit: - li a7, SYS_exit 3e2: 4889 li a7,2 - ecall 3e4: 00000073 ecall - ret 3e8: 8082 ret 00000000000003ea <wait>: -.global wait -wait: - li a7, SYS_wait 3ea: 488d li a7,3 - ecall 3ec: 00000073 ecall - ret 3f0: 8082 ret 00000000000003f2 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 3f2: 4891 li a7,4 - ecall 3f4: 00000073 ecall - ret 3f8: 8082 ret 00000000000003fa <read>: -.global read -read: - li a7, SYS_read 3fa: 4895 li a7,5 - ecall 3fc: 00000073 ecall - ret 400: 8082 ret 0000000000000402 <write>: -.global write -write: - li a7, SYS_write 402: 48c1 li a7,16 - ecall 404: 00000073 ecall - ret 408: 8082 ret 000000000000040a <close>: -.global close -close: - li a7, SYS_close 40a: 48d5 li a7,21 - ecall 40c: 00000073 ecall - ret 410: 8082 ret 0000000000000412 <kill>: -.global kill -kill: - li a7, SYS_kill 412: 4899 li a7,6 - ecall 414: 00000073 ecall - ret 418: 8082 ret 000000000000041a <exec>: -.global exec -exec: - li a7, SYS_exec 41a: 489d li a7,7 - ecall 41c: 00000073 ecall - ret 420: 8082 ret 0000000000000422 <open>: -.global open -open: - li a7, SYS_open 422: 48bd li a7,15 - ecall 424: 00000073 ecall - ret 428: 8082 ret 000000000000042a <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 42a: 48c5 li a7,17 - ecall 42c: 00000073 ecall - ret 430: 8082 ret 0000000000000432 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 432: 48c9 li a7,18 - ecall 434: 00000073 ecall - ret 438: 8082 ret 000000000000043a <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 43a: 48a1 li a7,8 - ecall 43c: 00000073 ecall - ret 440: 8082 ret 0000000000000442 <link>: -.global link -link: - li a7, SYS_link 442: 48cd li a7,19 - ecall 444: 00000073 ecall - ret 448: 8082 ret 000000000000044a <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 44a: 48d1 li a7,20 - ecall 44c: 00000073 ecall - ret 450: 8082 ret 0000000000000452 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 452: 48a5 li a7,9 - ecall 454: 00000073 ecall - ret 458: 8082 ret 000000000000045a <dup>: -.global dup -dup: - li a7, SYS_dup 45a: 48a9 li a7,10 - ecall 45c: 00000073 ecall - ret 460: 8082 ret 0000000000000462 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 462: 48ad li a7,11 - ecall 464: 00000073 ecall - ret 468: 8082 ret 000000000000046a <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 46a: 48b1 li a7,12 - ecall 46c: 00000073 ecall - ret 470: 8082 ret 0000000000000472 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 472: 48b5 li a7,13 - ecall 474: 00000073 ecall - ret 478: 8082 ret 000000000000047a <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 47a: 48b9 li a7,14 - ecall 47c: 00000073 ecall - ret 480: 8082 ret 0000000000000482 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 482: 48d9 li a7,22 - ecall 484: 00000073 ecall - ret 488: 8082 ret 000000000000048a <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 48a: 48dd li a7,23 - ecall 48c: 00000073 ecall - ret 490: 8082 ret 0000000000000492 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 492: 48e1 li a7,24 - ecall 494: 00000073 ecall - ret 498: 8082 ret 000000000000049a <putc>: @@ -1400,184 +1278,113 @@ printf(const char *fmt, ...) 842: 8082 ret 0000000000000844 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 844: 1141 addi sp,sp,-16 846: e422 sd s0,8(sp) 848: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 84a: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 84e: 00000797 auipc a5,0x0 852: 7b27b783 ld a5,1970(a5) # 1000 <freep> 856: a02d j 880 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 858: 4618 lw a4,8(a2) 85a: 9f2d addw a4,a4,a1 85c: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 860: 6398 ld a4,0(a5) 862: 6310 ld a2,0(a4) 864: a83d j 8a2 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 866: ff852703 lw a4,-8(a0) 86a: 9f31 addw a4,a4,a2 86c: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 86e: ff053683 ld a3,-16(a0) 872: a091 j 8b6 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 874: 6398 ld a4,0(a5) 876: 00e7e463 bltu a5,a4,87e <free+0x3a> 87a: 00e6ea63 bltu a3,a4,88e <free+0x4a> -{ 87e: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 880: fed7fae3 bgeu a5,a3,874 <free+0x30> 884: 6398 ld a4,0(a5) 886: 00e6e463 bltu a3,a4,88e <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 88a: fee7eae3 bltu a5,a4,87e <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 88e: ff852583 lw a1,-8(a0) 892: 6390 ld a2,0(a5) 894: 02059813 slli a6,a1,0x20 898: 01c85713 srli a4,a6,0x1c 89c: 9736 add a4,a4,a3 89e: fae60de3 beq a2,a4,858 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 8a2: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 8a6: 4790 lw a2,8(a5) 8a8: 02061593 slli a1,a2,0x20 8ac: 01c5d713 srli a4,a1,0x1c 8b0: 973e add a4,a4,a5 8b2: fae68ae3 beq a3,a4,866 <free+0x22> - p->s.ptr = bp->s.ptr; 8b6: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 8b8: 00000717 auipc a4,0x0 8bc: 74f73423 sd a5,1864(a4) # 1000 <freep> -} 8c0: 6422 ld s0,8(sp) 8c2: 0141 addi sp,sp,16 8c4: 8082 ret 00000000000008c6 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 8c6: 7139 addi sp,sp,-64 8c8: fc06 sd ra,56(sp) 8ca: f822 sd s0,48(sp) 8cc: f426 sd s1,40(sp) 8ce: ec4e sd s3,24(sp) 8d0: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 8d2: 02051493 slli s1,a0,0x20 8d6: 9081 srli s1,s1,0x20 8d8: 04bd addi s1,s1,15 8da: 8091 srli s1,s1,0x4 8dc: 0014899b addiw s3,s1,1 8e0: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 8e2: 00000517 auipc a0,0x0 8e6: 71e53503 ld a0,1822(a0) # 1000 <freep> 8ea: c915 beqz a0,91e <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 8ec: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 8ee: 4798 lw a4,8(a5) 8f0: 08977a63 bgeu a4,s1,984 <malloc+0xbe> 8f4: f04a sd s2,32(sp) 8f6: e852 sd s4,16(sp) 8f8: e456 sd s5,8(sp) 8fa: e05a sd s6,0(sp) - if(nu < 4096) 8fc: 8a4e mv s4,s3 8fe: 0009871b sext.w a4,s3 902: 6685 lui a3,0x1 904: 00d77363 bgeu a4,a3,90a <malloc+0x44> 908: 6a05 lui s4,0x1 90a: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 90e: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 912: 00000917 auipc s2,0x0 916: 6ee90913 addi s2,s2,1774 # 1000 <freep> - if(p == (char*)-1) 91a: 5afd li s5,-1 91c: a081 j 95c <malloc+0x96> 91e: f04a sd s2,32(sp) 920: e852 sd s4,16(sp) 922: e456 sd s5,8(sp) 924: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 926: 00000797 auipc a5,0x0 92a: 6ea78793 addi a5,a5,1770 # 1010 <base> 92e: 00000717 auipc a4,0x0 932: 6cf73923 sd a5,1746(a4) # 1000 <freep> 936: e39c sd a5,0(a5) - base.s.size = 0; 938: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 93c: b7c1 j 8fc <malloc+0x36> - prevp->s.ptr = p->s.ptr; 93e: 6398 ld a4,0(a5) 940: e118 sd a4,0(a0) 942: a8a9 j 99c <malloc+0xd6> - hp->s.size = nu; 944: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 948: 0541 addi a0,a0,16 94a: efbff0ef jal 844 <free> - return freep; 94e: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 952: c12d beqz a0,9b4 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 954: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 956: 4798 lw a4,8(a5) 958: 02977263 bgeu a4,s1,97c <malloc+0xb6> - if(p == freep) 95c: 00093703 ld a4,0(s2) 960: 853e mv a0,a5 962: fef719e3 bne a4,a5,954 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 966: 8552 mv a0,s4 968: b03ff0ef jal 46a <sbrk> - if(p == (char*)-1) 96c: fd551ce3 bne a0,s5,944 <malloc+0x7e> - return 0; 970: 4501 li a0,0 972: 7902 ld s2,32(sp) 974: 6a42 ld s4,16(sp) @@ -1588,24 +1395,16 @@ malloc(uint nbytes) 97e: 6a42 ld s4,16(sp) 980: 6aa2 ld s5,8(sp) 982: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 984: fae48de3 beq s1,a4,93e <malloc+0x78> - p->s.size -= nunits; 988: 4137073b subw a4,a4,s3 98c: c798 sw a4,8(a5) - p += p->s.size; 98e: 02071693 slli a3,a4,0x20 992: 01c6d713 srli a4,a3,0x1c 996: 97ba add a5,a5,a4 - p->s.size = nunits; 998: 0137a423 sw s3,8(a5) - freep = prevp; 99c: 00000717 auipc a4,0x0 9a0: 66a73223 sd a0,1636(a4) # 1000 <freep> - return (void*)(p + 1); 9a4: 01078513 addi a0,a5,16 - } -} 9a8: 70e2 ld ra,56(sp) 9aa: 7442 ld s0,48(sp) 9ac: 74a2 ld s1,40(sp) diff --git a/user/locktest.o b/user/locktest.o index 48a919e76e1cf46583f4ce089687811c1c606a95..b01fac9f17e90c23735ee064d5d564ac3090a54f 100644 Binary files a/user/locktest.o and b/user/locktest.o differ diff --git a/user/ls.asm b/user/ls.asm index 3778a5dd81e113c40ace804f1b172a03c52b1fd5..553c061a6b0614b99eb11e576e8d436612a8a81f 100644 --- a/user/ls.asm +++ b/user/ls.asm @@ -730,245 +730,123 @@ memcpy(void *dst, const void *src, uint n) 4c8: 8082 ret 00000000000004ca <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 4ca: 4885 li a7,1 - ecall 4cc: 00000073 ecall - ret 4d0: 8082 ret 00000000000004d2 <exit>: -.global exit -exit: - li a7, SYS_exit 4d2: 4889 li a7,2 - ecall 4d4: 00000073 ecall - ret 4d8: 8082 ret 00000000000004da <wait>: -.global wait -wait: - li a7, SYS_wait 4da: 488d li a7,3 - ecall 4dc: 00000073 ecall - ret 4e0: 8082 ret 00000000000004e2 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 4e2: 4891 li a7,4 - ecall 4e4: 00000073 ecall - ret 4e8: 8082 ret 00000000000004ea <read>: -.global read -read: - li a7, SYS_read 4ea: 4895 li a7,5 - ecall 4ec: 00000073 ecall - ret 4f0: 8082 ret 00000000000004f2 <write>: -.global write -write: - li a7, SYS_write 4f2: 48c1 li a7,16 - ecall 4f4: 00000073 ecall - ret 4f8: 8082 ret 00000000000004fa <close>: -.global close -close: - li a7, SYS_close 4fa: 48d5 li a7,21 - ecall 4fc: 00000073 ecall - ret 500: 8082 ret 0000000000000502 <kill>: -.global kill -kill: - li a7, SYS_kill 502: 4899 li a7,6 - ecall 504: 00000073 ecall - ret 508: 8082 ret 000000000000050a <exec>: -.global exec -exec: - li a7, SYS_exec 50a: 489d li a7,7 - ecall 50c: 00000073 ecall - ret 510: 8082 ret 0000000000000512 <open>: -.global open -open: - li a7, SYS_open 512: 48bd li a7,15 - ecall 514: 00000073 ecall - ret 518: 8082 ret 000000000000051a <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 51a: 48c5 li a7,17 - ecall 51c: 00000073 ecall - ret 520: 8082 ret 0000000000000522 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 522: 48c9 li a7,18 - ecall 524: 00000073 ecall - ret 528: 8082 ret 000000000000052a <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 52a: 48a1 li a7,8 - ecall 52c: 00000073 ecall - ret 530: 8082 ret 0000000000000532 <link>: -.global link -link: - li a7, SYS_link 532: 48cd li a7,19 - ecall 534: 00000073 ecall - ret 538: 8082 ret 000000000000053a <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 53a: 48d1 li a7,20 - ecall 53c: 00000073 ecall - ret 540: 8082 ret 0000000000000542 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 542: 48a5 li a7,9 - ecall 544: 00000073 ecall - ret 548: 8082 ret 000000000000054a <dup>: -.global dup -dup: - li a7, SYS_dup 54a: 48a9 li a7,10 - ecall 54c: 00000073 ecall - ret 550: 8082 ret 0000000000000552 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 552: 48ad li a7,11 - ecall 554: 00000073 ecall - ret 558: 8082 ret 000000000000055a <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 55a: 48b1 li a7,12 - ecall 55c: 00000073 ecall - ret 560: 8082 ret 0000000000000562 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 562: 48b5 li a7,13 - ecall 564: 00000073 ecall - ret 568: 8082 ret 000000000000056a <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 56a: 48b9 li a7,14 - ecall 56c: 00000073 ecall - ret 570: 8082 ret 0000000000000572 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 572: 48d9 li a7,22 - ecall 574: 00000073 ecall - ret 578: 8082 ret 000000000000057a <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 57a: 48dd li a7,23 - ecall 57c: 00000073 ecall - ret 580: 8082 ret 0000000000000582 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 582: 48e1 li a7,24 - ecall 584: 00000073 ecall - ret 588: 8082 ret 000000000000058a <putc>: @@ -1511,184 +1389,113 @@ printf(const char *fmt, ...) 932: 8082 ret 0000000000000934 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 934: 1141 addi sp,sp,-16 936: e422 sd s0,8(sp) 938: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 93a: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 93e: 00000797 auipc a5,0x0 942: 6c27b783 ld a5,1730(a5) # 1000 <freep> 946: a02d j 970 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 948: 4618 lw a4,8(a2) 94a: 9f2d addw a4,a4,a1 94c: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 950: 6398 ld a4,0(a5) 952: 6310 ld a2,0(a4) 954: a83d j 992 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 956: ff852703 lw a4,-8(a0) 95a: 9f31 addw a4,a4,a2 95c: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 95e: ff053683 ld a3,-16(a0) 962: a091 j 9a6 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 964: 6398 ld a4,0(a5) 966: 00e7e463 bltu a5,a4,96e <free+0x3a> 96a: 00e6ea63 bltu a3,a4,97e <free+0x4a> -{ 96e: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 970: fed7fae3 bgeu a5,a3,964 <free+0x30> 974: 6398 ld a4,0(a5) 976: 00e6e463 bltu a3,a4,97e <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 97a: fee7eae3 bltu a5,a4,96e <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 97e: ff852583 lw a1,-8(a0) 982: 6390 ld a2,0(a5) 984: 02059813 slli a6,a1,0x20 988: 01c85713 srli a4,a6,0x1c 98c: 9736 add a4,a4,a3 98e: fae60de3 beq a2,a4,948 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 992: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 996: 4790 lw a2,8(a5) 998: 02061593 slli a1,a2,0x20 99c: 01c5d713 srli a4,a1,0x1c 9a0: 973e add a4,a4,a5 9a2: fae68ae3 beq a3,a4,956 <free+0x22> - p->s.ptr = bp->s.ptr; 9a6: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 9a8: 00000717 auipc a4,0x0 9ac: 64f73c23 sd a5,1624(a4) # 1000 <freep> -} 9b0: 6422 ld s0,8(sp) 9b2: 0141 addi sp,sp,16 9b4: 8082 ret 00000000000009b6 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 9b6: 7139 addi sp,sp,-64 9b8: fc06 sd ra,56(sp) 9ba: f822 sd s0,48(sp) 9bc: f426 sd s1,40(sp) 9be: ec4e sd s3,24(sp) 9c0: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 9c2: 02051493 slli s1,a0,0x20 9c6: 9081 srli s1,s1,0x20 9c8: 04bd addi s1,s1,15 9ca: 8091 srli s1,s1,0x4 9cc: 0014899b addiw s3,s1,1 9d0: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 9d2: 00000517 auipc a0,0x0 9d6: 62e53503 ld a0,1582(a0) # 1000 <freep> 9da: c915 beqz a0,a0e <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 9dc: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 9de: 4798 lw a4,8(a5) 9e0: 08977a63 bgeu a4,s1,a74 <malloc+0xbe> 9e4: f04a sd s2,32(sp) 9e6: e852 sd s4,16(sp) 9e8: e456 sd s5,8(sp) 9ea: e05a sd s6,0(sp) - if(nu < 4096) 9ec: 8a4e mv s4,s3 9ee: 0009871b sext.w a4,s3 9f2: 6685 lui a3,0x1 9f4: 00d77363 bgeu a4,a3,9fa <malloc+0x44> 9f8: 6a05 lui s4,0x1 9fa: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 9fe: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) a02: 00000917 auipc s2,0x0 a06: 5fe90913 addi s2,s2,1534 # 1000 <freep> - if(p == (char*)-1) a0a: 5afd li s5,-1 a0c: a081 j a4c <malloc+0x96> a0e: f04a sd s2,32(sp) a10: e852 sd s4,16(sp) a12: e456 sd s5,8(sp) a14: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; a16: 00000797 auipc a5,0x0 a1a: 60a78793 addi a5,a5,1546 # 1020 <base> a1e: 00000717 auipc a4,0x0 a22: 5ef73123 sd a5,1506(a4) # 1000 <freep> a26: e39c sd a5,0(a5) - base.s.size = 0; a28: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ a2c: b7c1 j 9ec <malloc+0x36> - prevp->s.ptr = p->s.ptr; a2e: 6398 ld a4,0(a5) a30: e118 sd a4,0(a0) a32: a8a9 j a8c <malloc+0xd6> - hp->s.size = nu; a34: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); a38: 0541 addi a0,a0,16 a3a: efbff0ef jal 934 <free> - return freep; a3e: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) a42: c12d beqz a0,aa4 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ a44: 611c ld a5,0(a0) - if(p->s.size >= nunits){ a46: 4798 lw a4,8(a5) a48: 02977263 bgeu a4,s1,a6c <malloc+0xb6> - if(p == freep) a4c: 00093703 ld a4,0(s2) a50: 853e mv a0,a5 a52: fef719e3 bne a4,a5,a44 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); a56: 8552 mv a0,s4 a58: b03ff0ef jal 55a <sbrk> - if(p == (char*)-1) a5c: fd551ce3 bne a0,s5,a34 <malloc+0x7e> - return 0; a60: 4501 li a0,0 a62: 7902 ld s2,32(sp) a64: 6a42 ld s4,16(sp) @@ -1699,24 +1506,16 @@ malloc(uint nbytes) a6e: 6a42 ld s4,16(sp) a70: 6aa2 ld s5,8(sp) a72: 6b02 ld s6,0(sp) - if(p->s.size == nunits) a74: fae48de3 beq s1,a4,a2e <malloc+0x78> - p->s.size -= nunits; a78: 4137073b subw a4,a4,s3 a7c: c798 sw a4,8(a5) - p += p->s.size; a7e: 02071693 slli a3,a4,0x20 a82: 01c6d713 srli a4,a3,0x1c a86: 97ba add a5,a5,a4 - p->s.size = nunits; a88: 0137a423 sw s3,8(a5) - freep = prevp; a8c: 00000717 auipc a4,0x0 a90: 56a73a23 sd a0,1396(a4) # 1000 <freep> - return (void*)(p + 1); a94: 01078513 addi a0,a5,16 - } -} a98: 70e2 ld ra,56(sp) a9a: 7442 ld s0,48(sp) a9c: 74a2 ld s1,40(sp) diff --git a/user/ls.o b/user/ls.o index e3988c367f336c8713da19ec2961481459f12847..cb462275dd66e19c7b94f600ddb579be9432cc0f 100644 Binary files a/user/ls.o and b/user/ls.o differ diff --git a/user/malloc_test.asm b/user/malloc_test.asm index 56dcb13a9b128b0b5a472daf137729dae7e6757e..6cef94ebefeb6007c4d70f1f8f5135701a8c251d 100644 --- a/user/malloc_test.asm +++ b/user/malloc_test.asm @@ -478,245 +478,123 @@ memcpy(void *dst, const void *src, uint n) 2ae: 8082 ret 00000000000002b0 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 2b0: 4885 li a7,1 - ecall 2b2: 00000073 ecall - ret 2b6: 8082 ret 00000000000002b8 <exit>: -.global exit -exit: - li a7, SYS_exit 2b8: 4889 li a7,2 - ecall 2ba: 00000073 ecall - ret 2be: 8082 ret 00000000000002c0 <wait>: -.global wait -wait: - li a7, SYS_wait 2c0: 488d li a7,3 - ecall 2c2: 00000073 ecall - ret 2c6: 8082 ret 00000000000002c8 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 2c8: 4891 li a7,4 - ecall 2ca: 00000073 ecall - ret 2ce: 8082 ret 00000000000002d0 <read>: -.global read -read: - li a7, SYS_read 2d0: 4895 li a7,5 - ecall 2d2: 00000073 ecall - ret 2d6: 8082 ret 00000000000002d8 <write>: -.global write -write: - li a7, SYS_write 2d8: 48c1 li a7,16 - ecall 2da: 00000073 ecall - ret 2de: 8082 ret 00000000000002e0 <close>: -.global close -close: - li a7, SYS_close 2e0: 48d5 li a7,21 - ecall 2e2: 00000073 ecall - ret 2e6: 8082 ret 00000000000002e8 <kill>: -.global kill -kill: - li a7, SYS_kill 2e8: 4899 li a7,6 - ecall 2ea: 00000073 ecall - ret 2ee: 8082 ret 00000000000002f0 <exec>: -.global exec -exec: - li a7, SYS_exec 2f0: 489d li a7,7 - ecall 2f2: 00000073 ecall - ret 2f6: 8082 ret 00000000000002f8 <open>: -.global open -open: - li a7, SYS_open 2f8: 48bd li a7,15 - ecall 2fa: 00000073 ecall - ret 2fe: 8082 ret 0000000000000300 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 300: 48c5 li a7,17 - ecall 302: 00000073 ecall - ret 306: 8082 ret 0000000000000308 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 308: 48c9 li a7,18 - ecall 30a: 00000073 ecall - ret 30e: 8082 ret 0000000000000310 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 310: 48a1 li a7,8 - ecall 312: 00000073 ecall - ret 316: 8082 ret 0000000000000318 <link>: -.global link -link: - li a7, SYS_link 318: 48cd li a7,19 - ecall 31a: 00000073 ecall - ret 31e: 8082 ret 0000000000000320 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 320: 48d1 li a7,20 - ecall 322: 00000073 ecall - ret 326: 8082 ret 0000000000000328 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 328: 48a5 li a7,9 - ecall 32a: 00000073 ecall - ret 32e: 8082 ret 0000000000000330 <dup>: -.global dup -dup: - li a7, SYS_dup 330: 48a9 li a7,10 - ecall 332: 00000073 ecall - ret 336: 8082 ret 0000000000000338 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 338: 48ad li a7,11 - ecall 33a: 00000073 ecall - ret 33e: 8082 ret 0000000000000340 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 340: 48b1 li a7,12 - ecall 342: 00000073 ecall - ret 346: 8082 ret 0000000000000348 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 348: 48b5 li a7,13 - ecall 34a: 00000073 ecall - ret 34e: 8082 ret 0000000000000350 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 350: 48b9 li a7,14 - ecall 352: 00000073 ecall - ret 356: 8082 ret 0000000000000358 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 358: 48d9 li a7,22 - ecall 35a: 00000073 ecall - ret 35e: 8082 ret 0000000000000360 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 360: 48dd li a7,23 - ecall 362: 00000073 ecall - ret 366: 8082 ret 0000000000000368 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 368: 48e1 li a7,24 - ecall 36a: 00000073 ecall - ret 36e: 8082 ret 0000000000000370 <putc>: @@ -1259,184 +1137,113 @@ printf(const char *fmt, ...) 718: 8082 ret 000000000000071a <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 71a: 1141 addi sp,sp,-16 71c: e422 sd s0,8(sp) 71e: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 720: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 724: 00001797 auipc a5,0x1 728: 8dc7b783 ld a5,-1828(a5) # 1000 <freep> 72c: a02d j 756 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 72e: 4618 lw a4,8(a2) 730: 9f2d addw a4,a4,a1 732: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 736: 6398 ld a4,0(a5) 738: 6310 ld a2,0(a4) 73a: a83d j 778 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 73c: ff852703 lw a4,-8(a0) 740: 9f31 addw a4,a4,a2 742: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 744: ff053683 ld a3,-16(a0) 748: a091 j 78c <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 74a: 6398 ld a4,0(a5) 74c: 00e7e463 bltu a5,a4,754 <free+0x3a> 750: 00e6ea63 bltu a3,a4,764 <free+0x4a> -{ 754: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 756: fed7fae3 bgeu a5,a3,74a <free+0x30> 75a: 6398 ld a4,0(a5) 75c: 00e6e463 bltu a3,a4,764 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 760: fee7eae3 bltu a5,a4,754 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 764: ff852583 lw a1,-8(a0) 768: 6390 ld a2,0(a5) 76a: 02059813 slli a6,a1,0x20 76e: 01c85713 srli a4,a6,0x1c 772: 9736 add a4,a4,a3 774: fae60de3 beq a2,a4,72e <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 778: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 77c: 4790 lw a2,8(a5) 77e: 02061593 slli a1,a2,0x20 782: 01c5d713 srli a4,a1,0x1c 786: 973e add a4,a4,a5 788: fae68ae3 beq a3,a4,73c <free+0x22> - p->s.ptr = bp->s.ptr; 78c: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 78e: 00001717 auipc a4,0x1 792: 86f73923 sd a5,-1934(a4) # 1000 <freep> -} 796: 6422 ld s0,8(sp) 798: 0141 addi sp,sp,16 79a: 8082 ret 000000000000079c <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 79c: 7139 addi sp,sp,-64 79e: fc06 sd ra,56(sp) 7a0: f822 sd s0,48(sp) 7a2: f426 sd s1,40(sp) 7a4: ec4e sd s3,24(sp) 7a6: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 7a8: 02051493 slli s1,a0,0x20 7ac: 9081 srli s1,s1,0x20 7ae: 04bd addi s1,s1,15 7b0: 8091 srli s1,s1,0x4 7b2: 0014899b addiw s3,s1,1 7b6: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 7b8: 00001517 auipc a0,0x1 7bc: 84853503 ld a0,-1976(a0) # 1000 <freep> 7c0: c915 beqz a0,7f4 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 7c2: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 7c4: 4798 lw a4,8(a5) 7c6: 08977a63 bgeu a4,s1,85a <malloc+0xbe> 7ca: f04a sd s2,32(sp) 7cc: e852 sd s4,16(sp) 7ce: e456 sd s5,8(sp) 7d0: e05a sd s6,0(sp) - if(nu < 4096) 7d2: 8a4e mv s4,s3 7d4: 0009871b sext.w a4,s3 7d8: 6685 lui a3,0x1 7da: 00d77363 bgeu a4,a3,7e0 <malloc+0x44> 7de: 6a05 lui s4,0x1 7e0: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 7e4: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 7e8: 00001917 auipc s2,0x1 7ec: 81890913 addi s2,s2,-2024 # 1000 <freep> - if(p == (char*)-1) 7f0: 5afd li s5,-1 7f2: a081 j 832 <malloc+0x96> 7f4: f04a sd s2,32(sp) 7f6: e852 sd s4,16(sp) 7f8: e456 sd s5,8(sp) 7fa: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 7fc: 00001797 auipc a5,0x1 800: 81478793 addi a5,a5,-2028 # 1010 <base> 804: 00000717 auipc a4,0x0 808: 7ef73e23 sd a5,2044(a4) # 1000 <freep> 80c: e39c sd a5,0(a5) - base.s.size = 0; 80e: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 812: b7c1 j 7d2 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 814: 6398 ld a4,0(a5) 816: e118 sd a4,0(a0) 818: a8a9 j 872 <malloc+0xd6> - hp->s.size = nu; 81a: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 81e: 0541 addi a0,a0,16 820: efbff0ef jal 71a <free> - return freep; 824: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 828: c12d beqz a0,88a <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 82a: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 82c: 4798 lw a4,8(a5) 82e: 02977263 bgeu a4,s1,852 <malloc+0xb6> - if(p == freep) 832: 00093703 ld a4,0(s2) 836: 853e mv a0,a5 838: fef719e3 bne a4,a5,82a <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 83c: 8552 mv a0,s4 83e: b03ff0ef jal 340 <sbrk> - if(p == (char*)-1) 842: fd551ce3 bne a0,s5,81a <malloc+0x7e> - return 0; 846: 4501 li a0,0 848: 7902 ld s2,32(sp) 84a: 6a42 ld s4,16(sp) @@ -1447,24 +1254,16 @@ malloc(uint nbytes) 854: 6a42 ld s4,16(sp) 856: 6aa2 ld s5,8(sp) 858: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 85a: fae48de3 beq s1,a4,814 <malloc+0x78> - p->s.size -= nunits; 85e: 4137073b subw a4,a4,s3 862: c798 sw a4,8(a5) - p += p->s.size; 864: 02071693 slli a3,a4,0x20 868: 01c6d713 srli a4,a3,0x1c 86c: 97ba add a5,a5,a4 - p->s.size = nunits; 86e: 0137a423 sw s3,8(a5) - freep = prevp; 872: 00000717 auipc a4,0x0 876: 78a73723 sd a0,1934(a4) # 1000 <freep> - return (void*)(p + 1); 87a: 01078513 addi a0,a5,16 - } -} 87e: 70e2 ld ra,56(sp) 880: 7442 ld s0,48(sp) 882: 74a2 ld s1,40(sp) diff --git a/user/malloc_test.o b/user/malloc_test.o index 36f4f4ce1c1e7319988da8e949034c84ee590bb8..a5cf2d868ead91cbda63b84659e9a06c35253a37 100644 Binary files a/user/malloc_test.o and b/user/malloc_test.o differ diff --git a/user/mkdir.asm b/user/mkdir.asm index 7ce3bfea8a6aff776dd47eaaf4b6138dfb9f1313..7607f646d4b32284fcaec8fffebd0f4c007c36d3 100644 --- a/user/mkdir.asm +++ b/user/mkdir.asm @@ -497,245 +497,123 @@ memcpy(void *dst, const void *src, uint n) 2c6: 8082 ret 00000000000002c8 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 2c8: 4885 li a7,1 - ecall 2ca: 00000073 ecall - ret 2ce: 8082 ret 00000000000002d0 <exit>: -.global exit -exit: - li a7, SYS_exit 2d0: 4889 li a7,2 - ecall 2d2: 00000073 ecall - ret 2d6: 8082 ret 00000000000002d8 <wait>: -.global wait -wait: - li a7, SYS_wait 2d8: 488d li a7,3 - ecall 2da: 00000073 ecall - ret 2de: 8082 ret 00000000000002e0 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 2e0: 4891 li a7,4 - ecall 2e2: 00000073 ecall - ret 2e6: 8082 ret 00000000000002e8 <read>: -.global read -read: - li a7, SYS_read 2e8: 4895 li a7,5 - ecall 2ea: 00000073 ecall - ret 2ee: 8082 ret 00000000000002f0 <write>: -.global write -write: - li a7, SYS_write 2f0: 48c1 li a7,16 - ecall 2f2: 00000073 ecall - ret 2f6: 8082 ret 00000000000002f8 <close>: -.global close -close: - li a7, SYS_close 2f8: 48d5 li a7,21 - ecall 2fa: 00000073 ecall - ret 2fe: 8082 ret 0000000000000300 <kill>: -.global kill -kill: - li a7, SYS_kill 300: 4899 li a7,6 - ecall 302: 00000073 ecall - ret 306: 8082 ret 0000000000000308 <exec>: -.global exec -exec: - li a7, SYS_exec 308: 489d li a7,7 - ecall 30a: 00000073 ecall - ret 30e: 8082 ret 0000000000000310 <open>: -.global open -open: - li a7, SYS_open 310: 48bd li a7,15 - ecall 312: 00000073 ecall - ret 316: 8082 ret 0000000000000318 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 318: 48c5 li a7,17 - ecall 31a: 00000073 ecall - ret 31e: 8082 ret 0000000000000320 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 320: 48c9 li a7,18 - ecall 322: 00000073 ecall - ret 326: 8082 ret 0000000000000328 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 328: 48a1 li a7,8 - ecall 32a: 00000073 ecall - ret 32e: 8082 ret 0000000000000330 <link>: -.global link -link: - li a7, SYS_link 330: 48cd li a7,19 - ecall 332: 00000073 ecall - ret 336: 8082 ret 0000000000000338 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 338: 48d1 li a7,20 - ecall 33a: 00000073 ecall - ret 33e: 8082 ret 0000000000000340 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 340: 48a5 li a7,9 - ecall 342: 00000073 ecall - ret 346: 8082 ret 0000000000000348 <dup>: -.global dup -dup: - li a7, SYS_dup 348: 48a9 li a7,10 - ecall 34a: 00000073 ecall - ret 34e: 8082 ret 0000000000000350 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 350: 48ad li a7,11 - ecall 352: 00000073 ecall - ret 356: 8082 ret 0000000000000358 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 358: 48b1 li a7,12 - ecall 35a: 00000073 ecall - ret 35e: 8082 ret 0000000000000360 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 360: 48b5 li a7,13 - ecall 362: 00000073 ecall - ret 366: 8082 ret 0000000000000368 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 368: 48b9 li a7,14 - ecall 36a: 00000073 ecall - ret 36e: 8082 ret 0000000000000370 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 370: 48d9 li a7,22 - ecall 372: 00000073 ecall - ret 376: 8082 ret 0000000000000378 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 378: 48dd li a7,23 - ecall 37a: 00000073 ecall - ret 37e: 8082 ret 0000000000000380 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 380: 48e1 li a7,24 - ecall 382: 00000073 ecall - ret 386: 8082 ret 0000000000000388 <putc>: @@ -1278,184 +1156,113 @@ printf(const char *fmt, ...) 730: 8082 ret 0000000000000732 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 732: 1141 addi sp,sp,-16 734: e422 sd s0,8(sp) 736: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 738: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 73c: 00001797 auipc a5,0x1 740: 8c47b783 ld a5,-1852(a5) # 1000 <freep> 744: a02d j 76e <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 746: 4618 lw a4,8(a2) 748: 9f2d addw a4,a4,a1 74a: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 74e: 6398 ld a4,0(a5) 750: 6310 ld a2,0(a4) 752: a83d j 790 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 754: ff852703 lw a4,-8(a0) 758: 9f31 addw a4,a4,a2 75a: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 75c: ff053683 ld a3,-16(a0) 760: a091 j 7a4 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 762: 6398 ld a4,0(a5) 764: 00e7e463 bltu a5,a4,76c <free+0x3a> 768: 00e6ea63 bltu a3,a4,77c <free+0x4a> -{ 76c: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 76e: fed7fae3 bgeu a5,a3,762 <free+0x30> 772: 6398 ld a4,0(a5) 774: 00e6e463 bltu a3,a4,77c <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 778: fee7eae3 bltu a5,a4,76c <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 77c: ff852583 lw a1,-8(a0) 780: 6390 ld a2,0(a5) 782: 02059813 slli a6,a1,0x20 786: 01c85713 srli a4,a6,0x1c 78a: 9736 add a4,a4,a3 78c: fae60de3 beq a2,a4,746 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 790: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 794: 4790 lw a2,8(a5) 796: 02061593 slli a1,a2,0x20 79a: 01c5d713 srli a4,a1,0x1c 79e: 973e add a4,a4,a5 7a0: fae68ae3 beq a3,a4,754 <free+0x22> - p->s.ptr = bp->s.ptr; 7a4: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 7a6: 00001717 auipc a4,0x1 7aa: 84f73d23 sd a5,-1958(a4) # 1000 <freep> -} 7ae: 6422 ld s0,8(sp) 7b0: 0141 addi sp,sp,16 7b2: 8082 ret 00000000000007b4 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 7b4: 7139 addi sp,sp,-64 7b6: fc06 sd ra,56(sp) 7b8: f822 sd s0,48(sp) 7ba: f426 sd s1,40(sp) 7bc: ec4e sd s3,24(sp) 7be: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 7c0: 02051493 slli s1,a0,0x20 7c4: 9081 srli s1,s1,0x20 7c6: 04bd addi s1,s1,15 7c8: 8091 srli s1,s1,0x4 7ca: 0014899b addiw s3,s1,1 7ce: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 7d0: 00001517 auipc a0,0x1 7d4: 83053503 ld a0,-2000(a0) # 1000 <freep> 7d8: c915 beqz a0,80c <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 7da: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 7dc: 4798 lw a4,8(a5) 7de: 08977a63 bgeu a4,s1,872 <malloc+0xbe> 7e2: f04a sd s2,32(sp) 7e4: e852 sd s4,16(sp) 7e6: e456 sd s5,8(sp) 7e8: e05a sd s6,0(sp) - if(nu < 4096) 7ea: 8a4e mv s4,s3 7ec: 0009871b sext.w a4,s3 7f0: 6685 lui a3,0x1 7f2: 00d77363 bgeu a4,a3,7f8 <malloc+0x44> 7f6: 6a05 lui s4,0x1 7f8: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 7fc: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 800: 00001917 auipc s2,0x1 804: 80090913 addi s2,s2,-2048 # 1000 <freep> - if(p == (char*)-1) 808: 5afd li s5,-1 80a: a081 j 84a <malloc+0x96> 80c: f04a sd s2,32(sp) 80e: e852 sd s4,16(sp) 810: e456 sd s5,8(sp) 812: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 814: 00000797 auipc a5,0x0 818: 7fc78793 addi a5,a5,2044 # 1010 <base> 81c: 00000717 auipc a4,0x0 820: 7ef73223 sd a5,2020(a4) # 1000 <freep> 824: e39c sd a5,0(a5) - base.s.size = 0; 826: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 82a: b7c1 j 7ea <malloc+0x36> - prevp->s.ptr = p->s.ptr; 82c: 6398 ld a4,0(a5) 82e: e118 sd a4,0(a0) 830: a8a9 j 88a <malloc+0xd6> - hp->s.size = nu; 832: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 836: 0541 addi a0,a0,16 838: efbff0ef jal 732 <free> - return freep; 83c: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 840: c12d beqz a0,8a2 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 842: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 844: 4798 lw a4,8(a5) 846: 02977263 bgeu a4,s1,86a <malloc+0xb6> - if(p == freep) 84a: 00093703 ld a4,0(s2) 84e: 853e mv a0,a5 850: fef719e3 bne a4,a5,842 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 854: 8552 mv a0,s4 856: b03ff0ef jal 358 <sbrk> - if(p == (char*)-1) 85a: fd551ce3 bne a0,s5,832 <malloc+0x7e> - return 0; 85e: 4501 li a0,0 860: 7902 ld s2,32(sp) 862: 6a42 ld s4,16(sp) @@ -1466,24 +1273,16 @@ malloc(uint nbytes) 86c: 6a42 ld s4,16(sp) 86e: 6aa2 ld s5,8(sp) 870: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 872: fae48de3 beq s1,a4,82c <malloc+0x78> - p->s.size -= nunits; 876: 4137073b subw a4,a4,s3 87a: c798 sw a4,8(a5) - p += p->s.size; 87c: 02071693 slli a3,a4,0x20 880: 01c6d713 srli a4,a3,0x1c 884: 97ba add a5,a5,a4 - p->s.size = nunits; 886: 0137a423 sw s3,8(a5) - freep = prevp; 88a: 00000717 auipc a4,0x0 88e: 76a73b23 sd a0,1910(a4) # 1000 <freep> - return (void*)(p + 1); 892: 01078513 addi a0,a5,16 - } -} 896: 70e2 ld ra,56(sp) 898: 7442 ld s0,48(sp) 89a: 74a2 ld s1,40(sp) diff --git a/user/mkdir.o b/user/mkdir.o index 8d9ef43e221ddf0ee5ec2f1c8b866420f67d033f..60807cf73b5961d5a31a6b7fecbee20ab3641cad 100644 Binary files a/user/mkdir.o and b/user/mkdir.o differ diff --git a/user/pgtbltest.asm b/user/pgtbltest.asm index 6eae89ede0e4eeef33f9cb57ecb457d028fc42be..197b2e9278b7dcd0e65e96c8b4e182c0962ed522 100644 --- a/user/pgtbltest.asm +++ b/user/pgtbltest.asm @@ -494,245 +494,123 @@ memcpy(void *dst, const void *src, uint n) 2b8: 8082 ret 00000000000002ba <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 2ba: 4885 li a7,1 - ecall 2bc: 00000073 ecall - ret 2c0: 8082 ret 00000000000002c2 <exit>: -.global exit -exit: - li a7, SYS_exit 2c2: 4889 li a7,2 - ecall 2c4: 00000073 ecall - ret 2c8: 8082 ret 00000000000002ca <wait>: -.global wait -wait: - li a7, SYS_wait 2ca: 488d li a7,3 - ecall 2cc: 00000073 ecall - ret 2d0: 8082 ret 00000000000002d2 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 2d2: 4891 li a7,4 - ecall 2d4: 00000073 ecall - ret 2d8: 8082 ret 00000000000002da <read>: -.global read -read: - li a7, SYS_read 2da: 4895 li a7,5 - ecall 2dc: 00000073 ecall - ret 2e0: 8082 ret 00000000000002e2 <write>: -.global write -write: - li a7, SYS_write 2e2: 48c1 li a7,16 - ecall 2e4: 00000073 ecall - ret 2e8: 8082 ret 00000000000002ea <close>: -.global close -close: - li a7, SYS_close 2ea: 48d5 li a7,21 - ecall 2ec: 00000073 ecall - ret 2f0: 8082 ret 00000000000002f2 <kill>: -.global kill -kill: - li a7, SYS_kill 2f2: 4899 li a7,6 - ecall 2f4: 00000073 ecall - ret 2f8: 8082 ret 00000000000002fa <exec>: -.global exec -exec: - li a7, SYS_exec 2fa: 489d li a7,7 - ecall 2fc: 00000073 ecall - ret 300: 8082 ret 0000000000000302 <open>: -.global open -open: - li a7, SYS_open 302: 48bd li a7,15 - ecall 304: 00000073 ecall - ret 308: 8082 ret 000000000000030a <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 30a: 48c5 li a7,17 - ecall 30c: 00000073 ecall - ret 310: 8082 ret 0000000000000312 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 312: 48c9 li a7,18 - ecall 314: 00000073 ecall - ret 318: 8082 ret 000000000000031a <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 31a: 48a1 li a7,8 - ecall 31c: 00000073 ecall - ret 320: 8082 ret 0000000000000322 <link>: -.global link -link: - li a7, SYS_link 322: 48cd li a7,19 - ecall 324: 00000073 ecall - ret 328: 8082 ret 000000000000032a <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 32a: 48d1 li a7,20 - ecall 32c: 00000073 ecall - ret 330: 8082 ret 0000000000000332 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 332: 48a5 li a7,9 - ecall 334: 00000073 ecall - ret 338: 8082 ret 000000000000033a <dup>: -.global dup -dup: - li a7, SYS_dup 33a: 48a9 li a7,10 - ecall 33c: 00000073 ecall - ret 340: 8082 ret 0000000000000342 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 342: 48ad li a7,11 - ecall 344: 00000073 ecall - ret 348: 8082 ret 000000000000034a <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 34a: 48b1 li a7,12 - ecall 34c: 00000073 ecall - ret 350: 8082 ret 0000000000000352 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 352: 48b5 li a7,13 - ecall 354: 00000073 ecall - ret 358: 8082 ret 000000000000035a <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 35a: 48b9 li a7,14 - ecall 35c: 00000073 ecall - ret 360: 8082 ret 0000000000000362 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 362: 48d9 li a7,22 - ecall 364: 00000073 ecall - ret 368: 8082 ret 000000000000036a <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 36a: 48dd li a7,23 - ecall 36c: 00000073 ecall - ret 370: 8082 ret 0000000000000372 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 372: 48e1 li a7,24 - ecall 374: 00000073 ecall - ret 378: 8082 ret 000000000000037a <putc>: @@ -1275,184 +1153,113 @@ printf(const char *fmt, ...) 722: 8082 ret 0000000000000724 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 724: 1141 addi sp,sp,-16 726: e422 sd s0,8(sp) 728: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 72a: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 72e: 00001797 auipc a5,0x1 732: 8d27b783 ld a5,-1838(a5) # 1000 <freep> 736: a02d j 760 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 738: 4618 lw a4,8(a2) 73a: 9f2d addw a4,a4,a1 73c: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 740: 6398 ld a4,0(a5) 742: 6310 ld a2,0(a4) 744: a83d j 782 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 746: ff852703 lw a4,-8(a0) 74a: 9f31 addw a4,a4,a2 74c: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 74e: ff053683 ld a3,-16(a0) 752: a091 j 796 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 754: 6398 ld a4,0(a5) 756: 00e7e463 bltu a5,a4,75e <free+0x3a> 75a: 00e6ea63 bltu a3,a4,76e <free+0x4a> -{ 75e: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 760: fed7fae3 bgeu a5,a3,754 <free+0x30> 764: 6398 ld a4,0(a5) 766: 00e6e463 bltu a3,a4,76e <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 76a: fee7eae3 bltu a5,a4,75e <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 76e: ff852583 lw a1,-8(a0) 772: 6390 ld a2,0(a5) 774: 02059813 slli a6,a1,0x20 778: 01c85713 srli a4,a6,0x1c 77c: 9736 add a4,a4,a3 77e: fae60de3 beq a2,a4,738 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 782: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 786: 4790 lw a2,8(a5) 788: 02061593 slli a1,a2,0x20 78c: 01c5d713 srli a4,a1,0x1c 790: 973e add a4,a4,a5 792: fae68ae3 beq a3,a4,746 <free+0x22> - p->s.ptr = bp->s.ptr; 796: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 798: 00001717 auipc a4,0x1 79c: 86f73423 sd a5,-1944(a4) # 1000 <freep> -} 7a0: 6422 ld s0,8(sp) 7a2: 0141 addi sp,sp,16 7a4: 8082 ret 00000000000007a6 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 7a6: 7139 addi sp,sp,-64 7a8: fc06 sd ra,56(sp) 7aa: f822 sd s0,48(sp) 7ac: f426 sd s1,40(sp) 7ae: ec4e sd s3,24(sp) 7b0: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 7b2: 02051493 slli s1,a0,0x20 7b6: 9081 srli s1,s1,0x20 7b8: 04bd addi s1,s1,15 7ba: 8091 srli s1,s1,0x4 7bc: 0014899b addiw s3,s1,1 7c0: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 7c2: 00001517 auipc a0,0x1 7c6: 83e53503 ld a0,-1986(a0) # 1000 <freep> 7ca: c915 beqz a0,7fe <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 7cc: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 7ce: 4798 lw a4,8(a5) 7d0: 08977a63 bgeu a4,s1,864 <malloc+0xbe> 7d4: f04a sd s2,32(sp) 7d6: e852 sd s4,16(sp) 7d8: e456 sd s5,8(sp) 7da: e05a sd s6,0(sp) - if(nu < 4096) 7dc: 8a4e mv s4,s3 7de: 0009871b sext.w a4,s3 7e2: 6685 lui a3,0x1 7e4: 00d77363 bgeu a4,a3,7ea <malloc+0x44> 7e8: 6a05 lui s4,0x1 7ea: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 7ee: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 7f2: 00001917 auipc s2,0x1 7f6: 80e90913 addi s2,s2,-2034 # 1000 <freep> - if(p == (char*)-1) 7fa: 5afd li s5,-1 7fc: a081 j 83c <malloc+0x96> 7fe: f04a sd s2,32(sp) 800: e852 sd s4,16(sp) 802: e456 sd s5,8(sp) 804: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 806: 00001797 auipc a5,0x1 80a: 80a78793 addi a5,a5,-2038 # 1010 <base> 80e: 00000717 auipc a4,0x0 812: 7ef73923 sd a5,2034(a4) # 1000 <freep> 816: e39c sd a5,0(a5) - base.s.size = 0; 818: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 81c: b7c1 j 7dc <malloc+0x36> - prevp->s.ptr = p->s.ptr; 81e: 6398 ld a4,0(a5) 820: e118 sd a4,0(a0) 822: a8a9 j 87c <malloc+0xd6> - hp->s.size = nu; 824: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 828: 0541 addi a0,a0,16 82a: efbff0ef jal 724 <free> - return freep; 82e: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 832: c12d beqz a0,894 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 834: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 836: 4798 lw a4,8(a5) 838: 02977263 bgeu a4,s1,85c <malloc+0xb6> - if(p == freep) 83c: 00093703 ld a4,0(s2) 840: 853e mv a0,a5 842: fef719e3 bne a4,a5,834 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 846: 8552 mv a0,s4 848: b03ff0ef jal 34a <sbrk> - if(p == (char*)-1) 84c: fd551ce3 bne a0,s5,824 <malloc+0x7e> - return 0; 850: 4501 li a0,0 852: 7902 ld s2,32(sp) 854: 6a42 ld s4,16(sp) @@ -1463,24 +1270,16 @@ malloc(uint nbytes) 85e: 6a42 ld s4,16(sp) 860: 6aa2 ld s5,8(sp) 862: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 864: fae48de3 beq s1,a4,81e <malloc+0x78> - p->s.size -= nunits; 868: 4137073b subw a4,a4,s3 86c: c798 sw a4,8(a5) - p += p->s.size; 86e: 02071693 slli a3,a4,0x20 872: 01c6d713 srli a4,a3,0x1c 876: 97ba add a5,a5,a4 - p->s.size = nunits; 878: 0137a423 sw s3,8(a5) - freep = prevp; 87c: 00000717 auipc a4,0x0 880: 78a73223 sd a0,1924(a4) # 1000 <freep> - return (void*)(p + 1); 884: 01078513 addi a0,a5,16 - } -} 888: 70e2 ld ra,56(sp) 88a: 7442 ld s0,48(sp) 88c: 74a2 ld s1,40(sp) diff --git a/user/pgtbltest.o b/user/pgtbltest.o index fddc030120478156a1b336963c98fd46ff9403c5..eee6645507e7b472bba28a5f728993e32b05d765 100644 Binary files a/user/pgtbltest.o and b/user/pgtbltest.o differ diff --git a/user/printf.o b/user/printf.o index 8e8acb3cc7c75085048813233e9c3f0fb1645a17..8e4f660cee32595dfc51931ede73e1a665c69abd 100644 Binary files a/user/printf.o and b/user/printf.o differ diff --git a/user/rm.asm b/user/rm.asm index b1257749b3311ee7fcf123ed4a88126443e3ab54..d967b4d116ff22a984888e28cd6659b340a49028 100644 --- a/user/rm.asm +++ b/user/rm.asm @@ -497,245 +497,123 @@ memcpy(void *dst, const void *src, uint n) 2c6: 8082 ret 00000000000002c8 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 2c8: 4885 li a7,1 - ecall 2ca: 00000073 ecall - ret 2ce: 8082 ret 00000000000002d0 <exit>: -.global exit -exit: - li a7, SYS_exit 2d0: 4889 li a7,2 - ecall 2d2: 00000073 ecall - ret 2d6: 8082 ret 00000000000002d8 <wait>: -.global wait -wait: - li a7, SYS_wait 2d8: 488d li a7,3 - ecall 2da: 00000073 ecall - ret 2de: 8082 ret 00000000000002e0 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 2e0: 4891 li a7,4 - ecall 2e2: 00000073 ecall - ret 2e6: 8082 ret 00000000000002e8 <read>: -.global read -read: - li a7, SYS_read 2e8: 4895 li a7,5 - ecall 2ea: 00000073 ecall - ret 2ee: 8082 ret 00000000000002f0 <write>: -.global write -write: - li a7, SYS_write 2f0: 48c1 li a7,16 - ecall 2f2: 00000073 ecall - ret 2f6: 8082 ret 00000000000002f8 <close>: -.global close -close: - li a7, SYS_close 2f8: 48d5 li a7,21 - ecall 2fa: 00000073 ecall - ret 2fe: 8082 ret 0000000000000300 <kill>: -.global kill -kill: - li a7, SYS_kill 300: 4899 li a7,6 - ecall 302: 00000073 ecall - ret 306: 8082 ret 0000000000000308 <exec>: -.global exec -exec: - li a7, SYS_exec 308: 489d li a7,7 - ecall 30a: 00000073 ecall - ret 30e: 8082 ret 0000000000000310 <open>: -.global open -open: - li a7, SYS_open 310: 48bd li a7,15 - ecall 312: 00000073 ecall - ret 316: 8082 ret 0000000000000318 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 318: 48c5 li a7,17 - ecall 31a: 00000073 ecall - ret 31e: 8082 ret 0000000000000320 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 320: 48c9 li a7,18 - ecall 322: 00000073 ecall - ret 326: 8082 ret 0000000000000328 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 328: 48a1 li a7,8 - ecall 32a: 00000073 ecall - ret 32e: 8082 ret 0000000000000330 <link>: -.global link -link: - li a7, SYS_link 330: 48cd li a7,19 - ecall 332: 00000073 ecall - ret 336: 8082 ret 0000000000000338 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 338: 48d1 li a7,20 - ecall 33a: 00000073 ecall - ret 33e: 8082 ret 0000000000000340 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 340: 48a5 li a7,9 - ecall 342: 00000073 ecall - ret 346: 8082 ret 0000000000000348 <dup>: -.global dup -dup: - li a7, SYS_dup 348: 48a9 li a7,10 - ecall 34a: 00000073 ecall - ret 34e: 8082 ret 0000000000000350 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 350: 48ad li a7,11 - ecall 352: 00000073 ecall - ret 356: 8082 ret 0000000000000358 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 358: 48b1 li a7,12 - ecall 35a: 00000073 ecall - ret 35e: 8082 ret 0000000000000360 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 360: 48b5 li a7,13 - ecall 362: 00000073 ecall - ret 366: 8082 ret 0000000000000368 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 368: 48b9 li a7,14 - ecall 36a: 00000073 ecall - ret 36e: 8082 ret 0000000000000370 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 370: 48d9 li a7,22 - ecall 372: 00000073 ecall - ret 376: 8082 ret 0000000000000378 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 378: 48dd li a7,23 - ecall 37a: 00000073 ecall - ret 37e: 8082 ret 0000000000000380 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 380: 48e1 li a7,24 - ecall 382: 00000073 ecall - ret 386: 8082 ret 0000000000000388 <putc>: @@ -1278,184 +1156,113 @@ printf(const char *fmt, ...) 730: 8082 ret 0000000000000732 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 732: 1141 addi sp,sp,-16 734: e422 sd s0,8(sp) 736: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 738: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 73c: 00001797 auipc a5,0x1 740: 8c47b783 ld a5,-1852(a5) # 1000 <freep> 744: a02d j 76e <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 746: 4618 lw a4,8(a2) 748: 9f2d addw a4,a4,a1 74a: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 74e: 6398 ld a4,0(a5) 750: 6310 ld a2,0(a4) 752: a83d j 790 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 754: ff852703 lw a4,-8(a0) 758: 9f31 addw a4,a4,a2 75a: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 75c: ff053683 ld a3,-16(a0) 760: a091 j 7a4 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 762: 6398 ld a4,0(a5) 764: 00e7e463 bltu a5,a4,76c <free+0x3a> 768: 00e6ea63 bltu a3,a4,77c <free+0x4a> -{ 76c: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 76e: fed7fae3 bgeu a5,a3,762 <free+0x30> 772: 6398 ld a4,0(a5) 774: 00e6e463 bltu a3,a4,77c <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 778: fee7eae3 bltu a5,a4,76c <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 77c: ff852583 lw a1,-8(a0) 780: 6390 ld a2,0(a5) 782: 02059813 slli a6,a1,0x20 786: 01c85713 srli a4,a6,0x1c 78a: 9736 add a4,a4,a3 78c: fae60de3 beq a2,a4,746 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 790: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 794: 4790 lw a2,8(a5) 796: 02061593 slli a1,a2,0x20 79a: 01c5d713 srli a4,a1,0x1c 79e: 973e add a4,a4,a5 7a0: fae68ae3 beq a3,a4,754 <free+0x22> - p->s.ptr = bp->s.ptr; 7a4: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 7a6: 00001717 auipc a4,0x1 7aa: 84f73d23 sd a5,-1958(a4) # 1000 <freep> -} 7ae: 6422 ld s0,8(sp) 7b0: 0141 addi sp,sp,16 7b2: 8082 ret 00000000000007b4 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 7b4: 7139 addi sp,sp,-64 7b6: fc06 sd ra,56(sp) 7b8: f822 sd s0,48(sp) 7ba: f426 sd s1,40(sp) 7bc: ec4e sd s3,24(sp) 7be: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 7c0: 02051493 slli s1,a0,0x20 7c4: 9081 srli s1,s1,0x20 7c6: 04bd addi s1,s1,15 7c8: 8091 srli s1,s1,0x4 7ca: 0014899b addiw s3,s1,1 7ce: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 7d0: 00001517 auipc a0,0x1 7d4: 83053503 ld a0,-2000(a0) # 1000 <freep> 7d8: c915 beqz a0,80c <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 7da: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 7dc: 4798 lw a4,8(a5) 7de: 08977a63 bgeu a4,s1,872 <malloc+0xbe> 7e2: f04a sd s2,32(sp) 7e4: e852 sd s4,16(sp) 7e6: e456 sd s5,8(sp) 7e8: e05a sd s6,0(sp) - if(nu < 4096) 7ea: 8a4e mv s4,s3 7ec: 0009871b sext.w a4,s3 7f0: 6685 lui a3,0x1 7f2: 00d77363 bgeu a4,a3,7f8 <malloc+0x44> 7f6: 6a05 lui s4,0x1 7f8: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 7fc: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 800: 00001917 auipc s2,0x1 804: 80090913 addi s2,s2,-2048 # 1000 <freep> - if(p == (char*)-1) 808: 5afd li s5,-1 80a: a081 j 84a <malloc+0x96> 80c: f04a sd s2,32(sp) 80e: e852 sd s4,16(sp) 810: e456 sd s5,8(sp) 812: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 814: 00000797 auipc a5,0x0 818: 7fc78793 addi a5,a5,2044 # 1010 <base> 81c: 00000717 auipc a4,0x0 820: 7ef73223 sd a5,2020(a4) # 1000 <freep> 824: e39c sd a5,0(a5) - base.s.size = 0; 826: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 82a: b7c1 j 7ea <malloc+0x36> - prevp->s.ptr = p->s.ptr; 82c: 6398 ld a4,0(a5) 82e: e118 sd a4,0(a0) 830: a8a9 j 88a <malloc+0xd6> - hp->s.size = nu; 832: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 836: 0541 addi a0,a0,16 838: efbff0ef jal 732 <free> - return freep; 83c: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 840: c12d beqz a0,8a2 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 842: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 844: 4798 lw a4,8(a5) 846: 02977263 bgeu a4,s1,86a <malloc+0xb6> - if(p == freep) 84a: 00093703 ld a4,0(s2) 84e: 853e mv a0,a5 850: fef719e3 bne a4,a5,842 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 854: 8552 mv a0,s4 856: b03ff0ef jal 358 <sbrk> - if(p == (char*)-1) 85a: fd551ce3 bne a0,s5,832 <malloc+0x7e> - return 0; 85e: 4501 li a0,0 860: 7902 ld s2,32(sp) 862: 6a42 ld s4,16(sp) @@ -1466,24 +1273,16 @@ malloc(uint nbytes) 86c: 6a42 ld s4,16(sp) 86e: 6aa2 ld s5,8(sp) 870: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 872: fae48de3 beq s1,a4,82c <malloc+0x78> - p->s.size -= nunits; 876: 4137073b subw a4,a4,s3 87a: c798 sw a4,8(a5) - p += p->s.size; 87c: 02071693 slli a3,a4,0x20 880: 01c6d713 srli a4,a3,0x1c 884: 97ba add a5,a5,a4 - p->s.size = nunits; 886: 0137a423 sw s3,8(a5) - freep = prevp; 88a: 00000717 auipc a4,0x0 88e: 76a73b23 sd a0,1910(a4) # 1000 <freep> - return (void*)(p + 1); 892: 01078513 addi a0,a5,16 - } -} 896: 70e2 ld ra,56(sp) 898: 7442 ld s0,48(sp) 89a: 74a2 ld s1,40(sp) diff --git a/user/rm.o b/user/rm.o index edd9337773f95d63c3aced7fd1f806321a379bf1..2bc087b7343d1ec82056d102eec5c9f0bc984ba2 100644 Binary files a/user/rm.o and b/user/rm.o differ diff --git a/user/sh.asm b/user/sh.asm index 58bfef36596f26991f0717292a45cf94a07ac7b6..92ec243323b1c7e958e688e49fd173acb3908ff1 100644 --- a/user/sh.asm +++ b/user/sh.asm @@ -1753,245 +1753,123 @@ memcpy(void *dst, const void *src, uint n) bf2: 8082 ret 0000000000000bf4 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork bf4: 4885 li a7,1 - ecall bf6: 00000073 ecall - ret bfa: 8082 ret 0000000000000bfc <exit>: -.global exit -exit: - li a7, SYS_exit bfc: 4889 li a7,2 - ecall bfe: 00000073 ecall - ret c02: 8082 ret 0000000000000c04 <wait>: -.global wait -wait: - li a7, SYS_wait c04: 488d li a7,3 - ecall c06: 00000073 ecall - ret c0a: 8082 ret 0000000000000c0c <pipe>: -.global pipe -pipe: - li a7, SYS_pipe c0c: 4891 li a7,4 - ecall c0e: 00000073 ecall - ret c12: 8082 ret 0000000000000c14 <read>: -.global read -read: - li a7, SYS_read c14: 4895 li a7,5 - ecall c16: 00000073 ecall - ret c1a: 8082 ret 0000000000000c1c <write>: -.global write -write: - li a7, SYS_write c1c: 48c1 li a7,16 - ecall c1e: 00000073 ecall - ret c22: 8082 ret 0000000000000c24 <close>: -.global close -close: - li a7, SYS_close c24: 48d5 li a7,21 - ecall c26: 00000073 ecall - ret c2a: 8082 ret 0000000000000c2c <kill>: -.global kill -kill: - li a7, SYS_kill c2c: 4899 li a7,6 - ecall c2e: 00000073 ecall - ret c32: 8082 ret 0000000000000c34 <exec>: -.global exec -exec: - li a7, SYS_exec c34: 489d li a7,7 - ecall c36: 00000073 ecall - ret c3a: 8082 ret 0000000000000c3c <open>: -.global open -open: - li a7, SYS_open c3c: 48bd li a7,15 - ecall c3e: 00000073 ecall - ret c42: 8082 ret 0000000000000c44 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod c44: 48c5 li a7,17 - ecall c46: 00000073 ecall - ret c4a: 8082 ret 0000000000000c4c <unlink>: -.global unlink -unlink: - li a7, SYS_unlink c4c: 48c9 li a7,18 - ecall c4e: 00000073 ecall - ret c52: 8082 ret 0000000000000c54 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat c54: 48a1 li a7,8 - ecall c56: 00000073 ecall - ret c5a: 8082 ret 0000000000000c5c <link>: -.global link -link: - li a7, SYS_link c5c: 48cd li a7,19 - ecall c5e: 00000073 ecall - ret c62: 8082 ret 0000000000000c64 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir c64: 48d1 li a7,20 - ecall c66: 00000073 ecall - ret c6a: 8082 ret 0000000000000c6c <chdir>: -.global chdir -chdir: - li a7, SYS_chdir c6c: 48a5 li a7,9 - ecall c6e: 00000073 ecall - ret c72: 8082 ret 0000000000000c74 <dup>: -.global dup -dup: - li a7, SYS_dup c74: 48a9 li a7,10 - ecall c76: 00000073 ecall - ret c7a: 8082 ret 0000000000000c7c <getpid>: -.global getpid -getpid: - li a7, SYS_getpid c7c: 48ad li a7,11 - ecall c7e: 00000073 ecall - ret c82: 8082 ret 0000000000000c84 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk c84: 48b1 li a7,12 - ecall c86: 00000073 ecall - ret c8a: 8082 ret 0000000000000c8c <sleep>: -.global sleep -sleep: - li a7, SYS_sleep c8c: 48b5 li a7,13 - ecall c8e: 00000073 ecall - ret c92: 8082 ret 0000000000000c94 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime c94: 48b9 li a7,14 - ecall c96: 00000073 ecall - ret c9a: 8082 ret 0000000000000c9c <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var c9c: 48d9 li a7,22 - ecall c9e: 00000073 ecall - ret ca2: 8082 ret 0000000000000ca4 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var ca4: 48dd li a7,23 - ecall ca6: 00000073 ecall - ret caa: 8082 ret 0000000000000cac <symlink>: -.global symlink -symlink: - li a7, SYS_symlink cac: 48e1 li a7,24 - ecall cae: 00000073 ecall - ret cb2: 8082 ret 0000000000000cb4 <putc>: @@ -2534,184 +2412,113 @@ printf(const char *fmt, ...) 105c: 8082 ret 000000000000105e <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 105e: 1141 addi sp,sp,-16 1060: e422 sd s0,8(sp) 1062: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 1064: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 1068: 00001797 auipc a5,0x1 106c: fa87b783 ld a5,-88(a5) # 2010 <freep> 1070: a02d j 109a <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 1072: 4618 lw a4,8(a2) 1074: 9f2d addw a4,a4,a1 1076: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 107a: 6398 ld a4,0(a5) 107c: 6310 ld a2,0(a4) 107e: a83d j 10bc <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 1080: ff852703 lw a4,-8(a0) 1084: 9f31 addw a4,a4,a2 1086: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 1088: ff053683 ld a3,-16(a0) 108c: a091 j 10d0 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 108e: 6398 ld a4,0(a5) 1090: 00e7e463 bltu a5,a4,1098 <free+0x3a> 1094: 00e6ea63 bltu a3,a4,10a8 <free+0x4a> -{ 1098: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 109a: fed7fae3 bgeu a5,a3,108e <free+0x30> 109e: 6398 ld a4,0(a5) 10a0: 00e6e463 bltu a3,a4,10a8 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 10a4: fee7eae3 bltu a5,a4,1098 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 10a8: ff852583 lw a1,-8(a0) 10ac: 6390 ld a2,0(a5) 10ae: 02059813 slli a6,a1,0x20 10b2: 01c85713 srli a4,a6,0x1c 10b6: 9736 add a4,a4,a3 10b8: fae60de3 beq a2,a4,1072 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 10bc: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 10c0: 4790 lw a2,8(a5) 10c2: 02061593 slli a1,a2,0x20 10c6: 01c5d713 srli a4,a1,0x1c 10ca: 973e add a4,a4,a5 10cc: fae68ae3 beq a3,a4,1080 <free+0x22> - p->s.ptr = bp->s.ptr; 10d0: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 10d2: 00001717 auipc a4,0x1 10d6: f2f73f23 sd a5,-194(a4) # 2010 <freep> -} 10da: 6422 ld s0,8(sp) 10dc: 0141 addi sp,sp,16 10de: 8082 ret 00000000000010e0 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 10e0: 7139 addi sp,sp,-64 10e2: fc06 sd ra,56(sp) 10e4: f822 sd s0,48(sp) 10e6: f426 sd s1,40(sp) 10e8: ec4e sd s3,24(sp) 10ea: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 10ec: 02051493 slli s1,a0,0x20 10f0: 9081 srli s1,s1,0x20 10f2: 04bd addi s1,s1,15 10f4: 8091 srli s1,s1,0x4 10f6: 0014899b addiw s3,s1,1 10fa: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 10fc: 00001517 auipc a0,0x1 1100: f1453503 ld a0,-236(a0) # 2010 <freep> 1104: c915 beqz a0,1138 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 1106: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 1108: 4798 lw a4,8(a5) 110a: 08977a63 bgeu a4,s1,119e <malloc+0xbe> 110e: f04a sd s2,32(sp) 1110: e852 sd s4,16(sp) 1112: e456 sd s5,8(sp) 1114: e05a sd s6,0(sp) - if(nu < 4096) 1116: 8a4e mv s4,s3 1118: 0009871b sext.w a4,s3 111c: 6685 lui a3,0x1 111e: 00d77363 bgeu a4,a3,1124 <malloc+0x44> 1122: 6a05 lui s4,0x1 1124: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 1128: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 112c: 00001917 auipc s2,0x1 1130: ee490913 addi s2,s2,-284 # 2010 <freep> - if(p == (char*)-1) 1134: 5afd li s5,-1 1136: a081 j 1176 <malloc+0x96> 1138: f04a sd s2,32(sp) 113a: e852 sd s4,16(sp) 113c: e456 sd s5,8(sp) 113e: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 1140: 00001797 auipc a5,0x1 1144: f4878793 addi a5,a5,-184 # 2088 <base> 1148: 00001717 auipc a4,0x1 114c: ecf73423 sd a5,-312(a4) # 2010 <freep> 1150: e39c sd a5,0(a5) - base.s.size = 0; 1152: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 1156: b7c1 j 1116 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 1158: 6398 ld a4,0(a5) 115a: e118 sd a4,0(a0) 115c: a8a9 j 11b6 <malloc+0xd6> - hp->s.size = nu; 115e: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 1162: 0541 addi a0,a0,16 1164: efbff0ef jal 105e <free> - return freep; 1168: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 116c: c12d beqz a0,11ce <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 116e: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 1170: 4798 lw a4,8(a5) 1172: 02977263 bgeu a4,s1,1196 <malloc+0xb6> - if(p == freep) 1176: 00093703 ld a4,0(s2) 117a: 853e mv a0,a5 117c: fef719e3 bne a4,a5,116e <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 1180: 8552 mv a0,s4 1182: b03ff0ef jal c84 <sbrk> - if(p == (char*)-1) 1186: fd551ce3 bne a0,s5,115e <malloc+0x7e> - return 0; 118a: 4501 li a0,0 118c: 7902 ld s2,32(sp) 118e: 6a42 ld s4,16(sp) @@ -2722,24 +2529,16 @@ malloc(uint nbytes) 1198: 6a42 ld s4,16(sp) 119a: 6aa2 ld s5,8(sp) 119c: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 119e: fae48de3 beq s1,a4,1158 <malloc+0x78> - p->s.size -= nunits; 11a2: 4137073b subw a4,a4,s3 11a6: c798 sw a4,8(a5) - p += p->s.size; 11a8: 02071693 slli a3,a4,0x20 11ac: 01c6d713 srli a4,a3,0x1c 11b0: 97ba add a5,a5,a4 - p->s.size = nunits; 11b2: 0137a423 sw s3,8(a5) - freep = prevp; 11b6: 00001717 auipc a4,0x1 11ba: e4a73d23 sd a0,-422(a4) # 2010 <freep> - return (void*)(p + 1); 11be: 01078513 addi a0,a5,16 - } -} 11c2: 70e2 ld ra,56(sp) 11c4: 7442 ld s0,48(sp) 11c6: 74a2 ld s1,40(sp) diff --git a/user/sh.o b/user/sh.o index 5af324585e30bab45ceff66448f540a44ebdd906..d455f83b6ea17335dc222b6ebe1502bef9e52d08 100644 Binary files a/user/sh.o and b/user/sh.o differ diff --git a/user/sleep.asm b/user/sleep.asm index 5cc06831bb5cef067b4e03a9868aa921eb3e423e..939657bb5c740f704363e8a0feff6e70d40c6996 100644 --- a/user/sleep.asm +++ b/user/sleep.asm @@ -47,50 +47,87 @@ main(int argc, char* argv[]) 42: bff1 j 1e <main+0x1e> 0000000000000044 <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ 44: 1141 addi sp,sp,-16 46: e406 sd ra,8(sp) 48: e022 sd s0,0(sp) 4a: 0800 addi s0,sp,16 + extern int main(); + main(); 4c: fb5ff0ef jal 0 <main> + exit(0); 50: 4501 li a0,0 52: 25c000ef jal 2ae <exit> 0000000000000056 <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ 56: 1141 addi sp,sp,-16 58: e422 sd s0,8(sp) 5a: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) 5c: 87aa mv a5,a0 5e: 0585 addi a1,a1,1 60: 0785 addi a5,a5,1 62: fff5c703 lbu a4,-1(a1) 66: fee78fa3 sb a4,-1(a5) 6a: fb75 bnez a4,5e <strcpy+0x8> + ; + return os; +} 6c: 6422 ld s0,8(sp) 6e: 0141 addi sp,sp,16 70: 8082 ret 0000000000000072 <strcmp>: + +int +strcmp(const char *p, const char *q) +{ 72: 1141 addi sp,sp,-16 74: e422 sd s0,8(sp) 76: 0800 addi s0,sp,16 + while(*p && *p == *q) 78: 00054783 lbu a5,0(a0) 7c: cb91 beqz a5,90 <strcmp+0x1e> 7e: 0005c703 lbu a4,0(a1) 82: 00f71763 bne a4,a5,90 <strcmp+0x1e> + p++, q++; 86: 0505 addi a0,a0,1 88: 0585 addi a1,a1,1 + while(*p && *p == *q) 8a: 00054783 lbu a5,0(a0) 8e: fbe5 bnez a5,7e <strcmp+0xc> + return (uchar)*p - (uchar)*q; 90: 0005c503 lbu a0,0(a1) +} 94: 40a7853b subw a0,a5,a0 98: 6422 ld s0,8(sp) 9a: 0141 addi sp,sp,16 9c: 8082 ret 000000000000009e <strlen>: + +uint +strlen(const char *s) +{ 9e: 1141 addi sp,sp,-16 a0: e422 sd s0,8(sp) a2: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) a4: 00054783 lbu a5,0(a0) a8: cf91 beqz a5,c4 <strlen+0x26> aa: 0505 addi a0,a0,1 @@ -101,46 +138,77 @@ main(int argc, char* argv[]) b6: ff65 bnez a4,ae <strlen+0x10> b8: 40a6853b subw a0,a3,a0 bc: 2505 addiw a0,a0,1 + ; + return n; +} be: 6422 ld s0,8(sp) c0: 0141 addi sp,sp,16 c2: 8082 ret + for(n = 0; s[n]; n++) c4: 4501 li a0,0 c6: bfe5 j be <strlen+0x20> 00000000000000c8 <memset>: + +void* +memset(void *dst, int c, uint n) +{ c8: 1141 addi sp,sp,-16 ca: e422 sd s0,8(sp) cc: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ ce: ca19 beqz a2,e4 <memset+0x1c> d0: 87aa mv a5,a0 d2: 1602 slli a2,a2,0x20 d4: 9201 srli a2,a2,0x20 d6: 00a60733 add a4,a2,a0 + cdst[i] = c; da: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ de: 0785 addi a5,a5,1 e0: fee79de3 bne a5,a4,da <memset+0x12> + } + return dst; +} e4: 6422 ld s0,8(sp) e6: 0141 addi sp,sp,16 e8: 8082 ret 00000000000000ea <strchr>: + +char* +strchr(const char *s, char c) +{ ea: 1141 addi sp,sp,-16 ec: e422 sd s0,8(sp) ee: 0800 addi s0,sp,16 + for(; *s; s++) f0: 00054783 lbu a5,0(a0) f4: cb99 beqz a5,10a <strchr+0x20> + if(*s == c) f6: 00f58763 beq a1,a5,104 <strchr+0x1a> + for(; *s; s++) fa: 0505 addi a0,a0,1 fc: 00054783 lbu a5,0(a0) 100: fbfd bnez a5,f6 <strchr+0xc> + return (char*)s; + return 0; 102: 4501 li a0,0 +} 104: 6422 ld s0,8(sp) 106: 0141 addi sp,sp,16 108: 8082 ret + return 0; 10a: 4501 li a0,0 10c: bfe5 j 104 <strchr+0x1a> 000000000000010e <gets>: + +char* +gets(char *buf, int max) +{ 10e: 711d addi sp,sp,-96 110: ec86 sd ra,88(sp) 112: e8a2 sd s0,80(sp) @@ -154,28 +222,48 @@ main(int argc, char* argv[]) 122: 1080 addi s0,sp,96 124: 8baa mv s7,a0 126: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ 128: 892a mv s2,a0 12a: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') 12c: 4aa9 li s5,10 12e: 4b35 li s6,13 + for(i=0; i+1 < max; ){ 130: 89a6 mv s3,s1 132: 2485 addiw s1,s1,1 134: 0344d663 bge s1,s4,160 <gets+0x52> + cc = read(0, &c, 1); 138: 4605 li a2,1 13a: faf40593 addi a1,s0,-81 13e: 4501 li a0,0 140: 186000ef jal 2c6 <read> + if(cc < 1) 144: 00a05e63 blez a0,160 <gets+0x52> + buf[i++] = c; 148: faf44783 lbu a5,-81(s0) 14c: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') 150: 01578763 beq a5,s5,15e <gets+0x50> 154: 0905 addi s2,s2,1 156: fd679de3 bne a5,s6,130 <gets+0x22> + buf[i++] = c; 15a: 89a6 mv s3,s1 15c: a011 j 160 <gets+0x52> 15e: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; 160: 99de add s3,s3,s7 162: 00098023 sb zero,0(s3) + return buf; +} 166: 855e mv a0,s7 168: 60e6 ld ra,88(sp) 16a: 6446 ld s0,80(sp) @@ -190,123 +278,200 @@ main(int argc, char* argv[]) 17c: 8082 ret 000000000000017e <stat>: + +int +stat(const char *n, struct stat *st) +{ 17e: 1101 addi sp,sp,-32 180: ec06 sd ra,24(sp) 182: e822 sd s0,16(sp) 184: e04a sd s2,0(sp) 186: 1000 addi s0,sp,32 188: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); 18a: 4581 li a1,0 18c: 162000ef jal 2ee <open> + if(fd < 0) 190: 02054263 bltz a0,1b4 <stat+0x36> 194: e426 sd s1,8(sp) 196: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); 198: 85ca mv a1,s2 19a: 16c000ef jal 306 <fstat> 19e: 892a mv s2,a0 + close(fd); 1a0: 8526 mv a0,s1 1a2: 134000ef jal 2d6 <close> + return r; 1a6: 64a2 ld s1,8(sp) +} 1a8: 854a mv a0,s2 1aa: 60e2 ld ra,24(sp) 1ac: 6442 ld s0,16(sp) 1ae: 6902 ld s2,0(sp) 1b0: 6105 addi sp,sp,32 1b2: 8082 ret + return -1; 1b4: 597d li s2,-1 1b6: bfcd j 1a8 <stat+0x2a> 00000000000001b8 <atoi>: + +int +atoi(const char *s) +{ 1b8: 1141 addi sp,sp,-16 1ba: e422 sd s0,8(sp) 1bc: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') 1be: 00054683 lbu a3,0(a0) 1c2: fd06879b addiw a5,a3,-48 1c6: 0ff7f793 zext.b a5,a5 1ca: 4625 li a2,9 1cc: 02f66863 bltu a2,a5,1fc <atoi+0x44> 1d0: 872a mv a4,a0 + n = 0; 1d2: 4501 li a0,0 + n = n*10 + *s++ - '0'; 1d4: 0705 addi a4,a4,1 1d6: 0025179b slliw a5,a0,0x2 1da: 9fa9 addw a5,a5,a0 1dc: 0017979b slliw a5,a5,0x1 1e0: 9fb5 addw a5,a5,a3 1e2: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') 1e6: 00074683 lbu a3,0(a4) 1ea: fd06879b addiw a5,a3,-48 1ee: 0ff7f793 zext.b a5,a5 1f2: fef671e3 bgeu a2,a5,1d4 <atoi+0x1c> + return n; +} 1f6: 6422 ld s0,8(sp) 1f8: 0141 addi sp,sp,16 1fa: 8082 ret + n = 0; 1fc: 4501 li a0,0 1fe: bfe5 j 1f6 <atoi+0x3e> 0000000000000200 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ 200: 1141 addi sp,sp,-16 202: e422 sd s0,8(sp) 204: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { 206: 02b57463 bgeu a0,a1,22e <memmove+0x2e> + while(n-- > 0) 20a: 00c05f63 blez a2,228 <memmove+0x28> 20e: 1602 slli a2,a2,0x20 210: 9201 srli a2,a2,0x20 212: 00c507b3 add a5,a0,a2 + dst = vdst; 216: 872a mv a4,a0 + *dst++ = *src++; 218: 0585 addi a1,a1,1 21a: 0705 addi a4,a4,1 21c: fff5c683 lbu a3,-1(a1) 220: fed70fa3 sb a3,-1(a4) + while(n-- > 0) 224: fef71ae3 bne a4,a5,218 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} 228: 6422 ld s0,8(sp) 22a: 0141 addi sp,sp,16 22c: 8082 ret + dst += n; 22e: 00c50733 add a4,a0,a2 + src += n; 232: 95b2 add a1,a1,a2 + while(n-- > 0) 234: fec05ae3 blez a2,228 <memmove+0x28> 238: fff6079b addiw a5,a2,-1 23c: 1782 slli a5,a5,0x20 23e: 9381 srli a5,a5,0x20 240: fff7c793 not a5,a5 244: 97ba add a5,a5,a4 + *--dst = *--src; 246: 15fd addi a1,a1,-1 248: 177d addi a4,a4,-1 24a: 0005c683 lbu a3,0(a1) 24e: 00d70023 sb a3,0(a4) + while(n-- > 0) 252: fee79ae3 bne a5,a4,246 <memmove+0x46> 256: bfc9 j 228 <memmove+0x28> 0000000000000258 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ 258: 1141 addi sp,sp,-16 25a: e422 sd s0,8(sp) 25c: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { 25e: ca05 beqz a2,28e <memcmp+0x36> 260: fff6069b addiw a3,a2,-1 264: 1682 slli a3,a3,0x20 266: 9281 srli a3,a3,0x20 268: 0685 addi a3,a3,1 26a: 96aa add a3,a3,a0 + if (*p1 != *p2) { 26c: 00054783 lbu a5,0(a0) 270: 0005c703 lbu a4,0(a1) 274: 00e79863 bne a5,a4,284 <memcmp+0x2c> + return *p1 - *p2; + } + p1++; 278: 0505 addi a0,a0,1 + p2++; 27a: 0585 addi a1,a1,1 + while (n-- > 0) { 27c: fed518e3 bne a0,a3,26c <memcmp+0x14> + } + return 0; 280: 4501 li a0,0 282: a019 j 288 <memcmp+0x30> + return *p1 - *p2; 284: 40e7853b subw a0,a5,a4 +} 288: 6422 ld s0,8(sp) 28a: 0141 addi sp,sp,16 28c: 8082 ret + return 0; 28e: 4501 li a0,0 290: bfe5 j 288 <memcmp+0x30> 0000000000000292 <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ 292: 1141 addi sp,sp,-16 294: e406 sd ra,8(sp) 296: e022 sd s0,0(sp) 298: 0800 addi s0,sp,16 + return memmove(dst, src, n); 29a: f67ff0ef jal 200 <memmove> +} 29e: 60a2 ld ra,8(sp) 2a0: 6402 ld s0,0(sp) 2a2: 0141 addi sp,sp,16 @@ -433,32 +598,60 @@ main(int argc, char* argv[]) 364: 8082 ret 0000000000000366 <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ 366: 1101 addi sp,sp,-32 368: ec06 sd ra,24(sp) 36a: e822 sd s0,16(sp) 36c: 1000 addi s0,sp,32 36e: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); 372: 4605 li a2,1 374: fef40593 addi a1,s0,-17 378: f57ff0ef jal 2ce <write> +} 37c: 60e2 ld ra,24(sp) 37e: 6442 ld s0,16(sp) 380: 6105 addi sp,sp,32 382: 8082 ret 0000000000000384 <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ 384: 7139 addi sp,sp,-64 386: fc06 sd ra,56(sp) 388: f822 sd s0,48(sp) 38a: f426 sd s1,40(sp) 38c: 0080 addi s0,sp,64 38e: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ 390: c299 beqz a3,396 <printint+0x12> 392: 0805c963 bltz a1,424 <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; 396: 2581 sext.w a1,a1 + neg = 0; 398: 4881 li a7,0 39a: fc040693 addi a3,s0,-64 + } + + i = 0; 39e: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; 3a0: 2601 sext.w a2,a2 3a2: 00000517 auipc a0,0x0 3a6: 52e50513 addi a0,a0,1326 # 8d0 <digits> @@ -470,16 +663,21 @@ main(int argc, char* argv[]) 3b6: 97aa add a5,a5,a0 3b8: 0007c783 lbu a5,0(a5) 3bc: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); 3c0: 0005879b sext.w a5,a1 3c4: 02c5d5bb divuw a1,a1,a2 3c8: 0685 addi a3,a3,1 3ca: fec7f0e3 bgeu a5,a2,3aa <printint+0x26> + if(neg) 3ce: 00088c63 beqz a7,3e6 <printint+0x62> + buf[i++] = '-'; 3d2: fd070793 addi a5,a4,-48 3d6: 00878733 add a4,a5,s0 3da: 02d00793 li a5,45 3de: fef70823 sb a5,-16(a4) 3e2: 0028071b addiw a4,a6,2 + + while(--i >= 0) 3e6: 02e05a63 blez a4,41a <printint+0x96> 3ea: f04a sd s2,32(sp) 3ec: ec4e sd s3,24(sp) @@ -491,28 +689,45 @@ main(int argc, char* argv[]) 3fe: 1702 slli a4,a4,0x20 400: 9301 srli a4,a4,0x20 402: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); 406: fff94583 lbu a1,-1(s2) 40a: 8526 mv a0,s1 40c: f5bff0ef jal 366 <putc> + while(--i >= 0) 410: 197d addi s2,s2,-1 412: ff391ae3 bne s2,s3,406 <printint+0x82> 416: 7902 ld s2,32(sp) 418: 69e2 ld s3,24(sp) +} 41a: 70e2 ld ra,56(sp) 41c: 7442 ld s0,48(sp) 41e: 74a2 ld s1,40(sp) 420: 6121 addi sp,sp,64 422: 8082 ret + x = -xx; 424: 40b005bb negw a1,a1 + neg = 1; 428: 4885 li a7,1 + x = -xx; 42a: bf85 j 39a <printint+0x16> 000000000000042c <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ 42c: 711d addi sp,sp,-96 42e: ec86 sd ra,88(sp) 430: e8a2 sd s0,80(sp) 432: e0ca sd s2,64(sp) 434: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ 436: 0005c903 lbu s2,0(a1) 43a: 26090863 beqz s2,6aa <vprintf+0x27e> 43e: e4a6 sd s1,72(sp) @@ -526,51 +741,110 @@ main(int argc, char* argv[]) 44e: 8b2a mv s6,a0 450: 8a2e mv s4,a1 452: 8bb2 mv s7,a2 + state = 0; 454: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ 456: 4481 li s1,0 458: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ 45a: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ 45e: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ 462: 06c00c93 li s9,108 466: a005 j 486 <vprintf+0x5a> + putc(fd, c0); 468: 85ca mv a1,s2 46a: 855a mv a0,s6 46c: efbff0ef jal 366 <putc> 470: a019 j 476 <vprintf+0x4a> + } else if(state == '%'){ 472: 03598263 beq s3,s5,496 <vprintf+0x6a> + for(i = 0; fmt[i]; i++){ 476: 2485 addiw s1,s1,1 478: 8726 mv a4,s1 47a: 009a07b3 add a5,s4,s1 47e: 0007c903 lbu s2,0(a5) 482: 20090c63 beqz s2,69a <vprintf+0x26e> + c0 = fmt[i] & 0xff; 486: 0009079b sext.w a5,s2 + if(state == 0){ 48a: fe0994e3 bnez s3,472 <vprintf+0x46> + if(c0 == '%'){ 48e: fd579de3 bne a5,s5,468 <vprintf+0x3c> + state = '%'; 492: 89be mv s3,a5 494: b7cd j 476 <vprintf+0x4a> + if(c0) c1 = fmt[i+1] & 0xff; 496: 00ea06b3 add a3,s4,a4 49a: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; 49e: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; 4a0: c681 beqz a3,4a8 <vprintf+0x7c> 4a2: 9752 add a4,a4,s4 4a4: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ 4a8: 03878f63 beq a5,s8,4e6 <vprintf+0xba> + } else if(c0 == 'l' && c1 == 'd'){ 4ac: 05978963 beq a5,s9,4fe <vprintf+0xd2> + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ 4b0: 07500713 li a4,117 4b4: 0ee78363 beq a5,a4,59a <vprintf+0x16e> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ 4b8: 07800713 li a4,120 4bc: 12e78563 beq a5,a4,5e6 <vprintf+0x1ba> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ 4c0: 07000713 li a4,112 4c4: 14e78a63 beq a5,a4,618 <vprintf+0x1ec> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ 4c8: 07300713 li a4,115 4cc: 18e78a63 beq a5,a4,660 <vprintf+0x234> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ 4d0: 02500713 li a4,37 4d4: 04e79563 bne a5,a4,51e <vprintf+0xf2> + putc(fd, '%'); 4d8: 02500593 li a1,37 4dc: 855a mv a0,s6 4de: e89ff0ef jal 366 <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; 4e2: 4981 li s3,0 4e4: bf49 j 476 <vprintf+0x4a> + printint(fd, va_arg(ap, int), 10, 1); 4e6: 008b8913 addi s2,s7,8 4ea: 4685 li a3,1 4ec: 4629 li a2,10 @@ -578,60 +852,87 @@ main(int argc, char* argv[]) 4f2: 855a mv a0,s6 4f4: e91ff0ef jal 384 <printint> 4f8: 8bca mv s7,s2 + state = 0; 4fa: 4981 li s3,0 4fc: bfad j 476 <vprintf+0x4a> + } else if(c0 == 'l' && c1 == 'd'){ 4fe: 06400793 li a5,100 502: 02f68963 beq a3,a5,534 <vprintf+0x108> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ 506: 06c00793 li a5,108 50a: 04f68263 beq a3,a5,54e <vprintf+0x122> + } else if(c0 == 'l' && c1 == 'u'){ 50e: 07500793 li a5,117 512: 0af68063 beq a3,a5,5b2 <vprintf+0x186> + } else if(c0 == 'l' && c1 == 'x'){ 516: 07800793 li a5,120 51a: 0ef68263 beq a3,a5,5fe <vprintf+0x1d2> + putc(fd, '%'); 51e: 02500593 li a1,37 522: 855a mv a0,s6 524: e43ff0ef jal 366 <putc> + putc(fd, c0); 528: 85ca mv a1,s2 52a: 855a mv a0,s6 52c: e3bff0ef jal 366 <putc> + state = 0; 530: 4981 li s3,0 532: b791 j 476 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 1); 534: 008b8913 addi s2,s7,8 538: 4685 li a3,1 53a: 4629 li a2,10 53c: 000ba583 lw a1,0(s7) 540: 855a mv a0,s6 542: e43ff0ef jal 384 <printint> + i += 1; 546: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); 548: 8bca mv s7,s2 + state = 0; 54a: 4981 li s3,0 + i += 1; 54c: b72d j 476 <vprintf+0x4a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ 54e: 06400793 li a5,100 552: 02f60763 beq a2,a5,580 <vprintf+0x154> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ 556: 07500793 li a5,117 55a: 06f60963 beq a2,a5,5cc <vprintf+0x1a0> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ 55e: 07800793 li a5,120 562: faf61ee3 bne a2,a5,51e <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); 566: 008b8913 addi s2,s7,8 56a: 4681 li a3,0 56c: 4641 li a2,16 56e: 000ba583 lw a1,0(s7) 572: 855a mv a0,s6 574: e11ff0ef jal 384 <printint> + i += 2; 578: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); 57a: 8bca mv s7,s2 + state = 0; 57c: 4981 li s3,0 + i += 2; 57e: bde5 j 476 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 1); 580: 008b8913 addi s2,s7,8 584: 4685 li a3,1 586: 4629 li a2,10 588: 000ba583 lw a1,0(s7) 58c: 855a mv a0,s6 58e: df7ff0ef jal 384 <printint> + i += 2; 592: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); 594: 8bca mv s7,s2 + state = 0; 596: 4981 li s3,0 + i += 2; 598: bdf9 j 476 <vprintf+0x4a> + printint(fd, va_arg(ap, int), 10, 0); 59a: 008b8913 addi s2,s7,8 59e: 4681 li a3,0 5a0: 4629 li a2,10 @@ -639,28 +940,40 @@ main(int argc, char* argv[]) 5a6: 855a mv a0,s6 5a8: dddff0ef jal 384 <printint> 5ac: 8bca mv s7,s2 + state = 0; 5ae: 4981 li s3,0 5b0: b5d9 j 476 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 0); 5b2: 008b8913 addi s2,s7,8 5b6: 4681 li a3,0 5b8: 4629 li a2,10 5ba: 000ba583 lw a1,0(s7) 5be: 855a mv a0,s6 5c0: dc5ff0ef jal 384 <printint> + i += 1; 5c4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); 5c6: 8bca mv s7,s2 + state = 0; 5c8: 4981 li s3,0 + i += 1; 5ca: b575 j 476 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 0); 5cc: 008b8913 addi s2,s7,8 5d0: 4681 li a3,0 5d2: 4629 li a2,10 5d4: 000ba583 lw a1,0(s7) 5d8: 855a mv a0,s6 5da: dabff0ef jal 384 <printint> + i += 2; 5de: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); 5e0: 8bca mv s7,s2 + state = 0; 5e2: 4981 li s3,0 + i += 2; 5e4: bd49 j 476 <vprintf+0x4a> + printint(fd, va_arg(ap, int), 16, 0); 5e6: 008b8913 addi s2,s7,8 5ea: 4681 li a3,0 5ec: 4641 li a2,16 @@ -668,28 +981,38 @@ main(int argc, char* argv[]) 5f2: 855a mv a0,s6 5f4: d91ff0ef jal 384 <printint> 5f8: 8bca mv s7,s2 + state = 0; 5fa: 4981 li s3,0 5fc: bdad j 476 <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 16, 0); 5fe: 008b8913 addi s2,s7,8 602: 4681 li a3,0 604: 4641 li a2,16 606: 000ba583 lw a1,0(s7) 60a: 855a mv a0,s6 60c: d79ff0ef jal 384 <printint> + i += 1; 610: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); 612: 8bca mv s7,s2 + state = 0; 614: 4981 li s3,0 + i += 1; 616: b585 j 476 <vprintf+0x4a> 618: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); 61a: 008b8d13 addi s10,s7,8 61e: 000bb983 ld s3,0(s7) + putc(fd, '0'); 622: 03000593 li a1,48 626: 855a mv a0,s6 628: d3fff0ef jal 366 <putc> + putc(fd, 'x'); 62c: 07800593 li a1,120 630: 855a mv a0,s6 632: d35ff0ef jal 366 <putc> 636: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); 638: 00000b97 auipc s7,0x0 63c: 298b8b93 addi s7,s7,664 # 8d0 <digits> 640: 03c9d793 srli a5,s3,0x3c @@ -697,31 +1020,44 @@ main(int argc, char* argv[]) 646: 0007c583 lbu a1,0(a5) 64a: 855a mv a0,s6 64c: d1bff0ef jal 366 <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) 650: 0992 slli s3,s3,0x4 652: 397d addiw s2,s2,-1 654: fe0916e3 bnez s2,640 <vprintf+0x214> + printptr(fd, va_arg(ap, uint64)); 658: 8bea mv s7,s10 + state = 0; 65a: 4981 li s3,0 65c: 6d02 ld s10,0(sp) 65e: bd21 j 476 <vprintf+0x4a> + if((s = va_arg(ap, char*)) == 0) 660: 008b8993 addi s3,s7,8 664: 000bb903 ld s2,0(s7) 668: 00090f63 beqz s2,686 <vprintf+0x25a> + for(; *s; s++) 66c: 00094583 lbu a1,0(s2) 670: c195 beqz a1,694 <vprintf+0x268> + putc(fd, *s); 672: 855a mv a0,s6 674: cf3ff0ef jal 366 <putc> + for(; *s; s++) 678: 0905 addi s2,s2,1 67a: 00094583 lbu a1,0(s2) 67e: f9f5 bnez a1,672 <vprintf+0x246> + if((s = va_arg(ap, char*)) == 0) 680: 8bce mv s7,s3 + state = 0; 682: 4981 li s3,0 684: bbcd j 476 <vprintf+0x4a> + s = "(null)"; 686: 00000917 auipc s2,0x0 68a: 24290913 addi s2,s2,578 # 8c8 <malloc+0x136> + for(; *s; s++) 68e: 02800593 li a1,40 692: b7c5 j 672 <vprintf+0x246> + if((s = va_arg(ap, char*)) == 0) 694: 8bce mv s7,s3 + state = 0; 696: 4981 li s3,0 698: bbf9 j 476 <vprintf+0x4a> 69a: 64a6 ld s1,72(sp) @@ -732,6 +1068,9 @@ main(int argc, char* argv[]) 6a4: 6be2 ld s7,24(sp) 6a6: 6c42 ld s8,16(sp) 6a8: 6ca2 ld s9,8(sp) + } + } +} 6aa: 60e6 ld ra,88(sp) 6ac: 6446 ld s0,80(sp) 6ae: 6906 ld s2,64(sp) @@ -739,6 +1078,10 @@ main(int argc, char* argv[]) 6b2: 8082 ret 00000000000006b4 <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ 6b4: 715d addi sp,sp,-80 6b6: ec06 sd ra,24(sp) 6b8: e822 sd s0,16(sp) @@ -749,15 +1092,24 @@ main(int argc, char* argv[]) 6c2: ec1c sd a5,24(s0) 6c4: 03043023 sd a6,32(s0) 6c8: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); 6cc: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); 6d0: 8622 mv a2,s0 6d2: d5bff0ef jal 42c <vprintf> +} 6d6: 60e2 ld ra,24(sp) 6d8: 6442 ld s0,16(sp) 6da: 6161 addi sp,sp,80 6dc: 8082 ret 00000000000006de <printf>: + +void +printf(const char *fmt, ...) +{ 6de: 711d addi sp,sp,-96 6e0: ec06 sd ra,24(sp) 6e2: e822 sd s0,16(sp) @@ -769,11 +1121,16 @@ main(int argc, char* argv[]) 6ee: f41c sd a5,40(s0) 6f0: 03043823 sd a6,48(s0) 6f4: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); 6f8: 00840613 addi a2,s0,8 6fc: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); 700: 85aa mv a1,a0 702: 4505 li a0,1 704: d29ff0ef jal 42c <vprintf> +} 708: 60e2 ld ra,24(sp) 70a: 6442 ld s0,16(sp) 70c: 6125 addi sp,sp,96 diff --git a/user/sleep.o b/user/sleep.o index 8629f59bfe1ea23130ca58a38a38d2a1acf61588..599a73f345219668862b87aabe6dded6d35a107a 100644 Binary files a/user/sleep.o and b/user/sleep.o differ diff --git a/user/stressfs.asm b/user/stressfs.asm index a8edba61025ac0f1db20b2ab6c9cfbe8ec7f0d82..7d93b08d510628242ff6f2dc43600b3b28945a69 100644 --- a/user/stressfs.asm +++ b/user/stressfs.asm @@ -542,245 +542,123 @@ memcpy(void *dst, const void *src, uint n) 338: 8082 ret 000000000000033a <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 33a: 4885 li a7,1 - ecall 33c: 00000073 ecall - ret 340: 8082 ret 0000000000000342 <exit>: -.global exit -exit: - li a7, SYS_exit 342: 4889 li a7,2 - ecall 344: 00000073 ecall - ret 348: 8082 ret 000000000000034a <wait>: -.global wait -wait: - li a7, SYS_wait 34a: 488d li a7,3 - ecall 34c: 00000073 ecall - ret 350: 8082 ret 0000000000000352 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 352: 4891 li a7,4 - ecall 354: 00000073 ecall - ret 358: 8082 ret 000000000000035a <read>: -.global read -read: - li a7, SYS_read 35a: 4895 li a7,5 - ecall 35c: 00000073 ecall - ret 360: 8082 ret 0000000000000362 <write>: -.global write -write: - li a7, SYS_write 362: 48c1 li a7,16 - ecall 364: 00000073 ecall - ret 368: 8082 ret 000000000000036a <close>: -.global close -close: - li a7, SYS_close 36a: 48d5 li a7,21 - ecall 36c: 00000073 ecall - ret 370: 8082 ret 0000000000000372 <kill>: -.global kill -kill: - li a7, SYS_kill 372: 4899 li a7,6 - ecall 374: 00000073 ecall - ret 378: 8082 ret 000000000000037a <exec>: -.global exec -exec: - li a7, SYS_exec 37a: 489d li a7,7 - ecall 37c: 00000073 ecall - ret 380: 8082 ret 0000000000000382 <open>: -.global open -open: - li a7, SYS_open 382: 48bd li a7,15 - ecall 384: 00000073 ecall - ret 388: 8082 ret 000000000000038a <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 38a: 48c5 li a7,17 - ecall 38c: 00000073 ecall - ret 390: 8082 ret 0000000000000392 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 392: 48c9 li a7,18 - ecall 394: 00000073 ecall - ret 398: 8082 ret 000000000000039a <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 39a: 48a1 li a7,8 - ecall 39c: 00000073 ecall - ret 3a0: 8082 ret 00000000000003a2 <link>: -.global link -link: - li a7, SYS_link 3a2: 48cd li a7,19 - ecall 3a4: 00000073 ecall - ret 3a8: 8082 ret 00000000000003aa <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 3aa: 48d1 li a7,20 - ecall 3ac: 00000073 ecall - ret 3b0: 8082 ret 00000000000003b2 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 3b2: 48a5 li a7,9 - ecall 3b4: 00000073 ecall - ret 3b8: 8082 ret 00000000000003ba <dup>: -.global dup -dup: - li a7, SYS_dup 3ba: 48a9 li a7,10 - ecall 3bc: 00000073 ecall - ret 3c0: 8082 ret 00000000000003c2 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 3c2: 48ad li a7,11 - ecall 3c4: 00000073 ecall - ret 3c8: 8082 ret 00000000000003ca <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 3ca: 48b1 li a7,12 - ecall 3cc: 00000073 ecall - ret 3d0: 8082 ret 00000000000003d2 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 3d2: 48b5 li a7,13 - ecall 3d4: 00000073 ecall - ret 3d8: 8082 ret 00000000000003da <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 3da: 48b9 li a7,14 - ecall 3dc: 00000073 ecall - ret 3e0: 8082 ret 00000000000003e2 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 3e2: 48d9 li a7,22 - ecall 3e4: 00000073 ecall - ret 3e8: 8082 ret 00000000000003ea <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 3ea: 48dd li a7,23 - ecall 3ec: 00000073 ecall - ret 3f0: 8082 ret 00000000000003f2 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 3f2: 48e1 li a7,24 - ecall 3f4: 00000073 ecall - ret 3f8: 8082 ret 00000000000003fa <putc>: @@ -1323,184 +1201,113 @@ printf(const char *fmt, ...) 7a2: 8082 ret 00000000000007a4 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 7a4: 1141 addi sp,sp,-16 7a6: e422 sd s0,8(sp) 7a8: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 7aa: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 7ae: 00001797 auipc a5,0x1 7b2: 8527b783 ld a5,-1966(a5) # 1000 <freep> 7b6: a02d j 7e0 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 7b8: 4618 lw a4,8(a2) 7ba: 9f2d addw a4,a4,a1 7bc: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 7c0: 6398 ld a4,0(a5) 7c2: 6310 ld a2,0(a4) 7c4: a83d j 802 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 7c6: ff852703 lw a4,-8(a0) 7ca: 9f31 addw a4,a4,a2 7cc: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 7ce: ff053683 ld a3,-16(a0) 7d2: a091 j 816 <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7d4: 6398 ld a4,0(a5) 7d6: 00e7e463 bltu a5,a4,7de <free+0x3a> 7da: 00e6ea63 bltu a3,a4,7ee <free+0x4a> -{ 7de: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 7e0: fed7fae3 bgeu a5,a3,7d4 <free+0x30> 7e4: 6398 ld a4,0(a5) 7e6: 00e6e463 bltu a3,a4,7ee <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 7ea: fee7eae3 bltu a5,a4,7de <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 7ee: ff852583 lw a1,-8(a0) 7f2: 6390 ld a2,0(a5) 7f4: 02059813 slli a6,a1,0x20 7f8: 01c85713 srli a4,a6,0x1c 7fc: 9736 add a4,a4,a3 7fe: fae60de3 beq a2,a4,7b8 <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 802: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 806: 4790 lw a2,8(a5) 808: 02061593 slli a1,a2,0x20 80c: 01c5d713 srli a4,a1,0x1c 810: 973e add a4,a4,a5 812: fae68ae3 beq a3,a4,7c6 <free+0x22> - p->s.ptr = bp->s.ptr; 816: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 818: 00000717 auipc a4,0x0 81c: 7ef73423 sd a5,2024(a4) # 1000 <freep> -} 820: 6422 ld s0,8(sp) 822: 0141 addi sp,sp,16 824: 8082 ret 0000000000000826 <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 826: 7139 addi sp,sp,-64 828: fc06 sd ra,56(sp) 82a: f822 sd s0,48(sp) 82c: f426 sd s1,40(sp) 82e: ec4e sd s3,24(sp) 830: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 832: 02051493 slli s1,a0,0x20 836: 9081 srli s1,s1,0x20 838: 04bd addi s1,s1,15 83a: 8091 srli s1,s1,0x4 83c: 0014899b addiw s3,s1,1 840: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 842: 00000517 auipc a0,0x0 846: 7be53503 ld a0,1982(a0) # 1000 <freep> 84a: c915 beqz a0,87e <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 84c: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 84e: 4798 lw a4,8(a5) 850: 08977a63 bgeu a4,s1,8e4 <malloc+0xbe> 854: f04a sd s2,32(sp) 856: e852 sd s4,16(sp) 858: e456 sd s5,8(sp) 85a: e05a sd s6,0(sp) - if(nu < 4096) 85c: 8a4e mv s4,s3 85e: 0009871b sext.w a4,s3 862: 6685 lui a3,0x1 864: 00d77363 bgeu a4,a3,86a <malloc+0x44> 868: 6a05 lui s4,0x1 86a: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 86e: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 872: 00000917 auipc s2,0x0 876: 78e90913 addi s2,s2,1934 # 1000 <freep> - if(p == (char*)-1) 87a: 5afd li s5,-1 87c: a081 j 8bc <malloc+0x96> 87e: f04a sd s2,32(sp) 880: e852 sd s4,16(sp) 882: e456 sd s5,8(sp) 884: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 886: 00000797 auipc a5,0x0 88a: 78a78793 addi a5,a5,1930 # 1010 <base> 88e: 00000717 auipc a4,0x0 892: 76f73923 sd a5,1906(a4) # 1000 <freep> 896: e39c sd a5,0(a5) - base.s.size = 0; 898: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 89c: b7c1 j 85c <malloc+0x36> - prevp->s.ptr = p->s.ptr; 89e: 6398 ld a4,0(a5) 8a0: e118 sd a4,0(a0) 8a2: a8a9 j 8fc <malloc+0xd6> - hp->s.size = nu; 8a4: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 8a8: 0541 addi a0,a0,16 8aa: efbff0ef jal 7a4 <free> - return freep; 8ae: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 8b2: c12d beqz a0,914 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 8b4: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 8b6: 4798 lw a4,8(a5) 8b8: 02977263 bgeu a4,s1,8dc <malloc+0xb6> - if(p == freep) 8bc: 00093703 ld a4,0(s2) 8c0: 853e mv a0,a5 8c2: fef719e3 bne a4,a5,8b4 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 8c6: 8552 mv a0,s4 8c8: b03ff0ef jal 3ca <sbrk> - if(p == (char*)-1) 8cc: fd551ce3 bne a0,s5,8a4 <malloc+0x7e> - return 0; 8d0: 4501 li a0,0 8d2: 7902 ld s2,32(sp) 8d4: 6a42 ld s4,16(sp) @@ -1511,24 +1318,16 @@ malloc(uint nbytes) 8de: 6a42 ld s4,16(sp) 8e0: 6aa2 ld s5,8(sp) 8e2: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 8e4: fae48de3 beq s1,a4,89e <malloc+0x78> - p->s.size -= nunits; 8e8: 4137073b subw a4,a4,s3 8ec: c798 sw a4,8(a5) - p += p->s.size; 8ee: 02071693 slli a3,a4,0x20 8f2: 01c6d713 srli a4,a3,0x1c 8f6: 97ba add a5,a5,a4 - p->s.size = nunits; 8f8: 0137a423 sw s3,8(a5) - freep = prevp; 8fc: 00000717 auipc a4,0x0 900: 70a73223 sd a0,1796(a4) # 1000 <freep> - return (void*)(p + 1); 904: 01078513 addi a0,a5,16 - } -} 908: 70e2 ld ra,56(sp) 90a: 7442 ld s0,48(sp) 90c: 74a2 ld s1,40(sp) diff --git a/user/stressfs.o b/user/stressfs.o index 83c71a49be7d10828e45caafc9fd024445c7703d..35849ccd8c4a2da52b52333a6245ba26cda7dbbf 100644 Binary files a/user/stressfs.o and b/user/stressfs.o differ diff --git a/user/symlinktest.asm b/user/symlinktest.asm index 4594db9d8d1003063676cd9f17580b546dae6809..3cd78cb4bc1066e22117d8bc421b8dbdfcb4285b 100644 --- a/user/symlinktest.asm +++ b/user/symlinktest.asm @@ -629,245 +629,123 @@ memcpy(void *dst, const void *src, uint n) 3dc: 8082 ret 00000000000003de <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 3de: 4885 li a7,1 - ecall 3e0: 00000073 ecall - ret 3e4: 8082 ret 00000000000003e6 <exit>: -.global exit -exit: - li a7, SYS_exit 3e6: 4889 li a7,2 - ecall 3e8: 00000073 ecall - ret 3ec: 8082 ret 00000000000003ee <wait>: -.global wait -wait: - li a7, SYS_wait 3ee: 488d li a7,3 - ecall 3f0: 00000073 ecall - ret 3f4: 8082 ret 00000000000003f6 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 3f6: 4891 li a7,4 - ecall 3f8: 00000073 ecall - ret 3fc: 8082 ret 00000000000003fe <read>: -.global read -read: - li a7, SYS_read 3fe: 4895 li a7,5 - ecall 400: 00000073 ecall - ret 404: 8082 ret 0000000000000406 <write>: -.global write -write: - li a7, SYS_write 406: 48c1 li a7,16 - ecall 408: 00000073 ecall - ret 40c: 8082 ret 000000000000040e <close>: -.global close -close: - li a7, SYS_close 40e: 48d5 li a7,21 - ecall 410: 00000073 ecall - ret 414: 8082 ret 0000000000000416 <kill>: -.global kill -kill: - li a7, SYS_kill 416: 4899 li a7,6 - ecall 418: 00000073 ecall - ret 41c: 8082 ret 000000000000041e <exec>: -.global exec -exec: - li a7, SYS_exec 41e: 489d li a7,7 - ecall 420: 00000073 ecall - ret 424: 8082 ret 0000000000000426 <open>: -.global open -open: - li a7, SYS_open 426: 48bd li a7,15 - ecall 428: 00000073 ecall - ret 42c: 8082 ret 000000000000042e <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 42e: 48c5 li a7,17 - ecall 430: 00000073 ecall - ret 434: 8082 ret 0000000000000436 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 436: 48c9 li a7,18 - ecall 438: 00000073 ecall - ret 43c: 8082 ret 000000000000043e <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 43e: 48a1 li a7,8 - ecall 440: 00000073 ecall - ret 444: 8082 ret 0000000000000446 <link>: -.global link -link: - li a7, SYS_link 446: 48cd li a7,19 - ecall 448: 00000073 ecall - ret 44c: 8082 ret 000000000000044e <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 44e: 48d1 li a7,20 - ecall 450: 00000073 ecall - ret 454: 8082 ret 0000000000000456 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 456: 48a5 li a7,9 - ecall 458: 00000073 ecall - ret 45c: 8082 ret 000000000000045e <dup>: -.global dup -dup: - li a7, SYS_dup 45e: 48a9 li a7,10 - ecall 460: 00000073 ecall - ret 464: 8082 ret 0000000000000466 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 466: 48ad li a7,11 - ecall 468: 00000073 ecall - ret 46c: 8082 ret 000000000000046e <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 46e: 48b1 li a7,12 - ecall 470: 00000073 ecall - ret 474: 8082 ret 0000000000000476 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 476: 48b5 li a7,13 - ecall 478: 00000073 ecall - ret 47c: 8082 ret 000000000000047e <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 47e: 48b9 li a7,14 - ecall 480: 00000073 ecall - ret 484: 8082 ret 0000000000000486 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 486: 48d9 li a7,22 - ecall 488: 00000073 ecall - ret 48c: 8082 ret 000000000000048e <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 48e: 48dd li a7,23 - ecall 490: 00000073 ecall - ret 494: 8082 ret 0000000000000496 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 496: 48e1 li a7,24 - ecall 498: 00000073 ecall - ret 49c: 8082 ret 000000000000049e <putc>: @@ -1410,184 +1288,113 @@ printf(const char *fmt, ...) 846: 8082 ret 0000000000000848 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 848: 1141 addi sp,sp,-16 84a: e422 sd s0,8(sp) 84c: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 84e: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 852: 00000797 auipc a5,0x0 856: 7ae7b783 ld a5,1966(a5) # 1000 <freep> 85a: a02d j 884 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 85c: 4618 lw a4,8(a2) 85e: 9f2d addw a4,a4,a1 860: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 864: 6398 ld a4,0(a5) 866: 6310 ld a2,0(a4) 868: a83d j 8a6 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 86a: ff852703 lw a4,-8(a0) 86e: 9f31 addw a4,a4,a2 870: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 872: ff053683 ld a3,-16(a0) 876: a091 j 8ba <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 878: 6398 ld a4,0(a5) 87a: 00e7e463 bltu a5,a4,882 <free+0x3a> 87e: 00e6ea63 bltu a3,a4,892 <free+0x4a> -{ 882: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 884: fed7fae3 bgeu a5,a3,878 <free+0x30> 888: 6398 ld a4,0(a5) 88a: 00e6e463 bltu a3,a4,892 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 88e: fee7eae3 bltu a5,a4,882 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 892: ff852583 lw a1,-8(a0) 896: 6390 ld a2,0(a5) 898: 02059813 slli a6,a1,0x20 89c: 01c85713 srli a4,a6,0x1c 8a0: 9736 add a4,a4,a3 8a2: fae60de3 beq a2,a4,85c <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 8a6: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 8aa: 4790 lw a2,8(a5) 8ac: 02061593 slli a1,a2,0x20 8b0: 01c5d713 srli a4,a1,0x1c 8b4: 973e add a4,a4,a5 8b6: fae68ae3 beq a3,a4,86a <free+0x22> - p->s.ptr = bp->s.ptr; 8ba: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 8bc: 00000717 auipc a4,0x0 8c0: 74f73223 sd a5,1860(a4) # 1000 <freep> -} 8c4: 6422 ld s0,8(sp) 8c6: 0141 addi sp,sp,16 8c8: 8082 ret 00000000000008ca <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 8ca: 7139 addi sp,sp,-64 8cc: fc06 sd ra,56(sp) 8ce: f822 sd s0,48(sp) 8d0: f426 sd s1,40(sp) 8d2: ec4e sd s3,24(sp) 8d4: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 8d6: 02051493 slli s1,a0,0x20 8da: 9081 srli s1,s1,0x20 8dc: 04bd addi s1,s1,15 8de: 8091 srli s1,s1,0x4 8e0: 0014899b addiw s3,s1,1 8e4: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 8e6: 00000517 auipc a0,0x0 8ea: 71a53503 ld a0,1818(a0) # 1000 <freep> 8ee: c915 beqz a0,922 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 8f0: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 8f2: 4798 lw a4,8(a5) 8f4: 08977a63 bgeu a4,s1,988 <malloc+0xbe> 8f8: f04a sd s2,32(sp) 8fa: e852 sd s4,16(sp) 8fc: e456 sd s5,8(sp) 8fe: e05a sd s6,0(sp) - if(nu < 4096) 900: 8a4e mv s4,s3 902: 0009871b sext.w a4,s3 906: 6685 lui a3,0x1 908: 00d77363 bgeu a4,a3,90e <malloc+0x44> 90c: 6a05 lui s4,0x1 90e: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 912: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 916: 00000917 auipc s2,0x0 91a: 6ea90913 addi s2,s2,1770 # 1000 <freep> - if(p == (char*)-1) 91e: 5afd li s5,-1 920: a081 j 960 <malloc+0x96> 922: f04a sd s2,32(sp) 924: e852 sd s4,16(sp) 926: e456 sd s5,8(sp) 928: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 92a: 00000797 auipc a5,0x0 92e: 6e678793 addi a5,a5,1766 # 1010 <base> 932: 00000717 auipc a4,0x0 936: 6cf73723 sd a5,1742(a4) # 1000 <freep> 93a: e39c sd a5,0(a5) - base.s.size = 0; 93c: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 940: b7c1 j 900 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 942: 6398 ld a4,0(a5) 944: e118 sd a4,0(a0) 946: a8a9 j 9a0 <malloc+0xd6> - hp->s.size = nu; 948: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 94c: 0541 addi a0,a0,16 94e: efbff0ef jal 848 <free> - return freep; 952: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 956: c12d beqz a0,9b8 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 958: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 95a: 4798 lw a4,8(a5) 95c: 02977263 bgeu a4,s1,980 <malloc+0xb6> - if(p == freep) 960: 00093703 ld a4,0(s2) 964: 853e mv a0,a5 966: fef719e3 bne a4,a5,958 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 96a: 8552 mv a0,s4 96c: b03ff0ef jal 46e <sbrk> - if(p == (char*)-1) 970: fd551ce3 bne a0,s5,948 <malloc+0x7e> - return 0; 974: 4501 li a0,0 976: 7902 ld s2,32(sp) 978: 6a42 ld s4,16(sp) @@ -1598,24 +1405,16 @@ malloc(uint nbytes) 982: 6a42 ld s4,16(sp) 984: 6aa2 ld s5,8(sp) 986: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 988: fae48de3 beq s1,a4,942 <malloc+0x78> - p->s.size -= nunits; 98c: 4137073b subw a4,a4,s3 990: c798 sw a4,8(a5) - p += p->s.size; 992: 02071693 slli a3,a4,0x20 996: 01c6d713 srli a4,a3,0x1c 99a: 97ba add a5,a5,a4 - p->s.size = nunits; 99c: 0137a423 sw s3,8(a5) - freep = prevp; 9a0: 00000717 auipc a4,0x0 9a4: 66a73023 sd a0,1632(a4) # 1000 <freep> - return (void*)(p + 1); 9a8: 01078513 addi a0,a5,16 - } -} 9ac: 70e2 ld ra,56(sp) 9ae: 7442 ld s0,48(sp) 9b0: 74a2 ld s1,40(sp) diff --git a/user/symlinktest.o b/user/symlinktest.o index 460ba0b59d00a96862e505623de09c01ad956786..1c0924ace2d6e9c3c2dd5ec09fa053a7abc3d154 100644 Binary files a/user/symlinktest.o and b/user/symlinktest.o differ diff --git a/user/ulib.o b/user/ulib.o index e87fa61b624de0c35758ba4e8eb4d28dccb0a436..1139333bd5cfa03ced760993409b784176d79807 100644 Binary files a/user/ulib.o and b/user/ulib.o differ diff --git a/user/usertests.asm b/user/usertests.asm index cfefe418f09dfd5aab42a5ee602e66d74aba00ef..f16f2fb2a78a9082926dee7663d4c0f42cdeea72 100644 --- a/user/usertests.asm +++ b/user/usertests.asm @@ -5,12 +5,6 @@ user/_usertests: æ–‡ä»¶æ ¼å¼ elf64-littleriscv Disassembly of section .text: 0000000000000000 <copyinstr1>: -} - -// what if you pass ridiculous string pointers to system calls? -void -copyinstr1(char *s) -{ 0: 711d addi sp,sp,-96 2: ec86 sd ra,88(sp) 4: e8a2 sd s0,80(sp) @@ -18,7 +12,6 @@ copyinstr1(char *s) 8: e0ca sd s2,64(sp) a: fc4e sd s3,56(sp) c: 1080 addi s0,sp,96 - uint64 addrs[] = { 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, e: 00007797 auipc a5,0x7 12: 3fa78793 addi a5,a5,1018 # 7408 <malloc+0x249e> 16: 638c ld a1,0(a5) @@ -31,28 +24,15 @@ copyinstr1(char *s) 28: fad43c23 sd a3,-72(s0) 2c: fce43023 sd a4,-64(s0) 30: fcf43423 sd a5,-56(s0) - 0xffffffffffffffff }; - - for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ 34: fa840493 addi s1,s0,-88 38: fd040993 addi s3,s0,-48 - uint64 addr = addrs[ai]; - - int fd = open((char *)addr, O_CREATE|O_WRONLY); 3c: 0004b903 ld s2,0(s1) 40: 20100593 li a1,513 44: 854a mv a0,s2 46: 281040ef jal 4ac6 <open> - if(fd >= 0){ 4a: 00055c63 bgez a0,62 <copyinstr1+0x62> - for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ 4e: 04a1 addi s1,s1,8 50: ff3496e3 bne s1,s3,3c <copyinstr1+0x3c> - printf("open(%p) returned %d, not -1\n", (void*)addr, fd); - exit(1); - } - } -} 54: 60e6 ld ra,88(sp) 56: 6446 ld s0,80(sp) 58: 64a6 ld s1,72(sp) @@ -60,97 +40,72 @@ copyinstr1(char *s) 5c: 79e2 ld s3,56(sp) 5e: 6125 addi sp,sp,96 60: 8082 ret - printf("open(%p) returned %d, not -1\n", (void*)addr, fd); 62: 862a mv a2,a0 64: 85ca mv a1,s2 66: 00005517 auipc a0,0x5 6a: 00a50513 addi a0,a0,10 # 5070 <malloc+0x106> 6e: 649040ef jal 4eb6 <printf> - exit(1); 72: 4505 li a0,1 74: 213040ef jal 4a86 <exit> 0000000000000078 <bsstest>: -void -bsstest(char *s) -{ - int i; - - for(i = 0; i < sizeof(uninit); i++){ 78: 0000a797 auipc a5,0xa 7c: 4f078793 addi a5,a5,1264 # a568 <uninit> 80: 0000d697 auipc a3,0xd 84: bf868693 addi a3,a3,-1032 # cc78 <buf> - if(uninit[i] != '\0'){ 88: 0007c703 lbu a4,0(a5) 8c: e709 bnez a4,96 <bsstest+0x1e> - for(i = 0; i < sizeof(uninit); i++){ 8e: 0785 addi a5,a5,1 90: fed79ce3 bne a5,a3,88 <bsstest+0x10> 94: 8082 ret -{ 96: 1141 addi sp,sp,-16 98: e406 sd ra,8(sp) 9a: e022 sd s0,0(sp) 9c: 0800 addi s0,sp,16 - printf("%s: bss test failed\n", s); 9e: 85aa mv a1,a0 a0: 00005517 auipc a0,0x5 a4: ff050513 addi a0,a0,-16 # 5090 <malloc+0x126> a8: 60f040ef jal 4eb6 <printf> - exit(1); ac: 4505 li a0,1 ae: 1d9040ef jal 4a86 <exit> 00000000000000b2 <opentest>: -{ b2: 1101 addi sp,sp,-32 b4: ec06 sd ra,24(sp) b6: e822 sd s0,16(sp) b8: e426 sd s1,8(sp) ba: 1000 addi s0,sp,32 bc: 84aa mv s1,a0 - fd = open("echo", 0); be: 4581 li a1,0 c0: 00005517 auipc a0,0x5 c4: fe850513 addi a0,a0,-24 # 50a8 <malloc+0x13e> c8: 1ff040ef jal 4ac6 <open> - if(fd < 0){ cc: 02054263 bltz a0,f0 <opentest+0x3e> - close(fd); d0: 1df040ef jal 4aae <close> - fd = open("doesnotexist", 0); d4: 4581 li a1,0 d6: 00005517 auipc a0,0x5 da: ff250513 addi a0,a0,-14 # 50c8 <malloc+0x15e> de: 1e9040ef jal 4ac6 <open> - if(fd >= 0){ e2: 02055163 bgez a0,104 <opentest+0x52> -} e6: 60e2 ld ra,24(sp) e8: 6442 ld s0,16(sp) ea: 64a2 ld s1,8(sp) ec: 6105 addi sp,sp,32 ee: 8082 ret - printf("%s: open echo failed!\n", s); f0: 85a6 mv a1,s1 f2: 00005517 auipc a0,0x5 f6: fbe50513 addi a0,a0,-66 # 50b0 <malloc+0x146> fa: 5bd040ef jal 4eb6 <printf> - exit(1); fe: 4505 li a0,1 100: 187040ef jal 4a86 <exit> - printf("%s: open doesnotexist succeeded!\n", s); 104: 85a6 mv a1,s1 106: 00005517 auipc a0,0x5 10a: fd250513 addi a0,a0,-46 # 50d8 <malloc+0x16e> 10e: 5a9040ef jal 4eb6 <printf> - exit(1); 112: 4505 li a0,1 114: 173040ef jal 4a86 <exit> 0000000000000118 <truncate2>: -{ 118: 7179 addi sp,sp,-48 11a: f406 sd ra,40(sp) 11c: f022 sd s0,32(sp) @@ -159,47 +114,37 @@ bsstest(char *s) 122: e44e sd s3,8(sp) 124: 1800 addi s0,sp,48 126: 89aa mv s3,a0 - unlink("truncfile"); 128: 00005517 auipc a0,0x5 12c: fd850513 addi a0,a0,-40 # 5100 <malloc+0x196> 130: 1a7040ef jal 4ad6 <unlink> - int fd1 = open("truncfile", O_CREATE|O_TRUNC|O_WRONLY); 134: 60100593 li a1,1537 138: 00005517 auipc a0,0x5 13c: fc850513 addi a0,a0,-56 # 5100 <malloc+0x196> 140: 187040ef jal 4ac6 <open> 144: 84aa mv s1,a0 - write(fd1, "abcd", 4); 146: 4611 li a2,4 148: 00005597 auipc a1,0x5 14c: fc858593 addi a1,a1,-56 # 5110 <malloc+0x1a6> 150: 157040ef jal 4aa6 <write> - int fd2 = open("truncfile", O_TRUNC|O_WRONLY); 154: 40100593 li a1,1025 158: 00005517 auipc a0,0x5 15c: fa850513 addi a0,a0,-88 # 5100 <malloc+0x196> 160: 167040ef jal 4ac6 <open> 164: 892a mv s2,a0 - int n = write(fd1, "x", 1); 166: 4605 li a2,1 168: 00005597 auipc a1,0x5 16c: fb058593 addi a1,a1,-80 # 5118 <malloc+0x1ae> 170: 8526 mv a0,s1 172: 135040ef jal 4aa6 <write> - if(n != -1){ 176: 57fd li a5,-1 178: 02f51563 bne a0,a5,1a2 <truncate2+0x8a> - unlink("truncfile"); 17c: 00005517 auipc a0,0x5 180: f8450513 addi a0,a0,-124 # 5100 <malloc+0x196> 184: 153040ef jal 4ad6 <unlink> - close(fd1); 188: 8526 mv a0,s1 18a: 125040ef jal 4aae <close> - close(fd2); 18e: 854a mv a0,s2 190: 11f040ef jal 4aae <close> -} 194: 70a2 ld ra,40(sp) 196: 7402 ld s0,32(sp) 198: 64e2 ld s1,24(sp) @@ -207,62 +152,45 @@ bsstest(char *s) 19c: 69a2 ld s3,8(sp) 19e: 6145 addi sp,sp,48 1a0: 8082 ret - printf("%s: write returned %d, expected -1\n", s, n); 1a2: 862a mv a2,a0 1a4: 85ce mv a1,s3 1a6: 00005517 auipc a0,0x5 1aa: f7a50513 addi a0,a0,-134 # 5120 <malloc+0x1b6> 1ae: 509040ef jal 4eb6 <printf> - exit(1); 1b2: 4505 li a0,1 1b4: 0d3040ef jal 4a86 <exit> 00000000000001b8 <createtest>: -{ 1b8: 7179 addi sp,sp,-48 1ba: f406 sd ra,40(sp) 1bc: f022 sd s0,32(sp) 1be: ec26 sd s1,24(sp) 1c0: e84a sd s2,16(sp) 1c2: 1800 addi s0,sp,48 - name[0] = 'a'; 1c4: 06100793 li a5,97 1c8: fcf40c23 sb a5,-40(s0) - name[2] = '\0'; 1cc: fc040d23 sb zero,-38(s0) 1d0: 03000493 li s1,48 - for(i = 0; i < N; i++){ 1d4: 06400913 li s2,100 - name[1] = '0' + i; 1d8: fc940ca3 sb s1,-39(s0) - fd = open(name, O_CREATE|O_RDWR); 1dc: 20200593 li a1,514 1e0: fd840513 addi a0,s0,-40 1e4: 0e3040ef jal 4ac6 <open> - close(fd); 1e8: 0c7040ef jal 4aae <close> - for(i = 0; i < N; i++){ 1ec: 2485 addiw s1,s1,1 1ee: 0ff4f493 zext.b s1,s1 1f2: ff2493e3 bne s1,s2,1d8 <createtest+0x20> - name[0] = 'a'; 1f6: 06100793 li a5,97 1fa: fcf40c23 sb a5,-40(s0) - name[2] = '\0'; 1fe: fc040d23 sb zero,-38(s0) 202: 03000493 li s1,48 - for(i = 0; i < N; i++){ 206: 06400913 li s2,100 - name[1] = '0' + i; 20a: fc940ca3 sb s1,-39(s0) - unlink(name); 20e: fd840513 addi a0,s0,-40 212: 0c5040ef jal 4ad6 <unlink> - for(i = 0; i < N; i++){ 216: 2485 addiw s1,s1,1 218: 0ff4f493 zext.b s1,s1 21c: ff2497e3 bne s1,s2,20a <createtest+0x52> -} 220: 70a2 ld ra,40(sp) 222: 7402 ld s0,32(sp) 224: 64e2 ld s1,24(sp) @@ -271,7 +199,6 @@ bsstest(char *s) 22a: 8082 ret 000000000000022c <bigwrite>: -{ 22c: 715d addi sp,sp,-80 22e: e486 sd ra,72(sp) 230: e0a2 sd s0,64(sp) @@ -284,52 +211,37 @@ bsstest(char *s) 23e: e45e sd s7,8(sp) 240: 0880 addi s0,sp,80 242: 8baa mv s7,a0 - unlink("bigwrite"); 244: 00005517 auipc a0,0x5 248: f0450513 addi a0,a0,-252 # 5148 <malloc+0x1de> 24c: 08b040ef jal 4ad6 <unlink> - for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ 250: 1f300493 li s1,499 - fd = open("bigwrite", O_CREATE | O_RDWR); 254: 00005a97 auipc s5,0x5 258: ef4a8a93 addi s5,s5,-268 # 5148 <malloc+0x1de> - int cc = write(fd, buf, sz); 25c: 0000da17 auipc s4,0xd 260: a1ca0a13 addi s4,s4,-1508 # cc78 <buf> - for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ 264: 6b0d lui s6,0x3 266: 1c9b0b13 addi s6,s6,457 # 31c9 <subdir+0x5e7> - fd = open("bigwrite", O_CREATE | O_RDWR); 26a: 20200593 li a1,514 26e: 8556 mv a0,s5 270: 057040ef jal 4ac6 <open> 274: 892a mv s2,a0 - if(fd < 0){ 276: 04054563 bltz a0,2c0 <bigwrite+0x94> - int cc = write(fd, buf, sz); 27a: 8626 mv a2,s1 27c: 85d2 mv a1,s4 27e: 029040ef jal 4aa6 <write> 282: 89aa mv s3,a0 - if(cc != sz){ 284: 04a49863 bne s1,a0,2d4 <bigwrite+0xa8> - int cc = write(fd, buf, sz); 288: 8626 mv a2,s1 28a: 85d2 mv a1,s4 28c: 854a mv a0,s2 28e: 019040ef jal 4aa6 <write> - if(cc != sz){ 292: 04951263 bne a0,s1,2d6 <bigwrite+0xaa> - close(fd); 296: 854a mv a0,s2 298: 017040ef jal 4aae <close> - unlink("bigwrite"); 29c: 8556 mv a0,s5 29e: 039040ef jal 4ad6 <unlink> - for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ 2a2: 1d74849b addiw s1,s1,471 2a6: fd6492e3 bne s1,s6,26a <bigwrite+0x3e> -} 2aa: 60a6 ld ra,72(sp) 2ac: 6406 ld s0,64(sp) 2ae: 74e2 ld s1,56(sp) @@ -341,34 +253,23 @@ bsstest(char *s) 2ba: 6ba2 ld s7,8(sp) 2bc: 6161 addi sp,sp,80 2be: 8082 ret - printf("%s: cannot create bigwrite\n", s); 2c0: 85de mv a1,s7 2c2: 00005517 auipc a0,0x5 2c6: e9650513 addi a0,a0,-362 # 5158 <malloc+0x1ee> 2ca: 3ed040ef jal 4eb6 <printf> - exit(1); 2ce: 4505 li a0,1 2d0: 7b6040ef jal 4a86 <exit> - if(cc != sz){ 2d4: 89a6 mv s3,s1 - printf("%s: write(%d) ret %d\n", s, sz, cc); 2d6: 86aa mv a3,a0 2d8: 864e mv a2,s3 2da: 85de mv a1,s7 2dc: 00005517 auipc a0,0x5 2e0: e9c50513 addi a0,a0,-356 # 5178 <malloc+0x20e> 2e4: 3d3040ef jal 4eb6 <printf> - exit(1); 2e8: 4505 li a0,1 2ea: 79c040ef jal 4a86 <exit> 00000000000002ee <badwrite>: -// file is deleted? if the kernel has this bug, it will panic: balloc: -// out of blocks. assumed_free may need to be raised to be more than -// the number of free blocks. this test takes a long time. -void -badwrite(char *s) -{ 2ee: 7179 addi sp,sp,-48 2f0: f406 sd ra,40(sp) 2f2: f022 sd s0,32(sp) @@ -377,105 +278,64 @@ badwrite(char *s) 2f8: e44e sd s3,8(sp) 2fa: e052 sd s4,0(sp) 2fc: 1800 addi s0,sp,48 - int assumed_free = 600; - - unlink("junk"); 2fe: 00005517 auipc a0,0x5 302: e9250513 addi a0,a0,-366 # 5190 <malloc+0x226> 306: 7d0040ef jal 4ad6 <unlink> 30a: 25800913 li s2,600 - for(int i = 0; i < assumed_free; i++){ - int fd = open("junk", O_CREATE|O_WRONLY); 30e: 00005997 auipc s3,0x5 312: e8298993 addi s3,s3,-382 # 5190 <malloc+0x226> - if(fd < 0){ - printf("open junk failed\n"); - exit(1); - } - write(fd, (char*)0xffffffffffL, 1); 316: 5a7d li s4,-1 318: 018a5a13 srli s4,s4,0x18 - int fd = open("junk", O_CREATE|O_WRONLY); 31c: 20100593 li a1,513 320: 854e mv a0,s3 322: 7a4040ef jal 4ac6 <open> 326: 84aa mv s1,a0 - if(fd < 0){ 328: 04054d63 bltz a0,382 <badwrite+0x94> - write(fd, (char*)0xffffffffffL, 1); 32c: 4605 li a2,1 32e: 85d2 mv a1,s4 330: 776040ef jal 4aa6 <write> - close(fd); 334: 8526 mv a0,s1 336: 778040ef jal 4aae <close> - unlink("junk"); 33a: 854e mv a0,s3 33c: 79a040ef jal 4ad6 <unlink> - for(int i = 0; i < assumed_free; i++){ 340: 397d addiw s2,s2,-1 342: fc091de3 bnez s2,31c <badwrite+0x2e> - } - - int fd = open("junk", O_CREATE|O_WRONLY); 346: 20100593 li a1,513 34a: 00005517 auipc a0,0x5 34e: e4650513 addi a0,a0,-442 # 5190 <malloc+0x226> 352: 774040ef jal 4ac6 <open> 356: 84aa mv s1,a0 - if(fd < 0){ 358: 02054e63 bltz a0,394 <badwrite+0xa6> - printf("open junk failed\n"); - exit(1); - } - if(write(fd, "x", 1) != 1){ 35c: 4605 li a2,1 35e: 00005597 auipc a1,0x5 362: dba58593 addi a1,a1,-582 # 5118 <malloc+0x1ae> 366: 740040ef jal 4aa6 <write> 36a: 4785 li a5,1 36c: 02f50d63 beq a0,a5,3a6 <badwrite+0xb8> - printf("write failed\n"); 370: 00005517 auipc a0,0x5 374: e4050513 addi a0,a0,-448 # 51b0 <malloc+0x246> 378: 33f040ef jal 4eb6 <printf> - exit(1); 37c: 4505 li a0,1 37e: 708040ef jal 4a86 <exit> - printf("open junk failed\n"); 382: 00005517 auipc a0,0x5 386: e1650513 addi a0,a0,-490 # 5198 <malloc+0x22e> 38a: 32d040ef jal 4eb6 <printf> - exit(1); 38e: 4505 li a0,1 390: 6f6040ef jal 4a86 <exit> - printf("open junk failed\n"); 394: 00005517 auipc a0,0x5 398: e0450513 addi a0,a0,-508 # 5198 <malloc+0x22e> 39c: 31b040ef jal 4eb6 <printf> - exit(1); 3a0: 4505 li a0,1 3a2: 6e4040ef jal 4a86 <exit> - } - close(fd); 3a6: 8526 mv a0,s1 3a8: 706040ef jal 4aae <close> - unlink("junk"); 3ac: 00005517 auipc a0,0x5 3b0: de450513 addi a0,a0,-540 # 5190 <malloc+0x226> 3b4: 722040ef jal 4ad6 <unlink> - - exit(0); 3b8: 4501 li a0,0 3ba: 6cc040ef jal 4a86 <exit> 00000000000003be <outofinodes>: - } -} - -void -outofinodes(char *s) -{ 3be: 715d addi sp,sp,-80 3c0: e486 sd ra,72(sp) 3c2: e0a2 sd s0,64(sp) @@ -483,84 +343,51 @@ outofinodes(char *s) 3c6: f84a sd s2,48(sp) 3c8: f44e sd s3,40(sp) 3ca: 0880 addi s0,sp,80 - int nzz = 32*32; - for(int i = 0; i < nzz; i++){ 3cc: 4481 li s1,0 - char name[32]; - name[0] = 'z'; 3ce: 07a00913 li s2,122 - for(int i = 0; i < nzz; i++){ 3d2: 40000993 li s3,1024 - name[0] = 'z'; 3d6: fb240823 sb s2,-80(s0) - name[1] = 'z'; 3da: fb2408a3 sb s2,-79(s0) - name[2] = '0' + (i / 32); 3de: 41f4d71b sraiw a4,s1,0x1f 3e2: 01b7571b srliw a4,a4,0x1b 3e6: 009707bb addw a5,a4,s1 3ea: 4057d69b sraiw a3,a5,0x5 3ee: 0306869b addiw a3,a3,48 3f2: fad40923 sb a3,-78(s0) - name[3] = '0' + (i % 32); 3f6: 8bfd andi a5,a5,31 3f8: 9f99 subw a5,a5,a4 3fa: 0307879b addiw a5,a5,48 3fe: faf409a3 sb a5,-77(s0) - name[4] = '\0'; 402: fa040a23 sb zero,-76(s0) - unlink(name); 406: fb040513 addi a0,s0,-80 40a: 6cc040ef jal 4ad6 <unlink> - int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); 40e: 60200593 li a1,1538 412: fb040513 addi a0,s0,-80 416: 6b0040ef jal 4ac6 <open> - if(fd < 0){ 41a: 00054763 bltz a0,428 <outofinodes+0x6a> - // failure is eventually expected. - break; - } - close(fd); 41e: 690040ef jal 4aae <close> - for(int i = 0; i < nzz; i++){ 422: 2485 addiw s1,s1,1 424: fb3499e3 bne s1,s3,3d6 <outofinodes+0x18> 428: 4481 li s1,0 - } - - for(int i = 0; i < nzz; i++){ - char name[32]; - name[0] = 'z'; 42a: 07a00913 li s2,122 - for(int i = 0; i < nzz; i++){ 42e: 40000993 li s3,1024 - name[0] = 'z'; 432: fb240823 sb s2,-80(s0) - name[1] = 'z'; 436: fb2408a3 sb s2,-79(s0) - name[2] = '0' + (i / 32); 43a: 41f4d71b sraiw a4,s1,0x1f 43e: 01b7571b srliw a4,a4,0x1b 442: 009707bb addw a5,a4,s1 446: 4057d69b sraiw a3,a5,0x5 44a: 0306869b addiw a3,a3,48 44e: fad40923 sb a3,-78(s0) - name[3] = '0' + (i % 32); 452: 8bfd andi a5,a5,31 454: 9f99 subw a5,a5,a4 456: 0307879b addiw a5,a5,48 45a: faf409a3 sb a5,-77(s0) - name[4] = '\0'; 45e: fa040a23 sb zero,-76(s0) - unlink(name); 462: fb040513 addi a0,s0,-80 466: 670040ef jal 4ad6 <unlink> - for(int i = 0; i < nzz; i++){ 46a: 2485 addiw s1,s1,1 46c: fd3493e3 bne s1,s3,432 <outofinodes+0x74> - } -} 470: 60a6 ld ra,72(sp) 472: 6406 ld s0,64(sp) 474: 74e2 ld s1,56(sp) @@ -570,7 +397,6 @@ outofinodes(char *s) 47c: 8082 ret 000000000000047e <copyin>: -{ 47e: 7159 addi sp,sp,-112 480: f486 sd ra,104(sp) 482: f0a2 sd s0,96(sp) @@ -580,7 +406,6 @@ outofinodes(char *s) 48a: e0d2 sd s4,64(sp) 48c: fc56 sd s5,56(sp) 48e: 1880 addi s0,sp,112 - uint64 addrs[] = { 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, 490: 00007797 auipc a5,0x7 494: f7878793 addi a5,a5,-136 # 7408 <malloc+0x249e> 498: 638c ld a1,0(a5) @@ -593,61 +418,43 @@ outofinodes(char *s) 4aa: fad43423 sd a3,-88(s0) 4ae: fae43823 sd a4,-80(s0) 4b2: faf43c23 sd a5,-72(s0) - for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ 4b6: f9840913 addi s2,s0,-104 4ba: fc040a93 addi s5,s0,-64 - int fd = open("copyin1", O_CREATE|O_WRONLY); 4be: 00005a17 auipc s4,0x5 4c2: d02a0a13 addi s4,s4,-766 # 51c0 <malloc+0x256> - uint64 addr = addrs[ai]; 4c6: 00093983 ld s3,0(s2) - int fd = open("copyin1", O_CREATE|O_WRONLY); 4ca: 20100593 li a1,513 4ce: 8552 mv a0,s4 4d0: 5f6040ef jal 4ac6 <open> 4d4: 84aa mv s1,a0 - if(fd < 0){ 4d6: 06054763 bltz a0,544 <copyin+0xc6> - int n = write(fd, (void*)addr, 8192); 4da: 6609 lui a2,0x2 4dc: 85ce mv a1,s3 4de: 5c8040ef jal 4aa6 <write> - if(n >= 0){ 4e2: 06055a63 bgez a0,556 <copyin+0xd8> - close(fd); 4e6: 8526 mv a0,s1 4e8: 5c6040ef jal 4aae <close> - unlink("copyin1"); 4ec: 8552 mv a0,s4 4ee: 5e8040ef jal 4ad6 <unlink> - n = write(1, (char*)addr, 8192); 4f2: 6609 lui a2,0x2 4f4: 85ce mv a1,s3 4f6: 4505 li a0,1 4f8: 5ae040ef jal 4aa6 <write> - if(n > 0){ 4fc: 06a04863 bgtz a0,56c <copyin+0xee> - if(pipe(fds) < 0){ 500: f9040513 addi a0,s0,-112 504: 592040ef jal 4a96 <pipe> 508: 06054d63 bltz a0,582 <copyin+0x104> - n = write(fds[1], (char*)addr, 8192); 50c: 6609 lui a2,0x2 50e: 85ce mv a1,s3 510: f9442503 lw a0,-108(s0) 514: 592040ef jal 4aa6 <write> - if(n > 0){ 518: 06a04e63 bgtz a0,594 <copyin+0x116> - close(fds[0]); 51c: f9042503 lw a0,-112(s0) 520: 58e040ef jal 4aae <close> - close(fds[1]); 524: f9442503 lw a0,-108(s0) 528: 586040ef jal 4aae <close> - for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ 52c: 0921 addi s2,s2,8 52e: f9591ce3 bne s2,s5,4c6 <copyin+0x48> -} 532: 70a6 ld ra,104(sp) 534: 7406 ld s0,96(sp) 536: 64e6 ld s1,88(sp) @@ -657,50 +464,39 @@ outofinodes(char *s) 53e: 7ae2 ld s5,56(sp) 540: 6165 addi sp,sp,112 542: 8082 ret - printf("open(copyin1) failed\n"); 544: 00005517 auipc a0,0x5 548: c8450513 addi a0,a0,-892 # 51c8 <malloc+0x25e> 54c: 16b040ef jal 4eb6 <printf> - exit(1); 550: 4505 li a0,1 552: 534040ef jal 4a86 <exit> - printf("write(fd, %p, 8192) returned %d, not -1\n", (void*)addr, n); 556: 862a mv a2,a0 558: 85ce mv a1,s3 55a: 00005517 auipc a0,0x5 55e: c8650513 addi a0,a0,-890 # 51e0 <malloc+0x276> 562: 155040ef jal 4eb6 <printf> - exit(1); 566: 4505 li a0,1 568: 51e040ef jal 4a86 <exit> - printf("write(1, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); 56c: 862a mv a2,a0 56e: 85ce mv a1,s3 570: 00005517 auipc a0,0x5 574: ca050513 addi a0,a0,-864 # 5210 <malloc+0x2a6> 578: 13f040ef jal 4eb6 <printf> - exit(1); 57c: 4505 li a0,1 57e: 508040ef jal 4a86 <exit> - printf("pipe() failed\n"); 582: 00005517 auipc a0,0x5 586: cbe50513 addi a0,a0,-834 # 5240 <malloc+0x2d6> 58a: 12d040ef jal 4eb6 <printf> - exit(1); 58e: 4505 li a0,1 590: 4f6040ef jal 4a86 <exit> - printf("write(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); 594: 862a mv a2,a0 596: 85ce mv a1,s3 598: 00005517 auipc a0,0x5 59c: cb850513 addi a0,a0,-840 # 5250 <malloc+0x2e6> 5a0: 117040ef jal 4eb6 <printf> - exit(1); 5a4: 4505 li a0,1 5a6: 4e0040ef jal 4a86 <exit> 00000000000005aa <copyout>: -{ 5aa: 7119 addi sp,sp,-128 5ac: fc86 sd ra,120(sp) 5ae: f8a2 sd s0,112(sp) @@ -711,7 +507,6 @@ outofinodes(char *s) 5b8: e4d6 sd s5,72(sp) 5ba: e0da sd s6,64(sp) 5bc: 0100 addi s0,sp,128 - uint64 addrs[] = { 0LL, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, 5be: 00007797 auipc a5,0x7 5c2: e4a78793 addi a5,a5,-438 # 7408 <malloc+0x249e> 5c6: 7788 ld a0,40(a5) @@ -726,62 +521,44 @@ outofinodes(char *s) 5de: fad43423 sd a3,-88(s0) 5e2: fae43823 sd a4,-80(s0) 5e6: faf43c23 sd a5,-72(s0) - for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ 5ea: f9040913 addi s2,s0,-112 5ee: fc040b13 addi s6,s0,-64 - int fd = open("README", 0); 5f2: 00005a17 auipc s4,0x5 5f6: c8ea0a13 addi s4,s4,-882 # 5280 <malloc+0x316> - n = write(fds[1], "x", 1); 5fa: 00005a97 auipc s5,0x5 5fe: b1ea8a93 addi s5,s5,-1250 # 5118 <malloc+0x1ae> - uint64 addr = addrs[ai]; 602: 00093983 ld s3,0(s2) - int fd = open("README", 0); 606: 4581 li a1,0 608: 8552 mv a0,s4 60a: 4bc040ef jal 4ac6 <open> 60e: 84aa mv s1,a0 - if(fd < 0){ 610: 06054763 bltz a0,67e <copyout+0xd4> - int n = read(fd, (void*)addr, 8192); 614: 6609 lui a2,0x2 616: 85ce mv a1,s3 618: 486040ef jal 4a9e <read> - if(n > 0){ 61c: 06a04a63 bgtz a0,690 <copyout+0xe6> - close(fd); 620: 8526 mv a0,s1 622: 48c040ef jal 4aae <close> - if(pipe(fds) < 0){ 626: f8840513 addi a0,s0,-120 62a: 46c040ef jal 4a96 <pipe> 62e: 06054c63 bltz a0,6a6 <copyout+0xfc> - n = write(fds[1], "x", 1); 632: 4605 li a2,1 634: 85d6 mv a1,s5 636: f8c42503 lw a0,-116(s0) 63a: 46c040ef jal 4aa6 <write> - if(n != 1){ 63e: 4785 li a5,1 640: 06f51c63 bne a0,a5,6b8 <copyout+0x10e> - n = read(fds[0], (void*)addr, 8192); 644: 6609 lui a2,0x2 646: 85ce mv a1,s3 648: f8842503 lw a0,-120(s0) 64c: 452040ef jal 4a9e <read> - if(n > 0){ 650: 06a04d63 bgtz a0,6ca <copyout+0x120> - close(fds[0]); 654: f8842503 lw a0,-120(s0) 658: 456040ef jal 4aae <close> - close(fds[1]); 65c: f8c42503 lw a0,-116(s0) 660: 44e040ef jal 4aae <close> - for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ 664: 0921 addi s2,s2,8 666: f9691ee3 bne s2,s6,602 <copyout+0x58> -} 66a: 70e6 ld ra,120(sp) 66c: 7446 ld s0,112(sp) 66e: 74a6 ld s1,104(sp) @@ -792,48 +569,37 @@ outofinodes(char *s) 678: 6b06 ld s6,64(sp) 67a: 6109 addi sp,sp,128 67c: 8082 ret - printf("open(README) failed\n"); 67e: 00005517 auipc a0,0x5 682: c0a50513 addi a0,a0,-1014 # 5288 <malloc+0x31e> 686: 031040ef jal 4eb6 <printf> - exit(1); 68a: 4505 li a0,1 68c: 3fa040ef jal 4a86 <exit> - printf("read(fd, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); 690: 862a mv a2,a0 692: 85ce mv a1,s3 694: 00005517 auipc a0,0x5 698: c0c50513 addi a0,a0,-1012 # 52a0 <malloc+0x336> 69c: 01b040ef jal 4eb6 <printf> - exit(1); 6a0: 4505 li a0,1 6a2: 3e4040ef jal 4a86 <exit> - printf("pipe() failed\n"); 6a6: 00005517 auipc a0,0x5 6aa: b9a50513 addi a0,a0,-1126 # 5240 <malloc+0x2d6> 6ae: 009040ef jal 4eb6 <printf> - exit(1); 6b2: 4505 li a0,1 6b4: 3d2040ef jal 4a86 <exit> - printf("pipe write failed\n"); 6b8: 00005517 auipc a0,0x5 6bc: c1850513 addi a0,a0,-1000 # 52d0 <malloc+0x366> 6c0: 7f6040ef jal 4eb6 <printf> - exit(1); 6c4: 4505 li a0,1 6c6: 3c0040ef jal 4a86 <exit> - printf("read(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); 6ca: 862a mv a2,a0 6cc: 85ce mv a1,s3 6ce: 00005517 auipc a0,0x5 6d2: c1a50513 addi a0,a0,-998 # 52e8 <malloc+0x37e> 6d6: 7e0040ef jal 4eb6 <printf> - exit(1); 6da: 4505 li a0,1 6dc: 3aa040ef jal 4a86 <exit> 00000000000006e0 <truncate1>: -{ 6e0: 711d addi sp,sp,-96 6e2: ec86 sd ra,88(sp) 6e4: e8a2 sd s0,80(sp) @@ -844,100 +610,77 @@ outofinodes(char *s) 6ee: f456 sd s5,40(sp) 6f0: 1080 addi s0,sp,96 6f2: 8aaa mv s5,a0 - unlink("truncfile"); 6f4: 00005517 auipc a0,0x5 6f8: a0c50513 addi a0,a0,-1524 # 5100 <malloc+0x196> 6fc: 3da040ef jal 4ad6 <unlink> - int fd1 = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); 700: 60100593 li a1,1537 704: 00005517 auipc a0,0x5 708: 9fc50513 addi a0,a0,-1540 # 5100 <malloc+0x196> 70c: 3ba040ef jal 4ac6 <open> 710: 84aa mv s1,a0 - write(fd1, "abcd", 4); 712: 4611 li a2,4 714: 00005597 auipc a1,0x5 718: 9fc58593 addi a1,a1,-1540 # 5110 <malloc+0x1a6> 71c: 38a040ef jal 4aa6 <write> - close(fd1); 720: 8526 mv a0,s1 722: 38c040ef jal 4aae <close> - int fd2 = open("truncfile", O_RDONLY); 726: 4581 li a1,0 728: 00005517 auipc a0,0x5 72c: 9d850513 addi a0,a0,-1576 # 5100 <malloc+0x196> 730: 396040ef jal 4ac6 <open> 734: 84aa mv s1,a0 - int n = read(fd2, buf, sizeof(buf)); 736: 02000613 li a2,32 73a: fa040593 addi a1,s0,-96 73e: 360040ef jal 4a9e <read> - if(n != 4){ 742: 4791 li a5,4 744: 0af51863 bne a0,a5,7f4 <truncate1+0x114> - fd1 = open("truncfile", O_WRONLY|O_TRUNC); 748: 40100593 li a1,1025 74c: 00005517 auipc a0,0x5 750: 9b450513 addi a0,a0,-1612 # 5100 <malloc+0x196> 754: 372040ef jal 4ac6 <open> 758: 89aa mv s3,a0 - int fd3 = open("truncfile", O_RDONLY); 75a: 4581 li a1,0 75c: 00005517 auipc a0,0x5 760: 9a450513 addi a0,a0,-1628 # 5100 <malloc+0x196> 764: 362040ef jal 4ac6 <open> 768: 892a mv s2,a0 - n = read(fd3, buf, sizeof(buf)); 76a: 02000613 li a2,32 76e: fa040593 addi a1,s0,-96 772: 32c040ef jal 4a9e <read> 776: 8a2a mv s4,a0 - if(n != 0){ 778: e949 bnez a0,80a <truncate1+0x12a> - n = read(fd2, buf, sizeof(buf)); 77a: 02000613 li a2,32 77e: fa040593 addi a1,s0,-96 782: 8526 mv a0,s1 784: 31a040ef jal 4a9e <read> 788: 8a2a mv s4,a0 - if(n != 0){ 78a: e155 bnez a0,82e <truncate1+0x14e> - write(fd1, "abcdef", 6); 78c: 4619 li a2,6 78e: 00005597 auipc a1,0x5 792: bea58593 addi a1,a1,-1046 # 5378 <malloc+0x40e> 796: 854e mv a0,s3 798: 30e040ef jal 4aa6 <write> - n = read(fd3, buf, sizeof(buf)); 79c: 02000613 li a2,32 7a0: fa040593 addi a1,s0,-96 7a4: 854a mv a0,s2 7a6: 2f8040ef jal 4a9e <read> - if(n != 6){ 7aa: 4799 li a5,6 7ac: 0af51363 bne a0,a5,852 <truncate1+0x172> - n = read(fd2, buf, sizeof(buf)); 7b0: 02000613 li a2,32 7b4: fa040593 addi a1,s0,-96 7b8: 8526 mv a0,s1 7ba: 2e4040ef jal 4a9e <read> - if(n != 2){ 7be: 4789 li a5,2 7c0: 0af51463 bne a0,a5,868 <truncate1+0x188> - unlink("truncfile"); 7c4: 00005517 auipc a0,0x5 7c8: 93c50513 addi a0,a0,-1732 # 5100 <malloc+0x196> 7cc: 30a040ef jal 4ad6 <unlink> - close(fd1); 7d0: 854e mv a0,s3 7d2: 2dc040ef jal 4aae <close> - close(fd2); 7d6: 8526 mv a0,s1 7d8: 2d6040ef jal 4aae <close> - close(fd3); 7dc: 854a mv a0,s2 7de: 2d0040ef jal 4aae <close> -} 7e2: 60e6 ld ra,88(sp) 7e4: 6446 ld s0,80(sp) 7e6: 64a6 ld s1,72(sp) @@ -947,64 +690,51 @@ outofinodes(char *s) 7ee: 7aa2 ld s5,40(sp) 7f0: 6125 addi sp,sp,96 7f2: 8082 ret - printf("%s: read %d bytes, wanted 4\n", s, n); 7f4: 862a mv a2,a0 7f6: 85d6 mv a1,s5 7f8: 00005517 auipc a0,0x5 7fc: b2050513 addi a0,a0,-1248 # 5318 <malloc+0x3ae> 800: 6b6040ef jal 4eb6 <printf> - exit(1); 804: 4505 li a0,1 806: 280040ef jal 4a86 <exit> - printf("aaa fd3=%d\n", fd3); 80a: 85ca mv a1,s2 80c: 00005517 auipc a0,0x5 810: b2c50513 addi a0,a0,-1236 # 5338 <malloc+0x3ce> 814: 6a2040ef jal 4eb6 <printf> - printf("%s: read %d bytes, wanted 0\n", s, n); 818: 8652 mv a2,s4 81a: 85d6 mv a1,s5 81c: 00005517 auipc a0,0x5 820: b2c50513 addi a0,a0,-1236 # 5348 <malloc+0x3de> 824: 692040ef jal 4eb6 <printf> - exit(1); 828: 4505 li a0,1 82a: 25c040ef jal 4a86 <exit> - printf("bbb fd2=%d\n", fd2); 82e: 85a6 mv a1,s1 830: 00005517 auipc a0,0x5 834: b3850513 addi a0,a0,-1224 # 5368 <malloc+0x3fe> 838: 67e040ef jal 4eb6 <printf> - printf("%s: read %d bytes, wanted 0\n", s, n); 83c: 8652 mv a2,s4 83e: 85d6 mv a1,s5 840: 00005517 auipc a0,0x5 844: b0850513 addi a0,a0,-1272 # 5348 <malloc+0x3de> 848: 66e040ef jal 4eb6 <printf> - exit(1); 84c: 4505 li a0,1 84e: 238040ef jal 4a86 <exit> - printf("%s: read %d bytes, wanted 6\n", s, n); 852: 862a mv a2,a0 854: 85d6 mv a1,s5 856: 00005517 auipc a0,0x5 85a: b2a50513 addi a0,a0,-1238 # 5380 <malloc+0x416> 85e: 658040ef jal 4eb6 <printf> - exit(1); 862: 4505 li a0,1 864: 222040ef jal 4a86 <exit> - printf("%s: read %d bytes, wanted 2\n", s, n); 868: 862a mv a2,a0 86a: 85d6 mv a1,s5 86c: 00005517 auipc a0,0x5 870: b3450513 addi a0,a0,-1228 # 53a0 <malloc+0x436> 874: 642040ef jal 4eb6 <printf> - exit(1); 878: 4505 li a0,1 87a: 20c040ef jal 4a86 <exit> 000000000000087e <writetest>: -{ 87e: 7139 addi sp,sp,-64 880: fc06 sd ra,56(sp) 882: f822 sd s0,48(sp) @@ -1016,68 +746,52 @@ outofinodes(char *s) 88e: e05a sd s6,0(sp) 890: 0080 addi s0,sp,64 892: 8b2a mv s6,a0 - fd = open("small", O_CREATE|O_RDWR); 894: 20200593 li a1,514 898: 00005517 auipc a0,0x5 89c: b2850513 addi a0,a0,-1240 # 53c0 <malloc+0x456> 8a0: 226040ef jal 4ac6 <open> - if(fd < 0){ 8a4: 08054f63 bltz a0,942 <writetest+0xc4> 8a8: 892a mv s2,a0 8aa: 4481 li s1,0 - if(write(fd, "aaaaaaaaaa", SZ) != SZ){ 8ac: 00005997 auipc s3,0x5 8b0: b3c98993 addi s3,s3,-1220 # 53e8 <malloc+0x47e> - if(write(fd, "bbbbbbbbbb", SZ) != SZ){ 8b4: 00005a97 auipc s5,0x5 8b8: b6ca8a93 addi s5,s5,-1172 # 5420 <malloc+0x4b6> - for(i = 0; i < N; i++){ 8bc: 06400a13 li s4,100 - if(write(fd, "aaaaaaaaaa", SZ) != SZ){ 8c0: 4629 li a2,10 8c2: 85ce mv a1,s3 8c4: 854a mv a0,s2 8c6: 1e0040ef jal 4aa6 <write> 8ca: 47a9 li a5,10 8cc: 08f51563 bne a0,a5,956 <writetest+0xd8> - if(write(fd, "bbbbbbbbbb", SZ) != SZ){ 8d0: 4629 li a2,10 8d2: 85d6 mv a1,s5 8d4: 854a mv a0,s2 8d6: 1d0040ef jal 4aa6 <write> 8da: 47a9 li a5,10 8dc: 08f51863 bne a0,a5,96c <writetest+0xee> - for(i = 0; i < N; i++){ 8e0: 2485 addiw s1,s1,1 8e2: fd449fe3 bne s1,s4,8c0 <writetest+0x42> - close(fd); 8e6: 854a mv a0,s2 8e8: 1c6040ef jal 4aae <close> - fd = open("small", O_RDONLY); 8ec: 4581 li a1,0 8ee: 00005517 auipc a0,0x5 8f2: ad250513 addi a0,a0,-1326 # 53c0 <malloc+0x456> 8f6: 1d0040ef jal 4ac6 <open> 8fa: 84aa mv s1,a0 - if(fd < 0){ 8fc: 08054363 bltz a0,982 <writetest+0x104> - i = read(fd, buf, N*SZ*2); 900: 7d000613 li a2,2000 904: 0000c597 auipc a1,0xc 908: 37458593 addi a1,a1,884 # cc78 <buf> 90c: 192040ef jal 4a9e <read> - if(i != N*SZ*2){ 910: 7d000793 li a5,2000 914: 08f51163 bne a0,a5,996 <writetest+0x118> - close(fd); 918: 8526 mv a0,s1 91a: 194040ef jal 4aae <close> - if(unlink("small") < 0){ 91e: 00005517 auipc a0,0x5 922: aa250513 addi a0,a0,-1374 # 53c0 <malloc+0x456> 926: 1b0040ef jal 4ad6 <unlink> 92a: 08054063 bltz a0,9aa <writetest+0x12c> -} 92e: 70e2 ld ra,56(sp) 930: 7442 ld s0,48(sp) 932: 74a2 ld s1,40(sp) @@ -1088,59 +802,46 @@ outofinodes(char *s) 93c: 6b02 ld s6,0(sp) 93e: 6121 addi sp,sp,64 940: 8082 ret - printf("%s: error: creat small failed!\n", s); 942: 85da mv a1,s6 944: 00005517 auipc a0,0x5 948: a8450513 addi a0,a0,-1404 # 53c8 <malloc+0x45e> 94c: 56a040ef jal 4eb6 <printf> - exit(1); 950: 4505 li a0,1 952: 134040ef jal 4a86 <exit> - printf("%s: error: write aa %d new file failed\n", s, i); 956: 8626 mv a2,s1 958: 85da mv a1,s6 95a: 00005517 auipc a0,0x5 95e: a9e50513 addi a0,a0,-1378 # 53f8 <malloc+0x48e> 962: 554040ef jal 4eb6 <printf> - exit(1); 966: 4505 li a0,1 968: 11e040ef jal 4a86 <exit> - printf("%s: error: write bb %d new file failed\n", s, i); 96c: 8626 mv a2,s1 96e: 85da mv a1,s6 970: 00005517 auipc a0,0x5 974: ac050513 addi a0,a0,-1344 # 5430 <malloc+0x4c6> 978: 53e040ef jal 4eb6 <printf> - exit(1); 97c: 4505 li a0,1 97e: 108040ef jal 4a86 <exit> - printf("%s: error: open small failed!\n", s); 982: 85da mv a1,s6 984: 00005517 auipc a0,0x5 988: ad450513 addi a0,a0,-1324 # 5458 <malloc+0x4ee> 98c: 52a040ef jal 4eb6 <printf> - exit(1); 990: 4505 li a0,1 992: 0f4040ef jal 4a86 <exit> - printf("%s: read failed\n", s); 996: 85da mv a1,s6 998: 00005517 auipc a0,0x5 99c: ae050513 addi a0,a0,-1312 # 5478 <malloc+0x50e> 9a0: 516040ef jal 4eb6 <printf> - exit(1); 9a4: 4505 li a0,1 9a6: 0e0040ef jal 4a86 <exit> - printf("%s: unlink small failed\n", s); 9aa: 85da mv a1,s6 9ac: 00005517 auipc a0,0x5 9b0: ae450513 addi a0,a0,-1308 # 5490 <malloc+0x526> 9b4: 502040ef jal 4eb6 <printf> - exit(1); 9b8: 4505 li a0,1 9ba: 0cc040ef jal 4a86 <exit> 00000000000009be <writebig>: -{ 9be: 7139 addi sp,sp,-64 9c0: fc06 sd ra,56(sp) 9c2: f822 sd s0,48(sp) @@ -1151,105 +852,76 @@ outofinodes(char *s) 9cc: e456 sd s5,8(sp) 9ce: 0080 addi s0,sp,64 9d0: 8aaa mv s5,a0 - fd = open("big", O_CREATE|O_RDWR); 9d2: 20200593 li a1,514 9d6: 00005517 auipc a0,0x5 9da: ada50513 addi a0,a0,-1318 # 54b0 <malloc+0x546> 9de: 0e8040ef jal 4ac6 <open> 9e2: 89aa mv s3,a0 - for(i = 0; i < MAXFILE; i++){ 9e4: 4481 li s1,0 - ((int*)buf)[0] = i; 9e6: 0000c917 auipc s2,0xc 9ea: 29290913 addi s2,s2,658 # cc78 <buf> - for(i = 0; i < MAXFILE; i++){ 9ee: 6a41 lui s4,0x10 9f0: 10ba0a13 addi s4,s4,267 # 1010b <base+0x493> - if(fd < 0){ 9f4: 06054463 bltz a0,a5c <writebig+0x9e> - ((int*)buf)[0] = i; 9f8: 00992023 sw s1,0(s2) - if(write(fd, buf, BSIZE) != BSIZE){ 9fc: 40000613 li a2,1024 a00: 85ca mv a1,s2 a02: 854e mv a0,s3 a04: 0a2040ef jal 4aa6 <write> a08: 40000793 li a5,1024 a0c: 06f51263 bne a0,a5,a70 <writebig+0xb2> - for(i = 0; i < MAXFILE; i++){ a10: 2485 addiw s1,s1,1 a12: ff4493e3 bne s1,s4,9f8 <writebig+0x3a> - close(fd); a16: 854e mv a0,s3 a18: 096040ef jal 4aae <close> - fd = open("big", O_RDONLY); a1c: 4581 li a1,0 a1e: 00005517 auipc a0,0x5 a22: a9250513 addi a0,a0,-1390 # 54b0 <malloc+0x546> a26: 0a0040ef jal 4ac6 <open> a2a: 89aa mv s3,a0 - n = 0; a2c: 4481 li s1,0 - i = read(fd, buf, BSIZE); a2e: 0000c917 auipc s2,0xc a32: 24a90913 addi s2,s2,586 # cc78 <buf> - if(fd < 0){ a36: 04054863 bltz a0,a86 <writebig+0xc8> - i = read(fd, buf, BSIZE); a3a: 40000613 li a2,1024 a3e: 85ca mv a1,s2 a40: 854e mv a0,s3 a42: 05c040ef jal 4a9e <read> - if(i == 0){ a46: c931 beqz a0,a9a <writebig+0xdc> - } else if(i != BSIZE){ a48: 40000793 li a5,1024 a4c: 08f51b63 bne a0,a5,ae2 <writebig+0x124> - if(((int*)buf)[0] != n){ a50: 00092683 lw a3,0(s2) a54: 0a969263 bne a3,s1,af8 <writebig+0x13a> - n++; a58: 2485 addiw s1,s1,1 - i = read(fd, buf, BSIZE); a5a: b7c5 j a3a <writebig+0x7c> - printf("%s: error: creat big failed!\n", s); a5c: 85d6 mv a1,s5 a5e: 00005517 auipc a0,0x5 a62: a5a50513 addi a0,a0,-1446 # 54b8 <malloc+0x54e> a66: 450040ef jal 4eb6 <printf> - exit(1); a6a: 4505 li a0,1 a6c: 01a040ef jal 4a86 <exit> - printf("%s: error: write big file failed i=%d\n", s, i); a70: 8626 mv a2,s1 a72: 85d6 mv a1,s5 a74: 00005517 auipc a0,0x5 a78: a6450513 addi a0,a0,-1436 # 54d8 <malloc+0x56e> a7c: 43a040ef jal 4eb6 <printf> - exit(1); a80: 4505 li a0,1 a82: 004040ef jal 4a86 <exit> - printf("%s: error: open big failed!\n", s); a86: 85d6 mv a1,s5 a88: 00005517 auipc a0,0x5 a8c: a7850513 addi a0,a0,-1416 # 5500 <malloc+0x596> a90: 426040ef jal 4eb6 <printf> - exit(1); a94: 4505 li a0,1 a96: 7f1030ef jal 4a86 <exit> - if(n != MAXFILE){ a9a: 67c1 lui a5,0x10 a9c: 10b78793 addi a5,a5,267 # 1010b <base+0x493> aa0: 02f49663 bne s1,a5,acc <writebig+0x10e> - close(fd); aa4: 854e mv a0,s3 aa6: 008040ef jal 4aae <close> - if(unlink("big") < 0){ aaa: 00005517 auipc a0,0x5 aae: a0650513 addi a0,a0,-1530 # 54b0 <malloc+0x546> ab2: 024040ef jal 4ad6 <unlink> ab6: 04054c63 bltz a0,b0e <writebig+0x150> -} aba: 70e2 ld ra,56(sp) abc: 7442 ld s0,48(sp) abe: 74a2 ld s1,40(sp) @@ -1259,44 +931,35 @@ outofinodes(char *s) ac6: 6aa2 ld s5,8(sp) ac8: 6121 addi sp,sp,64 aca: 8082 ret - printf("%s: read only %d blocks from big", s, n); acc: 8626 mv a2,s1 ace: 85d6 mv a1,s5 ad0: 00005517 auipc a0,0x5 ad4: a5050513 addi a0,a0,-1456 # 5520 <malloc+0x5b6> ad8: 3de040ef jal 4eb6 <printf> - exit(1); adc: 4505 li a0,1 ade: 7a9030ef jal 4a86 <exit> - printf("%s: read failed %d\n", s, i); ae2: 862a mv a2,a0 ae4: 85d6 mv a1,s5 ae6: 00005517 auipc a0,0x5 aea: a6250513 addi a0,a0,-1438 # 5548 <malloc+0x5de> aee: 3c8040ef jal 4eb6 <printf> - exit(1); af2: 4505 li a0,1 af4: 793030ef jal 4a86 <exit> - printf("%s: read content of block %d is %d\n", s, af8: 8626 mv a2,s1 afa: 85d6 mv a1,s5 afc: 00005517 auipc a0,0x5 b00: a6450513 addi a0,a0,-1436 # 5560 <malloc+0x5f6> b04: 3b2040ef jal 4eb6 <printf> - exit(1); b08: 4505 li a0,1 b0a: 77d030ef jal 4a86 <exit> - printf("%s: unlink big failed\n", s); b0e: 85d6 mv a1,s5 b10: 00005517 auipc a0,0x5 b14: a7850513 addi a0,a0,-1416 # 5588 <malloc+0x61e> b18: 39e040ef jal 4eb6 <printf> - exit(1); b1c: 4505 li a0,1 b1e: 769030ef jal 4a86 <exit> 0000000000000b22 <unlinkread>: -{ b22: 7179 addi sp,sp,-48 b24: f406 sd ra,40(sp) b26: f022 sd s0,32(sp) @@ -1305,50 +968,39 @@ outofinodes(char *s) b2c: e44e sd s3,8(sp) b2e: 1800 addi s0,sp,48 b30: 89aa mv s3,a0 - fd = open("unlinkread", O_CREATE | O_RDWR); b32: 20200593 li a1,514 b36: 00005517 auipc a0,0x5 b3a: a6a50513 addi a0,a0,-1430 # 55a0 <malloc+0x636> b3e: 789030ef jal 4ac6 <open> - if(fd < 0){ b42: 0a054f63 bltz a0,c00 <unlinkread+0xde> b46: 84aa mv s1,a0 - write(fd, "hello", SZ); b48: 4615 li a2,5 b4a: 00005597 auipc a1,0x5 b4e: a8658593 addi a1,a1,-1402 # 55d0 <malloc+0x666> b52: 755030ef jal 4aa6 <write> - close(fd); b56: 8526 mv a0,s1 b58: 757030ef jal 4aae <close> - fd = open("unlinkread", O_RDWR); b5c: 4589 li a1,2 b5e: 00005517 auipc a0,0x5 b62: a4250513 addi a0,a0,-1470 # 55a0 <malloc+0x636> b66: 761030ef jal 4ac6 <open> b6a: 84aa mv s1,a0 - if(fd < 0){ b6c: 0a054463 bltz a0,c14 <unlinkread+0xf2> - if(unlink("unlinkread") != 0){ b70: 00005517 auipc a0,0x5 b74: a3050513 addi a0,a0,-1488 # 55a0 <malloc+0x636> b78: 75f030ef jal 4ad6 <unlink> b7c: e555 bnez a0,c28 <unlinkread+0x106> - fd1 = open("unlinkread", O_CREATE | O_RDWR); b7e: 20200593 li a1,514 b82: 00005517 auipc a0,0x5 b86: a1e50513 addi a0,a0,-1506 # 55a0 <malloc+0x636> b8a: 73d030ef jal 4ac6 <open> b8e: 892a mv s2,a0 - write(fd1, "yyy", 3); b90: 460d li a2,3 b92: 00005597 auipc a1,0x5 b96: a8658593 addi a1,a1,-1402 # 5618 <malloc+0x6ae> b9a: 70d030ef jal 4aa6 <write> - close(fd1); b9e: 854a mv a0,s2 ba0: 70f030ef jal 4aae <close> - if(read(fd, buf, sizeof(buf)) != SZ){ ba4: 660d lui a2,0x3 ba6: 0000c597 auipc a1,0xc baa: 0d258593 addi a1,a1,210 # cc78 <buf> @@ -1356,12 +1008,10 @@ outofinodes(char *s) bb0: 6ef030ef jal 4a9e <read> bb4: 4795 li a5,5 bb6: 08f51363 bne a0,a5,c3c <unlinkread+0x11a> - if(buf[0] != 'h'){ bba: 0000c717 auipc a4,0xc bbe: 0be74703 lbu a4,190(a4) # cc78 <buf> bc2: 06800793 li a5,104 bc6: 08f71563 bne a4,a5,c50 <unlinkread+0x12e> - if(write(fd, buf, 10) != 10){ bca: 4629 li a2,10 bcc: 0000c597 auipc a1,0xc bd0: 0ac58593 addi a1,a1,172 # cc78 <buf> @@ -1369,14 +1019,11 @@ outofinodes(char *s) bd6: 6d1030ef jal 4aa6 <write> bda: 47a9 li a5,10 bdc: 08f51463 bne a0,a5,c64 <unlinkread+0x142> - close(fd); be0: 8526 mv a0,s1 be2: 6cd030ef jal 4aae <close> - unlink("unlinkread"); be6: 00005517 auipc a0,0x5 bea: 9ba50513 addi a0,a0,-1606 # 55a0 <malloc+0x636> bee: 6e9030ef jal 4ad6 <unlink> -} bf2: 70a2 ld ra,40(sp) bf4: 7402 ld s0,32(sp) bf6: 64e2 ld s1,24(sp) @@ -1384,57 +1031,44 @@ outofinodes(char *s) bfa: 69a2 ld s3,8(sp) bfc: 6145 addi sp,sp,48 bfe: 8082 ret - printf("%s: create unlinkread failed\n", s); c00: 85ce mv a1,s3 c02: 00005517 auipc a0,0x5 c06: 9ae50513 addi a0,a0,-1618 # 55b0 <malloc+0x646> c0a: 2ac040ef jal 4eb6 <printf> - exit(1); c0e: 4505 li a0,1 c10: 677030ef jal 4a86 <exit> - printf("%s: open unlinkread failed\n", s); c14: 85ce mv a1,s3 c16: 00005517 auipc a0,0x5 c1a: 9c250513 addi a0,a0,-1598 # 55d8 <malloc+0x66e> c1e: 298040ef jal 4eb6 <printf> - exit(1); c22: 4505 li a0,1 c24: 663030ef jal 4a86 <exit> - printf("%s: unlink unlinkread failed\n", s); c28: 85ce mv a1,s3 c2a: 00005517 auipc a0,0x5 c2e: 9ce50513 addi a0,a0,-1586 # 55f8 <malloc+0x68e> c32: 284040ef jal 4eb6 <printf> - exit(1); c36: 4505 li a0,1 c38: 64f030ef jal 4a86 <exit> - printf("%s: unlinkread read failed", s); c3c: 85ce mv a1,s3 c3e: 00005517 auipc a0,0x5 c42: 9e250513 addi a0,a0,-1566 # 5620 <malloc+0x6b6> c46: 270040ef jal 4eb6 <printf> - exit(1); c4a: 4505 li a0,1 c4c: 63b030ef jal 4a86 <exit> - printf("%s: unlinkread wrong data\n", s); c50: 85ce mv a1,s3 c52: 00005517 auipc a0,0x5 c56: 9ee50513 addi a0,a0,-1554 # 5640 <malloc+0x6d6> c5a: 25c040ef jal 4eb6 <printf> - exit(1); c5e: 4505 li a0,1 c60: 627030ef jal 4a86 <exit> - printf("%s: unlinkread write failed\n", s); c64: 85ce mv a1,s3 c66: 00005517 auipc a0,0x5 c6a: 9fa50513 addi a0,a0,-1542 # 5660 <malloc+0x6f6> c6e: 248040ef jal 4eb6 <printf> - exit(1); c72: 4505 li a0,1 c74: 613030ef jal 4a86 <exit> 0000000000000c78 <linktest>: -{ c78: 1101 addi sp,sp,-32 c7a: ec06 sd ra,24(sp) c7c: e822 sd s0,16(sp) @@ -1442,173 +1076,136 @@ outofinodes(char *s) c80: e04a sd s2,0(sp) c82: 1000 addi s0,sp,32 c84: 892a mv s2,a0 - unlink("lf1"); c86: 00005517 auipc a0,0x5 c8a: 9fa50513 addi a0,a0,-1542 # 5680 <malloc+0x716> c8e: 649030ef jal 4ad6 <unlink> - unlink("lf2"); c92: 00005517 auipc a0,0x5 c96: 9f650513 addi a0,a0,-1546 # 5688 <malloc+0x71e> c9a: 63d030ef jal 4ad6 <unlink> - fd = open("lf1", O_CREATE|O_RDWR); c9e: 20200593 li a1,514 ca2: 00005517 auipc a0,0x5 ca6: 9de50513 addi a0,a0,-1570 # 5680 <malloc+0x716> caa: 61d030ef jal 4ac6 <open> - if(fd < 0){ cae: 0c054f63 bltz a0,d8c <linktest+0x114> cb2: 84aa mv s1,a0 - if(write(fd, "hello", SZ) != SZ){ cb4: 4615 li a2,5 cb6: 00005597 auipc a1,0x5 cba: 91a58593 addi a1,a1,-1766 # 55d0 <malloc+0x666> cbe: 5e9030ef jal 4aa6 <write> cc2: 4795 li a5,5 cc4: 0cf51e63 bne a0,a5,da0 <linktest+0x128> - close(fd); cc8: 8526 mv a0,s1 cca: 5e5030ef jal 4aae <close> - if(link("lf1", "lf2") < 0){ cce: 00005597 auipc a1,0x5 cd2: 9ba58593 addi a1,a1,-1606 # 5688 <malloc+0x71e> cd6: 00005517 auipc a0,0x5 cda: 9aa50513 addi a0,a0,-1622 # 5680 <malloc+0x716> cde: 609030ef jal 4ae6 <link> ce2: 0c054963 bltz a0,db4 <linktest+0x13c> - unlink("lf1"); ce6: 00005517 auipc a0,0x5 cea: 99a50513 addi a0,a0,-1638 # 5680 <malloc+0x716> cee: 5e9030ef jal 4ad6 <unlink> - if(open("lf1", 0) >= 0){ cf2: 4581 li a1,0 cf4: 00005517 auipc a0,0x5 cf8: 98c50513 addi a0,a0,-1652 # 5680 <malloc+0x716> cfc: 5cb030ef jal 4ac6 <open> d00: 0c055463 bgez a0,dc8 <linktest+0x150> - fd = open("lf2", 0); d04: 4581 li a1,0 d06: 00005517 auipc a0,0x5 d0a: 98250513 addi a0,a0,-1662 # 5688 <malloc+0x71e> d0e: 5b9030ef jal 4ac6 <open> d12: 84aa mv s1,a0 - if(fd < 0){ d14: 0c054463 bltz a0,ddc <linktest+0x164> - if(read(fd, buf, sizeof(buf)) != SZ){ d18: 660d lui a2,0x3 d1a: 0000c597 auipc a1,0xc d1e: f5e58593 addi a1,a1,-162 # cc78 <buf> d22: 57d030ef jal 4a9e <read> d26: 4795 li a5,5 d28: 0cf51463 bne a0,a5,df0 <linktest+0x178> - close(fd); d2c: 8526 mv a0,s1 d2e: 581030ef jal 4aae <close> - if(link("lf2", "lf2") >= 0){ d32: 00005597 auipc a1,0x5 d36: 95658593 addi a1,a1,-1706 # 5688 <malloc+0x71e> d3a: 852e mv a0,a1 d3c: 5ab030ef jal 4ae6 <link> d40: 0c055263 bgez a0,e04 <linktest+0x18c> - unlink("lf2"); d44: 00005517 auipc a0,0x5 d48: 94450513 addi a0,a0,-1724 # 5688 <malloc+0x71e> d4c: 58b030ef jal 4ad6 <unlink> - if(link("lf2", "lf1") >= 0){ d50: 00005597 auipc a1,0x5 d54: 93058593 addi a1,a1,-1744 # 5680 <malloc+0x716> d58: 00005517 auipc a0,0x5 d5c: 93050513 addi a0,a0,-1744 # 5688 <malloc+0x71e> d60: 587030ef jal 4ae6 <link> d64: 0a055a63 bgez a0,e18 <linktest+0x1a0> - if(link(".", "lf1") >= 0){ d68: 00005597 auipc a1,0x5 d6c: 91858593 addi a1,a1,-1768 # 5680 <malloc+0x716> d70: 00005517 auipc a0,0x5 d74: a2050513 addi a0,a0,-1504 # 5790 <malloc+0x826> d78: 56f030ef jal 4ae6 <link> d7c: 0a055863 bgez a0,e2c <linktest+0x1b4> -} d80: 60e2 ld ra,24(sp) d82: 6442 ld s0,16(sp) d84: 64a2 ld s1,8(sp) d86: 6902 ld s2,0(sp) d88: 6105 addi sp,sp,32 d8a: 8082 ret - printf("%s: create lf1 failed\n", s); d8c: 85ca mv a1,s2 d8e: 00005517 auipc a0,0x5 d92: 90250513 addi a0,a0,-1790 # 5690 <malloc+0x726> d96: 120040ef jal 4eb6 <printf> - exit(1); d9a: 4505 li a0,1 d9c: 4eb030ef jal 4a86 <exit> - printf("%s: write lf1 failed\n", s); da0: 85ca mv a1,s2 da2: 00005517 auipc a0,0x5 da6: 90650513 addi a0,a0,-1786 # 56a8 <malloc+0x73e> daa: 10c040ef jal 4eb6 <printf> - exit(1); dae: 4505 li a0,1 db0: 4d7030ef jal 4a86 <exit> - printf("%s: link lf1 lf2 failed\n", s); db4: 85ca mv a1,s2 db6: 00005517 auipc a0,0x5 dba: 90a50513 addi a0,a0,-1782 # 56c0 <malloc+0x756> dbe: 0f8040ef jal 4eb6 <printf> - exit(1); dc2: 4505 li a0,1 dc4: 4c3030ef jal 4a86 <exit> - printf("%s: unlinked lf1 but it is still there!\n", s); dc8: 85ca mv a1,s2 dca: 00005517 auipc a0,0x5 dce: 91650513 addi a0,a0,-1770 # 56e0 <malloc+0x776> dd2: 0e4040ef jal 4eb6 <printf> - exit(1); dd6: 4505 li a0,1 dd8: 4af030ef jal 4a86 <exit> - printf("%s: open lf2 failed\n", s); ddc: 85ca mv a1,s2 dde: 00005517 auipc a0,0x5 de2: 93250513 addi a0,a0,-1742 # 5710 <malloc+0x7a6> de6: 0d0040ef jal 4eb6 <printf> - exit(1); dea: 4505 li a0,1 dec: 49b030ef jal 4a86 <exit> - printf("%s: read lf2 failed\n", s); df0: 85ca mv a1,s2 df2: 00005517 auipc a0,0x5 df6: 93650513 addi a0,a0,-1738 # 5728 <malloc+0x7be> dfa: 0bc040ef jal 4eb6 <printf> - exit(1); dfe: 4505 li a0,1 e00: 487030ef jal 4a86 <exit> - printf("%s: link lf2 lf2 succeeded! oops\n", s); e04: 85ca mv a1,s2 e06: 00005517 auipc a0,0x5 e0a: 93a50513 addi a0,a0,-1734 # 5740 <malloc+0x7d6> e0e: 0a8040ef jal 4eb6 <printf> - exit(1); e12: 4505 li a0,1 e14: 473030ef jal 4a86 <exit> - printf("%s: link non-existent succeeded! oops\n", s); e18: 85ca mv a1,s2 e1a: 00005517 auipc a0,0x5 e1e: 94e50513 addi a0,a0,-1714 # 5768 <malloc+0x7fe> e22: 094040ef jal 4eb6 <printf> - exit(1); e26: 4505 li a0,1 e28: 45f030ef jal 4a86 <exit> - printf("%s: link . lf1 succeeded! oops\n", s); e2c: 85ca mv a1,s2 e2e: 00005517 auipc a0,0x5 e32: 96a50513 addi a0,a0,-1686 # 5798 <malloc+0x82e> e36: 080040ef jal 4eb6 <printf> - exit(1); e3a: 4505 li a0,1 e3c: 44b030ef jal 4a86 <exit> 0000000000000e40 <validatetest>: -{ e40: 7139 addi sp,sp,-64 e42: fc06 sd ra,56(sp) e44: f822 sd s0,48(sp) @@ -1620,24 +1217,18 @@ outofinodes(char *s) e50: e05a sd s6,0(sp) e52: 0080 addi s0,sp,64 e54: 8b2a mv s6,a0 - for(p = 0; p <= (uint)hi; p += PGSIZE){ e56: 4481 li s1,0 - if(link("nosuchfile", (char*)p) != -1){ e58: 00005997 auipc s3,0x5 e5c: 96098993 addi s3,s3,-1696 # 57b8 <malloc+0x84e> e60: 597d li s2,-1 - for(p = 0; p <= (uint)hi; p += PGSIZE){ e62: 6a85 lui s5,0x1 e64: 00114a37 lui s4,0x114 - if(link("nosuchfile", (char*)p) != -1){ e68: 85a6 mv a1,s1 e6a: 854e mv a0,s3 e6c: 47b030ef jal 4ae6 <link> e70: 01251f63 bne a0,s2,e8e <validatetest+0x4e> - for(p = 0; p <= (uint)hi; p += PGSIZE){ e74: 94d6 add s1,s1,s5 e76: ff4499e3 bne s1,s4,e68 <validatetest+0x28> -} e7a: 70e2 ld ra,56(sp) e7c: 7442 ld s0,48(sp) e7e: 74a2 ld s1,40(sp) @@ -1648,17 +1239,14 @@ outofinodes(char *s) e88: 6b02 ld s6,0(sp) e8a: 6121 addi sp,sp,64 e8c: 8082 ret - printf("%s: link should not succeed\n", s); e8e: 85da mv a1,s6 e90: 00005517 auipc a0,0x5 e94: 93850513 addi a0,a0,-1736 # 57c8 <malloc+0x85e> e98: 01e040ef jal 4eb6 <printf> - exit(1); e9c: 4505 li a0,1 e9e: 3e9030ef jal 4a86 <exit> 0000000000000ea2 <bigdir>: -{ ea2: 715d addi sp,sp,-80 ea4: e486 sd ra,72(sp) ea6: e0a2 sd s0,64(sp) @@ -1670,85 +1258,61 @@ outofinodes(char *s) eb2: e85a sd s6,16(sp) eb4: 0880 addi s0,sp,80 eb6: 89aa mv s3,a0 - unlink("bd"); eb8: 00005517 auipc a0,0x5 ebc: 93050513 addi a0,a0,-1744 # 57e8 <malloc+0x87e> ec0: 417030ef jal 4ad6 <unlink> - fd = open("bd", O_CREATE); ec4: 20000593 li a1,512 ec8: 00005517 auipc a0,0x5 ecc: 92050513 addi a0,a0,-1760 # 57e8 <malloc+0x87e> ed0: 3f7030ef jal 4ac6 <open> - if(fd < 0){ ed4: 0c054163 bltz a0,f96 <bigdir+0xf4> - close(fd); ed8: 3d7030ef jal 4aae <close> - for(i = 0; i < N; i++){ edc: 4901 li s2,0 - name[0] = 'x'; ede: 07800a93 li s5,120 - if(link("bd", name) != 0){ ee2: 00005a17 auipc s4,0x5 ee6: 906a0a13 addi s4,s4,-1786 # 57e8 <malloc+0x87e> - for(i = 0; i < N; i++){ eea: 1f400b13 li s6,500 - name[0] = 'x'; eee: fb540823 sb s5,-80(s0) - name[1] = '0' + (i / 64); ef2: 41f9571b sraiw a4,s2,0x1f ef6: 01a7571b srliw a4,a4,0x1a efa: 012707bb addw a5,a4,s2 efe: 4067d69b sraiw a3,a5,0x6 f02: 0306869b addiw a3,a3,48 f06: fad408a3 sb a3,-79(s0) - name[2] = '0' + (i % 64); f0a: 03f7f793 andi a5,a5,63 f0e: 9f99 subw a5,a5,a4 f10: 0307879b addiw a5,a5,48 f14: faf40923 sb a5,-78(s0) - name[3] = '\0'; f18: fa0409a3 sb zero,-77(s0) - if(link("bd", name) != 0){ f1c: fb040593 addi a1,s0,-80 f20: 8552 mv a0,s4 f22: 3c5030ef jal 4ae6 <link> f26: 84aa mv s1,a0 f28: e149 bnez a0,faa <bigdir+0x108> - for(i = 0; i < N; i++){ f2a: 2905 addiw s2,s2,1 f2c: fd6911e3 bne s2,s6,eee <bigdir+0x4c> - unlink("bd"); f30: 00005517 auipc a0,0x5 f34: 8b850513 addi a0,a0,-1864 # 57e8 <malloc+0x87e> f38: 39f030ef jal 4ad6 <unlink> - name[0] = 'x'; f3c: 07800913 li s2,120 - for(i = 0; i < N; i++){ f40: 1f400a13 li s4,500 - name[0] = 'x'; f44: fb240823 sb s2,-80(s0) - name[1] = '0' + (i / 64); f48: 41f4d71b sraiw a4,s1,0x1f f4c: 01a7571b srliw a4,a4,0x1a f50: 009707bb addw a5,a4,s1 f54: 4067d69b sraiw a3,a5,0x6 f58: 0306869b addiw a3,a3,48 f5c: fad408a3 sb a3,-79(s0) - name[2] = '0' + (i % 64); f60: 03f7f793 andi a5,a5,63 f64: 9f99 subw a5,a5,a4 f66: 0307879b addiw a5,a5,48 f6a: faf40923 sb a5,-78(s0) - name[3] = '\0'; f6e: fa0409a3 sb zero,-77(s0) - if(unlink(name) != 0){ f72: fb040513 addi a0,s0,-80 f76: 361030ef jal 4ad6 <unlink> f7a: e529 bnez a0,fc4 <bigdir+0x122> - for(i = 0; i < N; i++){ f7c: 2485 addiw s1,s1,1 f7e: fd4493e3 bne s1,s4,f44 <bigdir+0xa2> -} f82: 60a6 ld ra,72(sp) f84: 6406 ld s0,64(sp) f86: 74e2 ld s1,56(sp) @@ -1759,57 +1323,45 @@ outofinodes(char *s) f90: 6b42 ld s6,16(sp) f92: 6161 addi sp,sp,80 f94: 8082 ret - printf("%s: bigdir create failed\n", s); f96: 85ce mv a1,s3 f98: 00005517 auipc a0,0x5 f9c: 85850513 addi a0,a0,-1960 # 57f0 <malloc+0x886> fa0: 717030ef jal 4eb6 <printf> - exit(1); fa4: 4505 li a0,1 fa6: 2e1030ef jal 4a86 <exit> - printf("%s: bigdir i=%d link(bd, %s) failed\n", s, i, name); faa: fb040693 addi a3,s0,-80 fae: 864a mv a2,s2 fb0: 85ce mv a1,s3 fb2: 00005517 auipc a0,0x5 fb6: 85e50513 addi a0,a0,-1954 # 5810 <malloc+0x8a6> fba: 6fd030ef jal 4eb6 <printf> - exit(1); fbe: 4505 li a0,1 fc0: 2c7030ef jal 4a86 <exit> - printf("%s: bigdir unlink failed", s); fc4: 85ce mv a1,s3 fc6: 00005517 auipc a0,0x5 fca: 87250513 addi a0,a0,-1934 # 5838 <malloc+0x8ce> fce: 6e9030ef jal 4eb6 <printf> - exit(1); fd2: 4505 li a0,1 fd4: 2b3030ef jal 4a86 <exit> 0000000000000fd8 <pgbug>: -{ fd8: 7179 addi sp,sp,-48 fda: f406 sd ra,40(sp) fdc: f022 sd s0,32(sp) fde: ec26 sd s1,24(sp) fe0: 1800 addi s0,sp,48 - argv[0] = 0; fe2: fc043c23 sd zero,-40(s0) - exec(big, argv); fe6: 00008497 auipc s1,0x8 fea: 01a48493 addi s1,s1,26 # 9000 <big> fee: fd840593 addi a1,s0,-40 ff2: 6088 ld a0,0(s1) ff4: 2cb030ef jal 4abe <exec> - pipe(big); ff8: 6088 ld a0,0(s1) ffa: 29d030ef jal 4a96 <pipe> - exit(0); ffe: 4501 li a0,0 1000: 287030ef jal 4a86 <exit> 0000000000001004 <badarg>: -{ 1004: 7139 addi sp,sp,-64 1006: fc06 sd ra,56(sp) 1008: f822 sd s0,48(sp) @@ -1819,96 +1371,68 @@ outofinodes(char *s) 1010: 0080 addi s0,sp,64 1012: 64b1 lui s1,0xc 1014: 35048493 addi s1,s1,848 # c350 <uninit+0x1de8> - argv[0] = (char*)0xffffffff; 1018: 597d li s2,-1 101a: 02095913 srli s2,s2,0x20 - exec("echo", argv); 101e: 00004997 auipc s3,0x4 1022: 08a98993 addi s3,s3,138 # 50a8 <malloc+0x13e> - argv[0] = (char*)0xffffffff; 1026: fd243023 sd s2,-64(s0) - argv[1] = 0; 102a: fc043423 sd zero,-56(s0) - exec("echo", argv); 102e: fc040593 addi a1,s0,-64 1032: 854e mv a0,s3 1034: 28b030ef jal 4abe <exec> - for(int i = 0; i < 50000; i++){ 1038: 34fd addiw s1,s1,-1 103a: f4f5 bnez s1,1026 <badarg+0x22> - exit(0); 103c: 4501 li a0,0 103e: 249030ef jal 4a86 <exit> 0000000000001042 <copyinstr2>: -{ 1042: 7155 addi sp,sp,-208 1044: e586 sd ra,200(sp) 1046: e1a2 sd s0,192(sp) 1048: 0980 addi s0,sp,208 - for(int i = 0; i < MAXPATH; i++) 104a: f6840793 addi a5,s0,-152 104e: fe840693 addi a3,s0,-24 - b[i] = 'x'; 1052: 07800713 li a4,120 1056: 00e78023 sb a4,0(a5) - for(int i = 0; i < MAXPATH; i++) 105a: 0785 addi a5,a5,1 105c: fed79de3 bne a5,a3,1056 <copyinstr2+0x14> - b[MAXPATH] = '\0'; 1060: fe040423 sb zero,-24(s0) - int ret = unlink(b); 1064: f6840513 addi a0,s0,-152 1068: 26f030ef jal 4ad6 <unlink> - if(ret != -1){ 106c: 57fd li a5,-1 106e: 0cf51263 bne a0,a5,1132 <copyinstr2+0xf0> - int fd = open(b, O_CREATE | O_WRONLY); 1072: 20100593 li a1,513 1076: f6840513 addi a0,s0,-152 107a: 24d030ef jal 4ac6 <open> - if(fd != -1){ 107e: 57fd li a5,-1 1080: 0cf51563 bne a0,a5,114a <copyinstr2+0x108> - ret = link(b, b); 1084: f6840593 addi a1,s0,-152 1088: 852e mv a0,a1 108a: 25d030ef jal 4ae6 <link> - if(ret != -1){ 108e: 57fd li a5,-1 1090: 0cf51963 bne a0,a5,1162 <copyinstr2+0x120> - char *args[] = { "xx", 0 }; 1094: 00006797 auipc a5,0x6 1098: 8f478793 addi a5,a5,-1804 # 6988 <malloc+0x1a1e> 109c: f4f43c23 sd a5,-168(s0) 10a0: f6043023 sd zero,-160(s0) - ret = exec(b, args); 10a4: f5840593 addi a1,s0,-168 10a8: f6840513 addi a0,s0,-152 10ac: 213030ef jal 4abe <exec> - if(ret != -1){ 10b0: 57fd li a5,-1 10b2: 0cf51563 bne a0,a5,117c <copyinstr2+0x13a> - int pid = fork(); 10b6: 1c9030ef jal 4a7e <fork> - if(pid < 0){ 10ba: 0c054d63 bltz a0,1194 <copyinstr2+0x152> - if(pid == 0){ 10be: 0e051863 bnez a0,11ae <copyinstr2+0x16c> 10c2: 00008797 auipc a5,0x8 10c6: 49e78793 addi a5,a5,1182 # 9560 <big.0> 10ca: 00009697 auipc a3,0x9 10ce: 49668693 addi a3,a3,1174 # a560 <big.0+0x1000> - big[i] = 'x'; 10d2: 07800713 li a4,120 10d6: 00e78023 sb a4,0(a5) - for(int i = 0; i < PGSIZE; i++) 10da: 0785 addi a5,a5,1 10dc: fed79de3 bne a5,a3,10d6 <copyinstr2+0x94> - big[PGSIZE] = '\0'; 10e0: 00009797 auipc a5,0x9 10e4: 48078023 sb zero,1152(a5) # a560 <big.0+0x1000> - char *args2[] = { big, big, big, 0 }; 10e8: 00006797 auipc a5,0x6 10ec: 32078793 addi a5,a5,800 # 7408 <malloc+0x249e> 10f0: 6fb0 ld a2,88(a5) @@ -1919,184 +1443,140 @@ outofinodes(char *s) 10fc: f2d43c23 sd a3,-200(s0) 1100: f4e43023 sd a4,-192(s0) 1104: f4f43423 sd a5,-184(s0) - ret = exec("echo", args2); 1108: f3040593 addi a1,s0,-208 110c: 00004517 auipc a0,0x4 1110: f9c50513 addi a0,a0,-100 # 50a8 <malloc+0x13e> 1114: 1ab030ef jal 4abe <exec> - if(ret != -1){ 1118: 57fd li a5,-1 111a: 08f50663 beq a0,a5,11a6 <copyinstr2+0x164> - printf("exec(echo, BIG) returned %d, not -1\n", fd); 111e: 55fd li a1,-1 1120: 00004517 auipc a0,0x4 1124: 7c050513 addi a0,a0,1984 # 58e0 <malloc+0x976> 1128: 58f030ef jal 4eb6 <printf> - exit(1); 112c: 4505 li a0,1 112e: 159030ef jal 4a86 <exit> - printf("unlink(%s) returned %d, not -1\n", b, ret); 1132: 862a mv a2,a0 1134: f6840593 addi a1,s0,-152 1138: 00004517 auipc a0,0x4 113c: 72050513 addi a0,a0,1824 # 5858 <malloc+0x8ee> 1140: 577030ef jal 4eb6 <printf> - exit(1); 1144: 4505 li a0,1 1146: 141030ef jal 4a86 <exit> - printf("open(%s) returned %d, not -1\n", b, fd); 114a: 862a mv a2,a0 114c: f6840593 addi a1,s0,-152 1150: 00004517 auipc a0,0x4 1154: 72850513 addi a0,a0,1832 # 5878 <malloc+0x90e> 1158: 55f030ef jal 4eb6 <printf> - exit(1); 115c: 4505 li a0,1 115e: 129030ef jal 4a86 <exit> - printf("link(%s, %s) returned %d, not -1\n", b, b, ret); 1162: 86aa mv a3,a0 1164: f6840613 addi a2,s0,-152 1168: 85b2 mv a1,a2 116a: 00004517 auipc a0,0x4 116e: 72e50513 addi a0,a0,1838 # 5898 <malloc+0x92e> 1172: 545030ef jal 4eb6 <printf> - exit(1); 1176: 4505 li a0,1 1178: 10f030ef jal 4a86 <exit> - printf("exec(%s) returned %d, not -1\n", b, fd); 117c: 567d li a2,-1 117e: f6840593 addi a1,s0,-152 1182: 00004517 auipc a0,0x4 1186: 73e50513 addi a0,a0,1854 # 58c0 <malloc+0x956> 118a: 52d030ef jal 4eb6 <printf> - exit(1); 118e: 4505 li a0,1 1190: 0f7030ef jal 4a86 <exit> - printf("fork failed\n"); 1194: 00006517 auipc a0,0x6 1198: d1450513 addi a0,a0,-748 # 6ea8 <malloc+0x1f3e> 119c: 51b030ef jal 4eb6 <printf> - exit(1); 11a0: 4505 li a0,1 11a2: 0e5030ef jal 4a86 <exit> - exit(747); // OK 11a6: 2eb00513 li a0,747 11aa: 0dd030ef jal 4a86 <exit> - int st = 0; 11ae: f4042a23 sw zero,-172(s0) - wait(&st); 11b2: f5440513 addi a0,s0,-172 11b6: 0d9030ef jal 4a8e <wait> - if(st != 747){ 11ba: f5442703 lw a4,-172(s0) 11be: 2eb00793 li a5,747 11c2: 00f71663 bne a4,a5,11ce <copyinstr2+0x18c> -} 11c6: 60ae ld ra,200(sp) 11c8: 640e ld s0,192(sp) 11ca: 6169 addi sp,sp,208 11cc: 8082 ret - printf("exec(echo, BIG) succeeded, should have failed\n"); 11ce: 00004517 auipc a0,0x4 11d2: 73a50513 addi a0,a0,1850 # 5908 <malloc+0x99e> 11d6: 4e1030ef jal 4eb6 <printf> - exit(1); 11da: 4505 li a0,1 11dc: 0ab030ef jal 4a86 <exit> 00000000000011e0 <truncate3>: -{ 11e0: 7159 addi sp,sp,-112 11e2: f486 sd ra,104(sp) 11e4: f0a2 sd s0,96(sp) 11e6: e8ca sd s2,80(sp) 11e8: 1880 addi s0,sp,112 11ea: 892a mv s2,a0 - close(open("truncfile", O_CREATE|O_TRUNC|O_WRONLY)); 11ec: 60100593 li a1,1537 11f0: 00004517 auipc a0,0x4 11f4: f1050513 addi a0,a0,-240 # 5100 <malloc+0x196> 11f8: 0cf030ef jal 4ac6 <open> 11fc: 0b3030ef jal 4aae <close> - pid = fork(); 1200: 07f030ef jal 4a7e <fork> - if(pid < 0){ 1204: 06054663 bltz a0,1270 <truncate3+0x90> - if(pid == 0){ 1208: e55d bnez a0,12b6 <truncate3+0xd6> 120a: eca6 sd s1,88(sp) 120c: e4ce sd s3,72(sp) 120e: e0d2 sd s4,64(sp) 1210: fc56 sd s5,56(sp) 1212: 06400993 li s3,100 - int fd = open("truncfile", O_WRONLY); 1216: 00004a17 auipc s4,0x4 121a: eeaa0a13 addi s4,s4,-278 # 5100 <malloc+0x196> - int n = write(fd, "1234567890", 10); 121e: 00004a97 auipc s5,0x4 1222: 74aa8a93 addi s5,s5,1866 # 5968 <malloc+0x9fe> - int fd = open("truncfile", O_WRONLY); 1226: 4585 li a1,1 1228: 8552 mv a0,s4 122a: 09d030ef jal 4ac6 <open> 122e: 84aa mv s1,a0 - if(fd < 0){ 1230: 04054e63 bltz a0,128c <truncate3+0xac> - int n = write(fd, "1234567890", 10); 1234: 4629 li a2,10 1236: 85d6 mv a1,s5 1238: 06f030ef jal 4aa6 <write> - if(n != 10){ 123c: 47a9 li a5,10 123e: 06f51163 bne a0,a5,12a0 <truncate3+0xc0> - close(fd); 1242: 8526 mv a0,s1 1244: 06b030ef jal 4aae <close> - fd = open("truncfile", O_RDONLY); 1248: 4581 li a1,0 124a: 8552 mv a0,s4 124c: 07b030ef jal 4ac6 <open> 1250: 84aa mv s1,a0 - read(fd, buf, sizeof(buf)); 1252: 02000613 li a2,32 1256: f9840593 addi a1,s0,-104 125a: 045030ef jal 4a9e <read> - close(fd); 125e: 8526 mv a0,s1 1260: 04f030ef jal 4aae <close> - for(int i = 0; i < 100; i++){ 1264: 39fd addiw s3,s3,-1 1266: fc0990e3 bnez s3,1226 <truncate3+0x46> - exit(0); 126a: 4501 li a0,0 126c: 01b030ef jal 4a86 <exit> 1270: eca6 sd s1,88(sp) 1272: e4ce sd s3,72(sp) 1274: e0d2 sd s4,64(sp) 1276: fc56 sd s5,56(sp) - printf("%s: fork failed\n", s); 1278: 85ca mv a1,s2 127a: 00004517 auipc a0,0x4 127e: 6be50513 addi a0,a0,1726 # 5938 <malloc+0x9ce> 1282: 435030ef jal 4eb6 <printf> - exit(1); 1286: 4505 li a0,1 1288: 7fe030ef jal 4a86 <exit> - printf("%s: open failed\n", s); 128c: 85ca mv a1,s2 128e: 00004517 auipc a0,0x4 1292: 6c250513 addi a0,a0,1730 # 5950 <malloc+0x9e6> 1296: 421030ef jal 4eb6 <printf> - exit(1); 129a: 4505 li a0,1 129c: 7ea030ef jal 4a86 <exit> - printf("%s: write got %d, expected 10\n", s, n); 12a0: 862a mv a2,a0 12a2: 85ca mv a1,s2 12a4: 00004517 auipc a0,0x4 12a8: 6d450513 addi a0,a0,1748 # 5978 <malloc+0xa0e> 12ac: 40b030ef jal 4eb6 <printf> - exit(1); 12b0: 4505 li a0,1 12b2: 7d4030ef jal 4a86 <exit> 12b6: eca6 sd s1,88(sp) @@ -2104,69 +1584,52 @@ outofinodes(char *s) 12ba: e0d2 sd s4,64(sp) 12bc: fc56 sd s5,56(sp) 12be: 09600993 li s3,150 - int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); 12c2: 00004a17 auipc s4,0x4 12c6: e3ea0a13 addi s4,s4,-450 # 5100 <malloc+0x196> - int n = write(fd, "xxx", 3); 12ca: 00004a97 auipc s5,0x4 12ce: 6cea8a93 addi s5,s5,1742 # 5998 <malloc+0xa2e> - int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); 12d2: 60100593 li a1,1537 12d6: 8552 mv a0,s4 12d8: 7ee030ef jal 4ac6 <open> 12dc: 84aa mv s1,a0 - if(fd < 0){ 12de: 02054d63 bltz a0,1318 <truncate3+0x138> - int n = write(fd, "xxx", 3); 12e2: 460d li a2,3 12e4: 85d6 mv a1,s5 12e6: 7c0030ef jal 4aa6 <write> - if(n != 3){ 12ea: 478d li a5,3 12ec: 04f51063 bne a0,a5,132c <truncate3+0x14c> - close(fd); 12f0: 8526 mv a0,s1 12f2: 7bc030ef jal 4aae <close> - for(int i = 0; i < 150; i++){ 12f6: 39fd addiw s3,s3,-1 12f8: fc099de3 bnez s3,12d2 <truncate3+0xf2> - wait(&xstatus); 12fc: fbc40513 addi a0,s0,-68 1300: 78e030ef jal 4a8e <wait> - unlink("truncfile"); 1304: 00004517 auipc a0,0x4 1308: dfc50513 addi a0,a0,-516 # 5100 <malloc+0x196> 130c: 7ca030ef jal 4ad6 <unlink> - exit(xstatus); 1310: fbc42503 lw a0,-68(s0) 1314: 772030ef jal 4a86 <exit> - printf("%s: open failed\n", s); 1318: 85ca mv a1,s2 131a: 00004517 auipc a0,0x4 131e: 63650513 addi a0,a0,1590 # 5950 <malloc+0x9e6> 1322: 395030ef jal 4eb6 <printf> - exit(1); 1326: 4505 li a0,1 1328: 75e030ef jal 4a86 <exit> - printf("%s: write got %d, expected 3\n", s, n); 132c: 862a mv a2,a0 132e: 85ca mv a1,s2 1330: 00004517 auipc a0,0x4 1334: 67050513 addi a0,a0,1648 # 59a0 <malloc+0xa36> 1338: 37f030ef jal 4eb6 <printf> - exit(1); 133c: 4505 li a0,1 133e: 748030ef jal 4a86 <exit> 0000000000001342 <exectest>: -{ 1342: 715d addi sp,sp,-80 1344: e486 sd ra,72(sp) 1346: e0a2 sd s0,64(sp) 1348: f84a sd s2,48(sp) 134a: 0880 addi s0,sp,80 134c: 892a mv s2,a0 - char *echoargv[] = { "echo", "OK", 0 }; 134e: 00004797 auipc a5,0x4 1352: d5a78793 addi a5,a5,-678 # 50a8 <malloc+0x13e> 1356: fcf43023 sd a5,-64(s0) @@ -2174,169 +1637,127 @@ outofinodes(char *s) 135e: 66678793 addi a5,a5,1638 # 59c0 <malloc+0xa56> 1362: fcf43423 sd a5,-56(s0) 1366: fc043823 sd zero,-48(s0) - unlink("echo-ok"); 136a: 00004517 auipc a0,0x4 136e: 65e50513 addi a0,a0,1630 # 59c8 <malloc+0xa5e> 1372: 764030ef jal 4ad6 <unlink> - pid = fork(); 1376: 708030ef jal 4a7e <fork> - if(pid < 0) { 137a: 02054f63 bltz a0,13b8 <exectest+0x76> 137e: fc26 sd s1,56(sp) 1380: 84aa mv s1,a0 - if(pid == 0) { 1382: e935 bnez a0,13f6 <exectest+0xb4> - close(1); 1384: 4505 li a0,1 1386: 728030ef jal 4aae <close> - fd = open("echo-ok", O_CREATE|O_WRONLY); 138a: 20100593 li a1,513 138e: 00004517 auipc a0,0x4 1392: 63a50513 addi a0,a0,1594 # 59c8 <malloc+0xa5e> 1396: 730030ef jal 4ac6 <open> - if(fd < 0) { 139a: 02054a63 bltz a0,13ce <exectest+0x8c> - if(fd != 1) { 139e: 4785 li a5,1 13a0: 04f50163 beq a0,a5,13e2 <exectest+0xa0> - printf("%s: wrong fd\n", s); 13a4: 85ca mv a1,s2 13a6: 00004517 auipc a0,0x4 13aa: 64250513 addi a0,a0,1602 # 59e8 <malloc+0xa7e> 13ae: 309030ef jal 4eb6 <printf> - exit(1); 13b2: 4505 li a0,1 13b4: 6d2030ef jal 4a86 <exit> 13b8: fc26 sd s1,56(sp) - printf("%s: fork failed\n", s); 13ba: 85ca mv a1,s2 13bc: 00004517 auipc a0,0x4 13c0: 57c50513 addi a0,a0,1404 # 5938 <malloc+0x9ce> 13c4: 2f3030ef jal 4eb6 <printf> - exit(1); 13c8: 4505 li a0,1 13ca: 6bc030ef jal 4a86 <exit> - printf("%s: create failed\n", s); 13ce: 85ca mv a1,s2 13d0: 00004517 auipc a0,0x4 13d4: 60050513 addi a0,a0,1536 # 59d0 <malloc+0xa66> 13d8: 2df030ef jal 4eb6 <printf> - exit(1); 13dc: 4505 li a0,1 13de: 6a8030ef jal 4a86 <exit> - if(exec("echo", echoargv) < 0){ 13e2: fc040593 addi a1,s0,-64 13e6: 00004517 auipc a0,0x4 13ea: cc250513 addi a0,a0,-830 # 50a8 <malloc+0x13e> 13ee: 6d0030ef jal 4abe <exec> 13f2: 00054d63 bltz a0,140c <exectest+0xca> - if (wait(&xstatus) != pid) { 13f6: fdc40513 addi a0,s0,-36 13fa: 694030ef jal 4a8e <wait> 13fe: 02951163 bne a0,s1,1420 <exectest+0xde> - if(xstatus != 0) 1402: fdc42503 lw a0,-36(s0) 1406: c50d beqz a0,1430 <exectest+0xee> - exit(xstatus); 1408: 67e030ef jal 4a86 <exit> - printf("%s: exec echo failed\n", s); 140c: 85ca mv a1,s2 140e: 00004517 auipc a0,0x4 1412: 5ea50513 addi a0,a0,1514 # 59f8 <malloc+0xa8e> 1416: 2a1030ef jal 4eb6 <printf> - exit(1); 141a: 4505 li a0,1 141c: 66a030ef jal 4a86 <exit> - printf("%s: wait failed!\n", s); 1420: 85ca mv a1,s2 1422: 00004517 auipc a0,0x4 1426: 5ee50513 addi a0,a0,1518 # 5a10 <malloc+0xaa6> 142a: 28d030ef jal 4eb6 <printf> 142e: bfd1 j 1402 <exectest+0xc0> - fd = open("echo-ok", O_RDONLY); 1430: 4581 li a1,0 1432: 00004517 auipc a0,0x4 1436: 59650513 addi a0,a0,1430 # 59c8 <malloc+0xa5e> 143a: 68c030ef jal 4ac6 <open> - if(fd < 0) { 143e: 02054463 bltz a0,1466 <exectest+0x124> - if (read(fd, buf, 2) != 2) { 1442: 4609 li a2,2 1444: fb840593 addi a1,s0,-72 1448: 656030ef jal 4a9e <read> 144c: 4789 li a5,2 144e: 02f50663 beq a0,a5,147a <exectest+0x138> - printf("%s: read failed\n", s); 1452: 85ca mv a1,s2 1454: 00004517 auipc a0,0x4 1458: 02450513 addi a0,a0,36 # 5478 <malloc+0x50e> 145c: 25b030ef jal 4eb6 <printf> - exit(1); 1460: 4505 li a0,1 1462: 624030ef jal 4a86 <exit> - printf("%s: open failed\n", s); 1466: 85ca mv a1,s2 1468: 00004517 auipc a0,0x4 146c: 4e850513 addi a0,a0,1256 # 5950 <malloc+0x9e6> 1470: 247030ef jal 4eb6 <printf> - exit(1); 1474: 4505 li a0,1 1476: 610030ef jal 4a86 <exit> - unlink("echo-ok"); 147a: 00004517 auipc a0,0x4 147e: 54e50513 addi a0,a0,1358 # 59c8 <malloc+0xa5e> 1482: 654030ef jal 4ad6 <unlink> - if(buf[0] == 'O' && buf[1] == 'K') 1486: fb844703 lbu a4,-72(s0) 148a: 04f00793 li a5,79 148e: 00f71863 bne a4,a5,149e <exectest+0x15c> 1492: fb944703 lbu a4,-71(s0) 1496: 04b00793 li a5,75 149a: 00f70c63 beq a4,a5,14b2 <exectest+0x170> - printf("%s: wrong output\n", s); 149e: 85ca mv a1,s2 14a0: 00004517 auipc a0,0x4 14a4: 58850513 addi a0,a0,1416 # 5a28 <malloc+0xabe> 14a8: 20f030ef jal 4eb6 <printf> - exit(1); 14ac: 4505 li a0,1 14ae: 5d8030ef jal 4a86 <exit> - exit(0); 14b2: 4501 li a0,0 14b4: 5d2030ef jal 4a86 <exit> 00000000000014b8 <pipe1>: -{ 14b8: 711d addi sp,sp,-96 14ba: ec86 sd ra,88(sp) 14bc: e8a2 sd s0,80(sp) 14be: fc4e sd s3,56(sp) 14c0: 1080 addi s0,sp,96 14c2: 89aa mv s3,a0 - if(pipe(fds) != 0){ 14c4: fa840513 addi a0,s0,-88 14c8: 5ce030ef jal 4a96 <pipe> 14cc: e92d bnez a0,153e <pipe1+0x86> 14ce: e4a6 sd s1,72(sp) 14d0: f852 sd s4,48(sp) 14d2: 84aa mv s1,a0 - pid = fork(); 14d4: 5aa030ef jal 4a7e <fork> 14d8: 8a2a mv s4,a0 - if(pid == 0){ 14da: c151 beqz a0,155e <pipe1+0xa6> - } else if(pid > 0){ 14dc: 14a05e63 blez a0,1638 <pipe1+0x180> 14e0: e0ca sd s2,64(sp) 14e2: f456 sd s5,40(sp) - close(fds[1]); 14e4: fac42503 lw a0,-84(s0) 14e8: 5c6030ef jal 4aae <close> - total = 0; 14ec: 8a26 mv s4,s1 - cc = 1; 14ee: 4905 li s2,1 - while((n = read(fds[0], buf, cc)) > 0){ 14f0: 0000ba97 auipc s5,0xb 14f4: 788a8a93 addi s5,s5,1928 # cc78 <buf> 14f8: 864a mv a2,s2 @@ -2344,27 +1765,20 @@ outofinodes(char *s) 14fc: fa842503 lw a0,-88(s0) 1500: 59e030ef jal 4a9e <read> 1504: 0ea05a63 blez a0,15f8 <pipe1+0x140> - for(i = 0; i < n; i++){ 1508: 0000b717 auipc a4,0xb 150c: 77070713 addi a4,a4,1904 # cc78 <buf> 1510: 00a4863b addw a2,s1,a0 - if((buf[i] & 0xff) != (seq++ & 0xff)){ 1514: 00074683 lbu a3,0(a4) 1518: 0ff4f793 zext.b a5,s1 151c: 2485 addiw s1,s1,1 151e: 0af69d63 bne a3,a5,15d8 <pipe1+0x120> - for(i = 0; i < n; i++){ 1522: 0705 addi a4,a4,1 1524: fec498e3 bne s1,a2,1514 <pipe1+0x5c> - total += n; 1528: 00aa0a3b addw s4,s4,a0 - cc = cc * 2; 152c: 0019179b slliw a5,s2,0x1 1530: 0007891b sext.w s2,a5 - if(cc > sizeof(buf)) 1534: 670d lui a4,0x3 1536: fd2771e3 bgeu a4,s2,14f8 <pipe1+0x40> - cc = sizeof(buf); 153a: 690d lui s2,0x3 153c: bf75 j 14f8 <pipe1+0x40> 153e: e4a6 sd s1,72(sp) @@ -2373,120 +1787,94 @@ outofinodes(char *s) 1544: f456 sd s5,40(sp) 1546: f05a sd s6,32(sp) 1548: ec5e sd s7,24(sp) - printf("%s: pipe() failed\n", s); 154a: 85ce mv a1,s3 154c: 00004517 auipc a0,0x4 1550: 4f450513 addi a0,a0,1268 # 5a40 <malloc+0xad6> 1554: 163030ef jal 4eb6 <printf> - exit(1); 1558: 4505 li a0,1 155a: 52c030ef jal 4a86 <exit> 155e: e0ca sd s2,64(sp) 1560: f456 sd s5,40(sp) 1562: f05a sd s6,32(sp) 1564: ec5e sd s7,24(sp) - close(fds[0]); 1566: fa842503 lw a0,-88(s0) 156a: 544030ef jal 4aae <close> - for(n = 0; n < N; n++){ 156e: 0000bb17 auipc s6,0xb 1572: 70ab0b13 addi s6,s6,1802 # cc78 <buf> 1576: 416004bb negw s1,s6 157a: 0ff4f493 zext.b s1,s1 157e: 409b0913 addi s2,s6,1033 - if(write(fds[1], buf, SZ) != SZ){ 1582: 8bda mv s7,s6 - for(n = 0; n < N; n++){ 1584: 6a85 lui s5,0x1 1586: 42da8a93 addi s5,s5,1069 # 142d <exectest+0xeb> -{ 158a: 87da mv a5,s6 - buf[i] = seq++; 158c: 0097873b addw a4,a5,s1 1590: 00e78023 sb a4,0(a5) - for(i = 0; i < SZ; i++) 1594: 0785 addi a5,a5,1 1596: ff279be3 bne a5,s2,158c <pipe1+0xd4> 159a: 409a0a1b addiw s4,s4,1033 - if(write(fds[1], buf, SZ) != SZ){ 159e: 40900613 li a2,1033 15a2: 85de mv a1,s7 15a4: fac42503 lw a0,-84(s0) 15a8: 4fe030ef jal 4aa6 <write> 15ac: 40900793 li a5,1033 15b0: 00f51a63 bne a0,a5,15c4 <pipe1+0x10c> - for(n = 0; n < N; n++){ 15b4: 24a5 addiw s1,s1,9 15b6: 0ff4f493 zext.b s1,s1 15ba: fd5a18e3 bne s4,s5,158a <pipe1+0xd2> - exit(0); 15be: 4501 li a0,0 15c0: 4c6030ef jal 4a86 <exit> - printf("%s: pipe1 oops 1\n", s); 15c4: 85ce mv a1,s3 15c6: 00004517 auipc a0,0x4 15ca: 49250513 addi a0,a0,1170 # 5a58 <malloc+0xaee> 15ce: 0e9030ef jal 4eb6 <printf> - exit(1); 15d2: 4505 li a0,1 15d4: 4b2030ef jal 4a86 <exit> - printf("%s: pipe1 oops 2\n", s); 15d8: 85ce mv a1,s3 15da: 00004517 auipc a0,0x4 15de: 49650513 addi a0,a0,1174 # 5a70 <malloc+0xb06> 15e2: 0d5030ef jal 4eb6 <printf> - return; 15e6: 64a6 ld s1,72(sp) 15e8: 6906 ld s2,64(sp) 15ea: 7a42 ld s4,48(sp) 15ec: 7aa2 ld s5,40(sp) -} 15ee: 60e6 ld ra,88(sp) 15f0: 6446 ld s0,80(sp) 15f2: 79e2 ld s3,56(sp) 15f4: 6125 addi sp,sp,96 15f6: 8082 ret - if(total != N * SZ){ 15f8: 6785 lui a5,0x1 15fa: 42d78793 addi a5,a5,1069 # 142d <exectest+0xeb> 15fe: 00fa0f63 beq s4,a5,161c <pipe1+0x164> 1602: f05a sd s6,32(sp) 1604: ec5e sd s7,24(sp) - printf("%s: pipe1 oops 3 total %d\n", s, total); 1606: 8652 mv a2,s4 1608: 85ce mv a1,s3 160a: 00004517 auipc a0,0x4 160e: 47e50513 addi a0,a0,1150 # 5a88 <malloc+0xb1e> 1612: 0a5030ef jal 4eb6 <printf> - exit(1); 1616: 4505 li a0,1 1618: 46e030ef jal 4a86 <exit> 161c: f05a sd s6,32(sp) 161e: ec5e sd s7,24(sp) - close(fds[0]); 1620: fa842503 lw a0,-88(s0) 1624: 48a030ef jal 4aae <close> - wait(&xstatus); 1628: fa440513 addi a0,s0,-92 162c: 462030ef jal 4a8e <wait> - exit(xstatus); 1630: fa442503 lw a0,-92(s0) 1634: 452030ef jal 4a86 <exit> 1638: e0ca sd s2,64(sp) 163a: f456 sd s5,40(sp) 163c: f05a sd s6,32(sp) 163e: ec5e sd s7,24(sp) - printf("%s: fork() failed\n", s); 1640: 85ce mv a1,s3 1642: 00004517 auipc a0,0x4 1646: 46650513 addi a0,a0,1126 # 5aa8 <malloc+0xb3e> 164a: 06d030ef jal 4eb6 <printf> - exit(1); 164e: 4505 li a0,1 1650: 436030ef jal 4a86 <exit> 0000000000001654 <exitwait>: -{ 1654: 7139 addi sp,sp,-64 1656: fc06 sd ra,56(sp) 1658: f822 sd s0,48(sp) @@ -2496,27 +1884,19 @@ outofinodes(char *s) 1660: e852 sd s4,16(sp) 1662: 0080 addi s0,sp,64 1664: 8a2a mv s4,a0 - for(i = 0; i < 100; i++){ 1666: 4901 li s2,0 1668: 06400993 li s3,100 - pid = fork(); 166c: 412030ef jal 4a7e <fork> 1670: 84aa mv s1,a0 - if(pid < 0){ 1672: 02054863 bltz a0,16a2 <exitwait+0x4e> - if(pid){ 1676: c525 beqz a0,16de <exitwait+0x8a> - if(wait(&xstate) != pid){ 1678: fcc40513 addi a0,s0,-52 167c: 412030ef jal 4a8e <wait> 1680: 02951b63 bne a0,s1,16b6 <exitwait+0x62> - if(i != xstate) { 1684: fcc42783 lw a5,-52(s0) 1688: 05279163 bne a5,s2,16ca <exitwait+0x76> - for(i = 0; i < 100; i++){ 168c: 2905 addiw s2,s2,1 # 3001 <subdir+0x41f> 168e: fd391fe3 bne s2,s3,166c <exitwait+0x18> -} 1692: 70e2 ld ra,56(sp) 1694: 7442 ld s0,48(sp) 1696: 74a2 ld s1,40(sp) @@ -2525,36 +1905,28 @@ outofinodes(char *s) 169c: 6a42 ld s4,16(sp) 169e: 6121 addi sp,sp,64 16a0: 8082 ret - printf("%s: fork failed\n", s); 16a2: 85d2 mv a1,s4 16a4: 00004517 auipc a0,0x4 16a8: 29450513 addi a0,a0,660 # 5938 <malloc+0x9ce> 16ac: 00b030ef jal 4eb6 <printf> - exit(1); 16b0: 4505 li a0,1 16b2: 3d4030ef jal 4a86 <exit> - printf("%s: wait wrong pid\n", s); 16b6: 85d2 mv a1,s4 16b8: 00004517 auipc a0,0x4 16bc: 40850513 addi a0,a0,1032 # 5ac0 <malloc+0xb56> 16c0: 7f6030ef jal 4eb6 <printf> - exit(1); 16c4: 4505 li a0,1 16c6: 3c0030ef jal 4a86 <exit> - printf("%s: wait wrong exit status\n", s); 16ca: 85d2 mv a1,s4 16cc: 00004517 auipc a0,0x4 16d0: 40c50513 addi a0,a0,1036 # 5ad8 <malloc+0xb6e> 16d4: 7e2030ef jal 4eb6 <printf> - exit(1); 16d8: 4505 li a0,1 16da: 3ac030ef jal 4a86 <exit> - exit(i); 16de: 854a mv a0,s2 16e0: 3a6030ef jal 4a86 <exit> 00000000000016e4 <twochildren>: -{ 16e4: 1101 addi sp,sp,-32 16e6: ec06 sd ra,24(sp) 16e8: e822 sd s0,16(sp) @@ -2563,172 +1935,118 @@ outofinodes(char *s) 16ee: 1000 addi s0,sp,32 16f0: 892a mv s2,a0 16f2: 3e800493 li s1,1000 - int pid1 = fork(); 16f6: 388030ef jal 4a7e <fork> - if(pid1 < 0){ 16fa: 02054663 bltz a0,1726 <twochildren+0x42> - if(pid1 == 0){ 16fe: cd15 beqz a0,173a <twochildren+0x56> - int pid2 = fork(); 1700: 37e030ef jal 4a7e <fork> - if(pid2 < 0){ 1704: 02054d63 bltz a0,173e <twochildren+0x5a> - if(pid2 == 0){ 1708: c529 beqz a0,1752 <twochildren+0x6e> - wait(0); 170a: 4501 li a0,0 170c: 382030ef jal 4a8e <wait> - wait(0); 1710: 4501 li a0,0 1712: 37c030ef jal 4a8e <wait> - for(int i = 0; i < 1000; i++){ 1716: 34fd addiw s1,s1,-1 1718: fcf9 bnez s1,16f6 <twochildren+0x12> -} 171a: 60e2 ld ra,24(sp) 171c: 6442 ld s0,16(sp) 171e: 64a2 ld s1,8(sp) 1720: 6902 ld s2,0(sp) 1722: 6105 addi sp,sp,32 1724: 8082 ret - printf("%s: fork failed\n", s); 1726: 85ca mv a1,s2 1728: 00004517 auipc a0,0x4 172c: 21050513 addi a0,a0,528 # 5938 <malloc+0x9ce> 1730: 786030ef jal 4eb6 <printf> - exit(1); 1734: 4505 li a0,1 1736: 350030ef jal 4a86 <exit> - exit(0); 173a: 34c030ef jal 4a86 <exit> - printf("%s: fork failed\n", s); 173e: 85ca mv a1,s2 1740: 00004517 auipc a0,0x4 1744: 1f850513 addi a0,a0,504 # 5938 <malloc+0x9ce> 1748: 76e030ef jal 4eb6 <printf> - exit(1); 174c: 4505 li a0,1 174e: 338030ef jal 4a86 <exit> - exit(0); 1752: 334030ef jal 4a86 <exit> 0000000000001756 <forkfork>: -{ 1756: 7179 addi sp,sp,-48 1758: f406 sd ra,40(sp) 175a: f022 sd s0,32(sp) 175c: ec26 sd s1,24(sp) 175e: 1800 addi s0,sp,48 1760: 84aa mv s1,a0 - int pid = fork(); 1762: 31c030ef jal 4a7e <fork> - if(pid < 0){ 1766: 02054b63 bltz a0,179c <forkfork+0x46> - if(pid == 0){ 176a: c139 beqz a0,17b0 <forkfork+0x5a> - int pid = fork(); 176c: 312030ef jal 4a7e <fork> - if(pid < 0){ 1770: 02054663 bltz a0,179c <forkfork+0x46> - if(pid == 0){ 1774: cd15 beqz a0,17b0 <forkfork+0x5a> - wait(&xstatus); 1776: fdc40513 addi a0,s0,-36 177a: 314030ef jal 4a8e <wait> - if(xstatus != 0) { 177e: fdc42783 lw a5,-36(s0) 1782: ebb9 bnez a5,17d8 <forkfork+0x82> - wait(&xstatus); 1784: fdc40513 addi a0,s0,-36 1788: 306030ef jal 4a8e <wait> - if(xstatus != 0) { 178c: fdc42783 lw a5,-36(s0) 1790: e7a1 bnez a5,17d8 <forkfork+0x82> -} 1792: 70a2 ld ra,40(sp) 1794: 7402 ld s0,32(sp) 1796: 64e2 ld s1,24(sp) 1798: 6145 addi sp,sp,48 179a: 8082 ret - printf("%s: fork failed", s); 179c: 85a6 mv a1,s1 179e: 00004517 auipc a0,0x4 17a2: 35a50513 addi a0,a0,858 # 5af8 <malloc+0xb8e> 17a6: 710030ef jal 4eb6 <printf> - exit(1); 17aa: 4505 li a0,1 17ac: 2da030ef jal 4a86 <exit> -{ 17b0: 0c800493 li s1,200 - int pid1 = fork(); 17b4: 2ca030ef jal 4a7e <fork> - if(pid1 < 0){ 17b8: 00054b63 bltz a0,17ce <forkfork+0x78> - if(pid1 == 0){ 17bc: cd01 beqz a0,17d4 <forkfork+0x7e> - wait(0); 17be: 4501 li a0,0 17c0: 2ce030ef jal 4a8e <wait> - for(int j = 0; j < 200; j++){ 17c4: 34fd addiw s1,s1,-1 17c6: f4fd bnez s1,17b4 <forkfork+0x5e> - exit(0); 17c8: 4501 li a0,0 17ca: 2bc030ef jal 4a86 <exit> - exit(1); 17ce: 4505 li a0,1 17d0: 2b6030ef jal 4a86 <exit> - exit(0); 17d4: 2b2030ef jal 4a86 <exit> - printf("%s: fork in child failed", s); 17d8: 85a6 mv a1,s1 17da: 00004517 auipc a0,0x4 17de: 32e50513 addi a0,a0,814 # 5b08 <malloc+0xb9e> 17e2: 6d4030ef jal 4eb6 <printf> - exit(1); 17e6: 4505 li a0,1 17e8: 29e030ef jal 4a86 <exit> 00000000000017ec <reparent2>: -{ 17ec: 1101 addi sp,sp,-32 17ee: ec06 sd ra,24(sp) 17f0: e822 sd s0,16(sp) 17f2: e426 sd s1,8(sp) 17f4: 1000 addi s0,sp,32 17f6: 32000493 li s1,800 - int pid1 = fork(); 17fa: 284030ef jal 4a7e <fork> - if(pid1 < 0){ 17fe: 00054b63 bltz a0,1814 <reparent2+0x28> - if(pid1 == 0){ 1802: c115 beqz a0,1826 <reparent2+0x3a> - wait(0); 1804: 4501 li a0,0 1806: 288030ef jal 4a8e <wait> - for(int i = 0; i < 800; i++){ 180a: 34fd addiw s1,s1,-1 180c: f4fd bnez s1,17fa <reparent2+0xe> - exit(0); 180e: 4501 li a0,0 1810: 276030ef jal 4a86 <exit> - printf("fork failed\n"); 1814: 00005517 auipc a0,0x5 1818: 69450513 addi a0,a0,1684 # 6ea8 <malloc+0x1f3e> 181c: 69a030ef jal 4eb6 <printf> - exit(1); 1820: 4505 li a0,1 1822: 264030ef jal 4a86 <exit> - fork(); 1826: 258030ef jal 4a7e <fork> - fork(); 182a: 254030ef jal 4a7e <fork> - exit(0); 182e: 4501 li a0,0 1830: 256030ef jal 4a86 <exit> 0000000000001834 <createdelete>: -{ 1834: 7175 addi sp,sp,-144 1836: e506 sd ra,136(sp) 1838: e122 sd s0,128(sp) @@ -2743,190 +2061,133 @@ outofinodes(char *s) 184a: fc66 sd s9,56(sp) 184c: 0900 addi s0,sp,144 184e: 8caa mv s9,a0 - for(pi = 0; pi < NCHILD; pi++){ 1850: 4901 li s2,0 1852: 4991 li s3,4 - pid = fork(); 1854: 22a030ef jal 4a7e <fork> 1858: 84aa mv s1,a0 - if(pid < 0){ 185a: 02054d63 bltz a0,1894 <createdelete+0x60> - if(pid == 0){ 185e: c529 beqz a0,18a8 <createdelete+0x74> - for(pi = 0; pi < NCHILD; pi++){ 1860: 2905 addiw s2,s2,1 1862: ff3919e3 bne s2,s3,1854 <createdelete+0x20> 1866: 4491 li s1,4 - wait(&xstatus); 1868: f7c40513 addi a0,s0,-132 186c: 222030ef jal 4a8e <wait> - if(xstatus != 0) 1870: f7c42903 lw s2,-132(s0) 1874: 0a091e63 bnez s2,1930 <createdelete+0xfc> - for(pi = 0; pi < NCHILD; pi++){ 1878: 34fd addiw s1,s1,-1 187a: f4fd bnez s1,1868 <createdelete+0x34> - name[0] = name[1] = name[2] = 0; 187c: f8040123 sb zero,-126(s0) 1880: 03000993 li s3,48 1884: 5a7d li s4,-1 1886: 07000c13 li s8,112 - if((i == 0 || i >= N/2) && fd < 0){ 188a: 4b25 li s6,9 - } else if((i >= 1 && i < N/2) && fd >= 0){ 188c: 4ba1 li s7,8 - for(pi = 0; pi < NCHILD; pi++){ 188e: 07400a93 li s5,116 1892: aa39 j 19b0 <createdelete+0x17c> - printf("%s: fork failed\n", s); 1894: 85e6 mv a1,s9 1896: 00004517 auipc a0,0x4 189a: 0a250513 addi a0,a0,162 # 5938 <malloc+0x9ce> 189e: 618030ef jal 4eb6 <printf> - exit(1); 18a2: 4505 li a0,1 18a4: 1e2030ef jal 4a86 <exit> - name[0] = 'p' + pi; 18a8: 0709091b addiw s2,s2,112 18ac: f9240023 sb s2,-128(s0) - name[2] = '\0'; 18b0: f8040123 sb zero,-126(s0) - for(i = 0; i < N; i++){ 18b4: 4951 li s2,20 18b6: a831 j 18d2 <createdelete+0x9e> - printf("%s: create failed\n", s); 18b8: 85e6 mv a1,s9 18ba: 00004517 auipc a0,0x4 18be: 11650513 addi a0,a0,278 # 59d0 <malloc+0xa66> 18c2: 5f4030ef jal 4eb6 <printf> - exit(1); 18c6: 4505 li a0,1 18c8: 1be030ef jal 4a86 <exit> - for(i = 0; i < N; i++){ 18cc: 2485 addiw s1,s1,1 18ce: 05248e63 beq s1,s2,192a <createdelete+0xf6> - name[1] = '0' + i; 18d2: 0304879b addiw a5,s1,48 18d6: f8f400a3 sb a5,-127(s0) - fd = open(name, O_CREATE | O_RDWR); 18da: 20200593 li a1,514 18de: f8040513 addi a0,s0,-128 18e2: 1e4030ef jal 4ac6 <open> - if(fd < 0){ 18e6: fc0549e3 bltz a0,18b8 <createdelete+0x84> - close(fd); 18ea: 1c4030ef jal 4aae <close> - if(i > 0 && (i % 2 ) == 0){ 18ee: 10905063 blez s1,19ee <createdelete+0x1ba> 18f2: 0014f793 andi a5,s1,1 18f6: fbf9 bnez a5,18cc <createdelete+0x98> - name[1] = '0' + (i / 2); 18f8: 01f4d79b srliw a5,s1,0x1f 18fc: 9fa5 addw a5,a5,s1 18fe: 4017d79b sraiw a5,a5,0x1 1902: 0307879b addiw a5,a5,48 1906: f8f400a3 sb a5,-127(s0) - if(unlink(name) < 0){ 190a: f8040513 addi a0,s0,-128 190e: 1c8030ef jal 4ad6 <unlink> 1912: fa055de3 bgez a0,18cc <createdelete+0x98> - printf("%s: unlink failed\n", s); 1916: 85e6 mv a1,s9 1918: 00004517 auipc a0,0x4 191c: 21050513 addi a0,a0,528 # 5b28 <malloc+0xbbe> 1920: 596030ef jal 4eb6 <printf> - exit(1); 1924: 4505 li a0,1 1926: 160030ef jal 4a86 <exit> - exit(0); 192a: 4501 li a0,0 192c: 15a030ef jal 4a86 <exit> - exit(1); 1930: 4505 li a0,1 1932: 154030ef jal 4a86 <exit> - printf("%s: oops createdelete %s didn't exist\n", s, name); 1936: f8040613 addi a2,s0,-128 193a: 85e6 mv a1,s9 193c: 00004517 auipc a0,0x4 1940: 20450513 addi a0,a0,516 # 5b40 <malloc+0xbd6> 1944: 572030ef jal 4eb6 <printf> - exit(1); 1948: 4505 li a0,1 194a: 13c030ef jal 4a86 <exit> - } else if((i >= 1 && i < N/2) && fd >= 0){ 194e: 034bfb63 bgeu s7,s4,1984 <createdelete+0x150> - if(fd >= 0) 1952: 02055663 bgez a0,197e <createdelete+0x14a> - for(pi = 0; pi < NCHILD; pi++){ 1956: 2485 addiw s1,s1,1 1958: 0ff4f493 zext.b s1,s1 195c: 05548263 beq s1,s5,19a0 <createdelete+0x16c> - name[0] = 'p' + pi; 1960: f8940023 sb s1,-128(s0) - name[1] = '0' + i; 1964: f93400a3 sb s3,-127(s0) - fd = open(name, 0); 1968: 4581 li a1,0 196a: f8040513 addi a0,s0,-128 196e: 158030ef jal 4ac6 <open> - if((i == 0 || i >= N/2) && fd < 0){ 1972: 00090463 beqz s2,197a <createdelete+0x146> 1976: fd2b5ce3 bge s6,s2,194e <createdelete+0x11a> 197a: fa054ee3 bltz a0,1936 <createdelete+0x102> - close(fd); 197e: 130030ef jal 4aae <close> 1982: bfd1 j 1956 <createdelete+0x122> - } else if((i >= 1 && i < N/2) && fd >= 0){ 1984: fc0549e3 bltz a0,1956 <createdelete+0x122> - printf("%s: oops createdelete %s did exist\n", s, name); 1988: f8040613 addi a2,s0,-128 198c: 85e6 mv a1,s9 198e: 00004517 auipc a0,0x4 1992: 1da50513 addi a0,a0,474 # 5b68 <malloc+0xbfe> 1996: 520030ef jal 4eb6 <printf> - exit(1); 199a: 4505 li a0,1 199c: 0ea030ef jal 4a86 <exit> - for(i = 0; i < N; i++){ 19a0: 2905 addiw s2,s2,1 19a2: 2a05 addiw s4,s4,1 19a4: 2985 addiw s3,s3,1 19a6: 0ff9f993 zext.b s3,s3 19aa: 47d1 li a5,20 19ac: 02f90863 beq s2,a5,19dc <createdelete+0x1a8> - for(pi = 0; pi < NCHILD; pi++){ 19b0: 84e2 mv s1,s8 19b2: b77d j 1960 <createdelete+0x12c> - for(i = 0; i < N; i++){ 19b4: 2905 addiw s2,s2,1 19b6: 0ff97913 zext.b s2,s2 19ba: 03490c63 beq s2,s4,19f2 <createdelete+0x1be> - name[0] = name[1] = name[2] = 0; 19be: 84d6 mv s1,s5 - name[0] = 'p' + pi; 19c0: f8940023 sb s1,-128(s0) - name[1] = '0' + i; 19c4: f92400a3 sb s2,-127(s0) - unlink(name); 19c8: f8040513 addi a0,s0,-128 19cc: 10a030ef jal 4ad6 <unlink> - for(pi = 0; pi < NCHILD; pi++){ 19d0: 2485 addiw s1,s1,1 19d2: 0ff4f493 zext.b s1,s1 19d6: ff3495e3 bne s1,s3,19c0 <createdelete+0x18c> 19da: bfe9 j 19b4 <createdelete+0x180> 19dc: 03000913 li s2,48 - name[0] = name[1] = name[2] = 0; 19e0: 07000a93 li s5,112 - for(pi = 0; pi < NCHILD; pi++){ 19e4: 07400993 li s3,116 - for(i = 0; i < N; i++){ 19e8: 04400a13 li s4,68 19ec: bfc9 j 19be <createdelete+0x18a> - for(i = 0; i < N; i++){ 19ee: 2485 addiw s1,s1,1 19f0: b5cd j 18d2 <createdelete+0x9e> -} 19f2: 60aa ld ra,136(sp) 19f4: 640a ld s0,128(sp) 19f6: 74e6 ld s1,120(sp) @@ -2942,7 +2203,6 @@ outofinodes(char *s) 1a0a: 8082 ret 0000000000001a0c <linkunlink>: -{ 1a0c: 711d addi sp,sp,-96 1a0e: ec86 sd ra,88(sp) 1a10: e8a2 sd s0,80(sp) @@ -2957,77 +2217,56 @@ outofinodes(char *s) 1a22: e466 sd s9,8(sp) 1a24: 1080 addi s0,sp,96 1a26: 84aa mv s1,a0 - unlink("x"); 1a28: 00003517 auipc a0,0x3 1a2c: 6f050513 addi a0,a0,1776 # 5118 <malloc+0x1ae> 1a30: 0a6030ef jal 4ad6 <unlink> - pid = fork(); 1a34: 04a030ef jal 4a7e <fork> - if(pid < 0){ 1a38: 02054b63 bltz a0,1a6e <linkunlink+0x62> 1a3c: 8caa mv s9,a0 - unsigned int x = (pid ? 1 : 97); 1a3e: 06100913 li s2,97 1a42: c111 beqz a0,1a46 <linkunlink+0x3a> 1a44: 4905 li s2,1 1a46: 06400493 li s1,100 - x = x * 1103515245 + 12345; 1a4a: 41c65a37 lui s4,0x41c65 1a4e: e6da0a1b addiw s4,s4,-403 # 41c64e6d <base+0x41c551f5> 1a52: 698d lui s3,0x3 1a54: 0399899b addiw s3,s3,57 # 3039 <subdir+0x457> - if((x % 3) == 0){ 1a58: 4a8d li s5,3 - } else if((x % 3) == 1){ 1a5a: 4b85 li s7,1 - unlink("x"); 1a5c: 00003b17 auipc s6,0x3 1a60: 6bcb0b13 addi s6,s6,1724 # 5118 <malloc+0x1ae> - link("cat", "x"); 1a64: 00004c17 auipc s8,0x4 1a68: 12cc0c13 addi s8,s8,300 # 5b90 <malloc+0xc26> 1a6c: a025 j 1a94 <linkunlink+0x88> - printf("%s: fork failed\n", s); 1a6e: 85a6 mv a1,s1 1a70: 00004517 auipc a0,0x4 1a74: ec850513 addi a0,a0,-312 # 5938 <malloc+0x9ce> 1a78: 43e030ef jal 4eb6 <printf> - exit(1); 1a7c: 4505 li a0,1 1a7e: 008030ef jal 4a86 <exit> - close(open("x", O_RDWR | O_CREATE)); 1a82: 20200593 li a1,514 1a86: 855a mv a0,s6 1a88: 03e030ef jal 4ac6 <open> 1a8c: 022030ef jal 4aae <close> - for(i = 0; i < 100; i++){ 1a90: 34fd addiw s1,s1,-1 1a92: c495 beqz s1,1abe <linkunlink+0xb2> - x = x * 1103515245 + 12345; 1a94: 034907bb mulw a5,s2,s4 1a98: 013787bb addw a5,a5,s3 1a9c: 0007891b sext.w s2,a5 - if((x % 3) == 0){ 1aa0: 0357f7bb remuw a5,a5,s5 1aa4: 2781 sext.w a5,a5 1aa6: dff1 beqz a5,1a82 <linkunlink+0x76> - } else if((x % 3) == 1){ 1aa8: 01778663 beq a5,s7,1ab4 <linkunlink+0xa8> - unlink("x"); 1aac: 855a mv a0,s6 1aae: 028030ef jal 4ad6 <unlink> 1ab2: bff9 j 1a90 <linkunlink+0x84> - link("cat", "x"); 1ab4: 85da mv a1,s6 1ab6: 8562 mv a0,s8 1ab8: 02e030ef jal 4ae6 <link> 1abc: bfd1 j 1a90 <linkunlink+0x84> - if(pid) 1abe: 020c8263 beqz s9,1ae2 <linkunlink+0xd6> - wait(0); 1ac2: 4501 li a0,0 1ac4: 7cb020ef jal 4a8e <wait> -} 1ac8: 60e6 ld ra,88(sp) 1aca: 6446 ld s0,80(sp) 1acc: 64a6 ld s1,72(sp) @@ -3041,12 +2280,10 @@ outofinodes(char *s) 1adc: 6ca2 ld s9,8(sp) 1ade: 6125 addi sp,sp,96 1ae0: 8082 ret - exit(0); 1ae2: 4501 li a0,0 1ae4: 7a3020ef jal 4a86 <exit> 0000000000001ae8 <forktest>: -{ 1ae8: 7179 addi sp,sp,-48 1aea: f406 sd ra,40(sp) 1aec: f022 sd s0,32(sp) @@ -3055,69 +2292,49 @@ outofinodes(char *s) 1af2: e44e sd s3,8(sp) 1af4: 1800 addi s0,sp,48 1af6: 89aa mv s3,a0 - for(n=0; n<N; n++){ 1af8: 4481 li s1,0 1afa: 3e800913 li s2,1000 - pid = fork(); 1afe: 781020ef jal 4a7e <fork> - if(pid < 0) 1b02: 06054063 bltz a0,1b62 <forktest+0x7a> - if(pid == 0) 1b06: cd11 beqz a0,1b22 <forktest+0x3a> - for(n=0; n<N; n++){ 1b08: 2485 addiw s1,s1,1 1b0a: ff249ae3 bne s1,s2,1afe <forktest+0x16> - printf("%s: fork claimed to work 1000 times!\n", s); 1b0e: 85ce mv a1,s3 1b10: 00004517 auipc a0,0x4 1b14: 0d050513 addi a0,a0,208 # 5be0 <malloc+0xc76> 1b18: 39e030ef jal 4eb6 <printf> - exit(1); 1b1c: 4505 li a0,1 1b1e: 769020ef jal 4a86 <exit> - exit(0); 1b22: 765020ef jal 4a86 <exit> - printf("%s: no fork at all!\n", s); 1b26: 85ce mv a1,s3 1b28: 00004517 auipc a0,0x4 1b2c: 07050513 addi a0,a0,112 # 5b98 <malloc+0xc2e> 1b30: 386030ef jal 4eb6 <printf> - exit(1); 1b34: 4505 li a0,1 1b36: 751020ef jal 4a86 <exit> - printf("%s: wait stopped early\n", s); 1b3a: 85ce mv a1,s3 1b3c: 00004517 auipc a0,0x4 1b40: 07450513 addi a0,a0,116 # 5bb0 <malloc+0xc46> 1b44: 372030ef jal 4eb6 <printf> - exit(1); 1b48: 4505 li a0,1 1b4a: 73d020ef jal 4a86 <exit> - printf("%s: wait got too many\n", s); 1b4e: 85ce mv a1,s3 1b50: 00004517 auipc a0,0x4 1b54: 07850513 addi a0,a0,120 # 5bc8 <malloc+0xc5e> 1b58: 35e030ef jal 4eb6 <printf> - exit(1); 1b5c: 4505 li a0,1 1b5e: 729020ef jal 4a86 <exit> - if (n == 0) { 1b62: d0f1 beqz s1,1b26 <forktest+0x3e> - for(; n > 0; n--){ 1b64: 00905963 blez s1,1b76 <forktest+0x8e> - if(wait(0) < 0){ 1b68: 4501 li a0,0 1b6a: 725020ef jal 4a8e <wait> 1b6e: fc0546e3 bltz a0,1b3a <forktest+0x52> - for(; n > 0; n--){ 1b72: 34fd addiw s1,s1,-1 1b74: f8f5 bnez s1,1b68 <forktest+0x80> - if(wait(0) != -1){ 1b76: 4501 li a0,0 1b78: 717020ef jal 4a8e <wait> 1b7c: 57fd li a5,-1 1b7e: fcf518e3 bne a0,a5,1b4e <forktest+0x66> -} 1b82: 70a2 ld ra,40(sp) 1b84: 7402 ld s0,32(sp) 1b86: 64e2 ld s1,24(sp) @@ -3127,7 +2344,6 @@ outofinodes(char *s) 1b8e: 8082 ret 0000000000001b90 <kernmem>: -{ 1b90: 715d addi sp,sp,-80 1b92: e486 sd ra,72(sp) 1b94: e0a2 sd s0,64(sp) @@ -3138,33 +2354,23 @@ outofinodes(char *s) 1b9e: ec56 sd s5,24(sp) 1ba0: 0880 addi s0,sp,80 1ba2: 8aaa mv s5,a0 - for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ 1ba4: 4485 li s1,1 1ba6: 04fe slli s1,s1,0x1f - if(xstatus != -1) // did kernel kill child? 1ba8: 5a7d li s4,-1 - for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ 1baa: 69b1 lui s3,0xc 1bac: 35098993 addi s3,s3,848 # c350 <uninit+0x1de8> 1bb0: 1003d937 lui s2,0x1003d 1bb4: 090e slli s2,s2,0x3 1bb6: 48090913 addi s2,s2,1152 # 1003d480 <base+0x1002d808> - pid = fork(); 1bba: 6c5020ef jal 4a7e <fork> - if(pid < 0){ 1bbe: 02054763 bltz a0,1bec <kernmem+0x5c> - if(pid == 0){ 1bc2: cd1d beqz a0,1c00 <kernmem+0x70> - wait(&xstatus); 1bc4: fbc40513 addi a0,s0,-68 1bc8: 6c7020ef jal 4a8e <wait> - if(xstatus != -1) // did kernel kill child? 1bcc: fbc42783 lw a5,-68(s0) 1bd0: 05479563 bne a5,s4,1c1a <kernmem+0x8a> - for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ 1bd4: 94ce add s1,s1,s3 1bd6: ff2492e3 bne s1,s2,1bba <kernmem+0x2a> -} 1bda: 60a6 ld ra,72(sp) 1bdc: 6406 ld s0,64(sp) 1bde: 74e2 ld s1,56(sp) @@ -3174,59 +2380,44 @@ outofinodes(char *s) 1be6: 6ae2 ld s5,24(sp) 1be8: 6161 addi sp,sp,80 1bea: 8082 ret - printf("%s: fork failed\n", s); 1bec: 85d6 mv a1,s5 1bee: 00004517 auipc a0,0x4 1bf2: d4a50513 addi a0,a0,-694 # 5938 <malloc+0x9ce> 1bf6: 2c0030ef jal 4eb6 <printf> - exit(1); 1bfa: 4505 li a0,1 1bfc: 68b020ef jal 4a86 <exit> - printf("%s: oops could read %p = %x\n", s, a, *a); 1c00: 0004c683 lbu a3,0(s1) 1c04: 8626 mv a2,s1 1c06: 85d6 mv a1,s5 1c08: 00004517 auipc a0,0x4 1c0c: 00050513 mv a0,a0 1c10: 2a6030ef jal 4eb6 <printf> - exit(1); 1c14: 4505 li a0,1 1c16: 671020ef jal 4a86 <exit> - exit(1); 1c1a: 4505 li a0,1 1c1c: 66b020ef jal 4a86 <exit> 0000000000001c20 <MAXVAplus>: -{ 1c20: 7179 addi sp,sp,-48 1c22: f406 sd ra,40(sp) 1c24: f022 sd s0,32(sp) 1c26: 1800 addi s0,sp,48 - volatile uint64 a = MAXVA; 1c28: 4785 li a5,1 1c2a: 179a slli a5,a5,0x26 1c2c: fcf43c23 sd a5,-40(s0) - for( ; a != 0; a <<= 1){ 1c30: fd843783 ld a5,-40(s0) 1c34: cf85 beqz a5,1c6c <MAXVAplus+0x4c> 1c36: ec26 sd s1,24(sp) 1c38: e84a sd s2,16(sp) 1c3a: 892a mv s2,a0 - if(xstatus != -1) // did kernel kill child? 1c3c: 54fd li s1,-1 - pid = fork(); 1c3e: 641020ef jal 4a7e <fork> - if(pid < 0){ 1c42: 02054963 bltz a0,1c74 <MAXVAplus+0x54> - if(pid == 0){ 1c46: c129 beqz a0,1c88 <MAXVAplus+0x68> - wait(&xstatus); 1c48: fd440513 addi a0,s0,-44 1c4c: 643020ef jal 4a8e <wait> - if(xstatus != -1) // did kernel kill child? 1c50: fd442783 lw a5,-44(s0) 1c54: 04979c63 bne a5,s1,1cac <MAXVAplus+0x8c> - for( ; a != 0; a <<= 1){ 1c58: fd843783 ld a5,-40(s0) 1c5c: 0786 slli a5,a5,0x1 1c5e: fcf43c23 sd a5,-40(s0) @@ -3234,67 +2425,46 @@ outofinodes(char *s) 1c66: ffe1 bnez a5,1c3e <MAXVAplus+0x1e> 1c68: 64e2 ld s1,24(sp) 1c6a: 6942 ld s2,16(sp) -} 1c6c: 70a2 ld ra,40(sp) 1c6e: 7402 ld s0,32(sp) 1c70: 6145 addi sp,sp,48 1c72: 8082 ret - printf("%s: fork failed\n", s); 1c74: 85ca mv a1,s2 1c76: 00004517 auipc a0,0x4 1c7a: cc250513 addi a0,a0,-830 # 5938 <malloc+0x9ce> 1c7e: 238030ef jal 4eb6 <printf> - exit(1); 1c82: 4505 li a0,1 1c84: 603020ef jal 4a86 <exit> - *(char*)a = 99; 1c88: fd843783 ld a5,-40(s0) 1c8c: 06300713 li a4,99 1c90: 00e78023 sb a4,0(a5) - printf("%s: oops wrote %p\n", s, (void*)a); 1c94: fd843603 ld a2,-40(s0) 1c98: 85ca mv a1,s2 1c9a: 00004517 auipc a0,0x4 1c9e: f8e50513 addi a0,a0,-114 # 5c28 <malloc+0xcbe> 1ca2: 214030ef jal 4eb6 <printf> - exit(1); 1ca6: 4505 li a0,1 1ca8: 5df020ef jal 4a86 <exit> - exit(1); 1cac: 4505 li a0,1 1cae: 5d9020ef jal 4a86 <exit> 0000000000001cb2 <stacktest>: -{ 1cb2: 7179 addi sp,sp,-48 1cb4: f406 sd ra,40(sp) 1cb6: f022 sd s0,32(sp) 1cb8: ec26 sd s1,24(sp) 1cba: 1800 addi s0,sp,48 1cbc: 84aa mv s1,a0 - pid = fork(); 1cbe: 5c1020ef jal 4a7e <fork> - if(pid == 0) { 1cc2: cd11 beqz a0,1cde <stacktest+0x2c> - } else if(pid < 0){ 1cc4: 02054c63 bltz a0,1cfc <stacktest+0x4a> - wait(&xstatus); 1cc8: fdc40513 addi a0,s0,-36 1ccc: 5c3020ef jal 4a8e <wait> - if(xstatus == -1) // kernel killed child? 1cd0: fdc42503 lw a0,-36(s0) 1cd4: 57fd li a5,-1 1cd6: 02f50d63 beq a0,a5,1d10 <stacktest+0x5e> - exit(xstatus); 1cda: 5ad020ef jal 4a86 <exit> - -static inline uint64 -r_sp() -{ - uint64 x; - asm volatile("mv %0, sp" : "=r" (x) ); 1cde: 870a mv a4,sp - printf("%s: stacktest: read below stack %d\n", s, *sp); 1ce0: 77fd lui a5,0xfffff 1ce2: 97ba add a5,a5,a4 1ce4: 0007c603 lbu a2,0(a5) # fffffffffffff000 <base+0xfffffffffffef388> @@ -3302,23 +2472,18 @@ r_sp() 1cea: 00004517 auipc a0,0x4 1cee: f5650513 addi a0,a0,-170 # 5c40 <malloc+0xcd6> 1cf2: 1c4030ef jal 4eb6 <printf> - exit(1); 1cf6: 4505 li a0,1 1cf8: 58f020ef jal 4a86 <exit> - printf("%s: fork failed\n", s); 1cfc: 85a6 mv a1,s1 1cfe: 00004517 auipc a0,0x4 1d02: c3a50513 addi a0,a0,-966 # 5938 <malloc+0x9ce> 1d06: 1b0030ef jal 4eb6 <printf> - exit(1); 1d0a: 4505 li a0,1 1d0c: 57b020ef jal 4a86 <exit> - exit(0); 1d10: 4501 li a0,0 1d12: 575020ef jal 4a86 <exit> 0000000000001d16 <nowrite>: -{ 1d16: 7159 addi sp,sp,-112 1d18: f486 sd ra,104(sp) 1d1a: f0a2 sd s0,96(sp) @@ -3327,7 +2492,6 @@ r_sp() 1d20: e4ce sd s3,72(sp) 1d22: 1880 addi s0,sp,112 1d24: 89aa mv s3,a0 - uint64 addrs[] = { 0, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, 1d26: 00005797 auipc a5,0x5 1d2a: 6e278793 addi a5,a5,1762 # 7408 <malloc+0x249e> 1d2e: 7788 ld a0,40(a5) @@ -3342,57 +2506,41 @@ r_sp() 1d46: fad43823 sd a3,-80(s0) 1d4a: fae43c23 sd a4,-72(s0) 1d4e: fcf43023 sd a5,-64(s0) - for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ 1d52: 4481 li s1,0 1d54: 4919 li s2,6 - pid = fork(); 1d56: 529020ef jal 4a7e <fork> - if(pid == 0) { 1d5a: c105 beqz a0,1d7a <nowrite+0x64> - } else if(pid < 0){ 1d5c: 04054263 bltz a0,1da0 <nowrite+0x8a> - wait(&xstatus); 1d60: fcc40513 addi a0,s0,-52 1d64: 52b020ef jal 4a8e <wait> - if(xstatus == 0){ 1d68: fcc42783 lw a5,-52(s0) 1d6c: c7a1 beqz a5,1db4 <nowrite+0x9e> - for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ 1d6e: 2485 addiw s1,s1,1 1d70: ff2493e3 bne s1,s2,1d56 <nowrite+0x40> - exit(0); 1d74: 4501 li a0,0 1d76: 511020ef jal 4a86 <exit> - volatile int *addr = (int *) addrs[ai]; 1d7a: 048e slli s1,s1,0x3 1d7c: fd048793 addi a5,s1,-48 1d80: 008784b3 add s1,a5,s0 1d84: fc84b603 ld a2,-56(s1) - *addr = 10; 1d88: 47a9 li a5,10 1d8a: c21c sw a5,0(a2) - printf("%s: write to %p did not fail!\n", s, addr); 1d8c: 85ce mv a1,s3 1d8e: 00004517 auipc a0,0x4 1d92: eda50513 addi a0,a0,-294 # 5c68 <malloc+0xcfe> 1d96: 120030ef jal 4eb6 <printf> - exit(0); 1d9a: 4501 li a0,0 1d9c: 4eb020ef jal 4a86 <exit> - printf("%s: fork failed\n", s); 1da0: 85ce mv a1,s3 1da2: 00004517 auipc a0,0x4 1da6: b9650513 addi a0,a0,-1130 # 5938 <malloc+0x9ce> 1daa: 10c030ef jal 4eb6 <printf> - exit(1); 1dae: 4505 li a0,1 1db0: 4d7020ef jal 4a86 <exit> - exit(1); 1db4: 4505 li a0,1 1db6: 4d1020ef jal 4a86 <exit> 0000000000001dba <manywrites>: -{ 1dba: 711d addi sp,sp,-96 1dbc: ec86 sd ra,88(sp) 1dbe: e8a2 sd s0,80(sp) @@ -3402,420 +2550,311 @@ r_sp() 1dc6: f456 sd s5,40(sp) 1dc8: 1080 addi s0,sp,96 1dca: 8aaa mv s5,a0 - for(int ci = 0; ci < nchildren; ci++){ 1dcc: 4981 li s3,0 1dce: 4911 li s2,4 - int pid = fork(); 1dd0: 4af020ef jal 4a7e <fork> 1dd4: 84aa mv s1,a0 - if(pid < 0){ 1dd6: 02054963 bltz a0,1e08 <manywrites+0x4e> - if(pid == 0){ 1dda: c139 beqz a0,1e20 <manywrites+0x66> - for(int ci = 0; ci < nchildren; ci++){ 1ddc: 2985 addiw s3,s3,1 1dde: ff2999e3 bne s3,s2,1dd0 <manywrites+0x16> 1de2: f852 sd s4,48(sp) 1de4: f05a sd s6,32(sp) 1de6: ec5e sd s7,24(sp) 1de8: 4491 li s1,4 - int st = 0; 1dea: fa042423 sw zero,-88(s0) - wait(&st); 1dee: fa840513 addi a0,s0,-88 1df2: 49d020ef jal 4a8e <wait> - if(st != 0) 1df6: fa842503 lw a0,-88(s0) 1dfa: 0c051863 bnez a0,1eca <manywrites+0x110> - for(int ci = 0; ci < nchildren; ci++){ 1dfe: 34fd addiw s1,s1,-1 1e00: f4ed bnez s1,1dea <manywrites+0x30> - exit(0); 1e02: 4501 li a0,0 1e04: 483020ef jal 4a86 <exit> 1e08: f852 sd s4,48(sp) 1e0a: f05a sd s6,32(sp) 1e0c: ec5e sd s7,24(sp) - printf("fork failed\n"); 1e0e: 00005517 auipc a0,0x5 1e12: 09a50513 addi a0,a0,154 # 6ea8 <malloc+0x1f3e> 1e16: 0a0030ef jal 4eb6 <printf> - exit(1); 1e1a: 4505 li a0,1 1e1c: 46b020ef jal 4a86 <exit> 1e20: f852 sd s4,48(sp) 1e22: f05a sd s6,32(sp) 1e24: ec5e sd s7,24(sp) - name[0] = 'b'; 1e26: 06200793 li a5,98 1e2a: faf40423 sb a5,-88(s0) - name[1] = 'a' + ci; 1e2e: 0619879b addiw a5,s3,97 1e32: faf404a3 sb a5,-87(s0) - name[2] = '\0'; 1e36: fa040523 sb zero,-86(s0) - unlink(name); 1e3a: fa840513 addi a0,s0,-88 1e3e: 499020ef jal 4ad6 <unlink> 1e42: 4bf9 li s7,30 - int cc = write(fd, buf, sz); 1e44: 0000bb17 auipc s6,0xb 1e48: e34b0b13 addi s6,s6,-460 # cc78 <buf> - for(int i = 0; i < ci+1; i++){ 1e4c: 8a26 mv s4,s1 1e4e: 0209c863 bltz s3,1e7e <manywrites+0xc4> - int fd = open(name, O_CREATE | O_RDWR); 1e52: 20200593 li a1,514 1e56: fa840513 addi a0,s0,-88 1e5a: 46d020ef jal 4ac6 <open> 1e5e: 892a mv s2,a0 - if(fd < 0){ 1e60: 02054d63 bltz a0,1e9a <manywrites+0xe0> - int cc = write(fd, buf, sz); 1e64: 660d lui a2,0x3 1e66: 85da mv a1,s6 1e68: 43f020ef jal 4aa6 <write> - if(cc != sz){ 1e6c: 678d lui a5,0x3 1e6e: 04f51263 bne a0,a5,1eb2 <manywrites+0xf8> - close(fd); 1e72: 854a mv a0,s2 1e74: 43b020ef jal 4aae <close> - for(int i = 0; i < ci+1; i++){ 1e78: 2a05 addiw s4,s4,1 1e7a: fd49dce3 bge s3,s4,1e52 <manywrites+0x98> - unlink(name); 1e7e: fa840513 addi a0,s0,-88 1e82: 455020ef jal 4ad6 <unlink> - for(int iters = 0; iters < howmany; iters++){ 1e86: 3bfd addiw s7,s7,-1 1e88: fc0b92e3 bnez s7,1e4c <manywrites+0x92> - unlink(name); 1e8c: fa840513 addi a0,s0,-88 1e90: 447020ef jal 4ad6 <unlink> - exit(0); 1e94: 4501 li a0,0 1e96: 3f1020ef jal 4a86 <exit> - printf("%s: cannot create %s\n", s, name); 1e9a: fa840613 addi a2,s0,-88 1e9e: 85d6 mv a1,s5 1ea0: 00004517 auipc a0,0x4 1ea4: de850513 addi a0,a0,-536 # 5c88 <malloc+0xd1e> 1ea8: 00e030ef jal 4eb6 <printf> - exit(1); 1eac: 4505 li a0,1 1eae: 3d9020ef jal 4a86 <exit> - printf("%s: write(%d) ret %d\n", s, sz, cc); 1eb2: 86aa mv a3,a0 1eb4: 660d lui a2,0x3 1eb6: 85d6 mv a1,s5 1eb8: 00003517 auipc a0,0x3 1ebc: 2c050513 addi a0,a0,704 # 5178 <malloc+0x20e> 1ec0: 7f7020ef jal 4eb6 <printf> - exit(1); 1ec4: 4505 li a0,1 1ec6: 3c1020ef jal 4a86 <exit> - exit(st); 1eca: 3bd020ef jal 4a86 <exit> 0000000000001ece <copyinstr3>: -{ 1ece: 7179 addi sp,sp,-48 1ed0: f406 sd ra,40(sp) 1ed2: f022 sd s0,32(sp) 1ed4: ec26 sd s1,24(sp) 1ed6: 1800 addi s0,sp,48 - sbrk(8192); 1ed8: 6509 lui a0,0x2 1eda: 435020ef jal 4b0e <sbrk> - uint64 top = (uint64) sbrk(0); 1ede: 4501 li a0,0 1ee0: 42f020ef jal 4b0e <sbrk> - if((top % PGSIZE) != 0){ 1ee4: 03451793 slli a5,a0,0x34 1ee8: e7bd bnez a5,1f56 <copyinstr3+0x88> - top = (uint64) sbrk(0); 1eea: 4501 li a0,0 1eec: 423020ef jal 4b0e <sbrk> - if(top % PGSIZE){ 1ef0: 03451793 slli a5,a0,0x34 1ef4: ebad bnez a5,1f66 <copyinstr3+0x98> - char *b = (char *) (top - 1); 1ef6: fff50493 addi s1,a0,-1 # 1fff <rwsbrk+0x2d> - *b = 'x'; 1efa: 07800793 li a5,120 1efe: fef50fa3 sb a5,-1(a0) - int ret = unlink(b); 1f02: 8526 mv a0,s1 1f04: 3d3020ef jal 4ad6 <unlink> - if(ret != -1){ 1f08: 57fd li a5,-1 1f0a: 06f51763 bne a0,a5,1f78 <copyinstr3+0xaa> - int fd = open(b, O_CREATE | O_WRONLY); 1f0e: 20100593 li a1,513 1f12: 8526 mv a0,s1 1f14: 3b3020ef jal 4ac6 <open> - if(fd != -1){ 1f18: 57fd li a5,-1 1f1a: 06f51a63 bne a0,a5,1f8e <copyinstr3+0xc0> - ret = link(b, b); 1f1e: 85a6 mv a1,s1 1f20: 8526 mv a0,s1 1f22: 3c5020ef jal 4ae6 <link> - if(ret != -1){ 1f26: 57fd li a5,-1 1f28: 06f51e63 bne a0,a5,1fa4 <copyinstr3+0xd6> - char *args[] = { "xx", 0 }; 1f2c: 00005797 auipc a5,0x5 1f30: a5c78793 addi a5,a5,-1444 # 6988 <malloc+0x1a1e> 1f34: fcf43823 sd a5,-48(s0) 1f38: fc043c23 sd zero,-40(s0) - ret = exec(b, args); 1f3c: fd040593 addi a1,s0,-48 1f40: 8526 mv a0,s1 1f42: 37d020ef jal 4abe <exec> - if(ret != -1){ 1f46: 57fd li a5,-1 1f48: 06f51a63 bne a0,a5,1fbc <copyinstr3+0xee> -} 1f4c: 70a2 ld ra,40(sp) 1f4e: 7402 ld s0,32(sp) 1f50: 64e2 ld s1,24(sp) 1f52: 6145 addi sp,sp,48 1f54: 8082 ret - sbrk(PGSIZE - (top % PGSIZE)); 1f56: 0347d513 srli a0,a5,0x34 1f5a: 6785 lui a5,0x1 1f5c: 40a7853b subw a0,a5,a0 1f60: 3af020ef jal 4b0e <sbrk> 1f64: b759 j 1eea <copyinstr3+0x1c> - printf("oops\n"); 1f66: 00004517 auipc a0,0x4 1f6a: d3a50513 addi a0,a0,-710 # 5ca0 <malloc+0xd36> 1f6e: 749020ef jal 4eb6 <printf> - exit(1); 1f72: 4505 li a0,1 1f74: 313020ef jal 4a86 <exit> - printf("unlink(%s) returned %d, not -1\n", b, ret); 1f78: 862a mv a2,a0 1f7a: 85a6 mv a1,s1 1f7c: 00004517 auipc a0,0x4 1f80: 8dc50513 addi a0,a0,-1828 # 5858 <malloc+0x8ee> 1f84: 733020ef jal 4eb6 <printf> - exit(1); 1f88: 4505 li a0,1 1f8a: 2fd020ef jal 4a86 <exit> - printf("open(%s) returned %d, not -1\n", b, fd); 1f8e: 862a mv a2,a0 1f90: 85a6 mv a1,s1 1f92: 00004517 auipc a0,0x4 1f96: 8e650513 addi a0,a0,-1818 # 5878 <malloc+0x90e> 1f9a: 71d020ef jal 4eb6 <printf> - exit(1); 1f9e: 4505 li a0,1 1fa0: 2e7020ef jal 4a86 <exit> - printf("link(%s, %s) returned %d, not -1\n", b, b, ret); 1fa4: 86aa mv a3,a0 1fa6: 8626 mv a2,s1 1fa8: 85a6 mv a1,s1 1faa: 00004517 auipc a0,0x4 1fae: 8ee50513 addi a0,a0,-1810 # 5898 <malloc+0x92e> 1fb2: 705020ef jal 4eb6 <printf> - exit(1); 1fb6: 4505 li a0,1 1fb8: 2cf020ef jal 4a86 <exit> - printf("exec(%s) returned %d, not -1\n", b, fd); 1fbc: 567d li a2,-1 1fbe: 85a6 mv a1,s1 1fc0: 00004517 auipc a0,0x4 1fc4: 90050513 addi a0,a0,-1792 # 58c0 <malloc+0x956> 1fc8: 6ef020ef jal 4eb6 <printf> - exit(1); 1fcc: 4505 li a0,1 1fce: 2b9020ef jal 4a86 <exit> 0000000000001fd2 <rwsbrk>: -{ 1fd2: 1101 addi sp,sp,-32 1fd4: ec06 sd ra,24(sp) 1fd6: e822 sd s0,16(sp) 1fd8: 1000 addi s0,sp,32 - uint64 a = (uint64) sbrk(8192); 1fda: 6509 lui a0,0x2 1fdc: 333020ef jal 4b0e <sbrk> - if(a == 0xffffffffffffffffLL) { 1fe0: 57fd li a5,-1 1fe2: 04f50a63 beq a0,a5,2036 <rwsbrk+0x64> 1fe6: e426 sd s1,8(sp) 1fe8: 84aa mv s1,a0 - if ((uint64) sbrk(-8192) == 0xffffffffffffffffLL) { 1fea: 7579 lui a0,0xffffe 1fec: 323020ef jal 4b0e <sbrk> 1ff0: 57fd li a5,-1 1ff2: 04f50d63 beq a0,a5,204c <rwsbrk+0x7a> 1ff6: e04a sd s2,0(sp) - fd = open("rwsbrk", O_CREATE|O_WRONLY); 1ff8: 20100593 li a1,513 1ffc: 00004517 auipc a0,0x4 2000: ce450513 addi a0,a0,-796 # 5ce0 <malloc+0xd76> 2004: 2c3020ef jal 4ac6 <open> 2008: 892a mv s2,a0 - if(fd < 0){ 200a: 04054b63 bltz a0,2060 <rwsbrk+0x8e> - n = write(fd, (void*)(a+4096), 1024); 200e: 6785 lui a5,0x1 2010: 94be add s1,s1,a5 2012: 40000613 li a2,1024 2016: 85a6 mv a1,s1 2018: 28f020ef jal 4aa6 <write> 201c: 862a mv a2,a0 - if(n >= 0){ 201e: 04054a63 bltz a0,2072 <rwsbrk+0xa0> - printf("write(fd, %p, 1024) returned %d, not -1\n", (void*)a+4096, n); 2022: 85a6 mv a1,s1 2024: 00004517 auipc a0,0x4 2028: cdc50513 addi a0,a0,-804 # 5d00 <malloc+0xd96> 202c: 68b020ef jal 4eb6 <printf> - exit(1); 2030: 4505 li a0,1 2032: 255020ef jal 4a86 <exit> 2036: e426 sd s1,8(sp) 2038: e04a sd s2,0(sp) - printf("sbrk(rwsbrk) failed\n"); 203a: 00004517 auipc a0,0x4 203e: c6e50513 addi a0,a0,-914 # 5ca8 <malloc+0xd3e> 2042: 675020ef jal 4eb6 <printf> - exit(1); 2046: 4505 li a0,1 2048: 23f020ef jal 4a86 <exit> 204c: e04a sd s2,0(sp) - printf("sbrk(rwsbrk) shrink failed\n"); 204e: 00004517 auipc a0,0x4 2052: c7250513 addi a0,a0,-910 # 5cc0 <malloc+0xd56> 2056: 661020ef jal 4eb6 <printf> - exit(1); 205a: 4505 li a0,1 205c: 22b020ef jal 4a86 <exit> - printf("open(rwsbrk) failed\n"); 2060: 00004517 auipc a0,0x4 2064: c8850513 addi a0,a0,-888 # 5ce8 <malloc+0xd7e> 2068: 64f020ef jal 4eb6 <printf> - exit(1); 206c: 4505 li a0,1 206e: 219020ef jal 4a86 <exit> - close(fd); 2072: 854a mv a0,s2 2074: 23b020ef jal 4aae <close> - unlink("rwsbrk"); 2078: 00004517 auipc a0,0x4 207c: c6850513 addi a0,a0,-920 # 5ce0 <malloc+0xd76> 2080: 257020ef jal 4ad6 <unlink> - fd = open("README", O_RDONLY); 2084: 4581 li a1,0 2086: 00003517 auipc a0,0x3 208a: 1fa50513 addi a0,a0,506 # 5280 <malloc+0x316> 208e: 239020ef jal 4ac6 <open> 2092: 892a mv s2,a0 - if(fd < 0){ 2094: 02054363 bltz a0,20ba <rwsbrk+0xe8> - n = read(fd, (void*)(a+4096), 10); 2098: 4629 li a2,10 209a: 85a6 mv a1,s1 209c: 203020ef jal 4a9e <read> 20a0: 862a mv a2,a0 - if(n >= 0){ 20a2: 02054563 bltz a0,20cc <rwsbrk+0xfa> - printf("read(fd, %p, 10) returned %d, not -1\n", (void*)a+4096, n); 20a6: 85a6 mv a1,s1 20a8: 00004517 auipc a0,0x4 20ac: c8850513 addi a0,a0,-888 # 5d30 <malloc+0xdc6> 20b0: 607020ef jal 4eb6 <printf> - exit(1); 20b4: 4505 li a0,1 20b6: 1d1020ef jal 4a86 <exit> - printf("open(rwsbrk) failed\n"); 20ba: 00004517 auipc a0,0x4 20be: c2e50513 addi a0,a0,-978 # 5ce8 <malloc+0xd7e> 20c2: 5f5020ef jal 4eb6 <printf> - exit(1); 20c6: 4505 li a0,1 20c8: 1bf020ef jal 4a86 <exit> - close(fd); 20cc: 854a mv a0,s2 20ce: 1e1020ef jal 4aae <close> - exit(0); 20d2: 4501 li a0,0 20d4: 1b3020ef jal 4a86 <exit> 00000000000020d8 <sbrkbasic>: -{ 20d8: 7139 addi sp,sp,-64 20da: fc06 sd ra,56(sp) 20dc: f822 sd s0,48(sp) 20de: ec4e sd s3,24(sp) 20e0: 0080 addi s0,sp,64 20e2: 89aa mv s3,a0 - pid = fork(); 20e4: 19b020ef jal 4a7e <fork> - if(pid < 0){ 20e8: 02054b63 bltz a0,211e <sbrkbasic+0x46> - if(pid == 0){ 20ec: e939 bnez a0,2142 <sbrkbasic+0x6a> - a = sbrk(TOOMUCH); 20ee: 40000537 lui a0,0x40000 20f2: 21d020ef jal 4b0e <sbrk> - if(a == (char*)0xffffffffffffffffL){ 20f6: 57fd li a5,-1 20f8: 02f50f63 beq a0,a5,2136 <sbrkbasic+0x5e> 20fc: f426 sd s1,40(sp) 20fe: f04a sd s2,32(sp) 2100: e852 sd s4,16(sp) - for(b = a; b < a+TOOMUCH; b += 4096){ 2102: 400007b7 lui a5,0x40000 2106: 97aa add a5,a5,a0 - *b = 99; 2108: 06300693 li a3,99 - for(b = a; b < a+TOOMUCH; b += 4096){ 210c: 6705 lui a4,0x1 - *b = 99; 210e: 00d50023 sb a3,0(a0) # 40000000 <base+0x3fff0388> - for(b = a; b < a+TOOMUCH; b += 4096){ 2112: 953a add a0,a0,a4 2114: fef51de3 bne a0,a5,210e <sbrkbasic+0x36> - exit(1); 2118: 4505 li a0,1 211a: 16d020ef jal 4a86 <exit> 211e: f426 sd s1,40(sp) 2120: f04a sd s2,32(sp) 2122: e852 sd s4,16(sp) - printf("fork failed in sbrkbasic\n"); 2124: 00004517 auipc a0,0x4 2128: c3450513 addi a0,a0,-972 # 5d58 <malloc+0xdee> 212c: 58b020ef jal 4eb6 <printf> - exit(1); 2130: 4505 li a0,1 2132: 155020ef jal 4a86 <exit> 2136: f426 sd s1,40(sp) 2138: f04a sd s2,32(sp) 213a: e852 sd s4,16(sp) - exit(0); 213c: 4501 li a0,0 213e: 149020ef jal 4a86 <exit> - wait(&xstatus); 2142: fcc40513 addi a0,s0,-52 2146: 149020ef jal 4a8e <wait> - if(xstatus == 1){ 214a: fcc42703 lw a4,-52(s0) 214e: 4785 li a5,1 2150: 00f70e63 beq a4,a5,216c <sbrkbasic+0x94> 2154: f426 sd s1,40(sp) 2156: f04a sd s2,32(sp) 2158: e852 sd s4,16(sp) - a = sbrk(0); 215a: 4501 li a0,0 215c: 1b3020ef jal 4b0e <sbrk> 2160: 84aa mv s1,a0 - for(i = 0; i < 5000; i++){ 2162: 4901 li s2,0 2164: 6a05 lui s4,0x1 2166: 388a0a13 addi s4,s4,904 # 1388 <exectest+0x46> @@ -3823,51 +2862,36 @@ r_sp() 216c: f426 sd s1,40(sp) 216e: f04a sd s2,32(sp) 2170: e852 sd s4,16(sp) - printf("%s: too much memory allocated!\n", s); 2172: 85ce mv a1,s3 2174: 00004517 auipc a0,0x4 2178: c0450513 addi a0,a0,-1020 # 5d78 <malloc+0xe0e> 217c: 53b020ef jal 4eb6 <printf> - exit(1); 2180: 4505 li a0,1 2182: 105020ef jal 4a86 <exit> 2186: 84be mv s1,a5 - b = sbrk(1); 2188: 4505 li a0,1 218a: 185020ef jal 4b0e <sbrk> - if(b != a){ 218e: 04951263 bne a0,s1,21d2 <sbrkbasic+0xfa> - *b = 1; 2192: 4785 li a5,1 2194: 00f48023 sb a5,0(s1) - a = b + 1; 2198: 00148793 addi a5,s1,1 - for(i = 0; i < 5000; i++){ 219c: 2905 addiw s2,s2,1 219e: ff4914e3 bne s2,s4,2186 <sbrkbasic+0xae> - pid = fork(); 21a2: 0dd020ef jal 4a7e <fork> 21a6: 892a mv s2,a0 - if(pid < 0){ 21a8: 04054263 bltz a0,21ec <sbrkbasic+0x114> - c = sbrk(1); 21ac: 4505 li a0,1 21ae: 161020ef jal 4b0e <sbrk> - c = sbrk(1); 21b2: 4505 li a0,1 21b4: 15b020ef jal 4b0e <sbrk> - if(c != a + 1){ 21b8: 0489 addi s1,s1,2 21ba: 04a48363 beq s1,a0,2200 <sbrkbasic+0x128> - printf("%s: sbrk test failed post-fork\n", s); 21be: 85ce mv a1,s3 21c0: 00004517 auipc a0,0x4 21c4: c1850513 addi a0,a0,-1000 # 5dd8 <malloc+0xe6e> 21c8: 4ef020ef jal 4eb6 <printf> - exit(1); 21cc: 4505 li a0,1 21ce: 0b9020ef jal 4a86 <exit> - printf("%s: sbrk test failed %d %p %p\n", s, i, a, b); 21d2: 872a mv a4,a0 21d4: 86a6 mv a3,s1 21d6: 864a mv a2,s2 @@ -3875,31 +2899,23 @@ r_sp() 21da: 00004517 auipc a0,0x4 21de: bbe50513 addi a0,a0,-1090 # 5d98 <malloc+0xe2e> 21e2: 4d5020ef jal 4eb6 <printf> - exit(1); 21e6: 4505 li a0,1 21e8: 09f020ef jal 4a86 <exit> - printf("%s: sbrk test fork failed\n", s); 21ec: 85ce mv a1,s3 21ee: 00004517 auipc a0,0x4 21f2: bca50513 addi a0,a0,-1078 # 5db8 <malloc+0xe4e> 21f6: 4c1020ef jal 4eb6 <printf> - exit(1); 21fa: 4505 li a0,1 21fc: 08b020ef jal 4a86 <exit> - if(pid == 0) 2200: 00091563 bnez s2,220a <sbrkbasic+0x132> - exit(0); 2204: 4501 li a0,0 2206: 081020ef jal 4a86 <exit> - wait(&xstatus); 220a: fcc40513 addi a0,s0,-52 220e: 081020ef jal 4a8e <wait> - exit(xstatus); 2212: fcc42503 lw a0,-52(s0) 2216: 071020ef jal 4a86 <exit> 000000000000221a <sbrkmuch>: -{ 221a: 7179 addi sp,sp,-48 221c: f406 sd ra,40(sp) 221e: f022 sd s0,32(sp) @@ -3909,88 +2925,64 @@ r_sp() 2226: e052 sd s4,0(sp) 2228: 1800 addi s0,sp,48 222a: 89aa mv s3,a0 - oldbrk = sbrk(0); 222c: 4501 li a0,0 222e: 0e1020ef jal 4b0e <sbrk> 2232: 892a mv s2,a0 - a = sbrk(0); 2234: 4501 li a0,0 2236: 0d9020ef jal 4b0e <sbrk> 223a: 84aa mv s1,a0 - p = sbrk(amt); 223c: 06400537 lui a0,0x6400 2240: 9d05 subw a0,a0,s1 2242: 0cd020ef jal 4b0e <sbrk> - if (p != a) { 2246: 0aa49463 bne s1,a0,22ee <sbrkmuch+0xd4> - char *eee = sbrk(0); 224a: 4501 li a0,0 224c: 0c3020ef jal 4b0e <sbrk> 2250: 87aa mv a5,a0 - for(char *pp = a; pp < eee; pp += 4096) 2252: 00a4f963 bgeu s1,a0,2264 <sbrkmuch+0x4a> - *pp = 1; 2256: 4685 li a3,1 - for(char *pp = a; pp < eee; pp += 4096) 2258: 6705 lui a4,0x1 - *pp = 1; 225a: 00d48023 sb a3,0(s1) - for(char *pp = a; pp < eee; pp += 4096) 225e: 94ba add s1,s1,a4 2260: fef4ede3 bltu s1,a5,225a <sbrkmuch+0x40> - *lastaddr = 99; 2264: 064007b7 lui a5,0x6400 2268: 06300713 li a4,99 226c: fee78fa3 sb a4,-1(a5) # 63fffff <base+0x63f0387> - a = sbrk(0); 2270: 4501 li a0,0 2272: 09d020ef jal 4b0e <sbrk> 2276: 84aa mv s1,a0 - c = sbrk(-PGSIZE); 2278: 757d lui a0,0xfffff 227a: 095020ef jal 4b0e <sbrk> - if(c == (char*)0xffffffffffffffffL){ 227e: 57fd li a5,-1 2280: 08f50163 beq a0,a5,2302 <sbrkmuch+0xe8> - c = sbrk(0); 2284: 4501 li a0,0 2286: 089020ef jal 4b0e <sbrk> - if(c != a - PGSIZE){ 228a: 77fd lui a5,0xfffff 228c: 97a6 add a5,a5,s1 228e: 08f51463 bne a0,a5,2316 <sbrkmuch+0xfc> - a = sbrk(0); 2292: 4501 li a0,0 2294: 07b020ef jal 4b0e <sbrk> 2298: 84aa mv s1,a0 - c = sbrk(PGSIZE); 229a: 6505 lui a0,0x1 229c: 073020ef jal 4b0e <sbrk> 22a0: 8a2a mv s4,a0 - if(c != a || sbrk(0) != a + PGSIZE){ 22a2: 08a49663 bne s1,a0,232e <sbrkmuch+0x114> 22a6: 4501 li a0,0 22a8: 067020ef jal 4b0e <sbrk> 22ac: 6785 lui a5,0x1 22ae: 97a6 add a5,a5,s1 22b0: 06f51f63 bne a0,a5,232e <sbrkmuch+0x114> - if(*lastaddr == 99){ 22b4: 064007b7 lui a5,0x6400 22b8: fff7c703 lbu a4,-1(a5) # 63fffff <base+0x63f0387> 22bc: 06300793 li a5,99 22c0: 08f70363 beq a4,a5,2346 <sbrkmuch+0x12c> - a = sbrk(0); 22c4: 4501 li a0,0 22c6: 049020ef jal 4b0e <sbrk> 22ca: 84aa mv s1,a0 - c = sbrk(-(sbrk(0) - oldbrk)); 22cc: 4501 li a0,0 22ce: 041020ef jal 4b0e <sbrk> 22d2: 40a9053b subw a0,s2,a0 22d6: 039020ef jal 4b0e <sbrk> - if(c != a){ 22da: 08a49063 bne s1,a0,235a <sbrkmuch+0x140> -} 22de: 70a2 ld ra,40(sp) 22e0: 7402 ld s0,32(sp) 22e2: 64e2 ld s1,24(sp) @@ -3999,63 +2991,50 @@ r_sp() 22e8: 6a02 ld s4,0(sp) 22ea: 6145 addi sp,sp,48 22ec: 8082 ret - printf("%s: sbrk test failed to grow big address space; enough phys mem?\n", s); 22ee: 85ce mv a1,s3 22f0: 00004517 auipc a0,0x4 22f4: b0850513 addi a0,a0,-1272 # 5df8 <malloc+0xe8e> 22f8: 3bf020ef jal 4eb6 <printf> - exit(1); 22fc: 4505 li a0,1 22fe: 788020ef jal 4a86 <exit> - printf("%s: sbrk could not deallocate\n", s); 2302: 85ce mv a1,s3 2304: 00004517 auipc a0,0x4 2308: b3c50513 addi a0,a0,-1220 # 5e40 <malloc+0xed6> 230c: 3ab020ef jal 4eb6 <printf> - exit(1); 2310: 4505 li a0,1 2312: 774020ef jal 4a86 <exit> - printf("%s: sbrk deallocation produced wrong address, a %p c %p\n", s, a, c); 2316: 86aa mv a3,a0 2318: 8626 mv a2,s1 231a: 85ce mv a1,s3 231c: 00004517 auipc a0,0x4 2320: b4450513 addi a0,a0,-1212 # 5e60 <malloc+0xef6> 2324: 393020ef jal 4eb6 <printf> - exit(1); 2328: 4505 li a0,1 232a: 75c020ef jal 4a86 <exit> - printf("%s: sbrk re-allocation failed, a %p c %p\n", s, a, c); 232e: 86d2 mv a3,s4 2330: 8626 mv a2,s1 2332: 85ce mv a1,s3 2334: 00004517 auipc a0,0x4 2338: b6c50513 addi a0,a0,-1172 # 5ea0 <malloc+0xf36> 233c: 37b020ef jal 4eb6 <printf> - exit(1); 2340: 4505 li a0,1 2342: 744020ef jal 4a86 <exit> - printf("%s: sbrk de-allocation didn't really deallocate\n", s); 2346: 85ce mv a1,s3 2348: 00004517 auipc a0,0x4 234c: b8850513 addi a0,a0,-1144 # 5ed0 <malloc+0xf66> 2350: 367020ef jal 4eb6 <printf> - exit(1); 2354: 4505 li a0,1 2356: 730020ef jal 4a86 <exit> - printf("%s: sbrk downsize failed, a %p c %p\n", s, a, c); 235a: 86aa mv a3,a0 235c: 8626 mv a2,s1 235e: 85ce mv a1,s3 2360: 00004517 auipc a0,0x4 2364: ba850513 addi a0,a0,-1112 # 5f08 <malloc+0xf9e> 2368: 34f020ef jal 4eb6 <printf> - exit(1); 236c: 4505 li a0,1 236e: 718020ef jal 4a86 <exit> 0000000000002372 <sbrkarg>: -{ 2372: 7179 addi sp,sp,-48 2374: f406 sd ra,40(sp) 2376: f022 sd s0,32(sp) @@ -4064,38 +3043,29 @@ r_sp() 237c: e44e sd s3,8(sp) 237e: 1800 addi s0,sp,48 2380: 89aa mv s3,a0 - a = sbrk(PGSIZE); 2382: 6505 lui a0,0x1 2384: 78a020ef jal 4b0e <sbrk> 2388: 892a mv s2,a0 - fd = open("sbrk", O_CREATE|O_WRONLY); 238a: 20100593 li a1,513 238e: 00004517 auipc a0,0x4 2392: ba250513 addi a0,a0,-1118 # 5f30 <malloc+0xfc6> 2396: 730020ef jal 4ac6 <open> 239a: 84aa mv s1,a0 - unlink("sbrk"); 239c: 00004517 auipc a0,0x4 23a0: b9450513 addi a0,a0,-1132 # 5f30 <malloc+0xfc6> 23a4: 732020ef jal 4ad6 <unlink> - if(fd < 0) { 23a8: 0204c963 bltz s1,23da <sbrkarg+0x68> - if ((n = write(fd, a, PGSIZE)) < 0) { 23ac: 6605 lui a2,0x1 23ae: 85ca mv a1,s2 23b0: 8526 mv a0,s1 23b2: 6f4020ef jal 4aa6 <write> 23b6: 02054c63 bltz a0,23ee <sbrkarg+0x7c> - close(fd); 23ba: 8526 mv a0,s1 23bc: 6f2020ef jal 4aae <close> - a = sbrk(PGSIZE); 23c0: 6505 lui a0,0x1 23c2: 74c020ef jal 4b0e <sbrk> - if(pipe((int *) a) != 0){ 23c6: 6d0020ef jal 4a96 <pipe> 23ca: ed05 bnez a0,2402 <sbrkarg+0x90> -} 23cc: 70a2 ld ra,40(sp) 23ce: 7402 ld s0,32(sp) 23d0: 64e2 ld s1,24(sp) @@ -4103,33 +3073,26 @@ r_sp() 23d4: 69a2 ld s3,8(sp) 23d6: 6145 addi sp,sp,48 23d8: 8082 ret - printf("%s: open sbrk failed\n", s); 23da: 85ce mv a1,s3 23dc: 00004517 auipc a0,0x4 23e0: b5c50513 addi a0,a0,-1188 # 5f38 <malloc+0xfce> 23e4: 2d3020ef jal 4eb6 <printf> - exit(1); 23e8: 4505 li a0,1 23ea: 69c020ef jal 4a86 <exit> - printf("%s: write sbrk failed\n", s); 23ee: 85ce mv a1,s3 23f0: 00004517 auipc a0,0x4 23f4: b6050513 addi a0,a0,-1184 # 5f50 <malloc+0xfe6> 23f8: 2bf020ef jal 4eb6 <printf> - exit(1); 23fc: 4505 li a0,1 23fe: 688020ef jal 4a86 <exit> - printf("%s: pipe() failed\n", s); 2402: 85ce mv a1,s3 2404: 00003517 auipc a0,0x3 2408: 63c50513 addi a0,a0,1596 # 5a40 <malloc+0xad6> 240c: 2ab020ef jal 4eb6 <printf> - exit(1); 2410: 4505 li a0,1 2412: 674020ef jal 4a86 <exit> 0000000000002416 <argptest>: -{ 2416: 1101 addi sp,sp,-32 2418: ec06 sd ra,24(sp) 241a: e822 sd s0,16(sp) @@ -4137,130 +3100,93 @@ r_sp() 241e: e04a sd s2,0(sp) 2420: 1000 addi s0,sp,32 2422: 892a mv s2,a0 - fd = open("init", O_RDONLY); 2424: 4581 li a1,0 2426: 00004517 auipc a0,0x4 242a: b4250513 addi a0,a0,-1214 # 5f68 <malloc+0xffe> 242e: 698020ef jal 4ac6 <open> - if (fd < 0) { 2432: 02054563 bltz a0,245c <argptest+0x46> 2436: 84aa mv s1,a0 - read(fd, sbrk(0) - 1, -1); 2438: 4501 li a0,0 243a: 6d4020ef jal 4b0e <sbrk> 243e: 567d li a2,-1 2440: fff50593 addi a1,a0,-1 2444: 8526 mv a0,s1 2446: 658020ef jal 4a9e <read> - close(fd); 244a: 8526 mv a0,s1 244c: 662020ef jal 4aae <close> -} 2450: 60e2 ld ra,24(sp) 2452: 6442 ld s0,16(sp) 2454: 64a2 ld s1,8(sp) 2456: 6902 ld s2,0(sp) 2458: 6105 addi sp,sp,32 245a: 8082 ret - printf("%s: open failed\n", s); 245c: 85ca mv a1,s2 245e: 00003517 auipc a0,0x3 2462: 4f250513 addi a0,a0,1266 # 5950 <malloc+0x9e6> 2466: 251020ef jal 4eb6 <printf> - exit(1); 246a: 4505 li a0,1 246c: 61a020ef jal 4a86 <exit> 0000000000002470 <sbrkbugs>: -{ 2470: 1141 addi sp,sp,-16 2472: e406 sd ra,8(sp) 2474: e022 sd s0,0(sp) 2476: 0800 addi s0,sp,16 - int pid = fork(); 2478: 606020ef jal 4a7e <fork> - if(pid < 0){ 247c: 00054c63 bltz a0,2494 <sbrkbugs+0x24> - if(pid == 0){ 2480: e11d bnez a0,24a6 <sbrkbugs+0x36> - int sz = (uint64) sbrk(0); 2482: 68c020ef jal 4b0e <sbrk> - sbrk(-sz); 2486: 40a0053b negw a0,a0 248a: 684020ef jal 4b0e <sbrk> - exit(0); 248e: 4501 li a0,0 2490: 5f6020ef jal 4a86 <exit> - printf("fork failed\n"); 2494: 00005517 auipc a0,0x5 2498: a1450513 addi a0,a0,-1516 # 6ea8 <malloc+0x1f3e> 249c: 21b020ef jal 4eb6 <printf> - exit(1); 24a0: 4505 li a0,1 24a2: 5e4020ef jal 4a86 <exit> - wait(0); 24a6: 4501 li a0,0 24a8: 5e6020ef jal 4a8e <wait> - pid = fork(); 24ac: 5d2020ef jal 4a7e <fork> - if(pid < 0){ 24b0: 00054f63 bltz a0,24ce <sbrkbugs+0x5e> - if(pid == 0){ 24b4: e515 bnez a0,24e0 <sbrkbugs+0x70> - int sz = (uint64) sbrk(0); 24b6: 658020ef jal 4b0e <sbrk> - sbrk(-(sz - 3500)); 24ba: 6785 lui a5,0x1 24bc: dac7879b addiw a5,a5,-596 # dac <linktest+0x134> 24c0: 40a7853b subw a0,a5,a0 24c4: 64a020ef jal 4b0e <sbrk> - exit(0); 24c8: 4501 li a0,0 24ca: 5bc020ef jal 4a86 <exit> - printf("fork failed\n"); 24ce: 00005517 auipc a0,0x5 24d2: 9da50513 addi a0,a0,-1574 # 6ea8 <malloc+0x1f3e> 24d6: 1e1020ef jal 4eb6 <printf> - exit(1); 24da: 4505 li a0,1 24dc: 5aa020ef jal 4a86 <exit> - wait(0); 24e0: 4501 li a0,0 24e2: 5ac020ef jal 4a8e <wait> - pid = fork(); 24e6: 598020ef jal 4a7e <fork> - if(pid < 0){ 24ea: 02054263 bltz a0,250e <sbrkbugs+0x9e> - if(pid == 0){ 24ee: e90d bnez a0,2520 <sbrkbugs+0xb0> - sbrk((10*4096 + 2048) - (uint64)sbrk(0)); 24f0: 61e020ef jal 4b0e <sbrk> 24f4: 67ad lui a5,0xb 24f6: 8007879b addiw a5,a5,-2048 # a800 <uninit+0x298> 24fa: 40a7853b subw a0,a5,a0 24fe: 610020ef jal 4b0e <sbrk> - sbrk(-10); 2502: 5559 li a0,-10 2504: 60a020ef jal 4b0e <sbrk> - exit(0); 2508: 4501 li a0,0 250a: 57c020ef jal 4a86 <exit> - printf("fork failed\n"); 250e: 00005517 auipc a0,0x5 2512: 99a50513 addi a0,a0,-1638 # 6ea8 <malloc+0x1f3e> 2516: 1a1020ef jal 4eb6 <printf> - exit(1); 251a: 4505 li a0,1 251c: 56a020ef jal 4a86 <exit> - wait(0); 2520: 4501 li a0,0 2522: 56c020ef jal 4a8e <wait> - exit(0); 2526: 4501 li a0,0 2528: 55e020ef jal 4a86 <exit> 000000000000252c <sbrklast>: -{ 252c: 7179 addi sp,sp,-48 252e: f406 sd ra,40(sp) 2530: f022 sd s0,32(sp) @@ -4269,58 +3195,41 @@ r_sp() 2536: e44e sd s3,8(sp) 2538: e052 sd s4,0(sp) 253a: 1800 addi s0,sp,48 - uint64 top = (uint64) sbrk(0); 253c: 4501 li a0,0 253e: 5d0020ef jal 4b0e <sbrk> - if((top % 4096) != 0) 2542: 03451793 slli a5,a0,0x34 2546: ebad bnez a5,25b8 <sbrklast+0x8c> - sbrk(4096); 2548: 6505 lui a0,0x1 254a: 5c4020ef jal 4b0e <sbrk> - sbrk(10); 254e: 4529 li a0,10 2550: 5be020ef jal 4b0e <sbrk> - sbrk(-20); 2554: 5531 li a0,-20 2556: 5b8020ef jal 4b0e <sbrk> - top = (uint64) sbrk(0); 255a: 4501 li a0,0 255c: 5b2020ef jal 4b0e <sbrk> 2560: 84aa mv s1,a0 - char *p = (char *) (top - 64); 2562: fc050913 addi s2,a0,-64 # fc0 <bigdir+0x11e> - p[0] = 'x'; 2566: 07800a13 li s4,120 256a: fd450023 sb s4,-64(a0) - p[1] = '\0'; 256e: fc0500a3 sb zero,-63(a0) - int fd = open(p, O_RDWR|O_CREATE); 2572: 20200593 li a1,514 2576: 854a mv a0,s2 2578: 54e020ef jal 4ac6 <open> 257c: 89aa mv s3,a0 - write(fd, p, 1); 257e: 4605 li a2,1 2580: 85ca mv a1,s2 2582: 524020ef jal 4aa6 <write> - close(fd); 2586: 854e mv a0,s3 2588: 526020ef jal 4aae <close> - fd = open(p, O_RDWR); 258c: 4589 li a1,2 258e: 854a mv a0,s2 2590: 536020ef jal 4ac6 <open> - p[0] = '\0'; 2594: fc048023 sb zero,-64(s1) - read(fd, p, 1); 2598: 4605 li a2,1 259a: 85ca mv a1,s2 259c: 502020ef jal 4a9e <read> - if(p[0] != 'x') 25a0: fc04c783 lbu a5,-64(s1) 25a4: 03479263 bne a5,s4,25c8 <sbrklast+0x9c> -} 25a8: 70a2 ld ra,40(sp) 25aa: 7402 ld s0,32(sp) 25ac: 64e2 ld s1,24(sp) @@ -4329,42 +3238,34 @@ r_sp() 25b2: 6a02 ld s4,0(sp) 25b4: 6145 addi sp,sp,48 25b6: 8082 ret - sbrk(4096 - (top % 4096)); 25b8: 0347d513 srli a0,a5,0x34 25bc: 6785 lui a5,0x1 25be: 40a7853b subw a0,a5,a0 25c2: 54c020ef jal 4b0e <sbrk> 25c6: b749 j 2548 <sbrklast+0x1c> - exit(1); 25c8: 4505 li a0,1 25ca: 4bc020ef jal 4a86 <exit> 00000000000025ce <sbrk8000>: -{ 25ce: 1141 addi sp,sp,-16 25d0: e406 sd ra,8(sp) 25d2: e022 sd s0,0(sp) 25d4: 0800 addi s0,sp,16 - sbrk(0x80000004); 25d6: 80000537 lui a0,0x80000 25da: 0511 addi a0,a0,4 # ffffffff80000004 <base+0xffffffff7fff038c> 25dc: 532020ef jal 4b0e <sbrk> - volatile char *top = sbrk(0); 25e0: 4501 li a0,0 25e2: 52c020ef jal 4b0e <sbrk> - *(top-1) = *(top-1) + 1; 25e6: fff54783 lbu a5,-1(a0) 25ea: 2785 addiw a5,a5,1 # 1001 <pgbug+0x29> 25ec: 0ff7f793 zext.b a5,a5 25f0: fef50fa3 sb a5,-1(a0) -} 25f4: 60a2 ld ra,8(sp) 25f6: 6402 ld s0,0(sp) 25f8: 0141 addi sp,sp,16 25fa: 8082 ret 00000000000025fc <execout>: -{ 25fc: 715d addi sp,sp,-80 25fe: e486 sd ra,72(sp) 2600: e0a2 sd s0,64(sp) @@ -4373,59 +3274,39 @@ r_sp() 2606: f44e sd s3,40(sp) 2608: f052 sd s4,32(sp) 260a: 0880 addi s0,sp,80 - for(int avail = 0; avail < 15; avail++){ 260c: 4901 li s2,0 260e: 49bd li s3,15 - int pid = fork(); 2610: 46e020ef jal 4a7e <fork> 2614: 84aa mv s1,a0 - if(pid < 0){ 2616: 00054c63 bltz a0,262e <execout+0x32> - } else if(pid == 0){ 261a: c11d beqz a0,2640 <execout+0x44> - wait((int*)0); 261c: 4501 li a0,0 261e: 470020ef jal 4a8e <wait> - for(int avail = 0; avail < 15; avail++){ 2622: 2905 addiw s2,s2,1 2624: ff3916e3 bne s2,s3,2610 <execout+0x14> - exit(0); 2628: 4501 li a0,0 262a: 45c020ef jal 4a86 <exit> - printf("fork failed\n"); 262e: 00005517 auipc a0,0x5 2632: 87a50513 addi a0,a0,-1926 # 6ea8 <malloc+0x1f3e> 2636: 081020ef jal 4eb6 <printf> - exit(1); 263a: 4505 li a0,1 263c: 44a020ef jal 4a86 <exit> - if(a == 0xffffffffffffffffLL) 2640: 59fd li s3,-1 - *(char*)(a + 4096 - 1) = 1; 2642: 4a05 li s4,1 - uint64 a = (uint64) sbrk(4096); 2644: 6505 lui a0,0x1 2646: 4c8020ef jal 4b0e <sbrk> - if(a == 0xffffffffffffffffLL) 264a: 01350763 beq a0,s3,2658 <execout+0x5c> - *(char*)(a + 4096 - 1) = 1; 264e: 6785 lui a5,0x1 2650: 97aa add a5,a5,a0 2652: ff478fa3 sb s4,-1(a5) # fff <pgbug+0x27> - while(1){ 2656: b7fd j 2644 <execout+0x48> - for(int i = 0; i < avail; i++) 2658: 01205863 blez s2,2668 <execout+0x6c> - sbrk(-4096); 265c: 757d lui a0,0xfffff 265e: 4b0020ef jal 4b0e <sbrk> - for(int i = 0; i < avail; i++) 2662: 2485 addiw s1,s1,1 2664: ff249ce3 bne s1,s2,265c <execout+0x60> - close(1); 2668: 4505 li a0,1 266a: 444020ef jal 4aae <close> - char *args[] = { "echo", "x", 0 }; 266e: 00003517 auipc a0,0x3 2672: a3a50513 addi a0,a0,-1478 # 50a8 <malloc+0x13e> 2676: faa43c23 sd a0,-72(s0) @@ -4433,140 +3314,107 @@ r_sp() 267e: a9e78793 addi a5,a5,-1378 # 5118 <malloc+0x1ae> 2682: fcf43023 sd a5,-64(s0) 2686: fc043423 sd zero,-56(s0) - exec("echo", args); 268a: fb840593 addi a1,s0,-72 268e: 430020ef jal 4abe <exec> - exit(0); 2692: 4501 li a0,0 2694: 3f2020ef jal 4a86 <exit> 0000000000002698 <fourteen>: -{ 2698: 1101 addi sp,sp,-32 269a: ec06 sd ra,24(sp) 269c: e822 sd s0,16(sp) 269e: e426 sd s1,8(sp) 26a0: 1000 addi s0,sp,32 26a2: 84aa mv s1,a0 - if(mkdir("12345678901234") != 0){ 26a4: 00004517 auipc a0,0x4 26a8: a9c50513 addi a0,a0,-1380 # 6140 <malloc+0x11d6> 26ac: 442020ef jal 4aee <mkdir> 26b0: e555 bnez a0,275c <fourteen+0xc4> - if(mkdir("12345678901234/123456789012345") != 0){ 26b2: 00004517 auipc a0,0x4 26b6: 8e650513 addi a0,a0,-1818 # 5f98 <malloc+0x102e> 26ba: 434020ef jal 4aee <mkdir> 26be: e94d bnez a0,2770 <fourteen+0xd8> - fd = open("123456789012345/123456789012345/123456789012345", O_CREATE); 26c0: 20000593 li a1,512 26c4: 00004517 auipc a0,0x4 26c8: 92c50513 addi a0,a0,-1748 # 5ff0 <malloc+0x1086> 26cc: 3fa020ef jal 4ac6 <open> - if(fd < 0){ 26d0: 0a054a63 bltz a0,2784 <fourteen+0xec> - close(fd); 26d4: 3da020ef jal 4aae <close> - fd = open("12345678901234/12345678901234/12345678901234", 0); 26d8: 4581 li a1,0 26da: 00004517 auipc a0,0x4 26de: 98e50513 addi a0,a0,-1650 # 6068 <malloc+0x10fe> 26e2: 3e4020ef jal 4ac6 <open> - if(fd < 0){ 26e6: 0a054963 bltz a0,2798 <fourteen+0x100> - close(fd); 26ea: 3c4020ef jal 4aae <close> - if(mkdir("12345678901234/12345678901234") == 0){ 26ee: 00004517 auipc a0,0x4 26f2: 9ea50513 addi a0,a0,-1558 # 60d8 <malloc+0x116e> 26f6: 3f8020ef jal 4aee <mkdir> 26fa: c94d beqz a0,27ac <fourteen+0x114> - if(mkdir("123456789012345/12345678901234") == 0){ 26fc: 00004517 auipc a0,0x4 2700: a3450513 addi a0,a0,-1484 # 6130 <malloc+0x11c6> 2704: 3ea020ef jal 4aee <mkdir> 2708: cd45 beqz a0,27c0 <fourteen+0x128> - unlink("123456789012345/12345678901234"); 270a: 00004517 auipc a0,0x4 270e: a2650513 addi a0,a0,-1498 # 6130 <malloc+0x11c6> 2712: 3c4020ef jal 4ad6 <unlink> - unlink("12345678901234/12345678901234"); 2716: 00004517 auipc a0,0x4 271a: 9c250513 addi a0,a0,-1598 # 60d8 <malloc+0x116e> 271e: 3b8020ef jal 4ad6 <unlink> - unlink("12345678901234/12345678901234/12345678901234"); 2722: 00004517 auipc a0,0x4 2726: 94650513 addi a0,a0,-1722 # 6068 <malloc+0x10fe> 272a: 3ac020ef jal 4ad6 <unlink> - unlink("123456789012345/123456789012345/123456789012345"); 272e: 00004517 auipc a0,0x4 2732: 8c250513 addi a0,a0,-1854 # 5ff0 <malloc+0x1086> 2736: 3a0020ef jal 4ad6 <unlink> - unlink("12345678901234/123456789012345"); 273a: 00004517 auipc a0,0x4 273e: 85e50513 addi a0,a0,-1954 # 5f98 <malloc+0x102e> 2742: 394020ef jal 4ad6 <unlink> - unlink("12345678901234"); 2746: 00004517 auipc a0,0x4 274a: 9fa50513 addi a0,a0,-1542 # 6140 <malloc+0x11d6> 274e: 388020ef jal 4ad6 <unlink> -} 2752: 60e2 ld ra,24(sp) 2754: 6442 ld s0,16(sp) 2756: 64a2 ld s1,8(sp) 2758: 6105 addi sp,sp,32 275a: 8082 ret - printf("%s: mkdir 12345678901234 failed\n", s); 275c: 85a6 mv a1,s1 275e: 00004517 auipc a0,0x4 2762: 81250513 addi a0,a0,-2030 # 5f70 <malloc+0x1006> 2766: 750020ef jal 4eb6 <printf> - exit(1); 276a: 4505 li a0,1 276c: 31a020ef jal 4a86 <exit> - printf("%s: mkdir 12345678901234/123456789012345 failed\n", s); 2770: 85a6 mv a1,s1 2772: 00004517 auipc a0,0x4 2776: 84650513 addi a0,a0,-1978 # 5fb8 <malloc+0x104e> 277a: 73c020ef jal 4eb6 <printf> - exit(1); 277e: 4505 li a0,1 2780: 306020ef jal 4a86 <exit> - printf("%s: create 123456789012345/123456789012345/123456789012345 failed\n", s); 2784: 85a6 mv a1,s1 2786: 00004517 auipc a0,0x4 278a: 89a50513 addi a0,a0,-1894 # 6020 <malloc+0x10b6> 278e: 728020ef jal 4eb6 <printf> - exit(1); 2792: 4505 li a0,1 2794: 2f2020ef jal 4a86 <exit> - printf("%s: open 12345678901234/12345678901234/12345678901234 failed\n", s); 2798: 85a6 mv a1,s1 279a: 00004517 auipc a0,0x4 279e: 8fe50513 addi a0,a0,-1794 # 6098 <malloc+0x112e> 27a2: 714020ef jal 4eb6 <printf> - exit(1); 27a6: 4505 li a0,1 27a8: 2de020ef jal 4a86 <exit> - printf("%s: mkdir 12345678901234/12345678901234 succeeded!\n", s); 27ac: 85a6 mv a1,s1 27ae: 00004517 auipc a0,0x4 27b2: 94a50513 addi a0,a0,-1718 # 60f8 <malloc+0x118e> 27b6: 700020ef jal 4eb6 <printf> - exit(1); 27ba: 4505 li a0,1 27bc: 2ca020ef jal 4a86 <exit> - printf("%s: mkdir 12345678901234/123456789012345 succeeded!\n", s); 27c0: 85a6 mv a1,s1 27c2: 00004517 auipc a0,0x4 27c6: 98e50513 addi a0,a0,-1650 # 6150 <malloc+0x11e6> 27ca: 6ec020ef jal 4eb6 <printf> - exit(1); 27ce: 4505 li a0,1 27d0: 2b6020ef jal 4a86 <exit> 00000000000027d4 <diskfull>: -{ 27d4: b8010113 addi sp,sp,-1152 27d8: 46113c23 sd ra,1144(sp) 27dc: 46813823 sd s0,1136(sp) @@ -4581,140 +3429,94 @@ r_sp() 2800: 43913423 sd s9,1064(sp) 2804: 48010413 addi s0,sp,1152 2808: 8caa mv s9,a0 - unlink("diskfulldir"); 280a: 00004517 auipc a0,0x4 280e: 97e50513 addi a0,a0,-1666 # 6188 <malloc+0x121e> 2812: 2c4020ef jal 4ad6 <unlink> 2816: 03000993 li s3,48 - name[0] = 'b'; 281a: 06200b93 li s7,98 - name[1] = 'i'; 281e: 06900b13 li s6,105 - name[2] = 'g'; 2822: 06700a93 li s5,103 2826: 6a41 lui s4,0x10 2828: 10ba0a13 addi s4,s4,267 # 1010b <base+0x493> - for(fi = 0; done == 0 && '0' + fi < 0177; fi++){ 282c: 07f00c13 li s8,127 2830: aab9 j 298e <diskfull+0x1ba> - printf("%s: could not create file %s\n", s, name); 2832: b8040613 addi a2,s0,-1152 2836: 85e6 mv a1,s9 2838: 00004517 auipc a0,0x4 283c: 96050513 addi a0,a0,-1696 # 6198 <malloc+0x122e> 2840: 676020ef jal 4eb6 <printf> - break; 2844: a039 j 2852 <diskfull+0x7e> - close(fd); 2846: 854a mv a0,s2 2848: 266020ef jal 4aae <close> - close(fd); 284c: 854a mv a0,s2 284e: 260020ef jal 4aae <close> - for(int i = 0; i < nzz; i++){ 2852: 4481 li s1,0 - name[0] = 'z'; 2854: 07a00913 li s2,122 - for(int i = 0; i < nzz; i++){ 2858: 08000993 li s3,128 - name[0] = 'z'; 285c: bb240023 sb s2,-1120(s0) - name[1] = 'z'; 2860: bb2400a3 sb s2,-1119(s0) - name[2] = '0' + (i / 32); 2864: 41f4d71b sraiw a4,s1,0x1f 2868: 01b7571b srliw a4,a4,0x1b 286c: 009707bb addw a5,a4,s1 2870: 4057d69b sraiw a3,a5,0x5 2874: 0306869b addiw a3,a3,48 2878: bad40123 sb a3,-1118(s0) - name[3] = '0' + (i % 32); 287c: 8bfd andi a5,a5,31 287e: 9f99 subw a5,a5,a4 2880: 0307879b addiw a5,a5,48 2884: baf401a3 sb a5,-1117(s0) - name[4] = '\0'; 2888: ba040223 sb zero,-1116(s0) - unlink(name); 288c: ba040513 addi a0,s0,-1120 2890: 246020ef jal 4ad6 <unlink> - int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); 2894: 60200593 li a1,1538 2898: ba040513 addi a0,s0,-1120 289c: 22a020ef jal 4ac6 <open> - if(fd < 0) 28a0: 00054763 bltz a0,28ae <diskfull+0xda> - close(fd); 28a4: 20a020ef jal 4aae <close> - for(int i = 0; i < nzz; i++){ 28a8: 2485 addiw s1,s1,1 28aa: fb3499e3 bne s1,s3,285c <diskfull+0x88> - if(mkdir("diskfulldir") == 0) 28ae: 00004517 auipc a0,0x4 28b2: 8da50513 addi a0,a0,-1830 # 6188 <malloc+0x121e> 28b6: 238020ef jal 4aee <mkdir> 28ba: 12050063 beqz a0,29da <diskfull+0x206> - unlink("diskfulldir"); 28be: 00004517 auipc a0,0x4 28c2: 8ca50513 addi a0,a0,-1846 # 6188 <malloc+0x121e> 28c6: 210020ef jal 4ad6 <unlink> - for(int i = 0; i < nzz; i++){ 28ca: 4481 li s1,0 - name[0] = 'z'; 28cc: 07a00913 li s2,122 - for(int i = 0; i < nzz; i++){ 28d0: 08000993 li s3,128 - name[0] = 'z'; 28d4: bb240023 sb s2,-1120(s0) - name[1] = 'z'; 28d8: bb2400a3 sb s2,-1119(s0) - name[2] = '0' + (i / 32); 28dc: 41f4d71b sraiw a4,s1,0x1f 28e0: 01b7571b srliw a4,a4,0x1b 28e4: 009707bb addw a5,a4,s1 28e8: 4057d69b sraiw a3,a5,0x5 28ec: 0306869b addiw a3,a3,48 28f0: bad40123 sb a3,-1118(s0) - name[3] = '0' + (i % 32); 28f4: 8bfd andi a5,a5,31 28f6: 9f99 subw a5,a5,a4 28f8: 0307879b addiw a5,a5,48 28fc: baf401a3 sb a5,-1117(s0) - name[4] = '\0'; 2900: ba040223 sb zero,-1116(s0) - unlink(name); 2904: ba040513 addi a0,s0,-1120 2908: 1ce020ef jal 4ad6 <unlink> - for(int i = 0; i < nzz; i++){ 290c: 2485 addiw s1,s1,1 290e: fd3493e3 bne s1,s3,28d4 <diskfull+0x100> 2912: 03000493 li s1,48 - name[0] = 'b'; 2916: 06200a93 li s5,98 - name[1] = 'i'; 291a: 06900a13 li s4,105 - name[2] = 'g'; 291e: 06700993 li s3,103 - for(int i = 0; '0' + i < 0177; i++){ 2922: 07f00913 li s2,127 - name[0] = 'b'; 2926: bb540023 sb s5,-1120(s0) - name[1] = 'i'; 292a: bb4400a3 sb s4,-1119(s0) - name[2] = 'g'; 292e: bb340123 sb s3,-1118(s0) - name[3] = '0' + i; 2932: ba9401a3 sb s1,-1117(s0) - name[4] = '\0'; 2936: ba040223 sb zero,-1116(s0) - unlink(name); 293a: ba040513 addi a0,s0,-1120 293e: 198020ef jal 4ad6 <unlink> - for(int i = 0; '0' + i < 0177; i++){ 2942: 2485 addiw s1,s1,1 2944: 0ff4f493 zext.b s1,s1 2948: fd249fe3 bne s1,s2,2926 <diskfull+0x152> -} 294c: 47813083 ld ra,1144(sp) 2950: 47013403 ld s0,1136(sp) 2954: 46813483 ld s1,1128(sp) @@ -4728,46 +3530,33 @@ r_sp() 2974: 42813c83 ld s9,1064(sp) 2978: 48010113 addi sp,sp,1152 297c: 8082 ret - close(fd); 297e: 854a mv a0,s2 2980: 12e020ef jal 4aae <close> - for(fi = 0; done == 0 && '0' + fi < 0177; fi++){ 2984: 2985 addiw s3,s3,1 2986: 0ff9f993 zext.b s3,s3 298a: ed8984e3 beq s3,s8,2852 <diskfull+0x7e> - name[0] = 'b'; 298e: b9740023 sb s7,-1152(s0) - name[1] = 'i'; 2992: b96400a3 sb s6,-1151(s0) - name[2] = 'g'; 2996: b9540123 sb s5,-1150(s0) - name[3] = '0' + fi; 299a: b93401a3 sb s3,-1149(s0) - name[4] = '\0'; 299e: b8040223 sb zero,-1148(s0) - unlink(name); 29a2: b8040513 addi a0,s0,-1152 29a6: 130020ef jal 4ad6 <unlink> - int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); 29aa: 60200593 li a1,1538 29ae: b8040513 addi a0,s0,-1152 29b2: 114020ef jal 4ac6 <open> 29b6: 892a mv s2,a0 - if(fd < 0){ 29b8: e6054de3 bltz a0,2832 <diskfull+0x5e> 29bc: 84d2 mv s1,s4 - if(write(fd, buf, BSIZE) != BSIZE){ 29be: 40000613 li a2,1024 29c2: ba040593 addi a1,s0,-1120 29c6: 854a mv a0,s2 29c8: 0de020ef jal 4aa6 <write> 29cc: 40000793 li a5,1024 29d0: e6f51be3 bne a0,a5,2846 <diskfull+0x72> - for(int i = 0; i < MAXFILE; i++){ 29d4: 34fd addiw s1,s1,-1 29d6: f4e5 bnez s1,29be <diskfull+0x1ea> 29d8: b75d j 297e <diskfull+0x1aa> - printf("%s: mkdir(diskfulldir) unexpectedly succeeded!\n", s); 29da: 85e6 mv a1,s9 29dc: 00003517 auipc a0,0x3 29e0: 7dc50513 addi a0,a0,2012 # 61b8 <malloc+0x124e> @@ -4775,212 +3564,165 @@ r_sp() 29e8: bdd9 j 28be <diskfull+0xea> 00000000000029ea <iputtest>: -{ 29ea: 1101 addi sp,sp,-32 29ec: ec06 sd ra,24(sp) 29ee: e822 sd s0,16(sp) 29f0: e426 sd s1,8(sp) 29f2: 1000 addi s0,sp,32 29f4: 84aa mv s1,a0 - if(mkdir("iputdir") < 0){ 29f6: 00003517 auipc a0,0x3 29fa: 7f250513 addi a0,a0,2034 # 61e8 <malloc+0x127e> 29fe: 0f0020ef jal 4aee <mkdir> 2a02: 02054f63 bltz a0,2a40 <iputtest+0x56> - if(chdir("iputdir") < 0){ 2a06: 00003517 auipc a0,0x3 2a0a: 7e250513 addi a0,a0,2018 # 61e8 <malloc+0x127e> 2a0e: 0e8020ef jal 4af6 <chdir> 2a12: 04054163 bltz a0,2a54 <iputtest+0x6a> - if(unlink("../iputdir") < 0){ 2a16: 00004517 auipc a0,0x4 2a1a: 81250513 addi a0,a0,-2030 # 6228 <malloc+0x12be> 2a1e: 0b8020ef jal 4ad6 <unlink> 2a22: 04054363 bltz a0,2a68 <iputtest+0x7e> - if(chdir("/") < 0){ 2a26: 00004517 auipc a0,0x4 2a2a: 83250513 addi a0,a0,-1998 # 6258 <malloc+0x12ee> 2a2e: 0c8020ef jal 4af6 <chdir> 2a32: 04054563 bltz a0,2a7c <iputtest+0x92> -} 2a36: 60e2 ld ra,24(sp) 2a38: 6442 ld s0,16(sp) 2a3a: 64a2 ld s1,8(sp) 2a3c: 6105 addi sp,sp,32 2a3e: 8082 ret - printf("%s: mkdir failed\n", s); 2a40: 85a6 mv a1,s1 2a42: 00003517 auipc a0,0x3 2a46: 7ae50513 addi a0,a0,1966 # 61f0 <malloc+0x1286> 2a4a: 46c020ef jal 4eb6 <printf> - exit(1); 2a4e: 4505 li a0,1 2a50: 036020ef jal 4a86 <exit> - printf("%s: chdir iputdir failed\n", s); 2a54: 85a6 mv a1,s1 2a56: 00003517 auipc a0,0x3 2a5a: 7b250513 addi a0,a0,1970 # 6208 <malloc+0x129e> 2a5e: 458020ef jal 4eb6 <printf> - exit(1); 2a62: 4505 li a0,1 2a64: 022020ef jal 4a86 <exit> - printf("%s: unlink ../iputdir failed\n", s); 2a68: 85a6 mv a1,s1 2a6a: 00003517 auipc a0,0x3 2a6e: 7ce50513 addi a0,a0,1998 # 6238 <malloc+0x12ce> 2a72: 444020ef jal 4eb6 <printf> - exit(1); 2a76: 4505 li a0,1 2a78: 00e020ef jal 4a86 <exit> - printf("%s: chdir / failed\n", s); 2a7c: 85a6 mv a1,s1 2a7e: 00003517 auipc a0,0x3 2a82: 7e250513 addi a0,a0,2018 # 6260 <malloc+0x12f6> 2a86: 430020ef jal 4eb6 <printf> - exit(1); 2a8a: 4505 li a0,1 2a8c: 7fb010ef jal 4a86 <exit> 0000000000002a90 <exitiputtest>: -{ 2a90: 7179 addi sp,sp,-48 2a92: f406 sd ra,40(sp) 2a94: f022 sd s0,32(sp) 2a96: ec26 sd s1,24(sp) 2a98: 1800 addi s0,sp,48 2a9a: 84aa mv s1,a0 - pid = fork(); 2a9c: 7e3010ef jal 4a7e <fork> - if(pid < 0){ 2aa0: 02054e63 bltz a0,2adc <exitiputtest+0x4c> - if(pid == 0){ 2aa4: e541 bnez a0,2b2c <exitiputtest+0x9c> - if(mkdir("iputdir") < 0){ 2aa6: 00003517 auipc a0,0x3 2aaa: 74250513 addi a0,a0,1858 # 61e8 <malloc+0x127e> 2aae: 040020ef jal 4aee <mkdir> 2ab2: 02054f63 bltz a0,2af0 <exitiputtest+0x60> - if(chdir("iputdir") < 0){ 2ab6: 00003517 auipc a0,0x3 2aba: 73250513 addi a0,a0,1842 # 61e8 <malloc+0x127e> 2abe: 038020ef jal 4af6 <chdir> 2ac2: 04054163 bltz a0,2b04 <exitiputtest+0x74> - if(unlink("../iputdir") < 0){ 2ac6: 00003517 auipc a0,0x3 2aca: 76250513 addi a0,a0,1890 # 6228 <malloc+0x12be> 2ace: 008020ef jal 4ad6 <unlink> 2ad2: 04054363 bltz a0,2b18 <exitiputtest+0x88> - exit(0); 2ad6: 4501 li a0,0 2ad8: 7af010ef jal 4a86 <exit> - printf("%s: fork failed\n", s); 2adc: 85a6 mv a1,s1 2ade: 00003517 auipc a0,0x3 2ae2: e5a50513 addi a0,a0,-422 # 5938 <malloc+0x9ce> 2ae6: 3d0020ef jal 4eb6 <printf> - exit(1); 2aea: 4505 li a0,1 2aec: 79b010ef jal 4a86 <exit> - printf("%s: mkdir failed\n", s); 2af0: 85a6 mv a1,s1 2af2: 00003517 auipc a0,0x3 2af6: 6fe50513 addi a0,a0,1790 # 61f0 <malloc+0x1286> 2afa: 3bc020ef jal 4eb6 <printf> - exit(1); 2afe: 4505 li a0,1 2b00: 787010ef jal 4a86 <exit> - printf("%s: child chdir failed\n", s); 2b04: 85a6 mv a1,s1 2b06: 00003517 auipc a0,0x3 2b0a: 77250513 addi a0,a0,1906 # 6278 <malloc+0x130e> 2b0e: 3a8020ef jal 4eb6 <printf> - exit(1); 2b12: 4505 li a0,1 2b14: 773010ef jal 4a86 <exit> - printf("%s: unlink ../iputdir failed\n", s); 2b18: 85a6 mv a1,s1 2b1a: 00003517 auipc a0,0x3 2b1e: 71e50513 addi a0,a0,1822 # 6238 <malloc+0x12ce> 2b22: 394020ef jal 4eb6 <printf> - exit(1); 2b26: 4505 li a0,1 2b28: 75f010ef jal 4a86 <exit> - wait(&xstatus); 2b2c: fdc40513 addi a0,s0,-36 2b30: 75f010ef jal 4a8e <wait> - exit(xstatus); 2b34: fdc42503 lw a0,-36(s0) 2b38: 74f010ef jal 4a86 <exit> 0000000000002b3c <dirtest>: -{ 2b3c: 1101 addi sp,sp,-32 2b3e: ec06 sd ra,24(sp) 2b40: e822 sd s0,16(sp) 2b42: e426 sd s1,8(sp) 2b44: 1000 addi s0,sp,32 2b46: 84aa mv s1,a0 - if(mkdir("dir0") < 0){ 2b48: 00003517 auipc a0,0x3 2b4c: 74850513 addi a0,a0,1864 # 6290 <malloc+0x1326> 2b50: 79f010ef jal 4aee <mkdir> 2b54: 02054f63 bltz a0,2b92 <dirtest+0x56> - if(chdir("dir0") < 0){ 2b58: 00003517 auipc a0,0x3 2b5c: 73850513 addi a0,a0,1848 # 6290 <malloc+0x1326> 2b60: 797010ef jal 4af6 <chdir> 2b64: 04054163 bltz a0,2ba6 <dirtest+0x6a> - if(chdir("..") < 0){ 2b68: 00003517 auipc a0,0x3 2b6c: 74850513 addi a0,a0,1864 # 62b0 <malloc+0x1346> 2b70: 787010ef jal 4af6 <chdir> 2b74: 04054363 bltz a0,2bba <dirtest+0x7e> - if(unlink("dir0") < 0){ 2b78: 00003517 auipc a0,0x3 2b7c: 71850513 addi a0,a0,1816 # 6290 <malloc+0x1326> 2b80: 757010ef jal 4ad6 <unlink> 2b84: 04054563 bltz a0,2bce <dirtest+0x92> -} 2b88: 60e2 ld ra,24(sp) 2b8a: 6442 ld s0,16(sp) 2b8c: 64a2 ld s1,8(sp) 2b8e: 6105 addi sp,sp,32 2b90: 8082 ret - printf("%s: mkdir failed\n", s); 2b92: 85a6 mv a1,s1 2b94: 00003517 auipc a0,0x3 2b98: 65c50513 addi a0,a0,1628 # 61f0 <malloc+0x1286> 2b9c: 31a020ef jal 4eb6 <printf> - exit(1); 2ba0: 4505 li a0,1 2ba2: 6e5010ef jal 4a86 <exit> - printf("%s: chdir dir0 failed\n", s); 2ba6: 85a6 mv a1,s1 2ba8: 00003517 auipc a0,0x3 2bac: 6f050513 addi a0,a0,1776 # 6298 <malloc+0x132e> 2bb0: 306020ef jal 4eb6 <printf> - exit(1); 2bb4: 4505 li a0,1 2bb6: 6d1010ef jal 4a86 <exit> - printf("%s: chdir .. failed\n", s); 2bba: 85a6 mv a1,s1 2bbc: 00003517 auipc a0,0x3 2bc0: 6fc50513 addi a0,a0,1788 # 62b8 <malloc+0x134e> 2bc4: 2f2020ef jal 4eb6 <printf> - exit(1); 2bc8: 4505 li a0,1 2bca: 6bd010ef jal 4a86 <exit> - printf("%s: unlink dir0 failed\n", s); 2bce: 85a6 mv a1,s1 2bd0: 00003517 auipc a0,0x3 2bd4: 70050513 addi a0,a0,1792 # 62d0 <malloc+0x1366> 2bd8: 2de020ef jal 4eb6 <printf> - exit(1); 2bdc: 4505 li a0,1 2bde: 6a9010ef jal 4a86 <exit> 0000000000002be2 <subdir>: -{ 2be2: 1101 addi sp,sp,-32 2be4: ec06 sd ra,24(sp) 2be6: e822 sd s0,16(sp) @@ -4988,678 +3730,527 @@ r_sp() 2bea: e04a sd s2,0(sp) 2bec: 1000 addi s0,sp,32 2bee: 892a mv s2,a0 - unlink("ff"); 2bf0: 00004517 auipc a0,0x4 2bf4: 82850513 addi a0,a0,-2008 # 6418 <malloc+0x14ae> 2bf8: 6df010ef jal 4ad6 <unlink> - if(mkdir("dd") != 0){ 2bfc: 00003517 auipc a0,0x3 2c00: 6ec50513 addi a0,a0,1772 # 62e8 <malloc+0x137e> 2c04: 6eb010ef jal 4aee <mkdir> 2c08: 2e051263 bnez a0,2eec <subdir+0x30a> - fd = open("dd/ff", O_CREATE | O_RDWR); 2c0c: 20200593 li a1,514 2c10: 00003517 auipc a0,0x3 2c14: 6f850513 addi a0,a0,1784 # 6308 <malloc+0x139e> 2c18: 6af010ef jal 4ac6 <open> 2c1c: 84aa mv s1,a0 - if(fd < 0){ 2c1e: 2e054163 bltz a0,2f00 <subdir+0x31e> - write(fd, "ff", 2); 2c22: 4609 li a2,2 2c24: 00003597 auipc a1,0x3 2c28: 7f458593 addi a1,a1,2036 # 6418 <malloc+0x14ae> 2c2c: 67b010ef jal 4aa6 <write> - close(fd); 2c30: 8526 mv a0,s1 2c32: 67d010ef jal 4aae <close> - if(unlink("dd") >= 0){ 2c36: 00003517 auipc a0,0x3 2c3a: 6b250513 addi a0,a0,1714 # 62e8 <malloc+0x137e> 2c3e: 699010ef jal 4ad6 <unlink> 2c42: 2c055963 bgez a0,2f14 <subdir+0x332> - if(mkdir("/dd/dd") != 0){ 2c46: 00003517 auipc a0,0x3 2c4a: 71a50513 addi a0,a0,1818 # 6360 <malloc+0x13f6> 2c4e: 6a1010ef jal 4aee <mkdir> 2c52: 2c051b63 bnez a0,2f28 <subdir+0x346> - fd = open("dd/dd/ff", O_CREATE | O_RDWR); 2c56: 20200593 li a1,514 2c5a: 00003517 auipc a0,0x3 2c5e: 72e50513 addi a0,a0,1838 # 6388 <malloc+0x141e> 2c62: 665010ef jal 4ac6 <open> 2c66: 84aa mv s1,a0 - if(fd < 0){ 2c68: 2c054a63 bltz a0,2f3c <subdir+0x35a> - write(fd, "FF", 2); 2c6c: 4609 li a2,2 2c6e: 00003597 auipc a1,0x3 2c72: 74a58593 addi a1,a1,1866 # 63b8 <malloc+0x144e> 2c76: 631010ef jal 4aa6 <write> - close(fd); 2c7a: 8526 mv a0,s1 2c7c: 633010ef jal 4aae <close> - fd = open("dd/dd/../ff", 0); 2c80: 4581 li a1,0 2c82: 00003517 auipc a0,0x3 2c86: 73e50513 addi a0,a0,1854 # 63c0 <malloc+0x1456> 2c8a: 63d010ef jal 4ac6 <open> 2c8e: 84aa mv s1,a0 - if(fd < 0){ 2c90: 2c054063 bltz a0,2f50 <subdir+0x36e> - cc = read(fd, buf, sizeof(buf)); 2c94: 660d lui a2,0x3 2c96: 0000a597 auipc a1,0xa 2c9a: fe258593 addi a1,a1,-30 # cc78 <buf> 2c9e: 601010ef jal 4a9e <read> - if(cc != 2 || buf[0] != 'f'){ 2ca2: 4789 li a5,2 2ca4: 2cf51063 bne a0,a5,2f64 <subdir+0x382> 2ca8: 0000a717 auipc a4,0xa 2cac: fd074703 lbu a4,-48(a4) # cc78 <buf> 2cb0: 06600793 li a5,102 2cb4: 2af71863 bne a4,a5,2f64 <subdir+0x382> - close(fd); 2cb8: 8526 mv a0,s1 2cba: 5f5010ef jal 4aae <close> - if(link("dd/dd/ff", "dd/dd/ffff") != 0){ 2cbe: 00003597 auipc a1,0x3 2cc2: 75258593 addi a1,a1,1874 # 6410 <malloc+0x14a6> 2cc6: 00003517 auipc a0,0x3 2cca: 6c250513 addi a0,a0,1730 # 6388 <malloc+0x141e> 2cce: 619010ef jal 4ae6 <link> 2cd2: 2a051363 bnez a0,2f78 <subdir+0x396> - if(unlink("dd/dd/ff") != 0){ 2cd6: 00003517 auipc a0,0x3 2cda: 6b250513 addi a0,a0,1714 # 6388 <malloc+0x141e> 2cde: 5f9010ef jal 4ad6 <unlink> 2ce2: 2a051563 bnez a0,2f8c <subdir+0x3aa> - if(open("dd/dd/ff", O_RDONLY) >= 0){ 2ce6: 4581 li a1,0 2ce8: 00003517 auipc a0,0x3 2cec: 6a050513 addi a0,a0,1696 # 6388 <malloc+0x141e> 2cf0: 5d7010ef jal 4ac6 <open> 2cf4: 2a055663 bgez a0,2fa0 <subdir+0x3be> - if(chdir("dd") != 0){ 2cf8: 00003517 auipc a0,0x3 2cfc: 5f050513 addi a0,a0,1520 # 62e8 <malloc+0x137e> 2d00: 5f7010ef jal 4af6 <chdir> 2d04: 2a051863 bnez a0,2fb4 <subdir+0x3d2> - if(chdir("dd/../../dd") != 0){ 2d08: 00003517 auipc a0,0x3 2d0c: 7a050513 addi a0,a0,1952 # 64a8 <malloc+0x153e> 2d10: 5e7010ef jal 4af6 <chdir> 2d14: 2a051a63 bnez a0,2fc8 <subdir+0x3e6> - if(chdir("dd/../../../dd") != 0){ 2d18: 00003517 auipc a0,0x3 2d1c: 7c050513 addi a0,a0,1984 # 64d8 <malloc+0x156e> 2d20: 5d7010ef jal 4af6 <chdir> 2d24: 2a051c63 bnez a0,2fdc <subdir+0x3fa> - if(chdir("./..") != 0){ 2d28: 00003517 auipc a0,0x3 2d2c: 7e850513 addi a0,a0,2024 # 6510 <malloc+0x15a6> 2d30: 5c7010ef jal 4af6 <chdir> 2d34: 2a051e63 bnez a0,2ff0 <subdir+0x40e> - fd = open("dd/dd/ffff", 0); 2d38: 4581 li a1,0 2d3a: 00003517 auipc a0,0x3 2d3e: 6d650513 addi a0,a0,1750 # 6410 <malloc+0x14a6> 2d42: 585010ef jal 4ac6 <open> 2d46: 84aa mv s1,a0 - if(fd < 0){ 2d48: 2a054e63 bltz a0,3004 <subdir+0x422> - if(read(fd, buf, sizeof(buf)) != 2){ 2d4c: 660d lui a2,0x3 2d4e: 0000a597 auipc a1,0xa 2d52: f2a58593 addi a1,a1,-214 # cc78 <buf> 2d56: 549010ef jal 4a9e <read> 2d5a: 4789 li a5,2 2d5c: 2af51e63 bne a0,a5,3018 <subdir+0x436> - close(fd); 2d60: 8526 mv a0,s1 2d62: 54d010ef jal 4aae <close> - if(open("dd/dd/ff", O_RDONLY) >= 0){ 2d66: 4581 li a1,0 2d68: 00003517 auipc a0,0x3 2d6c: 62050513 addi a0,a0,1568 # 6388 <malloc+0x141e> 2d70: 557010ef jal 4ac6 <open> 2d74: 2a055c63 bgez a0,302c <subdir+0x44a> - if(open("dd/ff/ff", O_CREATE|O_RDWR) >= 0){ 2d78: 20200593 li a1,514 2d7c: 00004517 auipc a0,0x4 2d80: 82450513 addi a0,a0,-2012 # 65a0 <malloc+0x1636> 2d84: 543010ef jal 4ac6 <open> 2d88: 2a055c63 bgez a0,3040 <subdir+0x45e> - if(open("dd/xx/ff", O_CREATE|O_RDWR) >= 0){ 2d8c: 20200593 li a1,514 2d90: 00004517 auipc a0,0x4 2d94: 84050513 addi a0,a0,-1984 # 65d0 <malloc+0x1666> 2d98: 52f010ef jal 4ac6 <open> 2d9c: 2a055c63 bgez a0,3054 <subdir+0x472> - if(open("dd", O_CREATE) >= 0){ 2da0: 20000593 li a1,512 2da4: 00003517 auipc a0,0x3 2da8: 54450513 addi a0,a0,1348 # 62e8 <malloc+0x137e> 2dac: 51b010ef jal 4ac6 <open> 2db0: 2a055c63 bgez a0,3068 <subdir+0x486> - if(open("dd", O_RDWR) >= 0){ 2db4: 4589 li a1,2 2db6: 00003517 auipc a0,0x3 2dba: 53250513 addi a0,a0,1330 # 62e8 <malloc+0x137e> 2dbe: 509010ef jal 4ac6 <open> 2dc2: 2a055d63 bgez a0,307c <subdir+0x49a> - if(open("dd", O_WRONLY) >= 0){ 2dc6: 4585 li a1,1 2dc8: 00003517 auipc a0,0x3 2dcc: 52050513 addi a0,a0,1312 # 62e8 <malloc+0x137e> 2dd0: 4f7010ef jal 4ac6 <open> 2dd4: 2a055e63 bgez a0,3090 <subdir+0x4ae> - if(link("dd/ff/ff", "dd/dd/xx") == 0){ 2dd8: 00004597 auipc a1,0x4 2ddc: 88858593 addi a1,a1,-1912 # 6660 <malloc+0x16f6> 2de0: 00003517 auipc a0,0x3 2de4: 7c050513 addi a0,a0,1984 # 65a0 <malloc+0x1636> 2de8: 4ff010ef jal 4ae6 <link> 2dec: 2a050c63 beqz a0,30a4 <subdir+0x4c2> - if(link("dd/xx/ff", "dd/dd/xx") == 0){ 2df0: 00004597 auipc a1,0x4 2df4: 87058593 addi a1,a1,-1936 # 6660 <malloc+0x16f6> 2df8: 00003517 auipc a0,0x3 2dfc: 7d850513 addi a0,a0,2008 # 65d0 <malloc+0x1666> 2e00: 4e7010ef jal 4ae6 <link> 2e04: 2a050a63 beqz a0,30b8 <subdir+0x4d6> - if(link("dd/ff", "dd/dd/ffff") == 0){ 2e08: 00003597 auipc a1,0x3 2e0c: 60858593 addi a1,a1,1544 # 6410 <malloc+0x14a6> 2e10: 00003517 auipc a0,0x3 2e14: 4f850513 addi a0,a0,1272 # 6308 <malloc+0x139e> 2e18: 4cf010ef jal 4ae6 <link> 2e1c: 2a050863 beqz a0,30cc <subdir+0x4ea> - if(mkdir("dd/ff/ff") == 0){ 2e20: 00003517 auipc a0,0x3 2e24: 78050513 addi a0,a0,1920 # 65a0 <malloc+0x1636> 2e28: 4c7010ef jal 4aee <mkdir> 2e2c: 2a050a63 beqz a0,30e0 <subdir+0x4fe> - if(mkdir("dd/xx/ff") == 0){ 2e30: 00003517 auipc a0,0x3 2e34: 7a050513 addi a0,a0,1952 # 65d0 <malloc+0x1666> 2e38: 4b7010ef jal 4aee <mkdir> 2e3c: 2a050c63 beqz a0,30f4 <subdir+0x512> - if(mkdir("dd/dd/ffff") == 0){ 2e40: 00003517 auipc a0,0x3 2e44: 5d050513 addi a0,a0,1488 # 6410 <malloc+0x14a6> 2e48: 4a7010ef jal 4aee <mkdir> 2e4c: 2a050e63 beqz a0,3108 <subdir+0x526> - if(unlink("dd/xx/ff") == 0){ 2e50: 00003517 auipc a0,0x3 2e54: 78050513 addi a0,a0,1920 # 65d0 <malloc+0x1666> 2e58: 47f010ef jal 4ad6 <unlink> 2e5c: 2c050063 beqz a0,311c <subdir+0x53a> - if(unlink("dd/ff/ff") == 0){ 2e60: 00003517 auipc a0,0x3 2e64: 74050513 addi a0,a0,1856 # 65a0 <malloc+0x1636> 2e68: 46f010ef jal 4ad6 <unlink> 2e6c: 2c050263 beqz a0,3130 <subdir+0x54e> - if(chdir("dd/ff") == 0){ 2e70: 00003517 auipc a0,0x3 2e74: 49850513 addi a0,a0,1176 # 6308 <malloc+0x139e> 2e78: 47f010ef jal 4af6 <chdir> 2e7c: 2c050463 beqz a0,3144 <subdir+0x562> - if(chdir("dd/xx") == 0){ 2e80: 00004517 auipc a0,0x4 2e84: 93050513 addi a0,a0,-1744 # 67b0 <malloc+0x1846> 2e88: 46f010ef jal 4af6 <chdir> 2e8c: 2c050663 beqz a0,3158 <subdir+0x576> - if(unlink("dd/dd/ffff") != 0){ 2e90: 00003517 auipc a0,0x3 2e94: 58050513 addi a0,a0,1408 # 6410 <malloc+0x14a6> 2e98: 43f010ef jal 4ad6 <unlink> 2e9c: 2c051863 bnez a0,316c <subdir+0x58a> - if(unlink("dd/ff") != 0){ 2ea0: 00003517 auipc a0,0x3 2ea4: 46850513 addi a0,a0,1128 # 6308 <malloc+0x139e> 2ea8: 42f010ef jal 4ad6 <unlink> 2eac: 2c051a63 bnez a0,3180 <subdir+0x59e> - if(unlink("dd") == 0){ 2eb0: 00003517 auipc a0,0x3 2eb4: 43850513 addi a0,a0,1080 # 62e8 <malloc+0x137e> 2eb8: 41f010ef jal 4ad6 <unlink> 2ebc: 2c050c63 beqz a0,3194 <subdir+0x5b2> - if(unlink("dd/dd") < 0){ 2ec0: 00004517 auipc a0,0x4 2ec4: 96050513 addi a0,a0,-1696 # 6820 <malloc+0x18b6> 2ec8: 40f010ef jal 4ad6 <unlink> 2ecc: 2c054e63 bltz a0,31a8 <subdir+0x5c6> - if(unlink("dd") < 0){ 2ed0: 00003517 auipc a0,0x3 2ed4: 41850513 addi a0,a0,1048 # 62e8 <malloc+0x137e> 2ed8: 3ff010ef jal 4ad6 <unlink> 2edc: 2e054063 bltz a0,31bc <subdir+0x5da> -} 2ee0: 60e2 ld ra,24(sp) 2ee2: 6442 ld s0,16(sp) 2ee4: 64a2 ld s1,8(sp) 2ee6: 6902 ld s2,0(sp) 2ee8: 6105 addi sp,sp,32 2eea: 8082 ret - printf("%s: mkdir dd failed\n", s); 2eec: 85ca mv a1,s2 2eee: 00003517 auipc a0,0x3 2ef2: 40250513 addi a0,a0,1026 # 62f0 <malloc+0x1386> 2ef6: 7c1010ef jal 4eb6 <printf> - exit(1); 2efa: 4505 li a0,1 2efc: 38b010ef jal 4a86 <exit> - printf("%s: create dd/ff failed\n", s); 2f00: 85ca mv a1,s2 2f02: 00003517 auipc a0,0x3 2f06: 40e50513 addi a0,a0,1038 # 6310 <malloc+0x13a6> 2f0a: 7ad010ef jal 4eb6 <printf> - exit(1); 2f0e: 4505 li a0,1 2f10: 377010ef jal 4a86 <exit> - printf("%s: unlink dd (non-empty dir) succeeded!\n", s); 2f14: 85ca mv a1,s2 2f16: 00003517 auipc a0,0x3 2f1a: 41a50513 addi a0,a0,1050 # 6330 <malloc+0x13c6> 2f1e: 799010ef jal 4eb6 <printf> - exit(1); 2f22: 4505 li a0,1 2f24: 363010ef jal 4a86 <exit> - printf("%s: subdir mkdir dd/dd failed\n", s); 2f28: 85ca mv a1,s2 2f2a: 00003517 auipc a0,0x3 2f2e: 43e50513 addi a0,a0,1086 # 6368 <malloc+0x13fe> 2f32: 785010ef jal 4eb6 <printf> - exit(1); 2f36: 4505 li a0,1 2f38: 34f010ef jal 4a86 <exit> - printf("%s: create dd/dd/ff failed\n", s); 2f3c: 85ca mv a1,s2 2f3e: 00003517 auipc a0,0x3 2f42: 45a50513 addi a0,a0,1114 # 6398 <malloc+0x142e> 2f46: 771010ef jal 4eb6 <printf> - exit(1); 2f4a: 4505 li a0,1 2f4c: 33b010ef jal 4a86 <exit> - printf("%s: open dd/dd/../ff failed\n", s); 2f50: 85ca mv a1,s2 2f52: 00003517 auipc a0,0x3 2f56: 47e50513 addi a0,a0,1150 # 63d0 <malloc+0x1466> 2f5a: 75d010ef jal 4eb6 <printf> - exit(1); 2f5e: 4505 li a0,1 2f60: 327010ef jal 4a86 <exit> - printf("%s: dd/dd/../ff wrong content\n", s); 2f64: 85ca mv a1,s2 2f66: 00003517 auipc a0,0x3 2f6a: 48a50513 addi a0,a0,1162 # 63f0 <malloc+0x1486> 2f6e: 749010ef jal 4eb6 <printf> - exit(1); 2f72: 4505 li a0,1 2f74: 313010ef jal 4a86 <exit> - printf("%s: link dd/dd/ff dd/dd/ffff failed\n", s); 2f78: 85ca mv a1,s2 2f7a: 00003517 auipc a0,0x3 2f7e: 4a650513 addi a0,a0,1190 # 6420 <malloc+0x14b6> 2f82: 735010ef jal 4eb6 <printf> - exit(1); 2f86: 4505 li a0,1 2f88: 2ff010ef jal 4a86 <exit> - printf("%s: unlink dd/dd/ff failed\n", s); 2f8c: 85ca mv a1,s2 2f8e: 00003517 auipc a0,0x3 2f92: 4ba50513 addi a0,a0,1210 # 6448 <malloc+0x14de> 2f96: 721010ef jal 4eb6 <printf> - exit(1); 2f9a: 4505 li a0,1 2f9c: 2eb010ef jal 4a86 <exit> - printf("%s: open (unlinked) dd/dd/ff succeeded\n", s); 2fa0: 85ca mv a1,s2 2fa2: 00003517 auipc a0,0x3 2fa6: 4c650513 addi a0,a0,1222 # 6468 <malloc+0x14fe> 2faa: 70d010ef jal 4eb6 <printf> - exit(1); 2fae: 4505 li a0,1 2fb0: 2d7010ef jal 4a86 <exit> - printf("%s: chdir dd failed\n", s); 2fb4: 85ca mv a1,s2 2fb6: 00003517 auipc a0,0x3 2fba: 4da50513 addi a0,a0,1242 # 6490 <malloc+0x1526> 2fbe: 6f9010ef jal 4eb6 <printf> - exit(1); 2fc2: 4505 li a0,1 2fc4: 2c3010ef jal 4a86 <exit> - printf("%s: chdir dd/../../dd failed\n", s); 2fc8: 85ca mv a1,s2 2fca: 00003517 auipc a0,0x3 2fce: 4ee50513 addi a0,a0,1262 # 64b8 <malloc+0x154e> 2fd2: 6e5010ef jal 4eb6 <printf> - exit(1); 2fd6: 4505 li a0,1 2fd8: 2af010ef jal 4a86 <exit> - printf("%s: chdir dd/../../../dd failed\n", s); 2fdc: 85ca mv a1,s2 2fde: 00003517 auipc a0,0x3 2fe2: 50a50513 addi a0,a0,1290 # 64e8 <malloc+0x157e> 2fe6: 6d1010ef jal 4eb6 <printf> - exit(1); 2fea: 4505 li a0,1 2fec: 29b010ef jal 4a86 <exit> - printf("%s: chdir ./.. failed\n", s); 2ff0: 85ca mv a1,s2 2ff2: 00003517 auipc a0,0x3 2ff6: 52650513 addi a0,a0,1318 # 6518 <malloc+0x15ae> 2ffa: 6bd010ef jal 4eb6 <printf> - exit(1); 2ffe: 4505 li a0,1 3000: 287010ef jal 4a86 <exit> - printf("%s: open dd/dd/ffff failed\n", s); 3004: 85ca mv a1,s2 3006: 00003517 auipc a0,0x3 300a: 52a50513 addi a0,a0,1322 # 6530 <malloc+0x15c6> 300e: 6a9010ef jal 4eb6 <printf> - exit(1); 3012: 4505 li a0,1 3014: 273010ef jal 4a86 <exit> - printf("%s: read dd/dd/ffff wrong len\n", s); 3018: 85ca mv a1,s2 301a: 00003517 auipc a0,0x3 301e: 53650513 addi a0,a0,1334 # 6550 <malloc+0x15e6> 3022: 695010ef jal 4eb6 <printf> - exit(1); 3026: 4505 li a0,1 3028: 25f010ef jal 4a86 <exit> - printf("%s: open (unlinked) dd/dd/ff succeeded!\n", s); 302c: 85ca mv a1,s2 302e: 00003517 auipc a0,0x3 3032: 54250513 addi a0,a0,1346 # 6570 <malloc+0x1606> 3036: 681010ef jal 4eb6 <printf> - exit(1); 303a: 4505 li a0,1 303c: 24b010ef jal 4a86 <exit> - printf("%s: create dd/ff/ff succeeded!\n", s); 3040: 85ca mv a1,s2 3042: 00003517 auipc a0,0x3 3046: 56e50513 addi a0,a0,1390 # 65b0 <malloc+0x1646> 304a: 66d010ef jal 4eb6 <printf> - exit(1); 304e: 4505 li a0,1 3050: 237010ef jal 4a86 <exit> - printf("%s: create dd/xx/ff succeeded!\n", s); 3054: 85ca mv a1,s2 3056: 00003517 auipc a0,0x3 305a: 58a50513 addi a0,a0,1418 # 65e0 <malloc+0x1676> 305e: 659010ef jal 4eb6 <printf> - exit(1); 3062: 4505 li a0,1 3064: 223010ef jal 4a86 <exit> - printf("%s: create dd succeeded!\n", s); 3068: 85ca mv a1,s2 306a: 00003517 auipc a0,0x3 306e: 59650513 addi a0,a0,1430 # 6600 <malloc+0x1696> 3072: 645010ef jal 4eb6 <printf> - exit(1); 3076: 4505 li a0,1 3078: 20f010ef jal 4a86 <exit> - printf("%s: open dd rdwr succeeded!\n", s); 307c: 85ca mv a1,s2 307e: 00003517 auipc a0,0x3 3082: 5a250513 addi a0,a0,1442 # 6620 <malloc+0x16b6> 3086: 631010ef jal 4eb6 <printf> - exit(1); 308a: 4505 li a0,1 308c: 1fb010ef jal 4a86 <exit> - printf("%s: open dd wronly succeeded!\n", s); 3090: 85ca mv a1,s2 3092: 00003517 auipc a0,0x3 3096: 5ae50513 addi a0,a0,1454 # 6640 <malloc+0x16d6> 309a: 61d010ef jal 4eb6 <printf> - exit(1); 309e: 4505 li a0,1 30a0: 1e7010ef jal 4a86 <exit> - printf("%s: link dd/ff/ff dd/dd/xx succeeded!\n", s); 30a4: 85ca mv a1,s2 30a6: 00003517 auipc a0,0x3 30aa: 5ca50513 addi a0,a0,1482 # 6670 <malloc+0x1706> 30ae: 609010ef jal 4eb6 <printf> - exit(1); 30b2: 4505 li a0,1 30b4: 1d3010ef jal 4a86 <exit> - printf("%s: link dd/xx/ff dd/dd/xx succeeded!\n", s); 30b8: 85ca mv a1,s2 30ba: 00003517 auipc a0,0x3 30be: 5de50513 addi a0,a0,1502 # 6698 <malloc+0x172e> 30c2: 5f5010ef jal 4eb6 <printf> - exit(1); 30c6: 4505 li a0,1 30c8: 1bf010ef jal 4a86 <exit> - printf("%s: link dd/ff dd/dd/ffff succeeded!\n", s); 30cc: 85ca mv a1,s2 30ce: 00003517 auipc a0,0x3 30d2: 5f250513 addi a0,a0,1522 # 66c0 <malloc+0x1756> 30d6: 5e1010ef jal 4eb6 <printf> - exit(1); 30da: 4505 li a0,1 30dc: 1ab010ef jal 4a86 <exit> - printf("%s: mkdir dd/ff/ff succeeded!\n", s); 30e0: 85ca mv a1,s2 30e2: 00003517 auipc a0,0x3 30e6: 60650513 addi a0,a0,1542 # 66e8 <malloc+0x177e> 30ea: 5cd010ef jal 4eb6 <printf> - exit(1); 30ee: 4505 li a0,1 30f0: 197010ef jal 4a86 <exit> - printf("%s: mkdir dd/xx/ff succeeded!\n", s); 30f4: 85ca mv a1,s2 30f6: 00003517 auipc a0,0x3 30fa: 61250513 addi a0,a0,1554 # 6708 <malloc+0x179e> 30fe: 5b9010ef jal 4eb6 <printf> - exit(1); 3102: 4505 li a0,1 3104: 183010ef jal 4a86 <exit> - printf("%s: mkdir dd/dd/ffff succeeded!\n", s); 3108: 85ca mv a1,s2 310a: 00003517 auipc a0,0x3 310e: 61e50513 addi a0,a0,1566 # 6728 <malloc+0x17be> 3112: 5a5010ef jal 4eb6 <printf> - exit(1); 3116: 4505 li a0,1 3118: 16f010ef jal 4a86 <exit> - printf("%s: unlink dd/xx/ff succeeded!\n", s); 311c: 85ca mv a1,s2 311e: 00003517 auipc a0,0x3 3122: 63250513 addi a0,a0,1586 # 6750 <malloc+0x17e6> 3126: 591010ef jal 4eb6 <printf> - exit(1); 312a: 4505 li a0,1 312c: 15b010ef jal 4a86 <exit> - printf("%s: unlink dd/ff/ff succeeded!\n", s); 3130: 85ca mv a1,s2 3132: 00003517 auipc a0,0x3 3136: 63e50513 addi a0,a0,1598 # 6770 <malloc+0x1806> 313a: 57d010ef jal 4eb6 <printf> - exit(1); 313e: 4505 li a0,1 3140: 147010ef jal 4a86 <exit> - printf("%s: chdir dd/ff succeeded!\n", s); 3144: 85ca mv a1,s2 3146: 00003517 auipc a0,0x3 314a: 64a50513 addi a0,a0,1610 # 6790 <malloc+0x1826> 314e: 569010ef jal 4eb6 <printf> - exit(1); 3152: 4505 li a0,1 3154: 133010ef jal 4a86 <exit> - printf("%s: chdir dd/xx succeeded!\n", s); 3158: 85ca mv a1,s2 315a: 00003517 auipc a0,0x3 315e: 65e50513 addi a0,a0,1630 # 67b8 <malloc+0x184e> 3162: 555010ef jal 4eb6 <printf> - exit(1); 3166: 4505 li a0,1 3168: 11f010ef jal 4a86 <exit> - printf("%s: unlink dd/dd/ff failed\n", s); 316c: 85ca mv a1,s2 316e: 00003517 auipc a0,0x3 3172: 2da50513 addi a0,a0,730 # 6448 <malloc+0x14de> 3176: 541010ef jal 4eb6 <printf> - exit(1); 317a: 4505 li a0,1 317c: 10b010ef jal 4a86 <exit> - printf("%s: unlink dd/ff failed\n", s); 3180: 85ca mv a1,s2 3182: 00003517 auipc a0,0x3 3186: 65650513 addi a0,a0,1622 # 67d8 <malloc+0x186e> 318a: 52d010ef jal 4eb6 <printf> - exit(1); 318e: 4505 li a0,1 3190: 0f7010ef jal 4a86 <exit> - printf("%s: unlink non-empty dd succeeded!\n", s); 3194: 85ca mv a1,s2 3196: 00003517 auipc a0,0x3 319a: 66250513 addi a0,a0,1634 # 67f8 <malloc+0x188e> 319e: 519010ef jal 4eb6 <printf> - exit(1); 31a2: 4505 li a0,1 31a4: 0e3010ef jal 4a86 <exit> - printf("%s: unlink dd/dd failed\n", s); 31a8: 85ca mv a1,s2 31aa: 00003517 auipc a0,0x3 31ae: 67e50513 addi a0,a0,1662 # 6828 <malloc+0x18be> 31b2: 505010ef jal 4eb6 <printf> - exit(1); 31b6: 4505 li a0,1 31b8: 0cf010ef jal 4a86 <exit> - printf("%s: unlink dd failed\n", s); 31bc: 85ca mv a1,s2 31be: 00003517 auipc a0,0x3 31c2: 68a50513 addi a0,a0,1674 # 6848 <malloc+0x18de> 31c6: 4f1010ef jal 4eb6 <printf> - exit(1); 31ca: 4505 li a0,1 31cc: 0bb010ef jal 4a86 <exit> 00000000000031d0 <rmdot>: -{ 31d0: 1101 addi sp,sp,-32 31d2: ec06 sd ra,24(sp) 31d4: e822 sd s0,16(sp) 31d6: e426 sd s1,8(sp) 31d8: 1000 addi s0,sp,32 31da: 84aa mv s1,a0 - if(mkdir("dots") != 0){ 31dc: 00003517 auipc a0,0x3 31e0: 68450513 addi a0,a0,1668 # 6860 <malloc+0x18f6> 31e4: 10b010ef jal 4aee <mkdir> 31e8: e53d bnez a0,3256 <rmdot+0x86> - if(chdir("dots") != 0){ 31ea: 00003517 auipc a0,0x3 31ee: 67650513 addi a0,a0,1654 # 6860 <malloc+0x18f6> 31f2: 105010ef jal 4af6 <chdir> 31f6: e935 bnez a0,326a <rmdot+0x9a> - if(unlink(".") == 0){ 31f8: 00002517 auipc a0,0x2 31fc: 59850513 addi a0,a0,1432 # 5790 <malloc+0x826> 3200: 0d7010ef jal 4ad6 <unlink> 3204: cd2d beqz a0,327e <rmdot+0xae> - if(unlink("..") == 0){ 3206: 00003517 auipc a0,0x3 320a: 0aa50513 addi a0,a0,170 # 62b0 <malloc+0x1346> 320e: 0c9010ef jal 4ad6 <unlink> 3212: c141 beqz a0,3292 <rmdot+0xc2> - if(chdir("/") != 0){ 3214: 00003517 auipc a0,0x3 3218: 04450513 addi a0,a0,68 # 6258 <malloc+0x12ee> 321c: 0db010ef jal 4af6 <chdir> 3220: e159 bnez a0,32a6 <rmdot+0xd6> - if(unlink("dots/.") == 0){ 3222: 00003517 auipc a0,0x3 3226: 6a650513 addi a0,a0,1702 # 68c8 <malloc+0x195e> 322a: 0ad010ef jal 4ad6 <unlink> 322e: c551 beqz a0,32ba <rmdot+0xea> - if(unlink("dots/..") == 0){ 3230: 00003517 auipc a0,0x3 3234: 6c050513 addi a0,a0,1728 # 68f0 <malloc+0x1986> 3238: 09f010ef jal 4ad6 <unlink> 323c: c949 beqz a0,32ce <rmdot+0xfe> - if(unlink("dots") != 0){ 323e: 00003517 auipc a0,0x3 3242: 62250513 addi a0,a0,1570 # 6860 <malloc+0x18f6> 3246: 091010ef jal 4ad6 <unlink> 324a: ed41 bnez a0,32e2 <rmdot+0x112> -} 324c: 60e2 ld ra,24(sp) 324e: 6442 ld s0,16(sp) 3250: 64a2 ld s1,8(sp) 3252: 6105 addi sp,sp,32 3254: 8082 ret - printf("%s: mkdir dots failed\n", s); 3256: 85a6 mv a1,s1 3258: 00003517 auipc a0,0x3 325c: 61050513 addi a0,a0,1552 # 6868 <malloc+0x18fe> 3260: 457010ef jal 4eb6 <printf> - exit(1); 3264: 4505 li a0,1 3266: 021010ef jal 4a86 <exit> - printf("%s: chdir dots failed\n", s); 326a: 85a6 mv a1,s1 326c: 00003517 auipc a0,0x3 3270: 61450513 addi a0,a0,1556 # 6880 <malloc+0x1916> 3274: 443010ef jal 4eb6 <printf> - exit(1); 3278: 4505 li a0,1 327a: 00d010ef jal 4a86 <exit> - printf("%s: rm . worked!\n", s); 327e: 85a6 mv a1,s1 3280: 00003517 auipc a0,0x3 3284: 61850513 addi a0,a0,1560 # 6898 <malloc+0x192e> 3288: 42f010ef jal 4eb6 <printf> - exit(1); 328c: 4505 li a0,1 328e: 7f8010ef jal 4a86 <exit> - printf("%s: rm .. worked!\n", s); 3292: 85a6 mv a1,s1 3294: 00003517 auipc a0,0x3 3298: 61c50513 addi a0,a0,1564 # 68b0 <malloc+0x1946> 329c: 41b010ef jal 4eb6 <printf> - exit(1); 32a0: 4505 li a0,1 32a2: 7e4010ef jal 4a86 <exit> - printf("%s: chdir / failed\n", s); 32a6: 85a6 mv a1,s1 32a8: 00003517 auipc a0,0x3 32ac: fb850513 addi a0,a0,-72 # 6260 <malloc+0x12f6> 32b0: 407010ef jal 4eb6 <printf> - exit(1); 32b4: 4505 li a0,1 32b6: 7d0010ef jal 4a86 <exit> - printf("%s: unlink dots/. worked!\n", s); 32ba: 85a6 mv a1,s1 32bc: 00003517 auipc a0,0x3 32c0: 61450513 addi a0,a0,1556 # 68d0 <malloc+0x1966> 32c4: 3f3010ef jal 4eb6 <printf> - exit(1); 32c8: 4505 li a0,1 32ca: 7bc010ef jal 4a86 <exit> - printf("%s: unlink dots/.. worked!\n", s); 32ce: 85a6 mv a1,s1 32d0: 00003517 auipc a0,0x3 32d4: 62850513 addi a0,a0,1576 # 68f8 <malloc+0x198e> 32d8: 3df010ef jal 4eb6 <printf> - exit(1); 32dc: 4505 li a0,1 32de: 7a8010ef jal 4a86 <exit> - printf("%s: unlink dots failed!\n", s); 32e2: 85a6 mv a1,s1 32e4: 00003517 auipc a0,0x3 32e8: 63450513 addi a0,a0,1588 # 6918 <malloc+0x19ae> 32ec: 3cb010ef jal 4eb6 <printf> - exit(1); 32f0: 4505 li a0,1 32f2: 794010ef jal 4a86 <exit> 00000000000032f6 <dirfile>: -{ 32f6: 1101 addi sp,sp,-32 32f8: ec06 sd ra,24(sp) 32fa: e822 sd s0,16(sp) @@ -5667,168 +4258,129 @@ r_sp() 32fe: e04a sd s2,0(sp) 3300: 1000 addi s0,sp,32 3302: 892a mv s2,a0 - fd = open("dirfile", O_CREATE); 3304: 20000593 li a1,512 3308: 00003517 auipc a0,0x3 330c: 63050513 addi a0,a0,1584 # 6938 <malloc+0x19ce> 3310: 7b6010ef jal 4ac6 <open> - if(fd < 0){ 3314: 0c054563 bltz a0,33de <dirfile+0xe8> - close(fd); 3318: 796010ef jal 4aae <close> - if(chdir("dirfile") == 0){ 331c: 00003517 auipc a0,0x3 3320: 61c50513 addi a0,a0,1564 # 6938 <malloc+0x19ce> 3324: 7d2010ef jal 4af6 <chdir> 3328: c569 beqz a0,33f2 <dirfile+0xfc> - fd = open("dirfile/xx", 0); 332a: 4581 li a1,0 332c: 00003517 auipc a0,0x3 3330: 65450513 addi a0,a0,1620 # 6980 <malloc+0x1a16> 3334: 792010ef jal 4ac6 <open> - if(fd >= 0){ 3338: 0c055763 bgez a0,3406 <dirfile+0x110> - fd = open("dirfile/xx", O_CREATE); 333c: 20000593 li a1,512 3340: 00003517 auipc a0,0x3 3344: 64050513 addi a0,a0,1600 # 6980 <malloc+0x1a16> 3348: 77e010ef jal 4ac6 <open> - if(fd >= 0){ 334c: 0c055763 bgez a0,341a <dirfile+0x124> - if(mkdir("dirfile/xx") == 0){ 3350: 00003517 auipc a0,0x3 3354: 63050513 addi a0,a0,1584 # 6980 <malloc+0x1a16> 3358: 796010ef jal 4aee <mkdir> 335c: 0c050963 beqz a0,342e <dirfile+0x138> - if(unlink("dirfile/xx") == 0){ 3360: 00003517 auipc a0,0x3 3364: 62050513 addi a0,a0,1568 # 6980 <malloc+0x1a16> 3368: 76e010ef jal 4ad6 <unlink> 336c: 0c050b63 beqz a0,3442 <dirfile+0x14c> - if(link("README", "dirfile/xx") == 0){ 3370: 00003597 auipc a1,0x3 3374: 61058593 addi a1,a1,1552 # 6980 <malloc+0x1a16> 3378: 00002517 auipc a0,0x2 337c: f0850513 addi a0,a0,-248 # 5280 <malloc+0x316> 3380: 766010ef jal 4ae6 <link> 3384: 0c050963 beqz a0,3456 <dirfile+0x160> - if(unlink("dirfile") != 0){ 3388: 00003517 auipc a0,0x3 338c: 5b050513 addi a0,a0,1456 # 6938 <malloc+0x19ce> 3390: 746010ef jal 4ad6 <unlink> 3394: 0c051b63 bnez a0,346a <dirfile+0x174> - fd = open(".", O_RDWR); 3398: 4589 li a1,2 339a: 00002517 auipc a0,0x2 339e: 3f650513 addi a0,a0,1014 # 5790 <malloc+0x826> 33a2: 724010ef jal 4ac6 <open> - if(fd >= 0){ 33a6: 0c055c63 bgez a0,347e <dirfile+0x188> - fd = open(".", 0); 33aa: 4581 li a1,0 33ac: 00002517 auipc a0,0x2 33b0: 3e450513 addi a0,a0,996 # 5790 <malloc+0x826> 33b4: 712010ef jal 4ac6 <open> 33b8: 84aa mv s1,a0 - if(write(fd, "x", 1) > 0){ 33ba: 4605 li a2,1 33bc: 00002597 auipc a1,0x2 33c0: d5c58593 addi a1,a1,-676 # 5118 <malloc+0x1ae> 33c4: 6e2010ef jal 4aa6 <write> 33c8: 0ca04563 bgtz a0,3492 <dirfile+0x19c> - close(fd); 33cc: 8526 mv a0,s1 33ce: 6e0010ef jal 4aae <close> -} 33d2: 60e2 ld ra,24(sp) 33d4: 6442 ld s0,16(sp) 33d6: 64a2 ld s1,8(sp) 33d8: 6902 ld s2,0(sp) 33da: 6105 addi sp,sp,32 33dc: 8082 ret - printf("%s: create dirfile failed\n", s); 33de: 85ca mv a1,s2 33e0: 00003517 auipc a0,0x3 33e4: 56050513 addi a0,a0,1376 # 6940 <malloc+0x19d6> 33e8: 2cf010ef jal 4eb6 <printf> - exit(1); 33ec: 4505 li a0,1 33ee: 698010ef jal 4a86 <exit> - printf("%s: chdir dirfile succeeded!\n", s); 33f2: 85ca mv a1,s2 33f4: 00003517 auipc a0,0x3 33f8: 56c50513 addi a0,a0,1388 # 6960 <malloc+0x19f6> 33fc: 2bb010ef jal 4eb6 <printf> - exit(1); 3400: 4505 li a0,1 3402: 684010ef jal 4a86 <exit> - printf("%s: create dirfile/xx succeeded!\n", s); 3406: 85ca mv a1,s2 3408: 00003517 auipc a0,0x3 340c: 58850513 addi a0,a0,1416 # 6990 <malloc+0x1a26> 3410: 2a7010ef jal 4eb6 <printf> - exit(1); 3414: 4505 li a0,1 3416: 670010ef jal 4a86 <exit> - printf("%s: create dirfile/xx succeeded!\n", s); 341a: 85ca mv a1,s2 341c: 00003517 auipc a0,0x3 3420: 57450513 addi a0,a0,1396 # 6990 <malloc+0x1a26> 3424: 293010ef jal 4eb6 <printf> - exit(1); 3428: 4505 li a0,1 342a: 65c010ef jal 4a86 <exit> - printf("%s: mkdir dirfile/xx succeeded!\n", s); 342e: 85ca mv a1,s2 3430: 00003517 auipc a0,0x3 3434: 58850513 addi a0,a0,1416 # 69b8 <malloc+0x1a4e> 3438: 27f010ef jal 4eb6 <printf> - exit(1); 343c: 4505 li a0,1 343e: 648010ef jal 4a86 <exit> - printf("%s: unlink dirfile/xx succeeded!\n", s); 3442: 85ca mv a1,s2 3444: 00003517 auipc a0,0x3 3448: 59c50513 addi a0,a0,1436 # 69e0 <malloc+0x1a76> 344c: 26b010ef jal 4eb6 <printf> - exit(1); 3450: 4505 li a0,1 3452: 634010ef jal 4a86 <exit> - printf("%s: link to dirfile/xx succeeded!\n", s); 3456: 85ca mv a1,s2 3458: 00003517 auipc a0,0x3 345c: 5b050513 addi a0,a0,1456 # 6a08 <malloc+0x1a9e> 3460: 257010ef jal 4eb6 <printf> - exit(1); 3464: 4505 li a0,1 3466: 620010ef jal 4a86 <exit> - printf("%s: unlink dirfile failed!\n", s); 346a: 85ca mv a1,s2 346c: 00003517 auipc a0,0x3 3470: 5c450513 addi a0,a0,1476 # 6a30 <malloc+0x1ac6> 3474: 243010ef jal 4eb6 <printf> - exit(1); 3478: 4505 li a0,1 347a: 60c010ef jal 4a86 <exit> - printf("%s: open . for writing succeeded!\n", s); 347e: 85ca mv a1,s2 3480: 00003517 auipc a0,0x3 3484: 5d050513 addi a0,a0,1488 # 6a50 <malloc+0x1ae6> 3488: 22f010ef jal 4eb6 <printf> - exit(1); 348c: 4505 li a0,1 348e: 5f8010ef jal 4a86 <exit> - printf("%s: write . succeeded!\n", s); 3492: 85ca mv a1,s2 3494: 00003517 auipc a0,0x3 3498: 5e450513 addi a0,a0,1508 # 6a78 <malloc+0x1b0e> 349c: 21b010ef jal 4eb6 <printf> - exit(1); 34a0: 4505 li a0,1 34a2: 5e4010ef jal 4a86 <exit> 00000000000034a6 <iref>: -{ 34a6: 7139 addi sp,sp,-64 34a8: fc06 sd ra,56(sp) 34aa: f822 sd s0,48(sp) @@ -5841,95 +4393,68 @@ r_sp() 34b8: 0080 addi s0,sp,64 34ba: 8b2a mv s6,a0 34bc: 03300913 li s2,51 - if(mkdir("irefd") != 0){ 34c0: 00003a17 auipc s4,0x3 34c4: 5d0a0a13 addi s4,s4,1488 # 6a90 <malloc+0x1b26> - mkdir(""); 34c8: 00003497 auipc s1,0x3 34cc: 0d048493 addi s1,s1,208 # 6598 <malloc+0x162e> - link("README", ""); 34d0: 00002a97 auipc s5,0x2 34d4: db0a8a93 addi s5,s5,-592 # 5280 <malloc+0x316> - fd = open("xx", O_CREATE); 34d8: 00003997 auipc s3,0x3 34dc: 4b098993 addi s3,s3,1200 # 6988 <malloc+0x1a1e> 34e0: a835 j 351c <iref+0x76> - printf("%s: mkdir irefd failed\n", s); 34e2: 85da mv a1,s6 34e4: 00003517 auipc a0,0x3 34e8: 5b450513 addi a0,a0,1460 # 6a98 <malloc+0x1b2e> 34ec: 1cb010ef jal 4eb6 <printf> - exit(1); 34f0: 4505 li a0,1 34f2: 594010ef jal 4a86 <exit> - printf("%s: chdir irefd failed\n", s); 34f6: 85da mv a1,s6 34f8: 00003517 auipc a0,0x3 34fc: 5b850513 addi a0,a0,1464 # 6ab0 <malloc+0x1b46> 3500: 1b7010ef jal 4eb6 <printf> - exit(1); 3504: 4505 li a0,1 3506: 580010ef jal 4a86 <exit> - close(fd); 350a: 5a4010ef jal 4aae <close> 350e: a82d j 3548 <iref+0xa2> - unlink("xx"); 3510: 854e mv a0,s3 3512: 5c4010ef jal 4ad6 <unlink> - for(i = 0; i < NINODE + 1; i++){ 3516: 397d addiw s2,s2,-1 3518: 04090263 beqz s2,355c <iref+0xb6> - if(mkdir("irefd") != 0){ 351c: 8552 mv a0,s4 351e: 5d0010ef jal 4aee <mkdir> 3522: f161 bnez a0,34e2 <iref+0x3c> - if(chdir("irefd") != 0){ 3524: 8552 mv a0,s4 3526: 5d0010ef jal 4af6 <chdir> 352a: f571 bnez a0,34f6 <iref+0x50> - mkdir(""); 352c: 8526 mv a0,s1 352e: 5c0010ef jal 4aee <mkdir> - link("README", ""); 3532: 85a6 mv a1,s1 3534: 8556 mv a0,s5 3536: 5b0010ef jal 4ae6 <link> - fd = open("", O_CREATE); 353a: 20000593 li a1,512 353e: 8526 mv a0,s1 3540: 586010ef jal 4ac6 <open> - if(fd >= 0) 3544: fc0553e3 bgez a0,350a <iref+0x64> - fd = open("xx", O_CREATE); 3548: 20000593 li a1,512 354c: 854e mv a0,s3 354e: 578010ef jal 4ac6 <open> - if(fd >= 0) 3552: fa054fe3 bltz a0,3510 <iref+0x6a> - close(fd); 3556: 558010ef jal 4aae <close> 355a: bf5d j 3510 <iref+0x6a> 355c: 03300493 li s1,51 - chdir(".."); 3560: 00003997 auipc s3,0x3 3564: d5098993 addi s3,s3,-688 # 62b0 <malloc+0x1346> - unlink("irefd"); 3568: 00003917 auipc s2,0x3 356c: 52890913 addi s2,s2,1320 # 6a90 <malloc+0x1b26> - chdir(".."); 3570: 854e mv a0,s3 3572: 584010ef jal 4af6 <chdir> - unlink("irefd"); 3576: 854a mv a0,s2 3578: 55e010ef jal 4ad6 <unlink> - for(i = 0; i < NINODE + 1; i++){ 357c: 34fd addiw s1,s1,-1 357e: f8ed bnez s1,3570 <iref+0xca> - chdir("/"); 3580: 00003517 auipc a0,0x3 3584: cd850513 addi a0,a0,-808 # 6258 <malloc+0x12ee> 3588: 56e010ef jal 4af6 <chdir> -} 358c: 70e2 ld ra,56(sp) 358e: 7442 ld s0,48(sp) 3590: 74a2 ld s1,40(sp) @@ -5942,152 +4467,114 @@ r_sp() 359e: 8082 ret 00000000000035a0 <openiputtest>: -{ 35a0: 7179 addi sp,sp,-48 35a2: f406 sd ra,40(sp) 35a4: f022 sd s0,32(sp) 35a6: ec26 sd s1,24(sp) 35a8: 1800 addi s0,sp,48 35aa: 84aa mv s1,a0 - if(mkdir("oidir") < 0){ 35ac: 00003517 auipc a0,0x3 35b0: 51c50513 addi a0,a0,1308 # 6ac8 <malloc+0x1b5e> 35b4: 53a010ef jal 4aee <mkdir> 35b8: 02054a63 bltz a0,35ec <openiputtest+0x4c> - pid = fork(); 35bc: 4c2010ef jal 4a7e <fork> - if(pid < 0){ 35c0: 04054063 bltz a0,3600 <openiputtest+0x60> - if(pid == 0){ 35c4: e939 bnez a0,361a <openiputtest+0x7a> - int fd = open("oidir", O_RDWR); 35c6: 4589 li a1,2 35c8: 00003517 auipc a0,0x3 35cc: 50050513 addi a0,a0,1280 # 6ac8 <malloc+0x1b5e> 35d0: 4f6010ef jal 4ac6 <open> - if(fd >= 0){ 35d4: 04054063 bltz a0,3614 <openiputtest+0x74> - printf("%s: open directory for write succeeded\n", s); 35d8: 85a6 mv a1,s1 35da: 00003517 auipc a0,0x3 35de: 50e50513 addi a0,a0,1294 # 6ae8 <malloc+0x1b7e> 35e2: 0d5010ef jal 4eb6 <printf> - exit(1); 35e6: 4505 li a0,1 35e8: 49e010ef jal 4a86 <exit> - printf("%s: mkdir oidir failed\n", s); 35ec: 85a6 mv a1,s1 35ee: 00003517 auipc a0,0x3 35f2: 4e250513 addi a0,a0,1250 # 6ad0 <malloc+0x1b66> 35f6: 0c1010ef jal 4eb6 <printf> - exit(1); 35fa: 4505 li a0,1 35fc: 48a010ef jal 4a86 <exit> - printf("%s: fork failed\n", s); 3600: 85a6 mv a1,s1 3602: 00002517 auipc a0,0x2 3606: 33650513 addi a0,a0,822 # 5938 <malloc+0x9ce> 360a: 0ad010ef jal 4eb6 <printf> - exit(1); 360e: 4505 li a0,1 3610: 476010ef jal 4a86 <exit> - exit(0); 3614: 4501 li a0,0 3616: 470010ef jal 4a86 <exit> - sleep(1); 361a: 4505 li a0,1 361c: 4fa010ef jal 4b16 <sleep> - if(unlink("oidir") != 0){ 3620: 00003517 auipc a0,0x3 3624: 4a850513 addi a0,a0,1192 # 6ac8 <malloc+0x1b5e> 3628: 4ae010ef jal 4ad6 <unlink> 362c: c919 beqz a0,3642 <openiputtest+0xa2> - printf("%s: unlink failed\n", s); 362e: 85a6 mv a1,s1 3630: 00002517 auipc a0,0x2 3634: 4f850513 addi a0,a0,1272 # 5b28 <malloc+0xbbe> 3638: 07f010ef jal 4eb6 <printf> - exit(1); 363c: 4505 li a0,1 363e: 448010ef jal 4a86 <exit> - wait(&xstatus); 3642: fdc40513 addi a0,s0,-36 3646: 448010ef jal 4a8e <wait> - exit(xstatus); 364a: fdc42503 lw a0,-36(s0) 364e: 438010ef jal 4a86 <exit> 0000000000003652 <forkforkfork>: -{ 3652: 1101 addi sp,sp,-32 3654: ec06 sd ra,24(sp) 3656: e822 sd s0,16(sp) 3658: e426 sd s1,8(sp) 365a: 1000 addi s0,sp,32 365c: 84aa mv s1,a0 - unlink("stopforking"); 365e: 00003517 auipc a0,0x3 3662: 4b250513 addi a0,a0,1202 # 6b10 <malloc+0x1ba6> 3666: 470010ef jal 4ad6 <unlink> - int pid = fork(); 366a: 414010ef jal 4a7e <fork> - if(pid < 0){ 366e: 02054b63 bltz a0,36a4 <forkforkfork+0x52> - if(pid == 0){ 3672: c139 beqz a0,36b8 <forkforkfork+0x66> - sleep(20); // two seconds 3674: 4551 li a0,20 3676: 4a0010ef jal 4b16 <sleep> - close(open("stopforking", O_CREATE|O_RDWR)); 367a: 20200593 li a1,514 367e: 00003517 auipc a0,0x3 3682: 49250513 addi a0,a0,1170 # 6b10 <malloc+0x1ba6> 3686: 440010ef jal 4ac6 <open> 368a: 424010ef jal 4aae <close> - wait(0); 368e: 4501 li a0,0 3690: 3fe010ef jal 4a8e <wait> - sleep(10); // one second 3694: 4529 li a0,10 3696: 480010ef jal 4b16 <sleep> -} 369a: 60e2 ld ra,24(sp) 369c: 6442 ld s0,16(sp) 369e: 64a2 ld s1,8(sp) 36a0: 6105 addi sp,sp,32 36a2: 8082 ret - printf("%s: fork failed", s); 36a4: 85a6 mv a1,s1 36a6: 00002517 auipc a0,0x2 36aa: 45250513 addi a0,a0,1106 # 5af8 <malloc+0xb8e> 36ae: 009010ef jal 4eb6 <printf> - exit(1); 36b2: 4505 li a0,1 36b4: 3d2010ef jal 4a86 <exit> - int fd = open("stopforking", 0); 36b8: 00003497 auipc s1,0x3 36bc: 45848493 addi s1,s1,1112 # 6b10 <malloc+0x1ba6> 36c0: 4581 li a1,0 36c2: 8526 mv a0,s1 36c4: 402010ef jal 4ac6 <open> - if(fd >= 0){ 36c8: 02055163 bgez a0,36ea <forkforkfork+0x98> - if(fork() < 0){ 36cc: 3b2010ef jal 4a7e <fork> 36d0: fe0558e3 bgez a0,36c0 <forkforkfork+0x6e> - close(open("stopforking", O_CREATE|O_RDWR)); 36d4: 20200593 li a1,514 36d8: 00003517 auipc a0,0x3 36dc: 43850513 addi a0,a0,1080 # 6b10 <malloc+0x1ba6> 36e0: 3e6010ef jal 4ac6 <open> 36e4: 3ca010ef jal 4aae <close> 36e8: bfe1 j 36c0 <forkforkfork+0x6e> - exit(0); 36ea: 4501 li a0,0 36ec: 39a010ef jal 4a86 <exit> 00000000000036f0 <killstatus>: -{ 36f0: 7139 addi sp,sp,-64 36f2: fc06 sd ra,56(sp) 36f4: f822 sd s0,48(sp) @@ -6098,56 +4585,39 @@ r_sp() 36fe: 0080 addi s0,sp,64 3700: 8a2a mv s4,a0 3702: 06400913 li s2,100 - if(xst != -1) { 3706: 59fd li s3,-1 - int pid1 = fork(); 3708: 376010ef jal 4a7e <fork> 370c: 84aa mv s1,a0 - if(pid1 < 0){ 370e: 02054763 bltz a0,373c <killstatus+0x4c> - if(pid1 == 0){ 3712: cd1d beqz a0,3750 <killstatus+0x60> - sleep(1); 3714: 4505 li a0,1 3716: 400010ef jal 4b16 <sleep> - kill(pid1); 371a: 8526 mv a0,s1 371c: 39a010ef jal 4ab6 <kill> - wait(&xst); 3720: fcc40513 addi a0,s0,-52 3724: 36a010ef jal 4a8e <wait> - if(xst != -1) { 3728: fcc42783 lw a5,-52(s0) 372c: 03379563 bne a5,s3,3756 <killstatus+0x66> - for(int i = 0; i < 100; i++){ 3730: 397d addiw s2,s2,-1 3732: fc091be3 bnez s2,3708 <killstatus+0x18> - exit(0); 3736: 4501 li a0,0 3738: 34e010ef jal 4a86 <exit> - printf("%s: fork failed\n", s); 373c: 85d2 mv a1,s4 373e: 00002517 auipc a0,0x2 3742: 1fa50513 addi a0,a0,506 # 5938 <malloc+0x9ce> 3746: 770010ef jal 4eb6 <printf> - exit(1); 374a: 4505 li a0,1 374c: 33a010ef jal 4a86 <exit> - getpid(); 3750: 3b6010ef jal 4b06 <getpid> - while(1) { 3754: bff5 j 3750 <killstatus+0x60> - printf("%s: status should be -1\n", s); 3756: 85d2 mv a1,s4 3758: 00003517 auipc a0,0x3 375c: 3c850513 addi a0,a0,968 # 6b20 <malloc+0x1bb6> 3760: 756010ef jal 4eb6 <printf> - exit(1); 3764: 4505 li a0,1 3766: 320010ef jal 4a86 <exit> 000000000000376a <preempt>: -{ 376a: 7139 addi sp,sp,-64 376c: fc06 sd ra,56(sp) 376e: f822 sd s0,48(sp) @@ -6157,54 +4627,36 @@ r_sp() 3776: e852 sd s4,16(sp) 3778: 0080 addi s0,sp,64 377a: 892a mv s2,a0 - pid1 = fork(); 377c: 302010ef jal 4a7e <fork> - if(pid1 < 0) { 3780: 00054563 bltz a0,378a <preempt+0x20> 3784: 84aa mv s1,a0 - if(pid1 == 0) 3786: ed01 bnez a0,379e <preempt+0x34> - for(;;) 3788: a001 j 3788 <preempt+0x1e> - printf("%s: fork failed", s); 378a: 85ca mv a1,s2 378c: 00002517 auipc a0,0x2 3790: 36c50513 addi a0,a0,876 # 5af8 <malloc+0xb8e> 3794: 722010ef jal 4eb6 <printf> - exit(1); 3798: 4505 li a0,1 379a: 2ec010ef jal 4a86 <exit> - pid2 = fork(); 379e: 2e0010ef jal 4a7e <fork> 37a2: 89aa mv s3,a0 - if(pid2 < 0) { 37a4: 00054463 bltz a0,37ac <preempt+0x42> - if(pid2 == 0) 37a8: ed01 bnez a0,37c0 <preempt+0x56> - for(;;) 37aa: a001 j 37aa <preempt+0x40> - printf("%s: fork failed\n", s); 37ac: 85ca mv a1,s2 37ae: 00002517 auipc a0,0x2 37b2: 18a50513 addi a0,a0,394 # 5938 <malloc+0x9ce> 37b6: 700010ef jal 4eb6 <printf> - exit(1); 37ba: 4505 li a0,1 37bc: 2ca010ef jal 4a86 <exit> - pipe(pfds); 37c0: fc840513 addi a0,s0,-56 37c4: 2d2010ef jal 4a96 <pipe> - pid3 = fork(); 37c8: 2b6010ef jal 4a7e <fork> 37cc: 8a2a mv s4,a0 - if(pid3 < 0) { 37ce: 02054863 bltz a0,37fe <preempt+0x94> - if(pid3 == 0){ 37d2: e921 bnez a0,3822 <preempt+0xb8> - close(pfds[0]); 37d4: fc842503 lw a0,-56(s0) 37d8: 2d6010ef jal 4aae <close> - if(write(pfds[1], "x", 1) != 1) 37dc: 4605 li a2,1 37de: 00002597 auipc a1,0x2 37e2: 93a58593 addi a1,a1,-1734 # 5118 <malloc+0x1ae> @@ -6212,29 +4664,22 @@ r_sp() 37ea: 2bc010ef jal 4aa6 <write> 37ee: 4785 li a5,1 37f0: 02f51163 bne a0,a5,3812 <preempt+0xa8> - close(pfds[1]); 37f4: fcc42503 lw a0,-52(s0) 37f8: 2b6010ef jal 4aae <close> - for(;;) 37fc: a001 j 37fc <preempt+0x92> - printf("%s: fork failed\n", s); 37fe: 85ca mv a1,s2 3800: 00002517 auipc a0,0x2 3804: 13850513 addi a0,a0,312 # 5938 <malloc+0x9ce> 3808: 6ae010ef jal 4eb6 <printf> - exit(1); 380c: 4505 li a0,1 380e: 278010ef jal 4a86 <exit> - printf("%s: preempt write error", s); 3812: 85ca mv a1,s2 3814: 00003517 auipc a0,0x3 3818: 32c50513 addi a0,a0,812 # 6b40 <malloc+0x1bd6> 381c: 69a010ef jal 4eb6 <printf> 3820: bfd1 j 37f4 <preempt+0x8a> - close(pfds[1]); 3822: fcc42503 lw a0,-52(s0) 3826: 288010ef jal 4aae <close> - if(read(pfds[0], buf, sizeof(buf)) != 1){ 382a: 660d lui a2,0x3 382c: 00009597 auipc a1,0x9 3830: 44c58593 addi a1,a1,1100 # cc78 <buf> @@ -6242,12 +4687,10 @@ r_sp() 3838: 266010ef jal 4a9e <read> 383c: 4785 li a5,1 383e: 02f50163 beq a0,a5,3860 <preempt+0xf6> - printf("%s: preempt read error", s); 3842: 85ca mv a1,s2 3844: 00003517 auipc a0,0x3 3848: 31450513 addi a0,a0,788 # 6b58 <malloc+0x1bee> 384c: 66a010ef jal 4eb6 <printf> -} 3850: 70e2 ld ra,56(sp) 3852: 7442 ld s0,48(sp) 3854: 74a2 ld s1,40(sp) @@ -6256,39 +4699,29 @@ r_sp() 385a: 6a42 ld s4,16(sp) 385c: 6121 addi sp,sp,64 385e: 8082 ret - close(pfds[0]); 3860: fc842503 lw a0,-56(s0) 3864: 24a010ef jal 4aae <close> - printf("kill... "); 3868: 00003517 auipc a0,0x3 386c: 30850513 addi a0,a0,776 # 6b70 <malloc+0x1c06> 3870: 646010ef jal 4eb6 <printf> - kill(pid1); 3874: 8526 mv a0,s1 3876: 240010ef jal 4ab6 <kill> - kill(pid2); 387a: 854e mv a0,s3 387c: 23a010ef jal 4ab6 <kill> - kill(pid3); 3880: 8552 mv a0,s4 3882: 234010ef jal 4ab6 <kill> - printf("wait... "); 3886: 00003517 auipc a0,0x3 388a: 2fa50513 addi a0,a0,762 # 6b80 <malloc+0x1c16> 388e: 628010ef jal 4eb6 <printf> - wait(0); 3892: 4501 li a0,0 3894: 1fa010ef jal 4a8e <wait> - wait(0); 3898: 4501 li a0,0 389a: 1f4010ef jal 4a8e <wait> - wait(0); 389e: 4501 li a0,0 38a0: 1ee010ef jal 4a8e <wait> 38a4: b775 j 3850 <preempt+0xe6> 00000000000038a6 <reparent>: -{ 38a6: 7179 addi sp,sp,-48 38a8: f406 sd ra,40(sp) 38aa: f022 sd s0,32(sp) @@ -6298,59 +4731,42 @@ r_sp() 38b2: e052 sd s4,0(sp) 38b4: 1800 addi s0,sp,48 38b6: 89aa mv s3,a0 - int master_pid = getpid(); 38b8: 24e010ef jal 4b06 <getpid> 38bc: 8a2a mv s4,a0 38be: 0c800913 li s2,200 - int pid = fork(); 38c2: 1bc010ef jal 4a7e <fork> 38c6: 84aa mv s1,a0 - if(pid < 0){ 38c8: 00054e63 bltz a0,38e4 <reparent+0x3e> - if(pid){ 38cc: c121 beqz a0,390c <reparent+0x66> - if(wait(0) != pid){ 38ce: 4501 li a0,0 38d0: 1be010ef jal 4a8e <wait> 38d4: 02951263 bne a0,s1,38f8 <reparent+0x52> - for(int i = 0; i < 200; i++){ 38d8: 397d addiw s2,s2,-1 38da: fe0914e3 bnez s2,38c2 <reparent+0x1c> - exit(0); 38de: 4501 li a0,0 38e0: 1a6010ef jal 4a86 <exit> - printf("%s: fork failed\n", s); 38e4: 85ce mv a1,s3 38e6: 00002517 auipc a0,0x2 38ea: 05250513 addi a0,a0,82 # 5938 <malloc+0x9ce> 38ee: 5c8010ef jal 4eb6 <printf> - exit(1); 38f2: 4505 li a0,1 38f4: 192010ef jal 4a86 <exit> - printf("%s: wait wrong pid\n", s); 38f8: 85ce mv a1,s3 38fa: 00002517 auipc a0,0x2 38fe: 1c650513 addi a0,a0,454 # 5ac0 <malloc+0xb56> 3902: 5b4010ef jal 4eb6 <printf> - exit(1); 3906: 4505 li a0,1 3908: 17e010ef jal 4a86 <exit> - int pid2 = fork(); 390c: 172010ef jal 4a7e <fork> - if(pid2 < 0){ 3910: 00054563 bltz a0,391a <reparent+0x74> - exit(0); 3914: 4501 li a0,0 3916: 170010ef jal 4a86 <exit> - kill(master_pid); 391a: 8552 mv a0,s4 391c: 19a010ef jal 4ab6 <kill> - exit(1); 3920: 4505 li a0,1 3922: 164010ef jal 4a86 <exit> 0000000000003926 <sbrkfail>: -{ 3926: 7119 addi sp,sp,-128 3928: fc86 sd ra,120(sp) 392a: f8a2 sd s0,112(sp) @@ -6361,93 +4777,69 @@ r_sp() 3934: e4d6 sd s5,72(sp) 3936: 0100 addi s0,sp,128 3938: 8aaa mv s5,a0 - if(pipe(fds) != 0){ 393a: fb040513 addi a0,s0,-80 393e: 158010ef jal 4a96 <pipe> 3942: e901 bnez a0,3952 <sbrkfail+0x2c> 3944: f8040493 addi s1,s0,-128 3948: fa840993 addi s3,s0,-88 394c: 8926 mv s2,s1 - if(pids[i] != -1) 394e: 5a7d li s4,-1 3950: a0a1 j 3998 <sbrkfail+0x72> - printf("%s: pipe() failed\n", s); 3952: 85d6 mv a1,s5 3954: 00002517 auipc a0,0x2 3958: 0ec50513 addi a0,a0,236 # 5a40 <malloc+0xad6> 395c: 55a010ef jal 4eb6 <printf> - exit(1); 3960: 4505 li a0,1 3962: 124010ef jal 4a86 <exit> - sbrk(BIG - (uint64)sbrk(0)); 3966: 1a8010ef jal 4b0e <sbrk> 396a: 064007b7 lui a5,0x6400 396e: 40a7853b subw a0,a5,a0 3972: 19c010ef jal 4b0e <sbrk> - write(fds[1], "x", 1); 3976: 4605 li a2,1 3978: 00001597 auipc a1,0x1 397c: 7a058593 addi a1,a1,1952 # 5118 <malloc+0x1ae> 3980: fb442503 lw a0,-76(s0) 3984: 122010ef jal 4aa6 <write> - for(;;) sleep(1000); 3988: 3e800513 li a0,1000 398c: 18a010ef jal 4b16 <sleep> 3990: bfe5 j 3988 <sbrkfail+0x62> - for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ 3992: 0911 addi s2,s2,4 3994: 03390163 beq s2,s3,39b6 <sbrkfail+0x90> - if((pids[i] = fork()) == 0){ 3998: 0e6010ef jal 4a7e <fork> 399c: 00a92023 sw a0,0(s2) 39a0: d179 beqz a0,3966 <sbrkfail+0x40> - if(pids[i] != -1) 39a2: ff4508e3 beq a0,s4,3992 <sbrkfail+0x6c> - read(fds[0], &scratch, 1); 39a6: 4605 li a2,1 39a8: faf40593 addi a1,s0,-81 39ac: fb042503 lw a0,-80(s0) 39b0: 0ee010ef jal 4a9e <read> 39b4: bff9 j 3992 <sbrkfail+0x6c> - c = sbrk(PGSIZE); 39b6: 6505 lui a0,0x1 39b8: 156010ef jal 4b0e <sbrk> 39bc: 8a2a mv s4,a0 - if(pids[i] == -1) 39be: 597d li s2,-1 39c0: a021 j 39c8 <sbrkfail+0xa2> - for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ 39c2: 0491 addi s1,s1,4 39c4: 01348b63 beq s1,s3,39da <sbrkfail+0xb4> - if(pids[i] == -1) 39c8: 4088 lw a0,0(s1) 39ca: ff250ce3 beq a0,s2,39c2 <sbrkfail+0x9c> - kill(pids[i]); 39ce: 0e8010ef jal 4ab6 <kill> - wait(0); 39d2: 4501 li a0,0 39d4: 0ba010ef jal 4a8e <wait> 39d8: b7ed j 39c2 <sbrkfail+0x9c> - if(c == (char*)0xffffffffffffffffL){ 39da: 57fd li a5,-1 39dc: 02fa0d63 beq s4,a5,3a16 <sbrkfail+0xf0> - pid = fork(); 39e0: 09e010ef jal 4a7e <fork> 39e4: 84aa mv s1,a0 - if(pid < 0){ 39e6: 04054263 bltz a0,3a2a <sbrkfail+0x104> - if(pid == 0){ 39ea: c931 beqz a0,3a3e <sbrkfail+0x118> - wait(&xstatus); 39ec: fbc40513 addi a0,s0,-68 39f0: 09e010ef jal 4a8e <wait> - if(xstatus != -1 && xstatus != 2) 39f4: fbc42783 lw a5,-68(s0) 39f8: 577d li a4,-1 39fa: 00e78563 beq a5,a4,3a04 <sbrkfail+0xde> 39fe: 4709 li a4,2 3a00: 06e79d63 bne a5,a4,3a7a <sbrkfail+0x154> -} 3a04: 70e6 ld ra,120(sp) 3a06: 7446 ld s0,112(sp) 3a08: 74a6 ld s1,104(sp) @@ -6457,55 +4849,42 @@ r_sp() 3a10: 6aa6 ld s5,72(sp) 3a12: 6109 addi sp,sp,128 3a14: 8082 ret - printf("%s: failed sbrk leaked memory\n", s); 3a16: 85d6 mv a1,s5 3a18: 00003517 auipc a0,0x3 3a1c: 17850513 addi a0,a0,376 # 6b90 <malloc+0x1c26> 3a20: 496010ef jal 4eb6 <printf> - exit(1); 3a24: 4505 li a0,1 3a26: 060010ef jal 4a86 <exit> - printf("%s: fork failed\n", s); 3a2a: 85d6 mv a1,s5 3a2c: 00002517 auipc a0,0x2 3a30: f0c50513 addi a0,a0,-244 # 5938 <malloc+0x9ce> 3a34: 482010ef jal 4eb6 <printf> - exit(1); 3a38: 4505 li a0,1 3a3a: 04c010ef jal 4a86 <exit> - a = sbrk(0); 3a3e: 4501 li a0,0 3a40: 0ce010ef jal 4b0e <sbrk> 3a44: 892a mv s2,a0 - sbrk(10*BIG); 3a46: 3e800537 lui a0,0x3e800 3a4a: 0c4010ef jal 4b0e <sbrk> - for (i = 0; i < 10*BIG; i += PGSIZE) { 3a4e: 87ca mv a5,s2 3a50: 3e800737 lui a4,0x3e800 3a54: 993a add s2,s2,a4 3a56: 6705 lui a4,0x1 - n += *(a+i); 3a58: 0007c683 lbu a3,0(a5) # 6400000 <base+0x63f0388> 3a5c: 9cb5 addw s1,s1,a3 - for (i = 0; i < 10*BIG; i += PGSIZE) { 3a5e: 97ba add a5,a5,a4 3a60: fef91ce3 bne s2,a5,3a58 <sbrkfail+0x132> - printf("%s: allocate a lot of memory succeeded %d\n", s, n); 3a64: 8626 mv a2,s1 3a66: 85d6 mv a1,s5 3a68: 00003517 auipc a0,0x3 3a6c: 14850513 addi a0,a0,328 # 6bb0 <malloc+0x1c46> 3a70: 446010ef jal 4eb6 <printf> - exit(1); 3a74: 4505 li a0,1 3a76: 010010ef jal 4a86 <exit> - exit(1); 3a7a: 4505 li a0,1 3a7c: 00a010ef jal 4a86 <exit> 0000000000003a80 <mem>: -{ 3a80: 7139 addi sp,sp,-64 3a82: fc06 sd ra,56(sp) 3a84: f822 sd s0,48(sp) @@ -6514,81 +4893,56 @@ r_sp() 3a8a: ec4e sd s3,24(sp) 3a8c: 0080 addi s0,sp,64 3a8e: 89aa mv s3,a0 - if((pid = fork()) == 0){ 3a90: 7ef000ef jal 4a7e <fork> - m1 = 0; 3a94: 4481 li s1,0 - while((m2 = malloc(10001)) != 0){ 3a96: 6909 lui s2,0x2 3a98: 71190913 addi s2,s2,1809 # 2711 <fourteen+0x79> - if((pid = fork()) == 0){ 3a9c: cd11 beqz a0,3ab8 <mem+0x38> - wait(&xstatus); 3a9e: fcc40513 addi a0,s0,-52 3aa2: 7ed000ef jal 4a8e <wait> - if(xstatus == -1){ 3aa6: fcc42503 lw a0,-52(s0) 3aaa: 57fd li a5,-1 3aac: 04f50363 beq a0,a5,3af2 <mem+0x72> - exit(xstatus); 3ab0: 7d7000ef jal 4a86 <exit> - *(char**)m2 = m1; 3ab4: e104 sd s1,0(a0) - m1 = m2; 3ab6: 84aa mv s1,a0 - while((m2 = malloc(10001)) != 0){ 3ab8: 854a mv a0,s2 3aba: 4b0010ef jal 4f6a <malloc> 3abe: f97d bnez a0,3ab4 <mem+0x34> - while(m1){ 3ac0: c491 beqz s1,3acc <mem+0x4c> - m2 = *(char**)m1; 3ac2: 8526 mv a0,s1 3ac4: 6084 ld s1,0(s1) - free(m1); 3ac6: 422010ef jal 4ee8 <free> - while(m1){ 3aca: fce5 bnez s1,3ac2 <mem+0x42> - m1 = malloc(1024*20); 3acc: 6515 lui a0,0x5 3ace: 49c010ef jal 4f6a <malloc> - if(m1 == 0){ 3ad2: c511 beqz a0,3ade <mem+0x5e> - free(m1); 3ad4: 414010ef jal 4ee8 <free> - exit(0); 3ad8: 4501 li a0,0 3ada: 7ad000ef jal 4a86 <exit> - printf("%s: couldn't allocate mem?!!\n", s); 3ade: 85ce mv a1,s3 3ae0: 00003517 auipc a0,0x3 3ae4: 10050513 addi a0,a0,256 # 6be0 <malloc+0x1c76> 3ae8: 3ce010ef jal 4eb6 <printf> - exit(1); 3aec: 4505 li a0,1 3aee: 799000ef jal 4a86 <exit> - exit(0); 3af2: 4501 li a0,0 3af4: 793000ef jal 4a86 <exit> 0000000000003af8 <sharedfd>: -{ 3af8: 7159 addi sp,sp,-112 3afa: f486 sd ra,104(sp) 3afc: f0a2 sd s0,96(sp) 3afe: e0d2 sd s4,64(sp) 3b00: 1880 addi s0,sp,112 3b02: 8a2a mv s4,a0 - unlink("sharedfd"); 3b04: 00003517 auipc a0,0x3 3b08: 0fc50513 addi a0,a0,252 # 6c00 <malloc+0x1c96> 3b0c: 7cb000ef jal 4ad6 <unlink> - fd = open("sharedfd", O_CREATE|O_RDWR); 3b10: 20200593 li a1,514 3b14: 00003517 auipc a0,0x3 3b18: 0ec50513 addi a0,a0,236 # 6c00 <malloc+0x1c96> 3b1c: 7ab000ef jal 4ac6 <open> - if(fd < 0){ 3b20: 04054863 bltz a0,3b70 <sharedfd+0x78> 3b24: eca6 sd s1,88(sp) 3b26: e8ca sd s2,80(sp) @@ -6597,10 +4951,8 @@ r_sp() 3b2c: f85a sd s6,48(sp) 3b2e: f45e sd s7,40(sp) 3b30: 892a mv s2,a0 - pid = fork(); 3b32: 74d000ef jal 4a7e <fork> 3b36: 89aa mv s3,a0 - memset(buf, pid==0?'c':'p', sizeof(buf)); 3b38: 07000593 li a1,112 3b3c: e119 bnez a0,3b42 <sharedfd+0x4a> 3b3e: 06300593 li a1,99 @@ -6608,19 +4960,15 @@ r_sp() 3b44: fa040513 addi a0,s0,-96 3b48: 559000ef jal 48a0 <memset> 3b4c: 3e800493 li s1,1000 - if(write(fd, buf, sizeof(buf)) != sizeof(buf)){ 3b50: 4629 li a2,10 3b52: fa040593 addi a1,s0,-96 3b56: 854a mv a0,s2 3b58: 74f000ef jal 4aa6 <write> 3b5c: 47a9 li a5,10 3b5e: 02f51963 bne a0,a5,3b90 <sharedfd+0x98> - for(i = 0; i < N; i++){ 3b62: 34fd addiw s1,s1,-1 3b64: f4f5 bnez s1,3b50 <sharedfd+0x58> - if(pid == 0) { 3b66: 02099f63 bnez s3,3ba4 <sharedfd+0xac> - exit(0); 3b6a: 4501 li a0,0 3b6c: 71b000ef jal 4a86 <exit> 3b70: eca6 sd s1,88(sp) @@ -6629,50 +4977,36 @@ r_sp() 3b76: fc56 sd s5,56(sp) 3b78: f85a sd s6,48(sp) 3b7a: f45e sd s7,40(sp) - printf("%s: cannot open sharedfd for writing", s); 3b7c: 85d2 mv a1,s4 3b7e: 00003517 auipc a0,0x3 3b82: 09250513 addi a0,a0,146 # 6c10 <malloc+0x1ca6> 3b86: 330010ef jal 4eb6 <printf> - exit(1); 3b8a: 4505 li a0,1 3b8c: 6fb000ef jal 4a86 <exit> - printf("%s: write sharedfd failed\n", s); 3b90: 85d2 mv a1,s4 3b92: 00003517 auipc a0,0x3 3b96: 0a650513 addi a0,a0,166 # 6c38 <malloc+0x1cce> 3b9a: 31c010ef jal 4eb6 <printf> - exit(1); 3b9e: 4505 li a0,1 3ba0: 6e7000ef jal 4a86 <exit> - wait(&xstatus); 3ba4: f9c40513 addi a0,s0,-100 3ba8: 6e7000ef jal 4a8e <wait> - if(xstatus != 0) 3bac: f9c42983 lw s3,-100(s0) 3bb0: 00098563 beqz s3,3bba <sharedfd+0xc2> - exit(xstatus); 3bb4: 854e mv a0,s3 3bb6: 6d1000ef jal 4a86 <exit> - close(fd); 3bba: 854a mv a0,s2 3bbc: 6f3000ef jal 4aae <close> - fd = open("sharedfd", 0); 3bc0: 4581 li a1,0 3bc2: 00003517 auipc a0,0x3 3bc6: 03e50513 addi a0,a0,62 # 6c00 <malloc+0x1c96> 3bca: 6fd000ef jal 4ac6 <open> 3bce: 8baa mv s7,a0 - nc = np = 0; 3bd0: 8ace mv s5,s3 - if(fd < 0){ 3bd2: 02054363 bltz a0,3bf8 <sharedfd+0x100> 3bd6: faa40913 addi s2,s0,-86 - if(buf[i] == 'c') 3bda: 06300493 li s1,99 - if(buf[i] == 'p') 3bde: 07000b13 li s6,112 - while((n = read(fd, buf, sizeof(buf))) > 0){ 3be2: 4629 li a2,10 3be4: fa040593 addi a1,s0,-96 3be8: 855e mv a0,s7 @@ -6680,55 +5014,41 @@ r_sp() 3bee: 02a05b63 blez a0,3c24 <sharedfd+0x12c> 3bf2: fa040793 addi a5,s0,-96 3bf6: a839 j 3c14 <sharedfd+0x11c> - printf("%s: cannot open sharedfd for reading\n", s); 3bf8: 85d2 mv a1,s4 3bfa: 00003517 auipc a0,0x3 3bfe: 05e50513 addi a0,a0,94 # 6c58 <malloc+0x1cee> 3c02: 2b4010ef jal 4eb6 <printf> - exit(1); 3c06: 4505 li a0,1 3c08: 67f000ef jal 4a86 <exit> - nc++; 3c0c: 2985 addiw s3,s3,1 - for(i = 0; i < sizeof(buf); i++){ 3c0e: 0785 addi a5,a5,1 3c10: fd2789e3 beq a5,s2,3be2 <sharedfd+0xea> - if(buf[i] == 'c') 3c14: 0007c703 lbu a4,0(a5) 3c18: fe970ae3 beq a4,s1,3c0c <sharedfd+0x114> - if(buf[i] == 'p') 3c1c: ff6719e3 bne a4,s6,3c0e <sharedfd+0x116> - np++; 3c20: 2a85 addiw s5,s5,1 3c22: b7f5 j 3c0e <sharedfd+0x116> - close(fd); 3c24: 855e mv a0,s7 3c26: 689000ef jal 4aae <close> - unlink("sharedfd"); 3c2a: 00003517 auipc a0,0x3 3c2e: fd650513 addi a0,a0,-42 # 6c00 <malloc+0x1c96> 3c32: 6a5000ef jal 4ad6 <unlink> - if(nc == N*SZ && np == N*SZ){ 3c36: 6789 lui a5,0x2 3c38: 71078793 addi a5,a5,1808 # 2710 <fourteen+0x78> 3c3c: 00f99763 bne s3,a5,3c4a <sharedfd+0x152> 3c40: 6789 lui a5,0x2 3c42: 71078793 addi a5,a5,1808 # 2710 <fourteen+0x78> 3c46: 00fa8c63 beq s5,a5,3c5e <sharedfd+0x166> - printf("%s: nc/np test fails\n", s); 3c4a: 85d2 mv a1,s4 3c4c: 00003517 auipc a0,0x3 3c50: 03450513 addi a0,a0,52 # 6c80 <malloc+0x1d16> 3c54: 262010ef jal 4eb6 <printf> - exit(1); 3c58: 4505 li a0,1 3c5a: 62d000ef jal 4a86 <exit> - exit(0); 3c5e: 4501 li a0,0 3c60: 627000ef jal 4a86 <exit> 0000000000003c64 <fourfiles>: -{ 3c64: 7135 addi sp,sp,-160 3c66: ed06 sd ra,152(sp) 3c68: e922 sd s0,144(sp) @@ -6745,7 +5065,6 @@ r_sp() 3c7e: fc6e sd s11,56(sp) 3c80: 1100 addi s0,sp,160 3c82: 8caa mv s9,a0 - char *names[] = { "f0", "f1", "f2", "f3" }; 3c84: 00003797 auipc a5,0x3 3c88: 01478793 addi a5,a5,20 # 6c98 <malloc+0x1d2e> 3c8c: f6f43823 sd a5,-144(s0) @@ -6758,71 +5077,50 @@ r_sp() 3ca8: 00003797 auipc a5,0x3 3cac: 00878793 addi a5,a5,8 # 6cb0 <malloc+0x1d46> 3cb0: f8f43423 sd a5,-120(s0) - for(pi = 0; pi < NCHILD; pi++){ 3cb4: f7040b93 addi s7,s0,-144 - char *names[] = { "f0", "f1", "f2", "f3" }; 3cb8: 895e mv s2,s7 - for(pi = 0; pi < NCHILD; pi++){ 3cba: 4481 li s1,0 3cbc: 4a11 li s4,4 - fname = names[pi]; 3cbe: 00093983 ld s3,0(s2) - unlink(fname); 3cc2: 854e mv a0,s3 3cc4: 613000ef jal 4ad6 <unlink> - pid = fork(); 3cc8: 5b7000ef jal 4a7e <fork> - if(pid < 0){ 3ccc: 02054e63 bltz a0,3d08 <fourfiles+0xa4> - if(pid == 0){ 3cd0: c531 beqz a0,3d1c <fourfiles+0xb8> - for(pi = 0; pi < NCHILD; pi++){ 3cd2: 2485 addiw s1,s1,1 3cd4: 0921 addi s2,s2,8 3cd6: ff4494e3 bne s1,s4,3cbe <fourfiles+0x5a> 3cda: 4491 li s1,4 - wait(&xstatus); 3cdc: f6c40513 addi a0,s0,-148 3ce0: 5af000ef jal 4a8e <wait> - if(xstatus != 0) 3ce4: f6c42a83 lw s5,-148(s0) 3ce8: 0a0a9463 bnez s5,3d90 <fourfiles+0x12c> - for(pi = 0; pi < NCHILD; pi++){ 3cec: 34fd addiw s1,s1,-1 3cee: f4fd bnez s1,3cdc <fourfiles+0x78> 3cf0: 03000b13 li s6,48 - while((n = read(fd, buf, sizeof(buf))) > 0){ 3cf4: 00009a17 auipc s4,0x9 3cf8: f84a0a13 addi s4,s4,-124 # cc78 <buf> - if(total != N*SZ){ 3cfc: 6d05 lui s10,0x1 3cfe: 770d0d13 addi s10,s10,1904 # 1770 <forkfork+0x1a> - for(i = 0; i < NCHILD; i++){ 3d02: 03400d93 li s11,52 3d06: a0ed j 3df0 <fourfiles+0x18c> - printf("%s: fork failed\n", s); 3d08: 85e6 mv a1,s9 3d0a: 00002517 auipc a0,0x2 3d0e: c2e50513 addi a0,a0,-978 # 5938 <malloc+0x9ce> 3d12: 1a4010ef jal 4eb6 <printf> - exit(1); 3d16: 4505 li a0,1 3d18: 56f000ef jal 4a86 <exit> - fd = open(fname, O_CREATE | O_RDWR); 3d1c: 20200593 li a1,514 3d20: 854e mv a0,s3 3d22: 5a5000ef jal 4ac6 <open> 3d26: 892a mv s2,a0 - if(fd < 0){ 3d28: 04054163 bltz a0,3d6a <fourfiles+0x106> - memset(buf, '0'+pi, SZ); 3d2c: 1f400613 li a2,500 3d30: 0304859b addiw a1,s1,48 3d34: 00009517 auipc a0,0x9 3d38: f4450513 addi a0,a0,-188 # cc78 <buf> 3d3c: 365000ef jal 48a0 <memset> 3d40: 44b1 li s1,12 - if((n = write(fd, buf, SZ)) != SZ){ 3d42: 00009997 auipc s3,0x9 3d46: f3698993 addi s3,s3,-202 # cc78 <buf> 3d4a: 1f400613 li a2,500 @@ -6832,41 +5130,30 @@ r_sp() 3d56: 85aa mv a1,a0 3d58: 1f400793 li a5,500 3d5c: 02f51163 bne a0,a5,3d7e <fourfiles+0x11a> - for(i = 0; i < N; i++){ 3d60: 34fd addiw s1,s1,-1 3d62: f4e5 bnez s1,3d4a <fourfiles+0xe6> - exit(0); 3d64: 4501 li a0,0 3d66: 521000ef jal 4a86 <exit> - printf("%s: create failed\n", s); 3d6a: 85e6 mv a1,s9 3d6c: 00002517 auipc a0,0x2 3d70: c6450513 addi a0,a0,-924 # 59d0 <malloc+0xa66> 3d74: 142010ef jal 4eb6 <printf> - exit(1); 3d78: 4505 li a0,1 3d7a: 50d000ef jal 4a86 <exit> - printf("write failed %d\n", n); 3d7e: 00003517 auipc a0,0x3 3d82: f3a50513 addi a0,a0,-198 # 6cb8 <malloc+0x1d4e> 3d86: 130010ef jal 4eb6 <printf> - exit(1); 3d8a: 4505 li a0,1 3d8c: 4fb000ef jal 4a86 <exit> - exit(xstatus); 3d90: 8556 mv a0,s5 3d92: 4f5000ef jal 4a86 <exit> - printf("%s: wrong char\n", s); 3d96: 85e6 mv a1,s9 3d98: 00003517 auipc a0,0x3 3d9c: f3850513 addi a0,a0,-200 # 6cd0 <malloc+0x1d66> 3da0: 116010ef jal 4eb6 <printf> - exit(1); 3da4: 4505 li a0,1 3da6: 4e1000ef jal 4a86 <exit> - total += n; 3daa: 00a9093b addw s2,s2,a0 - while((n = read(fd, buf, sizeof(buf))) > 0){ 3dae: 660d lui a2,0x3 3db0: 85d2 mv a1,s4 3db2: 854e mv a0,s3 @@ -6875,47 +5162,33 @@ r_sp() 3dbc: 00009797 auipc a5,0x9 3dc0: ebc78793 addi a5,a5,-324 # cc78 <buf> 3dc4: 00f506b3 add a3,a0,a5 - if(buf[j] != '0'+i){ 3dc8: 0007c703 lbu a4,0(a5) 3dcc: fc9715e3 bne a4,s1,3d96 <fourfiles+0x132> - for(j = 0; j < n; j++){ 3dd0: 0785 addi a5,a5,1 3dd2: fed79be3 bne a5,a3,3dc8 <fourfiles+0x164> 3dd6: bfd1 j 3daa <fourfiles+0x146> - close(fd); 3dd8: 854e mv a0,s3 3dda: 4d5000ef jal 4aae <close> - if(total != N*SZ){ 3dde: 03a91463 bne s2,s10,3e06 <fourfiles+0x1a2> - unlink(fname); 3de2: 8562 mv a0,s8 3de4: 4f3000ef jal 4ad6 <unlink> - for(i = 0; i < NCHILD; i++){ 3de8: 0ba1 addi s7,s7,8 3dea: 2b05 addiw s6,s6,1 3dec: 03bb0763 beq s6,s11,3e1a <fourfiles+0x1b6> - fname = names[i]; 3df0: 000bbc03 ld s8,0(s7) - fd = open(fname, 0); 3df4: 4581 li a1,0 3df6: 8562 mv a0,s8 3df8: 4cf000ef jal 4ac6 <open> 3dfc: 89aa mv s3,a0 - total = 0; 3dfe: 8956 mv s2,s5 - if(buf[j] != '0'+i){ 3e00: 000b049b sext.w s1,s6 - while((n = read(fd, buf, sizeof(buf))) > 0){ 3e04: b76d j 3dae <fourfiles+0x14a> - printf("wrong length %d\n", total); 3e06: 85ca mv a1,s2 3e08: 00003517 auipc a0,0x3 3e0c: ed850513 addi a0,a0,-296 # 6ce0 <malloc+0x1d76> 3e10: 0a6010ef jal 4eb6 <printf> - exit(1); 3e14: 4505 li a0,1 3e16: 471000ef jal 4a86 <exit> -} 3e1a: 60ea ld ra,152(sp) 3e1c: 644a ld s0,144(sp) 3e1e: 64aa ld s1,136(sp) @@ -6933,7 +5206,6 @@ r_sp() 3e36: 8082 ret 0000000000003e38 <concreate>: -{ 3e38: 7135 addi sp,sp,-160 3e3a: ed06 sd ra,152(sp) 3e3c: e922 sd s0,144(sp) @@ -6946,266 +5218,190 @@ r_sp() 3e4a: ecde sd s7,88(sp) 3e4c: 1100 addi s0,sp,160 3e4e: 89aa mv s3,a0 - file[0] = 'C'; 3e50: 04300793 li a5,67 3e54: faf40423 sb a5,-88(s0) - file[2] = '\0'; 3e58: fa040523 sb zero,-86(s0) - for(i = 0; i < N; i++){ 3e5c: 4901 li s2,0 - if(pid && (i % 3) == 1){ 3e5e: 4b0d li s6,3 3e60: 4a85 li s5,1 - link("C0", file); 3e62: 00003b97 auipc s7,0x3 3e66: e96b8b93 addi s7,s7,-362 # 6cf8 <malloc+0x1d8e> - for(i = 0; i < N; i++){ 3e6a: 02800a13 li s4,40 3e6e: a41d j 4094 <concreate+0x25c> - link("C0", file); 3e70: fa840593 addi a1,s0,-88 3e74: 855e mv a0,s7 3e76: 471000ef jal 4ae6 <link> - if(pid == 0) { 3e7a: a411 j 407e <concreate+0x246> - } else if(pid == 0 && (i % 5) == 1){ 3e7c: 4795 li a5,5 3e7e: 02f9693b remw s2,s2,a5 3e82: 4785 li a5,1 3e84: 02f90563 beq s2,a5,3eae <concreate+0x76> - fd = open(file, O_CREATE | O_RDWR); 3e88: 20200593 li a1,514 3e8c: fa840513 addi a0,s0,-88 3e90: 437000ef jal 4ac6 <open> - if(fd < 0){ 3e94: 1e055063 bgez a0,4074 <concreate+0x23c> - printf("concreate create %s failed\n", file); 3e98: fa840593 addi a1,s0,-88 3e9c: 00003517 auipc a0,0x3 3ea0: e6450513 addi a0,a0,-412 # 6d00 <malloc+0x1d96> 3ea4: 012010ef jal 4eb6 <printf> - exit(1); 3ea8: 4505 li a0,1 3eaa: 3dd000ef jal 4a86 <exit> - link("C0", file); 3eae: fa840593 addi a1,s0,-88 3eb2: 00003517 auipc a0,0x3 3eb6: e4650513 addi a0,a0,-442 # 6cf8 <malloc+0x1d8e> 3eba: 42d000ef jal 4ae6 <link> - exit(0); 3ebe: 4501 li a0,0 3ec0: 3c7000ef jal 4a86 <exit> - exit(1); 3ec4: 4505 li a0,1 3ec6: 3c1000ef jal 4a86 <exit> - memset(fa, 0, sizeof(fa)); 3eca: 02800613 li a2,40 3ece: 4581 li a1,0 3ed0: f8040513 addi a0,s0,-128 3ed4: 1cd000ef jal 48a0 <memset> - fd = open(".", 0); 3ed8: 4581 li a1,0 3eda: 00002517 auipc a0,0x2 3ede: 8b650513 addi a0,a0,-1866 # 5790 <malloc+0x826> 3ee2: 3e5000ef jal 4ac6 <open> 3ee6: 892a mv s2,a0 - n = 0; 3ee8: 8aa6 mv s5,s1 - if(de.name[0] == 'C' && de.name[2] == '\0'){ 3eea: 04300a13 li s4,67 - if(i < 0 || i >= sizeof(fa)){ 3eee: 02700b13 li s6,39 - fa[i] = 1; 3ef2: 4b85 li s7,1 - while(read(fd, &de, sizeof(de)) > 0){ 3ef4: 4641 li a2,16 3ef6: f7040593 addi a1,s0,-144 3efa: 854a mv a0,s2 3efc: 3a3000ef jal 4a9e <read> 3f00: 06a05a63 blez a0,3f74 <concreate+0x13c> - if(de.inum == 0) 3f04: f7045783 lhu a5,-144(s0) 3f08: d7f5 beqz a5,3ef4 <concreate+0xbc> - if(de.name[0] == 'C' && de.name[2] == '\0'){ 3f0a: f7244783 lbu a5,-142(s0) 3f0e: ff4793e3 bne a5,s4,3ef4 <concreate+0xbc> 3f12: f7444783 lbu a5,-140(s0) 3f16: fff9 bnez a5,3ef4 <concreate+0xbc> - i = de.name[1] - '0'; 3f18: f7344783 lbu a5,-141(s0) 3f1c: fd07879b addiw a5,a5,-48 3f20: 0007871b sext.w a4,a5 - if(i < 0 || i >= sizeof(fa)){ 3f24: 02eb6063 bltu s6,a4,3f44 <concreate+0x10c> - if(fa[i]){ 3f28: fb070793 addi a5,a4,-80 # fb0 <bigdir+0x10e> 3f2c: 97a2 add a5,a5,s0 3f2e: fd07c783 lbu a5,-48(a5) 3f32: e78d bnez a5,3f5c <concreate+0x124> - fa[i] = 1; 3f34: fb070793 addi a5,a4,-80 3f38: 00878733 add a4,a5,s0 3f3c: fd770823 sb s7,-48(a4) - n++; 3f40: 2a85 addiw s5,s5,1 3f42: bf4d j 3ef4 <concreate+0xbc> - printf("%s: concreate weird file %s\n", s, de.name); 3f44: f7240613 addi a2,s0,-142 3f48: 85ce mv a1,s3 3f4a: 00003517 auipc a0,0x3 3f4e: dd650513 addi a0,a0,-554 # 6d20 <malloc+0x1db6> 3f52: 765000ef jal 4eb6 <printf> - exit(1); 3f56: 4505 li a0,1 3f58: 32f000ef jal 4a86 <exit> - printf("%s: concreate duplicate file %s\n", s, de.name); 3f5c: f7240613 addi a2,s0,-142 3f60: 85ce mv a1,s3 3f62: 00003517 auipc a0,0x3 3f66: dde50513 addi a0,a0,-546 # 6d40 <malloc+0x1dd6> 3f6a: 74d000ef jal 4eb6 <printf> - exit(1); 3f6e: 4505 li a0,1 3f70: 317000ef jal 4a86 <exit> - close(fd); 3f74: 854a mv a0,s2 3f76: 339000ef jal 4aae <close> - if(n != N){ 3f7a: 02800793 li a5,40 3f7e: 00fa9763 bne s5,a5,3f8c <concreate+0x154> - if(((i % 3) == 0 && pid == 0) || 3f82: 4a8d li s5,3 3f84: 4b05 li s6,1 - for(i = 0; i < N; i++){ 3f86: 02800a13 li s4,40 3f8a: a079 j 4018 <concreate+0x1e0> - printf("%s: concreate not enough files in directory listing\n", s); 3f8c: 85ce mv a1,s3 3f8e: 00003517 auipc a0,0x3 3f92: dda50513 addi a0,a0,-550 # 6d68 <malloc+0x1dfe> 3f96: 721000ef jal 4eb6 <printf> - exit(1); 3f9a: 4505 li a0,1 3f9c: 2eb000ef jal 4a86 <exit> - printf("%s: fork failed\n", s); 3fa0: 85ce mv a1,s3 3fa2: 00002517 auipc a0,0x2 3fa6: 99650513 addi a0,a0,-1642 # 5938 <malloc+0x9ce> 3faa: 70d000ef jal 4eb6 <printf> - exit(1); 3fae: 4505 li a0,1 3fb0: 2d7000ef jal 4a86 <exit> - close(open(file, 0)); 3fb4: 4581 li a1,0 3fb6: fa840513 addi a0,s0,-88 3fba: 30d000ef jal 4ac6 <open> 3fbe: 2f1000ef jal 4aae <close> - close(open(file, 0)); 3fc2: 4581 li a1,0 3fc4: fa840513 addi a0,s0,-88 3fc8: 2ff000ef jal 4ac6 <open> 3fcc: 2e3000ef jal 4aae <close> - close(open(file, 0)); 3fd0: 4581 li a1,0 3fd2: fa840513 addi a0,s0,-88 3fd6: 2f1000ef jal 4ac6 <open> 3fda: 2d5000ef jal 4aae <close> - close(open(file, 0)); 3fde: 4581 li a1,0 3fe0: fa840513 addi a0,s0,-88 3fe4: 2e3000ef jal 4ac6 <open> 3fe8: 2c7000ef jal 4aae <close> - close(open(file, 0)); 3fec: 4581 li a1,0 3fee: fa840513 addi a0,s0,-88 3ff2: 2d5000ef jal 4ac6 <open> 3ff6: 2b9000ef jal 4aae <close> - close(open(file, 0)); 3ffa: 4581 li a1,0 3ffc: fa840513 addi a0,s0,-88 4000: 2c7000ef jal 4ac6 <open> 4004: 2ab000ef jal 4aae <close> - if(pid == 0) 4008: 06090363 beqz s2,406e <concreate+0x236> - wait(0); 400c: 4501 li a0,0 400e: 281000ef jal 4a8e <wait> - for(i = 0; i < N; i++){ 4012: 2485 addiw s1,s1,1 4014: 0b448963 beq s1,s4,40c6 <concreate+0x28e> - file[1] = '0' + i; 4018: 0304879b addiw a5,s1,48 401c: faf404a3 sb a5,-87(s0) - pid = fork(); 4020: 25f000ef jal 4a7e <fork> 4024: 892a mv s2,a0 - if(pid < 0){ 4026: f6054de3 bltz a0,3fa0 <concreate+0x168> - if(((i % 3) == 0 && pid == 0) || 402a: 0354e73b remw a4,s1,s5 402e: 00a767b3 or a5,a4,a0 4032: 2781 sext.w a5,a5 4034: d3c1 beqz a5,3fb4 <concreate+0x17c> 4036: 01671363 bne a4,s6,403c <concreate+0x204> - ((i % 3) == 1 && pid != 0)){ 403a: fd2d bnez a0,3fb4 <concreate+0x17c> - unlink(file); 403c: fa840513 addi a0,s0,-88 4040: 297000ef jal 4ad6 <unlink> - unlink(file); 4044: fa840513 addi a0,s0,-88 4048: 28f000ef jal 4ad6 <unlink> - unlink(file); 404c: fa840513 addi a0,s0,-88 4050: 287000ef jal 4ad6 <unlink> - unlink(file); 4054: fa840513 addi a0,s0,-88 4058: 27f000ef jal 4ad6 <unlink> - unlink(file); 405c: fa840513 addi a0,s0,-88 4060: 277000ef jal 4ad6 <unlink> - unlink(file); 4064: fa840513 addi a0,s0,-88 4068: 26f000ef jal 4ad6 <unlink> 406c: bf71 j 4008 <concreate+0x1d0> - exit(0); 406e: 4501 li a0,0 4070: 217000ef jal 4a86 <exit> - close(fd); 4074: 23b000ef jal 4aae <close> - if(pid == 0) { 4078: b599 j 3ebe <concreate+0x86> - close(fd); 407a: 235000ef jal 4aae <close> - wait(&xstatus); 407e: f6c40513 addi a0,s0,-148 4082: 20d000ef jal 4a8e <wait> - if(xstatus != 0) 4086: f6c42483 lw s1,-148(s0) 408a: e2049de3 bnez s1,3ec4 <concreate+0x8c> - for(i = 0; i < N; i++){ 408e: 2905 addiw s2,s2,1 4090: e3490de3 beq s2,s4,3eca <concreate+0x92> - file[1] = '0' + i; 4094: 0309079b addiw a5,s2,48 4098: faf404a3 sb a5,-87(s0) - unlink(file); 409c: fa840513 addi a0,s0,-88 40a0: 237000ef jal 4ad6 <unlink> - pid = fork(); 40a4: 1db000ef jal 4a7e <fork> - if(pid && (i % 3) == 1){ 40a8: dc050ae3 beqz a0,3e7c <concreate+0x44> 40ac: 036967bb remw a5,s2,s6 40b0: dd5780e3 beq a5,s5,3e70 <concreate+0x38> - fd = open(file, O_CREATE | O_RDWR); 40b4: 20200593 li a1,514 40b8: fa840513 addi a0,s0,-88 40bc: 20b000ef jal 4ac6 <open> - if(fd < 0){ 40c0: fa055de3 bgez a0,407a <concreate+0x242> 40c4: bbd1 j 3e98 <concreate+0x60> -} 40c6: 60ea ld ra,152(sp) 40c8: 644a ld s0,144(sp) 40ca: 64aa ld s1,136(sp) @@ -7219,7 +5415,6 @@ r_sp() 40da: 8082 ret 00000000000040dc <bigfile>: -{ 40dc: 7139 addi sp,sp,-64 40de: fc06 sd ra,56(sp) 40e0: f822 sd s0,48(sp) @@ -7230,71 +5425,51 @@ r_sp() 40ea: e456 sd s5,8(sp) 40ec: 0080 addi s0,sp,64 40ee: 8aaa mv s5,a0 - unlink("bigfile.dat"); 40f0: 00003517 auipc a0,0x3 40f4: cb050513 addi a0,a0,-848 # 6da0 <malloc+0x1e36> 40f8: 1df000ef jal 4ad6 <unlink> - fd = open("bigfile.dat", O_CREATE | O_RDWR); 40fc: 20200593 li a1,514 4100: 00003517 auipc a0,0x3 4104: ca050513 addi a0,a0,-864 # 6da0 <malloc+0x1e36> 4108: 1bf000ef jal 4ac6 <open> 410c: 89aa mv s3,a0 - for(i = 0; i < N; i++){ 410e: 4481 li s1,0 - memset(buf, i, SZ); 4110: 00009917 auipc s2,0x9 4114: b6890913 addi s2,s2,-1176 # cc78 <buf> - for(i = 0; i < N; i++){ 4118: 4a51 li s4,20 - if(fd < 0){ 411a: 08054663 bltz a0,41a6 <bigfile+0xca> - memset(buf, i, SZ); 411e: 25800613 li a2,600 4122: 85a6 mv a1,s1 4124: 854a mv a0,s2 4126: 77a000ef jal 48a0 <memset> - if(write(fd, buf, SZ) != SZ){ 412a: 25800613 li a2,600 412e: 85ca mv a1,s2 4130: 854e mv a0,s3 4132: 175000ef jal 4aa6 <write> 4136: 25800793 li a5,600 413a: 08f51063 bne a0,a5,41ba <bigfile+0xde> - for(i = 0; i < N; i++){ 413e: 2485 addiw s1,s1,1 4140: fd449fe3 bne s1,s4,411e <bigfile+0x42> - close(fd); 4144: 854e mv a0,s3 4146: 169000ef jal 4aae <close> - fd = open("bigfile.dat", 0); 414a: 4581 li a1,0 414c: 00003517 auipc a0,0x3 4150: c5450513 addi a0,a0,-940 # 6da0 <malloc+0x1e36> 4154: 173000ef jal 4ac6 <open> 4158: 8a2a mv s4,a0 - total = 0; 415a: 4981 li s3,0 - for(i = 0; ; i++){ 415c: 4481 li s1,0 - cc = read(fd, buf, SZ/2); 415e: 00009917 auipc s2,0x9 4162: b1a90913 addi s2,s2,-1254 # cc78 <buf> - if(fd < 0){ 4166: 06054463 bltz a0,41ce <bigfile+0xf2> - cc = read(fd, buf, SZ/2); 416a: 12c00613 li a2,300 416e: 85ca mv a1,s2 4170: 8552 mv a0,s4 4172: 12d000ef jal 4a9e <read> - if(cc < 0){ 4176: 06054663 bltz a0,41e2 <bigfile+0x106> - if(cc == 0) 417a: c155 beqz a0,421e <bigfile+0x142> - if(cc != SZ/2){ 417c: 12c00793 li a5,300 4180: 06f51b63 bne a0,a5,41f6 <bigfile+0x11a> - if(buf[0] != i/2 || buf[SZ/2-1] != i/2){ 4184: 01f4d79b srliw a5,s1,0x1f 4188: 9fa5 addw a5,a5,s1 418a: 4017d79b sraiw a5,a5,0x1 @@ -7302,72 +5477,53 @@ r_sp() 4192: 06f71c63 bne a4,a5,420a <bigfile+0x12e> 4196: 12b94703 lbu a4,299(s2) 419a: 06f71863 bne a4,a5,420a <bigfile+0x12e> - total += cc; 419e: 12c9899b addiw s3,s3,300 - for(i = 0; ; i++){ 41a2: 2485 addiw s1,s1,1 - cc = read(fd, buf, SZ/2); 41a4: b7d9 j 416a <bigfile+0x8e> - printf("%s: cannot create bigfile", s); 41a6: 85d6 mv a1,s5 41a8: 00003517 auipc a0,0x3 41ac: c0850513 addi a0,a0,-1016 # 6db0 <malloc+0x1e46> 41b0: 507000ef jal 4eb6 <printf> - exit(1); 41b4: 4505 li a0,1 41b6: 0d1000ef jal 4a86 <exit> - printf("%s: write bigfile failed\n", s); 41ba: 85d6 mv a1,s5 41bc: 00003517 auipc a0,0x3 41c0: c1450513 addi a0,a0,-1004 # 6dd0 <malloc+0x1e66> 41c4: 4f3000ef jal 4eb6 <printf> - exit(1); 41c8: 4505 li a0,1 41ca: 0bd000ef jal 4a86 <exit> - printf("%s: cannot open bigfile\n", s); 41ce: 85d6 mv a1,s5 41d0: 00003517 auipc a0,0x3 41d4: c2050513 addi a0,a0,-992 # 6df0 <malloc+0x1e86> 41d8: 4df000ef jal 4eb6 <printf> - exit(1); 41dc: 4505 li a0,1 41de: 0a9000ef jal 4a86 <exit> - printf("%s: read bigfile failed\n", s); 41e2: 85d6 mv a1,s5 41e4: 00003517 auipc a0,0x3 41e8: c2c50513 addi a0,a0,-980 # 6e10 <malloc+0x1ea6> 41ec: 4cb000ef jal 4eb6 <printf> - exit(1); 41f0: 4505 li a0,1 41f2: 095000ef jal 4a86 <exit> - printf("%s: short read bigfile\n", s); 41f6: 85d6 mv a1,s5 41f8: 00003517 auipc a0,0x3 41fc: c3850513 addi a0,a0,-968 # 6e30 <malloc+0x1ec6> 4200: 4b7000ef jal 4eb6 <printf> - exit(1); 4204: 4505 li a0,1 4206: 081000ef jal 4a86 <exit> - printf("%s: read bigfile wrong data\n", s); 420a: 85d6 mv a1,s5 420c: 00003517 auipc a0,0x3 4210: c3c50513 addi a0,a0,-964 # 6e48 <malloc+0x1ede> 4214: 4a3000ef jal 4eb6 <printf> - exit(1); 4218: 4505 li a0,1 421a: 06d000ef jal 4a86 <exit> - close(fd); 421e: 8552 mv a0,s4 4220: 08f000ef jal 4aae <close> - if(total != N*SZ){ 4224: 678d lui a5,0x3 4226: ee078793 addi a5,a5,-288 # 2ee0 <subdir+0x2fe> 422a: 02f99163 bne s3,a5,424c <bigfile+0x170> - unlink("bigfile.dat"); 422e: 00003517 auipc a0,0x3 4232: b7250513 addi a0,a0,-1166 # 6da0 <malloc+0x1e36> 4236: 0a1000ef jal 4ad6 <unlink> -} 423a: 70e2 ld ra,56(sp) 423c: 7442 ld s0,48(sp) 423e: 74a2 ld s1,40(sp) @@ -7377,111 +5533,82 @@ r_sp() 4246: 6aa2 ld s5,8(sp) 4248: 6121 addi sp,sp,64 424a: 8082 ret - printf("%s: read bigfile wrong total\n", s); 424c: 85d6 mv a1,s5 424e: 00003517 auipc a0,0x3 4252: c1a50513 addi a0,a0,-998 # 6e68 <malloc+0x1efe> 4256: 461000ef jal 4eb6 <printf> - exit(1); 425a: 4505 li a0,1 425c: 02b000ef jal 4a86 <exit> 0000000000004260 <bigargtest>: -{ 4260: 7121 addi sp,sp,-448 4262: ff06 sd ra,440(sp) 4264: fb22 sd s0,432(sp) 4266: f726 sd s1,424(sp) 4268: 0380 addi s0,sp,448 426a: 84aa mv s1,a0 - unlink("bigarg-ok"); 426c: 00003517 auipc a0,0x3 4270: c1c50513 addi a0,a0,-996 # 6e88 <malloc+0x1f1e> 4274: 063000ef jal 4ad6 <unlink> - pid = fork(); 4278: 007000ef jal 4a7e <fork> - if(pid == 0){ 427c: c915 beqz a0,42b0 <bigargtest+0x50> - } else if(pid < 0){ 427e: 08054a63 bltz a0,4312 <bigargtest+0xb2> - wait(&xstatus); 4282: fdc40513 addi a0,s0,-36 4286: 009000ef jal 4a8e <wait> - if(xstatus != 0) 428a: fdc42503 lw a0,-36(s0) 428e: ed41 bnez a0,4326 <bigargtest+0xc6> - fd = open("bigarg-ok", 0); 4290: 4581 li a1,0 4292: 00003517 auipc a0,0x3 4296: bf650513 addi a0,a0,-1034 # 6e88 <malloc+0x1f1e> 429a: 02d000ef jal 4ac6 <open> - if(fd < 0){ 429e: 08054663 bltz a0,432a <bigargtest+0xca> - close(fd); 42a2: 00d000ef jal 4aae <close> -} 42a6: 70fa ld ra,440(sp) 42a8: 745a ld s0,432(sp) 42aa: 74ba ld s1,424(sp) 42ac: 6139 addi sp,sp,448 42ae: 8082 ret - memset(big, ' ', sizeof(big)); 42b0: 19000613 li a2,400 42b4: 02000593 li a1,32 42b8: e4840513 addi a0,s0,-440 42bc: 5e4000ef jal 48a0 <memset> - big[sizeof(big)-1] = '\0'; 42c0: fc040ba3 sb zero,-41(s0) - for(i = 0; i < MAXARG-1; i++) 42c4: 00005797 auipc a5,0x5 42c8: 19c78793 addi a5,a5,412 # 9460 <args.1> 42cc: 00005697 auipc a3,0x5 42d0: 28c68693 addi a3,a3,652 # 9558 <args.1+0xf8> - args[i] = big; 42d4: e4840713 addi a4,s0,-440 42d8: e398 sd a4,0(a5) - for(i = 0; i < MAXARG-1; i++) 42da: 07a1 addi a5,a5,8 42dc: fed79ee3 bne a5,a3,42d8 <bigargtest+0x78> - args[MAXARG-1] = 0; 42e0: 00005597 auipc a1,0x5 42e4: 18058593 addi a1,a1,384 # 9460 <args.1> 42e8: 0e05bc23 sd zero,248(a1) - exec("echo", args); 42ec: 00001517 auipc a0,0x1 42f0: dbc50513 addi a0,a0,-580 # 50a8 <malloc+0x13e> 42f4: 7ca000ef jal 4abe <exec> - fd = open("bigarg-ok", O_CREATE); 42f8: 20000593 li a1,512 42fc: 00003517 auipc a0,0x3 4300: b8c50513 addi a0,a0,-1140 # 6e88 <malloc+0x1f1e> 4304: 7c2000ef jal 4ac6 <open> - close(fd); 4308: 7a6000ef jal 4aae <close> - exit(0); 430c: 4501 li a0,0 430e: 778000ef jal 4a86 <exit> - printf("%s: bigargtest: fork failed\n", s); 4312: 85a6 mv a1,s1 4314: 00003517 auipc a0,0x3 4318: b8450513 addi a0,a0,-1148 # 6e98 <malloc+0x1f2e> 431c: 39b000ef jal 4eb6 <printf> - exit(1); 4320: 4505 li a0,1 4322: 764000ef jal 4a86 <exit> - exit(xstatus); 4326: 760000ef jal 4a86 <exit> - printf("%s: bigarg test failed!\n", s); 432a: 85a6 mv a1,s1 432c: 00003517 auipc a0,0x3 4330: b8c50513 addi a0,a0,-1140 # 6eb8 <malloc+0x1f4e> 4334: 383000ef jal 4eb6 <printf> - exit(1); 4338: 4505 li a0,1 433a: 74c000ef jal 4a86 <exit> 000000000000433e <fsfull>: -{ 433e: 7135 addi sp,sp,-160 4340: ed06 sd ra,152(sp) 4342: e922 sd s0,144(sp) @@ -7496,107 +5623,73 @@ r_sp() 4354: e4e6 sd s9,72(sp) 4356: e0ea sd s10,64(sp) 4358: 1100 addi s0,sp,160 - printf("fsfull test\n"); 435a: 00003517 auipc a0,0x3 435e: b7e50513 addi a0,a0,-1154 # 6ed8 <malloc+0x1f6e> 4362: 355000ef jal 4eb6 <printf> - for(nfiles = 0; ; nfiles++){ 4366: 4481 li s1,0 - name[0] = 'f'; 4368: 06600d13 li s10,102 - name[1] = '0' + nfiles / 1000; 436c: 3e800c13 li s8,1000 - name[2] = '0' + (nfiles % 1000) / 100; 4370: 06400b93 li s7,100 - name[3] = '0' + (nfiles % 100) / 10; 4374: 4b29 li s6,10 - printf("writing %s\n", name); 4376: 00003c97 auipc s9,0x3 437a: b72c8c93 addi s9,s9,-1166 # 6ee8 <malloc+0x1f7e> - name[0] = 'f'; 437e: f7a40023 sb s10,-160(s0) - name[1] = '0' + nfiles / 1000; 4382: 0384c7bb divw a5,s1,s8 4386: 0307879b addiw a5,a5,48 438a: f6f400a3 sb a5,-159(s0) - name[2] = '0' + (nfiles % 1000) / 100; 438e: 0384e7bb remw a5,s1,s8 4392: 0377c7bb divw a5,a5,s7 4396: 0307879b addiw a5,a5,48 439a: f6f40123 sb a5,-158(s0) - name[3] = '0' + (nfiles % 100) / 10; 439e: 0374e7bb remw a5,s1,s7 43a2: 0367c7bb divw a5,a5,s6 43a6: 0307879b addiw a5,a5,48 43aa: f6f401a3 sb a5,-157(s0) - name[4] = '0' + (nfiles % 10); 43ae: 0364e7bb remw a5,s1,s6 43b2: 0307879b addiw a5,a5,48 43b6: f6f40223 sb a5,-156(s0) - name[5] = '\0'; 43ba: f60402a3 sb zero,-155(s0) - printf("writing %s\n", name); 43be: f6040593 addi a1,s0,-160 43c2: 8566 mv a0,s9 43c4: 2f3000ef jal 4eb6 <printf> - int fd = open(name, O_CREATE|O_RDWR); 43c8: 20200593 li a1,514 43cc: f6040513 addi a0,s0,-160 43d0: 6f6000ef jal 4ac6 <open> 43d4: 892a mv s2,a0 - if(fd < 0){ 43d6: 08055f63 bgez a0,4474 <fsfull+0x136> - printf("open %s failed\n", name); 43da: f6040593 addi a1,s0,-160 43de: 00003517 auipc a0,0x3 43e2: b1a50513 addi a0,a0,-1254 # 6ef8 <malloc+0x1f8e> 43e6: 2d1000ef jal 4eb6 <printf> - while(nfiles >= 0){ 43ea: 0604c163 bltz s1,444c <fsfull+0x10e> - name[0] = 'f'; 43ee: 06600b13 li s6,102 - name[1] = '0' + nfiles / 1000; 43f2: 3e800a13 li s4,1000 - name[2] = '0' + (nfiles % 1000) / 100; 43f6: 06400993 li s3,100 - name[3] = '0' + (nfiles % 100) / 10; 43fa: 4929 li s2,10 - while(nfiles >= 0){ 43fc: 5afd li s5,-1 - name[0] = 'f'; 43fe: f7640023 sb s6,-160(s0) - name[1] = '0' + nfiles / 1000; 4402: 0344c7bb divw a5,s1,s4 4406: 0307879b addiw a5,a5,48 440a: f6f400a3 sb a5,-159(s0) - name[2] = '0' + (nfiles % 1000) / 100; 440e: 0344e7bb remw a5,s1,s4 4412: 0337c7bb divw a5,a5,s3 4416: 0307879b addiw a5,a5,48 441a: f6f40123 sb a5,-158(s0) - name[3] = '0' + (nfiles % 100) / 10; 441e: 0334e7bb remw a5,s1,s3 4422: 0327c7bb divw a5,a5,s2 4426: 0307879b addiw a5,a5,48 442a: f6f401a3 sb a5,-157(s0) - name[4] = '0' + (nfiles % 10); 442e: 0324e7bb remw a5,s1,s2 4432: 0307879b addiw a5,a5,48 4436: f6f40223 sb a5,-156(s0) - name[5] = '\0'; 443a: f60402a3 sb zero,-155(s0) - unlink(name); 443e: f6040513 addi a0,s0,-160 4442: 694000ef jal 4ad6 <unlink> - nfiles--; 4446: 34fd addiw s1,s1,-1 - while(nfiles >= 0){ 4448: fb549be3 bne s1,s5,43fe <fsfull+0xc0> - printf("fsfull test finished\n"); 444c: 00003517 auipc a0,0x3 4450: acc50513 addi a0,a0,-1332 # 6f18 <malloc+0x1fae> 4454: 263000ef jal 4eb6 <printf> -} 4458: 60ea ld ra,152(sp) 445a: 644a ld s0,144(sp) 445c: 64aa ld s1,136(sp) @@ -7611,45 +5704,28 @@ r_sp() 446e: 6d06 ld s10,64(sp) 4470: 610d addi sp,sp,160 4472: 8082 ret - int total = 0; 4474: 4981 li s3,0 - int cc = write(fd, buf, BSIZE); 4476: 00009a97 auipc s5,0x9 447a: 802a8a93 addi s5,s5,-2046 # cc78 <buf> - if(cc < BSIZE) 447e: 3ff00a13 li s4,1023 - int cc = write(fd, buf, BSIZE); 4482: 40000613 li a2,1024 4486: 85d6 mv a1,s5 4488: 854a mv a0,s2 448a: 61c000ef jal 4aa6 <write> - if(cc < BSIZE) 448e: 00aa5563 bge s4,a0,4498 <fsfull+0x15a> - total += cc; 4492: 00a989bb addw s3,s3,a0 - while(1){ 4496: b7f5 j 4482 <fsfull+0x144> - printf("wrote %d bytes\n", total); 4498: 85ce mv a1,s3 449a: 00003517 auipc a0,0x3 449e: a6e50513 addi a0,a0,-1426 # 6f08 <malloc+0x1f9e> 44a2: 215000ef jal 4eb6 <printf> - close(fd); 44a6: 854a mv a0,s2 44a8: 606000ef jal 4aae <close> - if(total == 0) 44ac: f2098fe3 beqz s3,43ea <fsfull+0xac> - for(nfiles = 0; ; nfiles++){ 44b0: 2485 addiw s1,s1,1 44b2: b5f1 j 437e <fsfull+0x40> 00000000000044b4 <run>: -// - -// run each test in its own process. run returns 1 if child's exit() -// indicates success. -int -run(void f(char *), char *s) { 44b4: 7179 addi sp,sp,-48 44b6: f406 sd ra,40(sp) 44b8: f022 sd s0,32(sp) @@ -7658,40 +5734,20 @@ run(void f(char *), char *s) { 44be: 1800 addi s0,sp,48 44c0: 84aa mv s1,a0 44c2: 892e mv s2,a1 - int pid; - int xstatus; - - printf("test %s: ", s); 44c4: 00003517 auipc a0,0x3 44c8: a6c50513 addi a0,a0,-1428 # 6f30 <malloc+0x1fc6> 44cc: 1eb000ef jal 4eb6 <printf> - if((pid = fork()) < 0) { 44d0: 5ae000ef jal 4a7e <fork> 44d4: 02054a63 bltz a0,4508 <run+0x54> - printf("runtest: fork error\n"); - exit(1); - } - if(pid == 0) { 44d8: c129 beqz a0,451a <run+0x66> - f(s); - exit(0); - } else { - wait(&xstatus); 44da: fdc40513 addi a0,s0,-36 44de: 5b0000ef jal 4a8e <wait> - if(xstatus != 0) 44e2: fdc42783 lw a5,-36(s0) 44e6: cf9d beqz a5,4524 <run+0x70> - printf("FAILED\n"); 44e8: 00003517 auipc a0,0x3 44ec: a7050513 addi a0,a0,-1424 # 6f58 <malloc+0x1fee> 44f0: 1c7000ef jal 4eb6 <printf> - else - printf("OK\n"); - return xstatus == 0; 44f4: fdc42503 lw a0,-36(s0) - } -} 44f8: 00153513 seqz a0,a0 44fc: 70a2 ld ra,40(sp) 44fe: 7402 ld s0,32(sp) @@ -7699,35 +5755,26 @@ run(void f(char *), char *s) { 4502: 6942 ld s2,16(sp) 4504: 6145 addi sp,sp,48 4506: 8082 ret - printf("runtest: fork error\n"); 4508: 00003517 auipc a0,0x3 450c: a3850513 addi a0,a0,-1480 # 6f40 <malloc+0x1fd6> 4510: 1a7000ef jal 4eb6 <printf> - exit(1); 4514: 4505 li a0,1 4516: 570000ef jal 4a86 <exit> - f(s); 451a: 854a mv a0,s2 451c: 9482 jalr s1 - exit(0); 451e: 4501 li a0,0 4520: 566000ef jal 4a86 <exit> - printf("OK\n"); 4524: 00003517 auipc a0,0x3 4528: a3c50513 addi a0,a0,-1476 # 6f60 <malloc+0x1ff6> 452c: 18b000ef jal 4eb6 <printf> 4530: b7d1 j 44f4 <run+0x40> 0000000000004532 <runtests>: - -int -runtests(struct test *tests, char *justone, int continuous) { 4532: 7139 addi sp,sp,-64 4534: fc06 sd ra,56(sp) 4536: f822 sd s0,48(sp) 4538: f04a sd s2,32(sp) 453a: 0080 addi s0,sp,64 - for (struct test *t = tests; t->s != 0; t++) { 453c: 00853903 ld s2,8(a0) 4540: 06090463 beqz s2,45a8 <runtests+0x76> 4544: f426 sd s1,40(sp) @@ -7737,209 +5784,120 @@ runtests(struct test *tests, char *justone, int continuous) { 454c: 84aa mv s1,a0 454e: 89ae mv s3,a1 4550: 8a32 mv s4,a2 - if((justone == 0) || strcmp(t->s, justone) == 0) { - if(!run(t->f, t->s)){ - if(continuous != 2){ 4552: 4a89 li s5,2 4554: a031 j 4560 <runtests+0x2e> - for (struct test *t = tests; t->s != 0; t++) { 4556: 04c1 addi s1,s1,16 4558: 0084b903 ld s2,8(s1) 455c: 02090c63 beqz s2,4594 <runtests+0x62> - if((justone == 0) || strcmp(t->s, justone) == 0) { 4560: 00098763 beqz s3,456e <runtests+0x3c> 4564: 85ce mv a1,s3 4566: 854a mv a0,s2 4568: 2e2000ef jal 484a <strcmp> 456c: f56d bnez a0,4556 <runtests+0x24> - if(!run(t->f, t->s)){ 456e: 85ca mv a1,s2 4570: 6088 ld a0,0(s1) 4572: f43ff0ef jal 44b4 <run> 4576: f165 bnez a0,4556 <runtests+0x24> - if(continuous != 2){ 4578: fd5a0fe3 beq s4,s5,4556 <runtests+0x24> - printf("SOME TESTS FAILED\n"); 457c: 00003517 auipc a0,0x3 4580: 9ec50513 addi a0,a0,-1556 # 6f68 <malloc+0x1ffe> 4584: 133000ef jal 4eb6 <printf> - return 1; 4588: 4505 li a0,1 458a: 74a2 ld s1,40(sp) 458c: 69e2 ld s3,24(sp) 458e: 6a42 ld s4,16(sp) 4590: 6aa2 ld s5,8(sp) 4592: a031 j 459e <runtests+0x6c> - } - } - } - } - return 0; 4594: 4501 li a0,0 4596: 74a2 ld s1,40(sp) 4598: 69e2 ld s3,24(sp) 459a: 6a42 ld s4,16(sp) 459c: 6aa2 ld s5,8(sp) -} 459e: 70e2 ld ra,56(sp) 45a0: 7442 ld s0,48(sp) 45a2: 7902 ld s2,32(sp) 45a4: 6121 addi sp,sp,64 45a6: 8082 ret - return 0; 45a8: 4501 li a0,0 45aa: bfd5 j 459e <runtests+0x6c> 00000000000045ac <countfree>: -// because out of memory with lazy allocation results in the process -// taking a fault and being killed, fork and report back. -// -int -countfree() -{ 45ac: 7139 addi sp,sp,-64 45ae: fc06 sd ra,56(sp) 45b0: f822 sd s0,48(sp) 45b2: 0080 addi s0,sp,64 - int fds[2]; - - if(pipe(fds) < 0){ 45b4: fc840513 addi a0,s0,-56 45b8: 4de000ef jal 4a96 <pipe> 45bc: 04054e63 bltz a0,4618 <countfree+0x6c> - printf("pipe() failed in countfree()\n"); - exit(1); - } - - int pid = fork(); 45c0: 4be000ef jal 4a7e <fork> - - if(pid < 0){ 45c4: 06054663 bltz a0,4630 <countfree+0x84> - printf("fork failed in countfree()\n"); - exit(1); - } - - if(pid == 0){ 45c8: e159 bnez a0,464e <countfree+0xa2> 45ca: f426 sd s1,40(sp) 45cc: f04a sd s2,32(sp) 45ce: ec4e sd s3,24(sp) - close(fds[0]); 45d0: fc842503 lw a0,-56(s0) 45d4: 4da000ef jal 4aae <close> - - while(1){ - uint64 a = (uint64) sbrk(4096); - if(a == 0xffffffffffffffff){ 45d8: 597d li s2,-1 - break; - } - - // modify the memory to make sure it's really allocated. - *(char *)(a + 4096 - 1) = 1; 45da: 4485 li s1,1 - - // report back one more page. - if(write(fds[1], "x", 1) != 1){ 45dc: 00001997 auipc s3,0x1 45e0: b3c98993 addi s3,s3,-1220 # 5118 <malloc+0x1ae> - uint64 a = (uint64) sbrk(4096); 45e4: 6505 lui a0,0x1 45e6: 528000ef jal 4b0e <sbrk> - if(a == 0xffffffffffffffff){ 45ea: 05250f63 beq a0,s2,4648 <countfree+0x9c> - *(char *)(a + 4096 - 1) = 1; 45ee: 6785 lui a5,0x1 45f0: 97aa add a5,a5,a0 45f2: fe978fa3 sb s1,-1(a5) # fff <pgbug+0x27> - if(write(fds[1], "x", 1) != 1){ 45f6: 8626 mv a2,s1 45f8: 85ce mv a1,s3 45fa: fcc42503 lw a0,-52(s0) 45fe: 4a8000ef jal 4aa6 <write> 4602: fe9501e3 beq a0,s1,45e4 <countfree+0x38> - printf("write() failed in countfree()\n"); 4606: 00003517 auipc a0,0x3 460a: 9ba50513 addi a0,a0,-1606 # 6fc0 <malloc+0x2056> 460e: 0a9000ef jal 4eb6 <printf> - exit(1); 4612: 4505 li a0,1 4614: 472000ef jal 4a86 <exit> 4618: f426 sd s1,40(sp) 461a: f04a sd s2,32(sp) 461c: ec4e sd s3,24(sp) - printf("pipe() failed in countfree()\n"); 461e: 00003517 auipc a0,0x3 4622: 96250513 addi a0,a0,-1694 # 6f80 <malloc+0x2016> 4626: 091000ef jal 4eb6 <printf> - exit(1); 462a: 4505 li a0,1 462c: 45a000ef jal 4a86 <exit> 4630: f426 sd s1,40(sp) 4632: f04a sd s2,32(sp) 4634: ec4e sd s3,24(sp) - printf("fork failed in countfree()\n"); 4636: 00003517 auipc a0,0x3 463a: 96a50513 addi a0,a0,-1686 # 6fa0 <malloc+0x2036> 463e: 079000ef jal 4eb6 <printf> - exit(1); 4642: 4505 li a0,1 4644: 442000ef jal 4a86 <exit> - } - } - - exit(0); 4648: 4501 li a0,0 464a: 43c000ef jal 4a86 <exit> 464e: f426 sd s1,40(sp) - } - - close(fds[1]); 4650: fcc42503 lw a0,-52(s0) 4654: 45a000ef jal 4aae <close> - - int n = 0; 4658: 4481 li s1,0 - while(1){ - char c; - int cc = read(fds[0], &c, 1); 465a: 4605 li a2,1 465c: fc740593 addi a1,s0,-57 4660: fc842503 lw a0,-56(s0) 4664: 43a000ef jal 4a9e <read> - if(cc < 0){ 4668: 00054563 bltz a0,4672 <countfree+0xc6> - printf("read() failed in countfree()\n"); - exit(1); - } - if(cc == 0) 466c: cd11 beqz a0,4688 <countfree+0xdc> - break; - n += 1; 466e: 2485 addiw s1,s1,1 - while(1){ 4670: b7ed j 465a <countfree+0xae> 4672: f04a sd s2,32(sp) 4674: ec4e sd s3,24(sp) - printf("read() failed in countfree()\n"); 4676: 00003517 auipc a0,0x3 467a: 96a50513 addi a0,a0,-1686 # 6fe0 <malloc+0x2076> 467e: 039000ef jal 4eb6 <printf> - exit(1); 4682: 4505 li a0,1 4684: 402000ef jal 4a86 <exit> - } - - close(fds[0]); 4688: fc842503 lw a0,-56(s0) 468c: 422000ef jal 4aae <close> - wait((int*)0); 4690: 4501 li a0,0 4692: 3fc000ef jal 4a8e <wait> - - return n; -} 4696: 8526 mv a0,s1 4698: 74a2 ld s1,40(sp) 469a: 70e2 ld ra,56(sp) @@ -7948,9 +5906,6 @@ countfree() 46a0: 8082 ret 00000000000046a2 <drivetests>: - -int -drivetests(int quick, int continuous, char *justone) { 46a2: 711d addi sp,sp,-96 46a4: ec86 sd ra,88(sp) 46a6: e8a2 sd s0,80(sp) @@ -7968,95 +5923,54 @@ drivetests(int quick, int continuous, char *justone) { 46be: 8aaa mv s5,a0 46c0: 892e mv s2,a1 46c2: 89b2 mv s3,a2 - do { - printf("usertests starting\n"); 46c4: 00003b97 auipc s7,0x3 46c8: 93cb8b93 addi s7,s7,-1732 # 7000 <malloc+0x2096> - int free0 = countfree(); - int free1 = 0; - if (runtests(quicktests, justone, continuous)) { 46cc: 00005b17 auipc s6,0x5 46d0: 944b0b13 addi s6,s6,-1724 # 9010 <quicktests> - if(continuous != 2) { 46d4: 4a09 li s4,2 - } - } - if(!quick) { - if (justone == 0) - printf("usertests slow tests starting\n"); - if (runtests(slowtests, justone, continuous)) { 46d6: 00005c17 auipc s8,0x5 46da: d0ac0c13 addi s8,s8,-758 # 93e0 <slowtests> - printf("usertests slow tests starting\n"); 46de: 00003d17 auipc s10,0x3 46e2: 93ad0d13 addi s10,s10,-1734 # 7018 <malloc+0x20ae> - return 1; - } - } - } - if((free1 = countfree()) < free0) { - printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); 46e6: 00003c97 auipc s9,0x3 46ea: 952c8c93 addi s9,s9,-1710 # 7038 <malloc+0x20ce> 46ee: a819 j 4704 <drivetests+0x62> - printf("usertests slow tests starting\n"); 46f0: 856a mv a0,s10 46f2: 7c4000ef jal 4eb6 <printf> 46f6: a80d j 4728 <drivetests+0x86> - if((free1 = countfree()) < free0) { 46f8: eb5ff0ef jal 45ac <countfree> 46fc: 04954063 blt a0,s1,473c <drivetests+0x9a> - if(continuous != 2) { - return 1; - } - } - } while(continuous); 4700: 04090963 beqz s2,4752 <drivetests+0xb0> - printf("usertests starting\n"); 4704: 855e mv a0,s7 4706: 7b0000ef jal 4eb6 <printf> - int free0 = countfree(); 470a: ea3ff0ef jal 45ac <countfree> 470e: 84aa mv s1,a0 - if (runtests(quicktests, justone, continuous)) { 4710: 864a mv a2,s2 4712: 85ce mv a1,s3 4714: 855a mv a0,s6 4716: e1dff0ef jal 4532 <runtests> 471a: c119 beqz a0,4720 <drivetests+0x7e> - if(continuous != 2) { 471c: 03491963 bne s2,s4,474e <drivetests+0xac> - if(!quick) { 4720: fc0a9ce3 bnez s5,46f8 <drivetests+0x56> - if (justone == 0) 4724: fc0986e3 beqz s3,46f0 <drivetests+0x4e> - if (runtests(slowtests, justone, continuous)) { 4728: 864a mv a2,s2 472a: 85ce mv a1,s3 472c: 8562 mv a0,s8 472e: e05ff0ef jal 4532 <runtests> 4732: d179 beqz a0,46f8 <drivetests+0x56> - if(continuous != 2) { 4734: fd4902e3 beq s2,s4,46f8 <drivetests+0x56> - return 1; 4738: 4505 li a0,1 473a: a829 j 4754 <drivetests+0xb2> - printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); 473c: 8626 mv a2,s1 473e: 85aa mv a1,a0 4740: 8566 mv a0,s9 4742: 774000ef jal 4eb6 <printf> - if(continuous != 2) { 4746: fb490fe3 beq s2,s4,4704 <drivetests+0x62> - return 1; 474a: 4505 li a0,1 474c: a021 j 4754 <drivetests+0xb2> - return 1; 474e: 4505 li a0,1 4750: a011 j 4754 <drivetests+0xb2> - return 0; 4752: 854a mv a0,s2 -} 4754: 60e6 ld ra,88(sp) 4756: 6446 ld s0,80(sp) 4758: 64a6 ld s1,72(sp) @@ -8073,10 +5987,6 @@ drivetests(int quick, int continuous, char *justone) { 476e: 8082 ret 0000000000004770 <main>: - -int -main(int argc, char *argv[]) -{ 4770: 1101 addi sp,sp,-32 4772: ec06 sd ra,24(sp) 4774: e822 sd s0,16(sp) @@ -8084,38 +5994,18 @@ main(int argc, char *argv[]) 4778: e04a sd s2,0(sp) 477a: 1000 addi s0,sp,32 477c: 84aa mv s1,a0 - int continuous = 0; - int quick = 0; - char *justone = 0; - - if(argc == 2 && strcmp(argv[1], "-q") == 0){ 477e: 4789 li a5,2 4780: 00f50f63 beq a0,a5,479e <main+0x2e> - continuous = 1; - } else if(argc == 2 && strcmp(argv[1], "-C") == 0){ - continuous = 2; - } else if(argc == 2 && argv[1][0] != '-'){ - justone = argv[1]; - } else if(argc > 1){ 4784: 4785 li a5,1 4786: 06a7c063 blt a5,a0,47e6 <main+0x76> - char *justone = 0; 478a: 4901 li s2,0 - int quick = 0; 478c: 4501 li a0,0 - int continuous = 0; 478e: 4581 li a1,0 - printf("Usage: usertests [-c] [-C] [-q] [testname]\n"); - exit(1); - } - if (drivetests(quick, continuous, justone)) { 4790: 864a mv a2,s2 4792: f11ff0ef jal 46a2 <drivetests> 4796: c935 beqz a0,480a <main+0x9a> - exit(1); 4798: 4505 li a0,1 479a: 2ec000ef jal 4a86 <exit> - if(argc == 2 && strcmp(argv[1], "-q") == 0){ 479e: 0085b903 ld s2,8(a1) 47a2: 00003597 auipc a1,0x3 47a6: 8c658593 addi a1,a1,-1850 # 7068 <malloc+0x20fe> @@ -8123,103 +6013,124 @@ main(int argc, char *argv[]) 47ac: 09e000ef jal 484a <strcmp> 47b0: 85aa mv a1,a0 47b2: c139 beqz a0,47f8 <main+0x88> - } else if(argc == 2 && strcmp(argv[1], "-c") == 0){ 47b4: 00003597 auipc a1,0x3 47b8: 8bc58593 addi a1,a1,-1860 # 7070 <malloc+0x2106> 47bc: 854a mv a0,s2 47be: 08c000ef jal 484a <strcmp> 47c2: cd15 beqz a0,47fe <main+0x8e> - } else if(argc == 2 && strcmp(argv[1], "-C") == 0){ 47c4: 00003597 auipc a1,0x3 47c8: 8b458593 addi a1,a1,-1868 # 7078 <malloc+0x210e> 47cc: 854a mv a0,s2 47ce: 07c000ef jal 484a <strcmp> 47d2: c90d beqz a0,4804 <main+0x94> - } else if(argc == 2 && argv[1][0] != '-'){ 47d4: 00094703 lbu a4,0(s2) 47d8: 02d00793 li a5,45 47dc: 00f70563 beq a4,a5,47e6 <main+0x76> - int quick = 0; 47e0: 4501 li a0,0 - int continuous = 0; 47e2: 4581 li a1,0 47e4: b775 j 4790 <main+0x20> - printf("Usage: usertests [-c] [-C] [-q] [testname]\n"); 47e6: 00003517 auipc a0,0x3 47ea: 89a50513 addi a0,a0,-1894 # 7080 <malloc+0x2116> 47ee: 6c8000ef jal 4eb6 <printf> - exit(1); 47f2: 4505 li a0,1 47f4: 292000ef jal 4a86 <exit> - char *justone = 0; 47f8: 4901 li s2,0 - quick = 1; 47fa: 4505 li a0,1 47fc: bf51 j 4790 <main+0x20> - char *justone = 0; 47fe: 4901 li s2,0 - continuous = 1; 4800: 4585 li a1,1 4802: b779 j 4790 <main+0x20> - continuous = 2; 4804: 85a6 mv a1,s1 - char *justone = 0; 4806: 4901 li s2,0 4808: b761 j 4790 <main+0x20> - } - printf("ALL TESTS PASSED\n"); 480a: 00003517 auipc a0,0x3 480e: 8a650513 addi a0,a0,-1882 # 70b0 <malloc+0x2146> 4812: 6a4000ef jal 4eb6 <printf> - exit(0); 4816: 4501 li a0,0 4818: 26e000ef jal 4a86 <exit> 000000000000481c <start>: +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start() +{ 481c: 1141 addi sp,sp,-16 481e: e406 sd ra,8(sp) 4820: e022 sd s0,0(sp) 4822: 0800 addi s0,sp,16 + extern int main(); + main(); 4824: f4dff0ef jal 4770 <main> + exit(0); 4828: 4501 li a0,0 482a: 25c000ef jal 4a86 <exit> 000000000000482e <strcpy>: +} + +char* +strcpy(char *s, const char *t) +{ 482e: 1141 addi sp,sp,-16 4830: e422 sd s0,8(sp) 4832: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) 4834: 87aa mv a5,a0 4836: 0585 addi a1,a1,1 4838: 0785 addi a5,a5,1 483a: fff5c703 lbu a4,-1(a1) 483e: fee78fa3 sb a4,-1(a5) 4842: fb75 bnez a4,4836 <strcpy+0x8> + ; + return os; +} 4844: 6422 ld s0,8(sp) 4846: 0141 addi sp,sp,16 4848: 8082 ret 000000000000484a <strcmp>: + +int +strcmp(const char *p, const char *q) +{ 484a: 1141 addi sp,sp,-16 484c: e422 sd s0,8(sp) 484e: 0800 addi s0,sp,16 + while(*p && *p == *q) 4850: 00054783 lbu a5,0(a0) 4854: cb91 beqz a5,4868 <strcmp+0x1e> 4856: 0005c703 lbu a4,0(a1) 485a: 00f71763 bne a4,a5,4868 <strcmp+0x1e> + p++, q++; 485e: 0505 addi a0,a0,1 4860: 0585 addi a1,a1,1 + while(*p && *p == *q) 4862: 00054783 lbu a5,0(a0) 4866: fbe5 bnez a5,4856 <strcmp+0xc> + return (uchar)*p - (uchar)*q; 4868: 0005c503 lbu a0,0(a1) +} 486c: 40a7853b subw a0,a5,a0 4870: 6422 ld s0,8(sp) 4872: 0141 addi sp,sp,16 4874: 8082 ret 0000000000004876 <strlen>: + +uint +strlen(const char *s) +{ 4876: 1141 addi sp,sp,-16 4878: e422 sd s0,8(sp) 487a: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) 487c: 00054783 lbu a5,0(a0) 4880: cf91 beqz a5,489c <strlen+0x26> 4882: 0505 addi a0,a0,1 @@ -8230,46 +6141,77 @@ main(int argc, char *argv[]) 488e: ff65 bnez a4,4886 <strlen+0x10> 4890: 40a6853b subw a0,a3,a0 4894: 2505 addiw a0,a0,1 + ; + return n; +} 4896: 6422 ld s0,8(sp) 4898: 0141 addi sp,sp,16 489a: 8082 ret + for(n = 0; s[n]; n++) 489c: 4501 li a0,0 489e: bfe5 j 4896 <strlen+0x20> 00000000000048a0 <memset>: + +void* +memset(void *dst, int c, uint n) +{ 48a0: 1141 addi sp,sp,-16 48a2: e422 sd s0,8(sp) 48a4: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ 48a6: ca19 beqz a2,48bc <memset+0x1c> 48a8: 87aa mv a5,a0 48aa: 1602 slli a2,a2,0x20 48ac: 9201 srli a2,a2,0x20 48ae: 00a60733 add a4,a2,a0 + cdst[i] = c; 48b2: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ 48b6: 0785 addi a5,a5,1 48b8: fee79de3 bne a5,a4,48b2 <memset+0x12> + } + return dst; +} 48bc: 6422 ld s0,8(sp) 48be: 0141 addi sp,sp,16 48c0: 8082 ret 00000000000048c2 <strchr>: + +char* +strchr(const char *s, char c) +{ 48c2: 1141 addi sp,sp,-16 48c4: e422 sd s0,8(sp) 48c6: 0800 addi s0,sp,16 + for(; *s; s++) 48c8: 00054783 lbu a5,0(a0) 48cc: cb99 beqz a5,48e2 <strchr+0x20> + if(*s == c) 48ce: 00f58763 beq a1,a5,48dc <strchr+0x1a> + for(; *s; s++) 48d2: 0505 addi a0,a0,1 48d4: 00054783 lbu a5,0(a0) 48d8: fbfd bnez a5,48ce <strchr+0xc> + return (char*)s; + return 0; 48da: 4501 li a0,0 +} 48dc: 6422 ld s0,8(sp) 48de: 0141 addi sp,sp,16 48e0: 8082 ret + return 0; 48e2: 4501 li a0,0 48e4: bfe5 j 48dc <strchr+0x1a> 00000000000048e6 <gets>: + +char* +gets(char *buf, int max) +{ 48e6: 711d addi sp,sp,-96 48e8: ec86 sd ra,88(sp) 48ea: e8a2 sd s0,80(sp) @@ -8283,28 +6225,48 @@ main(int argc, char *argv[]) 48fa: 1080 addi s0,sp,96 48fc: 8baa mv s7,a0 48fe: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ 4900: 892a mv s2,a0 4902: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') 4904: 4aa9 li s5,10 4906: 4b35 li s6,13 + for(i=0; i+1 < max; ){ 4908: 89a6 mv s3,s1 490a: 2485 addiw s1,s1,1 490c: 0344d663 bge s1,s4,4938 <gets+0x52> + cc = read(0, &c, 1); 4910: 4605 li a2,1 4912: faf40593 addi a1,s0,-81 4916: 4501 li a0,0 4918: 186000ef jal 4a9e <read> + if(cc < 1) 491c: 00a05e63 blez a0,4938 <gets+0x52> + buf[i++] = c; 4920: faf44783 lbu a5,-81(s0) 4924: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') 4928: 01578763 beq a5,s5,4936 <gets+0x50> 492c: 0905 addi s2,s2,1 492e: fd679de3 bne a5,s6,4908 <gets+0x22> + buf[i++] = c; 4932: 89a6 mv s3,s1 4934: a011 j 4938 <gets+0x52> 4936: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; 4938: 99de add s3,s3,s7 493a: 00098023 sb zero,0(s3) + return buf; +} 493e: 855e mv a0,s7 4940: 60e6 ld ra,88(sp) 4942: 6446 ld s0,80(sp) @@ -8319,123 +6281,200 @@ main(int argc, char *argv[]) 4954: 8082 ret 0000000000004956 <stat>: + +int +stat(const char *n, struct stat *st) +{ 4956: 1101 addi sp,sp,-32 4958: ec06 sd ra,24(sp) 495a: e822 sd s0,16(sp) 495c: e04a sd s2,0(sp) 495e: 1000 addi s0,sp,32 4960: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); 4962: 4581 li a1,0 4964: 162000ef jal 4ac6 <open> + if(fd < 0) 4968: 02054263 bltz a0,498c <stat+0x36> 496c: e426 sd s1,8(sp) 496e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); 4970: 85ca mv a1,s2 4972: 16c000ef jal 4ade <fstat> 4976: 892a mv s2,a0 + close(fd); 4978: 8526 mv a0,s1 497a: 134000ef jal 4aae <close> + return r; 497e: 64a2 ld s1,8(sp) +} 4980: 854a mv a0,s2 4982: 60e2 ld ra,24(sp) 4984: 6442 ld s0,16(sp) 4986: 6902 ld s2,0(sp) 4988: 6105 addi sp,sp,32 498a: 8082 ret + return -1; 498c: 597d li s2,-1 498e: bfcd j 4980 <stat+0x2a> 0000000000004990 <atoi>: + +int +atoi(const char *s) +{ 4990: 1141 addi sp,sp,-16 4992: e422 sd s0,8(sp) 4994: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') 4996: 00054683 lbu a3,0(a0) 499a: fd06879b addiw a5,a3,-48 499e: 0ff7f793 zext.b a5,a5 49a2: 4625 li a2,9 49a4: 02f66863 bltu a2,a5,49d4 <atoi+0x44> 49a8: 872a mv a4,a0 + n = 0; 49aa: 4501 li a0,0 + n = n*10 + *s++ - '0'; 49ac: 0705 addi a4,a4,1 49ae: 0025179b slliw a5,a0,0x2 49b2: 9fa9 addw a5,a5,a0 49b4: 0017979b slliw a5,a5,0x1 49b8: 9fb5 addw a5,a5,a3 49ba: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') 49be: 00074683 lbu a3,0(a4) 49c2: fd06879b addiw a5,a3,-48 49c6: 0ff7f793 zext.b a5,a5 49ca: fef671e3 bgeu a2,a5,49ac <atoi+0x1c> + return n; +} 49ce: 6422 ld s0,8(sp) 49d0: 0141 addi sp,sp,16 49d2: 8082 ret + n = 0; 49d4: 4501 li a0,0 49d6: bfe5 j 49ce <atoi+0x3e> 00000000000049d8 <memmove>: + +void* +memmove(void *vdst, const void *vsrc, int n) +{ 49d8: 1141 addi sp,sp,-16 49da: e422 sd s0,8(sp) 49dc: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { 49de: 02b57463 bgeu a0,a1,4a06 <memmove+0x2e> + while(n-- > 0) 49e2: 00c05f63 blez a2,4a00 <memmove+0x28> 49e6: 1602 slli a2,a2,0x20 49e8: 9201 srli a2,a2,0x20 49ea: 00c507b3 add a5,a0,a2 + dst = vdst; 49ee: 872a mv a4,a0 + *dst++ = *src++; 49f0: 0585 addi a1,a1,1 49f2: 0705 addi a4,a4,1 49f4: fff5c683 lbu a3,-1(a1) 49f8: fed70fa3 sb a3,-1(a4) + while(n-- > 0) 49fc: fef71ae3 bne a4,a5,49f0 <memmove+0x18> + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} 4a00: 6422 ld s0,8(sp) 4a02: 0141 addi sp,sp,16 4a04: 8082 ret + dst += n; 4a06: 00c50733 add a4,a0,a2 + src += n; 4a0a: 95b2 add a1,a1,a2 + while(n-- > 0) 4a0c: fec05ae3 blez a2,4a00 <memmove+0x28> 4a10: fff6079b addiw a5,a2,-1 # 2fff <subdir+0x41d> 4a14: 1782 slli a5,a5,0x20 4a16: 9381 srli a5,a5,0x20 4a18: fff7c793 not a5,a5 4a1c: 97ba add a5,a5,a4 + *--dst = *--src; 4a1e: 15fd addi a1,a1,-1 4a20: 177d addi a4,a4,-1 4a22: 0005c683 lbu a3,0(a1) 4a26: 00d70023 sb a3,0(a4) + while(n-- > 0) 4a2a: fee79ae3 bne a5,a4,4a1e <memmove+0x46> 4a2e: bfc9 j 4a00 <memmove+0x28> 0000000000004a30 <memcmp>: + +int +memcmp(const void *s1, const void *s2, uint n) +{ 4a30: 1141 addi sp,sp,-16 4a32: e422 sd s0,8(sp) 4a34: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { 4a36: ca05 beqz a2,4a66 <memcmp+0x36> 4a38: fff6069b addiw a3,a2,-1 4a3c: 1682 slli a3,a3,0x20 4a3e: 9281 srli a3,a3,0x20 4a40: 0685 addi a3,a3,1 4a42: 96aa add a3,a3,a0 + if (*p1 != *p2) { 4a44: 00054783 lbu a5,0(a0) 4a48: 0005c703 lbu a4,0(a1) 4a4c: 00e79863 bne a5,a4,4a5c <memcmp+0x2c> + return *p1 - *p2; + } + p1++; 4a50: 0505 addi a0,a0,1 + p2++; 4a52: 0585 addi a1,a1,1 + while (n-- > 0) { 4a54: fed518e3 bne a0,a3,4a44 <memcmp+0x14> + } + return 0; 4a58: 4501 li a0,0 4a5a: a019 j 4a60 <memcmp+0x30> + return *p1 - *p2; 4a5c: 40e7853b subw a0,a5,a4 +} 4a60: 6422 ld s0,8(sp) 4a62: 0141 addi sp,sp,16 4a64: 8082 ret + return 0; 4a66: 4501 li a0,0 4a68: bfe5 j 4a60 <memcmp+0x30> 0000000000004a6a <memcpy>: + +void * +memcpy(void *dst, const void *src, uint n) +{ 4a6a: 1141 addi sp,sp,-16 4a6c: e406 sd ra,8(sp) 4a6e: e022 sd s0,0(sp) 4a70: 0800 addi s0,sp,16 + return memmove(dst, src, n); 4a72: f67ff0ef jal 49d8 <memmove> +} 4a76: 60a2 ld ra,8(sp) 4a78: 6402 ld s0,0(sp) 4a7a: 0141 addi sp,sp,16 @@ -8562,32 +6601,60 @@ main(int argc, char *argv[]) 4b3c: 8082 ret 0000000000004b3e <putc>: + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ 4b3e: 1101 addi sp,sp,-32 4b40: ec06 sd ra,24(sp) 4b42: e822 sd s0,16(sp) 4b44: 1000 addi s0,sp,32 4b46: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); 4b4a: 4605 li a2,1 4b4c: fef40593 addi a1,s0,-17 4b50: f57ff0ef jal 4aa6 <write> +} 4b54: 60e2 ld ra,24(sp) 4b56: 6442 ld s0,16(sp) 4b58: 6105 addi sp,sp,32 4b5a: 8082 ret 0000000000004b5c <printint>: + +static void +printint(int fd, int xx, int base, int sgn) +{ 4b5c: 7139 addi sp,sp,-64 4b5e: fc06 sd ra,56(sp) 4b60: f822 sd s0,48(sp) 4b62: f426 sd s1,40(sp) 4b64: 0080 addi s0,sp,64 4b66: 84aa mv s1,a0 + char buf[16]; + int i, neg; + uint x; + + neg = 0; + if(sgn && xx < 0){ 4b68: c299 beqz a3,4b6e <printint+0x12> 4b6a: 0805c963 bltz a1,4bfc <printint+0xa0> + neg = 1; + x = -xx; + } else { + x = xx; 4b6e: 2581 sext.w a1,a1 + neg = 0; 4b70: 4881 li a7,0 4b72: fc040693 addi a3,s0,-64 + } + + i = 0; 4b76: 4701 li a4,0 + do{ + buf[i++] = digits[x % base]; 4b78: 2601 sext.w a2,a2 4b7a: 00003517 auipc a0,0x3 4b7e: 90650513 addi a0,a0,-1786 # 7480 <digits> @@ -8599,16 +6666,21 @@ main(int argc, char *argv[]) 4b8e: 97aa add a5,a5,a0 4b90: 0007c783 lbu a5,0(a5) 4b94: 00f68023 sb a5,0(a3) + }while((x /= base) != 0); 4b98: 0005879b sext.w a5,a1 4b9c: 02c5d5bb divuw a1,a1,a2 4ba0: 0685 addi a3,a3,1 4ba2: fec7f0e3 bgeu a5,a2,4b82 <printint+0x26> + if(neg) 4ba6: 00088c63 beqz a7,4bbe <printint+0x62> + buf[i++] = '-'; 4baa: fd070793 addi a5,a4,-48 4bae: 00878733 add a4,a5,s0 4bb2: 02d00793 li a5,45 4bb6: fef70823 sb a5,-16(a4) 4bba: 0028071b addiw a4,a6,2 + + while(--i >= 0) 4bbe: 02e05a63 blez a4,4bf2 <printint+0x96> 4bc2: f04a sd s2,32(sp) 4bc4: ec4e sd s3,24(sp) @@ -8620,28 +6692,45 @@ main(int argc, char *argv[]) 4bd6: 1702 slli a4,a4,0x20 4bd8: 9301 srli a4,a4,0x20 4bda: 40e989b3 sub s3,s3,a4 + putc(fd, buf[i]); 4bde: fff94583 lbu a1,-1(s2) 4be2: 8526 mv a0,s1 4be4: f5bff0ef jal 4b3e <putc> + while(--i >= 0) 4be8: 197d addi s2,s2,-1 4bea: ff391ae3 bne s2,s3,4bde <printint+0x82> 4bee: 7902 ld s2,32(sp) 4bf0: 69e2 ld s3,24(sp) +} 4bf2: 70e2 ld ra,56(sp) 4bf4: 7442 ld s0,48(sp) 4bf6: 74a2 ld s1,40(sp) 4bf8: 6121 addi sp,sp,64 4bfa: 8082 ret + x = -xx; 4bfc: 40b005bb negw a1,a1 + neg = 1; 4c00: 4885 li a7,1 + x = -xx; 4c02: bf85 j 4b72 <printint+0x16> 0000000000004c04 <vprintf>: +} + +// Print to the given fd. Only understands %d, %x, %p, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ 4c04: 711d addi sp,sp,-96 4c06: ec86 sd ra,88(sp) 4c08: e8a2 sd s0,80(sp) 4c0a: e0ca sd s2,64(sp) 4c0c: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ 4c0e: 0005c903 lbu s2,0(a1) 4c12: 26090863 beqz s2,4e82 <vprintf+0x27e> 4c16: e4a6 sd s1,72(sp) @@ -8655,51 +6744,110 @@ main(int argc, char *argv[]) 4c26: 8b2a mv s6,a0 4c28: 8a2e mv s4,a1 4c2a: 8bb2 mv s7,a2 + state = 0; 4c2c: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ 4c2e: 4481 li s1,0 4c30: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ 4c32: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ 4c36: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ 4c3a: 06c00c93 li s9,108 4c3e: a005 j 4c5e <vprintf+0x5a> + putc(fd, c0); 4c40: 85ca mv a1,s2 4c42: 855a mv a0,s6 4c44: efbff0ef jal 4b3e <putc> 4c48: a019 j 4c4e <vprintf+0x4a> + } else if(state == '%'){ 4c4a: 03598263 beq s3,s5,4c6e <vprintf+0x6a> + for(i = 0; fmt[i]; i++){ 4c4e: 2485 addiw s1,s1,1 4c50: 8726 mv a4,s1 4c52: 009a07b3 add a5,s4,s1 4c56: 0007c903 lbu s2,0(a5) 4c5a: 20090c63 beqz s2,4e72 <vprintf+0x26e> + c0 = fmt[i] & 0xff; 4c5e: 0009079b sext.w a5,s2 + if(state == 0){ 4c62: fe0994e3 bnez s3,4c4a <vprintf+0x46> + if(c0 == '%'){ 4c66: fd579de3 bne a5,s5,4c40 <vprintf+0x3c> + state = '%'; 4c6a: 89be mv s3,a5 4c6c: b7cd j 4c4e <vprintf+0x4a> + if(c0) c1 = fmt[i+1] & 0xff; 4c6e: 00ea06b3 add a3,s4,a4 4c72: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; 4c76: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; 4c78: c681 beqz a3,4c80 <vprintf+0x7c> 4c7a: 9752 add a4,a4,s4 4c7c: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ 4c80: 03878f63 beq a5,s8,4cbe <vprintf+0xba> + } else if(c0 == 'l' && c1 == 'd'){ 4c84: 05978963 beq a5,s9,4cd6 <vprintf+0xd2> + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ 4c88: 07500713 li a4,117 4c8c: 0ee78363 beq a5,a4,4d72 <vprintf+0x16e> + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ 4c90: 07800713 li a4,120 4c94: 12e78563 beq a5,a4,4dbe <vprintf+0x1ba> + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ 4c98: 07000713 li a4,112 4c9c: 14e78a63 beq a5,a4,4df0 <vprintf+0x1ec> + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 's'){ 4ca0: 07300713 li a4,115 4ca4: 18e78a63 beq a5,a4,4e38 <vprintf+0x234> + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ 4ca8: 02500713 li a4,37 4cac: 04e79563 bne a5,a4,4cf6 <vprintf+0xf2> + putc(fd, '%'); 4cb0: 02500593 li a1,37 4cb4: 855a mv a0,s6 4cb6: e89ff0ef jal 4b3e <putc> + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c); + } +#endif + state = 0; 4cba: 4981 li s3,0 4cbc: bf49 j 4c4e <vprintf+0x4a> + printint(fd, va_arg(ap, int), 10, 1); 4cbe: 008b8913 addi s2,s7,8 4cc2: 4685 li a3,1 4cc4: 4629 li a2,10 @@ -8707,60 +6855,87 @@ main(int argc, char *argv[]) 4cca: 855a mv a0,s6 4ccc: e91ff0ef jal 4b5c <printint> 4cd0: 8bca mv s7,s2 + state = 0; 4cd2: 4981 li s3,0 4cd4: bfad j 4c4e <vprintf+0x4a> + } else if(c0 == 'l' && c1 == 'd'){ 4cd6: 06400793 li a5,100 4cda: 02f68963 beq a3,a5,4d0c <vprintf+0x108> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ 4cde: 06c00793 li a5,108 4ce2: 04f68263 beq a3,a5,4d26 <vprintf+0x122> + } else if(c0 == 'l' && c1 == 'u'){ 4ce6: 07500793 li a5,117 4cea: 0af68063 beq a3,a5,4d8a <vprintf+0x186> + } else if(c0 == 'l' && c1 == 'x'){ 4cee: 07800793 li a5,120 4cf2: 0ef68263 beq a3,a5,4dd6 <vprintf+0x1d2> + putc(fd, '%'); 4cf6: 02500593 li a1,37 4cfa: 855a mv a0,s6 4cfc: e43ff0ef jal 4b3e <putc> + putc(fd, c0); 4d00: 85ca mv a1,s2 4d02: 855a mv a0,s6 4d04: e3bff0ef jal 4b3e <putc> + state = 0; 4d08: 4981 li s3,0 4d0a: b791 j 4c4e <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 1); 4d0c: 008b8913 addi s2,s7,8 4d10: 4685 li a3,1 4d12: 4629 li a2,10 4d14: 000ba583 lw a1,0(s7) 4d18: 855a mv a0,s6 4d1a: e43ff0ef jal 4b5c <printint> + i += 1; 4d1e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); 4d20: 8bca mv s7,s2 + state = 0; 4d22: 4981 li s3,0 + i += 1; 4d24: b72d j 4c4e <vprintf+0x4a> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ 4d26: 06400793 li a5,100 4d2a: 02f60763 beq a2,a5,4d58 <vprintf+0x154> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ 4d2e: 07500793 li a5,117 4d32: 06f60963 beq a2,a5,4da4 <vprintf+0x1a0> + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ 4d36: 07800793 li a5,120 4d3a: faf61ee3 bne a2,a5,4cf6 <vprintf+0xf2> + printint(fd, va_arg(ap, uint64), 16, 0); 4d3e: 008b8913 addi s2,s7,8 4d42: 4681 li a3,0 4d44: 4641 li a2,16 4d46: 000ba583 lw a1,0(s7) 4d4a: 855a mv a0,s6 4d4c: e11ff0ef jal 4b5c <printint> + i += 2; 4d50: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); 4d52: 8bca mv s7,s2 + state = 0; 4d54: 4981 li s3,0 + i += 2; 4d56: bde5 j 4c4e <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 1); 4d58: 008b8913 addi s2,s7,8 4d5c: 4685 li a3,1 4d5e: 4629 li a2,10 4d60: 000ba583 lw a1,0(s7) 4d64: 855a mv a0,s6 4d66: df7ff0ef jal 4b5c <printint> + i += 2; 4d6a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); 4d6c: 8bca mv s7,s2 + state = 0; 4d6e: 4981 li s3,0 + i += 2; 4d70: bdf9 j 4c4e <vprintf+0x4a> + printint(fd, va_arg(ap, int), 10, 0); 4d72: 008b8913 addi s2,s7,8 4d76: 4681 li a3,0 4d78: 4629 li a2,10 @@ -8768,28 +6943,40 @@ main(int argc, char *argv[]) 4d7e: 855a mv a0,s6 4d80: dddff0ef jal 4b5c <printint> 4d84: 8bca mv s7,s2 + state = 0; 4d86: 4981 li s3,0 4d88: b5d9 j 4c4e <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 0); 4d8a: 008b8913 addi s2,s7,8 4d8e: 4681 li a3,0 4d90: 4629 li a2,10 4d92: 000ba583 lw a1,0(s7) 4d96: 855a mv a0,s6 4d98: dc5ff0ef jal 4b5c <printint> + i += 1; 4d9c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); 4d9e: 8bca mv s7,s2 + state = 0; 4da0: 4981 li s3,0 + i += 1; 4da2: b575 j 4c4e <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 10, 0); 4da4: 008b8913 addi s2,s7,8 4da8: 4681 li a3,0 4daa: 4629 li a2,10 4dac: 000ba583 lw a1,0(s7) 4db0: 855a mv a0,s6 4db2: dabff0ef jal 4b5c <printint> + i += 2; 4db6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); 4db8: 8bca mv s7,s2 + state = 0; 4dba: 4981 li s3,0 + i += 2; 4dbc: bd49 j 4c4e <vprintf+0x4a> + printint(fd, va_arg(ap, int), 16, 0); 4dbe: 008b8913 addi s2,s7,8 4dc2: 4681 li a3,0 4dc4: 4641 li a2,16 @@ -8797,28 +6984,38 @@ main(int argc, char *argv[]) 4dca: 855a mv a0,s6 4dcc: d91ff0ef jal 4b5c <printint> 4dd0: 8bca mv s7,s2 + state = 0; 4dd2: 4981 li s3,0 4dd4: bdad j 4c4e <vprintf+0x4a> + printint(fd, va_arg(ap, uint64), 16, 0); 4dd6: 008b8913 addi s2,s7,8 4dda: 4681 li a3,0 4ddc: 4641 li a2,16 4dde: 000ba583 lw a1,0(s7) 4de2: 855a mv a0,s6 4de4: d79ff0ef jal 4b5c <printint> + i += 1; 4de8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); 4dea: 8bca mv s7,s2 + state = 0; 4dec: 4981 li s3,0 + i += 1; 4dee: b585 j 4c4e <vprintf+0x4a> 4df0: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); 4df2: 008b8d13 addi s10,s7,8 4df6: 000bb983 ld s3,0(s7) + putc(fd, '0'); 4dfa: 03000593 li a1,48 4dfe: 855a mv a0,s6 4e00: d3fff0ef jal 4b3e <putc> + putc(fd, 'x'); 4e04: 07800593 li a1,120 4e08: 855a mv a0,s6 4e0a: d35ff0ef jal 4b3e <putc> 4e0e: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); 4e10: 00002b97 auipc s7,0x2 4e14: 670b8b93 addi s7,s7,1648 # 7480 <digits> 4e18: 03c9d793 srli a5,s3,0x3c @@ -8826,31 +7023,44 @@ main(int argc, char *argv[]) 4e1e: 0007c583 lbu a1,0(a5) 4e22: 855a mv a0,s6 4e24: d1bff0ef jal 4b3e <putc> + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) 4e28: 0992 slli s3,s3,0x4 4e2a: 397d addiw s2,s2,-1 4e2c: fe0916e3 bnez s2,4e18 <vprintf+0x214> + printptr(fd, va_arg(ap, uint64)); 4e30: 8bea mv s7,s10 + state = 0; 4e32: 4981 li s3,0 4e34: 6d02 ld s10,0(sp) 4e36: bd21 j 4c4e <vprintf+0x4a> + if((s = va_arg(ap, char*)) == 0) 4e38: 008b8993 addi s3,s7,8 4e3c: 000bb903 ld s2,0(s7) 4e40: 00090f63 beqz s2,4e5e <vprintf+0x25a> + for(; *s; s++) 4e44: 00094583 lbu a1,0(s2) 4e48: c195 beqz a1,4e6c <vprintf+0x268> + putc(fd, *s); 4e4a: 855a mv a0,s6 4e4c: cf3ff0ef jal 4b3e <putc> + for(; *s; s++) 4e50: 0905 addi s2,s2,1 4e52: 00094583 lbu a1,0(s2) 4e56: f9f5 bnez a1,4e4a <vprintf+0x246> + if((s = va_arg(ap, char*)) == 0) 4e58: 8bce mv s7,s3 + state = 0; 4e5a: 4981 li s3,0 4e5c: bbcd j 4c4e <vprintf+0x4a> + s = "(null)"; 4e5e: 00002917 auipc s2,0x2 4e62: 5a290913 addi s2,s2,1442 # 7400 <malloc+0x2496> + for(; *s; s++) 4e66: 02800593 li a1,40 4e6a: b7c5 j 4e4a <vprintf+0x246> + if((s = va_arg(ap, char*)) == 0) 4e6c: 8bce mv s7,s3 + state = 0; 4e6e: 4981 li s3,0 4e70: bbf9 j 4c4e <vprintf+0x4a> 4e72: 64a6 ld s1,72(sp) @@ -8861,6 +7071,9 @@ main(int argc, char *argv[]) 4e7c: 6be2 ld s7,24(sp) 4e7e: 6c42 ld s8,16(sp) 4e80: 6ca2 ld s9,8(sp) + } + } +} 4e82: 60e6 ld ra,88(sp) 4e84: 6446 ld s0,80(sp) 4e86: 6906 ld s2,64(sp) @@ -8868,6 +7081,10 @@ main(int argc, char *argv[]) 4e8a: 8082 ret 0000000000004e8c <fprintf>: + +void +fprintf(int fd, const char *fmt, ...) +{ 4e8c: 715d addi sp,sp,-80 4e8e: ec06 sd ra,24(sp) 4e90: e822 sd s0,16(sp) @@ -8878,15 +7095,24 @@ main(int argc, char *argv[]) 4e9a: ec1c sd a5,24(s0) 4e9c: 03043023 sd a6,32(s0) 4ea0: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); 4ea4: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); 4ea8: 8622 mv a2,s0 4eaa: d5bff0ef jal 4c04 <vprintf> +} 4eae: 60e2 ld ra,24(sp) 4eb0: 6442 ld s0,16(sp) 4eb2: 6161 addi sp,sp,80 4eb4: 8082 ret 0000000000004eb6 <printf>: + +void +printf(const char *fmt, ...) +{ 4eb6: 711d addi sp,sp,-96 4eb8: ec06 sd ra,24(sp) 4eba: e822 sd s0,16(sp) @@ -8898,11 +7124,16 @@ main(int argc, char *argv[]) 4ec6: f41c sd a5,40(s0) 4ec8: 03043823 sd a6,48(s0) 4ecc: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); 4ed0: 00840613 addi a2,s0,8 4ed4: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); 4ed8: 85aa mv a1,a0 4eda: 4505 li a0,1 4edc: d29ff0ef jal 4c04 <vprintf> +} 4ee0: 60e2 ld ra,24(sp) 4ee2: 6442 ld s0,16(sp) 4ee4: 6125 addi sp,sp,96 diff --git a/user/var_test.asm b/user/var_test.asm index a142e7ddd6b7300ca778e5d94c30e1854f9b7fce..f1d3ce4c69a2bdd39f5b611c0cfe91cd446d79e1 100644 --- a/user/var_test.asm +++ b/user/var_test.asm @@ -5,69 +5,41 @@ user/_var_test: æ–‡ä»¶æ ¼å¼ elf64-littleriscv Disassembly of section .text: 0000000000000000 <main>: -#include "user.h" -#include "mytypes.h" -int -main(void) -{ 0: 1141 addi sp,sp,-16 2: e406 sd ra,8(sp) 4: e022 sd s0,0(sp) 6: 0800 addi s0,sp,16 - int value; - // 获å–共享å˜é‡çš„åˆå§‹å€¼ - value = get_shared_var(); 8: 380000ef jal 388 <get_shared_var> c: 85aa mv a1,a0 - printf("Initial shared_var: %d\n", value); e: 00001517 auipc a0,0x1 12: 8c250513 addi a0,a0,-1854 # 8d0 <malloc+0x104> 16: 702000ef jal 718 <printf> - // 设置共享å˜é‡çš„æ–°å€¼ - set_shared_var(42); 1a: 02a00513 li a0,42 1e: 372000ef jal 390 <set_shared_var> - printf("Set shared_var to: 42\n"); 22: 00001517 auipc a0,0x1 26: 8c650513 addi a0,a0,-1850 # 8e8 <malloc+0x11c> 2a: 6ee000ef jal 718 <printf> - // 冿¬¡èŽ·å–共享å˜é‡çš„值 - value = get_shared_var(); 2e: 35a000ef jal 388 <get_shared_var> 32: 85aa mv a1,a0 - printf("Updated shared_var: %d\n", value); 34: 00001517 auipc a0,0x1 38: 8d450513 addi a0,a0,-1836 # 908 <malloc+0x13c> 3c: 6dc000ef jal 718 <printf> - // 测试多个进程æ“作共享å˜é‡ - if (fork() == 0) { 40: 2a0000ef jal 2e0 <fork> 44: ed11 bnez a0,60 <main+0x60> - // å进程 - set_shared_var(100); 46: 06400513 li a0,100 4a: 346000ef jal 390 <set_shared_var> - printf("Child process set shared_var to: 100\n"); 4e: 00001517 auipc a0,0x1 52: 8d250513 addi a0,a0,-1838 # 920 <malloc+0x154> 56: 6c2000ef jal 718 <printf> - exit(0); 5a: 4501 li a0,0 5c: 28c000ef jal 2e8 <exit> - } else { - // 父进程 - wait(0); // ç‰å¾…åè¿›ç¨‹ç»“æŸ 60: 4501 li a0,0 62: 28e000ef jal 2f0 <wait> - value = get_shared_var(); 66: 322000ef jal 388 <get_shared_var> 6a: 85aa mv a1,a0 - printf("After child process, shared_var: %d\n", value); 6c: 00001517 auipc a0,0x1 70: 8dc50513 addi a0,a0,-1828 # 948 <malloc+0x17c> 74: 6a4000ef jal 718 <printf> - } - exit(0); 78: 4501 li a0,0 7a: 26e000ef jal 2e8 <exit> @@ -503,245 +475,123 @@ memcpy(void *dst, const void *src, uint n) 2de: 8082 ret 00000000000002e0 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 2e0: 4885 li a7,1 - ecall 2e2: 00000073 ecall - ret 2e6: 8082 ret 00000000000002e8 <exit>: -.global exit -exit: - li a7, SYS_exit 2e8: 4889 li a7,2 - ecall 2ea: 00000073 ecall - ret 2ee: 8082 ret 00000000000002f0 <wait>: -.global wait -wait: - li a7, SYS_wait 2f0: 488d li a7,3 - ecall 2f2: 00000073 ecall - ret 2f6: 8082 ret 00000000000002f8 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 2f8: 4891 li a7,4 - ecall 2fa: 00000073 ecall - ret 2fe: 8082 ret 0000000000000300 <read>: -.global read -read: - li a7, SYS_read 300: 4895 li a7,5 - ecall 302: 00000073 ecall - ret 306: 8082 ret 0000000000000308 <write>: -.global write -write: - li a7, SYS_write 308: 48c1 li a7,16 - ecall 30a: 00000073 ecall - ret 30e: 8082 ret 0000000000000310 <close>: -.global close -close: - li a7, SYS_close 310: 48d5 li a7,21 - ecall 312: 00000073 ecall - ret 316: 8082 ret 0000000000000318 <kill>: -.global kill -kill: - li a7, SYS_kill 318: 4899 li a7,6 - ecall 31a: 00000073 ecall - ret 31e: 8082 ret 0000000000000320 <exec>: -.global exec -exec: - li a7, SYS_exec 320: 489d li a7,7 - ecall 322: 00000073 ecall - ret 326: 8082 ret 0000000000000328 <open>: -.global open -open: - li a7, SYS_open 328: 48bd li a7,15 - ecall 32a: 00000073 ecall - ret 32e: 8082 ret 0000000000000330 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 330: 48c5 li a7,17 - ecall 332: 00000073 ecall - ret 336: 8082 ret 0000000000000338 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 338: 48c9 li a7,18 - ecall 33a: 00000073 ecall - ret 33e: 8082 ret 0000000000000340 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 340: 48a1 li a7,8 - ecall 342: 00000073 ecall - ret 346: 8082 ret 0000000000000348 <link>: -.global link -link: - li a7, SYS_link 348: 48cd li a7,19 - ecall 34a: 00000073 ecall - ret 34e: 8082 ret 0000000000000350 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 350: 48d1 li a7,20 - ecall 352: 00000073 ecall - ret 356: 8082 ret 0000000000000358 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 358: 48a5 li a7,9 - ecall 35a: 00000073 ecall - ret 35e: 8082 ret 0000000000000360 <dup>: -.global dup -dup: - li a7, SYS_dup 360: 48a9 li a7,10 - ecall 362: 00000073 ecall - ret 366: 8082 ret 0000000000000368 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 368: 48ad li a7,11 - ecall 36a: 00000073 ecall - ret 36e: 8082 ret 0000000000000370 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 370: 48b1 li a7,12 - ecall 372: 00000073 ecall - ret 376: 8082 ret 0000000000000378 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 378: 48b5 li a7,13 - ecall 37a: 00000073 ecall - ret 37e: 8082 ret 0000000000000380 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 380: 48b9 li a7,14 - ecall 382: 00000073 ecall - ret 386: 8082 ret 0000000000000388 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 388: 48d9 li a7,22 - ecall 38a: 00000073 ecall - ret 38e: 8082 ret 0000000000000390 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 390: 48dd li a7,23 - ecall 392: 00000073 ecall - ret 396: 8082 ret 0000000000000398 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 398: 48e1 li a7,24 - ecall 39a: 00000073 ecall - ret 39e: 8082 ret 00000000000003a0 <putc>: @@ -1284,184 +1134,113 @@ printf(const char *fmt, ...) 748: 8082 ret 000000000000074a <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 74a: 1141 addi sp,sp,-16 74c: e422 sd s0,8(sp) 74e: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 750: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 754: 00001797 auipc a5,0x1 758: 8ac7b783 ld a5,-1876(a5) # 1000 <freep> 75c: a02d j 786 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 75e: 4618 lw a4,8(a2) 760: 9f2d addw a4,a4,a1 762: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 766: 6398 ld a4,0(a5) 768: 6310 ld a2,0(a4) 76a: a83d j 7a8 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 76c: ff852703 lw a4,-8(a0) 770: 9f31 addw a4,a4,a2 772: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 774: ff053683 ld a3,-16(a0) 778: a091 j 7bc <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 77a: 6398 ld a4,0(a5) 77c: 00e7e463 bltu a5,a4,784 <free+0x3a> 780: 00e6ea63 bltu a3,a4,794 <free+0x4a> -{ 784: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 786: fed7fae3 bgeu a5,a3,77a <free+0x30> 78a: 6398 ld a4,0(a5) 78c: 00e6e463 bltu a3,a4,794 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 790: fee7eae3 bltu a5,a4,784 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 794: ff852583 lw a1,-8(a0) 798: 6390 ld a2,0(a5) 79a: 02059813 slli a6,a1,0x20 79e: 01c85713 srli a4,a6,0x1c 7a2: 9736 add a4,a4,a3 7a4: fae60de3 beq a2,a4,75e <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 7a8: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 7ac: 4790 lw a2,8(a5) 7ae: 02061593 slli a1,a2,0x20 7b2: 01c5d713 srli a4,a1,0x1c 7b6: 973e add a4,a4,a5 7b8: fae68ae3 beq a3,a4,76c <free+0x22> - p->s.ptr = bp->s.ptr; 7bc: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 7be: 00001717 auipc a4,0x1 7c2: 84f73123 sd a5,-1982(a4) # 1000 <freep> -} 7c6: 6422 ld s0,8(sp) 7c8: 0141 addi sp,sp,16 7ca: 8082 ret 00000000000007cc <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 7cc: 7139 addi sp,sp,-64 7ce: fc06 sd ra,56(sp) 7d0: f822 sd s0,48(sp) 7d2: f426 sd s1,40(sp) 7d4: ec4e sd s3,24(sp) 7d6: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 7d8: 02051493 slli s1,a0,0x20 7dc: 9081 srli s1,s1,0x20 7de: 04bd addi s1,s1,15 7e0: 8091 srli s1,s1,0x4 7e2: 0014899b addiw s3,s1,1 7e6: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 7e8: 00001517 auipc a0,0x1 7ec: 81853503 ld a0,-2024(a0) # 1000 <freep> 7f0: c915 beqz a0,824 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 7f2: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 7f4: 4798 lw a4,8(a5) 7f6: 08977a63 bgeu a4,s1,88a <malloc+0xbe> 7fa: f04a sd s2,32(sp) 7fc: e852 sd s4,16(sp) 7fe: e456 sd s5,8(sp) 800: e05a sd s6,0(sp) - if(nu < 4096) 802: 8a4e mv s4,s3 804: 0009871b sext.w a4,s3 808: 6685 lui a3,0x1 80a: 00d77363 bgeu a4,a3,810 <malloc+0x44> 80e: 6a05 lui s4,0x1 810: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 814: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 818: 00000917 auipc s2,0x0 81c: 7e890913 addi s2,s2,2024 # 1000 <freep> - if(p == (char*)-1) 820: 5afd li s5,-1 822: a081 j 862 <malloc+0x96> 824: f04a sd s2,32(sp) 826: e852 sd s4,16(sp) 828: e456 sd s5,8(sp) 82a: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 82c: 00000797 auipc a5,0x0 830: 7e478793 addi a5,a5,2020 # 1010 <base> 834: 00000717 auipc a4,0x0 838: 7cf73623 sd a5,1996(a4) # 1000 <freep> 83c: e39c sd a5,0(a5) - base.s.size = 0; 83e: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 842: b7c1 j 802 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 844: 6398 ld a4,0(a5) 846: e118 sd a4,0(a0) 848: a8a9 j 8a2 <malloc+0xd6> - hp->s.size = nu; 84a: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 84e: 0541 addi a0,a0,16 850: efbff0ef jal 74a <free> - return freep; 854: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 858: c12d beqz a0,8ba <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 85a: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 85c: 4798 lw a4,8(a5) 85e: 02977263 bgeu a4,s1,882 <malloc+0xb6> - if(p == freep) 862: 00093703 ld a4,0(s2) 866: 853e mv a0,a5 868: fef719e3 bne a4,a5,85a <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 86c: 8552 mv a0,s4 86e: b03ff0ef jal 370 <sbrk> - if(p == (char*)-1) 872: fd551ce3 bne a0,s5,84a <malloc+0x7e> - return 0; 876: 4501 li a0,0 878: 7902 ld s2,32(sp) 87a: 6a42 ld s4,16(sp) @@ -1472,24 +1251,16 @@ malloc(uint nbytes) 884: 6a42 ld s4,16(sp) 886: 6aa2 ld s5,8(sp) 888: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 88a: fae48de3 beq s1,a4,844 <malloc+0x78> - p->s.size -= nunits; 88e: 4137073b subw a4,a4,s3 892: c798 sw a4,8(a5) - p += p->s.size; 894: 02071693 slli a3,a4,0x20 898: 01c6d713 srli a4,a3,0x1c 89c: 97ba add a5,a5,a4 - p->s.size = nunits; 89e: 0137a423 sw s3,8(a5) - freep = prevp; 8a2: 00000717 auipc a4,0x0 8a6: 74a73f23 sd a0,1886(a4) # 1000 <freep> - return (void*)(p + 1); 8aa: 01078513 addi a0,a5,16 - } -} 8ae: 70e2 ld ra,56(sp) 8b0: 7442 ld s0,48(sp) 8b2: 74a2 ld s1,40(sp) diff --git a/user/wc.asm b/user/wc.asm index 52a7db57c4c0b8e4ae92bbd5b2827d5c2c2b2ab1..5c4a22252eee849de9fe1365bdffdc2627e7b9d9 100644 --- a/user/wc.asm +++ b/user/wc.asm @@ -5,12 +5,6 @@ user/_wc: æ–‡ä»¶æ ¼å¼ elf64-littleriscv Disassembly of section .text: 0000000000000000 <wc>: - -char buf[512]; - -void -wc(int fd, char *name) -{ 0: 7119 addi sp,sp,-128 2: fc86 sd ra,120(sp) 4: f8a2 sd s0,112(sp) @@ -28,75 +22,43 @@ wc(int fd, char *name) 1c: 0100 addi s0,sp,128 1e: f8a43423 sd a0,-120(s0) 22: f8b43023 sd a1,-128(s0) - int i, n; - int l, w, c, inword; - - l = w = c = 0; - inword = 0; 26: 4901 li s2,0 - l = w = c = 0; 28: 4d01 li s10,0 2a: 4c81 li s9,0 2c: 4c01 li s8,0 - while((n = read(fd, buf, sizeof(buf))) > 0){ 2e: 00001d97 auipc s11,0x1 32: fe2d8d93 addi s11,s11,-30 # 1010 <buf> - for(i=0; i<n; i++){ - c++; - if(buf[i] == '\n') 36: 4aa9 li s5,10 - l++; - if(strchr(" \r\t\n\v", buf[i])) 38: 00001a17 auipc s4,0x1 3c: 978a0a13 addi s4,s4,-1672 # 9b0 <malloc+0x106> - inword = 0; 40: 4b81 li s7,0 - while((n = read(fd, buf, sizeof(buf))) > 0){ 42: a035 j 6e <wc+0x6e> - if(strchr(" \r\t\n\v", buf[i])) 44: 8552 mv a0,s4 46: 1bc000ef jal 202 <strchr> 4a: c919 beqz a0,60 <wc+0x60> - inword = 0; 4c: 895e mv s2,s7 - for(i=0; i<n; i++){ 4e: 0485 addi s1,s1,1 50: 01348d63 beq s1,s3,6a <wc+0x6a> - if(buf[i] == '\n') 54: 0004c583 lbu a1,0(s1) 58: ff5596e3 bne a1,s5,44 <wc+0x44> - l++; 5c: 2c05 addiw s8,s8,1 5e: b7dd j 44 <wc+0x44> - else if(!inword){ 60: fe0917e3 bnez s2,4e <wc+0x4e> - w++; 64: 2c85 addiw s9,s9,1 - inword = 1; 66: 4905 li s2,1 68: b7dd j 4e <wc+0x4e> 6a: 01ab0d3b addw s10,s6,s10 - while((n = read(fd, buf, sizeof(buf))) > 0){ 6e: 20000613 li a2,512 72: 85ee mv a1,s11 74: f8843503 ld a0,-120(s0) 78: 366000ef jal 3de <read> 7c: 8b2a mv s6,a0 7e: 00a05963 blez a0,90 <wc+0x90> - for(i=0; i<n; i++){ 82: 00001497 auipc s1,0x1 86: f8e48493 addi s1,s1,-114 # 1010 <buf> 8a: 009509b3 add s3,a0,s1 8e: b7d9 j 54 <wc+0x54> - } - } - } - if(n < 0){ 90: 02054c63 bltz a0,c8 <wc+0xc8> - printf("wc: read error\n"); - exit(1); - } - printf("%d %d %d %s\n", l, w, c, name); 94: f8043703 ld a4,-128(s0) 98: 86ea mv a3,s10 9a: 8666 mv a2,s9 @@ -104,7 +66,6 @@ wc(int fd, char *name) 9e: 00001517 auipc a0,0x1 a2: 93250513 addi a0,a0,-1742 # 9d0 <malloc+0x126> a6: 750000ef jal 7f6 <printf> -} aa: 70e6 ld ra,120(sp) ac: 7446 ld s0,112(sp) ae: 74a6 ld s1,104(sp) @@ -120,26 +81,17 @@ wc(int fd, char *name) c2: 6de2 ld s11,24(sp) c4: 6109 addi sp,sp,128 c6: 8082 ret - printf("wc: read error\n"); c8: 00001517 auipc a0,0x1 cc: 8f850513 addi a0,a0,-1800 # 9c0 <malloc+0x116> d0: 726000ef jal 7f6 <printf> - exit(1); d4: 4505 li a0,1 d6: 2f0000ef jal 3c6 <exit> 00000000000000da <main>: - -int -main(int argc, char *argv[]) -{ da: 7179 addi sp,sp,-48 dc: f406 sd ra,40(sp) de: f022 sd s0,32(sp) e0: 1800 addi s0,sp,48 - int fd, i; - - if(argc <= 1){ e2: 4785 li a5,1 e4: 04a7d463 bge a5,a0,12c <main+0x52> e8: ec26 sd s1,24(sp) @@ -151,50 +103,32 @@ main(int argc, char *argv[]) fa: 01d7d993 srli s3,a5,0x1d fe: 05c1 addi a1,a1,16 100: 99ae add s3,s3,a1 - wc(0, ""); - exit(0); - } - - for(i = 1; i < argc; i++){ - if((fd = open(argv[i], O_RDONLY)) < 0){ 102: 4581 li a1,0 104: 00093503 ld a0,0(s2) 108: 2fe000ef jal 406 <open> 10c: 84aa mv s1,a0 10e: 02054c63 bltz a0,146 <main+0x6c> - printf("wc: cannot open %s\n", argv[i]); - exit(1); - } - wc(fd, argv[i]); 112: 00093583 ld a1,0(s2) 116: eebff0ef jal 0 <wc> - close(fd); 11a: 8526 mv a0,s1 11c: 2d2000ef jal 3ee <close> - for(i = 1; i < argc; i++){ 120: 0921 addi s2,s2,8 122: ff3910e3 bne s2,s3,102 <main+0x28> - } - exit(0); 126: 4501 li a0,0 128: 29e000ef jal 3c6 <exit> 12c: ec26 sd s1,24(sp) 12e: e84a sd s2,16(sp) 130: e44e sd s3,8(sp) - wc(0, ""); 132: 00001597 auipc a1,0x1 136: 88658593 addi a1,a1,-1914 # 9b8 <malloc+0x10e> 13a: 4501 li a0,0 13c: ec5ff0ef jal 0 <wc> - exit(0); 140: 4501 li a0,0 142: 284000ef jal 3c6 <exit> - printf("wc: cannot open %s\n", argv[i]); 146: 00093583 ld a1,0(s2) 14a: 00001517 auipc a0,0x1 14e: 89650513 addi a0,a0,-1898 # 9e0 <malloc+0x136> 152: 6a4000ef jal 7f6 <printf> - exit(1); 156: 4505 li a0,1 158: 26e000ef jal 3c6 <exit> @@ -630,245 +564,123 @@ memcpy(void *dst, const void *src, uint n) 3bc: 8082 ret 00000000000003be <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 3be: 4885 li a7,1 - ecall 3c0: 00000073 ecall - ret 3c4: 8082 ret 00000000000003c6 <exit>: -.global exit -exit: - li a7, SYS_exit 3c6: 4889 li a7,2 - ecall 3c8: 00000073 ecall - ret 3cc: 8082 ret 00000000000003ce <wait>: -.global wait -wait: - li a7, SYS_wait 3ce: 488d li a7,3 - ecall 3d0: 00000073 ecall - ret 3d4: 8082 ret 00000000000003d6 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 3d6: 4891 li a7,4 - ecall 3d8: 00000073 ecall - ret 3dc: 8082 ret 00000000000003de <read>: -.global read -read: - li a7, SYS_read 3de: 4895 li a7,5 - ecall 3e0: 00000073 ecall - ret 3e4: 8082 ret 00000000000003e6 <write>: -.global write -write: - li a7, SYS_write 3e6: 48c1 li a7,16 - ecall 3e8: 00000073 ecall - ret 3ec: 8082 ret 00000000000003ee <close>: -.global close -close: - li a7, SYS_close 3ee: 48d5 li a7,21 - ecall 3f0: 00000073 ecall - ret 3f4: 8082 ret 00000000000003f6 <kill>: -.global kill -kill: - li a7, SYS_kill 3f6: 4899 li a7,6 - ecall 3f8: 00000073 ecall - ret 3fc: 8082 ret 00000000000003fe <exec>: -.global exec -exec: - li a7, SYS_exec 3fe: 489d li a7,7 - ecall 400: 00000073 ecall - ret 404: 8082 ret 0000000000000406 <open>: -.global open -open: - li a7, SYS_open 406: 48bd li a7,15 - ecall 408: 00000073 ecall - ret 40c: 8082 ret 000000000000040e <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 40e: 48c5 li a7,17 - ecall 410: 00000073 ecall - ret 414: 8082 ret 0000000000000416 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 416: 48c9 li a7,18 - ecall 418: 00000073 ecall - ret 41c: 8082 ret 000000000000041e <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 41e: 48a1 li a7,8 - ecall 420: 00000073 ecall - ret 424: 8082 ret 0000000000000426 <link>: -.global link -link: - li a7, SYS_link 426: 48cd li a7,19 - ecall 428: 00000073 ecall - ret 42c: 8082 ret 000000000000042e <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 42e: 48d1 li a7,20 - ecall 430: 00000073 ecall - ret 434: 8082 ret 0000000000000436 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 436: 48a5 li a7,9 - ecall 438: 00000073 ecall - ret 43c: 8082 ret 000000000000043e <dup>: -.global dup -dup: - li a7, SYS_dup 43e: 48a9 li a7,10 - ecall 440: 00000073 ecall - ret 444: 8082 ret 0000000000000446 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 446: 48ad li a7,11 - ecall 448: 00000073 ecall - ret 44c: 8082 ret 000000000000044e <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 44e: 48b1 li a7,12 - ecall 450: 00000073 ecall - ret 454: 8082 ret 0000000000000456 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 456: 48b5 li a7,13 - ecall 458: 00000073 ecall - ret 45c: 8082 ret 000000000000045e <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 45e: 48b9 li a7,14 - ecall 460: 00000073 ecall - ret 464: 8082 ret 0000000000000466 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 466: 48d9 li a7,22 - ecall 468: 00000073 ecall - ret 46c: 8082 ret 000000000000046e <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 46e: 48dd li a7,23 - ecall 470: 00000073 ecall - ret 474: 8082 ret 0000000000000476 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 476: 48e1 li a7,24 - ecall 478: 00000073 ecall - ret 47c: 8082 ret 000000000000047e <putc>: @@ -1411,184 +1223,113 @@ printf(const char *fmt, ...) 826: 8082 ret 0000000000000828 <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 828: 1141 addi sp,sp,-16 82a: e422 sd s0,8(sp) 82c: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 82e: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 832: 00000797 auipc a5,0x0 836: 7ce7b783 ld a5,1998(a5) # 1000 <freep> 83a: a02d j 864 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 83c: 4618 lw a4,8(a2) 83e: 9f2d addw a4,a4,a1 840: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 844: 6398 ld a4,0(a5) 846: 6310 ld a2,0(a4) 848: a83d j 886 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 84a: ff852703 lw a4,-8(a0) 84e: 9f31 addw a4,a4,a2 850: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 852: ff053683 ld a3,-16(a0) 856: a091 j 89a <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 858: 6398 ld a4,0(a5) 85a: 00e7e463 bltu a5,a4,862 <free+0x3a> 85e: 00e6ea63 bltu a3,a4,872 <free+0x4a> -{ 862: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 864: fed7fae3 bgeu a5,a3,858 <free+0x30> 868: 6398 ld a4,0(a5) 86a: 00e6e463 bltu a3,a4,872 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 86e: fee7eae3 bltu a5,a4,862 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 872: ff852583 lw a1,-8(a0) 876: 6390 ld a2,0(a5) 878: 02059813 slli a6,a1,0x20 87c: 01c85713 srli a4,a6,0x1c 880: 9736 add a4,a4,a3 882: fae60de3 beq a2,a4,83c <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 886: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 88a: 4790 lw a2,8(a5) 88c: 02061593 slli a1,a2,0x20 890: 01c5d713 srli a4,a1,0x1c 894: 973e add a4,a4,a5 896: fae68ae3 beq a3,a4,84a <free+0x22> - p->s.ptr = bp->s.ptr; 89a: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 89c: 00000717 auipc a4,0x0 8a0: 76f73223 sd a5,1892(a4) # 1000 <freep> -} 8a4: 6422 ld s0,8(sp) 8a6: 0141 addi sp,sp,16 8a8: 8082 ret 00000000000008aa <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 8aa: 7139 addi sp,sp,-64 8ac: fc06 sd ra,56(sp) 8ae: f822 sd s0,48(sp) 8b0: f426 sd s1,40(sp) 8b2: ec4e sd s3,24(sp) 8b4: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 8b6: 02051493 slli s1,a0,0x20 8ba: 9081 srli s1,s1,0x20 8bc: 04bd addi s1,s1,15 8be: 8091 srli s1,s1,0x4 8c0: 0014899b addiw s3,s1,1 8c4: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 8c6: 00000517 auipc a0,0x0 8ca: 73a53503 ld a0,1850(a0) # 1000 <freep> 8ce: c915 beqz a0,902 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 8d0: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 8d2: 4798 lw a4,8(a5) 8d4: 08977a63 bgeu a4,s1,968 <malloc+0xbe> 8d8: f04a sd s2,32(sp) 8da: e852 sd s4,16(sp) 8dc: e456 sd s5,8(sp) 8de: e05a sd s6,0(sp) - if(nu < 4096) 8e0: 8a4e mv s4,s3 8e2: 0009871b sext.w a4,s3 8e6: 6685 lui a3,0x1 8e8: 00d77363 bgeu a4,a3,8ee <malloc+0x44> 8ec: 6a05 lui s4,0x1 8ee: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 8f2: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 8f6: 00000917 auipc s2,0x0 8fa: 70a90913 addi s2,s2,1802 # 1000 <freep> - if(p == (char*)-1) 8fe: 5afd li s5,-1 900: a081 j 940 <malloc+0x96> 902: f04a sd s2,32(sp) 904: e852 sd s4,16(sp) 906: e456 sd s5,8(sp) 908: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 90a: 00001797 auipc a5,0x1 90e: 90678793 addi a5,a5,-1786 # 1210 <base> 912: 00000717 auipc a4,0x0 916: 6ef73723 sd a5,1774(a4) # 1000 <freep> 91a: e39c sd a5,0(a5) - base.s.size = 0; 91c: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 920: b7c1 j 8e0 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 922: 6398 ld a4,0(a5) 924: e118 sd a4,0(a0) 926: a8a9 j 980 <malloc+0xd6> - hp->s.size = nu; 928: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 92c: 0541 addi a0,a0,16 92e: efbff0ef jal 828 <free> - return freep; 932: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 936: c12d beqz a0,998 <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 938: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 93a: 4798 lw a4,8(a5) 93c: 02977263 bgeu a4,s1,960 <malloc+0xb6> - if(p == freep) 940: 00093703 ld a4,0(s2) 944: 853e mv a0,a5 946: fef719e3 bne a4,a5,938 <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 94a: 8552 mv a0,s4 94c: b03ff0ef jal 44e <sbrk> - if(p == (char*)-1) 950: fd551ce3 bne a0,s5,928 <malloc+0x7e> - return 0; 954: 4501 li a0,0 956: 7902 ld s2,32(sp) 958: 6a42 ld s4,16(sp) @@ -1599,24 +1340,16 @@ malloc(uint nbytes) 962: 6a42 ld s4,16(sp) 964: 6aa2 ld s5,8(sp) 966: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 968: fae48de3 beq s1,a4,922 <malloc+0x78> - p->s.size -= nunits; 96c: 4137073b subw a4,a4,s3 970: c798 sw a4,8(a5) - p += p->s.size; 972: 02071693 slli a3,a4,0x20 976: 01c6d713 srli a4,a3,0x1c 97a: 97ba add a5,a5,a4 - p->s.size = nunits; 97c: 0137a423 sw s3,8(a5) - freep = prevp; 980: 00000717 auipc a4,0x0 984: 68a73023 sd a0,1664(a4) # 1000 <freep> - return (void*)(p + 1); 988: 01078513 addi a0,a5,16 - } -} 98c: 70e2 ld ra,56(sp) 98e: 7442 ld s0,48(sp) 990: 74a2 ld s1,40(sp) diff --git a/user/zombie.asm b/user/zombie.asm index e104b17d822e10f6da5d378fe08d654ef0554027..68f6a3a900dabda070f1d9e66884c2ddc241ac60 100644 --- a/user/zombie.asm +++ b/user/zombie.asm @@ -5,24 +5,14 @@ user/_zombie: æ–‡ä»¶æ ¼å¼ elf64-littleriscv Disassembly of section .text: 0000000000000000 <main>: -#include "kernel/stat.h" -#include "user/user.h" - -int -main(void) -{ 0: 1141 addi sp,sp,-16 2: e406 sd ra,8(sp) 4: e022 sd s0,0(sp) 6: 0800 addi s0,sp,16 - if(fork() > 0) 8: 278000ef jal 280 <fork> c: 00a04563 bgtz a0,16 <main+0x16> - sleep(5); // Let child exit before parent. - exit(0); 10: 4501 li a0,0 12: 276000ef jal 288 <exit> - sleep(5); // Let child exit before parent. 16: 4515 li a0,5 18: 300000ef jal 318 <sleep> 1c: bfd5 j 10 <main+0x10> @@ -459,245 +449,123 @@ memcpy(void *dst, const void *src, uint n) 27e: 8082 ret 0000000000000280 <fork>: -# generated by usys.pl - do not edit -#include "kernel/syscall.h" -.global fork -fork: - li a7, SYS_fork 280: 4885 li a7,1 - ecall 282: 00000073 ecall - ret 286: 8082 ret 0000000000000288 <exit>: -.global exit -exit: - li a7, SYS_exit 288: 4889 li a7,2 - ecall 28a: 00000073 ecall - ret 28e: 8082 ret 0000000000000290 <wait>: -.global wait -wait: - li a7, SYS_wait 290: 488d li a7,3 - ecall 292: 00000073 ecall - ret 296: 8082 ret 0000000000000298 <pipe>: -.global pipe -pipe: - li a7, SYS_pipe 298: 4891 li a7,4 - ecall 29a: 00000073 ecall - ret 29e: 8082 ret 00000000000002a0 <read>: -.global read -read: - li a7, SYS_read 2a0: 4895 li a7,5 - ecall 2a2: 00000073 ecall - ret 2a6: 8082 ret 00000000000002a8 <write>: -.global write -write: - li a7, SYS_write 2a8: 48c1 li a7,16 - ecall 2aa: 00000073 ecall - ret 2ae: 8082 ret 00000000000002b0 <close>: -.global close -close: - li a7, SYS_close 2b0: 48d5 li a7,21 - ecall 2b2: 00000073 ecall - ret 2b6: 8082 ret 00000000000002b8 <kill>: -.global kill -kill: - li a7, SYS_kill 2b8: 4899 li a7,6 - ecall 2ba: 00000073 ecall - ret 2be: 8082 ret 00000000000002c0 <exec>: -.global exec -exec: - li a7, SYS_exec 2c0: 489d li a7,7 - ecall 2c2: 00000073 ecall - ret 2c6: 8082 ret 00000000000002c8 <open>: -.global open -open: - li a7, SYS_open 2c8: 48bd li a7,15 - ecall 2ca: 00000073 ecall - ret 2ce: 8082 ret 00000000000002d0 <mknod>: -.global mknod -mknod: - li a7, SYS_mknod 2d0: 48c5 li a7,17 - ecall 2d2: 00000073 ecall - ret 2d6: 8082 ret 00000000000002d8 <unlink>: -.global unlink -unlink: - li a7, SYS_unlink 2d8: 48c9 li a7,18 - ecall 2da: 00000073 ecall - ret 2de: 8082 ret 00000000000002e0 <fstat>: -.global fstat -fstat: - li a7, SYS_fstat 2e0: 48a1 li a7,8 - ecall 2e2: 00000073 ecall - ret 2e6: 8082 ret 00000000000002e8 <link>: -.global link -link: - li a7, SYS_link 2e8: 48cd li a7,19 - ecall 2ea: 00000073 ecall - ret 2ee: 8082 ret 00000000000002f0 <mkdir>: -.global mkdir -mkdir: - li a7, SYS_mkdir 2f0: 48d1 li a7,20 - ecall 2f2: 00000073 ecall - ret 2f6: 8082 ret 00000000000002f8 <chdir>: -.global chdir -chdir: - li a7, SYS_chdir 2f8: 48a5 li a7,9 - ecall 2fa: 00000073 ecall - ret 2fe: 8082 ret 0000000000000300 <dup>: -.global dup -dup: - li a7, SYS_dup 300: 48a9 li a7,10 - ecall 302: 00000073 ecall - ret 306: 8082 ret 0000000000000308 <getpid>: -.global getpid -getpid: - li a7, SYS_getpid 308: 48ad li a7,11 - ecall 30a: 00000073 ecall - ret 30e: 8082 ret 0000000000000310 <sbrk>: -.global sbrk -sbrk: - li a7, SYS_sbrk 310: 48b1 li a7,12 - ecall 312: 00000073 ecall - ret 316: 8082 ret 0000000000000318 <sleep>: -.global sleep -sleep: - li a7, SYS_sleep 318: 48b5 li a7,13 - ecall 31a: 00000073 ecall - ret 31e: 8082 ret 0000000000000320 <uptime>: -.global uptime -uptime: - li a7, SYS_uptime 320: 48b9 li a7,14 - ecall 322: 00000073 ecall - ret 326: 8082 ret 0000000000000328 <get_shared_var>: -.global get_shared_var -get_shared_var: - li a7, SYS_get_shared_var 328: 48d9 li a7,22 - ecall 32a: 00000073 ecall - ret 32e: 8082 ret 0000000000000330 <set_shared_var>: -.global set_shared_var -set_shared_var: - li a7, SYS_set_shared_var 330: 48dd li a7,23 - ecall 332: 00000073 ecall - ret 336: 8082 ret 0000000000000338 <symlink>: -.global symlink -symlink: - li a7, SYS_symlink 338: 48e1 li a7,24 - ecall 33a: 00000073 ecall - ret 33e: 8082 ret 0000000000000340 <putc>: @@ -1240,184 +1108,113 @@ printf(const char *fmt, ...) 6e8: 8082 ret 00000000000006ea <free>: -static Header base; -static Header *freep; - -void -free(void *ap) -{ 6ea: 1141 addi sp,sp,-16 6ec: e422 sd s0,8(sp) 6ee: 0800 addi s0,sp,16 - Header *bp, *p; - - bp = (Header*)ap - 1; 6f0: ff050693 addi a3,a0,-16 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 6f4: 00001797 auipc a5,0x1 6f8: 90c7b783 ld a5,-1780(a5) # 1000 <freep> 6fc: a02d j 726 <free+0x3c> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - bp->s.size += p->s.ptr->s.size; 6fe: 4618 lw a4,8(a2) 700: 9f2d addw a4,a4,a1 702: fee52c23 sw a4,-8(a0) - bp->s.ptr = p->s.ptr->s.ptr; 706: 6398 ld a4,0(a5) 708: 6310 ld a2,0(a4) 70a: a83d j 748 <free+0x5e> - } else - bp->s.ptr = p->s.ptr; - if(p + p->s.size == bp){ - p->s.size += bp->s.size; 70c: ff852703 lw a4,-8(a0) 710: 9f31 addw a4,a4,a2 712: c798 sw a4,8(a5) - p->s.ptr = bp->s.ptr; 714: ff053683 ld a3,-16(a0) 718: a091 j 75c <free+0x72> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 71a: 6398 ld a4,0(a5) 71c: 00e7e463 bltu a5,a4,724 <free+0x3a> 720: 00e6ea63 bltu a3,a4,734 <free+0x4a> -{ 724: 87ba mv a5,a4 - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 726: fed7fae3 bgeu a5,a3,71a <free+0x30> 72a: 6398 ld a4,0(a5) 72c: 00e6e463 bltu a3,a4,734 <free+0x4a> - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 730: fee7eae3 bltu a5,a4,724 <free+0x3a> - if(bp + bp->s.size == p->s.ptr){ 734: ff852583 lw a1,-8(a0) 738: 6390 ld a2,0(a5) 73a: 02059813 slli a6,a1,0x20 73e: 01c85713 srli a4,a6,0x1c 742: 9736 add a4,a4,a3 744: fae60de3 beq a2,a4,6fe <free+0x14> - bp->s.ptr = p->s.ptr->s.ptr; 748: fec53823 sd a2,-16(a0) - if(p + p->s.size == bp){ 74c: 4790 lw a2,8(a5) 74e: 02061593 slli a1,a2,0x20 752: 01c5d713 srli a4,a1,0x1c 756: 973e add a4,a4,a5 758: fae68ae3 beq a3,a4,70c <free+0x22> - p->s.ptr = bp->s.ptr; 75c: e394 sd a3,0(a5) - } else - p->s.ptr = bp; - freep = p; 75e: 00001717 auipc a4,0x1 762: 8af73123 sd a5,-1886(a4) # 1000 <freep> -} 766: 6422 ld s0,8(sp) 768: 0141 addi sp,sp,16 76a: 8082 ret 000000000000076c <malloc>: - return freep; -} - -void* -malloc(uint nbytes) -{ 76c: 7139 addi sp,sp,-64 76e: fc06 sd ra,56(sp) 770: f822 sd s0,48(sp) 772: f426 sd s1,40(sp) 774: ec4e sd s3,24(sp) 776: 0080 addi s0,sp,64 - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; 778: 02051493 slli s1,a0,0x20 77c: 9081 srli s1,s1,0x20 77e: 04bd addi s1,s1,15 780: 8091 srli s1,s1,0x4 782: 0014899b addiw s3,s1,1 786: 0485 addi s1,s1,1 - if((prevp = freep) == 0){ 788: 00001517 auipc a0,0x1 78c: 87853503 ld a0,-1928(a0) # 1000 <freep> 790: c915 beqz a0,7c4 <malloc+0x58> - base.s.ptr = freep = prevp = &base; - base.s.size = 0; - } - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 792: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 794: 4798 lw a4,8(a5) 796: 08977a63 bgeu a4,s1,82a <malloc+0xbe> 79a: f04a sd s2,32(sp) 79c: e852 sd s4,16(sp) 79e: e456 sd s5,8(sp) 7a0: e05a sd s6,0(sp) - if(nu < 4096) 7a2: 8a4e mv s4,s3 7a4: 0009871b sext.w a4,s3 7a8: 6685 lui a3,0x1 7aa: 00d77363 bgeu a4,a3,7b0 <malloc+0x44> 7ae: 6a05 lui s4,0x1 7b0: 000a0b1b sext.w s6,s4 - p = sbrk(nu * sizeof(Header)); 7b4: 004a1a1b slliw s4,s4,0x4 - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) 7b8: 00001917 auipc s2,0x1 7bc: 84890913 addi s2,s2,-1976 # 1000 <freep> - if(p == (char*)-1) 7c0: 5afd li s5,-1 7c2: a081 j 802 <malloc+0x96> 7c4: f04a sd s2,32(sp) 7c6: e852 sd s4,16(sp) 7c8: e456 sd s5,8(sp) 7ca: e05a sd s6,0(sp) - base.s.ptr = freep = prevp = &base; 7cc: 00001797 auipc a5,0x1 7d0: 84478793 addi a5,a5,-1980 # 1010 <base> 7d4: 00001717 auipc a4,0x1 7d8: 82f73623 sd a5,-2004(a4) # 1000 <freep> 7dc: e39c sd a5,0(a5) - base.s.size = 0; 7de: 0007a423 sw zero,8(a5) - if(p->s.size >= nunits){ 7e2: b7c1 j 7a2 <malloc+0x36> - prevp->s.ptr = p->s.ptr; 7e4: 6398 ld a4,0(a5) 7e6: e118 sd a4,0(a0) 7e8: a8a9 j 842 <malloc+0xd6> - hp->s.size = nu; 7ea: 01652423 sw s6,8(a0) - free((void*)(hp + 1)); 7ee: 0541 addi a0,a0,16 7f0: efbff0ef jal 6ea <free> - return freep; 7f4: 00093503 ld a0,0(s2) - if((p = morecore(nunits)) == 0) 7f8: c12d beqz a0,85a <malloc+0xee> - for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ 7fa: 611c ld a5,0(a0) - if(p->s.size >= nunits){ 7fc: 4798 lw a4,8(a5) 7fe: 02977263 bgeu a4,s1,822 <malloc+0xb6> - if(p == freep) 802: 00093703 ld a4,0(s2) 806: 853e mv a0,a5 808: fef719e3 bne a4,a5,7fa <malloc+0x8e> - p = sbrk(nu * sizeof(Header)); 80c: 8552 mv a0,s4 80e: b03ff0ef jal 310 <sbrk> - if(p == (char*)-1) 812: fd551ce3 bne a0,s5,7ea <malloc+0x7e> - return 0; 816: 4501 li a0,0 818: 7902 ld s2,32(sp) 81a: 6a42 ld s4,16(sp) @@ -1428,24 +1225,16 @@ malloc(uint nbytes) 824: 6a42 ld s4,16(sp) 826: 6aa2 ld s5,8(sp) 828: 6b02 ld s6,0(sp) - if(p->s.size == nunits) 82a: fae48de3 beq s1,a4,7e4 <malloc+0x78> - p->s.size -= nunits; 82e: 4137073b subw a4,a4,s3 832: c798 sw a4,8(a5) - p += p->s.size; 834: 02071693 slli a3,a4,0x20 838: 01c6d713 srli a4,a3,0x1c 83c: 97ba add a5,a5,a4 - p->s.size = nunits; 83e: 0137a423 sw s3,8(a5) - freep = prevp; 842: 00000717 auipc a4,0x0 846: 7aa73f23 sd a0,1982(a4) # 1000 <freep> - return (void*)(p + 1); 84a: 01078513 addi a0,a5,16 - } -} 84e: 70e2 ld ra,56(sp) 850: 7442 ld s0,48(sp) 852: 74a2 ld s1,40(sp)