diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..718f193aab178abbed59fb1831fa6cf925010f1b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 SKTT1Ryze/hustccc
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..a8676d518f9578bc9a6d688b929fac7de3e9ffef
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,264 @@
+
+#platform	:= k210
+platform	:= qemu
+# mode := debug
+mode := release
+K=kernel
+U=xv6-user
+T=target
+
+OBJS =
+ifeq ($(platform), k210)
+OBJS += $K/entry_k210.o
+else
+OBJS += $K/entry_qemu.o
+endif
+
+OBJS += \
+  $K/printf.o \
+  $K/kalloc.o \
+  $K/intr.o \
+  $K/spinlock.o \
+  $K/string.o \
+  $K/main.o \
+  $K/vm.o \
+  $K/proc.o \
+  $K/swtch.o \
+  $K/trampoline.o \
+  $K/trap.o \
+  $K/syscall.o \
+  $K/sysproc.o \
+  $K/bio.o \
+  $K/sleeplock.o \
+  $K/file.o \
+  $K/pipe.o \
+  $K/exec.o \
+  $K/sysfile.o \
+  $K/kernelvec.o \
+  $K/timer.o \
+  $K/disk.o \
+  $K/fat32.o \
+  $K/plic.o \
+  $K/console.o
+
+ifeq ($(platform), k210)
+OBJS += \
+  $K/spi.o \
+  $K/gpiohs.o \
+  $K/fpioa.o \
+  $K/utils.o \
+  $K/sdcard.o \
+  $K/dmac.o \
+  $K/sysctl.o \
+
+else
+OBJS += \
+  $K/virtio_disk.o \
+  #$K/uart.o \
+
+endif
+
+QEMU = qemu-system-riscv64
+
+ifeq ($(platform), k210)
+RUSTSBI = ./bootloader/SBI/sbi-k210
+else
+RUSTSBI = ./bootloader/SBI/sbi-qemu
+endif
+
+# TOOLPREFIX	:= riscv64-unknown-elf-
+TOOLPREFIX	:= riscv64-linux-gnu-
+CC = $(TOOLPREFIX)gcc
+AS = $(TOOLPREFIX)gas
+LD = $(TOOLPREFIX)ld
+OBJCOPY = $(TOOLPREFIX)objcopy
+OBJDUMP = $(TOOLPREFIX)objdump
+
+CFLAGS = -Wall -Werror -O -fno-omit-frame-pointer -ggdb -g
+CFLAGS += -MD
+CFLAGS += -mcmodel=medany
+CFLAGS += -ffreestanding -fno-common -nostdlib -mno-relax
+CFLAGS += -I.
+CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
+
+ifeq ($(mode), debug) 
+CFLAGS += -DDEBUG 
+endif 
+
+ifeq ($(platform), qemu)
+CFLAGS += -D QEMU
+endif
+
+LDFLAGS = -z max-page-size=4096
+
+ifeq ($(platform), k210)
+linker = ./linker/k210.ld
+endif
+
+ifeq ($(platform), qemu)
+linker = ./linker/qemu.ld
+endif
+
+
+all: build
+	mv $T/kernel $T/kernel-qemu
+	cp $T/kernel-qemu kernel-qemu
+#local test
+local:
+	@make clean
+	@make build
+	@make fs
+
+# Compile Kernel
+$T/kernel: $(OBJS) $(linker) $U/initcode
+	@if [ ! -d "./target" ]; then mkdir target; fi
+	@$(LD) $(LDFLAGS) -T $(linker) -o $T/kernel $(OBJS)
+	@$(OBJDUMP) -S $T/kernel > $T/kernel.asm
+	@$(OBJDUMP) -t $T/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $T/kernel.sym
+  
+build: $T/kernel userprogs
+
+# Compile RustSBI
+RUSTSBI:
+ifeq ($(platform), k210)
+	@cd ./bootloader/SBI/rustsbi-k210 && cargo build && cp ./target/riscv64gc-unknown-none-elf/debug/rustsbi-k210 ../sbi-k210
+	@$(OBJDUMP) -S ./bootloader/SBI/sbi-k210 > $T/rustsbi-k210.asm
+else
+	@cd ./bootloader/SBI/rustsbi-qemu && cargo build && cp ./target/riscv64gc-unknown-none-elf/debug/rustsbi-qemu ../sbi-qemu
+	@$(OBJDUMP) -S ./bootloader/SBI/sbi-qemu > $T/rustsbi-qemu.asm
+endif
+
+rustsbi-clean:
+	@cd ./bootloader/SBI/rustsbi-k210 && cargo clean
+	@cd ./bootloader/SBI/rustsbi-qemu && cargo clean
+
+image = $T/kernel.bin
+k210 = $T/k210.bin
+k210-serialport := /dev/ttyUSB0
+
+ifndef CPUS
+CPUS := 1
+endif
+
+QEMUOPTS = -machine virt -kernel $T/kernel -m 32M -nographic
+
+# use multi-core 
+QEMUOPTS += -smp $(CPUS)
+
+QEMUOPTS += -bios $(RUSTSBI)
+
+# import virtual disk image
+QEMUOPTS += -drive file=fs.img,if=none,format=raw,id=x0 
+QEMUOPTS += -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
+
+run: build
+ifeq ($(platform), k210)
+	@$(OBJCOPY) $T/kernel --strip-all -O binary $(image)
+	@$(OBJCOPY) $(RUSTSBI) --strip-all -O binary $(k210)
+	@dd if=$(image) of=$(k210) bs=128k seek=1
+	@$(OBJDUMP) -D -b binary -m riscv $(k210) > $T/k210.asm
+	@chmod 777 $(k210-serialport)
+	@python3 ./tools/kflash.py -p $(k210-serialport) -b 1500000 -t $(k210)
+else
+	@$(QEMU) $(QEMUOPTS)
+endif
+
+$U/initcode: $U/initcode.S
+	$(CC) $(CFLAGS) -march=rv64g -nostdinc -I. -Ikernel -c $U/initcode.S -o $U/initcode.o
+	$(LD) $(LDFLAGS) -N -e start -Ttext 0 -o $U/initcode.out $U/initcode.o
+	$(OBJCOPY) -S -O binary $U/initcode.out $U/initcode
+	$(OBJDUMP) -S $U/initcode.o > $U/initcode.asm
+
+tags: $(OBJS) _init
+	@etags *.S *.c
+
+ULIB = $U/ulib.o $U/usys.o $U/printf.o $U/umalloc.o
+
+_%: %.o $(ULIB)
+	$(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^
+	$(OBJDUMP) -S $@ > $*.asm
+	$(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym
+
+$U/usys.S : $U/usys.pl
+	@perl $U/usys.pl > $U/usys.S
+
+$U/usys.o : $U/usys.S
+	$(CC) $(CFLAGS) -c -o $U/usys.o $U/usys.S
+
+$U/_forktest: $U/forktest.o $(ULIB)
+	# forktest has less library code linked in - needs to be small
+	# in order to be able to max out the proc table.
+	$(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $U/_forktest $U/forktest.o $U/ulib.o $U/usys.o
+	$(OBJDUMP) -S $U/_forktest > $U/forktest.asm
+
+# Prevent deletion of intermediate files, e.g. cat.o, after first build, so
+# that disk image changes after first build are persistent until clean.  More
+# details:
+# http://www.gnu.org/software/make/manual/html_node/Chained-Rules.html
+.PRECIOUS: %.o
+
+UPROGS=\
+	$U/_init\
+	$U/_sh\
+	$U/_cat\
+	$U/_echo\
+	$U/_grep\
+	$U/_ls\
+	$U/_kill\
+	$U/_mkdir\
+	$U/_xargs\
+	$U/_sleep\
+	$U/_find\
+	$U/_rm\
+	$U/_wc\
+	$U/_test\
+	$U/_usertests\
+	$U/_strace\
+	$U/_mv\
+	$U/_sysinfo\
+	# $U/_forktest\
+	# $U/_ln\
+	# $U/_stressfs\
+	# $U/_grind\
+	# $U/_zombie\
+
+userprogs: $(UPROGS)
+
+dst=/mnt
+
+# @sudo cp $U/_init $(dst)/init
+# @sudo cp $U/_sh $(dst)/sh
+# Make fs image
+fs: $(UPROGS)
+	@if [ ! -f "fs.img" ]; then \
+		echo "making fs image..."; \
+		dd if=/dev/zero of=fs.img bs=512k count=512; \
+		mkfs.vfat -F 32 fs.img; fi
+	@mount fs.img $(dst)
+	@if [ ! -d "$(dst)/bin" ]; then mkdir $(dst)/bin; fi
+	@cp README $(dst)/README
+	@for file in $$( ls $U/_* ); do \
+		cp $$file $(dst)/$${file#$U/_};\
+		cp $$file $(dst)/bin/$${file#$U/_}; done
+	@cp -r ./riscv64 $(dst)
+	@umount $(dst)
+
+
+# Write mounted sdcard
+sdcard: userprogs
+	@if [ ! -d "$(dst)/bin" ]; then mkdir $(dst)/bin; fi
+	@for file in $$( ls $U/_* ); do \
+		cp $$file $(dst)/bin/$${file#$U/_}; done
+	@cp $U/_init $(dst)/init
+	@cp $U/_sh $(dst)/sh
+	@cp README $(dst)/README
+
+clean: 
+	rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \
+	*/*.o */*.d */*.asm */*.sym \
+	$T/* \
+	$U/initcode $U/initcode.out \
+	$K/kernel \
+	.gdbinit \
+	$U/usys.S \
+	$(UPROGS)
diff --git a/debug/kendryte_openocd/openocd b/debug/kendryte_openocd/openocd
new file mode 100644
index 0000000000000000000000000000000000000000..8bb4ab414d2024fbfeb29ed85cb18f89d28c1f76
Binary files /dev/null and b/debug/kendryte_openocd/openocd differ
diff --git a/debug/openocd_cfg/ft2232c.cfg b/debug/openocd_cfg/ft2232c.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..d2d405ede48e77d774f5a84dbd4d2da2ea4b6fdb
--- /dev/null
+++ b/debug/openocd_cfg/ft2232c.cfg
@@ -0,0 +1,6 @@
+interface ftdi
+ftdi_vid_pid 0x0403 0x6010
+
+ftdi_layout_init 0xfff8 0xfffb
+ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100
+ftdi_layout_signal nSRST -data 0x0200 -oe 0x0200
\ No newline at end of file
diff --git a/debug/openocd_cfg/k210.cfg b/debug/openocd_cfg/k210.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..556a43fb217d4981444b6422a025794a3f4a4ea8
--- /dev/null
+++ b/debug/openocd_cfg/k210.cfg
@@ -0,0 +1,21 @@
+# debug adapter
+source [find ft2232c.cfg]
+
+transport select jtag
+adapter_khz 10000
+
+# server port
+gdb_port 3333
+telnet_port 4444
+
+# add cpu target
+set _CHIPNAME riscv
+
+jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x04e4796b
+
+set _TARGETNAME $_CHIPNAME.cpu
+target create $_TARGETNAME riscv -chain-position $_TARGETNAME
+
+# command
+init
+halt
\ No newline at end of file
diff --git a/debug/openocd_cfg/openocd_ftdi.cfg b/debug/openocd_cfg/openocd_ftdi.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..609ac2f003661f4a275b484c725f09f817715d32
--- /dev/null
+++ b/debug/openocd_cfg/openocd_ftdi.cfg
@@ -0,0 +1,42 @@
+interface ftdi
+
+ftdi_vid_pid 0x0403 0x6010
+
+#func	io	dir	val
+#TCK	0	1	0
+#TDI	1	1	0
+#TDO	2	1	0
+#TMS	3	0	1
+#RST	4	1	1
+
+#		val	dir
+#ftdi_layout_init 0x0028 0x002b
+#只有jtagio分配
+ftdi_layout_init 0x00e8 0x00eb
+
+#ftdi_layout_init 0x0808 0x0a1b
+#ftdi_layout_signal nSRST -oe 0x0200
+#ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100
+#ftdi_layout_signal LED -data 0x0800
+
+transport select jtag
+ftdi_tdo_sample_edge falling
+adapter_khz 64000
+
+gdb_port 3333
+telnet_port 4444
+
+set _CHIPNAME riscv
+
+jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x04e4796b
+
+set _TARGETNAME $_CHIPNAME.cpu
+target create $_TARGETNAME riscv -chain-position $_TARGETNAME
+
+#if {[ info exists pulse_srst]} {
+#  ftdi_set_signal nSRST 0
+#  ftdi_set_signal nSRST z
+#}
+
+init
+halt
diff --git a/fs.img b/fs.img
new file mode 100644
index 0000000000000000000000000000000000000000..53c6e961896d7a345001215407449555d4ebc40b
Binary files /dev/null and b/fs.img differ
diff --git a/target/kernel b/target/kernel
new file mode 100644
index 0000000000000000000000000000000000000000..8f76b33d7e4d95bf2914fe456b592ee5b5e709c9
Binary files /dev/null and b/target/kernel differ
diff --git a/target/kernel.asm b/target/kernel.asm
new file mode 100644
index 0000000000000000000000000000000000000000..0f578432bea6d25c1375e761b9aaf3c1a0b799d8
--- /dev/null
+++ b/target/kernel.asm
@@ -0,0 +1,15557 @@
+
+target/kernel:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000080200000 <_entry>:
+    80200000:	00150293          	addi	t0,a0,1
+    80200004:	02ba                	slli	t0,t0,0xe
+    80200006:	0000c117          	auipc	sp,0xc
+    8020000a:	d2213103          	ld	sp,-734(sp) # 8020bd28 <_GLOBAL_OFFSET_TABLE_+0x50>
+    8020000e:	9116                	add	sp,sp,t0
+    80200010:	1d5000ef          	jal	ra,802009e4 <main>
+
+0000000080200014 <loop>:
+    80200014:	a001                	j	80200014 <loop>
+
+0000000080200016 <printint>:
+    }
+}
+
+static void
+printint(int xx, int base, int sign)
+{
+    80200016:	7179                	addi	sp,sp,-48
+    80200018:	f406                	sd	ra,40(sp)
+    8020001a:	f022                	sd	s0,32(sp)
+    8020001c:	ec26                	sd	s1,24(sp)
+    8020001e:	e84a                	sd	s2,16(sp)
+    80200020:	1800                	addi	s0,sp,48
+  char buf[16];
+  int i;
+  uint x;
+
+  if(sign && (sign = xx < 0))
+    80200022:	c219                	beqz	a2,80200028 <printint+0x12>
+    80200024:	08054663          	bltz	a0,802000b0 <printint+0x9a>
+    x = -xx;
+  else
+    x = xx;
+    80200028:	2501                	sext.w	a0,a0
+    8020002a:	4881                	li	a7,0
+
+  i = 0;
+    8020002c:	fd040913          	addi	s2,s0,-48
+    x = xx;
+    80200030:	86ca                	mv	a3,s2
+  i = 0;
+    80200032:	4701                	li	a4,0
+  do {
+    buf[i++] = digits[x % base];
+    80200034:	2581                	sext.w	a1,a1
+    80200036:	00009617          	auipc	a2,0x9
+    8020003a:	34a60613          	addi	a2,a2,842 # 80209380 <digits>
+    8020003e:	883a                	mv	a6,a4
+    80200040:	2705                	addiw	a4,a4,1
+    80200042:	02b577bb          	remuw	a5,a0,a1
+    80200046:	1782                	slli	a5,a5,0x20
+    80200048:	9381                	srli	a5,a5,0x20
+    8020004a:	97b2                	add	a5,a5,a2
+    8020004c:	0007c783          	lbu	a5,0(a5)
+    80200050:	00f68023          	sb	a5,0(a3)
+  } while((x /= base) != 0);
+    80200054:	0005079b          	sext.w	a5,a0
+    80200058:	02b5553b          	divuw	a0,a0,a1
+    8020005c:	0685                	addi	a3,a3,1
+    8020005e:	feb7f0e3          	bgeu	a5,a1,8020003e <printint+0x28>
+
+  if(sign)
+    80200062:	00088c63          	beqz	a7,8020007a <printint+0x64>
+    buf[i++] = '-';
+    80200066:	fe070793          	addi	a5,a4,-32
+    8020006a:	00878733          	add	a4,a5,s0
+    8020006e:	02d00793          	li	a5,45
+    80200072:	fef70823          	sb	a5,-16(a4)
+    80200076:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+    8020007a:	02e05563          	blez	a4,802000a4 <printint+0x8e>
+    8020007e:	fd040493          	addi	s1,s0,-48
+    80200082:	94ba                	add	s1,s1,a4
+    80200084:	197d                	addi	s2,s2,-1
+    80200086:	993a                	add	s2,s2,a4
+    80200088:	377d                	addiw	a4,a4,-1
+    8020008a:	1702                	slli	a4,a4,0x20
+    8020008c:	9301                	srli	a4,a4,0x20
+    8020008e:	40e90933          	sub	s2,s2,a4
+    consputc(buf[i]);
+    80200092:	fff4c503          	lbu	a0,-1(s1)
+    80200096:	00007097          	auipc	ra,0x7
+    8020009a:	014080e7          	jalr	20(ra) # 802070aa <consputc>
+  while(--i >= 0)
+    8020009e:	14fd                	addi	s1,s1,-1
+    802000a0:	ff2499e3          	bne	s1,s2,80200092 <printint+0x7c>
+}
+    802000a4:	70a2                	ld	ra,40(sp)
+    802000a6:	7402                	ld	s0,32(sp)
+    802000a8:	64e2                	ld	s1,24(sp)
+    802000aa:	6942                	ld	s2,16(sp)
+    802000ac:	6145                	addi	sp,sp,48
+    802000ae:	8082                	ret
+    x = -xx;
+    802000b0:	40a0053b          	negw	a0,a0
+  if(sign && (sign = xx < 0))
+    802000b4:	4885                	li	a7,1
+    x = -xx;
+    802000b6:	bf9d                	j	8020002c <printint+0x16>
+
+00000000802000b8 <printstring>:
+void printstring(const char* s) {
+    802000b8:	1101                	addi	sp,sp,-32
+    802000ba:	ec06                	sd	ra,24(sp)
+    802000bc:	e822                	sd	s0,16(sp)
+    802000be:	e426                	sd	s1,8(sp)
+    802000c0:	1000                	addi	s0,sp,32
+    802000c2:	84aa                	mv	s1,a0
+    while (*s)
+    802000c4:	00054503          	lbu	a0,0(a0)
+    802000c8:	c909                	beqz	a0,802000da <printstring+0x22>
+        consputc(*s++);
+    802000ca:	0485                	addi	s1,s1,1
+    802000cc:	00007097          	auipc	ra,0x7
+    802000d0:	fde080e7          	jalr	-34(ra) # 802070aa <consputc>
+    while (*s)
+    802000d4:	0004c503          	lbu	a0,0(s1)
+    802000d8:	f96d                	bnez	a0,802000ca <printstring+0x12>
+}
+    802000da:	60e2                	ld	ra,24(sp)
+    802000dc:	6442                	ld	s0,16(sp)
+    802000de:	64a2                	ld	s1,8(sp)
+    802000e0:	6105                	addi	sp,sp,32
+    802000e2:	8082                	ret
+
+00000000802000e4 <backtrace>:
+  for(;;)
+    ;
+}
+
+void backtrace()
+{
+    802000e4:	7179                	addi	sp,sp,-48
+    802000e6:	f406                	sd	ra,40(sp)
+    802000e8:	f022                	sd	s0,32(sp)
+    802000ea:	ec26                	sd	s1,24(sp)
+    802000ec:	e84a                	sd	s2,16(sp)
+    802000ee:	e44e                	sd	s3,8(sp)
+    802000f0:	1800                	addi	s0,sp,48
+
+static inline uint64
+r_fp()
+{
+  uint64 x;
+  asm volatile("mv %0, s0" : "=r" (x) );
+    802000f2:	8922                	mv	s2,s0
+  uint64 *fp = (uint64 *)r_fp();
+    802000f4:	84ca                	mv	s1,s2
+  uint64 *bottom = (uint64 *)PGROUNDUP((uint64)fp);
+    802000f6:	6785                	lui	a5,0x1
+    802000f8:	17fd                	addi	a5,a5,-1 # fff <_entry-0x801ff001>
+    802000fa:	993e                	add	s2,s2,a5
+    802000fc:	77fd                	lui	a5,0xfffff
+    802000fe:	00f97933          	and	s2,s2,a5
+  printf("backtrace:\n");
+    80200102:	00009517          	auipc	a0,0x9
+    80200106:	efe50513          	addi	a0,a0,-258 # 80209000 <etext>
+    8020010a:	00000097          	auipc	ra,0x0
+    8020010e:	084080e7          	jalr	132(ra) # 8020018e <printf>
+  while (fp < bottom) {
+    80200112:	0324f263          	bgeu	s1,s2,80200136 <backtrace+0x52>
+    uint64 ra = *(fp - 1);
+    printf("%p\n", ra - 4);
+    80200116:	00009997          	auipc	s3,0x9
+    8020011a:	4d298993          	addi	s3,s3,1234 # 802095e8 <digits+0x268>
+    8020011e:	ff84b583          	ld	a1,-8(s1)
+    80200122:	15f1                	addi	a1,a1,-4
+    80200124:	854e                	mv	a0,s3
+    80200126:	00000097          	auipc	ra,0x0
+    8020012a:	068080e7          	jalr	104(ra) # 8020018e <printf>
+    fp = (uint64 *)*(fp - 2);
+    8020012e:	ff04b483          	ld	s1,-16(s1)
+  while (fp < bottom) {
+    80200132:	ff24e6e3          	bltu	s1,s2,8020011e <backtrace+0x3a>
+  }
+}
+    80200136:	70a2                	ld	ra,40(sp)
+    80200138:	7402                	ld	s0,32(sp)
+    8020013a:	64e2                	ld	s1,24(sp)
+    8020013c:	6942                	ld	s2,16(sp)
+    8020013e:	69a2                	ld	s3,8(sp)
+    80200140:	6145                	addi	sp,sp,48
+    80200142:	8082                	ret
+
+0000000080200144 <panic>:
+{
+    80200144:	1101                	addi	sp,sp,-32
+    80200146:	ec06                	sd	ra,24(sp)
+    80200148:	e822                	sd	s0,16(sp)
+    8020014a:	e426                	sd	s1,8(sp)
+    8020014c:	1000                	addi	s0,sp,32
+    8020014e:	84aa                	mv	s1,a0
+  printf("panic: ");
+    80200150:	00009517          	auipc	a0,0x9
+    80200154:	ec050513          	addi	a0,a0,-320 # 80209010 <etext+0x10>
+    80200158:	00000097          	auipc	ra,0x0
+    8020015c:	036080e7          	jalr	54(ra) # 8020018e <printf>
+  printf(s);
+    80200160:	8526                	mv	a0,s1
+    80200162:	00000097          	auipc	ra,0x0
+    80200166:	02c080e7          	jalr	44(ra) # 8020018e <printf>
+  printf("\n");
+    8020016a:	00009517          	auipc	a0,0x9
+    8020016e:	f6e50513          	addi	a0,a0,-146 # 802090d8 <etext+0xd8>
+    80200172:	00000097          	auipc	ra,0x0
+    80200176:	01c080e7          	jalr	28(ra) # 8020018e <printf>
+  backtrace();
+    8020017a:	00000097          	auipc	ra,0x0
+    8020017e:	f6a080e7          	jalr	-150(ra) # 802000e4 <backtrace>
+  panicked = 1; // freeze uart output from other CPUs
+    80200182:	4785                	li	a5,1
+    80200184:	00014717          	auipc	a4,0x14
+    80200188:	e6f72e23          	sw	a5,-388(a4) # 80214000 <panicked>
+  for(;;)
+    8020018c:	a001                	j	8020018c <panic+0x48>
+
+000000008020018e <printf>:
+{
+    8020018e:	7131                	addi	sp,sp,-192
+    80200190:	fc86                	sd	ra,120(sp)
+    80200192:	f8a2                	sd	s0,112(sp)
+    80200194:	f4a6                	sd	s1,104(sp)
+    80200196:	f0ca                	sd	s2,96(sp)
+    80200198:	ecce                	sd	s3,88(sp)
+    8020019a:	e8d2                	sd	s4,80(sp)
+    8020019c:	e4d6                	sd	s5,72(sp)
+    8020019e:	e0da                	sd	s6,64(sp)
+    802001a0:	fc5e                	sd	s7,56(sp)
+    802001a2:	f862                	sd	s8,48(sp)
+    802001a4:	f466                	sd	s9,40(sp)
+    802001a6:	f06a                	sd	s10,32(sp)
+    802001a8:	ec6e                	sd	s11,24(sp)
+    802001aa:	0100                	addi	s0,sp,128
+    802001ac:	8a2a                	mv	s4,a0
+    802001ae:	e40c                	sd	a1,8(s0)
+    802001b0:	e810                	sd	a2,16(s0)
+    802001b2:	ec14                	sd	a3,24(s0)
+    802001b4:	f018                	sd	a4,32(s0)
+    802001b6:	f41c                	sd	a5,40(s0)
+    802001b8:	03043823          	sd	a6,48(s0)
+    802001bc:	03143c23          	sd	a7,56(s0)
+  locking = pr.locking;
+    802001c0:	00014d97          	auipc	s11,0x14
+    802001c4:	e60dad83          	lw	s11,-416(s11) # 80214020 <pr+0x18>
+  if(locking)
+    802001c8:	020d9b63          	bnez	s11,802001fe <printf+0x70>
+  if (fmt == 0)
+    802001cc:	040a0263          	beqz	s4,80200210 <printf+0x82>
+  va_start(ap, fmt);
+    802001d0:	00840793          	addi	a5,s0,8
+    802001d4:	f8f43423          	sd	a5,-120(s0)
+  for(i = 0; (c = fmt[i] & 0xff) != 0; i++){
+    802001d8:	000a4503          	lbu	a0,0(s4)
+    802001dc:	14050f63          	beqz	a0,8020033a <printf+0x1ac>
+    802001e0:	4981                	li	s3,0
+    if(c != '%'){
+    802001e2:	02500a93          	li	s5,37
+    switch(c){
+    802001e6:	07000b93          	li	s7,112
+  consputc('x');
+    802001ea:	4d41                	li	s10,16
+    consputc(digits[x >> (sizeof(uint64) * 8 - 4)]);
+    802001ec:	00009b17          	auipc	s6,0x9
+    802001f0:	194b0b13          	addi	s6,s6,404 # 80209380 <digits>
+    switch(c){
+    802001f4:	07300c93          	li	s9,115
+    802001f8:	06400c13          	li	s8,100
+    802001fc:	a82d                	j	80200236 <printf+0xa8>
+    acquire(&pr.lock);
+    802001fe:	00014517          	auipc	a0,0x14
+    80200202:	e0a50513          	addi	a0,a0,-502 # 80214008 <pr>
+    80200206:	00000097          	auipc	ra,0x0
+    8020020a:	4c0080e7          	jalr	1216(ra) # 802006c6 <acquire>
+    8020020e:	bf7d                	j	802001cc <printf+0x3e>
+    panic("null fmt");
+    80200210:	00009517          	auipc	a0,0x9
+    80200214:	e1050513          	addi	a0,a0,-496 # 80209020 <etext+0x20>
+    80200218:	00000097          	auipc	ra,0x0
+    8020021c:	f2c080e7          	jalr	-212(ra) # 80200144 <panic>
+      consputc(c);
+    80200220:	00007097          	auipc	ra,0x7
+    80200224:	e8a080e7          	jalr	-374(ra) # 802070aa <consputc>
+  for(i = 0; (c = fmt[i] & 0xff) != 0; i++){
+    80200228:	2985                	addiw	s3,s3,1
+    8020022a:	013a07b3          	add	a5,s4,s3
+    8020022e:	0007c503          	lbu	a0,0(a5) # fffffffffffff000 <ebss_clear+0xffffffff7fdd9000>
+    80200232:	10050463          	beqz	a0,8020033a <printf+0x1ac>
+    if(c != '%'){
+    80200236:	ff5515e3          	bne	a0,s5,80200220 <printf+0x92>
+    c = fmt[++i] & 0xff;
+    8020023a:	2985                	addiw	s3,s3,1
+    8020023c:	013a07b3          	add	a5,s4,s3
+    80200240:	0007c783          	lbu	a5,0(a5)
+    80200244:	0007849b          	sext.w	s1,a5
+    if(c == 0)
+    80200248:	cbed                	beqz	a5,8020033a <printf+0x1ac>
+    switch(c){
+    8020024a:	05778a63          	beq	a5,s7,8020029e <printf+0x110>
+    8020024e:	02fbf663          	bgeu	s7,a5,8020027a <printf+0xec>
+    80200252:	09978863          	beq	a5,s9,802002e2 <printf+0x154>
+    80200256:	07800713          	li	a4,120
+    8020025a:	0ce79563          	bne	a5,a4,80200324 <printf+0x196>
+      printint(va_arg(ap, int), 16, 1);
+    8020025e:	f8843783          	ld	a5,-120(s0)
+    80200262:	00878713          	addi	a4,a5,8
+    80200266:	f8e43423          	sd	a4,-120(s0)
+    8020026a:	4605                	li	a2,1
+    8020026c:	85ea                	mv	a1,s10
+    8020026e:	4388                	lw	a0,0(a5)
+    80200270:	00000097          	auipc	ra,0x0
+    80200274:	da6080e7          	jalr	-602(ra) # 80200016 <printint>
+      break;
+    80200278:	bf45                	j	80200228 <printf+0x9a>
+    switch(c){
+    8020027a:	09578f63          	beq	a5,s5,80200318 <printf+0x18a>
+    8020027e:	0b879363          	bne	a5,s8,80200324 <printf+0x196>
+      printint(va_arg(ap, int), 10, 1);
+    80200282:	f8843783          	ld	a5,-120(s0)
+    80200286:	00878713          	addi	a4,a5,8
+    8020028a:	f8e43423          	sd	a4,-120(s0)
+    8020028e:	4605                	li	a2,1
+    80200290:	45a9                	li	a1,10
+    80200292:	4388                	lw	a0,0(a5)
+    80200294:	00000097          	auipc	ra,0x0
+    80200298:	d82080e7          	jalr	-638(ra) # 80200016 <printint>
+      break;
+    8020029c:	b771                	j	80200228 <printf+0x9a>
+      printptr(va_arg(ap, uint64));
+    8020029e:	f8843783          	ld	a5,-120(s0)
+    802002a2:	00878713          	addi	a4,a5,8
+    802002a6:	f8e43423          	sd	a4,-120(s0)
+    802002aa:	0007b903          	ld	s2,0(a5)
+  consputc('0');
+    802002ae:	03000513          	li	a0,48
+    802002b2:	00007097          	auipc	ra,0x7
+    802002b6:	df8080e7          	jalr	-520(ra) # 802070aa <consputc>
+  consputc('x');
+    802002ba:	07800513          	li	a0,120
+    802002be:	00007097          	auipc	ra,0x7
+    802002c2:	dec080e7          	jalr	-532(ra) # 802070aa <consputc>
+    802002c6:	84ea                	mv	s1,s10
+    consputc(digits[x >> (sizeof(uint64) * 8 - 4)]);
+    802002c8:	03c95793          	srli	a5,s2,0x3c
+    802002cc:	97da                	add	a5,a5,s6
+    802002ce:	0007c503          	lbu	a0,0(a5)
+    802002d2:	00007097          	auipc	ra,0x7
+    802002d6:	dd8080e7          	jalr	-552(ra) # 802070aa <consputc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+    802002da:	0912                	slli	s2,s2,0x4
+    802002dc:	34fd                	addiw	s1,s1,-1
+    802002de:	f4ed                	bnez	s1,802002c8 <printf+0x13a>
+    802002e0:	b7a1                	j	80200228 <printf+0x9a>
+      if((s = va_arg(ap, char*)) == 0)
+    802002e2:	f8843783          	ld	a5,-120(s0)
+    802002e6:	00878713          	addi	a4,a5,8
+    802002ea:	f8e43423          	sd	a4,-120(s0)
+    802002ee:	6384                	ld	s1,0(a5)
+    802002f0:	cc89                	beqz	s1,8020030a <printf+0x17c>
+      for(; *s; s++)
+    802002f2:	0004c503          	lbu	a0,0(s1)
+    802002f6:	d90d                	beqz	a0,80200228 <printf+0x9a>
+        consputc(*s);
+    802002f8:	00007097          	auipc	ra,0x7
+    802002fc:	db2080e7          	jalr	-590(ra) # 802070aa <consputc>
+      for(; *s; s++)
+    80200300:	0485                	addi	s1,s1,1
+    80200302:	0004c503          	lbu	a0,0(s1)
+    80200306:	f96d                	bnez	a0,802002f8 <printf+0x16a>
+    80200308:	b705                	j	80200228 <printf+0x9a>
+        s = "(null)";
+    8020030a:	00009497          	auipc	s1,0x9
+    8020030e:	d0e48493          	addi	s1,s1,-754 # 80209018 <etext+0x18>
+      for(; *s; s++)
+    80200312:	02800513          	li	a0,40
+    80200316:	b7cd                	j	802002f8 <printf+0x16a>
+      consputc('%');
+    80200318:	8556                	mv	a0,s5
+    8020031a:	00007097          	auipc	ra,0x7
+    8020031e:	d90080e7          	jalr	-624(ra) # 802070aa <consputc>
+      break;
+    80200322:	b719                	j	80200228 <printf+0x9a>
+      consputc('%');
+    80200324:	8556                	mv	a0,s5
+    80200326:	00007097          	auipc	ra,0x7
+    8020032a:	d84080e7          	jalr	-636(ra) # 802070aa <consputc>
+      consputc(c);
+    8020032e:	8526                	mv	a0,s1
+    80200330:	00007097          	auipc	ra,0x7
+    80200334:	d7a080e7          	jalr	-646(ra) # 802070aa <consputc>
+      break;
+    80200338:	bdc5                	j	80200228 <printf+0x9a>
+  if(locking)
+    8020033a:	020d9163          	bnez	s11,8020035c <printf+0x1ce>
+}
+    8020033e:	70e6                	ld	ra,120(sp)
+    80200340:	7446                	ld	s0,112(sp)
+    80200342:	74a6                	ld	s1,104(sp)
+    80200344:	7906                	ld	s2,96(sp)
+    80200346:	69e6                	ld	s3,88(sp)
+    80200348:	6a46                	ld	s4,80(sp)
+    8020034a:	6aa6                	ld	s5,72(sp)
+    8020034c:	6b06                	ld	s6,64(sp)
+    8020034e:	7be2                	ld	s7,56(sp)
+    80200350:	7c42                	ld	s8,48(sp)
+    80200352:	7ca2                	ld	s9,40(sp)
+    80200354:	7d02                	ld	s10,32(sp)
+    80200356:	6de2                	ld	s11,24(sp)
+    80200358:	6129                	addi	sp,sp,192
+    8020035a:	8082                	ret
+    release(&pr.lock);
+    8020035c:	00014517          	auipc	a0,0x14
+    80200360:	cac50513          	addi	a0,a0,-852 # 80214008 <pr>
+    80200364:	00000097          	auipc	ra,0x0
+    80200368:	3b6080e7          	jalr	950(ra) # 8020071a <release>
+}
+    8020036c:	bfc9                	j	8020033e <printf+0x1b0>
+
+000000008020036e <printfinit>:
+
+void
+printfinit(void)
+{
+    8020036e:	1141                	addi	sp,sp,-16
+    80200370:	e406                	sd	ra,8(sp)
+    80200372:	e022                	sd	s0,0(sp)
+    80200374:	0800                	addi	s0,sp,16
+  initlock(&pr.lock, "pr");
+    80200376:	00009597          	auipc	a1,0x9
+    8020037a:	cba58593          	addi	a1,a1,-838 # 80209030 <etext+0x30>
+    8020037e:	00014517          	auipc	a0,0x14
+    80200382:	c8a50513          	addi	a0,a0,-886 # 80214008 <pr>
+    80200386:	00000097          	auipc	ra,0x0
+    8020038a:	2fc080e7          	jalr	764(ra) # 80200682 <initlock>
+  pr.locking = 1;   // changed, used to be 1
+    8020038e:	4785                	li	a5,1
+    80200390:	00014717          	auipc	a4,0x14
+    80200394:	c8f72823          	sw	a5,-880(a4) # 80214020 <pr+0x18>
+}
+    80200398:	60a2                	ld	ra,8(sp)
+    8020039a:	6402                	ld	s0,0(sp)
+    8020039c:	0141                	addi	sp,sp,16
+    8020039e:	8082                	ret
+
+00000000802003a0 <print_logo>:
+
+#ifdef QEMU
+void print_logo() {
+    802003a0:	1141                	addi	sp,sp,-16
+    802003a2:	e406                	sd	ra,8(sp)
+    802003a4:	e022                	sd	s0,0(sp)
+    802003a6:	0800                	addi	s0,sp,16
+    printf("  (`-.            (`-.                            .-')       ('-.    _   .-')\n");
+    802003a8:	00009517          	auipc	a0,0x9
+    802003ac:	c9050513          	addi	a0,a0,-880 # 80209038 <etext+0x38>
+    802003b0:	00000097          	auipc	ra,0x0
+    802003b4:	dde080e7          	jalr	-546(ra) # 8020018e <printf>
+    printf(" ( OO ).        _(OO  )_                        .(  OO)    _(  OO)  ( '.( OO )_ \n");
+    802003b8:	00009517          	auipc	a0,0x9
+    802003bc:	cd050513          	addi	a0,a0,-816 # 80209088 <etext+0x88>
+    802003c0:	00000097          	auipc	ra,0x0
+    802003c4:	dce080e7          	jalr	-562(ra) # 8020018e <printf>
+    printf("(_/.  \\_)-. ,--(_/   ,. \\  ,--.                (_)---\\_)  (,------.  ,--.   ,--.) ,--. ,--.  \n");
+    802003c8:	00009517          	auipc	a0,0x9
+    802003cc:	d1850513          	addi	a0,a0,-744 # 802090e0 <etext+0xe0>
+    802003d0:	00000097          	auipc	ra,0x0
+    802003d4:	dbe080e7          	jalr	-578(ra) # 8020018e <printf>
+    printf(" \\  `.'  /  \\   \\   /(__/ /  .'       .-')     '  .-.  '   |  .---'  |   `.'   |  |  | |  |   \n");
+    802003d8:	00009517          	auipc	a0,0x9
+    802003dc:	d6850513          	addi	a0,a0,-664 # 80209140 <etext+0x140>
+    802003e0:	00000097          	auipc	ra,0x0
+    802003e4:	dae080e7          	jalr	-594(ra) # 8020018e <printf>
+    printf("  \\     /\\   \\   \\ /   / .  / -.    _(  OO)   ,|  | |  |   |  |      |         |  |  | | .-')\n");
+    802003e8:	00009517          	auipc	a0,0x9
+    802003ec:	db850513          	addi	a0,a0,-584 # 802091a0 <etext+0x1a0>
+    802003f0:	00000097          	auipc	ra,0x0
+    802003f4:	d9e080e7          	jalr	-610(ra) # 8020018e <printf>
+    printf("   \\   \\ |    \\   '   /, | .-.  '  (,------. (_|  | |  |  (|  '--.   |  |'.'|  |  |  |_|( OO )\n");
+    802003f8:	00009517          	auipc	a0,0x9
+    802003fc:	e0850513          	addi	a0,a0,-504 # 80209200 <etext+0x200>
+    80200400:	00000097          	auipc	ra,0x0
+    80200404:	d8e080e7          	jalr	-626(ra) # 8020018e <printf>
+    printf("  .'    \\_)    \\     /__)' \\  |  |  '------'   |  | |  |   |  .--'   |  |   |  |  |  | | `-' /\n");
+    80200408:	00009517          	auipc	a0,0x9
+    8020040c:	e5850513          	addi	a0,a0,-424 # 80209260 <etext+0x260>
+    80200410:	00000097          	auipc	ra,0x0
+    80200414:	d7e080e7          	jalr	-642(ra) # 8020018e <printf>
+    printf(" /  .'.  \\      \\   /    \\  `'  /              '  '-'  '-. |  `---.  |  |   |  | ('  '-'(_.-'\n");
+    80200418:	00009517          	auipc	a0,0x9
+    8020041c:	ea850513          	addi	a0,a0,-344 # 802092c0 <etext+0x2c0>
+    80200420:	00000097          	auipc	ra,0x0
+    80200424:	d6e080e7          	jalr	-658(ra) # 8020018e <printf>
+    printf("'--'   '--'      `-'      `----'                `-----'--' `------'  `--'   `--'   `-----'\n");
+    80200428:	00009517          	auipc	a0,0x9
+    8020042c:	ef850513          	addi	a0,a0,-264 # 80209320 <etext+0x320>
+    80200430:	00000097          	auipc	ra,0x0
+    80200434:	d5e080e7          	jalr	-674(ra) # 8020018e <printf>
+}
+    80200438:	60a2                	ld	ra,8(sp)
+    8020043a:	6402                	ld	s0,0(sp)
+    8020043c:	0141                	addi	sp,sp,16
+    8020043e:	8082                	ret
+
+0000000080200440 <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)
+{
+    80200440:	1101                	addi	sp,sp,-32
+    80200442:	ec06                	sd	ra,24(sp)
+    80200444:	e822                	sd	s0,16(sp)
+    80200446:	e426                	sd	s1,8(sp)
+    80200448:	e04a                	sd	s2,0(sp)
+    8020044a:	1000                	addi	s0,sp,32
+  struct run *r;
+  
+  if(((uint64)pa % PGSIZE) != 0 || (char*)pa < kernel_end || (uint64)pa >= PHYSTOP)
+    8020044c:	03451793          	slli	a5,a0,0x34
+    80200450:	e3ad                	bnez	a5,802004b2 <kfree+0x72>
+    80200452:	84aa                	mv	s1,a0
+    80200454:	0000c797          	auipc	a5,0xc
+    80200458:	8ac7b783          	ld	a5,-1876(a5) # 8020bd00 <_GLOBAL_OFFSET_TABLE_+0x28>
+    8020045c:	04f56b63          	bltu	a0,a5,802004b2 <kfree+0x72>
+    80200460:	40300793          	li	a5,1027
+    80200464:	07d6                	slli	a5,a5,0x15
+    80200466:	04f57663          	bgeu	a0,a5,802004b2 <kfree+0x72>
+    panic("kfree");
+
+  // Fill with junk to catch dangling refs.
+  memset(pa, 1, PGSIZE);
+    8020046a:	6605                	lui	a2,0x1
+    8020046c:	4585                	li	a1,1
+    8020046e:	00000097          	auipc	ra,0x0
+    80200472:	2f4080e7          	jalr	756(ra) # 80200762 <memset>
+
+  r = (struct run*)pa;
+
+  acquire(&kmem.lock);
+    80200476:	00014917          	auipc	s2,0x14
+    8020047a:	bb290913          	addi	s2,s2,-1102 # 80214028 <kmem>
+    8020047e:	854a                	mv	a0,s2
+    80200480:	00000097          	auipc	ra,0x0
+    80200484:	246080e7          	jalr	582(ra) # 802006c6 <acquire>
+  r->next = kmem.freelist;
+    80200488:	01893783          	ld	a5,24(s2)
+    8020048c:	e09c                	sd	a5,0(s1)
+  kmem.freelist = r;
+    8020048e:	00993c23          	sd	s1,24(s2)
+  kmem.npage++;
+    80200492:	02093783          	ld	a5,32(s2)
+    80200496:	0785                	addi	a5,a5,1
+    80200498:	02f93023          	sd	a5,32(s2)
+  release(&kmem.lock);
+    8020049c:	854a                	mv	a0,s2
+    8020049e:	00000097          	auipc	ra,0x0
+    802004a2:	27c080e7          	jalr	636(ra) # 8020071a <release>
+}
+    802004a6:	60e2                	ld	ra,24(sp)
+    802004a8:	6442                	ld	s0,16(sp)
+    802004aa:	64a2                	ld	s1,8(sp)
+    802004ac:	6902                	ld	s2,0(sp)
+    802004ae:	6105                	addi	sp,sp,32
+    802004b0:	8082                	ret
+    panic("kfree");
+    802004b2:	00009517          	auipc	a0,0x9
+    802004b6:	ee650513          	addi	a0,a0,-282 # 80209398 <digits+0x18>
+    802004ba:	00000097          	auipc	ra,0x0
+    802004be:	c8a080e7          	jalr	-886(ra) # 80200144 <panic>
+
+00000000802004c2 <freerange>:
+{
+    802004c2:	7179                	addi	sp,sp,-48
+    802004c4:	f406                	sd	ra,40(sp)
+    802004c6:	f022                	sd	s0,32(sp)
+    802004c8:	ec26                	sd	s1,24(sp)
+    802004ca:	e84a                	sd	s2,16(sp)
+    802004cc:	e44e                	sd	s3,8(sp)
+    802004ce:	e052                	sd	s4,0(sp)
+    802004d0:	1800                	addi	s0,sp,48
+  p = (char*)PGROUNDUP((uint64)pa_start);
+    802004d2:	6785                	lui	a5,0x1
+    802004d4:	fff78713          	addi	a4,a5,-1 # fff <_entry-0x801ff001>
+    802004d8:	00e504b3          	add	s1,a0,a4
+    802004dc:	777d                	lui	a4,0xfffff
+    802004de:	8cf9                	and	s1,s1,a4
+  for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)
+    802004e0:	94be                	add	s1,s1,a5
+    802004e2:	0095ee63          	bltu	a1,s1,802004fe <freerange+0x3c>
+    802004e6:	892e                	mv	s2,a1
+    kfree(p);
+    802004e8:	7a7d                	lui	s4,0xfffff
+  for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)
+    802004ea:	6985                	lui	s3,0x1
+    kfree(p);
+    802004ec:	01448533          	add	a0,s1,s4
+    802004f0:	00000097          	auipc	ra,0x0
+    802004f4:	f50080e7          	jalr	-176(ra) # 80200440 <kfree>
+  for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)
+    802004f8:	94ce                	add	s1,s1,s3
+    802004fa:	fe9979e3          	bgeu	s2,s1,802004ec <freerange+0x2a>
+}
+    802004fe:	70a2                	ld	ra,40(sp)
+    80200500:	7402                	ld	s0,32(sp)
+    80200502:	64e2                	ld	s1,24(sp)
+    80200504:	6942                	ld	s2,16(sp)
+    80200506:	69a2                	ld	s3,8(sp)
+    80200508:	6a02                	ld	s4,0(sp)
+    8020050a:	6145                	addi	sp,sp,48
+    8020050c:	8082                	ret
+
+000000008020050e <kinit>:
+{
+    8020050e:	1101                	addi	sp,sp,-32
+    80200510:	ec06                	sd	ra,24(sp)
+    80200512:	e822                	sd	s0,16(sp)
+    80200514:	e426                	sd	s1,8(sp)
+    80200516:	1000                	addi	s0,sp,32
+  initlock(&kmem.lock, "kmem");
+    80200518:	00014497          	auipc	s1,0x14
+    8020051c:	b1048493          	addi	s1,s1,-1264 # 80214028 <kmem>
+    80200520:	00009597          	auipc	a1,0x9
+    80200524:	e8058593          	addi	a1,a1,-384 # 802093a0 <digits+0x20>
+    80200528:	8526                	mv	a0,s1
+    8020052a:	00000097          	auipc	ra,0x0
+    8020052e:	158080e7          	jalr	344(ra) # 80200682 <initlock>
+  kmem.freelist = 0;
+    80200532:	0004bc23          	sd	zero,24(s1)
+  kmem.npage = 0;
+    80200536:	0204b023          	sd	zero,32(s1)
+  freerange(kernel_end, (void*)PHYSTOP);
+    8020053a:	40300593          	li	a1,1027
+    8020053e:	05d6                	slli	a1,a1,0x15
+    80200540:	0000b517          	auipc	a0,0xb
+    80200544:	7c053503          	ld	a0,1984(a0) # 8020bd00 <_GLOBAL_OFFSET_TABLE_+0x28>
+    80200548:	00000097          	auipc	ra,0x0
+    8020054c:	f7a080e7          	jalr	-134(ra) # 802004c2 <freerange>
+}
+    80200550:	60e2                	ld	ra,24(sp)
+    80200552:	6442                	ld	s0,16(sp)
+    80200554:	64a2                	ld	s1,8(sp)
+    80200556:	6105                	addi	sp,sp,32
+    80200558:	8082                	ret
+
+000000008020055a <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)
+{
+    8020055a:	1101                	addi	sp,sp,-32
+    8020055c:	ec06                	sd	ra,24(sp)
+    8020055e:	e822                	sd	s0,16(sp)
+    80200560:	e426                	sd	s1,8(sp)
+    80200562:	1000                	addi	s0,sp,32
+  struct run *r;
+
+  acquire(&kmem.lock);
+    80200564:	00014497          	auipc	s1,0x14
+    80200568:	ac448493          	addi	s1,s1,-1340 # 80214028 <kmem>
+    8020056c:	8526                	mv	a0,s1
+    8020056e:	00000097          	auipc	ra,0x0
+    80200572:	158080e7          	jalr	344(ra) # 802006c6 <acquire>
+  r = kmem.freelist;
+    80200576:	6c84                	ld	s1,24(s1)
+  if(r) {
+    80200578:	c89d                	beqz	s1,802005ae <kalloc+0x54>
+    kmem.freelist = r->next;
+    8020057a:	609c                	ld	a5,0(s1)
+    8020057c:	00014517          	auipc	a0,0x14
+    80200580:	aac50513          	addi	a0,a0,-1364 # 80214028 <kmem>
+    80200584:	ed1c                	sd	a5,24(a0)
+    kmem.npage--;
+    80200586:	711c                	ld	a5,32(a0)
+    80200588:	17fd                	addi	a5,a5,-1
+    8020058a:	f11c                	sd	a5,32(a0)
+  }
+  release(&kmem.lock);
+    8020058c:	00000097          	auipc	ra,0x0
+    80200590:	18e080e7          	jalr	398(ra) # 8020071a <release>
+
+  if(r)
+    memset((char*)r, 5, PGSIZE); // fill with junk
+    80200594:	6605                	lui	a2,0x1
+    80200596:	4595                	li	a1,5
+    80200598:	8526                	mv	a0,s1
+    8020059a:	00000097          	auipc	ra,0x0
+    8020059e:	1c8080e7          	jalr	456(ra) # 80200762 <memset>
+  return (void*)r;
+}
+    802005a2:	8526                	mv	a0,s1
+    802005a4:	60e2                	ld	ra,24(sp)
+    802005a6:	6442                	ld	s0,16(sp)
+    802005a8:	64a2                	ld	s1,8(sp)
+    802005aa:	6105                	addi	sp,sp,32
+    802005ac:	8082                	ret
+  release(&kmem.lock);
+    802005ae:	00014517          	auipc	a0,0x14
+    802005b2:	a7a50513          	addi	a0,a0,-1414 # 80214028 <kmem>
+    802005b6:	00000097          	auipc	ra,0x0
+    802005ba:	164080e7          	jalr	356(ra) # 8020071a <release>
+  if(r)
+    802005be:	b7d5                	j	802005a2 <kalloc+0x48>
+
+00000000802005c0 <freemem_amount>:
+
+uint64
+freemem_amount(void)
+{
+    802005c0:	1141                	addi	sp,sp,-16
+    802005c2:	e422                	sd	s0,8(sp)
+    802005c4:	0800                	addi	s0,sp,16
+  return kmem.npage << PGSHIFT;
+}
+    802005c6:	00014517          	auipc	a0,0x14
+    802005ca:	a8253503          	ld	a0,-1406(a0) # 80214048 <kmem+0x20>
+    802005ce:	0532                	slli	a0,a0,0xc
+    802005d0:	6422                	ld	s0,8(sp)
+    802005d2:	0141                	addi	sp,sp,16
+    802005d4:	8082                	ret
+
+00000000802005d6 <push_off>:
+// it takes two pop_off()s to undo two push_off()s.  Also, if interrupts
+// are initially off, then push_off, pop_off leaves them off.
+
+void
+push_off(void)
+{
+    802005d6:	1101                	addi	sp,sp,-32
+    802005d8:	ec06                	sd	ra,24(sp)
+    802005da:	e822                	sd	s0,16(sp)
+    802005dc:	e426                	sd	s1,8(sp)
+    802005de:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    802005e0:	100024f3          	csrr	s1,sstatus
+    802005e4:	100027f3          	csrr	a5,sstatus
+  w_sstatus(r_sstatus() & ~SSTATUS_SIE);
+    802005e8:	9bf5                	andi	a5,a5,-3
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    802005ea:	10079073          	csrw	sstatus,a5
+  int old = intr_get();
+
+  intr_off();
+  //printf("\e[32mpush_off()\e[0m: cpuid(): %d\n", cpuid());
+  if(mycpu()->noff == 0)
+    802005ee:	00001097          	auipc	ra,0x1
+    802005f2:	432080e7          	jalr	1074(ra) # 80201a20 <mycpu>
+    802005f6:	5d3c                	lw	a5,120(a0)
+    802005f8:	cf89                	beqz	a5,80200612 <push_off+0x3c>
+    mycpu()->intena = old;
+  mycpu()->noff += 1;
+    802005fa:	00001097          	auipc	ra,0x1
+    802005fe:	426080e7          	jalr	1062(ra) # 80201a20 <mycpu>
+    80200602:	5d3c                	lw	a5,120(a0)
+    80200604:	2785                	addiw	a5,a5,1
+    80200606:	dd3c                	sw	a5,120(a0)
+}
+    80200608:	60e2                	ld	ra,24(sp)
+    8020060a:	6442                	ld	s0,16(sp)
+    8020060c:	64a2                	ld	s1,8(sp)
+    8020060e:	6105                	addi	sp,sp,32
+    80200610:	8082                	ret
+    mycpu()->intena = old;
+    80200612:	00001097          	auipc	ra,0x1
+    80200616:	40e080e7          	jalr	1038(ra) # 80201a20 <mycpu>
+  return (x & SSTATUS_SIE) != 0;
+    8020061a:	8085                	srli	s1,s1,0x1
+    8020061c:	8885                	andi	s1,s1,1
+    8020061e:	dd64                	sw	s1,124(a0)
+    80200620:	bfe9                	j	802005fa <push_off+0x24>
+
+0000000080200622 <pop_off>:
+
+void
+pop_off(void)
+{
+    80200622:	1141                	addi	sp,sp,-16
+    80200624:	e406                	sd	ra,8(sp)
+    80200626:	e022                	sd	s0,0(sp)
+    80200628:	0800                	addi	s0,sp,16
+  struct cpu *c = mycpu();
+    8020062a:	00001097          	auipc	ra,0x1
+    8020062e:	3f6080e7          	jalr	1014(ra) # 80201a20 <mycpu>
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    80200632:	100027f3          	csrr	a5,sstatus
+  return (x & SSTATUS_SIE) != 0;
+    80200636:	8b89                	andi	a5,a5,2
+
+  //printf("\e[31mpop_off()\e[0m: cpuid(): %d\n", cpuid());
+  if(intr_get())
+    80200638:	e78d                	bnez	a5,80200662 <pop_off+0x40>
+    panic("pop_off - interruptible");
+  if(c->noff < 1) {
+    8020063a:	5d3c                	lw	a5,120(a0)
+    8020063c:	02f05b63          	blez	a5,80200672 <pop_off+0x50>
+    //printf("c->noff = %d\n", c->noff);
+    panic("pop_off");
+  }
+  //printf("c->noff: %d\n", c->noff);
+  //printf("c: %x\n", c);
+  c->noff -= 1;
+    80200640:	37fd                	addiw	a5,a5,-1
+    80200642:	0007871b          	sext.w	a4,a5
+    80200646:	dd3c                	sw	a5,120(a0)
+  if(c->noff == 0 && c->intena)
+    80200648:	eb09                	bnez	a4,8020065a <pop_off+0x38>
+    8020064a:	5d7c                	lw	a5,124(a0)
+    8020064c:	c799                	beqz	a5,8020065a <pop_off+0x38>
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    8020064e:	100027f3          	csrr	a5,sstatus
+  w_sstatus(r_sstatus() | SSTATUS_SIE);
+    80200652:	0027e793          	ori	a5,a5,2
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    80200656:	10079073          	csrw	sstatus,a5
+    intr_on();
+}
+    8020065a:	60a2                	ld	ra,8(sp)
+    8020065c:	6402                	ld	s0,0(sp)
+    8020065e:	0141                	addi	sp,sp,16
+    80200660:	8082                	ret
+    panic("pop_off - interruptible");
+    80200662:	00009517          	auipc	a0,0x9
+    80200666:	d4650513          	addi	a0,a0,-698 # 802093a8 <digits+0x28>
+    8020066a:	00000097          	auipc	ra,0x0
+    8020066e:	ada080e7          	jalr	-1318(ra) # 80200144 <panic>
+    panic("pop_off");
+    80200672:	00009517          	auipc	a0,0x9
+    80200676:	d4e50513          	addi	a0,a0,-690 # 802093c0 <digits+0x40>
+    8020067a:	00000097          	auipc	ra,0x0
+    8020067e:	aca080e7          	jalr	-1334(ra) # 80200144 <panic>
+
+0000000080200682 <initlock>:
+#include "include/intr.h"
+#include "include/printf.h"
+
+void
+initlock(struct spinlock *lk, char *name)
+{
+    80200682:	1141                	addi	sp,sp,-16
+    80200684:	e422                	sd	s0,8(sp)
+    80200686:	0800                	addi	s0,sp,16
+  lk->name = name;
+    80200688:	e50c                	sd	a1,8(a0)
+  lk->locked = 0;
+    8020068a:	00052023          	sw	zero,0(a0)
+  lk->cpu = 0;
+    8020068e:	00053823          	sd	zero,16(a0)
+}
+    80200692:	6422                	ld	s0,8(sp)
+    80200694:	0141                	addi	sp,sp,16
+    80200696:	8082                	ret
+
+0000000080200698 <holding>:
+// Interrupts must be off.
+int
+holding(struct spinlock *lk)
+{
+  int r;
+  r = (lk->locked && lk->cpu == mycpu());
+    80200698:	411c                	lw	a5,0(a0)
+    8020069a:	e399                	bnez	a5,802006a0 <holding+0x8>
+    8020069c:	4501                	li	a0,0
+  return r;
+}
+    8020069e:	8082                	ret
+{
+    802006a0:	1101                	addi	sp,sp,-32
+    802006a2:	ec06                	sd	ra,24(sp)
+    802006a4:	e822                	sd	s0,16(sp)
+    802006a6:	e426                	sd	s1,8(sp)
+    802006a8:	1000                	addi	s0,sp,32
+  r = (lk->locked && lk->cpu == mycpu());
+    802006aa:	6904                	ld	s1,16(a0)
+    802006ac:	00001097          	auipc	ra,0x1
+    802006b0:	374080e7          	jalr	884(ra) # 80201a20 <mycpu>
+    802006b4:	40a48533          	sub	a0,s1,a0
+    802006b8:	00153513          	seqz	a0,a0
+}
+    802006bc:	60e2                	ld	ra,24(sp)
+    802006be:	6442                	ld	s0,16(sp)
+    802006c0:	64a2                	ld	s1,8(sp)
+    802006c2:	6105                	addi	sp,sp,32
+    802006c4:	8082                	ret
+
+00000000802006c6 <acquire>:
+{
+    802006c6:	1101                	addi	sp,sp,-32
+    802006c8:	ec06                	sd	ra,24(sp)
+    802006ca:	e822                	sd	s0,16(sp)
+    802006cc:	e426                	sd	s1,8(sp)
+    802006ce:	1000                	addi	s0,sp,32
+    802006d0:	84aa                	mv	s1,a0
+  push_off(); // disable interrupts to avoid deadlock.
+    802006d2:	00000097          	auipc	ra,0x0
+    802006d6:	f04080e7          	jalr	-252(ra) # 802005d6 <push_off>
+  if(holding(lk))
+    802006da:	8526                	mv	a0,s1
+    802006dc:	00000097          	auipc	ra,0x0
+    802006e0:	fbc080e7          	jalr	-68(ra) # 80200698 <holding>
+  while(__sync_lock_test_and_set(&lk->locked, 1) != 0)
+    802006e4:	4705                	li	a4,1
+  if(holding(lk))
+    802006e6:	e115                	bnez	a0,8020070a <acquire+0x44>
+  while(__sync_lock_test_and_set(&lk->locked, 1) != 0)
+    802006e8:	87ba                	mv	a5,a4
+    802006ea:	0cf4a7af          	amoswap.w.aq	a5,a5,(s1)
+    802006ee:	2781                	sext.w	a5,a5
+    802006f0:	ffe5                	bnez	a5,802006e8 <acquire+0x22>
+  __sync_synchronize();
+    802006f2:	0ff0000f          	fence
+  lk->cpu = mycpu();
+    802006f6:	00001097          	auipc	ra,0x1
+    802006fa:	32a080e7          	jalr	810(ra) # 80201a20 <mycpu>
+    802006fe:	e888                	sd	a0,16(s1)
+}
+    80200700:	60e2                	ld	ra,24(sp)
+    80200702:	6442                	ld	s0,16(sp)
+    80200704:	64a2                	ld	s1,8(sp)
+    80200706:	6105                	addi	sp,sp,32
+    80200708:	8082                	ret
+    panic("acquire");
+    8020070a:	00009517          	auipc	a0,0x9
+    8020070e:	cbe50513          	addi	a0,a0,-834 # 802093c8 <digits+0x48>
+    80200712:	00000097          	auipc	ra,0x0
+    80200716:	a32080e7          	jalr	-1486(ra) # 80200144 <panic>
+
+000000008020071a <release>:
+{
+    8020071a:	1101                	addi	sp,sp,-32
+    8020071c:	ec06                	sd	ra,24(sp)
+    8020071e:	e822                	sd	s0,16(sp)
+    80200720:	e426                	sd	s1,8(sp)
+    80200722:	1000                	addi	s0,sp,32
+    80200724:	84aa                	mv	s1,a0
+  if(!holding(lk))
+    80200726:	00000097          	auipc	ra,0x0
+    8020072a:	f72080e7          	jalr	-142(ra) # 80200698 <holding>
+    8020072e:	c115                	beqz	a0,80200752 <release+0x38>
+  lk->cpu = 0;
+    80200730:	0004b823          	sd	zero,16(s1)
+  __sync_synchronize();
+    80200734:	0ff0000f          	fence
+  __sync_lock_release(&lk->locked);
+    80200738:	0f50000f          	fence	iorw,ow
+    8020073c:	0804a02f          	amoswap.w	zero,zero,(s1)
+  pop_off();
+    80200740:	00000097          	auipc	ra,0x0
+    80200744:	ee2080e7          	jalr	-286(ra) # 80200622 <pop_off>
+}
+    80200748:	60e2                	ld	ra,24(sp)
+    8020074a:	6442                	ld	s0,16(sp)
+    8020074c:	64a2                	ld	s1,8(sp)
+    8020074e:	6105                	addi	sp,sp,32
+    80200750:	8082                	ret
+    panic("release");
+    80200752:	00009517          	auipc	a0,0x9
+    80200756:	c7e50513          	addi	a0,a0,-898 # 802093d0 <digits+0x50>
+    8020075a:	00000097          	auipc	ra,0x0
+    8020075e:	9ea080e7          	jalr	-1558(ra) # 80200144 <panic>
+
+0000000080200762 <memset>:
+#include "include/types.h"
+
+void*
+memset(void *dst, int c, uint n)
+{
+    80200762:	1141                	addi	sp,sp,-16
+    80200764:	e422                	sd	s0,8(sp)
+    80200766:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+    80200768:	ca19                	beqz	a2,8020077e <memset+0x1c>
+    8020076a:	87aa                	mv	a5,a0
+    8020076c:	1602                	slli	a2,a2,0x20
+    8020076e:	9201                	srli	a2,a2,0x20
+    80200770:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+    80200774:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+    80200778:	0785                	addi	a5,a5,1
+    8020077a:	fee79de3          	bne	a5,a4,80200774 <memset+0x12>
+  }
+  return dst;
+}
+    8020077e:	6422                	ld	s0,8(sp)
+    80200780:	0141                	addi	sp,sp,16
+    80200782:	8082                	ret
+
+0000000080200784 <memcmp>:
+
+int
+memcmp(const void *v1, const void *v2, uint n)
+{
+    80200784:	1141                	addi	sp,sp,-16
+    80200786:	e422                	sd	s0,8(sp)
+    80200788:	0800                	addi	s0,sp,16
+  const uchar *s1, *s2;
+
+  s1 = v1;
+  s2 = v2;
+  while(n-- > 0){
+    8020078a:	ca05                	beqz	a2,802007ba <memcmp+0x36>
+    8020078c:	fff6069b          	addiw	a3,a2,-1 # fff <_entry-0x801ff001>
+    80200790:	1682                	slli	a3,a3,0x20
+    80200792:	9281                	srli	a3,a3,0x20
+    80200794:	0685                	addi	a3,a3,1
+    80200796:	96aa                	add	a3,a3,a0
+    if(*s1 != *s2)
+    80200798:	00054783          	lbu	a5,0(a0)
+    8020079c:	0005c703          	lbu	a4,0(a1)
+    802007a0:	00e79863          	bne	a5,a4,802007b0 <memcmp+0x2c>
+      return *s1 - *s2;
+    s1++, s2++;
+    802007a4:	0505                	addi	a0,a0,1
+    802007a6:	0585                	addi	a1,a1,1
+  while(n-- > 0){
+    802007a8:	fed518e3          	bne	a0,a3,80200798 <memcmp+0x14>
+  }
+
+  return 0;
+    802007ac:	4501                	li	a0,0
+    802007ae:	a019                	j	802007b4 <memcmp+0x30>
+      return *s1 - *s2;
+    802007b0:	40e7853b          	subw	a0,a5,a4
+}
+    802007b4:	6422                	ld	s0,8(sp)
+    802007b6:	0141                	addi	sp,sp,16
+    802007b8:	8082                	ret
+  return 0;
+    802007ba:	4501                	li	a0,0
+    802007bc:	bfe5                	j	802007b4 <memcmp+0x30>
+
+00000000802007be <memmove>:
+
+void*
+memmove(void *dst, const void *src, uint n)
+{
+    802007be:	1141                	addi	sp,sp,-16
+    802007c0:	e422                	sd	s0,8(sp)
+    802007c2:	0800                	addi	s0,sp,16
+  const char *s;
+  char *d;
+
+  s = src;
+  d = dst;
+  if(s < d && s + n > d){
+    802007c4:	02a5e563          	bltu	a1,a0,802007ee <memmove+0x30>
+    s += n;
+    d += n;
+    while(n-- > 0)
+      *--d = *--s;
+  } else
+    while(n-- > 0)
+    802007c8:	fff6069b          	addiw	a3,a2,-1
+    802007cc:	ce11                	beqz	a2,802007e8 <memmove+0x2a>
+    802007ce:	1682                	slli	a3,a3,0x20
+    802007d0:	9281                	srli	a3,a3,0x20
+    802007d2:	0685                	addi	a3,a3,1
+    802007d4:	96ae                	add	a3,a3,a1
+    802007d6:	87aa                	mv	a5,a0
+      *d++ = *s++;
+    802007d8:	0585                	addi	a1,a1,1
+    802007da:	0785                	addi	a5,a5,1
+    802007dc:	fff5c703          	lbu	a4,-1(a1)
+    802007e0:	fee78fa3          	sb	a4,-1(a5)
+    while(n-- > 0)
+    802007e4:	fed59ae3          	bne	a1,a3,802007d8 <memmove+0x1a>
+
+  return dst;
+}
+    802007e8:	6422                	ld	s0,8(sp)
+    802007ea:	0141                	addi	sp,sp,16
+    802007ec:	8082                	ret
+  if(s < d && s + n > d){
+    802007ee:	02061713          	slli	a4,a2,0x20
+    802007f2:	9301                	srli	a4,a4,0x20
+    802007f4:	00e587b3          	add	a5,a1,a4
+    802007f8:	fcf578e3          	bgeu	a0,a5,802007c8 <memmove+0xa>
+    d += n;
+    802007fc:	972a                	add	a4,a4,a0
+    while(n-- > 0)
+    802007fe:	fff6069b          	addiw	a3,a2,-1
+    80200802:	d27d                	beqz	a2,802007e8 <memmove+0x2a>
+    80200804:	02069613          	slli	a2,a3,0x20
+    80200808:	9201                	srli	a2,a2,0x20
+    8020080a:	fff64613          	not	a2,a2
+    8020080e:	963e                	add	a2,a2,a5
+      *--d = *--s;
+    80200810:	17fd                	addi	a5,a5,-1
+    80200812:	177d                	addi	a4,a4,-1 # ffffffffffffefff <ebss_clear+0xffffffff7fdd8fff>
+    80200814:	0007c683          	lbu	a3,0(a5)
+    80200818:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+    8020081c:	fef61ae3          	bne	a2,a5,80200810 <memmove+0x52>
+    80200820:	b7e1                	j	802007e8 <memmove+0x2a>
+
+0000000080200822 <memcpy>:
+
+// memcpy exists to placate GCC.  Use memmove.
+void*
+memcpy(void *dst, const void *src, uint n)
+{
+    80200822:	1141                	addi	sp,sp,-16
+    80200824:	e406                	sd	ra,8(sp)
+    80200826:	e022                	sd	s0,0(sp)
+    80200828:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+    8020082a:	00000097          	auipc	ra,0x0
+    8020082e:	f94080e7          	jalr	-108(ra) # 802007be <memmove>
+}
+    80200832:	60a2                	ld	ra,8(sp)
+    80200834:	6402                	ld	s0,0(sp)
+    80200836:	0141                	addi	sp,sp,16
+    80200838:	8082                	ret
+
+000000008020083a <strncmp>:
+
+int
+strncmp(const char *p, const char *q, uint n)
+{
+    8020083a:	1141                	addi	sp,sp,-16
+    8020083c:	e422                	sd	s0,8(sp)
+    8020083e:	0800                	addi	s0,sp,16
+  while(n > 0 && *p && *p == *q)
+    80200840:	ce11                	beqz	a2,8020085c <strncmp+0x22>
+    80200842:	00054783          	lbu	a5,0(a0)
+    80200846:	cf89                	beqz	a5,80200860 <strncmp+0x26>
+    80200848:	0005c703          	lbu	a4,0(a1)
+    8020084c:	00f71a63          	bne	a4,a5,80200860 <strncmp+0x26>
+    n--, p++, q++;
+    80200850:	367d                	addiw	a2,a2,-1
+    80200852:	0505                	addi	a0,a0,1
+    80200854:	0585                	addi	a1,a1,1
+  while(n > 0 && *p && *p == *q)
+    80200856:	f675                	bnez	a2,80200842 <strncmp+0x8>
+  if(n == 0)
+    return 0;
+    80200858:	4501                	li	a0,0
+    8020085a:	a809                	j	8020086c <strncmp+0x32>
+    8020085c:	4501                	li	a0,0
+    8020085e:	a039                	j	8020086c <strncmp+0x32>
+  if(n == 0)
+    80200860:	ca09                	beqz	a2,80200872 <strncmp+0x38>
+  return (uchar)*p - (uchar)*q;
+    80200862:	00054503          	lbu	a0,0(a0)
+    80200866:	0005c783          	lbu	a5,0(a1)
+    8020086a:	9d1d                	subw	a0,a0,a5
+}
+    8020086c:	6422                	ld	s0,8(sp)
+    8020086e:	0141                	addi	sp,sp,16
+    80200870:	8082                	ret
+    return 0;
+    80200872:	4501                	li	a0,0
+    80200874:	bfe5                	j	8020086c <strncmp+0x32>
+
+0000000080200876 <strncpy>:
+
+char*
+strncpy(char *s, const char *t, int n)
+{
+    80200876:	1141                	addi	sp,sp,-16
+    80200878:	e422                	sd	s0,8(sp)
+    8020087a:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while(n-- > 0 && (*s++ = *t++) != 0)
+    8020087c:	872a                	mv	a4,a0
+    8020087e:	8832                	mv	a6,a2
+    80200880:	367d                	addiw	a2,a2,-1
+    80200882:	01005963          	blez	a6,80200894 <strncpy+0x1e>
+    80200886:	0705                	addi	a4,a4,1
+    80200888:	0005c783          	lbu	a5,0(a1)
+    8020088c:	fef70fa3          	sb	a5,-1(a4)
+    80200890:	0585                	addi	a1,a1,1
+    80200892:	f7f5                	bnez	a5,8020087e <strncpy+0x8>
+    ;
+  while(n-- > 0)
+    80200894:	86ba                	mv	a3,a4
+    80200896:	00c05c63          	blez	a2,802008ae <strncpy+0x38>
+    *s++ = 0;
+    8020089a:	0685                	addi	a3,a3,1
+    8020089c:	fe068fa3          	sb	zero,-1(a3)
+  while(n-- > 0)
+    802008a0:	40d707bb          	subw	a5,a4,a3
+    802008a4:	37fd                	addiw	a5,a5,-1
+    802008a6:	010787bb          	addw	a5,a5,a6
+    802008aa:	fef048e3          	bgtz	a5,8020089a <strncpy+0x24>
+  return os;
+}
+    802008ae:	6422                	ld	s0,8(sp)
+    802008b0:	0141                	addi	sp,sp,16
+    802008b2:	8082                	ret
+
+00000000802008b4 <safestrcpy>:
+
+// Like strncpy but guaranteed to NUL-terminate.
+char*
+safestrcpy(char *s, const char *t, int n)
+{
+    802008b4:	1141                	addi	sp,sp,-16
+    802008b6:	e422                	sd	s0,8(sp)
+    802008b8:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  if(n <= 0)
+    802008ba:	02c05363          	blez	a2,802008e0 <safestrcpy+0x2c>
+    802008be:	fff6069b          	addiw	a3,a2,-1
+    802008c2:	1682                	slli	a3,a3,0x20
+    802008c4:	9281                	srli	a3,a3,0x20
+    802008c6:	96ae                	add	a3,a3,a1
+    802008c8:	87aa                	mv	a5,a0
+    return os;
+  while(--n > 0 && (*s++ = *t++) != 0)
+    802008ca:	00d58963          	beq	a1,a3,802008dc <safestrcpy+0x28>
+    802008ce:	0585                	addi	a1,a1,1
+    802008d0:	0785                	addi	a5,a5,1
+    802008d2:	fff5c703          	lbu	a4,-1(a1)
+    802008d6:	fee78fa3          	sb	a4,-1(a5)
+    802008da:	fb65                	bnez	a4,802008ca <safestrcpy+0x16>
+    ;
+  *s = 0;
+    802008dc:	00078023          	sb	zero,0(a5)
+  return os;
+}
+    802008e0:	6422                	ld	s0,8(sp)
+    802008e2:	0141                	addi	sp,sp,16
+    802008e4:	8082                	ret
+
+00000000802008e6 <strlen>:
+
+int
+strlen(const char *s)
+{
+    802008e6:	1141                	addi	sp,sp,-16
+    802008e8:	e422                	sd	s0,8(sp)
+    802008ea:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+    802008ec:	00054783          	lbu	a5,0(a0)
+    802008f0:	cf91                	beqz	a5,8020090c <strlen+0x26>
+    802008f2:	0505                	addi	a0,a0,1
+    802008f4:	87aa                	mv	a5,a0
+    802008f6:	4685                	li	a3,1
+    802008f8:	9e89                	subw	a3,a3,a0
+    802008fa:	00f6853b          	addw	a0,a3,a5
+    802008fe:	0785                	addi	a5,a5,1
+    80200900:	fff7c703          	lbu	a4,-1(a5)
+    80200904:	fb7d                	bnez	a4,802008fa <strlen+0x14>
+    ;
+  return n;
+}
+    80200906:	6422                	ld	s0,8(sp)
+    80200908:	0141                	addi	sp,sp,16
+    8020090a:	8082                	ret
+  for(n = 0; s[n]; n++)
+    8020090c:	4501                	li	a0,0
+    8020090e:	bfe5                	j	80200906 <strlen+0x20>
+
+0000000080200910 <wnstr>:
+
+// convert uchar string into wide char string 
+void wnstr(wchar *dst, char const *src, int len) {
+    80200910:	1141                	addi	sp,sp,-16
+    80200912:	e422                	sd	s0,8(sp)
+    80200914:	0800                	addi	s0,sp,16
+  while (len -- && *src) {
+    80200916:	c20d                	beqz	a2,80200938 <wnstr+0x28>
+    80200918:	02061793          	slli	a5,a2,0x20
+    8020091c:	01f7d613          	srli	a2,a5,0x1f
+    80200920:	00c50733          	add	a4,a0,a2
+    80200924:	0005c783          	lbu	a5,0(a1)
+    80200928:	cb81                	beqz	a5,80200938 <wnstr+0x28>
+    *(uchar*)dst = *src++;
+    8020092a:	0585                	addi	a1,a1,1
+    8020092c:	00f50023          	sb	a5,0(a0)
+    dst ++;
+    80200930:	0509                	addi	a0,a0,2
+  while (len -- && *src) {
+    80200932:	fee519e3          	bne	a0,a4,80200924 <wnstr+0x14>
+    dst ++;
+    80200936:	853a                	mv	a0,a4
+  }
+
+  *dst = 0;
+    80200938:	00051023          	sh	zero,0(a0)
+}
+    8020093c:	6422                	ld	s0,8(sp)
+    8020093e:	0141                	addi	sp,sp,16
+    80200940:	8082                	ret
+
+0000000080200942 <snstr>:
+
+// convert wide char string into uchar string 
+void snstr(char *dst, wchar const *src, int len) {
+    80200942:	1141                	addi	sp,sp,-16
+    80200944:	e422                	sd	s0,8(sp)
+    80200946:	0800                	addi	s0,sp,16
+  while (len -- && *src) {
+    80200948:	fff6071b          	addiw	a4,a2,-1
+    8020094c:	02061693          	slli	a3,a2,0x20
+    80200950:	9281                	srli	a3,a3,0x20
+    80200952:	96aa                	add	a3,a3,a0
+    80200954:	c61d                	beqz	a2,80200982 <snstr+0x40>
+    80200956:	0005d783          	lhu	a5,0(a1)
+    8020095a:	cb89                	beqz	a5,8020096c <snstr+0x2a>
+    *dst++ = (uchar)(*src & 0xff);
+    8020095c:	0505                	addi	a0,a0,1
+    8020095e:	fef50fa3          	sb	a5,-1(a0)
+    src ++;
+    80200962:	0589                	addi	a1,a1,2
+  while (len -- && *src) {
+    80200964:	377d                	addiw	a4,a4,-1
+    80200966:	fed518e3          	bne	a0,a3,80200956 <snstr+0x14>
+    *dst++ = (uchar)(*src & 0xff);
+    8020096a:	8536                	mv	a0,a3
+  }
+  while(len-- > 0)
+    8020096c:	02071793          	slli	a5,a4,0x20
+    80200970:	9381                	srli	a5,a5,0x20
+    80200972:	97aa                	add	a5,a5,a0
+    80200974:	00e05763          	blez	a4,80200982 <snstr+0x40>
+    *dst++ = 0;
+    80200978:	0505                	addi	a0,a0,1
+    8020097a:	fe050fa3          	sb	zero,-1(a0)
+  while(len-- > 0)
+    8020097e:	fea79de3          	bne	a5,a0,80200978 <snstr+0x36>
+}
+    80200982:	6422                	ld	s0,8(sp)
+    80200984:	0141                	addi	sp,sp,16
+    80200986:	8082                	ret
+
+0000000080200988 <wcsncmp>:
+
+int wcsncmp(wchar const *s1, wchar const *s2, int len) {
+    80200988:	1141                	addi	sp,sp,-16
+    8020098a:	e422                	sd	s0,8(sp)
+    8020098c:	0800                	addi	s0,sp,16
+    8020098e:	872a                	mv	a4,a0
+  int ret = 0;
+
+  while (len-- && *s1) {
+    80200990:	02061793          	slli	a5,a2,0x20
+    80200994:	01f7d613          	srli	a2,a5,0x1f
+    80200998:	962e                	add	a2,a2,a1
+    8020099a:	00c58f63          	beq	a1,a2,802009b8 <wcsncmp+0x30>
+    8020099e:	00075783          	lhu	a5,0(a4)
+    802009a2:	cb89                	beqz	a5,802009b4 <wcsncmp+0x2c>
+    ret = (int)(*s1++ - *s2++);
+    802009a4:	0709                	addi	a4,a4,2
+    802009a6:	0589                	addi	a1,a1,2
+    802009a8:	ffe5d683          	lhu	a3,-2(a1)
+    802009ac:	40d7853b          	subw	a0,a5,a3
+    if (ret) break;
+    802009b0:	d56d                	beqz	a0,8020099a <wcsncmp+0x12>
+    802009b2:	a021                	j	802009ba <wcsncmp+0x32>
+    802009b4:	4501                	li	a0,0
+    802009b6:	a011                	j	802009ba <wcsncmp+0x32>
+    802009b8:	4501                	li	a0,0
+  }
+
+  return ret;
+}
+    802009ba:	6422                	ld	s0,8(sp)
+    802009bc:	0141                	addi	sp,sp,16
+    802009be:	8082                	ret
+
+00000000802009c0 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+    802009c0:	1141                	addi	sp,sp,-16
+    802009c2:	e422                	sd	s0,8(sp)
+    802009c4:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+    802009c6:	00054783          	lbu	a5,0(a0)
+    802009ca:	cb99                	beqz	a5,802009e0 <strchr+0x20>
+    if(*s == c)
+    802009cc:	00f58763          	beq	a1,a5,802009da <strchr+0x1a>
+  for(; *s; s++)
+    802009d0:	0505                	addi	a0,a0,1
+    802009d2:	00054783          	lbu	a5,0(a0)
+    802009d6:	fbfd                	bnez	a5,802009cc <strchr+0xc>
+      return (char*)s;
+  return 0;
+    802009d8:	4501                	li	a0,0
+    802009da:	6422                	ld	s0,8(sp)
+    802009dc:	0141                	addi	sp,sp,16
+    802009de:	8082                	ret
+  return 0;
+    802009e0:	4501                	li	a0,0
+    802009e2:	bfe5                	j	802009da <strchr+0x1a>
+
+00000000802009e4 <main>:
+
+volatile static int started = 0;
+
+void
+main(unsigned long hartid, unsigned long dtb_pa)
+{
+    802009e4:	1101                	addi	sp,sp,-32
+    802009e6:	ec06                	sd	ra,24(sp)
+    802009e8:	e822                	sd	s0,16(sp)
+    802009ea:	1000                	addi	s0,sp,32
+  asm volatile("mv tp, %0" : : "r" (hartid & 0x1));
+    802009ec:	00157793          	andi	a5,a0,1
+    802009f0:	823e                	mv	tp,a5
+    started = 1;
+  }
+  else
+  {
+    // hart 1
+    while (started == 0)
+    802009f2:	00013717          	auipc	a4,0x13
+    802009f6:	65e70713          	addi	a4,a4,1630 # 80214050 <started>
+  if (hartid == 0) {
+    802009fa:	cd15                	beqz	a0,80200a36 <main+0x52>
+    while (started == 0)
+    802009fc:	431c                	lw	a5,0(a4)
+    802009fe:	2781                	sext.w	a5,a5
+    80200a00:	dff5                	beqz	a5,802009fc <main+0x18>
+      ;
+    __sync_synchronize();
+    80200a02:	0ff0000f          	fence
+    #ifdef DEBUG
+    printf("hart %d enter main()...\n", hartid);
+    #endif
+    kvminithart();
+    80200a06:	00000097          	auipc	ra,0x0
+    80200a0a:	0de080e7          	jalr	222(ra) # 80200ae4 <kvminithart>
+    trapinithart();
+    80200a0e:	00002097          	auipc	ra,0x2
+    80200a12:	f10080e7          	jalr	-240(ra) # 8020291e <trapinithart>
+    plicinithart();  // ask PLIC for device interrupts
+    80200a16:	00006097          	auipc	ra,0x6
+    80200a1a:	452080e7          	jalr	1106(ra) # 80206e68 <plicinithart>
+    printf("hart 1 init done\n");
+    80200a1e:	00009517          	auipc	a0,0x9
+    80200a22:	9d250513          	addi	a0,a0,-1582 # 802093f0 <digits+0x70>
+    80200a26:	fffff097          	auipc	ra,0xfffff
+    80200a2a:	768080e7          	jalr	1896(ra) # 8020018e <printf>
+  }
+  scheduler();
+    80200a2e:	00001097          	auipc	ra,0x1
+    80200a32:	6ca080e7          	jalr	1738(ra) # 802020f8 <scheduler>
+    consoleinit();
+    80200a36:	00007097          	auipc	ra,0x7
+    80200a3a:	844080e7          	jalr	-1980(ra) # 8020727a <consoleinit>
+    printfinit();   // init a lock for printf 
+    80200a3e:	00000097          	auipc	ra,0x0
+    80200a42:	930080e7          	jalr	-1744(ra) # 8020036e <printfinit>
+    print_logo();
+    80200a46:	00000097          	auipc	ra,0x0
+    80200a4a:	95a080e7          	jalr	-1702(ra) # 802003a0 <print_logo>
+    kinit();         // physical page allocator
+    80200a4e:	00000097          	auipc	ra,0x0
+    80200a52:	ac0080e7          	jalr	-1344(ra) # 8020050e <kinit>
+    kvminit();       // create kernel page table
+    80200a56:	00000097          	auipc	ra,0x0
+    80200a5a:	2d8080e7          	jalr	728(ra) # 80200d2e <kvminit>
+    kvminithart();   // turn on paging
+    80200a5e:	00000097          	auipc	ra,0x0
+    80200a62:	086080e7          	jalr	134(ra) # 80200ae4 <kvminithart>
+    timerinit();     // init a lock for timer
+    80200a66:	00005097          	auipc	ra,0x5
+    80200a6a:	9b8080e7          	jalr	-1608(ra) # 8020541e <timerinit>
+    trapinithart();  // install kernel trap vector, including interrupt handler
+    80200a6e:	00002097          	auipc	ra,0x2
+    80200a72:	eb0080e7          	jalr	-336(ra) # 8020291e <trapinithart>
+    procinit();
+    80200a76:	00001097          	auipc	ra,0x1
+    80200a7a:	f24080e7          	jalr	-220(ra) # 8020199a <procinit>
+    plicinit();
+    80200a7e:	00006097          	auipc	ra,0x6
+    80200a82:	3d2080e7          	jalr	978(ra) # 80206e50 <plicinit>
+    plicinithart();
+    80200a86:	00006097          	auipc	ra,0x6
+    80200a8a:	3e2080e7          	jalr	994(ra) # 80206e68 <plicinithart>
+    disk_init();
+    80200a8e:	00005097          	auipc	ra,0x5
+    80200a92:	a2c080e7          	jalr	-1492(ra) # 802054ba <disk_init>
+    binit();         // buffer cache
+    80200a96:	00003097          	auipc	ra,0x3
+    80200a9a:	d1c080e7          	jalr	-740(ra) # 802037b2 <binit>
+    fileinit();      // file table
+    80200a9e:	00003097          	auipc	ra,0x3
+    80200aa2:	120080e7          	jalr	288(ra) # 80203bbe <fileinit>
+    userinit();      // first user process
+    80200aa6:	00001097          	auipc	ra,0x1
+    80200aaa:	2a4080e7          	jalr	676(ra) # 80201d4a <userinit>
+    printf("hart 0 init done\n");
+    80200aae:	00009517          	auipc	a0,0x9
+    80200ab2:	92a50513          	addi	a0,a0,-1750 # 802093d8 <digits+0x58>
+    80200ab6:	fffff097          	auipc	ra,0xfffff
+    80200aba:	6d8080e7          	jalr	1752(ra) # 8020018e <printf>
+      unsigned long mask = 1 << i;
+    80200abe:	4789                	li	a5,2
+    80200ac0:	fef43423          	sd	a5,-24(s0)
+	SBI_CALL_0(SBI_CLEAR_IPI);
+}
+
+static inline void sbi_send_ipi(const unsigned long *hart_mask)
+{
+	SBI_CALL_1(SBI_SEND_IPI, hart_mask);
+    80200ac4:	fe840513          	addi	a0,s0,-24
+    80200ac8:	4581                	li	a1,0
+    80200aca:	4601                	li	a2,0
+    80200acc:	4681                	li	a3,0
+    80200ace:	4891                	li	a7,4
+    80200ad0:	00000073          	ecall
+    __sync_synchronize();
+    80200ad4:	0ff0000f          	fence
+    started = 1;
+    80200ad8:	4785                	li	a5,1
+    80200ada:	00013717          	auipc	a4,0x13
+    80200ade:	56f72b23          	sw	a5,1398(a4) # 80214050 <started>
+    80200ae2:	b7b1                	j	80200a2e <main+0x4a>
+
+0000000080200ae4 <kvminithart>:
+
+// Switch h/w page table register to the kernel's page table,
+// and enable paging.
+void
+kvminithart()
+{
+    80200ae4:	1141                	addi	sp,sp,-16
+    80200ae6:	e422                	sd	s0,8(sp)
+    80200ae8:	0800                	addi	s0,sp,16
+  w_satp(MAKE_SATP(kernel_pagetable));
+    80200aea:	00013797          	auipc	a5,0x13
+    80200aee:	56e7b783          	ld	a5,1390(a5) # 80214058 <kernel_pagetable>
+    80200af2:	83b1                	srli	a5,a5,0xc
+    80200af4:	577d                	li	a4,-1
+    80200af6:	177e                	slli	a4,a4,0x3f
+    80200af8:	8fd9                	or	a5,a5,a4
+  asm volatile("csrw satp, %0" : : "r" (x));
+    80200afa:	18079073          	csrw	satp,a5
+static inline void
+sfence_vma()
+{
+  // the zero, zero means flush all TLB entries.
+  // asm volatile("sfence.vma zero, zero");
+  asm volatile("sfence.vma");
+    80200afe:	12000073          	sfence.vma
+  // reg_info();
+  sfence_vma();
+  #ifdef DEBUG
+  printf("kvminithart\n");
+  #endif
+}
+    80200b02:	6422                	ld	s0,8(sp)
+    80200b04:	0141                	addi	sp,sp,16
+    80200b06:	8082                	ret
+
+0000000080200b08 <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)
+{
+    80200b08:	7139                	addi	sp,sp,-64
+    80200b0a:	fc06                	sd	ra,56(sp)
+    80200b0c:	f822                	sd	s0,48(sp)
+    80200b0e:	f426                	sd	s1,40(sp)
+    80200b10:	f04a                	sd	s2,32(sp)
+    80200b12:	ec4e                	sd	s3,24(sp)
+    80200b14:	e852                	sd	s4,16(sp)
+    80200b16:	e456                	sd	s5,8(sp)
+    80200b18:	e05a                	sd	s6,0(sp)
+    80200b1a:	0080                	addi	s0,sp,64
+    80200b1c:	84aa                	mv	s1,a0
+    80200b1e:	89ae                	mv	s3,a1
+    80200b20:	8ab2                	mv	s5,a2
+  
+  if(va >= MAXVA)
+    80200b22:	57fd                	li	a5,-1
+    80200b24:	83e9                	srli	a5,a5,0x1a
+    80200b26:	4a79                	li	s4,30
+    panic("walk");
+
+  for(int level = 2; level > 0; level--) {
+    80200b28:	4b31                	li	s6,12
+  if(va >= MAXVA)
+    80200b2a:	04b7f263          	bgeu	a5,a1,80200b6e <walk+0x66>
+    panic("walk");
+    80200b2e:	00009517          	auipc	a0,0x9
+    80200b32:	8da50513          	addi	a0,a0,-1830 # 80209408 <digits+0x88>
+    80200b36:	fffff097          	auipc	ra,0xfffff
+    80200b3a:	60e080e7          	jalr	1550(ra) # 80200144 <panic>
+    pte_t *pte = &pagetable[PX(level, va)];
+    if(*pte & PTE_V) {
+      pagetable = (pagetable_t)PTE2PA(*pte);
+    } else {
+      if(!alloc || (pagetable = (pde_t*)kalloc()) == NULL)
+    80200b3e:	060a8663          	beqz	s5,80200baa <walk+0xa2>
+    80200b42:	00000097          	auipc	ra,0x0
+    80200b46:	a18080e7          	jalr	-1512(ra) # 8020055a <kalloc>
+    80200b4a:	84aa                	mv	s1,a0
+    80200b4c:	c529                	beqz	a0,80200b96 <walk+0x8e>
+        return NULL;
+      memset(pagetable, 0, PGSIZE);
+    80200b4e:	6605                	lui	a2,0x1
+    80200b50:	4581                	li	a1,0
+    80200b52:	00000097          	auipc	ra,0x0
+    80200b56:	c10080e7          	jalr	-1008(ra) # 80200762 <memset>
+      *pte = PA2PTE(pagetable) | PTE_V;
+    80200b5a:	00c4d793          	srli	a5,s1,0xc
+    80200b5e:	07aa                	slli	a5,a5,0xa
+    80200b60:	0017e793          	ori	a5,a5,1
+    80200b64:	00f93023          	sd	a5,0(s2)
+  for(int level = 2; level > 0; level--) {
+    80200b68:	3a5d                	addiw	s4,s4,-9 # ffffffffffffeff7 <ebss_clear+0xffffffff7fdd8ff7>
+    80200b6a:	036a0063          	beq	s4,s6,80200b8a <walk+0x82>
+    pte_t *pte = &pagetable[PX(level, va)];
+    80200b6e:	0149d933          	srl	s2,s3,s4
+    80200b72:	1ff97913          	andi	s2,s2,511
+    80200b76:	090e                	slli	s2,s2,0x3
+    80200b78:	9926                	add	s2,s2,s1
+    if(*pte & PTE_V) {
+    80200b7a:	00093483          	ld	s1,0(s2)
+    80200b7e:	0014f793          	andi	a5,s1,1
+    80200b82:	dfd5                	beqz	a5,80200b3e <walk+0x36>
+      pagetable = (pagetable_t)PTE2PA(*pte);
+    80200b84:	80a9                	srli	s1,s1,0xa
+    80200b86:	04b2                	slli	s1,s1,0xc
+    80200b88:	b7c5                	j	80200b68 <walk+0x60>
+    }
+  }
+  return &pagetable[PX(0, va)];
+    80200b8a:	00c9d513          	srli	a0,s3,0xc
+    80200b8e:	1ff57513          	andi	a0,a0,511
+    80200b92:	050e                	slli	a0,a0,0x3
+    80200b94:	9526                	add	a0,a0,s1
+}
+    80200b96:	70e2                	ld	ra,56(sp)
+    80200b98:	7442                	ld	s0,48(sp)
+    80200b9a:	74a2                	ld	s1,40(sp)
+    80200b9c:	7902                	ld	s2,32(sp)
+    80200b9e:	69e2                	ld	s3,24(sp)
+    80200ba0:	6a42                	ld	s4,16(sp)
+    80200ba2:	6aa2                	ld	s5,8(sp)
+    80200ba4:	6b02                	ld	s6,0(sp)
+    80200ba6:	6121                	addi	sp,sp,64
+    80200ba8:	8082                	ret
+        return NULL;
+    80200baa:	4501                	li	a0,0
+    80200bac:	b7ed                	j	80200b96 <walk+0x8e>
+
+0000000080200bae <walkaddr>:
+walkaddr(pagetable_t pagetable, uint64 va)
+{
+  pte_t *pte;
+  uint64 pa;
+
+  if(va >= MAXVA)
+    80200bae:	57fd                	li	a5,-1
+    80200bb0:	83e9                	srli	a5,a5,0x1a
+    80200bb2:	00b7f463          	bgeu	a5,a1,80200bba <walkaddr+0xc>
+    return NULL;
+    80200bb6:	4501                	li	a0,0
+    return NULL;
+  if((*pte & PTE_U) == 0)
+    return NULL;
+  pa = PTE2PA(*pte);
+  return pa;
+}
+    80200bb8:	8082                	ret
+{
+    80200bba:	1141                	addi	sp,sp,-16
+    80200bbc:	e406                	sd	ra,8(sp)
+    80200bbe:	e022                	sd	s0,0(sp)
+    80200bc0:	0800                	addi	s0,sp,16
+  pte = walk(pagetable, va, 0);
+    80200bc2:	4601                	li	a2,0
+    80200bc4:	00000097          	auipc	ra,0x0
+    80200bc8:	f44080e7          	jalr	-188(ra) # 80200b08 <walk>
+  if(pte == 0)
+    80200bcc:	c105                	beqz	a0,80200bec <walkaddr+0x3e>
+  if((*pte & PTE_V) == 0)
+    80200bce:	611c                	ld	a5,0(a0)
+  if((*pte & PTE_U) == 0)
+    80200bd0:	0117f693          	andi	a3,a5,17
+    80200bd4:	4745                	li	a4,17
+    return NULL;
+    80200bd6:	4501                	li	a0,0
+  if((*pte & PTE_U) == 0)
+    80200bd8:	00e68663          	beq	a3,a4,80200be4 <walkaddr+0x36>
+}
+    80200bdc:	60a2                	ld	ra,8(sp)
+    80200bde:	6402                	ld	s0,0(sp)
+    80200be0:	0141                	addi	sp,sp,16
+    80200be2:	8082                	ret
+  pa = PTE2PA(*pte);
+    80200be4:	83a9                	srli	a5,a5,0xa
+    80200be6:	00c79513          	slli	a0,a5,0xc
+  return pa;
+    80200bea:	bfcd                	j	80200bdc <walkaddr+0x2e>
+    return NULL;
+    80200bec:	4501                	li	a0,0
+    80200bee:	b7fd                	j	80200bdc <walkaddr+0x2e>
+
+0000000080200bf0 <kwalkaddr>:
+  return kwalkaddr(kernel_pagetable, va);
+}
+
+uint64
+kwalkaddr(pagetable_t kpt, uint64 va)
+{
+    80200bf0:	1101                	addi	sp,sp,-32
+    80200bf2:	ec06                	sd	ra,24(sp)
+    80200bf4:	e822                	sd	s0,16(sp)
+    80200bf6:	e426                	sd	s1,8(sp)
+    80200bf8:	1000                	addi	s0,sp,32
+  uint64 off = va % PGSIZE;
+    80200bfa:	03459793          	slli	a5,a1,0x34
+    80200bfe:	0347d493          	srli	s1,a5,0x34
+  pte_t *pte;
+  uint64 pa;
+  
+  pte = walk(kpt, va, 0);
+    80200c02:	4601                	li	a2,0
+    80200c04:	00000097          	auipc	ra,0x0
+    80200c08:	f04080e7          	jalr	-252(ra) # 80200b08 <walk>
+  if(pte == 0)
+    80200c0c:	cd09                	beqz	a0,80200c26 <kwalkaddr+0x36>
+    panic("kvmpa");
+  if((*pte & PTE_V) == 0)
+    80200c0e:	6108                	ld	a0,0(a0)
+    80200c10:	00157793          	andi	a5,a0,1
+    80200c14:	c38d                	beqz	a5,80200c36 <kwalkaddr+0x46>
+    panic("kvmpa");
+  pa = PTE2PA(*pte);
+    80200c16:	8129                	srli	a0,a0,0xa
+    80200c18:	0532                	slli	a0,a0,0xc
+  return pa+off;
+}
+    80200c1a:	9526                	add	a0,a0,s1
+    80200c1c:	60e2                	ld	ra,24(sp)
+    80200c1e:	6442                	ld	s0,16(sp)
+    80200c20:	64a2                	ld	s1,8(sp)
+    80200c22:	6105                	addi	sp,sp,32
+    80200c24:	8082                	ret
+    panic("kvmpa");
+    80200c26:	00008517          	auipc	a0,0x8
+    80200c2a:	7ea50513          	addi	a0,a0,2026 # 80209410 <digits+0x90>
+    80200c2e:	fffff097          	auipc	ra,0xfffff
+    80200c32:	516080e7          	jalr	1302(ra) # 80200144 <panic>
+    panic("kvmpa");
+    80200c36:	00008517          	auipc	a0,0x8
+    80200c3a:	7da50513          	addi	a0,a0,2010 # 80209410 <digits+0x90>
+    80200c3e:	fffff097          	auipc	ra,0xfffff
+    80200c42:	506080e7          	jalr	1286(ra) # 80200144 <panic>
+
+0000000080200c46 <kvmpa>:
+{
+    80200c46:	1141                	addi	sp,sp,-16
+    80200c48:	e406                	sd	ra,8(sp)
+    80200c4a:	e022                	sd	s0,0(sp)
+    80200c4c:	0800                	addi	s0,sp,16
+    80200c4e:	85aa                	mv	a1,a0
+  return kwalkaddr(kernel_pagetable, va);
+    80200c50:	00013517          	auipc	a0,0x13
+    80200c54:	40853503          	ld	a0,1032(a0) # 80214058 <kernel_pagetable>
+    80200c58:	00000097          	auipc	ra,0x0
+    80200c5c:	f98080e7          	jalr	-104(ra) # 80200bf0 <kwalkaddr>
+}
+    80200c60:	60a2                	ld	ra,8(sp)
+    80200c62:	6402                	ld	s0,0(sp)
+    80200c64:	0141                	addi	sp,sp,16
+    80200c66:	8082                	ret
+
+0000000080200c68 <mappages>:
+// physical addresses starting at pa. va and size might not
+// be page-aligned. Returns 0 on success, -1 if walk() couldn't
+// allocate a needed page-table page.
+int
+mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)
+{
+    80200c68:	715d                	addi	sp,sp,-80
+    80200c6a:	e486                	sd	ra,72(sp)
+    80200c6c:	e0a2                	sd	s0,64(sp)
+    80200c6e:	fc26                	sd	s1,56(sp)
+    80200c70:	f84a                	sd	s2,48(sp)
+    80200c72:	f44e                	sd	s3,40(sp)
+    80200c74:	f052                	sd	s4,32(sp)
+    80200c76:	ec56                	sd	s5,24(sp)
+    80200c78:	e85a                	sd	s6,16(sp)
+    80200c7a:	e45e                	sd	s7,8(sp)
+    80200c7c:	0880                	addi	s0,sp,80
+    80200c7e:	8aaa                	mv	s5,a0
+    80200c80:	8b3a                	mv	s6,a4
+  uint64 a, last;
+  pte_t *pte;
+
+  a = PGROUNDDOWN(va);
+    80200c82:	777d                	lui	a4,0xfffff
+    80200c84:	00e5f7b3          	and	a5,a1,a4
+  last = PGROUNDDOWN(va + size - 1);
+    80200c88:	fff60993          	addi	s3,a2,-1 # fff <_entry-0x801ff001>
+    80200c8c:	99ae                	add	s3,s3,a1
+    80200c8e:	00e9f9b3          	and	s3,s3,a4
+  a = PGROUNDDOWN(va);
+    80200c92:	893e                	mv	s2,a5
+    80200c94:	40f68a33          	sub	s4,a3,a5
+    if(*pte & PTE_V)
+      panic("remap");
+    *pte = PA2PTE(pa) | perm | PTE_V;
+    if(a == last)
+      break;
+    a += PGSIZE;
+    80200c98:	6b85                	lui	s7,0x1
+    80200c9a:	012a04b3          	add	s1,s4,s2
+    if((pte = walk(pagetable, a, 1)) == NULL)
+    80200c9e:	4605                	li	a2,1
+    80200ca0:	85ca                	mv	a1,s2
+    80200ca2:	8556                	mv	a0,s5
+    80200ca4:	00000097          	auipc	ra,0x0
+    80200ca8:	e64080e7          	jalr	-412(ra) # 80200b08 <walk>
+    80200cac:	c51d                	beqz	a0,80200cda <mappages+0x72>
+    if(*pte & PTE_V)
+    80200cae:	611c                	ld	a5,0(a0)
+    80200cb0:	8b85                	andi	a5,a5,1
+    80200cb2:	ef81                	bnez	a5,80200cca <mappages+0x62>
+    *pte = PA2PTE(pa) | perm | PTE_V;
+    80200cb4:	80b1                	srli	s1,s1,0xc
+    80200cb6:	04aa                	slli	s1,s1,0xa
+    80200cb8:	0164e4b3          	or	s1,s1,s6
+    80200cbc:	0014e493          	ori	s1,s1,1
+    80200cc0:	e104                	sd	s1,0(a0)
+    if(a == last)
+    80200cc2:	03390863          	beq	s2,s3,80200cf2 <mappages+0x8a>
+    a += PGSIZE;
+    80200cc6:	995e                	add	s2,s2,s7
+    if((pte = walk(pagetable, a, 1)) == NULL)
+    80200cc8:	bfc9                	j	80200c9a <mappages+0x32>
+      panic("remap");
+    80200cca:	00008517          	auipc	a0,0x8
+    80200cce:	74e50513          	addi	a0,a0,1870 # 80209418 <digits+0x98>
+    80200cd2:	fffff097          	auipc	ra,0xfffff
+    80200cd6:	472080e7          	jalr	1138(ra) # 80200144 <panic>
+      return -1;
+    80200cda:	557d                	li	a0,-1
+    pa += PGSIZE;
+  }
+  return 0;
+}
+    80200cdc:	60a6                	ld	ra,72(sp)
+    80200cde:	6406                	ld	s0,64(sp)
+    80200ce0:	74e2                	ld	s1,56(sp)
+    80200ce2:	7942                	ld	s2,48(sp)
+    80200ce4:	79a2                	ld	s3,40(sp)
+    80200ce6:	7a02                	ld	s4,32(sp)
+    80200ce8:	6ae2                	ld	s5,24(sp)
+    80200cea:	6b42                	ld	s6,16(sp)
+    80200cec:	6ba2                	ld	s7,8(sp)
+    80200cee:	6161                	addi	sp,sp,80
+    80200cf0:	8082                	ret
+  return 0;
+    80200cf2:	4501                	li	a0,0
+    80200cf4:	b7e5                	j	80200cdc <mappages+0x74>
+
+0000000080200cf6 <kvmmap>:
+{
+    80200cf6:	1141                	addi	sp,sp,-16
+    80200cf8:	e406                	sd	ra,8(sp)
+    80200cfa:	e022                	sd	s0,0(sp)
+    80200cfc:	0800                	addi	s0,sp,16
+    80200cfe:	8736                	mv	a4,a3
+  if(mappages(kernel_pagetable, va, sz, pa, perm) != 0)
+    80200d00:	86ae                	mv	a3,a1
+    80200d02:	85aa                	mv	a1,a0
+    80200d04:	00013517          	auipc	a0,0x13
+    80200d08:	35453503          	ld	a0,852(a0) # 80214058 <kernel_pagetable>
+    80200d0c:	00000097          	auipc	ra,0x0
+    80200d10:	f5c080e7          	jalr	-164(ra) # 80200c68 <mappages>
+    80200d14:	e509                	bnez	a0,80200d1e <kvmmap+0x28>
+}
+    80200d16:	60a2                	ld	ra,8(sp)
+    80200d18:	6402                	ld	s0,0(sp)
+    80200d1a:	0141                	addi	sp,sp,16
+    80200d1c:	8082                	ret
+    panic("kvmmap");
+    80200d1e:	00008517          	auipc	a0,0x8
+    80200d22:	70250513          	addi	a0,a0,1794 # 80209420 <digits+0xa0>
+    80200d26:	fffff097          	auipc	ra,0xfffff
+    80200d2a:	41e080e7          	jalr	1054(ra) # 80200144 <panic>
+
+0000000080200d2e <kvminit>:
+{
+    80200d2e:	1101                	addi	sp,sp,-32
+    80200d30:	ec06                	sd	ra,24(sp)
+    80200d32:	e822                	sd	s0,16(sp)
+    80200d34:	e426                	sd	s1,8(sp)
+    80200d36:	1000                	addi	s0,sp,32
+  kernel_pagetable = (pagetable_t) kalloc();
+    80200d38:	00000097          	auipc	ra,0x0
+    80200d3c:	822080e7          	jalr	-2014(ra) # 8020055a <kalloc>
+    80200d40:	00013717          	auipc	a4,0x13
+    80200d44:	30a73c23          	sd	a0,792(a4) # 80214058 <kernel_pagetable>
+  memset(kernel_pagetable, 0, PGSIZE);
+    80200d48:	6605                	lui	a2,0x1
+    80200d4a:	4581                	li	a1,0
+    80200d4c:	00000097          	auipc	ra,0x0
+    80200d50:	a16080e7          	jalr	-1514(ra) # 80200762 <memset>
+  kvmmap(UART_V, UART, PGSIZE, PTE_R | PTE_W);
+    80200d54:	4699                	li	a3,6
+    80200d56:	6605                	lui	a2,0x1
+    80200d58:	100005b7          	lui	a1,0x10000
+    80200d5c:	3f100513          	li	a0,1009
+    80200d60:	0572                	slli	a0,a0,0x1c
+    80200d62:	00000097          	auipc	ra,0x0
+    80200d66:	f94080e7          	jalr	-108(ra) # 80200cf6 <kvmmap>
+  kvmmap(VIRTIO0_V, VIRTIO0, PGSIZE, PTE_R | PTE_W);
+    80200d6a:	4699                	li	a3,6
+    80200d6c:	6605                	lui	a2,0x1
+    80200d6e:	100015b7          	lui	a1,0x10001
+    80200d72:	03f10537          	lui	a0,0x3f10
+    80200d76:	0505                	addi	a0,a0,1 # 3f10001 <_entry-0x7c2effff>
+    80200d78:	0532                	slli	a0,a0,0xc
+    80200d7a:	00000097          	auipc	ra,0x0
+    80200d7e:	f7c080e7          	jalr	-132(ra) # 80200cf6 <kvmmap>
+  kvmmap(CLINT_V, CLINT, 0x10000, PTE_R | PTE_W);
+    80200d82:	4699                	li	a3,6
+    80200d84:	6641                	lui	a2,0x10
+    80200d86:	020005b7          	lui	a1,0x2000
+    80200d8a:	01f81537          	lui	a0,0x1f81
+    80200d8e:	0536                	slli	a0,a0,0xd
+    80200d90:	00000097          	auipc	ra,0x0
+    80200d94:	f66080e7          	jalr	-154(ra) # 80200cf6 <kvmmap>
+  kvmmap(PLIC_V, PLIC, 0x4000, PTE_R | PTE_W);
+    80200d98:	4699                	li	a3,6
+    80200d9a:	6611                	lui	a2,0x4
+    80200d9c:	0c0005b7          	lui	a1,0xc000
+    80200da0:	00fc3537          	lui	a0,0xfc3
+    80200da4:	053a                	slli	a0,a0,0xe
+    80200da6:	00000097          	auipc	ra,0x0
+    80200daa:	f50080e7          	jalr	-176(ra) # 80200cf6 <kvmmap>
+  kvmmap(PLIC_V + 0x200000, PLIC + 0x200000, 0x4000, PTE_R | PTE_W);
+    80200dae:	4699                	li	a3,6
+    80200db0:	6611                	lui	a2,0x4
+    80200db2:	0c2005b7          	lui	a1,0xc200
+    80200db6:	1f861537          	lui	a0,0x1f861
+    80200dba:	0526                	slli	a0,a0,0x9
+    80200dbc:	00000097          	auipc	ra,0x0
+    80200dc0:	f3a080e7          	jalr	-198(ra) # 80200cf6 <kvmmap>
+  kvmmap(KERNBASE, KERNBASE, (uint64)etext - KERNBASE, PTE_R | PTE_X);
+    80200dc4:	0000b497          	auipc	s1,0xb
+    80200dc8:	f344b483          	ld	s1,-204(s1) # 8020bcf8 <_GLOBAL_OFFSET_TABLE_+0x20>
+    80200dcc:	46a9                	li	a3,10
+    80200dce:	bff00613          	li	a2,-1025
+    80200dd2:	0656                	slli	a2,a2,0x15
+    80200dd4:	9626                	add	a2,a2,s1
+    80200dd6:	40100593          	li	a1,1025
+    80200dda:	05d6                	slli	a1,a1,0x15
+    80200ddc:	852e                	mv	a0,a1
+    80200dde:	00000097          	auipc	ra,0x0
+    80200de2:	f18080e7          	jalr	-232(ra) # 80200cf6 <kvmmap>
+  kvmmap((uint64)etext, (uint64)etext, PHYSTOP - (uint64)etext, PTE_R | PTE_W);
+    80200de6:	4699                	li	a3,6
+    80200de8:	40300613          	li	a2,1027
+    80200dec:	0656                	slli	a2,a2,0x15
+    80200dee:	8e05                	sub	a2,a2,s1
+    80200df0:	85a6                	mv	a1,s1
+    80200df2:	8526                	mv	a0,s1
+    80200df4:	00000097          	auipc	ra,0x0
+    80200df8:	f02080e7          	jalr	-254(ra) # 80200cf6 <kvmmap>
+  kvmmap(TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X);
+    80200dfc:	46a9                	li	a3,10
+    80200dfe:	6605                	lui	a2,0x1
+    80200e00:	0000b597          	auipc	a1,0xb
+    80200e04:	ee05b583          	ld	a1,-288(a1) # 8020bce0 <_GLOBAL_OFFSET_TABLE_+0x8>
+    80200e08:	04000537          	lui	a0,0x4000
+    80200e0c:	157d                	addi	a0,a0,-1 # 3ffffff <_entry-0x7c200001>
+    80200e0e:	0532                	slli	a0,a0,0xc
+    80200e10:	00000097          	auipc	ra,0x0
+    80200e14:	ee6080e7          	jalr	-282(ra) # 80200cf6 <kvmmap>
+}
+    80200e18:	60e2                	ld	ra,24(sp)
+    80200e1a:	6442                	ld	s0,16(sp)
+    80200e1c:	64a2                	ld	s1,8(sp)
+    80200e1e:	6105                	addi	sp,sp,32
+    80200e20:	8082                	ret
+
+0000000080200e22 <vmunmap>:
+// Remove npages of mappings starting from va. va must be
+// page-aligned. The mappings must exist.
+// Optionally free the physical memory.
+void
+vmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free)
+{
+    80200e22:	715d                	addi	sp,sp,-80
+    80200e24:	e486                	sd	ra,72(sp)
+    80200e26:	e0a2                	sd	s0,64(sp)
+    80200e28:	fc26                	sd	s1,56(sp)
+    80200e2a:	f84a                	sd	s2,48(sp)
+    80200e2c:	f44e                	sd	s3,40(sp)
+    80200e2e:	f052                	sd	s4,32(sp)
+    80200e30:	ec56                	sd	s5,24(sp)
+    80200e32:	e85a                	sd	s6,16(sp)
+    80200e34:	e45e                	sd	s7,8(sp)
+    80200e36:	0880                	addi	s0,sp,80
+  uint64 a;
+  pte_t *pte;
+
+  if((va % PGSIZE) != 0)
+    80200e38:	03459793          	slli	a5,a1,0x34
+    80200e3c:	e795                	bnez	a5,80200e68 <vmunmap+0x46>
+    80200e3e:	8a2a                	mv	s4,a0
+    80200e40:	892e                	mv	s2,a1
+    80200e42:	8ab6                	mv	s5,a3
+    panic("vmunmap: not aligned");
+
+  for(a = va; a < va + npages*PGSIZE; a += PGSIZE){
+    80200e44:	0632                	slli	a2,a2,0xc
+    80200e46:	00b609b3          	add	s3,a2,a1
+    if((pte = walk(pagetable, a, 0)) == 0)
+      panic("vmunmap: walk");
+    if((*pte & PTE_V) == 0)
+      panic("vmunmap: not mapped");
+    if(PTE_FLAGS(*pte) == PTE_V)
+    80200e4a:	4b85                	li	s7,1
+  for(a = va; a < va + npages*PGSIZE; a += PGSIZE){
+    80200e4c:	6b05                	lui	s6,0x1
+    80200e4e:	0735e263          	bltu	a1,s3,80200eb2 <vmunmap+0x90>
+      uint64 pa = PTE2PA(*pte);
+      kfree((void*)pa);
+    }
+    *pte = 0;
+  }
+}
+    80200e52:	60a6                	ld	ra,72(sp)
+    80200e54:	6406                	ld	s0,64(sp)
+    80200e56:	74e2                	ld	s1,56(sp)
+    80200e58:	7942                	ld	s2,48(sp)
+    80200e5a:	79a2                	ld	s3,40(sp)
+    80200e5c:	7a02                	ld	s4,32(sp)
+    80200e5e:	6ae2                	ld	s5,24(sp)
+    80200e60:	6b42                	ld	s6,16(sp)
+    80200e62:	6ba2                	ld	s7,8(sp)
+    80200e64:	6161                	addi	sp,sp,80
+    80200e66:	8082                	ret
+    panic("vmunmap: not aligned");
+    80200e68:	00008517          	auipc	a0,0x8
+    80200e6c:	5c050513          	addi	a0,a0,1472 # 80209428 <digits+0xa8>
+    80200e70:	fffff097          	auipc	ra,0xfffff
+    80200e74:	2d4080e7          	jalr	724(ra) # 80200144 <panic>
+      panic("vmunmap: walk");
+    80200e78:	00008517          	auipc	a0,0x8
+    80200e7c:	5c850513          	addi	a0,a0,1480 # 80209440 <digits+0xc0>
+    80200e80:	fffff097          	auipc	ra,0xfffff
+    80200e84:	2c4080e7          	jalr	708(ra) # 80200144 <panic>
+      panic("vmunmap: not mapped");
+    80200e88:	00008517          	auipc	a0,0x8
+    80200e8c:	5c850513          	addi	a0,a0,1480 # 80209450 <digits+0xd0>
+    80200e90:	fffff097          	auipc	ra,0xfffff
+    80200e94:	2b4080e7          	jalr	692(ra) # 80200144 <panic>
+      panic("vmunmap: not a leaf");
+    80200e98:	00008517          	auipc	a0,0x8
+    80200e9c:	5d050513          	addi	a0,a0,1488 # 80209468 <digits+0xe8>
+    80200ea0:	fffff097          	auipc	ra,0xfffff
+    80200ea4:	2a4080e7          	jalr	676(ra) # 80200144 <panic>
+    *pte = 0;
+    80200ea8:	0004b023          	sd	zero,0(s1)
+  for(a = va; a < va + npages*PGSIZE; a += PGSIZE){
+    80200eac:	995a                	add	s2,s2,s6
+    80200eae:	fb3972e3          	bgeu	s2,s3,80200e52 <vmunmap+0x30>
+    if((pte = walk(pagetable, a, 0)) == 0)
+    80200eb2:	4601                	li	a2,0
+    80200eb4:	85ca                	mv	a1,s2
+    80200eb6:	8552                	mv	a0,s4
+    80200eb8:	00000097          	auipc	ra,0x0
+    80200ebc:	c50080e7          	jalr	-944(ra) # 80200b08 <walk>
+    80200ec0:	84aa                	mv	s1,a0
+    80200ec2:	d95d                	beqz	a0,80200e78 <vmunmap+0x56>
+    if((*pte & PTE_V) == 0)
+    80200ec4:	6108                	ld	a0,0(a0)
+    80200ec6:	00157793          	andi	a5,a0,1
+    80200eca:	dfdd                	beqz	a5,80200e88 <vmunmap+0x66>
+    if(PTE_FLAGS(*pte) == PTE_V)
+    80200ecc:	3ff57793          	andi	a5,a0,1023
+    80200ed0:	fd7784e3          	beq	a5,s7,80200e98 <vmunmap+0x76>
+    if(do_free){
+    80200ed4:	fc0a8ae3          	beqz	s5,80200ea8 <vmunmap+0x86>
+      uint64 pa = PTE2PA(*pte);
+    80200ed8:	8129                	srli	a0,a0,0xa
+      kfree((void*)pa);
+    80200eda:	0532                	slli	a0,a0,0xc
+    80200edc:	fffff097          	auipc	ra,0xfffff
+    80200ee0:	564080e7          	jalr	1380(ra) # 80200440 <kfree>
+    80200ee4:	b7d1                	j	80200ea8 <vmunmap+0x86>
+
+0000000080200ee6 <uvmcreate>:
+
+// create an empty user page table.
+// returns 0 if out of memory.
+pagetable_t
+uvmcreate()
+{
+    80200ee6:	1101                	addi	sp,sp,-32
+    80200ee8:	ec06                	sd	ra,24(sp)
+    80200eea:	e822                	sd	s0,16(sp)
+    80200eec:	e426                	sd	s1,8(sp)
+    80200eee:	1000                	addi	s0,sp,32
+  pagetable_t pagetable;
+  pagetable = (pagetable_t) kalloc();
+    80200ef0:	fffff097          	auipc	ra,0xfffff
+    80200ef4:	66a080e7          	jalr	1642(ra) # 8020055a <kalloc>
+    80200ef8:	84aa                	mv	s1,a0
+  if(pagetable == NULL)
+    80200efa:	c519                	beqz	a0,80200f08 <uvmcreate+0x22>
+    return NULL;
+  memset(pagetable, 0, PGSIZE);
+    80200efc:	6605                	lui	a2,0x1
+    80200efe:	4581                	li	a1,0
+    80200f00:	00000097          	auipc	ra,0x0
+    80200f04:	862080e7          	jalr	-1950(ra) # 80200762 <memset>
+  return pagetable;
+}
+    80200f08:	8526                	mv	a0,s1
+    80200f0a:	60e2                	ld	ra,24(sp)
+    80200f0c:	6442                	ld	s0,16(sp)
+    80200f0e:	64a2                	ld	s1,8(sp)
+    80200f10:	6105                	addi	sp,sp,32
+    80200f12:	8082                	ret
+
+0000000080200f14 <uvminit>:
+// Load the user initcode into address 0 of pagetable,
+// for the very first process.
+// sz must be less than a page.
+void
+uvminit(pagetable_t pagetable, pagetable_t kpagetable, uchar *src, uint sz)
+{
+    80200f14:	7139                	addi	sp,sp,-64
+    80200f16:	fc06                	sd	ra,56(sp)
+    80200f18:	f822                	sd	s0,48(sp)
+    80200f1a:	f426                	sd	s1,40(sp)
+    80200f1c:	f04a                	sd	s2,32(sp)
+    80200f1e:	ec4e                	sd	s3,24(sp)
+    80200f20:	e852                	sd	s4,16(sp)
+    80200f22:	e456                	sd	s5,8(sp)
+    80200f24:	0080                	addi	s0,sp,64
+  char *mem;
+
+  if(sz >= PGSIZE)
+    80200f26:	6785                	lui	a5,0x1
+    80200f28:	06f6f363          	bgeu	a3,a5,80200f8e <uvminit+0x7a>
+    80200f2c:	8aaa                	mv	s5,a0
+    80200f2e:	8a2e                	mv	s4,a1
+    80200f30:	89b2                	mv	s3,a2
+    80200f32:	8936                	mv	s2,a3
+    panic("inituvm: more than a page");
+  mem = kalloc();
+    80200f34:	fffff097          	auipc	ra,0xfffff
+    80200f38:	626080e7          	jalr	1574(ra) # 8020055a <kalloc>
+    80200f3c:	84aa                	mv	s1,a0
+  // printf("[uvminit]kalloc: %p\n", mem);
+  memset(mem, 0, PGSIZE);
+    80200f3e:	6605                	lui	a2,0x1
+    80200f40:	4581                	li	a1,0
+    80200f42:	00000097          	auipc	ra,0x0
+    80200f46:	820080e7          	jalr	-2016(ra) # 80200762 <memset>
+  mappages(pagetable, 0, PGSIZE, (uint64)mem, PTE_W|PTE_R|PTE_X|PTE_U);
+    80200f4a:	4779                	li	a4,30
+    80200f4c:	86a6                	mv	a3,s1
+    80200f4e:	6605                	lui	a2,0x1
+    80200f50:	4581                	li	a1,0
+    80200f52:	8556                	mv	a0,s5
+    80200f54:	00000097          	auipc	ra,0x0
+    80200f58:	d14080e7          	jalr	-748(ra) # 80200c68 <mappages>
+  mappages(kpagetable, 0, PGSIZE, (uint64)mem, PTE_W|PTE_R|PTE_X);
+    80200f5c:	4739                	li	a4,14
+    80200f5e:	86a6                	mv	a3,s1
+    80200f60:	6605                	lui	a2,0x1
+    80200f62:	4581                	li	a1,0
+    80200f64:	8552                	mv	a0,s4
+    80200f66:	00000097          	auipc	ra,0x0
+    80200f6a:	d02080e7          	jalr	-766(ra) # 80200c68 <mappages>
+  memmove(mem, src, sz);
+    80200f6e:	864a                	mv	a2,s2
+    80200f70:	85ce                	mv	a1,s3
+    80200f72:	8526                	mv	a0,s1
+    80200f74:	00000097          	auipc	ra,0x0
+    80200f78:	84a080e7          	jalr	-1974(ra) # 802007be <memmove>
+  // for (int i = 0; i < sz; i ++) {
+  //   printf("[uvminit]mem: %p, %x\n", mem + i, mem[i]);
+  // }
+}
+    80200f7c:	70e2                	ld	ra,56(sp)
+    80200f7e:	7442                	ld	s0,48(sp)
+    80200f80:	74a2                	ld	s1,40(sp)
+    80200f82:	7902                	ld	s2,32(sp)
+    80200f84:	69e2                	ld	s3,24(sp)
+    80200f86:	6a42                	ld	s4,16(sp)
+    80200f88:	6aa2                	ld	s5,8(sp)
+    80200f8a:	6121                	addi	sp,sp,64
+    80200f8c:	8082                	ret
+    panic("inituvm: more than a page");
+    80200f8e:	00008517          	auipc	a0,0x8
+    80200f92:	4f250513          	addi	a0,a0,1266 # 80209480 <digits+0x100>
+    80200f96:	fffff097          	auipc	ra,0xfffff
+    80200f9a:	1ae080e7          	jalr	430(ra) # 80200144 <panic>
+
+0000000080200f9e <uvmdealloc>:
+// newsz.  oldsz and newsz need not be page-aligned, nor does newsz
+// need to be less than oldsz.  oldsz can be larger than the actual
+// process size.  Returns the new process size.
+uint64
+uvmdealloc(pagetable_t pagetable, pagetable_t kpagetable, uint64 oldsz, uint64 newsz)
+{
+    80200f9e:	7179                	addi	sp,sp,-48
+    80200fa0:	f406                	sd	ra,40(sp)
+    80200fa2:	f022                	sd	s0,32(sp)
+    80200fa4:	ec26                	sd	s1,24(sp)
+    80200fa6:	e84a                	sd	s2,16(sp)
+    80200fa8:	e44e                	sd	s3,8(sp)
+    80200faa:	e052                	sd	s4,0(sp)
+    80200fac:	1800                	addi	s0,sp,48
+  if(newsz >= oldsz)
+    return oldsz;
+    80200fae:	8932                	mv	s2,a2
+  if(newsz >= oldsz)
+    80200fb0:	02c6f063          	bgeu	a3,a2,80200fd0 <uvmdealloc+0x32>
+    80200fb4:	89aa                	mv	s3,a0
+    80200fb6:	852e                	mv	a0,a1
+    80200fb8:	8936                	mv	s2,a3
+
+  if(PGROUNDUP(newsz) < PGROUNDUP(oldsz)){
+    80200fba:	6785                	lui	a5,0x1
+    80200fbc:	17fd                	addi	a5,a5,-1 # fff <_entry-0x801ff001>
+    80200fbe:	00f68a33          	add	s4,a3,a5
+    80200fc2:	777d                	lui	a4,0xfffff
+    80200fc4:	00ea7a33          	and	s4,s4,a4
+    80200fc8:	963e                	add	a2,a2,a5
+    80200fca:	8e79                	and	a2,a2,a4
+    80200fcc:	00ca6b63          	bltu	s4,a2,80200fe2 <uvmdealloc+0x44>
+    vmunmap(kpagetable, PGROUNDUP(newsz), npages, 0);
+    vmunmap(pagetable, PGROUNDUP(newsz), npages, 1);
+  }
+
+  return newsz;
+}
+    80200fd0:	854a                	mv	a0,s2
+    80200fd2:	70a2                	ld	ra,40(sp)
+    80200fd4:	7402                	ld	s0,32(sp)
+    80200fd6:	64e2                	ld	s1,24(sp)
+    80200fd8:	6942                	ld	s2,16(sp)
+    80200fda:	69a2                	ld	s3,8(sp)
+    80200fdc:	6a02                	ld	s4,0(sp)
+    80200fde:	6145                	addi	sp,sp,48
+    80200fe0:	8082                	ret
+    int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE;
+    80200fe2:	414604b3          	sub	s1,a2,s4
+    80200fe6:	80b1                	srli	s1,s1,0xc
+    vmunmap(kpagetable, PGROUNDUP(newsz), npages, 0);
+    80200fe8:	2481                	sext.w	s1,s1
+    80200fea:	4681                	li	a3,0
+    80200fec:	8626                	mv	a2,s1
+    80200fee:	85d2                	mv	a1,s4
+    80200ff0:	00000097          	auipc	ra,0x0
+    80200ff4:	e32080e7          	jalr	-462(ra) # 80200e22 <vmunmap>
+    vmunmap(pagetable, PGROUNDUP(newsz), npages, 1);
+    80200ff8:	4685                	li	a3,1
+    80200ffa:	8626                	mv	a2,s1
+    80200ffc:	85d2                	mv	a1,s4
+    80200ffe:	854e                	mv	a0,s3
+    80201000:	00000097          	auipc	ra,0x0
+    80201004:	e22080e7          	jalr	-478(ra) # 80200e22 <vmunmap>
+    80201008:	b7e1                	j	80200fd0 <uvmdealloc+0x32>
+
+000000008020100a <uvmalloc>:
+  if(newsz < oldsz)
+    8020100a:	0ec6e763          	bltu	a3,a2,802010f8 <uvmalloc+0xee>
+{
+    8020100e:	7139                	addi	sp,sp,-64
+    80201010:	fc06                	sd	ra,56(sp)
+    80201012:	f822                	sd	s0,48(sp)
+    80201014:	f426                	sd	s1,40(sp)
+    80201016:	f04a                	sd	s2,32(sp)
+    80201018:	ec4e                	sd	s3,24(sp)
+    8020101a:	e852                	sd	s4,16(sp)
+    8020101c:	e456                	sd	s5,8(sp)
+    8020101e:	e05a                	sd	s6,0(sp)
+    80201020:	0080                	addi	s0,sp,64
+    80201022:	8a2a                	mv	s4,a0
+    80201024:	8aae                	mv	s5,a1
+    80201026:	8b36                	mv	s6,a3
+  oldsz = PGROUNDUP(oldsz);
+    80201028:	6785                	lui	a5,0x1
+    8020102a:	17fd                	addi	a5,a5,-1 # fff <_entry-0x801ff001>
+    8020102c:	963e                	add	a2,a2,a5
+    8020102e:	77fd                	lui	a5,0xfffff
+    80201030:	00f679b3          	and	s3,a2,a5
+  for(a = oldsz; a < newsz; a += PGSIZE){
+    80201034:	0cd9f463          	bgeu	s3,a3,802010fc <uvmalloc+0xf2>
+    80201038:	894e                	mv	s2,s3
+    mem = kalloc();
+    8020103a:	fffff097          	auipc	ra,0xfffff
+    8020103e:	520080e7          	jalr	1312(ra) # 8020055a <kalloc>
+    80201042:	84aa                	mv	s1,a0
+    if(mem == NULL){
+    80201044:	c129                	beqz	a0,80201086 <uvmalloc+0x7c>
+    memset(mem, 0, PGSIZE);
+    80201046:	6605                	lui	a2,0x1
+    80201048:	4581                	li	a1,0
+    8020104a:	fffff097          	auipc	ra,0xfffff
+    8020104e:	718080e7          	jalr	1816(ra) # 80200762 <memset>
+    if (mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_W|PTE_X|PTE_R|PTE_U) != 0) {
+    80201052:	4779                	li	a4,30
+    80201054:	86a6                	mv	a3,s1
+    80201056:	6605                	lui	a2,0x1
+    80201058:	85ca                	mv	a1,s2
+    8020105a:	8552                	mv	a0,s4
+    8020105c:	00000097          	auipc	ra,0x0
+    80201060:	c0c080e7          	jalr	-1012(ra) # 80200c68 <mappages>
+    80201064:	e521                	bnez	a0,802010ac <uvmalloc+0xa2>
+    if (mappages(kpagetable, a, PGSIZE, (uint64)mem, PTE_W|PTE_X|PTE_R) != 0){
+    80201066:	4739                	li	a4,14
+    80201068:	86a6                	mv	a3,s1
+    8020106a:	6605                	lui	a2,0x1
+    8020106c:	85ca                	mv	a1,s2
+    8020106e:	8556                	mv	a0,s5
+    80201070:	00000097          	auipc	ra,0x0
+    80201074:	bf8080e7          	jalr	-1032(ra) # 80200c68 <mappages>
+    80201078:	e929                	bnez	a0,802010ca <uvmalloc+0xc0>
+  for(a = oldsz; a < newsz; a += PGSIZE){
+    8020107a:	6785                	lui	a5,0x1
+    8020107c:	993e                	add	s2,s2,a5
+    8020107e:	fb696ee3          	bltu	s2,s6,8020103a <uvmalloc+0x30>
+  return newsz;
+    80201082:	855a                	mv	a0,s6
+    80201084:	a811                	j	80201098 <uvmalloc+0x8e>
+      uvmdealloc(pagetable, kpagetable, a, oldsz);
+    80201086:	86ce                	mv	a3,s3
+    80201088:	864a                	mv	a2,s2
+    8020108a:	85d6                	mv	a1,s5
+    8020108c:	8552                	mv	a0,s4
+    8020108e:	00000097          	auipc	ra,0x0
+    80201092:	f10080e7          	jalr	-240(ra) # 80200f9e <uvmdealloc>
+      return 0;
+    80201096:	4501                	li	a0,0
+}
+    80201098:	70e2                	ld	ra,56(sp)
+    8020109a:	7442                	ld	s0,48(sp)
+    8020109c:	74a2                	ld	s1,40(sp)
+    8020109e:	7902                	ld	s2,32(sp)
+    802010a0:	69e2                	ld	s3,24(sp)
+    802010a2:	6a42                	ld	s4,16(sp)
+    802010a4:	6aa2                	ld	s5,8(sp)
+    802010a6:	6b02                	ld	s6,0(sp)
+    802010a8:	6121                	addi	sp,sp,64
+    802010aa:	8082                	ret
+      kfree(mem);
+    802010ac:	8526                	mv	a0,s1
+    802010ae:	fffff097          	auipc	ra,0xfffff
+    802010b2:	392080e7          	jalr	914(ra) # 80200440 <kfree>
+      uvmdealloc(pagetable, kpagetable, a, oldsz);
+    802010b6:	86ce                	mv	a3,s3
+    802010b8:	864a                	mv	a2,s2
+    802010ba:	85d6                	mv	a1,s5
+    802010bc:	8552                	mv	a0,s4
+    802010be:	00000097          	auipc	ra,0x0
+    802010c2:	ee0080e7          	jalr	-288(ra) # 80200f9e <uvmdealloc>
+      return 0;
+    802010c6:	4501                	li	a0,0
+    802010c8:	bfc1                	j	80201098 <uvmalloc+0x8e>
+      int npages = (a - oldsz) / PGSIZE;
+    802010ca:	41390633          	sub	a2,s2,s3
+    802010ce:	8231                	srli	a2,a2,0xc
+    802010d0:	0006049b          	sext.w	s1,a2
+      vmunmap(pagetable, oldsz, npages + 1, 1);   // plus the page allocated above.
+    802010d4:	4685                	li	a3,1
+    802010d6:	2605                	addiw	a2,a2,1 # 1001 <_entry-0x801fefff>
+    802010d8:	85ce                	mv	a1,s3
+    802010da:	8552                	mv	a0,s4
+    802010dc:	00000097          	auipc	ra,0x0
+    802010e0:	d46080e7          	jalr	-698(ra) # 80200e22 <vmunmap>
+      vmunmap(kpagetable, oldsz, npages, 0);
+    802010e4:	4681                	li	a3,0
+    802010e6:	8626                	mv	a2,s1
+    802010e8:	85ce                	mv	a1,s3
+    802010ea:	8556                	mv	a0,s5
+    802010ec:	00000097          	auipc	ra,0x0
+    802010f0:	d36080e7          	jalr	-714(ra) # 80200e22 <vmunmap>
+      return 0;
+    802010f4:	4501                	li	a0,0
+    802010f6:	b74d                	j	80201098 <uvmalloc+0x8e>
+    return oldsz;
+    802010f8:	8532                	mv	a0,a2
+}
+    802010fa:	8082                	ret
+  return newsz;
+    802010fc:	8536                	mv	a0,a3
+    802010fe:	bf69                	j	80201098 <uvmalloc+0x8e>
+
+0000000080201100 <freewalk>:
+
+// Recursively free page-table pages.
+// All leaf mappings must already have been removed.
+void
+freewalk(pagetable_t pagetable)
+{
+    80201100:	7179                	addi	sp,sp,-48
+    80201102:	f406                	sd	ra,40(sp)
+    80201104:	f022                	sd	s0,32(sp)
+    80201106:	ec26                	sd	s1,24(sp)
+    80201108:	e84a                	sd	s2,16(sp)
+    8020110a:	e44e                	sd	s3,8(sp)
+    8020110c:	e052                	sd	s4,0(sp)
+    8020110e:	1800                	addi	s0,sp,48
+    80201110:	8a2a                	mv	s4,a0
+  // there are 2^9 = 512 PTEs in a page table.
+  for(int i = 0; i < 512; i++){
+    80201112:	84aa                	mv	s1,a0
+    80201114:	6905                	lui	s2,0x1
+    80201116:	992a                	add	s2,s2,a0
+    pte_t pte = pagetable[i];
+    if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){
+    80201118:	4985                	li	s3,1
+    8020111a:	a829                	j	80201134 <freewalk+0x34>
+      // this PTE points to a lower-level page table.
+      uint64 child = PTE2PA(pte);
+    8020111c:	83a9                	srli	a5,a5,0xa
+      freewalk((pagetable_t)child);
+    8020111e:	00c79513          	slli	a0,a5,0xc
+    80201122:	00000097          	auipc	ra,0x0
+    80201126:	fde080e7          	jalr	-34(ra) # 80201100 <freewalk>
+      pagetable[i] = 0;
+    8020112a:	0004b023          	sd	zero,0(s1)
+  for(int i = 0; i < 512; i++){
+    8020112e:	04a1                	addi	s1,s1,8
+    80201130:	03248163          	beq	s1,s2,80201152 <freewalk+0x52>
+    pte_t pte = pagetable[i];
+    80201134:	609c                	ld	a5,0(s1)
+    if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){
+    80201136:	00f7f713          	andi	a4,a5,15
+    8020113a:	ff3701e3          	beq	a4,s3,8020111c <freewalk+0x1c>
+    } else if(pte & PTE_V){
+    8020113e:	8b85                	andi	a5,a5,1
+    80201140:	d7fd                	beqz	a5,8020112e <freewalk+0x2e>
+      panic("freewalk: leaf");
+    80201142:	00008517          	auipc	a0,0x8
+    80201146:	35e50513          	addi	a0,a0,862 # 802094a0 <digits+0x120>
+    8020114a:	fffff097          	auipc	ra,0xfffff
+    8020114e:	ffa080e7          	jalr	-6(ra) # 80200144 <panic>
+    }
+  }
+  kfree((void*)pagetable);
+    80201152:	8552                	mv	a0,s4
+    80201154:	fffff097          	auipc	ra,0xfffff
+    80201158:	2ec080e7          	jalr	748(ra) # 80200440 <kfree>
+}
+    8020115c:	70a2                	ld	ra,40(sp)
+    8020115e:	7402                	ld	s0,32(sp)
+    80201160:	64e2                	ld	s1,24(sp)
+    80201162:	6942                	ld	s2,16(sp)
+    80201164:	69a2                	ld	s3,8(sp)
+    80201166:	6a02                	ld	s4,0(sp)
+    80201168:	6145                	addi	sp,sp,48
+    8020116a:	8082                	ret
+
+000000008020116c <uvmfree>:
+
+// Free user memory pages,
+// then free page-table pages.
+void
+uvmfree(pagetable_t pagetable, uint64 sz)
+{
+    8020116c:	1101                	addi	sp,sp,-32
+    8020116e:	ec06                	sd	ra,24(sp)
+    80201170:	e822                	sd	s0,16(sp)
+    80201172:	e426                	sd	s1,8(sp)
+    80201174:	1000                	addi	s0,sp,32
+    80201176:	84aa                	mv	s1,a0
+  if(sz > 0)
+    80201178:	e999                	bnez	a1,8020118e <uvmfree+0x22>
+    vmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1);
+  freewalk(pagetable);
+    8020117a:	8526                	mv	a0,s1
+    8020117c:	00000097          	auipc	ra,0x0
+    80201180:	f84080e7          	jalr	-124(ra) # 80201100 <freewalk>
+}
+    80201184:	60e2                	ld	ra,24(sp)
+    80201186:	6442                	ld	s0,16(sp)
+    80201188:	64a2                	ld	s1,8(sp)
+    8020118a:	6105                	addi	sp,sp,32
+    8020118c:	8082                	ret
+    vmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1);
+    8020118e:	6785                	lui	a5,0x1
+    80201190:	17fd                	addi	a5,a5,-1 # fff <_entry-0x801ff001>
+    80201192:	95be                	add	a1,a1,a5
+    80201194:	4685                	li	a3,1
+    80201196:	00c5d613          	srli	a2,a1,0xc
+    8020119a:	4581                	li	a1,0
+    8020119c:	00000097          	auipc	ra,0x0
+    802011a0:	c86080e7          	jalr	-890(ra) # 80200e22 <vmunmap>
+    802011a4:	bfd9                	j	8020117a <uvmfree+0xe>
+
+00000000802011a6 <uvmcopy>:
+  pte_t *pte;
+  uint64 pa, i = 0, ki = 0;
+  uint flags;
+  char *mem;
+
+  while (i < sz){
+    802011a6:	10068563          	beqz	a3,802012b0 <uvmcopy+0x10a>
+{
+    802011aa:	715d                	addi	sp,sp,-80
+    802011ac:	e486                	sd	ra,72(sp)
+    802011ae:	e0a2                	sd	s0,64(sp)
+    802011b0:	fc26                	sd	s1,56(sp)
+    802011b2:	f84a                	sd	s2,48(sp)
+    802011b4:	f44e                	sd	s3,40(sp)
+    802011b6:	f052                	sd	s4,32(sp)
+    802011b8:	ec56                	sd	s5,24(sp)
+    802011ba:	e85a                	sd	s6,16(sp)
+    802011bc:	e45e                	sd	s7,8(sp)
+    802011be:	e062                	sd	s8,0(sp)
+    802011c0:	0880                	addi	s0,sp,80
+    802011c2:	8baa                	mv	s7,a0
+    802011c4:	8a2e                	mv	s4,a1
+    802011c6:	8b32                	mv	s6,a2
+    802011c8:	8ab6                	mv	s5,a3
+  uint64 pa, i = 0, ki = 0;
+    802011ca:	4981                	li	s3,0
+    802011cc:	a011                	j	802011d0 <uvmcopy+0x2a>
+    memmove(mem, (char*)pa, PGSIZE);
+    if(mappages(new, i, PGSIZE, (uint64)mem, flags) != 0) {
+      kfree(mem);
+      goto err;
+    }
+    i += PGSIZE;
+    802011ce:	89e2                	mv	s3,s8
+    if((pte = walk(old, i, 0)) == NULL)
+    802011d0:	4601                	li	a2,0
+    802011d2:	85ce                	mv	a1,s3
+    802011d4:	855e                	mv	a0,s7
+    802011d6:	00000097          	auipc	ra,0x0
+    802011da:	932080e7          	jalr	-1742(ra) # 80200b08 <walk>
+    802011de:	c135                	beqz	a0,80201242 <uvmcopy+0x9c>
+    if((*pte & PTE_V) == 0)
+    802011e0:	6118                	ld	a4,0(a0)
+    802011e2:	00177793          	andi	a5,a4,1
+    802011e6:	c7b5                	beqz	a5,80201252 <uvmcopy+0xac>
+    pa = PTE2PA(*pte);
+    802011e8:	00a75593          	srli	a1,a4,0xa
+    802011ec:	00c59c13          	slli	s8,a1,0xc
+    flags = PTE_FLAGS(*pte);
+    802011f0:	3ff77493          	andi	s1,a4,1023
+    if((mem = kalloc()) == NULL)
+    802011f4:	fffff097          	auipc	ra,0xfffff
+    802011f8:	366080e7          	jalr	870(ra) # 8020055a <kalloc>
+    802011fc:	892a                	mv	s2,a0
+    802011fe:	c92d                	beqz	a0,80201270 <uvmcopy+0xca>
+    memmove(mem, (char*)pa, PGSIZE);
+    80201200:	6605                	lui	a2,0x1
+    80201202:	85e2                	mv	a1,s8
+    80201204:	fffff097          	auipc	ra,0xfffff
+    80201208:	5ba080e7          	jalr	1466(ra) # 802007be <memmove>
+    if(mappages(new, i, PGSIZE, (uint64)mem, flags) != 0) {
+    8020120c:	2481                	sext.w	s1,s1
+    8020120e:	8726                	mv	a4,s1
+    80201210:	86ca                	mv	a3,s2
+    80201212:	6605                	lui	a2,0x1
+    80201214:	85ce                	mv	a1,s3
+    80201216:	8552                	mv	a0,s4
+    80201218:	00000097          	auipc	ra,0x0
+    8020121c:	a50080e7          	jalr	-1456(ra) # 80200c68 <mappages>
+    80201220:	e129                	bnez	a0,80201262 <uvmcopy+0xbc>
+    i += PGSIZE;
+    80201222:	6c05                	lui	s8,0x1
+    80201224:	9c4e                	add	s8,s8,s3
+    if(mappages(knew, ki, PGSIZE, (uint64)mem, flags & ~PTE_U) != 0){
+    80201226:	3ef4f713          	andi	a4,s1,1007
+    8020122a:	86ca                	mv	a3,s2
+    8020122c:	6605                	lui	a2,0x1
+    8020122e:	85ce                	mv	a1,s3
+    80201230:	855a                	mv	a0,s6
+    80201232:	00000097          	auipc	ra,0x0
+    80201236:	a36080e7          	jalr	-1482(ra) # 80200c68 <mappages>
+    8020123a:	ed05                	bnez	a0,80201272 <uvmcopy+0xcc>
+  while (i < sz){
+    8020123c:	f95c69e3          	bltu	s8,s5,802011ce <uvmcopy+0x28>
+    80201240:	a8a1                	j	80201298 <uvmcopy+0xf2>
+      panic("uvmcopy: pte should exist");
+    80201242:	00008517          	auipc	a0,0x8
+    80201246:	26e50513          	addi	a0,a0,622 # 802094b0 <digits+0x130>
+    8020124a:	fffff097          	auipc	ra,0xfffff
+    8020124e:	efa080e7          	jalr	-262(ra) # 80200144 <panic>
+      panic("uvmcopy: page not present");
+    80201252:	00008517          	auipc	a0,0x8
+    80201256:	27e50513          	addi	a0,a0,638 # 802094d0 <digits+0x150>
+    8020125a:	fffff097          	auipc	ra,0xfffff
+    8020125e:	eea080e7          	jalr	-278(ra) # 80200144 <panic>
+      kfree(mem);
+    80201262:	854a                	mv	a0,s2
+    80201264:	fffff097          	auipc	ra,0xfffff
+    80201268:	1dc080e7          	jalr	476(ra) # 80200440 <kfree>
+      goto err;
+    8020126c:	8c4e                	mv	s8,s3
+    8020126e:	a011                	j	80201272 <uvmcopy+0xcc>
+    80201270:	8c4e                	mv	s8,s3
+    ki += PGSIZE;
+  }
+  return 0;
+
+ err:
+  vmunmap(knew, 0, ki / PGSIZE, 0);
+    80201272:	4681                	li	a3,0
+    80201274:	00c9d613          	srli	a2,s3,0xc
+    80201278:	4581                	li	a1,0
+    8020127a:	855a                	mv	a0,s6
+    8020127c:	00000097          	auipc	ra,0x0
+    80201280:	ba6080e7          	jalr	-1114(ra) # 80200e22 <vmunmap>
+  vmunmap(new, 0, i / PGSIZE, 1);
+    80201284:	4685                	li	a3,1
+    80201286:	00cc5613          	srli	a2,s8,0xc
+    8020128a:	4581                	li	a1,0
+    8020128c:	8552                	mv	a0,s4
+    8020128e:	00000097          	auipc	ra,0x0
+    80201292:	b94080e7          	jalr	-1132(ra) # 80200e22 <vmunmap>
+  return -1;
+    80201296:	557d                	li	a0,-1
+}
+    80201298:	60a6                	ld	ra,72(sp)
+    8020129a:	6406                	ld	s0,64(sp)
+    8020129c:	74e2                	ld	s1,56(sp)
+    8020129e:	7942                	ld	s2,48(sp)
+    802012a0:	79a2                	ld	s3,40(sp)
+    802012a2:	7a02                	ld	s4,32(sp)
+    802012a4:	6ae2                	ld	s5,24(sp)
+    802012a6:	6b42                	ld	s6,16(sp)
+    802012a8:	6ba2                	ld	s7,8(sp)
+    802012aa:	6c02                	ld	s8,0(sp)
+    802012ac:	6161                	addi	sp,sp,80
+    802012ae:	8082                	ret
+  return 0;
+    802012b0:	4501                	li	a0,0
+}
+    802012b2:	8082                	ret
+
+00000000802012b4 <uvmclear>:
+
+// mark a PTE invalid for user access.
+// used by exec for the user stack guard page.
+void
+uvmclear(pagetable_t pagetable, uint64 va)
+{
+    802012b4:	1141                	addi	sp,sp,-16
+    802012b6:	e406                	sd	ra,8(sp)
+    802012b8:	e022                	sd	s0,0(sp)
+    802012ba:	0800                	addi	s0,sp,16
+  pte_t *pte;
+  
+  pte = walk(pagetable, va, 0);
+    802012bc:	4601                	li	a2,0
+    802012be:	00000097          	auipc	ra,0x0
+    802012c2:	84a080e7          	jalr	-1974(ra) # 80200b08 <walk>
+  if(pte == NULL)
+    802012c6:	c901                	beqz	a0,802012d6 <uvmclear+0x22>
+    panic("uvmclear");
+  *pte &= ~PTE_U;
+    802012c8:	611c                	ld	a5,0(a0)
+    802012ca:	9bbd                	andi	a5,a5,-17
+    802012cc:	e11c                	sd	a5,0(a0)
+}
+    802012ce:	60a2                	ld	ra,8(sp)
+    802012d0:	6402                	ld	s0,0(sp)
+    802012d2:	0141                	addi	sp,sp,16
+    802012d4:	8082                	ret
+    panic("uvmclear");
+    802012d6:	00008517          	auipc	a0,0x8
+    802012da:	21a50513          	addi	a0,a0,538 # 802094f0 <digits+0x170>
+    802012de:	fffff097          	auipc	ra,0xfffff
+    802012e2:	e66080e7          	jalr	-410(ra) # 80200144 <panic>
+
+00000000802012e6 <copyout>:
+int
+copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len)
+{
+  uint64 n, va0, pa0;
+
+  while(len > 0){
+    802012e6:	c6bd                	beqz	a3,80201354 <copyout+0x6e>
+{
+    802012e8:	715d                	addi	sp,sp,-80
+    802012ea:	e486                	sd	ra,72(sp)
+    802012ec:	e0a2                	sd	s0,64(sp)
+    802012ee:	fc26                	sd	s1,56(sp)
+    802012f0:	f84a                	sd	s2,48(sp)
+    802012f2:	f44e                	sd	s3,40(sp)
+    802012f4:	f052                	sd	s4,32(sp)
+    802012f6:	ec56                	sd	s5,24(sp)
+    802012f8:	e85a                	sd	s6,16(sp)
+    802012fa:	e45e                	sd	s7,8(sp)
+    802012fc:	e062                	sd	s8,0(sp)
+    802012fe:	0880                	addi	s0,sp,80
+    80201300:	8b2a                	mv	s6,a0
+    80201302:	8c2e                	mv	s8,a1
+    80201304:	8a32                	mv	s4,a2
+    80201306:	89b6                	mv	s3,a3
+    va0 = PGROUNDDOWN(dstva);
+    80201308:	7bfd                	lui	s7,0xfffff
+    pa0 = walkaddr(pagetable, va0);
+    if(pa0 == NULL)
+      return -1;
+    n = PGSIZE - (dstva - va0);
+    8020130a:	6a85                	lui	s5,0x1
+    8020130c:	a015                	j	80201330 <copyout+0x4a>
+    if(n > len)
+      n = len;
+    memmove((void *)(pa0 + (dstva - va0)), src, n);
+    8020130e:	9562                	add	a0,a0,s8
+    80201310:	0004861b          	sext.w	a2,s1
+    80201314:	85d2                	mv	a1,s4
+    80201316:	41250533          	sub	a0,a0,s2
+    8020131a:	fffff097          	auipc	ra,0xfffff
+    8020131e:	4a4080e7          	jalr	1188(ra) # 802007be <memmove>
+
+    len -= n;
+    80201322:	409989b3          	sub	s3,s3,s1
+    src += n;
+    80201326:	9a26                	add	s4,s4,s1
+    dstva = va0 + PGSIZE;
+    80201328:	01590c33          	add	s8,s2,s5
+  while(len > 0){
+    8020132c:	02098263          	beqz	s3,80201350 <copyout+0x6a>
+    va0 = PGROUNDDOWN(dstva);
+    80201330:	017c7933          	and	s2,s8,s7
+    pa0 = walkaddr(pagetable, va0);
+    80201334:	85ca                	mv	a1,s2
+    80201336:	855a                	mv	a0,s6
+    80201338:	00000097          	auipc	ra,0x0
+    8020133c:	876080e7          	jalr	-1930(ra) # 80200bae <walkaddr>
+    if(pa0 == NULL)
+    80201340:	cd01                	beqz	a0,80201358 <copyout+0x72>
+    n = PGSIZE - (dstva - va0);
+    80201342:	418904b3          	sub	s1,s2,s8
+    80201346:	94d6                	add	s1,s1,s5
+    80201348:	fc99f3e3          	bgeu	s3,s1,8020130e <copyout+0x28>
+    8020134c:	84ce                	mv	s1,s3
+    8020134e:	b7c1                	j	8020130e <copyout+0x28>
+  }
+  return 0;
+    80201350:	4501                	li	a0,0
+    80201352:	a021                	j	8020135a <copyout+0x74>
+    80201354:	4501                	li	a0,0
+}
+    80201356:	8082                	ret
+      return -1;
+    80201358:	557d                	li	a0,-1
+}
+    8020135a:	60a6                	ld	ra,72(sp)
+    8020135c:	6406                	ld	s0,64(sp)
+    8020135e:	74e2                	ld	s1,56(sp)
+    80201360:	7942                	ld	s2,48(sp)
+    80201362:	79a2                	ld	s3,40(sp)
+    80201364:	7a02                	ld	s4,32(sp)
+    80201366:	6ae2                	ld	s5,24(sp)
+    80201368:	6b42                	ld	s6,16(sp)
+    8020136a:	6ba2                	ld	s7,8(sp)
+    8020136c:	6c02                	ld	s8,0(sp)
+    8020136e:	6161                	addi	sp,sp,80
+    80201370:	8082                	ret
+
+0000000080201372 <copyout2>:
+
+int
+copyout2(uint64 dstva, char *src, uint64 len)
+{
+    80201372:	7179                	addi	sp,sp,-48
+    80201374:	f406                	sd	ra,40(sp)
+    80201376:	f022                	sd	s0,32(sp)
+    80201378:	ec26                	sd	s1,24(sp)
+    8020137a:	e84a                	sd	s2,16(sp)
+    8020137c:	e44e                	sd	s3,8(sp)
+    8020137e:	1800                	addi	s0,sp,48
+    80201380:	84aa                	mv	s1,a0
+    80201382:	89ae                	mv	s3,a1
+    80201384:	8932                	mv	s2,a2
+  uint64 sz = myproc()->sz;
+    80201386:	00000097          	auipc	ra,0x0
+    8020138a:	6b6080e7          	jalr	1718(ra) # 80201a3c <myproc>
+    8020138e:	653c                	ld	a5,72(a0)
+  if (dstva + len > sz || dstva >= sz) {
+    80201390:	01248733          	add	a4,s1,s2
+    80201394:	02e7e463          	bltu	a5,a4,802013bc <copyout2+0x4a>
+    80201398:	02f4f463          	bgeu	s1,a5,802013c0 <copyout2+0x4e>
+    return -1;
+  }
+  memmove((void *)dstva, src, len);
+    8020139c:	0009061b          	sext.w	a2,s2
+    802013a0:	85ce                	mv	a1,s3
+    802013a2:	8526                	mv	a0,s1
+    802013a4:	fffff097          	auipc	ra,0xfffff
+    802013a8:	41a080e7          	jalr	1050(ra) # 802007be <memmove>
+  return 0;
+    802013ac:	4501                	li	a0,0
+}
+    802013ae:	70a2                	ld	ra,40(sp)
+    802013b0:	7402                	ld	s0,32(sp)
+    802013b2:	64e2                	ld	s1,24(sp)
+    802013b4:	6942                	ld	s2,16(sp)
+    802013b6:	69a2                	ld	s3,8(sp)
+    802013b8:	6145                	addi	sp,sp,48
+    802013ba:	8082                	ret
+    return -1;
+    802013bc:	557d                	li	a0,-1
+    802013be:	bfc5                	j	802013ae <copyout2+0x3c>
+    802013c0:	557d                	li	a0,-1
+    802013c2:	b7f5                	j	802013ae <copyout2+0x3c>
+
+00000000802013c4 <copyin>:
+int
+copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len)
+{
+  uint64 n, va0, pa0;
+
+  while(len > 0){
+    802013c4:	caa5                	beqz	a3,80201434 <copyin+0x70>
+{
+    802013c6:	715d                	addi	sp,sp,-80
+    802013c8:	e486                	sd	ra,72(sp)
+    802013ca:	e0a2                	sd	s0,64(sp)
+    802013cc:	fc26                	sd	s1,56(sp)
+    802013ce:	f84a                	sd	s2,48(sp)
+    802013d0:	f44e                	sd	s3,40(sp)
+    802013d2:	f052                	sd	s4,32(sp)
+    802013d4:	ec56                	sd	s5,24(sp)
+    802013d6:	e85a                	sd	s6,16(sp)
+    802013d8:	e45e                	sd	s7,8(sp)
+    802013da:	e062                	sd	s8,0(sp)
+    802013dc:	0880                	addi	s0,sp,80
+    802013de:	8b2a                	mv	s6,a0
+    802013e0:	8a2e                	mv	s4,a1
+    802013e2:	8c32                	mv	s8,a2
+    802013e4:	89b6                	mv	s3,a3
+    va0 = PGROUNDDOWN(srcva);
+    802013e6:	7bfd                	lui	s7,0xfffff
+    pa0 = walkaddr(pagetable, va0);
+    if(pa0 == NULL)
+      return -1;
+    n = PGSIZE - (srcva - va0);
+    802013e8:	6a85                	lui	s5,0x1
+    802013ea:	a01d                	j	80201410 <copyin+0x4c>
+    if(n > len)
+      n = len;
+    memmove(dst, (void *)(pa0 + (srcva - va0)), n);
+    802013ec:	018505b3          	add	a1,a0,s8
+    802013f0:	0004861b          	sext.w	a2,s1
+    802013f4:	412585b3          	sub	a1,a1,s2
+    802013f8:	8552                	mv	a0,s4
+    802013fa:	fffff097          	auipc	ra,0xfffff
+    802013fe:	3c4080e7          	jalr	964(ra) # 802007be <memmove>
+
+    len -= n;
+    80201402:	409989b3          	sub	s3,s3,s1
+    dst += n;
+    80201406:	9a26                	add	s4,s4,s1
+    srcva = va0 + PGSIZE;
+    80201408:	01590c33          	add	s8,s2,s5
+  while(len > 0){
+    8020140c:	02098263          	beqz	s3,80201430 <copyin+0x6c>
+    va0 = PGROUNDDOWN(srcva);
+    80201410:	017c7933          	and	s2,s8,s7
+    pa0 = walkaddr(pagetable, va0);
+    80201414:	85ca                	mv	a1,s2
+    80201416:	855a                	mv	a0,s6
+    80201418:	fffff097          	auipc	ra,0xfffff
+    8020141c:	796080e7          	jalr	1942(ra) # 80200bae <walkaddr>
+    if(pa0 == NULL)
+    80201420:	cd01                	beqz	a0,80201438 <copyin+0x74>
+    n = PGSIZE - (srcva - va0);
+    80201422:	418904b3          	sub	s1,s2,s8
+    80201426:	94d6                	add	s1,s1,s5
+    80201428:	fc99f2e3          	bgeu	s3,s1,802013ec <copyin+0x28>
+    8020142c:	84ce                	mv	s1,s3
+    8020142e:	bf7d                	j	802013ec <copyin+0x28>
+  }
+  return 0;
+    80201430:	4501                	li	a0,0
+    80201432:	a021                	j	8020143a <copyin+0x76>
+    80201434:	4501                	li	a0,0
+}
+    80201436:	8082                	ret
+      return -1;
+    80201438:	557d                	li	a0,-1
+}
+    8020143a:	60a6                	ld	ra,72(sp)
+    8020143c:	6406                	ld	s0,64(sp)
+    8020143e:	74e2                	ld	s1,56(sp)
+    80201440:	7942                	ld	s2,48(sp)
+    80201442:	79a2                	ld	s3,40(sp)
+    80201444:	7a02                	ld	s4,32(sp)
+    80201446:	6ae2                	ld	s5,24(sp)
+    80201448:	6b42                	ld	s6,16(sp)
+    8020144a:	6ba2                	ld	s7,8(sp)
+    8020144c:	6c02                	ld	s8,0(sp)
+    8020144e:	6161                	addi	sp,sp,80
+    80201450:	8082                	ret
+
+0000000080201452 <copyin2>:
+
+int
+copyin2(char *dst, uint64 srcva, uint64 len)
+{
+    80201452:	7179                	addi	sp,sp,-48
+    80201454:	f406                	sd	ra,40(sp)
+    80201456:	f022                	sd	s0,32(sp)
+    80201458:	ec26                	sd	s1,24(sp)
+    8020145a:	e84a                	sd	s2,16(sp)
+    8020145c:	e44e                	sd	s3,8(sp)
+    8020145e:	1800                	addi	s0,sp,48
+    80201460:	89aa                	mv	s3,a0
+    80201462:	84ae                	mv	s1,a1
+    80201464:	8932                	mv	s2,a2
+  uint64 sz = myproc()->sz;
+    80201466:	00000097          	auipc	ra,0x0
+    8020146a:	5d6080e7          	jalr	1494(ra) # 80201a3c <myproc>
+    8020146e:	653c                	ld	a5,72(a0)
+  if (srcva + len > sz || srcva >= sz) {
+    80201470:	01248733          	add	a4,s1,s2
+    80201474:	02e7e463          	bltu	a5,a4,8020149c <copyin2+0x4a>
+    80201478:	02f4f463          	bgeu	s1,a5,802014a0 <copyin2+0x4e>
+    return -1;
+  }
+  memmove(dst, (void *)srcva, len);
+    8020147c:	0009061b          	sext.w	a2,s2
+    80201480:	85a6                	mv	a1,s1
+    80201482:	854e                	mv	a0,s3
+    80201484:	fffff097          	auipc	ra,0xfffff
+    80201488:	33a080e7          	jalr	826(ra) # 802007be <memmove>
+  return 0;
+    8020148c:	4501                	li	a0,0
+}
+    8020148e:	70a2                	ld	ra,40(sp)
+    80201490:	7402                	ld	s0,32(sp)
+    80201492:	64e2                	ld	s1,24(sp)
+    80201494:	6942                	ld	s2,16(sp)
+    80201496:	69a2                	ld	s3,8(sp)
+    80201498:	6145                	addi	sp,sp,48
+    8020149a:	8082                	ret
+    return -1;
+    8020149c:	557d                	li	a0,-1
+    8020149e:	bfc5                	j	8020148e <copyin2+0x3c>
+    802014a0:	557d                	li	a0,-1
+    802014a2:	b7f5                	j	8020148e <copyin2+0x3c>
+
+00000000802014a4 <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){
+    802014a4:	c2dd                	beqz	a3,8020154a <copyinstr+0xa6>
+{
+    802014a6:	715d                	addi	sp,sp,-80
+    802014a8:	e486                	sd	ra,72(sp)
+    802014aa:	e0a2                	sd	s0,64(sp)
+    802014ac:	fc26                	sd	s1,56(sp)
+    802014ae:	f84a                	sd	s2,48(sp)
+    802014b0:	f44e                	sd	s3,40(sp)
+    802014b2:	f052                	sd	s4,32(sp)
+    802014b4:	ec56                	sd	s5,24(sp)
+    802014b6:	e85a                	sd	s6,16(sp)
+    802014b8:	e45e                	sd	s7,8(sp)
+    802014ba:	0880                	addi	s0,sp,80
+    802014bc:	8a2a                	mv	s4,a0
+    802014be:	8b2e                	mv	s6,a1
+    802014c0:	8bb2                	mv	s7,a2
+    802014c2:	84b6                	mv	s1,a3
+    va0 = PGROUNDDOWN(srcva);
+    802014c4:	7afd                	lui	s5,0xfffff
+    pa0 = walkaddr(pagetable, va0);
+    if(pa0 == NULL)
+      return -1;
+    n = PGSIZE - (srcva - va0);
+    802014c6:	6985                	lui	s3,0x1
+    802014c8:	a02d                	j	802014f2 <copyinstr+0x4e>
+      n = max;
+
+    char *p = (char *) (pa0 + (srcva - va0));
+    while(n > 0){
+      if(*p == '\0'){
+        *dst = '\0';
+    802014ca:	00078023          	sb	zero,0(a5)
+    802014ce:	4785                	li	a5,1
+      dst++;
+    }
+
+    srcva = va0 + PGSIZE;
+  }
+  if(got_null){
+    802014d0:	37fd                	addiw	a5,a5,-1
+    802014d2:	0007851b          	sext.w	a0,a5
+    return 0;
+  } else {
+    return -1;
+  }
+}
+    802014d6:	60a6                	ld	ra,72(sp)
+    802014d8:	6406                	ld	s0,64(sp)
+    802014da:	74e2                	ld	s1,56(sp)
+    802014dc:	7942                	ld	s2,48(sp)
+    802014de:	79a2                	ld	s3,40(sp)
+    802014e0:	7a02                	ld	s4,32(sp)
+    802014e2:	6ae2                	ld	s5,24(sp)
+    802014e4:	6b42                	ld	s6,16(sp)
+    802014e6:	6ba2                	ld	s7,8(sp)
+    802014e8:	6161                	addi	sp,sp,80
+    802014ea:	8082                	ret
+    srcva = va0 + PGSIZE;
+    802014ec:	01390bb3          	add	s7,s2,s3
+  while(got_null == 0 && max > 0){
+    802014f0:	c8a9                	beqz	s1,80201542 <copyinstr+0x9e>
+    va0 = PGROUNDDOWN(srcva);
+    802014f2:	015bf933          	and	s2,s7,s5
+    pa0 = walkaddr(pagetable, va0);
+    802014f6:	85ca                	mv	a1,s2
+    802014f8:	8552                	mv	a0,s4
+    802014fa:	fffff097          	auipc	ra,0xfffff
+    802014fe:	6b4080e7          	jalr	1716(ra) # 80200bae <walkaddr>
+    if(pa0 == NULL)
+    80201502:	c131                	beqz	a0,80201546 <copyinstr+0xa2>
+    n = PGSIZE - (srcva - va0);
+    80201504:	417906b3          	sub	a3,s2,s7
+    80201508:	96ce                	add	a3,a3,s3
+    8020150a:	00d4f363          	bgeu	s1,a3,80201510 <copyinstr+0x6c>
+    8020150e:	86a6                	mv	a3,s1
+    char *p = (char *) (pa0 + (srcva - va0));
+    80201510:	955e                	add	a0,a0,s7
+    80201512:	41250533          	sub	a0,a0,s2
+    while(n > 0){
+    80201516:	daf9                	beqz	a3,802014ec <copyinstr+0x48>
+    80201518:	87da                	mv	a5,s6
+      if(*p == '\0'){
+    8020151a:	41650633          	sub	a2,a0,s6
+    8020151e:	fff48593          	addi	a1,s1,-1
+    80201522:	95da                	add	a1,a1,s6
+    while(n > 0){
+    80201524:	96da                	add	a3,a3,s6
+      if(*p == '\0'){
+    80201526:	00f60733          	add	a4,a2,a5
+    8020152a:	00074703          	lbu	a4,0(a4) # fffffffffffff000 <ebss_clear+0xffffffff7fdd9000>
+    8020152e:	df51                	beqz	a4,802014ca <copyinstr+0x26>
+        *dst = *p;
+    80201530:	00e78023          	sb	a4,0(a5)
+      --max;
+    80201534:	40f584b3          	sub	s1,a1,a5
+      dst++;
+    80201538:	0785                	addi	a5,a5,1
+    while(n > 0){
+    8020153a:	fed796e3          	bne	a5,a3,80201526 <copyinstr+0x82>
+      dst++;
+    8020153e:	8b3e                	mv	s6,a5
+    80201540:	b775                	j	802014ec <copyinstr+0x48>
+    80201542:	4781                	li	a5,0
+    80201544:	b771                	j	802014d0 <copyinstr+0x2c>
+      return -1;
+    80201546:	557d                	li	a0,-1
+    80201548:	b779                	j	802014d6 <copyinstr+0x32>
+  int got_null = 0;
+    8020154a:	4781                	li	a5,0
+  if(got_null){
+    8020154c:	37fd                	addiw	a5,a5,-1
+    8020154e:	0007851b          	sext.w	a0,a5
+}
+    80201552:	8082                	ret
+
+0000000080201554 <copyinstr2>:
+
+int
+copyinstr2(char *dst, uint64 srcva, uint64 max)
+{
+    80201554:	7179                	addi	sp,sp,-48
+    80201556:	f406                	sd	ra,40(sp)
+    80201558:	f022                	sd	s0,32(sp)
+    8020155a:	ec26                	sd	s1,24(sp)
+    8020155c:	e84a                	sd	s2,16(sp)
+    8020155e:	e44e                	sd	s3,8(sp)
+    80201560:	1800                	addi	s0,sp,48
+    80201562:	89aa                	mv	s3,a0
+    80201564:	84ae                	mv	s1,a1
+    80201566:	8932                	mv	s2,a2
+  int got_null = 0;
+  uint64 sz = myproc()->sz;
+    80201568:	00000097          	auipc	ra,0x0
+    8020156c:	4d4080e7          	jalr	1236(ra) # 80201a3c <myproc>
+    80201570:	6534                	ld	a3,72(a0)
+  while(srcva < sz && max > 0){
+    80201572:	04d4f363          	bgeu	s1,a3,802015b8 <copyinstr2+0x64>
+    80201576:	04090363          	beqz	s2,802015bc <copyinstr2+0x68>
+    8020157a:	01298633          	add	a2,s3,s2
+    8020157e:	8e85                	sub	a3,a3,s1
+    80201580:	96ce                	add	a3,a3,s3
+    80201582:	87ce                	mv	a5,s3
+    char *p = (char *)srcva;
+    if(*p == '\0'){
+    80201584:	413485b3          	sub	a1,s1,s3
+    80201588:	00b78733          	add	a4,a5,a1
+    8020158c:	00074703          	lbu	a4,0(a4)
+    80201590:	cb11                	beqz	a4,802015a4 <copyinstr2+0x50>
+      *dst = '\0';
+      got_null = 1;
+      break;
+    } else {
+      *dst = *p;
+    80201592:	00e78023          	sb	a4,0(a5)
+    }
+    --max;
+    srcva++;
+    dst++;
+    80201596:	0785                	addi	a5,a5,1
+  while(srcva < sz && max > 0){
+    80201598:	02d78463          	beq	a5,a3,802015c0 <copyinstr2+0x6c>
+    8020159c:	fec796e3          	bne	a5,a2,80201588 <copyinstr2+0x34>
+  }
+  if(got_null){
+    return 0;
+  } else {
+    return -1;
+    802015a0:	557d                	li	a0,-1
+    802015a2:	a021                	j	802015aa <copyinstr2+0x56>
+      *dst = '\0';
+    802015a4:	00078023          	sb	zero,0(a5)
+    return 0;
+    802015a8:	4501                	li	a0,0
+  }
+}
+    802015aa:	70a2                	ld	ra,40(sp)
+    802015ac:	7402                	ld	s0,32(sp)
+    802015ae:	64e2                	ld	s1,24(sp)
+    802015b0:	6942                	ld	s2,16(sp)
+    802015b2:	69a2                	ld	s3,8(sp)
+    802015b4:	6145                	addi	sp,sp,48
+    802015b6:	8082                	ret
+    return -1;
+    802015b8:	557d                	li	a0,-1
+    802015ba:	bfc5                	j	802015aa <copyinstr2+0x56>
+    802015bc:	557d                	li	a0,-1
+    802015be:	b7f5                	j	802015aa <copyinstr2+0x56>
+    802015c0:	557d                	li	a0,-1
+    802015c2:	b7e5                	j	802015aa <copyinstr2+0x56>
+
+00000000802015c4 <kfreewalk>:
+}
+
+// only free page table, not physical pages
+void
+kfreewalk(pagetable_t kpt)
+{
+    802015c4:	7179                	addi	sp,sp,-48
+    802015c6:	f406                	sd	ra,40(sp)
+    802015c8:	f022                	sd	s0,32(sp)
+    802015ca:	ec26                	sd	s1,24(sp)
+    802015cc:	e84a                	sd	s2,16(sp)
+    802015ce:	e44e                	sd	s3,8(sp)
+    802015d0:	e052                	sd	s4,0(sp)
+    802015d2:	1800                	addi	s0,sp,48
+    802015d4:	8a2a                	mv	s4,a0
+  for (int i = 0; i < 512; i++) {
+    802015d6:	84aa                	mv	s1,a0
+    802015d8:	6905                	lui	s2,0x1
+    802015da:	992a                	add	s2,s2,a0
+    pte_t pte = kpt[i];
+    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
+    802015dc:	4985                	li	s3,1
+    802015de:	a829                	j	802015f8 <kfreewalk+0x34>
+      kfreewalk((pagetable_t) PTE2PA(pte));
+    802015e0:	83a9                	srli	a5,a5,0xa
+    802015e2:	00c79513          	slli	a0,a5,0xc
+    802015e6:	00000097          	auipc	ra,0x0
+    802015ea:	fde080e7          	jalr	-34(ra) # 802015c4 <kfreewalk>
+      kpt[i] = 0;
+    802015ee:	0004b023          	sd	zero,0(s1)
+  for (int i = 0; i < 512; i++) {
+    802015f2:	04a1                	addi	s1,s1,8
+    802015f4:	01248963          	beq	s1,s2,80201606 <kfreewalk+0x42>
+    pte_t pte = kpt[i];
+    802015f8:	609c                	ld	a5,0(s1)
+    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
+    802015fa:	00f7f713          	andi	a4,a5,15
+    802015fe:	ff3701e3          	beq	a4,s3,802015e0 <kfreewalk+0x1c>
+    } else if (pte & PTE_V) {
+    80201602:	8b85                	andi	a5,a5,1
+    80201604:	d7fd                	beqz	a5,802015f2 <kfreewalk+0x2e>
+      break;
+    }
+  }
+  kfree((void *) kpt);
+    80201606:	8552                	mv	a0,s4
+    80201608:	fffff097          	auipc	ra,0xfffff
+    8020160c:	e38080e7          	jalr	-456(ra) # 80200440 <kfree>
+}
+    80201610:	70a2                	ld	ra,40(sp)
+    80201612:	7402                	ld	s0,32(sp)
+    80201614:	64e2                	ld	s1,24(sp)
+    80201616:	6942                	ld	s2,16(sp)
+    80201618:	69a2                	ld	s3,8(sp)
+    8020161a:	6a02                	ld	s4,0(sp)
+    8020161c:	6145                	addi	sp,sp,48
+    8020161e:	8082                	ret
+
+0000000080201620 <kvmfreeusr>:
+
+void
+kvmfreeusr(pagetable_t kpt)
+{
+    80201620:	1101                	addi	sp,sp,-32
+    80201622:	ec06                	sd	ra,24(sp)
+    80201624:	e822                	sd	s0,16(sp)
+    80201626:	e426                	sd	s1,8(sp)
+    80201628:	1000                	addi	s0,sp,32
+    8020162a:	84aa                	mv	s1,a0
+  pte_t pte;
+  for (int i = 0; i < PX(2, MAXUVA); i++) {
+    pte = kpt[i];
+    8020162c:	6108                	ld	a0,0(a0)
+    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
+    8020162e:	00f57713          	andi	a4,a0,15
+    80201632:	4785                	li	a5,1
+    80201634:	00f70d63          	beq	a4,a5,8020164e <kvmfreeusr+0x2e>
+    pte = kpt[i];
+    80201638:	6488                	ld	a0,8(s1)
+    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
+    8020163a:	00f57713          	andi	a4,a0,15
+    8020163e:	4785                	li	a5,1
+    80201640:	02f70063          	beq	a4,a5,80201660 <kvmfreeusr+0x40>
+      kfreewalk((pagetable_t) PTE2PA(pte));
+      kpt[i] = 0;
+    }
+  }
+}
+    80201644:	60e2                	ld	ra,24(sp)
+    80201646:	6442                	ld	s0,16(sp)
+    80201648:	64a2                	ld	s1,8(sp)
+    8020164a:	6105                	addi	sp,sp,32
+    8020164c:	8082                	ret
+      kfreewalk((pagetable_t) PTE2PA(pte));
+    8020164e:	8129                	srli	a0,a0,0xa
+    80201650:	0532                	slli	a0,a0,0xc
+    80201652:	00000097          	auipc	ra,0x0
+    80201656:	f72080e7          	jalr	-142(ra) # 802015c4 <kfreewalk>
+      kpt[i] = 0;
+    8020165a:	0004b023          	sd	zero,0(s1)
+    8020165e:	bfe9                	j	80201638 <kvmfreeusr+0x18>
+      kfreewalk((pagetable_t) PTE2PA(pte));
+    80201660:	8129                	srli	a0,a0,0xa
+    80201662:	0532                	slli	a0,a0,0xc
+    80201664:	00000097          	auipc	ra,0x0
+    80201668:	f60080e7          	jalr	-160(ra) # 802015c4 <kfreewalk>
+      kpt[i] = 0;
+    8020166c:	0004b423          	sd	zero,8(s1)
+}
+    80201670:	bfd1                	j	80201644 <kvmfreeusr+0x24>
+
+0000000080201672 <kvmfree>:
+
+void
+kvmfree(pagetable_t kpt, int stack_free)
+{
+    80201672:	1101                	addi	sp,sp,-32
+    80201674:	ec06                	sd	ra,24(sp)
+    80201676:	e822                	sd	s0,16(sp)
+    80201678:	e426                	sd	s1,8(sp)
+    8020167a:	1000                	addi	s0,sp,32
+    8020167c:	84aa                	mv	s1,a0
+  if (stack_free) {
+    8020167e:	e185                	bnez	a1,8020169e <kvmfree+0x2c>
+    pte_t pte = kpt[PX(2, VKSTACK)];
+    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
+      kfreewalk((pagetable_t) PTE2PA(pte));
+    }
+  }
+  kvmfreeusr(kpt);
+    80201680:	8526                	mv	a0,s1
+    80201682:	00000097          	auipc	ra,0x0
+    80201686:	f9e080e7          	jalr	-98(ra) # 80201620 <kvmfreeusr>
+  kfree(kpt);
+    8020168a:	8526                	mv	a0,s1
+    8020168c:	fffff097          	auipc	ra,0xfffff
+    80201690:	db4080e7          	jalr	-588(ra) # 80200440 <kfree>
+}
+    80201694:	60e2                	ld	ra,24(sp)
+    80201696:	6442                	ld	s0,16(sp)
+    80201698:	64a2                	ld	s1,8(sp)
+    8020169a:	6105                	addi	sp,sp,32
+    8020169c:	8082                	ret
+    vmunmap(kpt, VKSTACK, 1, 1);
+    8020169e:	4685                	li	a3,1
+    802016a0:	4605                	li	a2,1
+    802016a2:	0fb00593          	li	a1,251
+    802016a6:	05fa                	slli	a1,a1,0x1e
+    802016a8:	fffff097          	auipc	ra,0xfffff
+    802016ac:	77a080e7          	jalr	1914(ra) # 80200e22 <vmunmap>
+    pte_t pte = kpt[PX(2, VKSTACK)];
+    802016b0:	7d84b503          	ld	a0,2008(s1)
+    if ((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0) {
+    802016b4:	00f57713          	andi	a4,a0,15
+    802016b8:	4785                	li	a5,1
+    802016ba:	fcf713e3          	bne	a4,a5,80201680 <kvmfree+0xe>
+      kfreewalk((pagetable_t) PTE2PA(pte));
+    802016be:	8129                	srli	a0,a0,0xa
+    802016c0:	0532                	slli	a0,a0,0xc
+    802016c2:	00000097          	auipc	ra,0x0
+    802016c6:	f02080e7          	jalr	-254(ra) # 802015c4 <kfreewalk>
+    802016ca:	bf5d                	j	80201680 <kvmfree+0xe>
+
+00000000802016cc <proc_kpagetable>:
+{
+    802016cc:	1101                	addi	sp,sp,-32
+    802016ce:	ec06                	sd	ra,24(sp)
+    802016d0:	e822                	sd	s0,16(sp)
+    802016d2:	e426                	sd	s1,8(sp)
+    802016d4:	1000                	addi	s0,sp,32
+  pagetable_t kpt = (pagetable_t) kalloc();
+    802016d6:	fffff097          	auipc	ra,0xfffff
+    802016da:	e84080e7          	jalr	-380(ra) # 8020055a <kalloc>
+    802016de:	84aa                	mv	s1,a0
+  if (kpt == NULL)
+    802016e0:	c91d                	beqz	a0,80201716 <proc_kpagetable+0x4a>
+  memmove(kpt, kernel_pagetable, PGSIZE);
+    802016e2:	6605                	lui	a2,0x1
+    802016e4:	00013597          	auipc	a1,0x13
+    802016e8:	9745b583          	ld	a1,-1676(a1) # 80214058 <kernel_pagetable>
+    802016ec:	fffff097          	auipc	ra,0xfffff
+    802016f0:	0d2080e7          	jalr	210(ra) # 802007be <memmove>
+  char *pstack = kalloc();
+    802016f4:	fffff097          	auipc	ra,0xfffff
+    802016f8:	e66080e7          	jalr	-410(ra) # 8020055a <kalloc>
+    802016fc:	86aa                	mv	a3,a0
+  if(pstack == NULL)
+    802016fe:	c115                	beqz	a0,80201722 <proc_kpagetable+0x56>
+  if (mappages(kpt, VKSTACK, PGSIZE, (uint64)pstack, PTE_R | PTE_W) != 0)
+    80201700:	4719                	li	a4,6
+    80201702:	6605                	lui	a2,0x1
+    80201704:	0fb00593          	li	a1,251
+    80201708:	05fa                	slli	a1,a1,0x1e
+    8020170a:	8526                	mv	a0,s1
+    8020170c:	fffff097          	auipc	ra,0xfffff
+    80201710:	55c080e7          	jalr	1372(ra) # 80200c68 <mappages>
+    80201714:	e519                	bnez	a0,80201722 <proc_kpagetable+0x56>
+}
+    80201716:	8526                	mv	a0,s1
+    80201718:	60e2                	ld	ra,24(sp)
+    8020171a:	6442                	ld	s0,16(sp)
+    8020171c:	64a2                	ld	s1,8(sp)
+    8020171e:	6105                	addi	sp,sp,32
+    80201720:	8082                	ret
+  kvmfree(kpt, 1);
+    80201722:	4585                	li	a1,1
+    80201724:	8526                	mv	a0,s1
+    80201726:	00000097          	auipc	ra,0x0
+    8020172a:	f4c080e7          	jalr	-180(ra) # 80201672 <kvmfree>
+  return NULL;
+    8020172e:	4481                	li	s1,0
+    80201730:	b7dd                	j	80201716 <proc_kpagetable+0x4a>
+
+0000000080201732 <vmprint>:
+
+void vmprint(pagetable_t pagetable)
+{
+    80201732:	7119                	addi	sp,sp,-128
+    80201734:	fc86                	sd	ra,120(sp)
+    80201736:	f8a2                	sd	s0,112(sp)
+    80201738:	f4a6                	sd	s1,104(sp)
+    8020173a:	f0ca                	sd	s2,96(sp)
+    8020173c:	ecce                	sd	s3,88(sp)
+    8020173e:	e8d2                	sd	s4,80(sp)
+    80201740:	e4d6                	sd	s5,72(sp)
+    80201742:	e0da                	sd	s6,64(sp)
+    80201744:	fc5e                	sd	s7,56(sp)
+    80201746:	f862                	sd	s8,48(sp)
+    80201748:	f466                	sd	s9,40(sp)
+    8020174a:	f06a                	sd	s10,32(sp)
+    8020174c:	ec6e                	sd	s11,24(sp)
+    8020174e:	0100                	addi	s0,sp,128
+    80201750:	8baa                	mv	s7,a0
+    80201752:	f8a43423          	sd	a0,-120(s0)
+  const int capacity = 512;
+  printf("page table %p\n", pagetable);
+    80201756:	85aa                	mv	a1,a0
+    80201758:	00008517          	auipc	a0,0x8
+    8020175c:	da850513          	addi	a0,a0,-600 # 80209500 <digits+0x180>
+    80201760:	fffff097          	auipc	ra,0xfffff
+    80201764:	a2e080e7          	jalr	-1490(ra) # 8020018e <printf>
+  for (pte_t *pte = (pte_t *) pagetable; pte < pagetable + capacity; pte++) {
+    80201768:	6d85                	lui	s11,0x1
+    8020176a:	9dde                	add	s11,s11,s7
+    8020176c:	6c85                	lui	s9,0x1
+
+      for (pte_t *pte2 = (pte_t *) pt2; pte2 < pt2 + capacity; pte2++) {
+        if (*pte2 & PTE_V)
+        {
+          pagetable_t pt3 = (pagetable_t) PTE2PA(*pte2);
+          printf(".. ..%d: pte %p pa %p\n", pte2 - pt2, *pte2, pt3);
+    8020176e:	00008d17          	auipc	s10,0x8
+    80201772:	dbad0d13          	addi	s10,s10,-582 # 80209528 <digits+0x1a8>
+
+          for (pte_t *pte3 = (pte_t *) pt3; pte3 < pt3 + capacity; pte3++)
+            if (*pte3 & PTE_V)
+              printf(".. .. ..%d: pte %p pa %p\n", pte3 - pt3, *pte3, PTE2PA(*pte3));
+    80201776:	00008a17          	auipc	s4,0x8
+    8020177a:	dcaa0a13          	addi	s4,s4,-566 # 80209540 <digits+0x1c0>
+    8020177e:	a885                	j	802017ee <vmprint+0xbc>
+          for (pte_t *pte3 = (pte_t *) pt3; pte3 < pt3 + capacity; pte3++)
+    80201780:	04a1                	addi	s1,s1,8
+    80201782:	197d                	addi	s2,s2,-1 # fff <_entry-0x801ff001>
+    80201784:	02090263          	beqz	s2,802017a8 <vmprint+0x76>
+            if (*pte3 & PTE_V)
+    80201788:	6090                	ld	a2,0(s1)
+    8020178a:	00167793          	andi	a5,a2,1
+    8020178e:	dbed                	beqz	a5,80201780 <vmprint+0x4e>
+              printf(".. .. ..%d: pte %p pa %p\n", pte3 - pt3, *pte3, PTE2PA(*pte3));
+    80201790:	00a65693          	srli	a3,a2,0xa
+    80201794:	413485b3          	sub	a1,s1,s3
+    80201798:	06b2                	slli	a3,a3,0xc
+    8020179a:	858d                	srai	a1,a1,0x3
+    8020179c:	8552                	mv	a0,s4
+    8020179e:	fffff097          	auipc	ra,0xfffff
+    802017a2:	9f0080e7          	jalr	-1552(ra) # 8020018e <printf>
+    802017a6:	bfe9                	j	80201780 <vmprint+0x4e>
+      for (pte_t *pte2 = (pte_t *) pt2; pte2 < pt2 + capacity; pte2++) {
+    802017a8:	0aa1                	addi	s5,s5,8 # fffffffffffff008 <ebss_clear+0xffffffff7fdd9008>
+    802017aa:	1b7d                	addi	s6,s6,-1 # fff <_entry-0x801ff001>
+    802017ac:	020b0e63          	beqz	s6,802017e8 <vmprint+0xb6>
+        if (*pte2 & PTE_V)
+    802017b0:	000ab603          	ld	a2,0(s5)
+    802017b4:	00167793          	andi	a5,a2,1
+    802017b8:	dbe5                	beqz	a5,802017a8 <vmprint+0x76>
+          pagetable_t pt3 = (pagetable_t) PTE2PA(*pte2);
+    802017ba:	00a65993          	srli	s3,a2,0xa
+    802017be:	09b2                	slli	s3,s3,0xc
+          printf(".. ..%d: pte %p pa %p\n", pte2 - pt2, *pte2, pt3);
+    802017c0:	418a85b3          	sub	a1,s5,s8
+    802017c4:	86ce                	mv	a3,s3
+    802017c6:	858d                	srai	a1,a1,0x3
+    802017c8:	856a                	mv	a0,s10
+    802017ca:	fffff097          	auipc	ra,0xfffff
+    802017ce:	9c4080e7          	jalr	-1596(ra) # 8020018e <printf>
+          for (pte_t *pte3 = (pte_t *) pt3; pte3 < pt3 + capacity; pte3++)
+    802017d2:	00898713          	addi	a4,s3,8 # 1008 <_entry-0x801feff8>
+    802017d6:	019987b3          	add	a5,s3,s9
+    802017da:	20000913          	li	s2,512
+    802017de:	00e7f363          	bgeu	a5,a4,802017e4 <vmprint+0xb2>
+    802017e2:	4905                	li	s2,1
+    802017e4:	84ce                	mv	s1,s3
+    802017e6:	b74d                	j	80201788 <vmprint+0x56>
+  for (pte_t *pte = (pte_t *) pagetable; pte < pagetable + capacity; pte++) {
+    802017e8:	0ba1                	addi	s7,s7,8 # fffffffffffff008 <ebss_clear+0xffffffff7fdd9008>
+    802017ea:	05bb8463          	beq	s7,s11,80201832 <vmprint+0x100>
+    if (*pte & PTE_V)
+    802017ee:	000bb603          	ld	a2,0(s7)
+    802017f2:	00167793          	andi	a5,a2,1
+    802017f6:	dbed                	beqz	a5,802017e8 <vmprint+0xb6>
+      pagetable_t pt2 = (pagetable_t) PTE2PA(*pte); 
+    802017f8:	00a65c13          	srli	s8,a2,0xa
+    802017fc:	0c32                	slli	s8,s8,0xc
+      printf("..%d: pte %p pa %p\n", pte - pagetable, *pte, pt2);
+    802017fe:	f8843783          	ld	a5,-120(s0)
+    80201802:	40fb87b3          	sub	a5,s7,a5
+    80201806:	86e2                	mv	a3,s8
+    80201808:	4037d593          	srai	a1,a5,0x3
+    8020180c:	00008517          	auipc	a0,0x8
+    80201810:	d0450513          	addi	a0,a0,-764 # 80209510 <digits+0x190>
+    80201814:	fffff097          	auipc	ra,0xfffff
+    80201818:	97a080e7          	jalr	-1670(ra) # 8020018e <printf>
+      for (pte_t *pte2 = (pte_t *) pt2; pte2 < pt2 + capacity; pte2++) {
+    8020181c:	019c0733          	add	a4,s8,s9
+    80201820:	008c0793          	addi	a5,s8,8 # 1008 <_entry-0x801feff8>
+    80201824:	20000b13          	li	s6,512
+    80201828:	00f77363          	bgeu	a4,a5,8020182e <vmprint+0xfc>
+    8020182c:	4b05                	li	s6,1
+    8020182e:	8ae2                	mv	s5,s8
+    80201830:	b741                	j	802017b0 <vmprint+0x7e>
+        }
+      }
+    }
+  }
+  return;
+    80201832:	70e6                	ld	ra,120(sp)
+    80201834:	7446                	ld	s0,112(sp)
+    80201836:	74a6                	ld	s1,104(sp)
+    80201838:	7906                	ld	s2,96(sp)
+    8020183a:	69e6                	ld	s3,88(sp)
+    8020183c:	6a46                	ld	s4,80(sp)
+    8020183e:	6aa6                	ld	s5,72(sp)
+    80201840:	6b06                	ld	s6,64(sp)
+    80201842:	7be2                	ld	s7,56(sp)
+    80201844:	7c42                	ld	s8,48(sp)
+    80201846:	7ca2                	ld	s9,40(sp)
+    80201848:	7d02                	ld	s10,32(sp)
+    8020184a:	6de2                	ld	s11,24(sp)
+    8020184c:	6109                	addi	sp,sp,128
+    8020184e:	8082                	ret
+
+0000000080201850 <wakeup1>:
+
+// Wake up p if it is sleeping in wait(); used by exit().
+// Caller must hold p->lock.
+static void
+wakeup1(struct proc *p)
+{
+    80201850:	1101                	addi	sp,sp,-32
+    80201852:	ec06                	sd	ra,24(sp)
+    80201854:	e822                	sd	s0,16(sp)
+    80201856:	e426                	sd	s1,8(sp)
+    80201858:	1000                	addi	s0,sp,32
+    8020185a:	84aa                	mv	s1,a0
+  if(!holding(&p->lock))
+    8020185c:	fffff097          	auipc	ra,0xfffff
+    80201860:	e3c080e7          	jalr	-452(ra) # 80200698 <holding>
+    80201864:	c909                	beqz	a0,80201876 <wakeup1+0x26>
+    panic("wakeup1");
+  if(p->chan == p && p->state == SLEEPING) {
+    80201866:	749c                	ld	a5,40(s1)
+    80201868:	00978f63          	beq	a5,s1,80201886 <wakeup1+0x36>
+    p->state = RUNNABLE;
+  }
+}
+    8020186c:	60e2                	ld	ra,24(sp)
+    8020186e:	6442                	ld	s0,16(sp)
+    80201870:	64a2                	ld	s1,8(sp)
+    80201872:	6105                	addi	sp,sp,32
+    80201874:	8082                	ret
+    panic("wakeup1");
+    80201876:	00008517          	auipc	a0,0x8
+    8020187a:	cea50513          	addi	a0,a0,-790 # 80209560 <digits+0x1e0>
+    8020187e:	fffff097          	auipc	ra,0xfffff
+    80201882:	8c6080e7          	jalr	-1850(ra) # 80200144 <panic>
+  if(p->chan == p && p->state == SLEEPING) {
+    80201886:	4c98                	lw	a4,24(s1)
+    80201888:	4785                	li	a5,1
+    8020188a:	fef711e3          	bne	a4,a5,8020186c <wakeup1+0x1c>
+    p->state = RUNNABLE;
+    8020188e:	4789                	li	a5,2
+    80201890:	cc9c                	sw	a5,24(s1)
+}
+    80201892:	bfe9                	j	8020186c <wakeup1+0x1c>
+
+0000000080201894 <reg_info>:
+void reg_info(void) {
+    80201894:	1141                	addi	sp,sp,-16
+    80201896:	e406                	sd	ra,8(sp)
+    80201898:	e022                	sd	s0,0(sp)
+    8020189a:	0800                	addi	s0,sp,16
+  printf("register info: {\n");
+    8020189c:	00008517          	auipc	a0,0x8
+    802018a0:	ccc50513          	addi	a0,a0,-820 # 80209568 <digits+0x1e8>
+    802018a4:	fffff097          	auipc	ra,0xfffff
+    802018a8:	8ea080e7          	jalr	-1814(ra) # 8020018e <printf>
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    802018ac:	100025f3          	csrr	a1,sstatus
+  printf("sstatus: %p\n", r_sstatus());
+    802018b0:	00008517          	auipc	a0,0x8
+    802018b4:	cd050513          	addi	a0,a0,-816 # 80209580 <digits+0x200>
+    802018b8:	fffff097          	auipc	ra,0xfffff
+    802018bc:	8d6080e7          	jalr	-1834(ra) # 8020018e <printf>
+  asm volatile("csrr %0, sip" : "=r" (x) );
+    802018c0:	144025f3          	csrr	a1,sip
+  printf("sip: %p\n", r_sip());
+    802018c4:	00008517          	auipc	a0,0x8
+    802018c8:	ccc50513          	addi	a0,a0,-820 # 80209590 <digits+0x210>
+    802018cc:	fffff097          	auipc	ra,0xfffff
+    802018d0:	8c2080e7          	jalr	-1854(ra) # 8020018e <printf>
+  asm volatile("csrr %0, sie" : "=r" (x) );
+    802018d4:	104025f3          	csrr	a1,sie
+  printf("sie: %p\n", r_sie());
+    802018d8:	00008517          	auipc	a0,0x8
+    802018dc:	cc850513          	addi	a0,a0,-824 # 802095a0 <digits+0x220>
+    802018e0:	fffff097          	auipc	ra,0xfffff
+    802018e4:	8ae080e7          	jalr	-1874(ra) # 8020018e <printf>
+  asm volatile("csrr %0, sepc" : "=r" (x) );
+    802018e8:	141025f3          	csrr	a1,sepc
+  printf("sepc: %p\n", r_sepc());
+    802018ec:	00008517          	auipc	a0,0x8
+    802018f0:	cc450513          	addi	a0,a0,-828 # 802095b0 <digits+0x230>
+    802018f4:	fffff097          	auipc	ra,0xfffff
+    802018f8:	89a080e7          	jalr	-1894(ra) # 8020018e <printf>
+  asm volatile("csrr %0, stvec" : "=r" (x) );
+    802018fc:	105025f3          	csrr	a1,stvec
+  printf("stvec: %p\n", r_stvec());
+    80201900:	00008517          	auipc	a0,0x8
+    80201904:	cc050513          	addi	a0,a0,-832 # 802095c0 <digits+0x240>
+    80201908:	fffff097          	auipc	ra,0xfffff
+    8020190c:	886080e7          	jalr	-1914(ra) # 8020018e <printf>
+  asm volatile("csrr %0, satp" : "=r" (x) );
+    80201910:	180025f3          	csrr	a1,satp
+  printf("satp: %p\n", r_satp());
+    80201914:	00008517          	auipc	a0,0x8
+    80201918:	cbc50513          	addi	a0,a0,-836 # 802095d0 <digits+0x250>
+    8020191c:	fffff097          	auipc	ra,0xfffff
+    80201920:	872080e7          	jalr	-1934(ra) # 8020018e <printf>
+  asm volatile("csrr %0, scause" : "=r" (x) );
+    80201924:	142025f3          	csrr	a1,scause
+  printf("scause: %p\n", r_scause());
+    80201928:	00008517          	auipc	a0,0x8
+    8020192c:	cb850513          	addi	a0,a0,-840 # 802095e0 <digits+0x260>
+    80201930:	fffff097          	auipc	ra,0xfffff
+    80201934:	85e080e7          	jalr	-1954(ra) # 8020018e <printf>
+  asm volatile("csrr %0, stval" : "=r" (x) );
+    80201938:	143025f3          	csrr	a1,stval
+  printf("stval: %p\n", r_stval());
+    8020193c:	00008517          	auipc	a0,0x8
+    80201940:	cb450513          	addi	a0,a0,-844 # 802095f0 <digits+0x270>
+    80201944:	fffff097          	auipc	ra,0xfffff
+    80201948:	84a080e7          	jalr	-1974(ra) # 8020018e <printf>
+  asm volatile("mv %0, sp" : "=r" (x) );
+    8020194c:	858a                	mv	a1,sp
+  printf("sp: %p\n", r_sp());
+    8020194e:	00008517          	auipc	a0,0x8
+    80201952:	cb250513          	addi	a0,a0,-846 # 80209600 <digits+0x280>
+    80201956:	fffff097          	auipc	ra,0xfffff
+    8020195a:	838080e7          	jalr	-1992(ra) # 8020018e <printf>
+  asm volatile("mv %0, tp" : "=r" (x) );
+    8020195e:	8592                	mv	a1,tp
+  printf("tp: %p\n", r_tp());
+    80201960:	00008517          	auipc	a0,0x8
+    80201964:	ca850513          	addi	a0,a0,-856 # 80209608 <digits+0x288>
+    80201968:	fffff097          	auipc	ra,0xfffff
+    8020196c:	826080e7          	jalr	-2010(ra) # 8020018e <printf>
+  asm volatile("mv %0, ra" : "=r" (x) );
+    80201970:	8586                	mv	a1,ra
+  printf("ra: %p\n", r_ra());
+    80201972:	00008517          	auipc	a0,0x8
+    80201976:	c9e50513          	addi	a0,a0,-866 # 80209610 <digits+0x290>
+    8020197a:	fffff097          	auipc	ra,0xfffff
+    8020197e:	814080e7          	jalr	-2028(ra) # 8020018e <printf>
+  printf("}\n");
+    80201982:	00008517          	auipc	a0,0x8
+    80201986:	c9650513          	addi	a0,a0,-874 # 80209618 <digits+0x298>
+    8020198a:	fffff097          	auipc	ra,0xfffff
+    8020198e:	804080e7          	jalr	-2044(ra) # 8020018e <printf>
+}
+    80201992:	60a2                	ld	ra,8(sp)
+    80201994:	6402                	ld	s0,0(sp)
+    80201996:	0141                	addi	sp,sp,16
+    80201998:	8082                	ret
+
+000000008020199a <procinit>:
+{
+    8020199a:	7179                	addi	sp,sp,-48
+    8020199c:	f406                	sd	ra,40(sp)
+    8020199e:	f022                	sd	s0,32(sp)
+    802019a0:	ec26                	sd	s1,24(sp)
+    802019a2:	e84a                	sd	s2,16(sp)
+    802019a4:	e44e                	sd	s3,8(sp)
+    802019a6:	1800                	addi	s0,sp,48
+  initlock(&pid_lock, "nextpid");
+    802019a8:	00008597          	auipc	a1,0x8
+    802019ac:	c7858593          	addi	a1,a1,-904 # 80209620 <digits+0x2a0>
+    802019b0:	00012517          	auipc	a0,0x12
+    802019b4:	6b050513          	addi	a0,a0,1712 # 80214060 <pid_lock>
+    802019b8:	fffff097          	auipc	ra,0xfffff
+    802019bc:	cca080e7          	jalr	-822(ra) # 80200682 <initlock>
+  for(p = proc; p < &proc[NPROC]; p++) {
+    802019c0:	00012497          	auipc	s1,0x12
+    802019c4:	7c048493          	addi	s1,s1,1984 # 80214180 <proc>
+      initlock(&p->lock, "proc");
+    802019c8:	00008997          	auipc	s3,0x8
+    802019cc:	c6098993          	addi	s3,s3,-928 # 80209628 <digits+0x2a8>
+  for(p = proc; p < &proc[NPROC]; p++) {
+    802019d0:	00017917          	auipc	s2,0x17
+    802019d4:	12090913          	addi	s2,s2,288 # 80218af0 <bcache>
+      initlock(&p->lock, "proc");
+    802019d8:	85ce                	mv	a1,s3
+    802019da:	8526                	mv	a0,s1
+    802019dc:	fffff097          	auipc	ra,0xfffff
+    802019e0:	ca6080e7          	jalr	-858(ra) # 80200682 <initlock>
+  for(p = proc; p < &proc[NPROC]; p++) {
+    802019e4:	17848493          	addi	s1,s1,376
+    802019e8:	ff2498e3          	bne	s1,s2,802019d8 <procinit+0x3e>
+  memset(cpus, 0, sizeof(cpus));
+    802019ec:	10000613          	li	a2,256
+    802019f0:	4581                	li	a1,0
+    802019f2:	00012517          	auipc	a0,0x12
+    802019f6:	68650513          	addi	a0,a0,1670 # 80214078 <cpus>
+    802019fa:	fffff097          	auipc	ra,0xfffff
+    802019fe:	d68080e7          	jalr	-664(ra) # 80200762 <memset>
+}
+    80201a02:	70a2                	ld	ra,40(sp)
+    80201a04:	7402                	ld	s0,32(sp)
+    80201a06:	64e2                	ld	s1,24(sp)
+    80201a08:	6942                	ld	s2,16(sp)
+    80201a0a:	69a2                	ld	s3,8(sp)
+    80201a0c:	6145                	addi	sp,sp,48
+    80201a0e:	8082                	ret
+
+0000000080201a10 <cpuid>:
+{
+    80201a10:	1141                	addi	sp,sp,-16
+    80201a12:	e422                	sd	s0,8(sp)
+    80201a14:	0800                	addi	s0,sp,16
+  asm volatile("mv %0, tp" : "=r" (x) );
+    80201a16:	8512                	mv	a0,tp
+}
+    80201a18:	2501                	sext.w	a0,a0
+    80201a1a:	6422                	ld	s0,8(sp)
+    80201a1c:	0141                	addi	sp,sp,16
+    80201a1e:	8082                	ret
+
+0000000080201a20 <mycpu>:
+mycpu(void) {
+    80201a20:	1141                	addi	sp,sp,-16
+    80201a22:	e422                	sd	s0,8(sp)
+    80201a24:	0800                	addi	s0,sp,16
+    80201a26:	8792                	mv	a5,tp
+  struct cpu *c = &cpus[id];
+    80201a28:	2781                	sext.w	a5,a5
+    80201a2a:	079e                	slli	a5,a5,0x7
+}
+    80201a2c:	00012517          	auipc	a0,0x12
+    80201a30:	64c50513          	addi	a0,a0,1612 # 80214078 <cpus>
+    80201a34:	953e                	add	a0,a0,a5
+    80201a36:	6422                	ld	s0,8(sp)
+    80201a38:	0141                	addi	sp,sp,16
+    80201a3a:	8082                	ret
+
+0000000080201a3c <myproc>:
+myproc(void) {
+    80201a3c:	1101                	addi	sp,sp,-32
+    80201a3e:	ec06                	sd	ra,24(sp)
+    80201a40:	e822                	sd	s0,16(sp)
+    80201a42:	e426                	sd	s1,8(sp)
+    80201a44:	1000                	addi	s0,sp,32
+  push_off();
+    80201a46:	fffff097          	auipc	ra,0xfffff
+    80201a4a:	b90080e7          	jalr	-1136(ra) # 802005d6 <push_off>
+    80201a4e:	8792                	mv	a5,tp
+  struct proc *p = c->proc;
+    80201a50:	2781                	sext.w	a5,a5
+    80201a52:	079e                	slli	a5,a5,0x7
+    80201a54:	00012717          	auipc	a4,0x12
+    80201a58:	60c70713          	addi	a4,a4,1548 # 80214060 <pid_lock>
+    80201a5c:	97ba                	add	a5,a5,a4
+    80201a5e:	6f84                	ld	s1,24(a5)
+  pop_off();
+    80201a60:	fffff097          	auipc	ra,0xfffff
+    80201a64:	bc2080e7          	jalr	-1086(ra) # 80200622 <pop_off>
+}
+    80201a68:	8526                	mv	a0,s1
+    80201a6a:	60e2                	ld	ra,24(sp)
+    80201a6c:	6442                	ld	s0,16(sp)
+    80201a6e:	64a2                	ld	s1,8(sp)
+    80201a70:	6105                	addi	sp,sp,32
+    80201a72:	8082                	ret
+
+0000000080201a74 <forkret>:
+{
+    80201a74:	1101                	addi	sp,sp,-32
+    80201a76:	ec06                	sd	ra,24(sp)
+    80201a78:	e822                	sd	s0,16(sp)
+    80201a7a:	e426                	sd	s1,8(sp)
+    80201a7c:	1000                	addi	s0,sp,32
+  release(&myproc()->lock);
+    80201a7e:	00000097          	auipc	ra,0x0
+    80201a82:	fbe080e7          	jalr	-66(ra) # 80201a3c <myproc>
+    80201a86:	fffff097          	auipc	ra,0xfffff
+    80201a8a:	c94080e7          	jalr	-876(ra) # 8020071a <release>
+  if (first) {
+    80201a8e:	00008797          	auipc	a5,0x8
+    80201a92:	5727a783          	lw	a5,1394(a5) # 8020a000 <first.1>
+    80201a96:	eb91                	bnez	a5,80201aaa <forkret+0x36>
+  usertrapret();
+    80201a98:	00001097          	auipc	ra,0x1
+    80201a9c:	ec2080e7          	jalr	-318(ra) # 8020295a <usertrapret>
+}
+    80201aa0:	60e2                	ld	ra,24(sp)
+    80201aa2:	6442                	ld	s0,16(sp)
+    80201aa4:	64a2                	ld	s1,8(sp)
+    80201aa6:	6105                	addi	sp,sp,32
+    80201aa8:	8082                	ret
+    first = 0;
+    80201aaa:	00008797          	auipc	a5,0x8
+    80201aae:	5407ab23          	sw	zero,1366(a5) # 8020a000 <first.1>
+    fat32_init();
+    80201ab2:	00004097          	auipc	ra,0x4
+    80201ab6:	0f2080e7          	jalr	242(ra) # 80205ba4 <fat32_init>
+    myproc()->cwd = ename("/");
+    80201aba:	00000097          	auipc	ra,0x0
+    80201abe:	f82080e7          	jalr	-126(ra) # 80201a3c <myproc>
+    80201ac2:	84aa                	mv	s1,a0
+    80201ac4:	00008517          	auipc	a0,0x8
+    80201ac8:	b6c50513          	addi	a0,a0,-1172 # 80209630 <digits+0x2b0>
+    80201acc:	00005097          	auipc	ra,0x5
+    80201ad0:	34a080e7          	jalr	842(ra) # 80206e16 <ename>
+    80201ad4:	14a4bc23          	sd	a0,344(s1)
+    80201ad8:	b7c1                	j	80201a98 <forkret+0x24>
+
+0000000080201ada <allocpid>:
+allocpid() {
+    80201ada:	1101                	addi	sp,sp,-32
+    80201adc:	ec06                	sd	ra,24(sp)
+    80201ade:	e822                	sd	s0,16(sp)
+    80201ae0:	e426                	sd	s1,8(sp)
+    80201ae2:	e04a                	sd	s2,0(sp)
+    80201ae4:	1000                	addi	s0,sp,32
+  acquire(&pid_lock);
+    80201ae6:	00012917          	auipc	s2,0x12
+    80201aea:	57a90913          	addi	s2,s2,1402 # 80214060 <pid_lock>
+    80201aee:	854a                	mv	a0,s2
+    80201af0:	fffff097          	auipc	ra,0xfffff
+    80201af4:	bd6080e7          	jalr	-1066(ra) # 802006c6 <acquire>
+  pid = nextpid;
+    80201af8:	00008797          	auipc	a5,0x8
+    80201afc:	50878793          	addi	a5,a5,1288 # 8020a000 <first.1>
+    80201b00:	43c4                	lw	s1,4(a5)
+  nextpid = nextpid + 1;
+    80201b02:	0014871b          	addiw	a4,s1,1
+    80201b06:	c3d8                	sw	a4,4(a5)
+  release(&pid_lock);
+    80201b08:	854a                	mv	a0,s2
+    80201b0a:	fffff097          	auipc	ra,0xfffff
+    80201b0e:	c10080e7          	jalr	-1008(ra) # 8020071a <release>
+}
+    80201b12:	8526                	mv	a0,s1
+    80201b14:	60e2                	ld	ra,24(sp)
+    80201b16:	6442                	ld	s0,16(sp)
+    80201b18:	64a2                	ld	s1,8(sp)
+    80201b1a:	6902                	ld	s2,0(sp)
+    80201b1c:	6105                	addi	sp,sp,32
+    80201b1e:	8082                	ret
+
+0000000080201b20 <proc_pagetable>:
+{
+    80201b20:	1101                	addi	sp,sp,-32
+    80201b22:	ec06                	sd	ra,24(sp)
+    80201b24:	e822                	sd	s0,16(sp)
+    80201b26:	e426                	sd	s1,8(sp)
+    80201b28:	e04a                	sd	s2,0(sp)
+    80201b2a:	1000                	addi	s0,sp,32
+    80201b2c:	892a                	mv	s2,a0
+  pagetable = uvmcreate();
+    80201b2e:	fffff097          	auipc	ra,0xfffff
+    80201b32:	3b8080e7          	jalr	952(ra) # 80200ee6 <uvmcreate>
+    80201b36:	84aa                	mv	s1,a0
+  if(pagetable == 0)
+    80201b38:	c121                	beqz	a0,80201b78 <proc_pagetable+0x58>
+  if(mappages(pagetable, TRAMPOLINE, PGSIZE,
+    80201b3a:	4729                	li	a4,10
+    80201b3c:	0000a697          	auipc	a3,0xa
+    80201b40:	1a46b683          	ld	a3,420(a3) # 8020bce0 <_GLOBAL_OFFSET_TABLE_+0x8>
+    80201b44:	6605                	lui	a2,0x1
+    80201b46:	040005b7          	lui	a1,0x4000
+    80201b4a:	15fd                	addi	a1,a1,-1 # 3ffffff <_entry-0x7c200001>
+    80201b4c:	05b2                	slli	a1,a1,0xc
+    80201b4e:	fffff097          	auipc	ra,0xfffff
+    80201b52:	11a080e7          	jalr	282(ra) # 80200c68 <mappages>
+    80201b56:	02054863          	bltz	a0,80201b86 <proc_pagetable+0x66>
+  if(mappages(pagetable, TRAPFRAME, PGSIZE,
+    80201b5a:	4719                	li	a4,6
+    80201b5c:	06093683          	ld	a3,96(s2)
+    80201b60:	6605                	lui	a2,0x1
+    80201b62:	020005b7          	lui	a1,0x2000
+    80201b66:	15fd                	addi	a1,a1,-1 # 1ffffff <_entry-0x7e200001>
+    80201b68:	05b6                	slli	a1,a1,0xd
+    80201b6a:	8526                	mv	a0,s1
+    80201b6c:	fffff097          	auipc	ra,0xfffff
+    80201b70:	0fc080e7          	jalr	252(ra) # 80200c68 <mappages>
+    80201b74:	02054163          	bltz	a0,80201b96 <proc_pagetable+0x76>
+}
+    80201b78:	8526                	mv	a0,s1
+    80201b7a:	60e2                	ld	ra,24(sp)
+    80201b7c:	6442                	ld	s0,16(sp)
+    80201b7e:	64a2                	ld	s1,8(sp)
+    80201b80:	6902                	ld	s2,0(sp)
+    80201b82:	6105                	addi	sp,sp,32
+    80201b84:	8082                	ret
+    uvmfree(pagetable, 0);
+    80201b86:	4581                	li	a1,0
+    80201b88:	8526                	mv	a0,s1
+    80201b8a:	fffff097          	auipc	ra,0xfffff
+    80201b8e:	5e2080e7          	jalr	1506(ra) # 8020116c <uvmfree>
+    return NULL;
+    80201b92:	4481                	li	s1,0
+    80201b94:	b7d5                	j	80201b78 <proc_pagetable+0x58>
+    vmunmap(pagetable, TRAMPOLINE, 1, 0);
+    80201b96:	4681                	li	a3,0
+    80201b98:	4605                	li	a2,1
+    80201b9a:	040005b7          	lui	a1,0x4000
+    80201b9e:	15fd                	addi	a1,a1,-1 # 3ffffff <_entry-0x7c200001>
+    80201ba0:	05b2                	slli	a1,a1,0xc
+    80201ba2:	8526                	mv	a0,s1
+    80201ba4:	fffff097          	auipc	ra,0xfffff
+    80201ba8:	27e080e7          	jalr	638(ra) # 80200e22 <vmunmap>
+    uvmfree(pagetable, 0);
+    80201bac:	4581                	li	a1,0
+    80201bae:	8526                	mv	a0,s1
+    80201bb0:	fffff097          	auipc	ra,0xfffff
+    80201bb4:	5bc080e7          	jalr	1468(ra) # 8020116c <uvmfree>
+    return NULL;
+    80201bb8:	4481                	li	s1,0
+    80201bba:	bf7d                	j	80201b78 <proc_pagetable+0x58>
+
+0000000080201bbc <proc_freepagetable>:
+{
+    80201bbc:	1101                	addi	sp,sp,-32
+    80201bbe:	ec06                	sd	ra,24(sp)
+    80201bc0:	e822                	sd	s0,16(sp)
+    80201bc2:	e426                	sd	s1,8(sp)
+    80201bc4:	e04a                	sd	s2,0(sp)
+    80201bc6:	1000                	addi	s0,sp,32
+    80201bc8:	84aa                	mv	s1,a0
+    80201bca:	892e                	mv	s2,a1
+  vmunmap(pagetable, TRAMPOLINE, 1, 0);
+    80201bcc:	4681                	li	a3,0
+    80201bce:	4605                	li	a2,1
+    80201bd0:	040005b7          	lui	a1,0x4000
+    80201bd4:	15fd                	addi	a1,a1,-1 # 3ffffff <_entry-0x7c200001>
+    80201bd6:	05b2                	slli	a1,a1,0xc
+    80201bd8:	fffff097          	auipc	ra,0xfffff
+    80201bdc:	24a080e7          	jalr	586(ra) # 80200e22 <vmunmap>
+  vmunmap(pagetable, TRAPFRAME, 1, 0);
+    80201be0:	4681                	li	a3,0
+    80201be2:	4605                	li	a2,1
+    80201be4:	020005b7          	lui	a1,0x2000
+    80201be8:	15fd                	addi	a1,a1,-1 # 1ffffff <_entry-0x7e200001>
+    80201bea:	05b6                	slli	a1,a1,0xd
+    80201bec:	8526                	mv	a0,s1
+    80201bee:	fffff097          	auipc	ra,0xfffff
+    80201bf2:	234080e7          	jalr	564(ra) # 80200e22 <vmunmap>
+  uvmfree(pagetable, sz);
+    80201bf6:	85ca                	mv	a1,s2
+    80201bf8:	8526                	mv	a0,s1
+    80201bfa:	fffff097          	auipc	ra,0xfffff
+    80201bfe:	572080e7          	jalr	1394(ra) # 8020116c <uvmfree>
+}
+    80201c02:	60e2                	ld	ra,24(sp)
+    80201c04:	6442                	ld	s0,16(sp)
+    80201c06:	64a2                	ld	s1,8(sp)
+    80201c08:	6902                	ld	s2,0(sp)
+    80201c0a:	6105                	addi	sp,sp,32
+    80201c0c:	8082                	ret
+
+0000000080201c0e <freeproc>:
+{
+    80201c0e:	1101                	addi	sp,sp,-32
+    80201c10:	ec06                	sd	ra,24(sp)
+    80201c12:	e822                	sd	s0,16(sp)
+    80201c14:	e426                	sd	s1,8(sp)
+    80201c16:	1000                	addi	s0,sp,32
+    80201c18:	84aa                	mv	s1,a0
+  if(p->trapframe)
+    80201c1a:	7128                	ld	a0,96(a0)
+    80201c1c:	c509                	beqz	a0,80201c26 <freeproc+0x18>
+    kfree((void*)p->trapframe);
+    80201c1e:	fffff097          	auipc	ra,0xfffff
+    80201c22:	822080e7          	jalr	-2014(ra) # 80200440 <kfree>
+  p->trapframe = 0;
+    80201c26:	0604b023          	sd	zero,96(s1)
+  if (p->kpagetable) {
+    80201c2a:	6ca8                	ld	a0,88(s1)
+    80201c2c:	c511                	beqz	a0,80201c38 <freeproc+0x2a>
+    kvmfree(p->kpagetable, 1);
+    80201c2e:	4585                	li	a1,1
+    80201c30:	00000097          	auipc	ra,0x0
+    80201c34:	a42080e7          	jalr	-1470(ra) # 80201672 <kvmfree>
+  p->kpagetable = 0;
+    80201c38:	0404bc23          	sd	zero,88(s1)
+  if(p->pagetable)
+    80201c3c:	68a8                	ld	a0,80(s1)
+    80201c3e:	c511                	beqz	a0,80201c4a <freeproc+0x3c>
+    proc_freepagetable(p->pagetable, p->sz);
+    80201c40:	64ac                	ld	a1,72(s1)
+    80201c42:	00000097          	auipc	ra,0x0
+    80201c46:	f7a080e7          	jalr	-134(ra) # 80201bbc <proc_freepagetable>
+  p->pagetable = 0;
+    80201c4a:	0404b823          	sd	zero,80(s1)
+  p->sz = 0;
+    80201c4e:	0404b423          	sd	zero,72(s1)
+  p->pid = 0;
+    80201c52:	0204ac23          	sw	zero,56(s1)
+  p->parent = 0;
+    80201c56:	0204b023          	sd	zero,32(s1)
+  p->name[0] = 0;
+    80201c5a:	16048023          	sb	zero,352(s1)
+  p->chan = 0;
+    80201c5e:	0204b423          	sd	zero,40(s1)
+  p->killed = 0;
+    80201c62:	0204a823          	sw	zero,48(s1)
+  p->xstate = 0;
+    80201c66:	0204aa23          	sw	zero,52(s1)
+  p->state = UNUSED;
+    80201c6a:	0004ac23          	sw	zero,24(s1)
+}
+    80201c6e:	60e2                	ld	ra,24(sp)
+    80201c70:	6442                	ld	s0,16(sp)
+    80201c72:	64a2                	ld	s1,8(sp)
+    80201c74:	6105                	addi	sp,sp,32
+    80201c76:	8082                	ret
+
+0000000080201c78 <allocproc>:
+{
+    80201c78:	1101                	addi	sp,sp,-32
+    80201c7a:	ec06                	sd	ra,24(sp)
+    80201c7c:	e822                	sd	s0,16(sp)
+    80201c7e:	e426                	sd	s1,8(sp)
+    80201c80:	e04a                	sd	s2,0(sp)
+    80201c82:	1000                	addi	s0,sp,32
+  for(p = proc; p < &proc[NPROC]; p++) {
+    80201c84:	00012497          	auipc	s1,0x12
+    80201c88:	4fc48493          	addi	s1,s1,1276 # 80214180 <proc>
+    80201c8c:	00017917          	auipc	s2,0x17
+    80201c90:	e6490913          	addi	s2,s2,-412 # 80218af0 <bcache>
+    acquire(&p->lock);
+    80201c94:	8526                	mv	a0,s1
+    80201c96:	fffff097          	auipc	ra,0xfffff
+    80201c9a:	a30080e7          	jalr	-1488(ra) # 802006c6 <acquire>
+    if(p->state == UNUSED) {
+    80201c9e:	4c9c                	lw	a5,24(s1)
+    80201ca0:	cf81                	beqz	a5,80201cb8 <allocproc+0x40>
+      release(&p->lock);
+    80201ca2:	8526                	mv	a0,s1
+    80201ca4:	fffff097          	auipc	ra,0xfffff
+    80201ca8:	a76080e7          	jalr	-1418(ra) # 8020071a <release>
+  for(p = proc; p < &proc[NPROC]; p++) {
+    80201cac:	17848493          	addi	s1,s1,376
+    80201cb0:	ff2492e3          	bne	s1,s2,80201c94 <allocproc+0x1c>
+  return NULL;
+    80201cb4:	4481                	li	s1,0
+    80201cb6:	a085                	j	80201d16 <allocproc+0x9e>
+  p->pid = allocpid();
+    80201cb8:	00000097          	auipc	ra,0x0
+    80201cbc:	e22080e7          	jalr	-478(ra) # 80201ada <allocpid>
+    80201cc0:	dc88                	sw	a0,56(s1)
+  if((p->trapframe = (struct trapframe *)kalloc()) == NULL){
+    80201cc2:	fffff097          	auipc	ra,0xfffff
+    80201cc6:	898080e7          	jalr	-1896(ra) # 8020055a <kalloc>
+    80201cca:	892a                	mv	s2,a0
+    80201ccc:	f0a8                	sd	a0,96(s1)
+    80201cce:	c939                	beqz	a0,80201d24 <allocproc+0xac>
+  if ((p->pagetable = proc_pagetable(p)) == NULL ||
+    80201cd0:	8526                	mv	a0,s1
+    80201cd2:	00000097          	auipc	ra,0x0
+    80201cd6:	e4e080e7          	jalr	-434(ra) # 80201b20 <proc_pagetable>
+    80201cda:	e8a8                	sd	a0,80(s1)
+    80201cdc:	c939                	beqz	a0,80201d32 <allocproc+0xba>
+      (p->kpagetable = proc_kpagetable()) == NULL) {
+    80201cde:	00000097          	auipc	ra,0x0
+    80201ce2:	9ee080e7          	jalr	-1554(ra) # 802016cc <proc_kpagetable>
+    80201ce6:	eca8                	sd	a0,88(s1)
+  if ((p->pagetable = proc_pagetable(p)) == NULL ||
+    80201ce8:	c529                	beqz	a0,80201d32 <allocproc+0xba>
+  p->kstack = VKSTACK;
+    80201cea:	0fb00793          	li	a5,251
+    80201cee:	07fa                	slli	a5,a5,0x1e
+    80201cf0:	e0bc                	sd	a5,64(s1)
+  memset(&p->context, 0, sizeof(p->context));
+    80201cf2:	07000613          	li	a2,112
+    80201cf6:	4581                	li	a1,0
+    80201cf8:	06848513          	addi	a0,s1,104
+    80201cfc:	fffff097          	auipc	ra,0xfffff
+    80201d00:	a66080e7          	jalr	-1434(ra) # 80200762 <memset>
+  p->context.ra = (uint64)forkret;
+    80201d04:	00000797          	auipc	a5,0x0
+    80201d08:	d7078793          	addi	a5,a5,-656 # 80201a74 <forkret>
+    80201d0c:	f4bc                	sd	a5,104(s1)
+  p->context.sp = p->kstack + PGSIZE;
+    80201d0e:	60bc                	ld	a5,64(s1)
+    80201d10:	6705                	lui	a4,0x1
+    80201d12:	97ba                	add	a5,a5,a4
+    80201d14:	f8bc                	sd	a5,112(s1)
+}
+    80201d16:	8526                	mv	a0,s1
+    80201d18:	60e2                	ld	ra,24(sp)
+    80201d1a:	6442                	ld	s0,16(sp)
+    80201d1c:	64a2                	ld	s1,8(sp)
+    80201d1e:	6902                	ld	s2,0(sp)
+    80201d20:	6105                	addi	sp,sp,32
+    80201d22:	8082                	ret
+    release(&p->lock);
+    80201d24:	8526                	mv	a0,s1
+    80201d26:	fffff097          	auipc	ra,0xfffff
+    80201d2a:	9f4080e7          	jalr	-1548(ra) # 8020071a <release>
+    return NULL;
+    80201d2e:	84ca                	mv	s1,s2
+    80201d30:	b7dd                	j	80201d16 <allocproc+0x9e>
+    freeproc(p);
+    80201d32:	8526                	mv	a0,s1
+    80201d34:	00000097          	auipc	ra,0x0
+    80201d38:	eda080e7          	jalr	-294(ra) # 80201c0e <freeproc>
+    release(&p->lock);
+    80201d3c:	8526                	mv	a0,s1
+    80201d3e:	fffff097          	auipc	ra,0xfffff
+    80201d42:	9dc080e7          	jalr	-1572(ra) # 8020071a <release>
+    return NULL;
+    80201d46:	4481                	li	s1,0
+    80201d48:	b7f9                	j	80201d16 <allocproc+0x9e>
+
+0000000080201d4a <userinit>:
+{
+    80201d4a:	1101                	addi	sp,sp,-32
+    80201d4c:	ec06                	sd	ra,24(sp)
+    80201d4e:	e822                	sd	s0,16(sp)
+    80201d50:	e426                	sd	s1,8(sp)
+    80201d52:	e04a                	sd	s2,0(sp)
+    80201d54:	1000                	addi	s0,sp,32
+  p = allocproc();
+    80201d56:	00000097          	auipc	ra,0x0
+    80201d5a:	f22080e7          	jalr	-222(ra) # 80201c78 <allocproc>
+    80201d5e:	84aa                	mv	s1,a0
+  initproc = p;
+    80201d60:	00012797          	auipc	a5,0x12
+    80201d64:	40a7bc23          	sd	a0,1048(a5) # 80214178 <initproc>
+  uvminit(p->pagetable , p->kpagetable, initcode, sizeof(initcode));
+    80201d68:	6905                	lui	s2,0x1
+    80201d6a:	c4090693          	addi	a3,s2,-960 # c40 <_entry-0x801ff3c0>
+    80201d6e:	00008617          	auipc	a2,0x8
+    80201d72:	29a60613          	addi	a2,a2,666 # 8020a008 <initcode>
+    80201d76:	6d2c                	ld	a1,88(a0)
+    80201d78:	6928                	ld	a0,80(a0)
+    80201d7a:	fffff097          	auipc	ra,0xfffff
+    80201d7e:	19a080e7          	jalr	410(ra) # 80200f14 <uvminit>
+  p->sz = PGSIZE;
+    80201d82:	0524b423          	sd	s2,72(s1)
+  p->trapframe->epc = 0x0;      // user program counter
+    80201d86:	70bc                	ld	a5,96(s1)
+    80201d88:	0007bc23          	sd	zero,24(a5)
+  p->trapframe->sp = PGSIZE;  // user stack pointer
+    80201d8c:	70bc                	ld	a5,96(s1)
+    80201d8e:	0327b823          	sd	s2,48(a5)
+  safestrcpy(p->name, "initcode", sizeof(p->name));
+    80201d92:	4641                	li	a2,16
+    80201d94:	00008597          	auipc	a1,0x8
+    80201d98:	8a458593          	addi	a1,a1,-1884 # 80209638 <digits+0x2b8>
+    80201d9c:	16048513          	addi	a0,s1,352
+    80201da0:	fffff097          	auipc	ra,0xfffff
+    80201da4:	b14080e7          	jalr	-1260(ra) # 802008b4 <safestrcpy>
+  p->state = RUNNABLE;
+    80201da8:	4789                	li	a5,2
+    80201daa:	cc9c                	sw	a5,24(s1)
+  p->tmask = 0;
+    80201dac:	1604a823          	sw	zero,368(s1)
+  release(&p->lock);
+    80201db0:	8526                	mv	a0,s1
+    80201db2:	fffff097          	auipc	ra,0xfffff
+    80201db6:	968080e7          	jalr	-1688(ra) # 8020071a <release>
+}
+    80201dba:	60e2                	ld	ra,24(sp)
+    80201dbc:	6442                	ld	s0,16(sp)
+    80201dbe:	64a2                	ld	s1,8(sp)
+    80201dc0:	6902                	ld	s2,0(sp)
+    80201dc2:	6105                	addi	sp,sp,32
+    80201dc4:	8082                	ret
+
+0000000080201dc6 <growproc>:
+{
+    80201dc6:	1101                	addi	sp,sp,-32
+    80201dc8:	ec06                	sd	ra,24(sp)
+    80201dca:	e822                	sd	s0,16(sp)
+    80201dcc:	e426                	sd	s1,8(sp)
+    80201dce:	e04a                	sd	s2,0(sp)
+    80201dd0:	1000                	addi	s0,sp,32
+    80201dd2:	84aa                	mv	s1,a0
+  struct proc *p = myproc();
+    80201dd4:	00000097          	auipc	ra,0x0
+    80201dd8:	c68080e7          	jalr	-920(ra) # 80201a3c <myproc>
+    80201ddc:	892a                	mv	s2,a0
+  sz = p->sz;
+    80201dde:	6530                	ld	a2,72(a0)
+    80201de0:	0006079b          	sext.w	a5,a2
+  if(n > 0){
+    80201de4:	00904f63          	bgtz	s1,80201e02 <growproc+0x3c>
+  } else if(n < 0){
+    80201de8:	0204ce63          	bltz	s1,80201e24 <growproc+0x5e>
+  p->sz = sz;
+    80201dec:	1782                	slli	a5,a5,0x20
+    80201dee:	9381                	srli	a5,a5,0x20
+    80201df0:	04f93423          	sd	a5,72(s2)
+  return 0;
+    80201df4:	4501                	li	a0,0
+}
+    80201df6:	60e2                	ld	ra,24(sp)
+    80201df8:	6442                	ld	s0,16(sp)
+    80201dfa:	64a2                	ld	s1,8(sp)
+    80201dfc:	6902                	ld	s2,0(sp)
+    80201dfe:	6105                	addi	sp,sp,32
+    80201e00:	8082                	ret
+    if((sz = uvmalloc(p->pagetable, p->kpagetable, sz, sz + n)) == 0) {
+    80201e02:	00f486bb          	addw	a3,s1,a5
+    80201e06:	1682                	slli	a3,a3,0x20
+    80201e08:	9281                	srli	a3,a3,0x20
+    80201e0a:	1602                	slli	a2,a2,0x20
+    80201e0c:	9201                	srli	a2,a2,0x20
+    80201e0e:	6d2c                	ld	a1,88(a0)
+    80201e10:	6928                	ld	a0,80(a0)
+    80201e12:	fffff097          	auipc	ra,0xfffff
+    80201e16:	1f8080e7          	jalr	504(ra) # 8020100a <uvmalloc>
+    80201e1a:	0005079b          	sext.w	a5,a0
+    80201e1e:	f7f9                	bnez	a5,80201dec <growproc+0x26>
+      return -1;
+    80201e20:	557d                	li	a0,-1
+    80201e22:	bfd1                	j	80201df6 <growproc+0x30>
+    sz = uvmdealloc(p->pagetable, p->kpagetable, sz, sz + n);
+    80201e24:	00f486bb          	addw	a3,s1,a5
+    80201e28:	1682                	slli	a3,a3,0x20
+    80201e2a:	9281                	srli	a3,a3,0x20
+    80201e2c:	1602                	slli	a2,a2,0x20
+    80201e2e:	9201                	srli	a2,a2,0x20
+    80201e30:	6d2c                	ld	a1,88(a0)
+    80201e32:	6928                	ld	a0,80(a0)
+    80201e34:	fffff097          	auipc	ra,0xfffff
+    80201e38:	16a080e7          	jalr	362(ra) # 80200f9e <uvmdealloc>
+    80201e3c:	0005079b          	sext.w	a5,a0
+    80201e40:	b775                	j	80201dec <growproc+0x26>
+
+0000000080201e42 <fork>:
+{
+    80201e42:	7139                	addi	sp,sp,-64
+    80201e44:	fc06                	sd	ra,56(sp)
+    80201e46:	f822                	sd	s0,48(sp)
+    80201e48:	f426                	sd	s1,40(sp)
+    80201e4a:	f04a                	sd	s2,32(sp)
+    80201e4c:	ec4e                	sd	s3,24(sp)
+    80201e4e:	e852                	sd	s4,16(sp)
+    80201e50:	e456                	sd	s5,8(sp)
+    80201e52:	0080                	addi	s0,sp,64
+  struct proc *p = myproc();
+    80201e54:	00000097          	auipc	ra,0x0
+    80201e58:	be8080e7          	jalr	-1048(ra) # 80201a3c <myproc>
+    80201e5c:	8aaa                	mv	s5,a0
+  if((np = allocproc()) == NULL){
+    80201e5e:	00000097          	auipc	ra,0x0
+    80201e62:	e1a080e7          	jalr	-486(ra) # 80201c78 <allocproc>
+    80201e66:	c965                	beqz	a0,80201f56 <fork+0x114>
+    80201e68:	8a2a                	mv	s4,a0
+  if(uvmcopy(p->pagetable, np->pagetable, np->kpagetable, p->sz) < 0){
+    80201e6a:	048ab683          	ld	a3,72(s5)
+    80201e6e:	6d30                	ld	a2,88(a0)
+    80201e70:	692c                	ld	a1,80(a0)
+    80201e72:	050ab503          	ld	a0,80(s5)
+    80201e76:	fffff097          	auipc	ra,0xfffff
+    80201e7a:	330080e7          	jalr	816(ra) # 802011a6 <uvmcopy>
+    80201e7e:	04054e63          	bltz	a0,80201eda <fork+0x98>
+  np->sz = p->sz;
+    80201e82:	048ab783          	ld	a5,72(s5)
+    80201e86:	04fa3423          	sd	a5,72(s4)
+  np->parent = p;
+    80201e8a:	035a3023          	sd	s5,32(s4)
+  np->tmask = p->tmask;
+    80201e8e:	170aa783          	lw	a5,368(s5)
+    80201e92:	16fa2823          	sw	a5,368(s4)
+  *(np->trapframe) = *(p->trapframe);
+    80201e96:	060ab683          	ld	a3,96(s5)
+    80201e9a:	87b6                	mv	a5,a3
+    80201e9c:	060a3703          	ld	a4,96(s4)
+    80201ea0:	12068693          	addi	a3,a3,288
+    80201ea4:	0007b803          	ld	a6,0(a5)
+    80201ea8:	6788                	ld	a0,8(a5)
+    80201eaa:	6b8c                	ld	a1,16(a5)
+    80201eac:	6f90                	ld	a2,24(a5)
+    80201eae:	01073023          	sd	a6,0(a4) # 1000 <_entry-0x801ff000>
+    80201eb2:	e708                	sd	a0,8(a4)
+    80201eb4:	eb0c                	sd	a1,16(a4)
+    80201eb6:	ef10                	sd	a2,24(a4)
+    80201eb8:	02078793          	addi	a5,a5,32
+    80201ebc:	02070713          	addi	a4,a4,32
+    80201ec0:	fed792e3          	bne	a5,a3,80201ea4 <fork+0x62>
+  np->trapframe->a0 = 0;
+    80201ec4:	060a3783          	ld	a5,96(s4)
+    80201ec8:	0607b823          	sd	zero,112(a5)
+  for(i = 0; i < NOFILE; i++)
+    80201ecc:	0d8a8493          	addi	s1,s5,216
+    80201ed0:	0d8a0913          	addi	s2,s4,216
+    80201ed4:	158a8993          	addi	s3,s5,344
+    80201ed8:	a00d                	j	80201efa <fork+0xb8>
+    freeproc(np);
+    80201eda:	8552                	mv	a0,s4
+    80201edc:	00000097          	auipc	ra,0x0
+    80201ee0:	d32080e7          	jalr	-718(ra) # 80201c0e <freeproc>
+    release(&np->lock);
+    80201ee4:	8552                	mv	a0,s4
+    80201ee6:	fffff097          	auipc	ra,0xfffff
+    80201eea:	834080e7          	jalr	-1996(ra) # 8020071a <release>
+    return -1;
+    80201eee:	54fd                	li	s1,-1
+    80201ef0:	a889                	j	80201f42 <fork+0x100>
+  for(i = 0; i < NOFILE; i++)
+    80201ef2:	04a1                	addi	s1,s1,8
+    80201ef4:	0921                	addi	s2,s2,8
+    80201ef6:	01348b63          	beq	s1,s3,80201f0c <fork+0xca>
+    if(p->ofile[i])
+    80201efa:	6088                	ld	a0,0(s1)
+    80201efc:	d97d                	beqz	a0,80201ef2 <fork+0xb0>
+      np->ofile[i] = filedup(p->ofile[i]);
+    80201efe:	00002097          	auipc	ra,0x2
+    80201f02:	d82080e7          	jalr	-638(ra) # 80203c80 <filedup>
+    80201f06:	00a93023          	sd	a0,0(s2)
+    80201f0a:	b7e5                	j	80201ef2 <fork+0xb0>
+  np->cwd = edup(p->cwd);
+    80201f0c:	158ab503          	ld	a0,344(s5)
+    80201f10:	00004097          	auipc	ra,0x4
+    80201f14:	500080e7          	jalr	1280(ra) # 80206410 <edup>
+    80201f18:	14aa3c23          	sd	a0,344(s4)
+  safestrcpy(np->name, p->name, sizeof(p->name));
+    80201f1c:	4641                	li	a2,16
+    80201f1e:	160a8593          	addi	a1,s5,352
+    80201f22:	160a0513          	addi	a0,s4,352
+    80201f26:	fffff097          	auipc	ra,0xfffff
+    80201f2a:	98e080e7          	jalr	-1650(ra) # 802008b4 <safestrcpy>
+  pid = np->pid;
+    80201f2e:	038a2483          	lw	s1,56(s4)
+  np->state = RUNNABLE;
+    80201f32:	4789                	li	a5,2
+    80201f34:	00fa2c23          	sw	a5,24(s4)
+  release(&np->lock);
+    80201f38:	8552                	mv	a0,s4
+    80201f3a:	ffffe097          	auipc	ra,0xffffe
+    80201f3e:	7e0080e7          	jalr	2016(ra) # 8020071a <release>
+}
+    80201f42:	8526                	mv	a0,s1
+    80201f44:	70e2                	ld	ra,56(sp)
+    80201f46:	7442                	ld	s0,48(sp)
+    80201f48:	74a2                	ld	s1,40(sp)
+    80201f4a:	7902                	ld	s2,32(sp)
+    80201f4c:	69e2                	ld	s3,24(sp)
+    80201f4e:	6a42                	ld	s4,16(sp)
+    80201f50:	6aa2                	ld	s5,8(sp)
+    80201f52:	6121                	addi	sp,sp,64
+    80201f54:	8082                	ret
+    return -1;
+    80201f56:	54fd                	li	s1,-1
+    80201f58:	b7ed                	j	80201f42 <fork+0x100>
+
+0000000080201f5a <clone>:
+{
+    80201f5a:	7139                	addi	sp,sp,-64
+    80201f5c:	fc06                	sd	ra,56(sp)
+    80201f5e:	f822                	sd	s0,48(sp)
+    80201f60:	f426                	sd	s1,40(sp)
+    80201f62:	f04a                	sd	s2,32(sp)
+    80201f64:	ec4e                	sd	s3,24(sp)
+    80201f66:	e852                	sd	s4,16(sp)
+    80201f68:	e456                	sd	s5,8(sp)
+    80201f6a:	0080                	addi	s0,sp,64
+    80201f6c:	84aa                	mv	s1,a0
+  struct proc *p = myproc();
+    80201f6e:	00000097          	auipc	ra,0x0
+    80201f72:	ace080e7          	jalr	-1330(ra) # 80201a3c <myproc>
+  if(stack < 0 || stack > p->sz)
+    80201f76:	1004c863          	bltz	s1,80202086 <clone+0x12c>
+    80201f7a:	8aaa                	mv	s5,a0
+    80201f7c:	653c                	ld	a5,72(a0)
+    80201f7e:	1097e663          	bltu	a5,s1,8020208a <clone+0x130>
+  if((np = allocproc()) == NULL){
+    80201f82:	00000097          	auipc	ra,0x0
+    80201f86:	cf6080e7          	jalr	-778(ra) # 80201c78 <allocproc>
+    80201f8a:	89aa                	mv	s3,a0
+    80201f8c:	10050163          	beqz	a0,8020208e <clone+0x134>
+  if(uvmcopy(p->pagetable, np->pagetable, np->kpagetable, p->sz) < 0){
+    80201f90:	048ab683          	ld	a3,72(s5)
+    80201f94:	6d30                	ld	a2,88(a0)
+    80201f96:	692c                	ld	a1,80(a0)
+    80201f98:	050ab503          	ld	a0,80(s5)
+    80201f9c:	fffff097          	auipc	ra,0xfffff
+    80201fa0:	20a080e7          	jalr	522(ra) # 802011a6 <uvmcopy>
+    80201fa4:	06054363          	bltz	a0,8020200a <clone+0xb0>
+  np->sz = p->sz;
+    80201fa8:	048ab783          	ld	a5,72(s5)
+    80201fac:	04f9b423          	sd	a5,72(s3)
+  np->parent = p;
+    80201fb0:	0359b023          	sd	s5,32(s3)
+  np->tmask = p->tmask;
+    80201fb4:	170aa783          	lw	a5,368(s5)
+    80201fb8:	16f9a823          	sw	a5,368(s3)
+  *(np->trapframe) = *(p->trapframe);
+    80201fbc:	060ab683          	ld	a3,96(s5)
+    80201fc0:	87b6                	mv	a5,a3
+    80201fc2:	0609b703          	ld	a4,96(s3)
+    80201fc6:	12068693          	addi	a3,a3,288
+    80201fca:	0007b803          	ld	a6,0(a5)
+    80201fce:	6788                	ld	a0,8(a5)
+    80201fd0:	6b8c                	ld	a1,16(a5)
+    80201fd2:	6f90                	ld	a2,24(a5)
+    80201fd4:	01073023          	sd	a6,0(a4)
+    80201fd8:	e708                	sd	a0,8(a4)
+    80201fda:	eb0c                	sd	a1,16(a4)
+    80201fdc:	ef10                	sd	a2,24(a4)
+    80201fde:	02078793          	addi	a5,a5,32
+    80201fe2:	02070713          	addi	a4,a4,32
+    80201fe6:	fed792e3          	bne	a5,a3,80201fca <clone+0x70>
+  np->trapframe->a0 = 0;
+    80201fea:	0609b783          	ld	a5,96(s3)
+    80201fee:	0607b823          	sd	zero,112(a5)
+  if(stack > 0) np->trapframe->sp = stack;
+    80201ff2:	00905563          	blez	s1,80201ffc <clone+0xa2>
+    80201ff6:	0609b783          	ld	a5,96(s3)
+    80201ffa:	fb84                	sd	s1,48(a5)
+  for(i = 0; i < NOFILE; i++)
+    80201ffc:	0d8a8493          	addi	s1,s5,216
+    80202000:	0d898913          	addi	s2,s3,216
+    80202004:	158a8a13          	addi	s4,s5,344
+    80202008:	a00d                	j	8020202a <clone+0xd0>
+    freeproc(np);
+    8020200a:	854e                	mv	a0,s3
+    8020200c:	00000097          	auipc	ra,0x0
+    80202010:	c02080e7          	jalr	-1022(ra) # 80201c0e <freeproc>
+    release(&np->lock);
+    80202014:	854e                	mv	a0,s3
+    80202016:	ffffe097          	auipc	ra,0xffffe
+    8020201a:	704080e7          	jalr	1796(ra) # 8020071a <release>
+    return -1;
+    8020201e:	54fd                	li	s1,-1
+    80202020:	a889                	j	80202072 <clone+0x118>
+  for(i = 0; i < NOFILE; i++)
+    80202022:	04a1                	addi	s1,s1,8
+    80202024:	0921                	addi	s2,s2,8
+    80202026:	01448b63          	beq	s1,s4,8020203c <clone+0xe2>
+    if(p->ofile[i])
+    8020202a:	6088                	ld	a0,0(s1)
+    8020202c:	d97d                	beqz	a0,80202022 <clone+0xc8>
+      np->ofile[i] = filedup(p->ofile[i]);
+    8020202e:	00002097          	auipc	ra,0x2
+    80202032:	c52080e7          	jalr	-942(ra) # 80203c80 <filedup>
+    80202036:	00a93023          	sd	a0,0(s2)
+    8020203a:	b7e5                	j	80202022 <clone+0xc8>
+  np->cwd = edup(p->cwd);
+    8020203c:	158ab503          	ld	a0,344(s5)
+    80202040:	00004097          	auipc	ra,0x4
+    80202044:	3d0080e7          	jalr	976(ra) # 80206410 <edup>
+    80202048:	14a9bc23          	sd	a0,344(s3)
+  safestrcpy(np->name, p->name, sizeof(p->name));
+    8020204c:	4641                	li	a2,16
+    8020204e:	160a8593          	addi	a1,s5,352
+    80202052:	16098513          	addi	a0,s3,352
+    80202056:	fffff097          	auipc	ra,0xfffff
+    8020205a:	85e080e7          	jalr	-1954(ra) # 802008b4 <safestrcpy>
+  pid = np->pid;
+    8020205e:	0389a483          	lw	s1,56(s3)
+  np->state = RUNNABLE;
+    80202062:	4789                	li	a5,2
+    80202064:	00f9ac23          	sw	a5,24(s3)
+  release(&np->lock);
+    80202068:	854e                	mv	a0,s3
+    8020206a:	ffffe097          	auipc	ra,0xffffe
+    8020206e:	6b0080e7          	jalr	1712(ra) # 8020071a <release>
+}
+    80202072:	8526                	mv	a0,s1
+    80202074:	70e2                	ld	ra,56(sp)
+    80202076:	7442                	ld	s0,48(sp)
+    80202078:	74a2                	ld	s1,40(sp)
+    8020207a:	7902                	ld	s2,32(sp)
+    8020207c:	69e2                	ld	s3,24(sp)
+    8020207e:	6a42                	ld	s4,16(sp)
+    80202080:	6aa2                	ld	s5,8(sp)
+    80202082:	6121                	addi	sp,sp,64
+    80202084:	8082                	ret
+    return -1;
+    80202086:	54fd                	li	s1,-1
+    80202088:	b7ed                	j	80202072 <clone+0x118>
+    8020208a:	54fd                	li	s1,-1
+    8020208c:	b7dd                	j	80202072 <clone+0x118>
+    return -1;
+    8020208e:	54fd                	li	s1,-1
+    80202090:	b7cd                	j	80202072 <clone+0x118>
+
+0000000080202092 <reparent>:
+{
+    80202092:	7179                	addi	sp,sp,-48
+    80202094:	f406                	sd	ra,40(sp)
+    80202096:	f022                	sd	s0,32(sp)
+    80202098:	ec26                	sd	s1,24(sp)
+    8020209a:	e84a                	sd	s2,16(sp)
+    8020209c:	e44e                	sd	s3,8(sp)
+    8020209e:	e052                	sd	s4,0(sp)
+    802020a0:	1800                	addi	s0,sp,48
+    802020a2:	892a                	mv	s2,a0
+  for(pp = proc; pp < &proc[NPROC]; pp++){
+    802020a4:	00012497          	auipc	s1,0x12
+    802020a8:	0dc48493          	addi	s1,s1,220 # 80214180 <proc>
+      pp->parent = initproc;
+    802020ac:	00012a17          	auipc	s4,0x12
+    802020b0:	fb4a0a13          	addi	s4,s4,-76 # 80214060 <pid_lock>
+  for(pp = proc; pp < &proc[NPROC]; pp++){
+    802020b4:	00017997          	auipc	s3,0x17
+    802020b8:	a3c98993          	addi	s3,s3,-1476 # 80218af0 <bcache>
+    802020bc:	a029                	j	802020c6 <reparent+0x34>
+    802020be:	17848493          	addi	s1,s1,376
+    802020c2:	03348363          	beq	s1,s3,802020e8 <reparent+0x56>
+    if(pp->parent == p){
+    802020c6:	709c                	ld	a5,32(s1)
+    802020c8:	ff279be3          	bne	a5,s2,802020be <reparent+0x2c>
+      acquire(&pp->lock);
+    802020cc:	8526                	mv	a0,s1
+    802020ce:	ffffe097          	auipc	ra,0xffffe
+    802020d2:	5f8080e7          	jalr	1528(ra) # 802006c6 <acquire>
+      pp->parent = initproc;
+    802020d6:	118a3783          	ld	a5,280(s4)
+    802020da:	f09c                	sd	a5,32(s1)
+      release(&pp->lock);
+    802020dc:	8526                	mv	a0,s1
+    802020de:	ffffe097          	auipc	ra,0xffffe
+    802020e2:	63c080e7          	jalr	1596(ra) # 8020071a <release>
+    802020e6:	bfe1                	j	802020be <reparent+0x2c>
+}
+    802020e8:	70a2                	ld	ra,40(sp)
+    802020ea:	7402                	ld	s0,32(sp)
+    802020ec:	64e2                	ld	s1,24(sp)
+    802020ee:	6942                	ld	s2,16(sp)
+    802020f0:	69a2                	ld	s3,8(sp)
+    802020f2:	6a02                	ld	s4,0(sp)
+    802020f4:	6145                	addi	sp,sp,48
+    802020f6:	8082                	ret
+
+00000000802020f8 <scheduler>:
+{
+    802020f8:	715d                	addi	sp,sp,-80
+    802020fa:	e486                	sd	ra,72(sp)
+    802020fc:	e0a2                	sd	s0,64(sp)
+    802020fe:	fc26                	sd	s1,56(sp)
+    80202100:	f84a                	sd	s2,48(sp)
+    80202102:	f44e                	sd	s3,40(sp)
+    80202104:	f052                	sd	s4,32(sp)
+    80202106:	ec56                	sd	s5,24(sp)
+    80202108:	e85a                	sd	s6,16(sp)
+    8020210a:	e45e                	sd	s7,8(sp)
+    8020210c:	e062                	sd	s8,0(sp)
+    8020210e:	0880                	addi	s0,sp,80
+    80202110:	8792                	mv	a5,tp
+  int id = r_tp();
+    80202112:	2781                	sext.w	a5,a5
+  c->proc = 0;
+    80202114:	00779b13          	slli	s6,a5,0x7
+    80202118:	00012717          	auipc	a4,0x12
+    8020211c:	f4870713          	addi	a4,a4,-184 # 80214060 <pid_lock>
+    80202120:	975a                	add	a4,a4,s6
+    80202122:	00073c23          	sd	zero,24(a4)
+        swtch(&c->context, &p->context);
+    80202126:	00012717          	auipc	a4,0x12
+    8020212a:	f5a70713          	addi	a4,a4,-166 # 80214080 <cpus+0x8>
+    8020212e:	9b3a                	add	s6,s6,a4
+        c->proc = p;
+    80202130:	079e                	slli	a5,a5,0x7
+    80202132:	00012a97          	auipc	s5,0x12
+    80202136:	f2ea8a93          	addi	s5,s5,-210 # 80214060 <pid_lock>
+    8020213a:	9abe                	add	s5,s5,a5
+        w_satp(MAKE_SATP(p->kpagetable));
+    8020213c:	5a7d                	li	s4,-1
+    8020213e:	1a7e                	slli	s4,s4,0x3f
+        w_satp(MAKE_SATP(kernel_pagetable));
+    80202140:	0000ab97          	auipc	s7,0xa
+    80202144:	be0bbb83          	ld	s7,-1056(s7) # 8020bd20 <_GLOBAL_OFFSET_TABLE_+0x48>
+    80202148:	a8a5                	j	802021c0 <scheduler+0xc8>
+      release(&p->lock);
+    8020214a:	8526                	mv	a0,s1
+    8020214c:	ffffe097          	auipc	ra,0xffffe
+    80202150:	5ce080e7          	jalr	1486(ra) # 8020071a <release>
+    for(p = proc; p < &proc[NPROC]; p++) {
+    80202154:	17848493          	addi	s1,s1,376
+    80202158:	05248a63          	beq	s1,s2,802021ac <scheduler+0xb4>
+      acquire(&p->lock);
+    8020215c:	8526                	mv	a0,s1
+    8020215e:	ffffe097          	auipc	ra,0xffffe
+    80202162:	568080e7          	jalr	1384(ra) # 802006c6 <acquire>
+      if(p->state == RUNNABLE) {
+    80202166:	4c9c                	lw	a5,24(s1)
+    80202168:	ff3791e3          	bne	a5,s3,8020214a <scheduler+0x52>
+        p->state = RUNNING;
+    8020216c:	478d                	li	a5,3
+    8020216e:	cc9c                	sw	a5,24(s1)
+        c->proc = p;
+    80202170:	009abc23          	sd	s1,24(s5)
+        w_satp(MAKE_SATP(p->kpagetable));
+    80202174:	6cbc                	ld	a5,88(s1)
+    80202176:	83b1                	srli	a5,a5,0xc
+    80202178:	0147e7b3          	or	a5,a5,s4
+  asm volatile("csrw satp, %0" : : "r" (x));
+    8020217c:	18079073          	csrw	satp,a5
+  asm volatile("sfence.vma");
+    80202180:	12000073          	sfence.vma
+        swtch(&c->context, &p->context);
+    80202184:	06848593          	addi	a1,s1,104
+    80202188:	855a                	mv	a0,s6
+    8020218a:	00000097          	auipc	ra,0x0
+    8020218e:	72a080e7          	jalr	1834(ra) # 802028b4 <swtch>
+        w_satp(MAKE_SATP(kernel_pagetable));
+    80202192:	000bb783          	ld	a5,0(s7)
+    80202196:	83b1                	srli	a5,a5,0xc
+    80202198:	0147e7b3          	or	a5,a5,s4
+  asm volatile("csrw satp, %0" : : "r" (x));
+    8020219c:	18079073          	csrw	satp,a5
+  asm volatile("sfence.vma");
+    802021a0:	12000073          	sfence.vma
+        c->proc = 0;
+    802021a4:	000abc23          	sd	zero,24(s5)
+        found = 1;
+    802021a8:	4c05                	li	s8,1
+    802021aa:	b745                	j	8020214a <scheduler+0x52>
+    if(found == 0) {
+    802021ac:	000c1a63          	bnez	s8,802021c0 <scheduler+0xc8>
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    802021b0:	100027f3          	csrr	a5,sstatus
+  w_sstatus(r_sstatus() | SSTATUS_SIE);
+    802021b4:	0027e793          	ori	a5,a5,2
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    802021b8:	10079073          	csrw	sstatus,a5
+      asm volatile("wfi");
+    802021bc:	10500073          	wfi
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    802021c0:	100027f3          	csrr	a5,sstatus
+  w_sstatus(r_sstatus() | SSTATUS_SIE);
+    802021c4:	0027e793          	ori	a5,a5,2
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    802021c8:	10079073          	csrw	sstatus,a5
+    int found = 0;
+    802021cc:	4c01                	li	s8,0
+    for(p = proc; p < &proc[NPROC]; p++) {
+    802021ce:	00012497          	auipc	s1,0x12
+    802021d2:	fb248493          	addi	s1,s1,-78 # 80214180 <proc>
+      if(p->state == RUNNABLE) {
+    802021d6:	4989                	li	s3,2
+    for(p = proc; p < &proc[NPROC]; p++) {
+    802021d8:	00017917          	auipc	s2,0x17
+    802021dc:	91890913          	addi	s2,s2,-1768 # 80218af0 <bcache>
+    802021e0:	bfb5                	j	8020215c <scheduler+0x64>
+
+00000000802021e2 <sched>:
+{
+    802021e2:	7179                	addi	sp,sp,-48
+    802021e4:	f406                	sd	ra,40(sp)
+    802021e6:	f022                	sd	s0,32(sp)
+    802021e8:	ec26                	sd	s1,24(sp)
+    802021ea:	e84a                	sd	s2,16(sp)
+    802021ec:	e44e                	sd	s3,8(sp)
+    802021ee:	1800                	addi	s0,sp,48
+  struct proc *p = myproc();
+    802021f0:	00000097          	auipc	ra,0x0
+    802021f4:	84c080e7          	jalr	-1972(ra) # 80201a3c <myproc>
+    802021f8:	84aa                	mv	s1,a0
+  if(!holding(&p->lock))
+    802021fa:	ffffe097          	auipc	ra,0xffffe
+    802021fe:	49e080e7          	jalr	1182(ra) # 80200698 <holding>
+    80202202:	c93d                	beqz	a0,80202278 <sched+0x96>
+  asm volatile("mv %0, tp" : "=r" (x) );
+    80202204:	8792                	mv	a5,tp
+  if(mycpu()->noff != 1)
+    80202206:	2781                	sext.w	a5,a5
+    80202208:	079e                	slli	a5,a5,0x7
+    8020220a:	00012717          	auipc	a4,0x12
+    8020220e:	e5670713          	addi	a4,a4,-426 # 80214060 <pid_lock>
+    80202212:	97ba                	add	a5,a5,a4
+    80202214:	0907a703          	lw	a4,144(a5)
+    80202218:	4785                	li	a5,1
+    8020221a:	06f71763          	bne	a4,a5,80202288 <sched+0xa6>
+  if(p->state == RUNNING)
+    8020221e:	4c98                	lw	a4,24(s1)
+    80202220:	478d                	li	a5,3
+    80202222:	06f70b63          	beq	a4,a5,80202298 <sched+0xb6>
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    80202226:	100027f3          	csrr	a5,sstatus
+  return (x & SSTATUS_SIE) != 0;
+    8020222a:	8b89                	andi	a5,a5,2
+  if(intr_get())
+    8020222c:	efb5                	bnez	a5,802022a8 <sched+0xc6>
+  asm volatile("mv %0, tp" : "=r" (x) );
+    8020222e:	8792                	mv	a5,tp
+  intena = mycpu()->intena;
+    80202230:	00012917          	auipc	s2,0x12
+    80202234:	e3090913          	addi	s2,s2,-464 # 80214060 <pid_lock>
+    80202238:	2781                	sext.w	a5,a5
+    8020223a:	079e                	slli	a5,a5,0x7
+    8020223c:	97ca                	add	a5,a5,s2
+    8020223e:	0947a983          	lw	s3,148(a5)
+    80202242:	8792                	mv	a5,tp
+  swtch(&p->context, &mycpu()->context);
+    80202244:	2781                	sext.w	a5,a5
+    80202246:	079e                	slli	a5,a5,0x7
+    80202248:	00012597          	auipc	a1,0x12
+    8020224c:	e3858593          	addi	a1,a1,-456 # 80214080 <cpus+0x8>
+    80202250:	95be                	add	a1,a1,a5
+    80202252:	06848513          	addi	a0,s1,104
+    80202256:	00000097          	auipc	ra,0x0
+    8020225a:	65e080e7          	jalr	1630(ra) # 802028b4 <swtch>
+    8020225e:	8792                	mv	a5,tp
+  mycpu()->intena = intena;
+    80202260:	2781                	sext.w	a5,a5
+    80202262:	079e                	slli	a5,a5,0x7
+    80202264:	993e                	add	s2,s2,a5
+    80202266:	09392a23          	sw	s3,148(s2)
+}
+    8020226a:	70a2                	ld	ra,40(sp)
+    8020226c:	7402                	ld	s0,32(sp)
+    8020226e:	64e2                	ld	s1,24(sp)
+    80202270:	6942                	ld	s2,16(sp)
+    80202272:	69a2                	ld	s3,8(sp)
+    80202274:	6145                	addi	sp,sp,48
+    80202276:	8082                	ret
+    panic("sched p->lock");
+    80202278:	00007517          	auipc	a0,0x7
+    8020227c:	3d050513          	addi	a0,a0,976 # 80209648 <digits+0x2c8>
+    80202280:	ffffe097          	auipc	ra,0xffffe
+    80202284:	ec4080e7          	jalr	-316(ra) # 80200144 <panic>
+    panic("sched locks");
+    80202288:	00007517          	auipc	a0,0x7
+    8020228c:	3d050513          	addi	a0,a0,976 # 80209658 <digits+0x2d8>
+    80202290:	ffffe097          	auipc	ra,0xffffe
+    80202294:	eb4080e7          	jalr	-332(ra) # 80200144 <panic>
+    panic("sched running");
+    80202298:	00007517          	auipc	a0,0x7
+    8020229c:	3d050513          	addi	a0,a0,976 # 80209668 <digits+0x2e8>
+    802022a0:	ffffe097          	auipc	ra,0xffffe
+    802022a4:	ea4080e7          	jalr	-348(ra) # 80200144 <panic>
+    panic("sched interruptible");
+    802022a8:	00007517          	auipc	a0,0x7
+    802022ac:	3d050513          	addi	a0,a0,976 # 80209678 <digits+0x2f8>
+    802022b0:	ffffe097          	auipc	ra,0xffffe
+    802022b4:	e94080e7          	jalr	-364(ra) # 80200144 <panic>
+
+00000000802022b8 <exit>:
+{
+    802022b8:	7179                	addi	sp,sp,-48
+    802022ba:	f406                	sd	ra,40(sp)
+    802022bc:	f022                	sd	s0,32(sp)
+    802022be:	ec26                	sd	s1,24(sp)
+    802022c0:	e84a                	sd	s2,16(sp)
+    802022c2:	e44e                	sd	s3,8(sp)
+    802022c4:	e052                	sd	s4,0(sp)
+    802022c6:	1800                	addi	s0,sp,48
+    802022c8:	8a2a                	mv	s4,a0
+  struct proc *p = myproc();
+    802022ca:	fffff097          	auipc	ra,0xfffff
+    802022ce:	772080e7          	jalr	1906(ra) # 80201a3c <myproc>
+    802022d2:	89aa                	mv	s3,a0
+  if(p == initproc)
+    802022d4:	00012797          	auipc	a5,0x12
+    802022d8:	ea47b783          	ld	a5,-348(a5) # 80214178 <initproc>
+    802022dc:	0d850493          	addi	s1,a0,216
+    802022e0:	15850913          	addi	s2,a0,344
+    802022e4:	02a79363          	bne	a5,a0,8020230a <exit+0x52>
+    panic("init exiting");
+    802022e8:	00007517          	auipc	a0,0x7
+    802022ec:	3a850513          	addi	a0,a0,936 # 80209690 <digits+0x310>
+    802022f0:	ffffe097          	auipc	ra,0xffffe
+    802022f4:	e54080e7          	jalr	-428(ra) # 80200144 <panic>
+      fileclose(f);
+    802022f8:	00002097          	auipc	ra,0x2
+    802022fc:	9da080e7          	jalr	-1574(ra) # 80203cd2 <fileclose>
+      p->ofile[fd] = 0;
+    80202300:	0004b023          	sd	zero,0(s1)
+  for(int fd = 0; fd < NOFILE; fd++){
+    80202304:	04a1                	addi	s1,s1,8
+    80202306:	01248563          	beq	s1,s2,80202310 <exit+0x58>
+    if(p->ofile[fd]){
+    8020230a:	6088                	ld	a0,0(s1)
+    8020230c:	f575                	bnez	a0,802022f8 <exit+0x40>
+    8020230e:	bfdd                	j	80202304 <exit+0x4c>
+  eput(p->cwd);
+    80202310:	1589b503          	ld	a0,344(s3)
+    80202314:	00004097          	auipc	ra,0x4
+    80202318:	3de080e7          	jalr	990(ra) # 802066f2 <eput>
+  p->cwd = 0;
+    8020231c:	1409bc23          	sd	zero,344(s3)
+  acquire(&initproc->lock);
+    80202320:	00012497          	auipc	s1,0x12
+    80202324:	d4048493          	addi	s1,s1,-704 # 80214060 <pid_lock>
+    80202328:	1184b503          	ld	a0,280(s1)
+    8020232c:	ffffe097          	auipc	ra,0xffffe
+    80202330:	39a080e7          	jalr	922(ra) # 802006c6 <acquire>
+  wakeup1(initproc);
+    80202334:	1184b503          	ld	a0,280(s1)
+    80202338:	fffff097          	auipc	ra,0xfffff
+    8020233c:	518080e7          	jalr	1304(ra) # 80201850 <wakeup1>
+  release(&initproc->lock);
+    80202340:	1184b503          	ld	a0,280(s1)
+    80202344:	ffffe097          	auipc	ra,0xffffe
+    80202348:	3d6080e7          	jalr	982(ra) # 8020071a <release>
+  acquire(&p->lock);
+    8020234c:	854e                	mv	a0,s3
+    8020234e:	ffffe097          	auipc	ra,0xffffe
+    80202352:	378080e7          	jalr	888(ra) # 802006c6 <acquire>
+  struct proc *original_parent = p->parent;
+    80202356:	0209b483          	ld	s1,32(s3)
+  release(&p->lock);
+    8020235a:	854e                	mv	a0,s3
+    8020235c:	ffffe097          	auipc	ra,0xffffe
+    80202360:	3be080e7          	jalr	958(ra) # 8020071a <release>
+  acquire(&original_parent->lock);
+    80202364:	8526                	mv	a0,s1
+    80202366:	ffffe097          	auipc	ra,0xffffe
+    8020236a:	360080e7          	jalr	864(ra) # 802006c6 <acquire>
+  acquire(&p->lock);
+    8020236e:	854e                	mv	a0,s3
+    80202370:	ffffe097          	auipc	ra,0xffffe
+    80202374:	356080e7          	jalr	854(ra) # 802006c6 <acquire>
+  reparent(p);
+    80202378:	854e                	mv	a0,s3
+    8020237a:	00000097          	auipc	ra,0x0
+    8020237e:	d18080e7          	jalr	-744(ra) # 80202092 <reparent>
+  wakeup1(original_parent);
+    80202382:	8526                	mv	a0,s1
+    80202384:	fffff097          	auipc	ra,0xfffff
+    80202388:	4cc080e7          	jalr	1228(ra) # 80201850 <wakeup1>
+  p->xstate = status;
+    8020238c:	0349aa23          	sw	s4,52(s3)
+  p->state = ZOMBIE;
+    80202390:	4791                	li	a5,4
+    80202392:	00f9ac23          	sw	a5,24(s3)
+  release(&original_parent->lock);
+    80202396:	8526                	mv	a0,s1
+    80202398:	ffffe097          	auipc	ra,0xffffe
+    8020239c:	382080e7          	jalr	898(ra) # 8020071a <release>
+  sched();
+    802023a0:	00000097          	auipc	ra,0x0
+    802023a4:	e42080e7          	jalr	-446(ra) # 802021e2 <sched>
+  panic("zombie exit");
+    802023a8:	00007517          	auipc	a0,0x7
+    802023ac:	2f850513          	addi	a0,a0,760 # 802096a0 <digits+0x320>
+    802023b0:	ffffe097          	auipc	ra,0xffffe
+    802023b4:	d94080e7          	jalr	-620(ra) # 80200144 <panic>
+
+00000000802023b8 <yield>:
+{
+    802023b8:	1101                	addi	sp,sp,-32
+    802023ba:	ec06                	sd	ra,24(sp)
+    802023bc:	e822                	sd	s0,16(sp)
+    802023be:	e426                	sd	s1,8(sp)
+    802023c0:	1000                	addi	s0,sp,32
+  struct proc *p = myproc();
+    802023c2:	fffff097          	auipc	ra,0xfffff
+    802023c6:	67a080e7          	jalr	1658(ra) # 80201a3c <myproc>
+    802023ca:	84aa                	mv	s1,a0
+  acquire(&p->lock);
+    802023cc:	ffffe097          	auipc	ra,0xffffe
+    802023d0:	2fa080e7          	jalr	762(ra) # 802006c6 <acquire>
+  p->state = RUNNABLE;
+    802023d4:	4789                	li	a5,2
+    802023d6:	cc9c                	sw	a5,24(s1)
+  sched();
+    802023d8:	00000097          	auipc	ra,0x0
+    802023dc:	e0a080e7          	jalr	-502(ra) # 802021e2 <sched>
+  release(&p->lock);
+    802023e0:	8526                	mv	a0,s1
+    802023e2:	ffffe097          	auipc	ra,0xffffe
+    802023e6:	338080e7          	jalr	824(ra) # 8020071a <release>
+}
+    802023ea:	60e2                	ld	ra,24(sp)
+    802023ec:	6442                	ld	s0,16(sp)
+    802023ee:	64a2                	ld	s1,8(sp)
+    802023f0:	6105                	addi	sp,sp,32
+    802023f2:	8082                	ret
+
+00000000802023f4 <sleep>:
+{
+    802023f4:	7179                	addi	sp,sp,-48
+    802023f6:	f406                	sd	ra,40(sp)
+    802023f8:	f022                	sd	s0,32(sp)
+    802023fa:	ec26                	sd	s1,24(sp)
+    802023fc:	e84a                	sd	s2,16(sp)
+    802023fe:	e44e                	sd	s3,8(sp)
+    80202400:	1800                	addi	s0,sp,48
+    80202402:	89aa                	mv	s3,a0
+    80202404:	892e                	mv	s2,a1
+  struct proc *p = myproc();
+    80202406:	fffff097          	auipc	ra,0xfffff
+    8020240a:	636080e7          	jalr	1590(ra) # 80201a3c <myproc>
+    8020240e:	84aa                	mv	s1,a0
+  if(lk != &p->lock){  //DOC: sleeplock0
+    80202410:	05250663          	beq	a0,s2,8020245c <sleep+0x68>
+    acquire(&p->lock);  //DOC: sleeplock1
+    80202414:	ffffe097          	auipc	ra,0xffffe
+    80202418:	2b2080e7          	jalr	690(ra) # 802006c6 <acquire>
+    release(lk);
+    8020241c:	854a                	mv	a0,s2
+    8020241e:	ffffe097          	auipc	ra,0xffffe
+    80202422:	2fc080e7          	jalr	764(ra) # 8020071a <release>
+  p->chan = chan;
+    80202426:	0334b423          	sd	s3,40(s1)
+  p->state = SLEEPING;
+    8020242a:	4785                	li	a5,1
+    8020242c:	cc9c                	sw	a5,24(s1)
+  sched();
+    8020242e:	00000097          	auipc	ra,0x0
+    80202432:	db4080e7          	jalr	-588(ra) # 802021e2 <sched>
+  p->chan = 0;
+    80202436:	0204b423          	sd	zero,40(s1)
+    release(&p->lock);
+    8020243a:	8526                	mv	a0,s1
+    8020243c:	ffffe097          	auipc	ra,0xffffe
+    80202440:	2de080e7          	jalr	734(ra) # 8020071a <release>
+    acquire(lk);
+    80202444:	854a                	mv	a0,s2
+    80202446:	ffffe097          	auipc	ra,0xffffe
+    8020244a:	280080e7          	jalr	640(ra) # 802006c6 <acquire>
+}
+    8020244e:	70a2                	ld	ra,40(sp)
+    80202450:	7402                	ld	s0,32(sp)
+    80202452:	64e2                	ld	s1,24(sp)
+    80202454:	6942                	ld	s2,16(sp)
+    80202456:	69a2                	ld	s3,8(sp)
+    80202458:	6145                	addi	sp,sp,48
+    8020245a:	8082                	ret
+  p->chan = chan;
+    8020245c:	03353423          	sd	s3,40(a0)
+  p->state = SLEEPING;
+    80202460:	4785                	li	a5,1
+    80202462:	cd1c                	sw	a5,24(a0)
+  sched();
+    80202464:	00000097          	auipc	ra,0x0
+    80202468:	d7e080e7          	jalr	-642(ra) # 802021e2 <sched>
+  p->chan = 0;
+    8020246c:	0204b423          	sd	zero,40(s1)
+  if(lk != &p->lock){
+    80202470:	bff9                	j	8020244e <sleep+0x5a>
+
+0000000080202472 <wait>:
+{
+    80202472:	715d                	addi	sp,sp,-80
+    80202474:	e486                	sd	ra,72(sp)
+    80202476:	e0a2                	sd	s0,64(sp)
+    80202478:	fc26                	sd	s1,56(sp)
+    8020247a:	f84a                	sd	s2,48(sp)
+    8020247c:	f44e                	sd	s3,40(sp)
+    8020247e:	f052                	sd	s4,32(sp)
+    80202480:	ec56                	sd	s5,24(sp)
+    80202482:	e85a                	sd	s6,16(sp)
+    80202484:	e45e                	sd	s7,8(sp)
+    80202486:	0880                	addi	s0,sp,80
+    80202488:	8b2a                	mv	s6,a0
+  struct proc *p = myproc();
+    8020248a:	fffff097          	auipc	ra,0xfffff
+    8020248e:	5b2080e7          	jalr	1458(ra) # 80201a3c <myproc>
+    80202492:	892a                	mv	s2,a0
+  acquire(&p->lock);
+    80202494:	ffffe097          	auipc	ra,0xffffe
+    80202498:	232080e7          	jalr	562(ra) # 802006c6 <acquire>
+    havekids = 0;
+    8020249c:	4b81                	li	s7,0
+        if(np->state == ZOMBIE){
+    8020249e:	4a11                	li	s4,4
+        havekids = 1;
+    802024a0:	4a85                	li	s5,1
+    for(np = proc; np < &proc[NPROC]; np++){
+    802024a2:	00016997          	auipc	s3,0x16
+    802024a6:	64e98993          	addi	s3,s3,1614 # 80218af0 <bcache>
+    havekids = 0;
+    802024aa:	875e                	mv	a4,s7
+    for(np = proc; np < &proc[NPROC]; np++){
+    802024ac:	00012497          	auipc	s1,0x12
+    802024b0:	cd448493          	addi	s1,s1,-812 # 80214180 <proc>
+    802024b4:	a8b9                	j	80202512 <wait+0xa0>
+          pid = np->pid;
+    802024b6:	0384a983          	lw	s3,56(s1)
+          if(addr != 0 && copyout2(addr, (char *)&np->xstate, sizeof(np->xstate)) < 0) {
+    802024ba:	000b0c63          	beqz	s6,802024d2 <wait+0x60>
+    802024be:	4611                	li	a2,4
+    802024c0:	03448593          	addi	a1,s1,52
+    802024c4:	855a                	mv	a0,s6
+    802024c6:	fffff097          	auipc	ra,0xfffff
+    802024ca:	eac080e7          	jalr	-340(ra) # 80201372 <copyout2>
+    802024ce:	02054263          	bltz	a0,802024f2 <wait+0x80>
+          freeproc(np);
+    802024d2:	8526                	mv	a0,s1
+    802024d4:	fffff097          	auipc	ra,0xfffff
+    802024d8:	73a080e7          	jalr	1850(ra) # 80201c0e <freeproc>
+          release(&np->lock);
+    802024dc:	8526                	mv	a0,s1
+    802024de:	ffffe097          	auipc	ra,0xffffe
+    802024e2:	23c080e7          	jalr	572(ra) # 8020071a <release>
+          release(&p->lock);
+    802024e6:	854a                	mv	a0,s2
+    802024e8:	ffffe097          	auipc	ra,0xffffe
+    802024ec:	232080e7          	jalr	562(ra) # 8020071a <release>
+          return pid;
+    802024f0:	a8a9                	j	8020254a <wait+0xd8>
+            release(&np->lock);
+    802024f2:	8526                	mv	a0,s1
+    802024f4:	ffffe097          	auipc	ra,0xffffe
+    802024f8:	226080e7          	jalr	550(ra) # 8020071a <release>
+            release(&p->lock);
+    802024fc:	854a                	mv	a0,s2
+    802024fe:	ffffe097          	auipc	ra,0xffffe
+    80202502:	21c080e7          	jalr	540(ra) # 8020071a <release>
+            return -1;
+    80202506:	59fd                	li	s3,-1
+    80202508:	a089                	j	8020254a <wait+0xd8>
+    for(np = proc; np < &proc[NPROC]; np++){
+    8020250a:	17848493          	addi	s1,s1,376
+    8020250e:	03348463          	beq	s1,s3,80202536 <wait+0xc4>
+      if(np->parent == p){
+    80202512:	709c                	ld	a5,32(s1)
+    80202514:	ff279be3          	bne	a5,s2,8020250a <wait+0x98>
+        acquire(&np->lock);
+    80202518:	8526                	mv	a0,s1
+    8020251a:	ffffe097          	auipc	ra,0xffffe
+    8020251e:	1ac080e7          	jalr	428(ra) # 802006c6 <acquire>
+        if(np->state == ZOMBIE){
+    80202522:	4c9c                	lw	a5,24(s1)
+    80202524:	f94789e3          	beq	a5,s4,802024b6 <wait+0x44>
+        release(&np->lock);
+    80202528:	8526                	mv	a0,s1
+    8020252a:	ffffe097          	auipc	ra,0xffffe
+    8020252e:	1f0080e7          	jalr	496(ra) # 8020071a <release>
+        havekids = 1;
+    80202532:	8756                	mv	a4,s5
+    80202534:	bfd9                	j	8020250a <wait+0x98>
+    if(!havekids || p->killed){
+    80202536:	c701                	beqz	a4,8020253e <wait+0xcc>
+    80202538:	03092783          	lw	a5,48(s2)
+    8020253c:	c39d                	beqz	a5,80202562 <wait+0xf0>
+      release(&p->lock);
+    8020253e:	854a                	mv	a0,s2
+    80202540:	ffffe097          	auipc	ra,0xffffe
+    80202544:	1da080e7          	jalr	474(ra) # 8020071a <release>
+      return -1;
+    80202548:	59fd                	li	s3,-1
+}
+    8020254a:	854e                	mv	a0,s3
+    8020254c:	60a6                	ld	ra,72(sp)
+    8020254e:	6406                	ld	s0,64(sp)
+    80202550:	74e2                	ld	s1,56(sp)
+    80202552:	7942                	ld	s2,48(sp)
+    80202554:	79a2                	ld	s3,40(sp)
+    80202556:	7a02                	ld	s4,32(sp)
+    80202558:	6ae2                	ld	s5,24(sp)
+    8020255a:	6b42                	ld	s6,16(sp)
+    8020255c:	6ba2                	ld	s7,8(sp)
+    8020255e:	6161                	addi	sp,sp,80
+    80202560:	8082                	ret
+    sleep(p, &p->lock);  //DOC: wait-sleep
+    80202562:	85ca                	mv	a1,s2
+    80202564:	854a                	mv	a0,s2
+    80202566:	00000097          	auipc	ra,0x0
+    8020256a:	e8e080e7          	jalr	-370(ra) # 802023f4 <sleep>
+    havekids = 0;
+    8020256e:	bf35                	j	802024aa <wait+0x38>
+
+0000000080202570 <wait4>:
+{
+    80202570:	711d                	addi	sp,sp,-96
+    80202572:	ec86                	sd	ra,88(sp)
+    80202574:	e8a2                	sd	s0,80(sp)
+    80202576:	e4a6                	sd	s1,72(sp)
+    80202578:	e0ca                	sd	s2,64(sp)
+    8020257a:	fc4e                	sd	s3,56(sp)
+    8020257c:	f852                	sd	s4,48(sp)
+    8020257e:	f456                	sd	s5,40(sp)
+    80202580:	f05a                	sd	s6,32(sp)
+    80202582:	ec5e                	sd	s7,24(sp)
+    80202584:	1080                	addi	s0,sp,96
+    80202586:	8a2e                	mv	s4,a1
+  if(pid == -1) {
+    80202588:	57fd                	li	a5,-1
+    8020258a:	02f51463          	bne	a0,a5,802025b2 <wait4+0x42>
+    return wait(addr);
+    8020258e:	852e                	mv	a0,a1
+    80202590:	00000097          	auipc	ra,0x0
+    80202594:	ee2080e7          	jalr	-286(ra) # 80202472 <wait>
+    80202598:	89aa                	mv	s3,a0
+}
+    8020259a:	854e                	mv	a0,s3
+    8020259c:	60e6                	ld	ra,88(sp)
+    8020259e:	6446                	ld	s0,80(sp)
+    802025a0:	64a6                	ld	s1,72(sp)
+    802025a2:	6906                	ld	s2,64(sp)
+    802025a4:	79e2                	ld	s3,56(sp)
+    802025a6:	7a42                	ld	s4,48(sp)
+    802025a8:	7aa2                	ld	s5,40(sp)
+    802025aa:	7b02                	ld	s6,32(sp)
+    802025ac:	6be2                	ld	s7,24(sp)
+    802025ae:	6125                	addi	sp,sp,96
+    802025b0:	8082                	ret
+  struct proc *p = myproc();
+    802025b2:	fffff097          	auipc	ra,0xfffff
+    802025b6:	48a080e7          	jalr	1162(ra) # 80201a3c <myproc>
+    802025ba:	892a                	mv	s2,a0
+  acquire(&p->lock);
+    802025bc:	ffffe097          	auipc	ra,0xffffe
+    802025c0:	10a080e7          	jalr	266(ra) # 802006c6 <acquire>
+    havekids = 0;
+    802025c4:	4b81                	li	s7,0
+        if(np->state == ZOMBIE){
+    802025c6:	4a91                	li	s5,4
+        havekids = 1;
+    802025c8:	4b05                	li	s6,1
+    for(np = proc; np < &proc[NPROC]; np++){
+    802025ca:	00016997          	auipc	s3,0x16
+    802025ce:	52698993          	addi	s3,s3,1318 # 80218af0 <bcache>
+    havekids = 0;
+    802025d2:	875e                	mv	a4,s7
+    for(np = proc; np < &proc[NPROC]; np++){
+    802025d4:	00012497          	auipc	s1,0x12
+    802025d8:	bac48493          	addi	s1,s1,-1108 # 80214180 <proc>
+    802025dc:	a0a5                	j	80202644 <wait4+0xd4>
+          pid = np->pid;
+    802025de:	0384a983          	lw	s3,56(s1)
+          status = np->xstate << 8;
+    802025e2:	58dc                	lw	a5,52(s1)
+    802025e4:	0087979b          	slliw	a5,a5,0x8
+    802025e8:	faf42623          	sw	a5,-84(s0)
+          if(addr != 0 && copyout2(addr, (char *)&status, sizeof(status)) < 0) {
+    802025ec:	000a0c63          	beqz	s4,80202604 <wait4+0x94>
+    802025f0:	4611                	li	a2,4
+    802025f2:	fac40593          	addi	a1,s0,-84
+    802025f6:	8552                	mv	a0,s4
+    802025f8:	fffff097          	auipc	ra,0xfffff
+    802025fc:	d7a080e7          	jalr	-646(ra) # 80201372 <copyout2>
+    80202600:	02054263          	bltz	a0,80202624 <wait4+0xb4>
+          freeproc(np);
+    80202604:	8526                	mv	a0,s1
+    80202606:	fffff097          	auipc	ra,0xfffff
+    8020260a:	608080e7          	jalr	1544(ra) # 80201c0e <freeproc>
+          release(&np->lock);
+    8020260e:	8526                	mv	a0,s1
+    80202610:	ffffe097          	auipc	ra,0xffffe
+    80202614:	10a080e7          	jalr	266(ra) # 8020071a <release>
+          release(&p->lock);
+    80202618:	854a                	mv	a0,s2
+    8020261a:	ffffe097          	auipc	ra,0xffffe
+    8020261e:	100080e7          	jalr	256(ra) # 8020071a <release>
+          return pid;
+    80202622:	bfa5                	j	8020259a <wait4+0x2a>
+            release(&np->lock);
+    80202624:	8526                	mv	a0,s1
+    80202626:	ffffe097          	auipc	ra,0xffffe
+    8020262a:	0f4080e7          	jalr	244(ra) # 8020071a <release>
+            release(&p->lock);
+    8020262e:	854a                	mv	a0,s2
+    80202630:	ffffe097          	auipc	ra,0xffffe
+    80202634:	0ea080e7          	jalr	234(ra) # 8020071a <release>
+            return -1;
+    80202638:	59fd                	li	s3,-1
+    8020263a:	b785                	j	8020259a <wait4+0x2a>
+    for(np = proc; np < &proc[NPROC]; np++){
+    8020263c:	17848493          	addi	s1,s1,376
+    80202640:	03348463          	beq	s1,s3,80202668 <wait4+0xf8>
+      if(np->parent == p){
+    80202644:	709c                	ld	a5,32(s1)
+    80202646:	ff279be3          	bne	a5,s2,8020263c <wait4+0xcc>
+        acquire(&np->lock);
+    8020264a:	8526                	mv	a0,s1
+    8020264c:	ffffe097          	auipc	ra,0xffffe
+    80202650:	07a080e7          	jalr	122(ra) # 802006c6 <acquire>
+        if(np->state == ZOMBIE){
+    80202654:	4c9c                	lw	a5,24(s1)
+    80202656:	f95784e3          	beq	a5,s5,802025de <wait4+0x6e>
+        release(&np->lock);
+    8020265a:	8526                	mv	a0,s1
+    8020265c:	ffffe097          	auipc	ra,0xffffe
+    80202660:	0be080e7          	jalr	190(ra) # 8020071a <release>
+        havekids = 1;
+    80202664:	875a                	mv	a4,s6
+    80202666:	bfd9                	j	8020263c <wait4+0xcc>
+    if(!havekids || p->killed){
+    80202668:	c701                	beqz	a4,80202670 <wait4+0x100>
+    8020266a:	03092783          	lw	a5,48(s2)
+    8020266e:	cb81                	beqz	a5,8020267e <wait4+0x10e>
+      release(&p->lock);
+    80202670:	854a                	mv	a0,s2
+    80202672:	ffffe097          	auipc	ra,0xffffe
+    80202676:	0a8080e7          	jalr	168(ra) # 8020071a <release>
+      return -1;
+    8020267a:	59fd                	li	s3,-1
+    8020267c:	bf39                	j	8020259a <wait4+0x2a>
+    sleep(p, &p->lock);  //DOC: wait-sleep
+    8020267e:	85ca                	mv	a1,s2
+    80202680:	854a                	mv	a0,s2
+    80202682:	00000097          	auipc	ra,0x0
+    80202686:	d72080e7          	jalr	-654(ra) # 802023f4 <sleep>
+    havekids = 0;
+    8020268a:	b7a1                	j	802025d2 <wait4+0x62>
+
+000000008020268c <wakeup>:
+{
+    8020268c:	7139                	addi	sp,sp,-64
+    8020268e:	fc06                	sd	ra,56(sp)
+    80202690:	f822                	sd	s0,48(sp)
+    80202692:	f426                	sd	s1,40(sp)
+    80202694:	f04a                	sd	s2,32(sp)
+    80202696:	ec4e                	sd	s3,24(sp)
+    80202698:	e852                	sd	s4,16(sp)
+    8020269a:	e456                	sd	s5,8(sp)
+    8020269c:	0080                	addi	s0,sp,64
+    8020269e:	8a2a                	mv	s4,a0
+  for(p = proc; p < &proc[NPROC]; p++) {
+    802026a0:	00012497          	auipc	s1,0x12
+    802026a4:	ae048493          	addi	s1,s1,-1312 # 80214180 <proc>
+    if(p->state == SLEEPING && p->chan == chan) {
+    802026a8:	4985                	li	s3,1
+      p->state = RUNNABLE;
+    802026aa:	4a89                	li	s5,2
+  for(p = proc; p < &proc[NPROC]; p++) {
+    802026ac:	00016917          	auipc	s2,0x16
+    802026b0:	44490913          	addi	s2,s2,1092 # 80218af0 <bcache>
+    802026b4:	a811                	j	802026c8 <wakeup+0x3c>
+    release(&p->lock);
+    802026b6:	8526                	mv	a0,s1
+    802026b8:	ffffe097          	auipc	ra,0xffffe
+    802026bc:	062080e7          	jalr	98(ra) # 8020071a <release>
+  for(p = proc; p < &proc[NPROC]; p++) {
+    802026c0:	17848493          	addi	s1,s1,376
+    802026c4:	03248063          	beq	s1,s2,802026e4 <wakeup+0x58>
+    acquire(&p->lock);
+    802026c8:	8526                	mv	a0,s1
+    802026ca:	ffffe097          	auipc	ra,0xffffe
+    802026ce:	ffc080e7          	jalr	-4(ra) # 802006c6 <acquire>
+    if(p->state == SLEEPING && p->chan == chan) {
+    802026d2:	4c9c                	lw	a5,24(s1)
+    802026d4:	ff3791e3          	bne	a5,s3,802026b6 <wakeup+0x2a>
+    802026d8:	749c                	ld	a5,40(s1)
+    802026da:	fd479ee3          	bne	a5,s4,802026b6 <wakeup+0x2a>
+      p->state = RUNNABLE;
+    802026de:	0154ac23          	sw	s5,24(s1)
+    802026e2:	bfd1                	j	802026b6 <wakeup+0x2a>
+}
+    802026e4:	70e2                	ld	ra,56(sp)
+    802026e6:	7442                	ld	s0,48(sp)
+    802026e8:	74a2                	ld	s1,40(sp)
+    802026ea:	7902                	ld	s2,32(sp)
+    802026ec:	69e2                	ld	s3,24(sp)
+    802026ee:	6a42                	ld	s4,16(sp)
+    802026f0:	6aa2                	ld	s5,8(sp)
+    802026f2:	6121                	addi	sp,sp,64
+    802026f4:	8082                	ret
+
+00000000802026f6 <kill>:
+// Kill the process with the given pid.
+// The victim won't exit until it tries to return
+// to user space (see usertrap() in trap.c).
+int
+kill(int pid)
+{
+    802026f6:	7179                	addi	sp,sp,-48
+    802026f8:	f406                	sd	ra,40(sp)
+    802026fa:	f022                	sd	s0,32(sp)
+    802026fc:	ec26                	sd	s1,24(sp)
+    802026fe:	e84a                	sd	s2,16(sp)
+    80202700:	e44e                	sd	s3,8(sp)
+    80202702:	1800                	addi	s0,sp,48
+    80202704:	892a                	mv	s2,a0
+  struct proc *p;
+
+  for(p = proc; p < &proc[NPROC]; p++){
+    80202706:	00012497          	auipc	s1,0x12
+    8020270a:	a7a48493          	addi	s1,s1,-1414 # 80214180 <proc>
+    8020270e:	00016997          	auipc	s3,0x16
+    80202712:	3e298993          	addi	s3,s3,994 # 80218af0 <bcache>
+    acquire(&p->lock);
+    80202716:	8526                	mv	a0,s1
+    80202718:	ffffe097          	auipc	ra,0xffffe
+    8020271c:	fae080e7          	jalr	-82(ra) # 802006c6 <acquire>
+    if(p->pid == pid){
+    80202720:	5c9c                	lw	a5,56(s1)
+    80202722:	01278d63          	beq	a5,s2,8020273c <kill+0x46>
+        p->state = RUNNABLE;
+      }
+      release(&p->lock);
+      return 0;
+    }
+    release(&p->lock);
+    80202726:	8526                	mv	a0,s1
+    80202728:	ffffe097          	auipc	ra,0xffffe
+    8020272c:	ff2080e7          	jalr	-14(ra) # 8020071a <release>
+  for(p = proc; p < &proc[NPROC]; p++){
+    80202730:	17848493          	addi	s1,s1,376
+    80202734:	ff3491e3          	bne	s1,s3,80202716 <kill+0x20>
+  }
+  return -1;
+    80202738:	557d                	li	a0,-1
+    8020273a:	a821                	j	80202752 <kill+0x5c>
+      p->killed = 1;
+    8020273c:	4785                	li	a5,1
+    8020273e:	d89c                	sw	a5,48(s1)
+      if(p->state == SLEEPING){
+    80202740:	4c98                	lw	a4,24(s1)
+    80202742:	00f70f63          	beq	a4,a5,80202760 <kill+0x6a>
+      release(&p->lock);
+    80202746:	8526                	mv	a0,s1
+    80202748:	ffffe097          	auipc	ra,0xffffe
+    8020274c:	fd2080e7          	jalr	-46(ra) # 8020071a <release>
+      return 0;
+    80202750:	4501                	li	a0,0
+}
+    80202752:	70a2                	ld	ra,40(sp)
+    80202754:	7402                	ld	s0,32(sp)
+    80202756:	64e2                	ld	s1,24(sp)
+    80202758:	6942                	ld	s2,16(sp)
+    8020275a:	69a2                	ld	s3,8(sp)
+    8020275c:	6145                	addi	sp,sp,48
+    8020275e:	8082                	ret
+        p->state = RUNNABLE;
+    80202760:	4789                	li	a5,2
+    80202762:	cc9c                	sw	a5,24(s1)
+    80202764:	b7cd                	j	80202746 <kill+0x50>
+
+0000000080202766 <either_copyout>:
+// Copy to either a user address, or kernel address,
+// depending on usr_dst.
+// Returns 0 on success, -1 on error.
+int
+either_copyout(int user_dst, uint64 dst, void *src, uint64 len)
+{
+    80202766:	1101                	addi	sp,sp,-32
+    80202768:	ec06                	sd	ra,24(sp)
+    8020276a:	e822                	sd	s0,16(sp)
+    8020276c:	e426                	sd	s1,8(sp)
+    8020276e:	1000                	addi	s0,sp,32
+    80202770:	84aa                	mv	s1,a0
+    80202772:	852e                	mv	a0,a1
+    80202774:	85b2                	mv	a1,a2
+    80202776:	8636                	mv	a2,a3
+  // struct proc *p = myproc();
+  if(user_dst){
+    80202778:	c891                	beqz	s1,8020278c <either_copyout+0x26>
+    // return copyout(p->pagetable, dst, src, len);
+    return copyout2(dst, src, len);
+    8020277a:	fffff097          	auipc	ra,0xfffff
+    8020277e:	bf8080e7          	jalr	-1032(ra) # 80201372 <copyout2>
+  } else {
+    memmove((char *)dst, src, len);
+    return 0;
+  }
+}
+    80202782:	60e2                	ld	ra,24(sp)
+    80202784:	6442                	ld	s0,16(sp)
+    80202786:	64a2                	ld	s1,8(sp)
+    80202788:	6105                	addi	sp,sp,32
+    8020278a:	8082                	ret
+    memmove((char *)dst, src, len);
+    8020278c:	0006861b          	sext.w	a2,a3
+    80202790:	ffffe097          	auipc	ra,0xffffe
+    80202794:	02e080e7          	jalr	46(ra) # 802007be <memmove>
+    return 0;
+    80202798:	8526                	mv	a0,s1
+    8020279a:	b7e5                	j	80202782 <either_copyout+0x1c>
+
+000000008020279c <either_copyin>:
+// Copy from either a user address, or kernel address,
+// depending on usr_src.
+// Returns 0 on success, -1 on error.
+int
+either_copyin(void *dst, int user_src, uint64 src, uint64 len)
+{
+    8020279c:	1101                	addi	sp,sp,-32
+    8020279e:	ec06                	sd	ra,24(sp)
+    802027a0:	e822                	sd	s0,16(sp)
+    802027a2:	e426                	sd	s1,8(sp)
+    802027a4:	1000                	addi	s0,sp,32
+    802027a6:	84ae                	mv	s1,a1
+    802027a8:	85b2                	mv	a1,a2
+    802027aa:	8636                	mv	a2,a3
+  // struct proc *p = myproc();
+  if(user_src){
+    802027ac:	c891                	beqz	s1,802027c0 <either_copyin+0x24>
+    // return copyin(p->pagetable, dst, src, len);
+    return copyin2(dst, src, len);
+    802027ae:	fffff097          	auipc	ra,0xfffff
+    802027b2:	ca4080e7          	jalr	-860(ra) # 80201452 <copyin2>
+  } else {
+    memmove(dst, (char*)src, len);
+    return 0;
+  }
+}
+    802027b6:	60e2                	ld	ra,24(sp)
+    802027b8:	6442                	ld	s0,16(sp)
+    802027ba:	64a2                	ld	s1,8(sp)
+    802027bc:	6105                	addi	sp,sp,32
+    802027be:	8082                	ret
+    memmove(dst, (char*)src, len);
+    802027c0:	0006861b          	sext.w	a2,a3
+    802027c4:	ffffe097          	auipc	ra,0xffffe
+    802027c8:	ffa080e7          	jalr	-6(ra) # 802007be <memmove>
+    return 0;
+    802027cc:	8526                	mv	a0,s1
+    802027ce:	b7e5                	j	802027b6 <either_copyin+0x1a>
+
+00000000802027d0 <procdump>:
+// Print a process listing to console.  For debugging.
+// Runs when user types ^P on console.
+// No lock to avoid wedging a stuck machine further.
+void
+procdump(void)
+{
+    802027d0:	715d                	addi	sp,sp,-80
+    802027d2:	e486                	sd	ra,72(sp)
+    802027d4:	e0a2                	sd	s0,64(sp)
+    802027d6:	fc26                	sd	s1,56(sp)
+    802027d8:	f84a                	sd	s2,48(sp)
+    802027da:	f44e                	sd	s3,40(sp)
+    802027dc:	f052                	sd	s4,32(sp)
+    802027de:	ec56                	sd	s5,24(sp)
+    802027e0:	e85a                	sd	s6,16(sp)
+    802027e2:	e45e                	sd	s7,8(sp)
+    802027e4:	0880                	addi	s0,sp,80
+  [ZOMBIE]    "zombie"
+  };
+  struct proc *p;
+  char *state;
+
+  printf("\nPID\tSTATE\tNAME\tMEM\n");
+    802027e6:	00007517          	auipc	a0,0x7
+    802027ea:	ed250513          	addi	a0,a0,-302 # 802096b8 <digits+0x338>
+    802027ee:	ffffe097          	auipc	ra,0xffffe
+    802027f2:	9a0080e7          	jalr	-1632(ra) # 8020018e <printf>
+  for(p = proc; p < &proc[NPROC]; p++){
+    802027f6:	00012497          	auipc	s1,0x12
+    802027fa:	aea48493          	addi	s1,s1,-1302 # 802142e0 <proc+0x160>
+    802027fe:	00016917          	auipc	s2,0x16
+    80202802:	45290913          	addi	s2,s2,1106 # 80218c50 <bcache+0x160>
+    if(p->state == UNUSED)
+      continue;
+    if(p->state >= 0 && p->state < NELEM(states) && states[p->state])
+    80202806:	4b11                	li	s6,4
+      state = states[p->state];
+    else
+      state = "???";
+    80202808:	00007997          	auipc	s3,0x7
+    8020280c:	ea898993          	addi	s3,s3,-344 # 802096b0 <digits+0x330>
+    printf("%d\t%s\t%s\t%d", p->pid, state, p->name, p->sz);
+    80202810:	00007a97          	auipc	s5,0x7
+    80202814:	ec0a8a93          	addi	s5,s5,-320 # 802096d0 <digits+0x350>
+    printf("\n");
+    80202818:	00007a17          	auipc	s4,0x7
+    8020281c:	8c0a0a13          	addi	s4,s4,-1856 # 802090d8 <etext+0xd8>
+    if(p->state >= 0 && p->state < NELEM(states) && states[p->state])
+    80202820:	00008b97          	auipc	s7,0x8
+    80202824:	428b8b93          	addi	s7,s7,1064 # 8020ac48 <states.0>
+    80202828:	a01d                	j	8020284e <procdump+0x7e>
+    printf("%d\t%s\t%s\t%d", p->pid, state, p->name, p->sz);
+    8020282a:	ee86b703          	ld	a4,-280(a3)
+    8020282e:	ed86a583          	lw	a1,-296(a3)
+    80202832:	8556                	mv	a0,s5
+    80202834:	ffffe097          	auipc	ra,0xffffe
+    80202838:	95a080e7          	jalr	-1702(ra) # 8020018e <printf>
+    printf("\n");
+    8020283c:	8552                	mv	a0,s4
+    8020283e:	ffffe097          	auipc	ra,0xffffe
+    80202842:	950080e7          	jalr	-1712(ra) # 8020018e <printf>
+  for(p = proc; p < &proc[NPROC]; p++){
+    80202846:	17848493          	addi	s1,s1,376
+    8020284a:	03248263          	beq	s1,s2,8020286e <procdump+0x9e>
+    if(p->state == UNUSED)
+    8020284e:	86a6                	mv	a3,s1
+    80202850:	eb84a783          	lw	a5,-328(s1)
+    80202854:	dbed                	beqz	a5,80202846 <procdump+0x76>
+      state = "???";
+    80202856:	864e                	mv	a2,s3
+    if(p->state >= 0 && p->state < NELEM(states) && states[p->state])
+    80202858:	fcfb69e3          	bltu	s6,a5,8020282a <procdump+0x5a>
+    8020285c:	02079713          	slli	a4,a5,0x20
+    80202860:	01d75793          	srli	a5,a4,0x1d
+    80202864:	97de                	add	a5,a5,s7
+    80202866:	6390                	ld	a2,0(a5)
+    80202868:	f269                	bnez	a2,8020282a <procdump+0x5a>
+      state = "???";
+    8020286a:	864e                	mv	a2,s3
+    8020286c:	bf7d                	j	8020282a <procdump+0x5a>
+  }
+}
+    8020286e:	60a6                	ld	ra,72(sp)
+    80202870:	6406                	ld	s0,64(sp)
+    80202872:	74e2                	ld	s1,56(sp)
+    80202874:	7942                	ld	s2,48(sp)
+    80202876:	79a2                	ld	s3,40(sp)
+    80202878:	7a02                	ld	s4,32(sp)
+    8020287a:	6ae2                	ld	s5,24(sp)
+    8020287c:	6b42                	ld	s6,16(sp)
+    8020287e:	6ba2                	ld	s7,8(sp)
+    80202880:	6161                	addi	sp,sp,80
+    80202882:	8082                	ret
+
+0000000080202884 <procnum>:
+
+uint64
+procnum(void)
+{
+    80202884:	1141                	addi	sp,sp,-16
+    80202886:	e422                	sd	s0,8(sp)
+    80202888:	0800                	addi	s0,sp,16
+  int num = 0;
+  struct proc *p;
+
+  for (p = proc; p < &proc[NPROC]; p++) {
+    8020288a:	00012797          	auipc	a5,0x12
+    8020288e:	8f678793          	addi	a5,a5,-1802 # 80214180 <proc>
+  int num = 0;
+    80202892:	4501                	li	a0,0
+  for (p = proc; p < &proc[NPROC]; p++) {
+    80202894:	00016697          	auipc	a3,0x16
+    80202898:	25c68693          	addi	a3,a3,604 # 80218af0 <bcache>
+    8020289c:	a029                	j	802028a6 <procnum+0x22>
+    8020289e:	17878793          	addi	a5,a5,376
+    802028a2:	00d78663          	beq	a5,a3,802028ae <procnum+0x2a>
+    if (p->state != UNUSED) {
+    802028a6:	4f98                	lw	a4,24(a5)
+    802028a8:	db7d                	beqz	a4,8020289e <procnum+0x1a>
+      num++;
+    802028aa:	2505                	addiw	a0,a0,1
+    802028ac:	bfcd                	j	8020289e <procnum+0x1a>
+    }
+  }
+
+  return num;
+}
+    802028ae:	6422                	ld	s0,8(sp)
+    802028b0:	0141                	addi	sp,sp,16
+    802028b2:	8082                	ret
+
+00000000802028b4 <swtch>:
+    802028b4:	00153023          	sd	ra,0(a0)
+    802028b8:	00253423          	sd	sp,8(a0)
+    802028bc:	e900                	sd	s0,16(a0)
+    802028be:	ed04                	sd	s1,24(a0)
+    802028c0:	03253023          	sd	s2,32(a0)
+    802028c4:	03353423          	sd	s3,40(a0)
+    802028c8:	03453823          	sd	s4,48(a0)
+    802028cc:	03553c23          	sd	s5,56(a0)
+    802028d0:	05653023          	sd	s6,64(a0)
+    802028d4:	05753423          	sd	s7,72(a0)
+    802028d8:	05853823          	sd	s8,80(a0)
+    802028dc:	05953c23          	sd	s9,88(a0)
+    802028e0:	07a53023          	sd	s10,96(a0)
+    802028e4:	07b53423          	sd	s11,104(a0)
+    802028e8:	0005b083          	ld	ra,0(a1)
+    802028ec:	0085b103          	ld	sp,8(a1)
+    802028f0:	6980                	ld	s0,16(a1)
+    802028f2:	6d84                	ld	s1,24(a1)
+    802028f4:	0205b903          	ld	s2,32(a1)
+    802028f8:	0285b983          	ld	s3,40(a1)
+    802028fc:	0305ba03          	ld	s4,48(a1)
+    80202900:	0385ba83          	ld	s5,56(a1)
+    80202904:	0405bb03          	ld	s6,64(a1)
+    80202908:	0485bb83          	ld	s7,72(a1)
+    8020290c:	0505bc03          	ld	s8,80(a1)
+    80202910:	0585bc83          	ld	s9,88(a1)
+    80202914:	0605bd03          	ld	s10,96(a1)
+    80202918:	0685bd83          	ld	s11,104(a1)
+    8020291c:	8082                	ret
+
+000000008020291e <trapinithart>:
+// }
+
+// set up to take exceptions and traps while in the kernel.
+void
+trapinithart(void)
+{
+    8020291e:	1141                	addi	sp,sp,-16
+    80202920:	e406                	sd	ra,8(sp)
+    80202922:	e022                	sd	s0,0(sp)
+    80202924:	0800                	addi	s0,sp,16
+  asm volatile("csrw stvec, %0" : : "r" (x));
+    80202926:	00009797          	auipc	a5,0x9
+    8020292a:	3ca7b783          	ld	a5,970(a5) # 8020bcf0 <_GLOBAL_OFFSET_TABLE_+0x18>
+    8020292e:	10579073          	csrw	stvec,a5
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    80202932:	100027f3          	csrr	a5,sstatus
+  w_stvec((uint64)kernelvec);
+  w_sstatus(r_sstatus() | SSTATUS_SIE);
+    80202936:	0027e793          	ori	a5,a5,2
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    8020293a:	10079073          	csrw	sstatus,a5
+  asm volatile("csrr %0, sie" : "=r" (x) );
+    8020293e:	104027f3          	csrr	a5,sie
+  // enable supervisor-mode timer interrupts.
+  w_sie(r_sie() | SIE_SEIE | SIE_SSIE | SIE_STIE);
+    80202942:	2227e793          	ori	a5,a5,546
+  asm volatile("csrw sie, %0" : : "r" (x));
+    80202946:	10479073          	csrw	sie,a5
+  set_next_timeout();
+    8020294a:	00003097          	auipc	ra,0x3
+    8020294e:	afc080e7          	jalr	-1284(ra) # 80205446 <set_next_timeout>
+  #ifdef DEBUG
+  printf("trapinithart\n");
+  #endif
+}
+    80202952:	60a2                	ld	ra,8(sp)
+    80202954:	6402                	ld	s0,0(sp)
+    80202956:	0141                	addi	sp,sp,16
+    80202958:	8082                	ret
+
+000000008020295a <usertrapret>:
+//
+// return to user space
+//
+void
+usertrapret(void)
+{
+    8020295a:	1141                	addi	sp,sp,-16
+    8020295c:	e406                	sd	ra,8(sp)
+    8020295e:	e022                	sd	s0,0(sp)
+    80202960:	0800                	addi	s0,sp,16
+  struct proc *p = myproc();
+    80202962:	fffff097          	auipc	ra,0xfffff
+    80202966:	0da080e7          	jalr	218(ra) # 80201a3c <myproc>
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    8020296a:	100027f3          	csrr	a5,sstatus
+  w_sstatus(r_sstatus() & ~SSTATUS_SIE);
+    8020296e:	9bf5                	andi	a5,a5,-3
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    80202970:	10079073          	csrw	sstatus,a5
+  // kerneltrap() to usertrap(), so turn off interrupts until
+  // we're back in user space, where usertrap() is correct.
+  intr_off();
+
+  // send syscalls, interrupts, and exceptions to trampoline.S
+  w_stvec(TRAMPOLINE + (uservec - trampoline));
+    80202974:	00009697          	auipc	a3,0x9
+    80202978:	36c6b683          	ld	a3,876(a3) # 8020bce0 <_GLOBAL_OFFSET_TABLE_+0x8>
+    8020297c:	00009717          	auipc	a4,0x9
+    80202980:	39473703          	ld	a4,916(a4) # 8020bd10 <_GLOBAL_OFFSET_TABLE_+0x38>
+    80202984:	8f15                	sub	a4,a4,a3
+    80202986:	040007b7          	lui	a5,0x4000
+    8020298a:	17fd                	addi	a5,a5,-1 # 3ffffff <_entry-0x7c200001>
+    8020298c:	07b2                	slli	a5,a5,0xc
+    8020298e:	973e                	add	a4,a4,a5
+  asm volatile("csrw stvec, %0" : : "r" (x));
+    80202990:	10571073          	csrw	stvec,a4
+
+  // set up trapframe values that uservec will need when
+  // the process next re-enters the kernel.
+  p->trapframe->kernel_satp = r_satp();         // kernel page table
+    80202994:	7138                	ld	a4,96(a0)
+  asm volatile("csrr %0, satp" : "=r" (x) );
+    80202996:	18002673          	csrr	a2,satp
+    8020299a:	e310                	sd	a2,0(a4)
+  p->trapframe->kernel_sp = p->kstack + PGSIZE; // process's kernel stack
+    8020299c:	7130                	ld	a2,96(a0)
+    8020299e:	6138                	ld	a4,64(a0)
+    802029a0:	6585                	lui	a1,0x1
+    802029a2:	972e                	add	a4,a4,a1
+    802029a4:	e618                	sd	a4,8(a2)
+  p->trapframe->kernel_trap = (uint64)usertrap;
+    802029a6:	7138                	ld	a4,96(a0)
+    802029a8:	00000617          	auipc	a2,0x0
+    802029ac:	0f460613          	addi	a2,a2,244 # 80202a9c <usertrap>
+    802029b0:	eb10                	sd	a2,16(a4)
+  p->trapframe->kernel_hartid = r_tp();         // hartid for cpuid()
+    802029b2:	7138                	ld	a4,96(a0)
+  asm volatile("mv %0, tp" : "=r" (x) );
+    802029b4:	8612                	mv	a2,tp
+    802029b6:	f310                	sd	a2,32(a4)
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    802029b8:	10002773          	csrr	a4,sstatus
+  // set up the registers that trampoline.S's sret will use
+  // to get to user space.
+  
+  // set S Previous Privilege mode to User.
+  unsigned long x = r_sstatus();
+  x &= ~SSTATUS_SPP; // clear SPP to 0 for user mode
+    802029bc:	eff77713          	andi	a4,a4,-257
+  x |= SSTATUS_SPIE; // enable interrupts in user mode
+    802029c0:	02076713          	ori	a4,a4,32
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    802029c4:	10071073          	csrw	sstatus,a4
+  w_sstatus(x);
+
+  // set S Exception Program Counter to the saved user pc.
+  w_sepc(p->trapframe->epc);
+    802029c8:	7138                	ld	a4,96(a0)
+  asm volatile("csrw sepc, %0" : : "r" (x));
+    802029ca:	6f18                	ld	a4,24(a4)
+    802029cc:	14171073          	csrw	sepc,a4
+
+  // tell trampoline.S the user page table to switch to.
+  // printf("[usertrapret]p->pagetable: %p\n", p->pagetable);
+  uint64 satp = MAKE_SATP(p->pagetable);
+    802029d0:	692c                	ld	a1,80(a0)
+    802029d2:	81b1                	srli	a1,a1,0xc
+
+  // jump to trampoline.S at the top of memory, which 
+  // switches to the user page table, restores user registers,
+  // and switches to user mode with sret.
+  uint64 fn = TRAMPOLINE + (userret - trampoline);
+    802029d4:	00009717          	auipc	a4,0x9
+    802029d8:	31473703          	ld	a4,788(a4) # 8020bce8 <_GLOBAL_OFFSET_TABLE_+0x10>
+    802029dc:	8f15                	sub	a4,a4,a3
+    802029de:	97ba                	add	a5,a5,a4
+  ((void (*)(uint64,uint64))fn)(TRAPFRAME, satp);
+    802029e0:	577d                	li	a4,-1
+    802029e2:	177e                	slli	a4,a4,0x3f
+    802029e4:	8dd9                	or	a1,a1,a4
+    802029e6:	02000537          	lui	a0,0x2000
+    802029ea:	157d                	addi	a0,a0,-1 # 1ffffff <_entry-0x7e200001>
+    802029ec:	0536                	slli	a0,a0,0xd
+    802029ee:	9782                	jalr	a5
+}
+    802029f0:	60a2                	ld	ra,8(sp)
+    802029f2:	6402                	ld	s0,0(sp)
+    802029f4:	0141                	addi	sp,sp,16
+    802029f6:	8082                	ret
+
+00000000802029f8 <devintr>:
+// Check if it's an external/software interrupt, 
+// and handle it. 
+// returns  2 if timer interrupt, 
+//          1 if other device, 
+//          0 if not recognized. 
+int devintr(void) {
+    802029f8:	1101                	addi	sp,sp,-32
+    802029fa:	ec06                	sd	ra,24(sp)
+    802029fc:	e822                	sd	s0,16(sp)
+    802029fe:	e426                	sd	s1,8(sp)
+    80202a00:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, scause" : "=r" (x) );
+    80202a02:	14202773          	csrr	a4,scause
+	uint64 scause = r_scause();
+
+	#ifdef QEMU 
+	// handle external interrupt 
+	if ((0x8000000000000000L & scause) && 9 == (scause & 0xff)) 
+    80202a06:	00074d63          	bltz	a4,80202a20 <devintr+0x28>
+		sbi_set_mie();
+		#endif 
+
+		return 1;
+	}
+	else if (0x8000000000000005L == scause) {
+    80202a0a:	57fd                	li	a5,-1
+    80202a0c:	17fe                	slli	a5,a5,0x3f
+    80202a0e:	0795                	addi	a5,a5,5
+		timer_tick();
+		return 2;
+	}
+	else { return 0;}
+    80202a10:	4501                	li	a0,0
+	else if (0x8000000000000005L == scause) {
+    80202a12:	06f70f63          	beq	a4,a5,80202a90 <devintr+0x98>
+}
+    80202a16:	60e2                	ld	ra,24(sp)
+    80202a18:	6442                	ld	s0,16(sp)
+    80202a1a:	64a2                	ld	s1,8(sp)
+    80202a1c:	6105                	addi	sp,sp,32
+    80202a1e:	8082                	ret
+	if ((0x8000000000000000L & scause) && 9 == (scause & 0xff)) 
+    80202a20:	0ff77793          	zext.b	a5,a4
+    80202a24:	46a5                	li	a3,9
+    80202a26:	fed792e3          	bne	a5,a3,80202a0a <devintr+0x12>
+		int irq = plic_claim();
+    80202a2a:	00004097          	auipc	ra,0x4
+    80202a2e:	480080e7          	jalr	1152(ra) # 80206eaa <plic_claim>
+    80202a32:	84aa                	mv	s1,a0
+		if (UART_IRQ == irq) {
+    80202a34:	47a9                	li	a5,10
+    80202a36:	02f50163          	beq	a0,a5,80202a58 <devintr+0x60>
+		else if (DISK_IRQ == irq) {
+    80202a3a:	4785                	li	a5,1
+    80202a3c:	04f50563          	beq	a0,a5,80202a86 <devintr+0x8e>
+		return 1;
+    80202a40:	4505                	li	a0,1
+		else if (irq) {
+    80202a42:	d8f1                	beqz	s1,80202a16 <devintr+0x1e>
+			printf("unexpected interrupt irq = %d\n", irq);
+    80202a44:	85a6                	mv	a1,s1
+    80202a46:	00007517          	auipc	a0,0x7
+    80202a4a:	cc250513          	addi	a0,a0,-830 # 80209708 <digits+0x388>
+    80202a4e:	ffffd097          	auipc	ra,0xffffd
+    80202a52:	740080e7          	jalr	1856(ra) # 8020018e <printf>
+    80202a56:	a821                	j	80202a6e <devintr+0x76>
+	return SBI_CALL_0(SBI_CONSOLE_GETCHAR);
+    80202a58:	4501                	li	a0,0
+    80202a5a:	4581                	li	a1,0
+    80202a5c:	4601                	li	a2,0
+    80202a5e:	4681                	li	a3,0
+    80202a60:	4889                	li	a7,2
+    80202a62:	00000073          	ecall
+    80202a66:	2501                	sext.w	a0,a0
+			if (-1 != c) {
+    80202a68:	57fd                	li	a5,-1
+    80202a6a:	00f51963          	bne	a0,a5,80202a7c <devintr+0x84>
+		if (irq) { plic_complete(irq);}
+    80202a6e:	8526                	mv	a0,s1
+    80202a70:	00004097          	auipc	ra,0x4
+    80202a74:	464080e7          	jalr	1124(ra) # 80206ed4 <plic_complete>
+		return 1;
+    80202a78:	4505                	li	a0,1
+    80202a7a:	bf71                	j	80202a16 <devintr+0x1e>
+				consoleintr(c);
+    80202a7c:	00004097          	auipc	ra,0x4
+    80202a80:	66c080e7          	jalr	1644(ra) # 802070e8 <consoleintr>
+    80202a84:	b7ed                	j	80202a6e <devintr+0x76>
+			disk_intr();
+    80202a86:	00003097          	auipc	ra,0x3
+    80202a8a:	a80080e7          	jalr	-1408(ra) # 80205506 <disk_intr>
+    80202a8e:	b7c5                	j	80202a6e <devintr+0x76>
+		timer_tick();
+    80202a90:	00003097          	auipc	ra,0x3
+    80202a94:	9dc080e7          	jalr	-1572(ra) # 8020546c <timer_tick>
+		return 2;
+    80202a98:	4509                	li	a0,2
+    80202a9a:	bfb5                	j	80202a16 <devintr+0x1e>
+
+0000000080202a9c <usertrap>:
+{
+    80202a9c:	1101                	addi	sp,sp,-32
+    80202a9e:	ec06                	sd	ra,24(sp)
+    80202aa0:	e822                	sd	s0,16(sp)
+    80202aa2:	e426                	sd	s1,8(sp)
+    80202aa4:	e04a                	sd	s2,0(sp)
+    80202aa6:	1000                	addi	s0,sp,32
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    80202aa8:	100027f3          	csrr	a5,sstatus
+  if((r_sstatus() & SSTATUS_SPP) != 0)
+    80202aac:	1007f793          	andi	a5,a5,256
+    80202ab0:	e3ad                	bnez	a5,80202b12 <usertrap+0x76>
+  asm volatile("csrw stvec, %0" : : "r" (x));
+    80202ab2:	00009797          	auipc	a5,0x9
+    80202ab6:	23e7b783          	ld	a5,574(a5) # 8020bcf0 <_GLOBAL_OFFSET_TABLE_+0x18>
+    80202aba:	10579073          	csrw	stvec,a5
+  struct proc *p = myproc();
+    80202abe:	fffff097          	auipc	ra,0xfffff
+    80202ac2:	f7e080e7          	jalr	-130(ra) # 80201a3c <myproc>
+    80202ac6:	84aa                	mv	s1,a0
+  p->trapframe->epc = r_sepc();
+    80202ac8:	713c                	ld	a5,96(a0)
+  asm volatile("csrr %0, sepc" : "=r" (x) );
+    80202aca:	14102773          	csrr	a4,sepc
+    80202ace:	ef98                	sd	a4,24(a5)
+  asm volatile("csrr %0, scause" : "=r" (x) );
+    80202ad0:	14202773          	csrr	a4,scause
+  if(r_scause() == 8){
+    80202ad4:	47a1                	li	a5,8
+    80202ad6:	04f71c63          	bne	a4,a5,80202b2e <usertrap+0x92>
+    if(p->killed)
+    80202ada:	591c                	lw	a5,48(a0)
+    80202adc:	e3b9                	bnez	a5,80202b22 <usertrap+0x86>
+    p->trapframe->epc += 4;
+    80202ade:	70b8                	ld	a4,96(s1)
+    80202ae0:	6f1c                	ld	a5,24(a4)
+    80202ae2:	0791                	addi	a5,a5,4
+    80202ae4:	ef1c                	sd	a5,24(a4)
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    80202ae6:	100027f3          	csrr	a5,sstatus
+  w_sstatus(r_sstatus() | SSTATUS_SIE);
+    80202aea:	0027e793          	ori	a5,a5,2
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    80202aee:	10079073          	csrw	sstatus,a5
+    syscall();
+    80202af2:	00000097          	auipc	ra,0x0
+    80202af6:	644080e7          	jalr	1604(ra) # 80203136 <syscall>
+  if(p->killed)
+    80202afa:	589c                	lw	a5,48(s1)
+    80202afc:	ebd1                	bnez	a5,80202b90 <usertrap+0xf4>
+  usertrapret();
+    80202afe:	00000097          	auipc	ra,0x0
+    80202b02:	e5c080e7          	jalr	-420(ra) # 8020295a <usertrapret>
+}
+    80202b06:	60e2                	ld	ra,24(sp)
+    80202b08:	6442                	ld	s0,16(sp)
+    80202b0a:	64a2                	ld	s1,8(sp)
+    80202b0c:	6902                	ld	s2,0(sp)
+    80202b0e:	6105                	addi	sp,sp,32
+    80202b10:	8082                	ret
+    panic("usertrap: not from user mode");
+    80202b12:	00007517          	auipc	a0,0x7
+    80202b16:	c1650513          	addi	a0,a0,-1002 # 80209728 <digits+0x3a8>
+    80202b1a:	ffffd097          	auipc	ra,0xffffd
+    80202b1e:	62a080e7          	jalr	1578(ra) # 80200144 <panic>
+      exit(-1);
+    80202b22:	557d                	li	a0,-1
+    80202b24:	fffff097          	auipc	ra,0xfffff
+    80202b28:	794080e7          	jalr	1940(ra) # 802022b8 <exit>
+    80202b2c:	bf4d                	j	80202ade <usertrap+0x42>
+  else if((which_dev = devintr()) != 0){
+    80202b2e:	00000097          	auipc	ra,0x0
+    80202b32:	eca080e7          	jalr	-310(ra) # 802029f8 <devintr>
+    80202b36:	892a                	mv	s2,a0
+    80202b38:	c501                	beqz	a0,80202b40 <usertrap+0xa4>
+  if(p->killed)
+    80202b3a:	589c                	lw	a5,48(s1)
+    80202b3c:	c3b1                	beqz	a5,80202b80 <usertrap+0xe4>
+    80202b3e:	a825                	j	80202b76 <usertrap+0xda>
+  asm volatile("csrr %0, scause" : "=r" (x) );
+    80202b40:	142025f3          	csrr	a1,scause
+    printf("\nusertrap(): unexpected scause %p pid=%d %s\n", r_scause(), p->pid, p->name);
+    80202b44:	16048693          	addi	a3,s1,352
+    80202b48:	5c90                	lw	a2,56(s1)
+    80202b4a:	00007517          	auipc	a0,0x7
+    80202b4e:	bfe50513          	addi	a0,a0,-1026 # 80209748 <digits+0x3c8>
+    80202b52:	ffffd097          	auipc	ra,0xffffd
+    80202b56:	63c080e7          	jalr	1596(ra) # 8020018e <printf>
+  asm volatile("csrr %0, sepc" : "=r" (x) );
+    80202b5a:	141025f3          	csrr	a1,sepc
+  asm volatile("csrr %0, stval" : "=r" (x) );
+    80202b5e:	14302673          	csrr	a2,stval
+    printf("            sepc=%p stval=%p\n", r_sepc(), r_stval());
+    80202b62:	00007517          	auipc	a0,0x7
+    80202b66:	c1650513          	addi	a0,a0,-1002 # 80209778 <digits+0x3f8>
+    80202b6a:	ffffd097          	auipc	ra,0xffffd
+    80202b6e:	624080e7          	jalr	1572(ra) # 8020018e <printf>
+    p->killed = 1;
+    80202b72:	4785                	li	a5,1
+    80202b74:	d89c                	sw	a5,48(s1)
+    exit(-1);
+    80202b76:	557d                	li	a0,-1
+    80202b78:	fffff097          	auipc	ra,0xfffff
+    80202b7c:	740080e7          	jalr	1856(ra) # 802022b8 <exit>
+  if(which_dev == 2)
+    80202b80:	4789                	li	a5,2
+    80202b82:	f6f91ee3          	bne	s2,a5,80202afe <usertrap+0x62>
+    yield();
+    80202b86:	00000097          	auipc	ra,0x0
+    80202b8a:	832080e7          	jalr	-1998(ra) # 802023b8 <yield>
+    80202b8e:	bf85                	j	80202afe <usertrap+0x62>
+  int which_dev = 0;
+    80202b90:	4901                	li	s2,0
+    80202b92:	b7d5                	j	80202b76 <usertrap+0xda>
+
+0000000080202b94 <kerneltrap>:
+kerneltrap() {
+    80202b94:	7179                	addi	sp,sp,-48
+    80202b96:	f406                	sd	ra,40(sp)
+    80202b98:	f022                	sd	s0,32(sp)
+    80202b9a:	ec26                	sd	s1,24(sp)
+    80202b9c:	e84a                	sd	s2,16(sp)
+    80202b9e:	e44e                	sd	s3,8(sp)
+    80202ba0:	1800                	addi	s0,sp,48
+  asm volatile("csrr %0, sepc" : "=r" (x) );
+    80202ba2:	14102973          	csrr	s2,sepc
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    80202ba6:	100024f3          	csrr	s1,sstatus
+  asm volatile("csrr %0, scause" : "=r" (x) );
+    80202baa:	142029f3          	csrr	s3,scause
+  if((sstatus & SSTATUS_SPP) == 0)
+    80202bae:	1004f793          	andi	a5,s1,256
+    80202bb2:	cb85                	beqz	a5,80202be2 <kerneltrap+0x4e>
+  asm volatile("csrr %0, sstatus" : "=r" (x) );
+    80202bb4:	100027f3          	csrr	a5,sstatus
+  return (x & SSTATUS_SIE) != 0;
+    80202bb8:	8b89                	andi	a5,a5,2
+  if(intr_get() != 0)
+    80202bba:	ef85                	bnez	a5,80202bf2 <kerneltrap+0x5e>
+  if((which_dev = devintr()) == 0){
+    80202bbc:	00000097          	auipc	ra,0x0
+    80202bc0:	e3c080e7          	jalr	-452(ra) # 802029f8 <devintr>
+    80202bc4:	cd1d                	beqz	a0,80202c02 <kerneltrap+0x6e>
+  if(which_dev == 2 && myproc() != 0 && myproc()->state == RUNNING) {
+    80202bc6:	4789                	li	a5,2
+    80202bc8:	08f50b63          	beq	a0,a5,80202c5e <kerneltrap+0xca>
+  asm volatile("csrw sepc, %0" : : "r" (x));
+    80202bcc:	14191073          	csrw	sepc,s2
+  asm volatile("csrw sstatus, %0" : : "r" (x));
+    80202bd0:	10049073          	csrw	sstatus,s1
+}
+    80202bd4:	70a2                	ld	ra,40(sp)
+    80202bd6:	7402                	ld	s0,32(sp)
+    80202bd8:	64e2                	ld	s1,24(sp)
+    80202bda:	6942                	ld	s2,16(sp)
+    80202bdc:	69a2                	ld	s3,8(sp)
+    80202bde:	6145                	addi	sp,sp,48
+    80202be0:	8082                	ret
+    panic("kerneltrap: not from supervisor mode");
+    80202be2:	00007517          	auipc	a0,0x7
+    80202be6:	bb650513          	addi	a0,a0,-1098 # 80209798 <digits+0x418>
+    80202bea:	ffffd097          	auipc	ra,0xffffd
+    80202bee:	55a080e7          	jalr	1370(ra) # 80200144 <panic>
+    panic("kerneltrap: interrupts enabled");
+    80202bf2:	00007517          	auipc	a0,0x7
+    80202bf6:	bce50513          	addi	a0,a0,-1074 # 802097c0 <digits+0x440>
+    80202bfa:	ffffd097          	auipc	ra,0xffffd
+    80202bfe:	54a080e7          	jalr	1354(ra) # 80200144 <panic>
+    printf("\nscause %p\n", scause);
+    80202c02:	85ce                	mv	a1,s3
+    80202c04:	00007517          	auipc	a0,0x7
+    80202c08:	bdc50513          	addi	a0,a0,-1060 # 802097e0 <digits+0x460>
+    80202c0c:	ffffd097          	auipc	ra,0xffffd
+    80202c10:	582080e7          	jalr	1410(ra) # 8020018e <printf>
+  asm volatile("csrr %0, sepc" : "=r" (x) );
+    80202c14:	141025f3          	csrr	a1,sepc
+  asm volatile("csrr %0, stval" : "=r" (x) );
+    80202c18:	14302673          	csrr	a2,stval
+  asm volatile("mv %0, tp" : "=r" (x) );
+    80202c1c:	8692                	mv	a3,tp
+    printf("sepc=%p stval=%p hart=%d\n", r_sepc(), r_stval(), r_tp());
+    80202c1e:	00007517          	auipc	a0,0x7
+    80202c22:	bd250513          	addi	a0,a0,-1070 # 802097f0 <digits+0x470>
+    80202c26:	ffffd097          	auipc	ra,0xffffd
+    80202c2a:	568080e7          	jalr	1384(ra) # 8020018e <printf>
+    struct proc *p = myproc();
+    80202c2e:	fffff097          	auipc	ra,0xfffff
+    80202c32:	e0e080e7          	jalr	-498(ra) # 80201a3c <myproc>
+    if (p != 0) {
+    80202c36:	cd01                	beqz	a0,80202c4e <kerneltrap+0xba>
+      printf("pid: %d, name: %s\n", p->pid, p->name);
+    80202c38:	16050613          	addi	a2,a0,352
+    80202c3c:	5d0c                	lw	a1,56(a0)
+    80202c3e:	00007517          	auipc	a0,0x7
+    80202c42:	bd250513          	addi	a0,a0,-1070 # 80209810 <digits+0x490>
+    80202c46:	ffffd097          	auipc	ra,0xffffd
+    80202c4a:	548080e7          	jalr	1352(ra) # 8020018e <printf>
+    panic("kerneltrap");
+    80202c4e:	00007517          	auipc	a0,0x7
+    80202c52:	bda50513          	addi	a0,a0,-1062 # 80209828 <digits+0x4a8>
+    80202c56:	ffffd097          	auipc	ra,0xffffd
+    80202c5a:	4ee080e7          	jalr	1262(ra) # 80200144 <panic>
+  if(which_dev == 2 && myproc() != 0 && myproc()->state == RUNNING) {
+    80202c5e:	fffff097          	auipc	ra,0xfffff
+    80202c62:	dde080e7          	jalr	-546(ra) # 80201a3c <myproc>
+    80202c66:	d13d                	beqz	a0,80202bcc <kerneltrap+0x38>
+    80202c68:	fffff097          	auipc	ra,0xfffff
+    80202c6c:	dd4080e7          	jalr	-556(ra) # 80201a3c <myproc>
+    80202c70:	4d18                	lw	a4,24(a0)
+    80202c72:	478d                	li	a5,3
+    80202c74:	f4f71ce3          	bne	a4,a5,80202bcc <kerneltrap+0x38>
+    yield();
+    80202c78:	fffff097          	auipc	ra,0xfffff
+    80202c7c:	740080e7          	jalr	1856(ra) # 802023b8 <yield>
+    80202c80:	b7b1                	j	80202bcc <kerneltrap+0x38>
+
+0000000080202c82 <trapframedump>:
+
+void trapframedump(struct trapframe *tf)
+{
+    80202c82:	1101                	addi	sp,sp,-32
+    80202c84:	ec06                	sd	ra,24(sp)
+    80202c86:	e822                	sd	s0,16(sp)
+    80202c88:	e426                	sd	s1,8(sp)
+    80202c8a:	1000                	addi	s0,sp,32
+    80202c8c:	84aa                	mv	s1,a0
+  printf("a0: %p\t", tf->a0);
+    80202c8e:	792c                	ld	a1,112(a0)
+    80202c90:	00007517          	auipc	a0,0x7
+    80202c94:	ba850513          	addi	a0,a0,-1112 # 80209838 <digits+0x4b8>
+    80202c98:	ffffd097          	auipc	ra,0xffffd
+    80202c9c:	4f6080e7          	jalr	1270(ra) # 8020018e <printf>
+  printf("a1: %p\t", tf->a1);
+    80202ca0:	7cac                	ld	a1,120(s1)
+    80202ca2:	00007517          	auipc	a0,0x7
+    80202ca6:	b9e50513          	addi	a0,a0,-1122 # 80209840 <digits+0x4c0>
+    80202caa:	ffffd097          	auipc	ra,0xffffd
+    80202cae:	4e4080e7          	jalr	1252(ra) # 8020018e <printf>
+  printf("a2: %p\t", tf->a2);
+    80202cb2:	60cc                	ld	a1,128(s1)
+    80202cb4:	00007517          	auipc	a0,0x7
+    80202cb8:	b9450513          	addi	a0,a0,-1132 # 80209848 <digits+0x4c8>
+    80202cbc:	ffffd097          	auipc	ra,0xffffd
+    80202cc0:	4d2080e7          	jalr	1234(ra) # 8020018e <printf>
+  printf("a3: %p\n", tf->a3);
+    80202cc4:	64cc                	ld	a1,136(s1)
+    80202cc6:	00007517          	auipc	a0,0x7
+    80202cca:	b8a50513          	addi	a0,a0,-1142 # 80209850 <digits+0x4d0>
+    80202cce:	ffffd097          	auipc	ra,0xffffd
+    80202cd2:	4c0080e7          	jalr	1216(ra) # 8020018e <printf>
+  printf("a4: %p\t", tf->a4);
+    80202cd6:	68cc                	ld	a1,144(s1)
+    80202cd8:	00007517          	auipc	a0,0x7
+    80202cdc:	b8050513          	addi	a0,a0,-1152 # 80209858 <digits+0x4d8>
+    80202ce0:	ffffd097          	auipc	ra,0xffffd
+    80202ce4:	4ae080e7          	jalr	1198(ra) # 8020018e <printf>
+  printf("a5: %p\t", tf->a5);
+    80202ce8:	6ccc                	ld	a1,152(s1)
+    80202cea:	00007517          	auipc	a0,0x7
+    80202cee:	b7650513          	addi	a0,a0,-1162 # 80209860 <digits+0x4e0>
+    80202cf2:	ffffd097          	auipc	ra,0xffffd
+    80202cf6:	49c080e7          	jalr	1180(ra) # 8020018e <printf>
+  printf("a6: %p\t", tf->a6);
+    80202cfa:	70cc                	ld	a1,160(s1)
+    80202cfc:	00007517          	auipc	a0,0x7
+    80202d00:	b6c50513          	addi	a0,a0,-1172 # 80209868 <digits+0x4e8>
+    80202d04:	ffffd097          	auipc	ra,0xffffd
+    80202d08:	48a080e7          	jalr	1162(ra) # 8020018e <printf>
+  printf("a7: %p\n", tf->a7);
+    80202d0c:	74cc                	ld	a1,168(s1)
+    80202d0e:	00007517          	auipc	a0,0x7
+    80202d12:	b6250513          	addi	a0,a0,-1182 # 80209870 <digits+0x4f0>
+    80202d16:	ffffd097          	auipc	ra,0xffffd
+    80202d1a:	478080e7          	jalr	1144(ra) # 8020018e <printf>
+  printf("t0: %p\t", tf->t0);
+    80202d1e:	64ac                	ld	a1,72(s1)
+    80202d20:	00007517          	auipc	a0,0x7
+    80202d24:	b5850513          	addi	a0,a0,-1192 # 80209878 <digits+0x4f8>
+    80202d28:	ffffd097          	auipc	ra,0xffffd
+    80202d2c:	466080e7          	jalr	1126(ra) # 8020018e <printf>
+  printf("t1: %p\t", tf->t1);
+    80202d30:	68ac                	ld	a1,80(s1)
+    80202d32:	00007517          	auipc	a0,0x7
+    80202d36:	b4e50513          	addi	a0,a0,-1202 # 80209880 <digits+0x500>
+    80202d3a:	ffffd097          	auipc	ra,0xffffd
+    80202d3e:	454080e7          	jalr	1108(ra) # 8020018e <printf>
+  printf("t2: %p\t", tf->t2);
+    80202d42:	6cac                	ld	a1,88(s1)
+    80202d44:	00007517          	auipc	a0,0x7
+    80202d48:	b4450513          	addi	a0,a0,-1212 # 80209888 <digits+0x508>
+    80202d4c:	ffffd097          	auipc	ra,0xffffd
+    80202d50:	442080e7          	jalr	1090(ra) # 8020018e <printf>
+  printf("t3: %p\n", tf->t3);
+    80202d54:	1004b583          	ld	a1,256(s1)
+    80202d58:	00007517          	auipc	a0,0x7
+    80202d5c:	b3850513          	addi	a0,a0,-1224 # 80209890 <digits+0x510>
+    80202d60:	ffffd097          	auipc	ra,0xffffd
+    80202d64:	42e080e7          	jalr	1070(ra) # 8020018e <printf>
+  printf("t4: %p\t", tf->t4);
+    80202d68:	1084b583          	ld	a1,264(s1)
+    80202d6c:	00007517          	auipc	a0,0x7
+    80202d70:	b2c50513          	addi	a0,a0,-1236 # 80209898 <digits+0x518>
+    80202d74:	ffffd097          	auipc	ra,0xffffd
+    80202d78:	41a080e7          	jalr	1050(ra) # 8020018e <printf>
+  printf("t5: %p\t", tf->t5);
+    80202d7c:	1104b583          	ld	a1,272(s1)
+    80202d80:	00007517          	auipc	a0,0x7
+    80202d84:	b2050513          	addi	a0,a0,-1248 # 802098a0 <digits+0x520>
+    80202d88:	ffffd097          	auipc	ra,0xffffd
+    80202d8c:	406080e7          	jalr	1030(ra) # 8020018e <printf>
+  printf("t6: %p\t", tf->t6);
+    80202d90:	1184b583          	ld	a1,280(s1)
+    80202d94:	00007517          	auipc	a0,0x7
+    80202d98:	b1450513          	addi	a0,a0,-1260 # 802098a8 <digits+0x528>
+    80202d9c:	ffffd097          	auipc	ra,0xffffd
+    80202da0:	3f2080e7          	jalr	1010(ra) # 8020018e <printf>
+  printf("s0: %p\n", tf->s0);
+    80202da4:	70ac                	ld	a1,96(s1)
+    80202da6:	00007517          	auipc	a0,0x7
+    80202daa:	b0a50513          	addi	a0,a0,-1270 # 802098b0 <digits+0x530>
+    80202dae:	ffffd097          	auipc	ra,0xffffd
+    80202db2:	3e0080e7          	jalr	992(ra) # 8020018e <printf>
+  printf("s1: %p\t", tf->s1);
+    80202db6:	74ac                	ld	a1,104(s1)
+    80202db8:	00007517          	auipc	a0,0x7
+    80202dbc:	b0050513          	addi	a0,a0,-1280 # 802098b8 <digits+0x538>
+    80202dc0:	ffffd097          	auipc	ra,0xffffd
+    80202dc4:	3ce080e7          	jalr	974(ra) # 8020018e <printf>
+  printf("s2: %p\t", tf->s2);
+    80202dc8:	78cc                	ld	a1,176(s1)
+    80202dca:	00007517          	auipc	a0,0x7
+    80202dce:	af650513          	addi	a0,a0,-1290 # 802098c0 <digits+0x540>
+    80202dd2:	ffffd097          	auipc	ra,0xffffd
+    80202dd6:	3bc080e7          	jalr	956(ra) # 8020018e <printf>
+  printf("s3: %p\t", tf->s3);
+    80202dda:	7ccc                	ld	a1,184(s1)
+    80202ddc:	00007517          	auipc	a0,0x7
+    80202de0:	aec50513          	addi	a0,a0,-1300 # 802098c8 <digits+0x548>
+    80202de4:	ffffd097          	auipc	ra,0xffffd
+    80202de8:	3aa080e7          	jalr	938(ra) # 8020018e <printf>
+  printf("s4: %p\n", tf->s4);
+    80202dec:	60ec                	ld	a1,192(s1)
+    80202dee:	00007517          	auipc	a0,0x7
+    80202df2:	ae250513          	addi	a0,a0,-1310 # 802098d0 <digits+0x550>
+    80202df6:	ffffd097          	auipc	ra,0xffffd
+    80202dfa:	398080e7          	jalr	920(ra) # 8020018e <printf>
+  printf("s5: %p\t", tf->s5);
+    80202dfe:	64ec                	ld	a1,200(s1)
+    80202e00:	00007517          	auipc	a0,0x7
+    80202e04:	ad850513          	addi	a0,a0,-1320 # 802098d8 <digits+0x558>
+    80202e08:	ffffd097          	auipc	ra,0xffffd
+    80202e0c:	386080e7          	jalr	902(ra) # 8020018e <printf>
+  printf("s6: %p\t", tf->s6);
+    80202e10:	68ec                	ld	a1,208(s1)
+    80202e12:	00007517          	auipc	a0,0x7
+    80202e16:	ace50513          	addi	a0,a0,-1330 # 802098e0 <digits+0x560>
+    80202e1a:	ffffd097          	auipc	ra,0xffffd
+    80202e1e:	374080e7          	jalr	884(ra) # 8020018e <printf>
+  printf("s7: %p\t", tf->s7);
+    80202e22:	6cec                	ld	a1,216(s1)
+    80202e24:	00007517          	auipc	a0,0x7
+    80202e28:	ac450513          	addi	a0,a0,-1340 # 802098e8 <digits+0x568>
+    80202e2c:	ffffd097          	auipc	ra,0xffffd
+    80202e30:	362080e7          	jalr	866(ra) # 8020018e <printf>
+  printf("s8: %p\n", tf->s8);
+    80202e34:	70ec                	ld	a1,224(s1)
+    80202e36:	00007517          	auipc	a0,0x7
+    80202e3a:	aba50513          	addi	a0,a0,-1350 # 802098f0 <digits+0x570>
+    80202e3e:	ffffd097          	auipc	ra,0xffffd
+    80202e42:	350080e7          	jalr	848(ra) # 8020018e <printf>
+  printf("s9: %p\t", tf->s9);
+    80202e46:	74ec                	ld	a1,232(s1)
+    80202e48:	00007517          	auipc	a0,0x7
+    80202e4c:	ab050513          	addi	a0,a0,-1360 # 802098f8 <digits+0x578>
+    80202e50:	ffffd097          	auipc	ra,0xffffd
+    80202e54:	33e080e7          	jalr	830(ra) # 8020018e <printf>
+  printf("s10: %p\t", tf->s10);
+    80202e58:	78ec                	ld	a1,240(s1)
+    80202e5a:	00007517          	auipc	a0,0x7
+    80202e5e:	aa650513          	addi	a0,a0,-1370 # 80209900 <digits+0x580>
+    80202e62:	ffffd097          	auipc	ra,0xffffd
+    80202e66:	32c080e7          	jalr	812(ra) # 8020018e <printf>
+  printf("s11: %p\t", tf->s11);
+    80202e6a:	7cec                	ld	a1,248(s1)
+    80202e6c:	00007517          	auipc	a0,0x7
+    80202e70:	aa450513          	addi	a0,a0,-1372 # 80209910 <digits+0x590>
+    80202e74:	ffffd097          	auipc	ra,0xffffd
+    80202e78:	31a080e7          	jalr	794(ra) # 8020018e <printf>
+  printf("ra: %p\n", tf->ra);
+    80202e7c:	748c                	ld	a1,40(s1)
+    80202e7e:	00006517          	auipc	a0,0x6
+    80202e82:	79250513          	addi	a0,a0,1938 # 80209610 <digits+0x290>
+    80202e86:	ffffd097          	auipc	ra,0xffffd
+    80202e8a:	308080e7          	jalr	776(ra) # 8020018e <printf>
+  printf("sp: %p\t", tf->sp);
+    80202e8e:	788c                	ld	a1,48(s1)
+    80202e90:	00007517          	auipc	a0,0x7
+    80202e94:	a9050513          	addi	a0,a0,-1392 # 80209920 <digits+0x5a0>
+    80202e98:	ffffd097          	auipc	ra,0xffffd
+    80202e9c:	2f6080e7          	jalr	758(ra) # 8020018e <printf>
+  printf("gp: %p\t", tf->gp);
+    80202ea0:	7c8c                	ld	a1,56(s1)
+    80202ea2:	00007517          	auipc	a0,0x7
+    80202ea6:	a8650513          	addi	a0,a0,-1402 # 80209928 <digits+0x5a8>
+    80202eaa:	ffffd097          	auipc	ra,0xffffd
+    80202eae:	2e4080e7          	jalr	740(ra) # 8020018e <printf>
+  printf("tp: %p\t", tf->tp);
+    80202eb2:	60ac                	ld	a1,64(s1)
+    80202eb4:	00007517          	auipc	a0,0x7
+    80202eb8:	a7c50513          	addi	a0,a0,-1412 # 80209930 <digits+0x5b0>
+    80202ebc:	ffffd097          	auipc	ra,0xffffd
+    80202ec0:	2d2080e7          	jalr	722(ra) # 8020018e <printf>
+  printf("epc: %p\n", tf->epc);
+    80202ec4:	6c8c                	ld	a1,24(s1)
+    80202ec6:	00007517          	auipc	a0,0x7
+    80202eca:	a7250513          	addi	a0,a0,-1422 # 80209938 <digits+0x5b8>
+    80202ece:	ffffd097          	auipc	ra,0xffffd
+    80202ed2:	2c0080e7          	jalr	704(ra) # 8020018e <printf>
+}
+    80202ed6:	60e2                	ld	ra,24(sp)
+    80202ed8:	6442                	ld	s0,16(sp)
+    80202eda:	64a2                	ld	s1,8(sp)
+    80202edc:	6105                	addi	sp,sp,32
+    80202ede:	8082                	ret
+
+0000000080202ee0 <argraw>:
+  return strlen(buf);
+}
+
+static uint64
+argraw(int n)
+{
+    80202ee0:	1101                	addi	sp,sp,-32
+    80202ee2:	ec06                	sd	ra,24(sp)
+    80202ee4:	e822                	sd	s0,16(sp)
+    80202ee6:	e426                	sd	s1,8(sp)
+    80202ee8:	1000                	addi	s0,sp,32
+    80202eea:	84aa                	mv	s1,a0
+  struct proc *p = myproc();
+    80202eec:	fffff097          	auipc	ra,0xfffff
+    80202ef0:	b50080e7          	jalr	-1200(ra) # 80201a3c <myproc>
+  switch (n) {
+    80202ef4:	4795                	li	a5,5
+    80202ef6:	0497e163          	bltu	a5,s1,80202f38 <argraw+0x58>
+    80202efa:	048a                	slli	s1,s1,0x2
+    80202efc:	00007717          	auipc	a4,0x7
+    80202f00:	bf470713          	addi	a4,a4,-1036 # 80209af0 <digits+0x770>
+    80202f04:	94ba                	add	s1,s1,a4
+    80202f06:	409c                	lw	a5,0(s1)
+    80202f08:	97ba                	add	a5,a5,a4
+    80202f0a:	8782                	jr	a5
+  case 0:
+    return p->trapframe->a0;
+    80202f0c:	713c                	ld	a5,96(a0)
+    80202f0e:	7ba8                	ld	a0,112(a5)
+  case 5:
+    return p->trapframe->a5;
+  }
+  panic("argraw");
+  return -1;
+}
+    80202f10:	60e2                	ld	ra,24(sp)
+    80202f12:	6442                	ld	s0,16(sp)
+    80202f14:	64a2                	ld	s1,8(sp)
+    80202f16:	6105                	addi	sp,sp,32
+    80202f18:	8082                	ret
+    return p->trapframe->a1;
+    80202f1a:	713c                	ld	a5,96(a0)
+    80202f1c:	7fa8                	ld	a0,120(a5)
+    80202f1e:	bfcd                	j	80202f10 <argraw+0x30>
+    return p->trapframe->a2;
+    80202f20:	713c                	ld	a5,96(a0)
+    80202f22:	63c8                	ld	a0,128(a5)
+    80202f24:	b7f5                	j	80202f10 <argraw+0x30>
+    return p->trapframe->a3;
+    80202f26:	713c                	ld	a5,96(a0)
+    80202f28:	67c8                	ld	a0,136(a5)
+    80202f2a:	b7dd                	j	80202f10 <argraw+0x30>
+    return p->trapframe->a4;
+    80202f2c:	713c                	ld	a5,96(a0)
+    80202f2e:	6bc8                	ld	a0,144(a5)
+    80202f30:	b7c5                	j	80202f10 <argraw+0x30>
+    return p->trapframe->a5;
+    80202f32:	713c                	ld	a5,96(a0)
+    80202f34:	6fc8                	ld	a0,152(a5)
+    80202f36:	bfe9                	j	80202f10 <argraw+0x30>
+  panic("argraw");
+    80202f38:	00007517          	auipc	a0,0x7
+    80202f3c:	a1050513          	addi	a0,a0,-1520 # 80209948 <digits+0x5c8>
+    80202f40:	ffffd097          	auipc	ra,0xffffd
+    80202f44:	204080e7          	jalr	516(ra) # 80200144 <panic>
+
+0000000080202f48 <sys_uname>:
+  return 0;
+}
+
+uint64
+sys_uname(void)
+{
+    80202f48:	7125                	addi	sp,sp,-416
+    80202f4a:	ef06                	sd	ra,408(sp)
+    80202f4c:	eb22                	sd	s0,400(sp)
+    80202f4e:	1300                	addi	s0,sp,416
+  *ip = argraw(n);
+    80202f50:	4501                	li	a0,0
+    80202f52:	00000097          	auipc	ra,0x0
+    80202f56:	f8e080e7          	jalr	-114(ra) # 80202ee0 <argraw>
+    char version[65];
+    char machine[65];
+    char domainname[65];
+  };
+
+  struct utsname uname = {"xv6", "xv6", "0", "0", "xv6", "localhost"};
+    80202f5a:	00007797          	auipc	a5,0x7
+    80202f5e:	bae78793          	addi	a5,a5,-1106 # 80209b08 <digits+0x788>
+    80202f62:	e6840713          	addi	a4,s0,-408
+    80202f66:	00007697          	auipc	a3,0x7
+    80202f6a:	d2268693          	addi	a3,a3,-734 # 80209c88 <digits+0x908>
+    80202f6e:	0007b883          	ld	a7,0(a5)
+    80202f72:	0087b803          	ld	a6,8(a5)
+    80202f76:	6b8c                	ld	a1,16(a5)
+    80202f78:	6f90                	ld	a2,24(a5)
+    80202f7a:	01173023          	sd	a7,0(a4)
+    80202f7e:	01073423          	sd	a6,8(a4)
+    80202f82:	eb0c                	sd	a1,16(a4)
+    80202f84:	ef10                	sd	a2,24(a4)
+    80202f86:	02078793          	addi	a5,a5,32
+    80202f8a:	02070713          	addi	a4,a4,32
+    80202f8e:	fed790e3          	bne	a5,a3,80202f6e <sys_uname+0x26>
+    80202f92:	4394                	lw	a3,0(a5)
+    80202f94:	c314                	sw	a3,0(a4)
+    80202f96:	0047d783          	lhu	a5,4(a5)
+    80202f9a:	00f71223          	sh	a5,4(a4)
+
+  if(copyout2(addr, (char *) & uname, sizeof(uname)) < 0)
+    80202f9e:	18600613          	li	a2,390
+    80202fa2:	e6840593          	addi	a1,s0,-408
+    80202fa6:	ffffe097          	auipc	ra,0xffffe
+    80202faa:	3cc080e7          	jalr	972(ra) # 80201372 <copyout2>
+    return -1;
+
+  return 0;
+    80202fae:	957d                	srai	a0,a0,0x3f
+    80202fb0:	60fa                	ld	ra,408(sp)
+    80202fb2:	645a                	ld	s0,400(sp)
+    80202fb4:	611d                	addi	sp,sp,416
+    80202fb6:	8082                	ret
+
+0000000080202fb8 <sys_sysinfo>:
+{
+    80202fb8:	7179                	addi	sp,sp,-48
+    80202fba:	f406                	sd	ra,40(sp)
+    80202fbc:	f022                	sd	s0,32(sp)
+    80202fbe:	ec26                	sd	s1,24(sp)
+    80202fc0:	1800                	addi	s0,sp,48
+  *ip = argraw(n);
+    80202fc2:	4501                	li	a0,0
+    80202fc4:	00000097          	auipc	ra,0x0
+    80202fc8:	f1c080e7          	jalr	-228(ra) # 80202ee0 <argraw>
+    80202fcc:	84aa                	mv	s1,a0
+  info.freemem = freemem_amount();
+    80202fce:	ffffd097          	auipc	ra,0xffffd
+    80202fd2:	5f2080e7          	jalr	1522(ra) # 802005c0 <freemem_amount>
+    80202fd6:	fca43823          	sd	a0,-48(s0)
+  info.nproc = procnum();
+    80202fda:	00000097          	auipc	ra,0x0
+    80202fde:	8aa080e7          	jalr	-1878(ra) # 80202884 <procnum>
+    80202fe2:	fca43c23          	sd	a0,-40(s0)
+  if (copyout2(addr, (char *)&info, sizeof(info)) < 0) {
+    80202fe6:	4641                	li	a2,16
+    80202fe8:	fd040593          	addi	a1,s0,-48
+    80202fec:	8526                	mv	a0,s1
+    80202fee:	ffffe097          	auipc	ra,0xffffe
+    80202ff2:	384080e7          	jalr	900(ra) # 80201372 <copyout2>
+}
+    80202ff6:	957d                	srai	a0,a0,0x3f
+    80202ff8:	70a2                	ld	ra,40(sp)
+    80202ffa:	7402                	ld	s0,32(sp)
+    80202ffc:	64e2                	ld	s1,24(sp)
+    80202ffe:	6145                	addi	sp,sp,48
+    80203000:	8082                	ret
+
+0000000080203002 <fetchaddr>:
+{
+    80203002:	1101                	addi	sp,sp,-32
+    80203004:	ec06                	sd	ra,24(sp)
+    80203006:	e822                	sd	s0,16(sp)
+    80203008:	e426                	sd	s1,8(sp)
+    8020300a:	e04a                	sd	s2,0(sp)
+    8020300c:	1000                	addi	s0,sp,32
+    8020300e:	84aa                	mv	s1,a0
+    80203010:	892e                	mv	s2,a1
+  struct proc *p = myproc();
+    80203012:	fffff097          	auipc	ra,0xfffff
+    80203016:	a2a080e7          	jalr	-1494(ra) # 80201a3c <myproc>
+  if(addr >= p->sz || addr+sizeof(uint64) > p->sz)
+    8020301a:	653c                	ld	a5,72(a0)
+    8020301c:	02f4f763          	bgeu	s1,a5,8020304a <fetchaddr+0x48>
+    80203020:	00848713          	addi	a4,s1,8
+    80203024:	02e7e563          	bltu	a5,a4,8020304e <fetchaddr+0x4c>
+  if(copyin2((char *)ip, addr, sizeof(*ip)) != 0)
+    80203028:	4621                	li	a2,8
+    8020302a:	85a6                	mv	a1,s1
+    8020302c:	854a                	mv	a0,s2
+    8020302e:	ffffe097          	auipc	ra,0xffffe
+    80203032:	424080e7          	jalr	1060(ra) # 80201452 <copyin2>
+    80203036:	00a03533          	snez	a0,a0
+    8020303a:	40a00533          	neg	a0,a0
+}
+    8020303e:	60e2                	ld	ra,24(sp)
+    80203040:	6442                	ld	s0,16(sp)
+    80203042:	64a2                	ld	s1,8(sp)
+    80203044:	6902                	ld	s2,0(sp)
+    80203046:	6105                	addi	sp,sp,32
+    80203048:	8082                	ret
+    return -1;
+    8020304a:	557d                	li	a0,-1
+    8020304c:	bfcd                	j	8020303e <fetchaddr+0x3c>
+    8020304e:	557d                	li	a0,-1
+    80203050:	b7fd                	j	8020303e <fetchaddr+0x3c>
+
+0000000080203052 <fetchstr>:
+{
+    80203052:	1101                	addi	sp,sp,-32
+    80203054:	ec06                	sd	ra,24(sp)
+    80203056:	e822                	sd	s0,16(sp)
+    80203058:	e426                	sd	s1,8(sp)
+    8020305a:	1000                	addi	s0,sp,32
+    8020305c:	84ae                	mv	s1,a1
+  int err = copyinstr2(buf, addr, max);
+    8020305e:	85aa                	mv	a1,a0
+    80203060:	8526                	mv	a0,s1
+    80203062:	ffffe097          	auipc	ra,0xffffe
+    80203066:	4f2080e7          	jalr	1266(ra) # 80201554 <copyinstr2>
+  if(err < 0)
+    8020306a:	00054763          	bltz	a0,80203078 <fetchstr+0x26>
+  return strlen(buf);
+    8020306e:	8526                	mv	a0,s1
+    80203070:	ffffe097          	auipc	ra,0xffffe
+    80203074:	876080e7          	jalr	-1930(ra) # 802008e6 <strlen>
+}
+    80203078:	60e2                	ld	ra,24(sp)
+    8020307a:	6442                	ld	s0,16(sp)
+    8020307c:	64a2                	ld	s1,8(sp)
+    8020307e:	6105                	addi	sp,sp,32
+    80203080:	8082                	ret
+
+0000000080203082 <argint>:
+{
+    80203082:	1101                	addi	sp,sp,-32
+    80203084:	ec06                	sd	ra,24(sp)
+    80203086:	e822                	sd	s0,16(sp)
+    80203088:	e426                	sd	s1,8(sp)
+    8020308a:	1000                	addi	s0,sp,32
+    8020308c:	84ae                	mv	s1,a1
+  *ip = argraw(n);
+    8020308e:	00000097          	auipc	ra,0x0
+    80203092:	e52080e7          	jalr	-430(ra) # 80202ee0 <argraw>
+    80203096:	c088                	sw	a0,0(s1)
+}
+    80203098:	4501                	li	a0,0
+    8020309a:	60e2                	ld	ra,24(sp)
+    8020309c:	6442                	ld	s0,16(sp)
+    8020309e:	64a2                	ld	s1,8(sp)
+    802030a0:	6105                	addi	sp,sp,32
+    802030a2:	8082                	ret
+
+00000000802030a4 <sys_test_proc>:
+sys_test_proc(void) {
+    802030a4:	1101                	addi	sp,sp,-32
+    802030a6:	ec06                	sd	ra,24(sp)
+    802030a8:	e822                	sd	s0,16(sp)
+    802030aa:	1000                	addi	s0,sp,32
+    argint(0, &n);
+    802030ac:	fec40593          	addi	a1,s0,-20
+    802030b0:	4501                	li	a0,0
+    802030b2:	00000097          	auipc	ra,0x0
+    802030b6:	fd0080e7          	jalr	-48(ra) # 80203082 <argint>
+    printf("hello world from proc %d, hart %d, arg %d\n", myproc()->pid, r_tp(), n);
+    802030ba:	fffff097          	auipc	ra,0xfffff
+    802030be:	982080e7          	jalr	-1662(ra) # 80201a3c <myproc>
+    802030c2:	8612                	mv	a2,tp
+    802030c4:	fec42683          	lw	a3,-20(s0)
+    802030c8:	5d0c                	lw	a1,56(a0)
+    802030ca:	00007517          	auipc	a0,0x7
+    802030ce:	88650513          	addi	a0,a0,-1914 # 80209950 <digits+0x5d0>
+    802030d2:	ffffd097          	auipc	ra,0xffffd
+    802030d6:	0bc080e7          	jalr	188(ra) # 8020018e <printf>
+}
+    802030da:	4501                	li	a0,0
+    802030dc:	60e2                	ld	ra,24(sp)
+    802030de:	6442                	ld	s0,16(sp)
+    802030e0:	6105                	addi	sp,sp,32
+    802030e2:	8082                	ret
+
+00000000802030e4 <argaddr>:
+{
+    802030e4:	1101                	addi	sp,sp,-32
+    802030e6:	ec06                	sd	ra,24(sp)
+    802030e8:	e822                	sd	s0,16(sp)
+    802030ea:	e426                	sd	s1,8(sp)
+    802030ec:	1000                	addi	s0,sp,32
+    802030ee:	84ae                	mv	s1,a1
+  *ip = argraw(n);
+    802030f0:	00000097          	auipc	ra,0x0
+    802030f4:	df0080e7          	jalr	-528(ra) # 80202ee0 <argraw>
+    802030f8:	e088                	sd	a0,0(s1)
+}
+    802030fa:	4501                	li	a0,0
+    802030fc:	60e2                	ld	ra,24(sp)
+    802030fe:	6442                	ld	s0,16(sp)
+    80203100:	64a2                	ld	s1,8(sp)
+    80203102:	6105                	addi	sp,sp,32
+    80203104:	8082                	ret
+
+0000000080203106 <argstr>:
+{
+    80203106:	1101                	addi	sp,sp,-32
+    80203108:	ec06                	sd	ra,24(sp)
+    8020310a:	e822                	sd	s0,16(sp)
+    8020310c:	e426                	sd	s1,8(sp)
+    8020310e:	e04a                	sd	s2,0(sp)
+    80203110:	1000                	addi	s0,sp,32
+    80203112:	84ae                	mv	s1,a1
+    80203114:	8932                	mv	s2,a2
+  *ip = argraw(n);
+    80203116:	00000097          	auipc	ra,0x0
+    8020311a:	dca080e7          	jalr	-566(ra) # 80202ee0 <argraw>
+  return fetchstr(addr, buf, max);
+    8020311e:	864a                	mv	a2,s2
+    80203120:	85a6                	mv	a1,s1
+    80203122:	00000097          	auipc	ra,0x0
+    80203126:	f30080e7          	jalr	-208(ra) # 80203052 <fetchstr>
+}
+    8020312a:	60e2                	ld	ra,24(sp)
+    8020312c:	6442                	ld	s0,16(sp)
+    8020312e:	64a2                	ld	s1,8(sp)
+    80203130:	6902                	ld	s2,0(sp)
+    80203132:	6105                	addi	sp,sp,32
+    80203134:	8082                	ret
+
+0000000080203136 <syscall>:
+{
+    80203136:	7179                	addi	sp,sp,-48
+    80203138:	f406                	sd	ra,40(sp)
+    8020313a:	f022                	sd	s0,32(sp)
+    8020313c:	ec26                	sd	s1,24(sp)
+    8020313e:	e84a                	sd	s2,16(sp)
+    80203140:	e44e                	sd	s3,8(sp)
+    80203142:	1800                	addi	s0,sp,48
+  struct proc *p = myproc();
+    80203144:	fffff097          	auipc	ra,0xfffff
+    80203148:	8f8080e7          	jalr	-1800(ra) # 80201a3c <myproc>
+    8020314c:	84aa                	mv	s1,a0
+  num = p->trapframe->a7;
+    8020314e:	06053903          	ld	s2,96(a0)
+    80203152:	0a893783          	ld	a5,168(s2)
+    80203156:	0007899b          	sext.w	s3,a5
+  if(num > 0 && num < NELEM(syscalls) && syscalls[num]) {
+    8020315a:	37fd                	addiw	a5,a5,-1
+    8020315c:	10300713          	li	a4,259
+    80203160:	04f76763          	bltu	a4,a5,802031ae <syscall+0x78>
+    80203164:	00399713          	slli	a4,s3,0x3
+    80203168:	00008797          	auipc	a5,0x8
+    8020316c:	b0878793          	addi	a5,a5,-1272 # 8020ac70 <syscalls>
+    80203170:	97ba                	add	a5,a5,a4
+    80203172:	639c                	ld	a5,0(a5)
+    80203174:	cf8d                	beqz	a5,802031ae <syscall+0x78>
+    p->trapframe->a0 = syscalls[num]();
+    80203176:	9782                	jalr	a5
+    80203178:	06a93823          	sd	a0,112(s2)
+    if ((p->tmask & (1 << num)) != 0) {
+    8020317c:	1704a783          	lw	a5,368(s1)
+    80203180:	4137d7bb          	sraw	a5,a5,s3
+    80203184:	8b85                	andi	a5,a5,1
+    80203186:	c3b9                	beqz	a5,802031cc <syscall+0x96>
+      printf("pid %d: %s -> %d\n", p->pid, sysnames[num], p->trapframe->a0);
+    80203188:	70b8                	ld	a4,96(s1)
+    8020318a:	098e                	slli	s3,s3,0x3
+    8020318c:	00008797          	auipc	a5,0x8
+    80203190:	30c78793          	addi	a5,a5,780 # 8020b498 <sysnames>
+    80203194:	97ce                	add	a5,a5,s3
+    80203196:	7b34                	ld	a3,112(a4)
+    80203198:	6390                	ld	a2,0(a5)
+    8020319a:	5c8c                	lw	a1,56(s1)
+    8020319c:	00006517          	auipc	a0,0x6
+    802031a0:	7e450513          	addi	a0,a0,2020 # 80209980 <digits+0x600>
+    802031a4:	ffffd097          	auipc	ra,0xffffd
+    802031a8:	fea080e7          	jalr	-22(ra) # 8020018e <printf>
+    802031ac:	a005                	j	802031cc <syscall+0x96>
+    printf("pid %d %s: unknown sys call %d\n",
+    802031ae:	86ce                	mv	a3,s3
+    802031b0:	16048613          	addi	a2,s1,352
+    802031b4:	5c8c                	lw	a1,56(s1)
+    802031b6:	00006517          	auipc	a0,0x6
+    802031ba:	7e250513          	addi	a0,a0,2018 # 80209998 <digits+0x618>
+    802031be:	ffffd097          	auipc	ra,0xffffd
+    802031c2:	fd0080e7          	jalr	-48(ra) # 8020018e <printf>
+    p->trapframe->a0 = -1;
+    802031c6:	70bc                	ld	a5,96(s1)
+    802031c8:	577d                	li	a4,-1
+    802031ca:	fbb8                	sd	a4,112(a5)
+}
+    802031cc:	70a2                	ld	ra,40(sp)
+    802031ce:	7402                	ld	s0,32(sp)
+    802031d0:	64e2                	ld	s1,24(sp)
+    802031d2:	6942                	ld	s2,16(sp)
+    802031d4:	69a2                	ld	s3,8(sp)
+    802031d6:	6145                	addi	sp,sp,48
+    802031d8:	8082                	ret
+
+00000000802031da <sys_exec>:
+
+extern int exec(char *path, char **argv);
+
+uint64
+sys_exec(void)
+{
+    802031da:	d9010113          	addi	sp,sp,-624
+    802031de:	26113423          	sd	ra,616(sp)
+    802031e2:	26813023          	sd	s0,608(sp)
+    802031e6:	24913c23          	sd	s1,600(sp)
+    802031ea:	25213823          	sd	s2,592(sp)
+    802031ee:	25313423          	sd	s3,584(sp)
+    802031f2:	25413023          	sd	s4,576(sp)
+    802031f6:	23513c23          	sd	s5,568(sp)
+    802031fa:	23613823          	sd	s6,560(sp)
+    802031fe:	23713423          	sd	s7,552(sp)
+    80203202:	1c80                	addi	s0,sp,624
+  char path[FAT32_MAX_PATH], *argv[MAXARG];
+  int i;
+  uint64 uargv, uarg;
+
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || argaddr(1, &uargv) < 0){
+    80203204:	10400613          	li	a2,260
+    80203208:	ea840593          	addi	a1,s0,-344
+    8020320c:	4501                	li	a0,0
+    8020320e:	00000097          	auipc	ra,0x0
+    80203212:	ef8080e7          	jalr	-264(ra) # 80203106 <argstr>
+    return -1;
+    80203216:	597d                	li	s2,-1
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || argaddr(1, &uargv) < 0){
+    80203218:	0c054c63          	bltz	a0,802032f0 <sys_exec+0x116>
+    8020321c:	da040593          	addi	a1,s0,-608
+    80203220:	4505                	li	a0,1
+    80203222:	00000097          	auipc	ra,0x0
+    80203226:	ec2080e7          	jalr	-318(ra) # 802030e4 <argaddr>
+    8020322a:	0c054363          	bltz	a0,802032f0 <sys_exec+0x116>
+  }
+  memset(argv, 0, sizeof(argv));
+    8020322e:	da840a13          	addi	s4,s0,-600
+    80203232:	10000613          	li	a2,256
+    80203236:	4581                	li	a1,0
+    80203238:	8552                	mv	a0,s4
+    8020323a:	ffffd097          	auipc	ra,0xffffd
+    8020323e:	528080e7          	jalr	1320(ra) # 80200762 <memset>
+  for(i=0;; i++){
+    if(i >= NELEM(argv)){
+    80203242:	84d2                	mv	s1,s4
+  memset(argv, 0, sizeof(argv));
+    80203244:	89d2                	mv	s3,s4
+    80203246:	4901                	li	s2,0
+      goto bad;
+    }
+    if(fetchaddr(uargv+sizeof(uint64)*i, (uint64*)&uarg) < 0){
+    80203248:	d9840a93          	addi	s5,s0,-616
+    if(i >= NELEM(argv)){
+    8020324c:	02000b13          	li	s6,32
+    80203250:	00090b9b          	sext.w	s7,s2
+    if(fetchaddr(uargv+sizeof(uint64)*i, (uint64*)&uarg) < 0){
+    80203254:	00391513          	slli	a0,s2,0x3
+    80203258:	85d6                	mv	a1,s5
+    8020325a:	da043783          	ld	a5,-608(s0)
+    8020325e:	953e                	add	a0,a0,a5
+    80203260:	00000097          	auipc	ra,0x0
+    80203264:	da2080e7          	jalr	-606(ra) # 80203002 <fetchaddr>
+    80203268:	02054a63          	bltz	a0,8020329c <sys_exec+0xc2>
+      goto bad;
+    }
+    if(uarg == 0){
+    8020326c:	d9843783          	ld	a5,-616(s0)
+    80203270:	c3b9                	beqz	a5,802032b6 <sys_exec+0xdc>
+      argv[i] = 0;
+      break;
+    }
+    argv[i] = kalloc();
+    80203272:	ffffd097          	auipc	ra,0xffffd
+    80203276:	2e8080e7          	jalr	744(ra) # 8020055a <kalloc>
+    8020327a:	85aa                	mv	a1,a0
+    8020327c:	00a9b023          	sd	a0,0(s3)
+    if(argv[i] == 0)
+    80203280:	cd11                	beqz	a0,8020329c <sys_exec+0xc2>
+      goto bad;
+    if(fetchstr(uarg, argv[i], PGSIZE) < 0)
+    80203282:	6605                	lui	a2,0x1
+    80203284:	d9843503          	ld	a0,-616(s0)
+    80203288:	00000097          	auipc	ra,0x0
+    8020328c:	dca080e7          	jalr	-566(ra) # 80203052 <fetchstr>
+    80203290:	00054663          	bltz	a0,8020329c <sys_exec+0xc2>
+    if(i >= NELEM(argv)){
+    80203294:	0905                	addi	s2,s2,1
+    80203296:	09a1                	addi	s3,s3,8
+    80203298:	fb691ce3          	bne	s2,s6,80203250 <sys_exec+0x76>
+    kfree(argv[i]);
+
+  return ret;
+
+ bad:
+  for(i = 0; i < NELEM(argv) && argv[i] != 0; i++)
+    8020329c:	100a0a13          	addi	s4,s4,256
+    802032a0:	6088                	ld	a0,0(s1)
+    802032a2:	c531                	beqz	a0,802032ee <sys_exec+0x114>
+    kfree(argv[i]);
+    802032a4:	ffffd097          	auipc	ra,0xffffd
+    802032a8:	19c080e7          	jalr	412(ra) # 80200440 <kfree>
+  for(i = 0; i < NELEM(argv) && argv[i] != 0; i++)
+    802032ac:	04a1                	addi	s1,s1,8
+    802032ae:	ff4499e3          	bne	s1,s4,802032a0 <sys_exec+0xc6>
+  return -1;
+    802032b2:	597d                	li	s2,-1
+    802032b4:	a835                	j	802032f0 <sys_exec+0x116>
+      argv[i] = 0;
+    802032b6:	0b8e                	slli	s7,s7,0x3
+    802032b8:	fb0b8793          	addi	a5,s7,-80
+    802032bc:	00878bb3          	add	s7,a5,s0
+    802032c0:	de0bbc23          	sd	zero,-520(s7)
+  int ret = exec(path, argv);
+    802032c4:	da840593          	addi	a1,s0,-600
+    802032c8:	ea840513          	addi	a0,s0,-344
+    802032cc:	00001097          	auipc	ra,0x1
+    802032d0:	0ac080e7          	jalr	172(ra) # 80204378 <exec>
+    802032d4:	892a                	mv	s2,a0
+  for(i = 0; i < NELEM(argv) && argv[i] != 0; i++)
+    802032d6:	100a0a13          	addi	s4,s4,256
+    802032da:	6088                	ld	a0,0(s1)
+    802032dc:	c911                	beqz	a0,802032f0 <sys_exec+0x116>
+    kfree(argv[i]);
+    802032de:	ffffd097          	auipc	ra,0xffffd
+    802032e2:	162080e7          	jalr	354(ra) # 80200440 <kfree>
+  for(i = 0; i < NELEM(argv) && argv[i] != 0; i++)
+    802032e6:	04a1                	addi	s1,s1,8
+    802032e8:	ff4499e3          	bne	s1,s4,802032da <sys_exec+0x100>
+    802032ec:	a011                	j	802032f0 <sys_exec+0x116>
+  return -1;
+    802032ee:	597d                	li	s2,-1
+}
+    802032f0:	854a                	mv	a0,s2
+    802032f2:	26813083          	ld	ra,616(sp)
+    802032f6:	26013403          	ld	s0,608(sp)
+    802032fa:	25813483          	ld	s1,600(sp)
+    802032fe:	25013903          	ld	s2,592(sp)
+    80203302:	24813983          	ld	s3,584(sp)
+    80203306:	24013a03          	ld	s4,576(sp)
+    8020330a:	23813a83          	ld	s5,568(sp)
+    8020330e:	23013b03          	ld	s6,560(sp)
+    80203312:	22813b83          	ld	s7,552(sp)
+    80203316:	27010113          	addi	sp,sp,624
+    8020331a:	8082                	ret
+
+000000008020331c <sys_exit>:
+
+uint64
+sys_exit(void)
+{
+    8020331c:	1101                	addi	sp,sp,-32
+    8020331e:	ec06                	sd	ra,24(sp)
+    80203320:	e822                	sd	s0,16(sp)
+    80203322:	1000                	addi	s0,sp,32
+  int n;
+  if(argint(0, &n) < 0)
+    80203324:	fec40593          	addi	a1,s0,-20
+    80203328:	4501                	li	a0,0
+    8020332a:	00000097          	auipc	ra,0x0
+    8020332e:	d58080e7          	jalr	-680(ra) # 80203082 <argint>
+    return -1;
+    80203332:	57fd                	li	a5,-1
+  if(argint(0, &n) < 0)
+    80203334:	00054963          	bltz	a0,80203346 <sys_exit+0x2a>
+  exit(n);
+    80203338:	fec42503          	lw	a0,-20(s0)
+    8020333c:	fffff097          	auipc	ra,0xfffff
+    80203340:	f7c080e7          	jalr	-132(ra) # 802022b8 <exit>
+  return 0;  // not reached
+    80203344:	4781                	li	a5,0
+}
+    80203346:	853e                	mv	a0,a5
+    80203348:	60e2                	ld	ra,24(sp)
+    8020334a:	6442                	ld	s0,16(sp)
+    8020334c:	6105                	addi	sp,sp,32
+    8020334e:	8082                	ret
+
+0000000080203350 <sys_getpid>:
+
+
+
+uint64
+sys_getpid(void)
+{
+    80203350:	1141                	addi	sp,sp,-16
+    80203352:	e406                	sd	ra,8(sp)
+    80203354:	e022                	sd	s0,0(sp)
+    80203356:	0800                	addi	s0,sp,16
+  return myproc()->pid;
+    80203358:	ffffe097          	auipc	ra,0xffffe
+    8020335c:	6e4080e7          	jalr	1764(ra) # 80201a3c <myproc>
+}
+    80203360:	5d08                	lw	a0,56(a0)
+    80203362:	60a2                	ld	ra,8(sp)
+    80203364:	6402                	ld	s0,0(sp)
+    80203366:	0141                	addi	sp,sp,16
+    80203368:	8082                	ret
+
+000000008020336a <sys_getppid>:
+
+uint64
+sys_getppid(void)
+{
+    8020336a:	1141                	addi	sp,sp,-16
+    8020336c:	e406                	sd	ra,8(sp)
+    8020336e:	e022                	sd	s0,0(sp)
+    80203370:	0800                	addi	s0,sp,16
+  return myproc()->parent->pid;
+    80203372:	ffffe097          	auipc	ra,0xffffe
+    80203376:	6ca080e7          	jalr	1738(ra) # 80201a3c <myproc>
+    8020337a:	711c                	ld	a5,32(a0)
+}
+    8020337c:	5f88                	lw	a0,56(a5)
+    8020337e:	60a2                	ld	ra,8(sp)
+    80203380:	6402                	ld	s0,0(sp)
+    80203382:	0141                	addi	sp,sp,16
+    80203384:	8082                	ret
+
+0000000080203386 <sys_fork>:
+
+
+uint64
+sys_fork(void)
+{
+    80203386:	1141                	addi	sp,sp,-16
+    80203388:	e406                	sd	ra,8(sp)
+    8020338a:	e022                	sd	s0,0(sp)
+    8020338c:	0800                	addi	s0,sp,16
+  return fork();
+    8020338e:	fffff097          	auipc	ra,0xfffff
+    80203392:	ab4080e7          	jalr	-1356(ra) # 80201e42 <fork>
+}
+    80203396:	60a2                	ld	ra,8(sp)
+    80203398:	6402                	ld	s0,0(sp)
+    8020339a:	0141                	addi	sp,sp,16
+    8020339c:	8082                	ret
+
+000000008020339e <sys_clone>:
+
+uint64
+sys_clone(void)
+{
+    8020339e:	1101                	addi	sp,sp,-32
+    802033a0:	ec06                	sd	ra,24(sp)
+    802033a2:	e822                	sd	s0,16(sp)
+    802033a4:	1000                	addi	s0,sp,32
+  int stack;
+  if(argint(1, &stack) < 0)
+    802033a6:	fec40593          	addi	a1,s0,-20
+    802033aa:	4505                	li	a0,1
+    802033ac:	00000097          	auipc	ra,0x0
+    802033b0:	cd6080e7          	jalr	-810(ra) # 80203082 <argint>
+    802033b4:	87aa                	mv	a5,a0
+    return -1;
+    802033b6:	557d                	li	a0,-1
+  if(argint(1, &stack) < 0)
+    802033b8:	0007c863          	bltz	a5,802033c8 <sys_clone+0x2a>
+  return clone(stack);
+    802033bc:	fec42503          	lw	a0,-20(s0)
+    802033c0:	fffff097          	auipc	ra,0xfffff
+    802033c4:	b9a080e7          	jalr	-1126(ra) # 80201f5a <clone>
+}
+    802033c8:	60e2                	ld	ra,24(sp)
+    802033ca:	6442                	ld	s0,16(sp)
+    802033cc:	6105                	addi	sp,sp,32
+    802033ce:	8082                	ret
+
+00000000802033d0 <sys_wait>:
+
+uint64
+sys_wait(void)
+{
+    802033d0:	1101                	addi	sp,sp,-32
+    802033d2:	ec06                	sd	ra,24(sp)
+    802033d4:	e822                	sd	s0,16(sp)
+    802033d6:	1000                	addi	s0,sp,32
+  uint64 p;
+  if(argaddr(0, &p) < 0)
+    802033d8:	fe840593          	addi	a1,s0,-24
+    802033dc:	4501                	li	a0,0
+    802033de:	00000097          	auipc	ra,0x0
+    802033e2:	d06080e7          	jalr	-762(ra) # 802030e4 <argaddr>
+    802033e6:	87aa                	mv	a5,a0
+    return -1;
+    802033e8:	557d                	li	a0,-1
+  if(argaddr(0, &p) < 0)
+    802033ea:	0007c863          	bltz	a5,802033fa <sys_wait+0x2a>
+  return wait(p);
+    802033ee:	fe843503          	ld	a0,-24(s0)
+    802033f2:	fffff097          	auipc	ra,0xfffff
+    802033f6:	080080e7          	jalr	128(ra) # 80202472 <wait>
+}
+    802033fa:	60e2                	ld	ra,24(sp)
+    802033fc:	6442                	ld	s0,16(sp)
+    802033fe:	6105                	addi	sp,sp,32
+    80203400:	8082                	ret
+
+0000000080203402 <sys_wait4>:
+
+uint64
+sys_wait4(void)
+{
+    80203402:	1101                	addi	sp,sp,-32
+    80203404:	ec06                	sd	ra,24(sp)
+    80203406:	e822                	sd	s0,16(sp)
+    80203408:	1000                	addi	s0,sp,32
+  uint64 status;
+  int pid, options;
+  if(argint(0, &pid) < 0 || argaddr(1, &status) < 0 || argint(2, &options) < 0) 
+    8020340a:	fe440593          	addi	a1,s0,-28
+    8020340e:	4501                	li	a0,0
+    80203410:	00000097          	auipc	ra,0x0
+    80203414:	c72080e7          	jalr	-910(ra) # 80203082 <argint>
+    return -1;
+    80203418:	57fd                	li	a5,-1
+  if(argint(0, &pid) < 0 || argaddr(1, &status) < 0 || argint(2, &options) < 0) 
+    8020341a:	04054163          	bltz	a0,8020345c <sys_wait4+0x5a>
+    8020341e:	fe840593          	addi	a1,s0,-24
+    80203422:	4505                	li	a0,1
+    80203424:	00000097          	auipc	ra,0x0
+    80203428:	cc0080e7          	jalr	-832(ra) # 802030e4 <argaddr>
+    return -1;
+    8020342c:	57fd                	li	a5,-1
+  if(argint(0, &pid) < 0 || argaddr(1, &status) < 0 || argint(2, &options) < 0) 
+    8020342e:	02054763          	bltz	a0,8020345c <sys_wait4+0x5a>
+    80203432:	fe040593          	addi	a1,s0,-32
+    80203436:	4509                	li	a0,2
+    80203438:	00000097          	auipc	ra,0x0
+    8020343c:	c4a080e7          	jalr	-950(ra) # 80203082 <argint>
+    return -1;
+    80203440:	57fd                	li	a5,-1
+  if(argint(0, &pid) < 0 || argaddr(1, &status) < 0 || argint(2, &options) < 0) 
+    80203442:	00054d63          	bltz	a0,8020345c <sys_wait4+0x5a>
+  
+  return wait4(pid, status, options);
+    80203446:	fe042603          	lw	a2,-32(s0)
+    8020344a:	fe843583          	ld	a1,-24(s0)
+    8020344e:	fe442503          	lw	a0,-28(s0)
+    80203452:	fffff097          	auipc	ra,0xfffff
+    80203456:	11e080e7          	jalr	286(ra) # 80202570 <wait4>
+    8020345a:	87aa                	mv	a5,a0
+}
+    8020345c:	853e                	mv	a0,a5
+    8020345e:	60e2                	ld	ra,24(sp)
+    80203460:	6442                	ld	s0,16(sp)
+    80203462:	6105                	addi	sp,sp,32
+    80203464:	8082                	ret
+
+0000000080203466 <sys_sbrk>:
+
+uint64
+sys_sbrk(void)
+{
+    80203466:	7179                	addi	sp,sp,-48
+    80203468:	f406                	sd	ra,40(sp)
+    8020346a:	f022                	sd	s0,32(sp)
+    8020346c:	ec26                	sd	s1,24(sp)
+    8020346e:	1800                	addi	s0,sp,48
+  int addr;
+  int n;
+
+  if(argint(0, &n) < 0)
+    80203470:	fdc40593          	addi	a1,s0,-36
+    80203474:	4501                	li	a0,0
+    80203476:	00000097          	auipc	ra,0x0
+    8020347a:	c0c080e7          	jalr	-1012(ra) # 80203082 <argint>
+    8020347e:	87aa                	mv	a5,a0
+    return -1;
+    80203480:	557d                	li	a0,-1
+  if(argint(0, &n) < 0)
+    80203482:	0207c063          	bltz	a5,802034a2 <sys_sbrk+0x3c>
+  addr = myproc()->sz;
+    80203486:	ffffe097          	auipc	ra,0xffffe
+    8020348a:	5b6080e7          	jalr	1462(ra) # 80201a3c <myproc>
+    8020348e:	4524                	lw	s1,72(a0)
+  if(growproc(n) < 0)
+    80203490:	fdc42503          	lw	a0,-36(s0)
+    80203494:	fffff097          	auipc	ra,0xfffff
+    80203498:	932080e7          	jalr	-1742(ra) # 80201dc6 <growproc>
+    8020349c:	00054863          	bltz	a0,802034ac <sys_sbrk+0x46>
+    return -1;
+  return addr;
+    802034a0:	8526                	mv	a0,s1
+}
+    802034a2:	70a2                	ld	ra,40(sp)
+    802034a4:	7402                	ld	s0,32(sp)
+    802034a6:	64e2                	ld	s1,24(sp)
+    802034a8:	6145                	addi	sp,sp,48
+    802034aa:	8082                	ret
+    return -1;
+    802034ac:	557d                	li	a0,-1
+    802034ae:	bfd5                	j	802034a2 <sys_sbrk+0x3c>
+
+00000000802034b0 <sys_sleep>:
+
+uint64
+sys_sleep(void)
+{
+    802034b0:	7139                	addi	sp,sp,-64
+    802034b2:	fc06                	sd	ra,56(sp)
+    802034b4:	f822                	sd	s0,48(sp)
+    802034b6:	f426                	sd	s1,40(sp)
+    802034b8:	f04a                	sd	s2,32(sp)
+    802034ba:	ec4e                	sd	s3,24(sp)
+    802034bc:	0080                	addi	s0,sp,64
+  int n;
+  uint ticks0;
+
+  if(argint(0, &n) < 0)
+    802034be:	fcc40593          	addi	a1,s0,-52
+    802034c2:	4501                	li	a0,0
+    802034c4:	00000097          	auipc	ra,0x0
+    802034c8:	bbe080e7          	jalr	-1090(ra) # 80203082 <argint>
+    return -1;
+    802034cc:	57fd                	li	a5,-1
+  if(argint(0, &n) < 0)
+    802034ce:	06054763          	bltz	a0,8020353c <sys_sleep+0x8c>
+  acquire(&tickslock);
+    802034d2:	00009517          	auipc	a0,0x9
+    802034d6:	83653503          	ld	a0,-1994(a0) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    802034da:	ffffd097          	auipc	ra,0xffffd
+    802034de:	1ec080e7          	jalr	492(ra) # 802006c6 <acquire>
+  ticks0 = ticks;
+    802034e2:	00009797          	auipc	a5,0x9
+    802034e6:	8367b783          	ld	a5,-1994(a5) # 8020bd18 <_GLOBAL_OFFSET_TABLE_+0x40>
+    802034ea:	0007a903          	lw	s2,0(a5)
+  while(ticks - ticks0 < n){
+    802034ee:	fcc42783          	lw	a5,-52(s0)
+    802034f2:	cf85                	beqz	a5,8020352a <sys_sleep+0x7a>
+    if(myproc()->killed){
+      release(&tickslock);
+      return -1;
+    }
+    sleep(&ticks, &tickslock);
+    802034f4:	00009997          	auipc	s3,0x9
+    802034f8:	8149b983          	ld	s3,-2028(s3) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    802034fc:	00009497          	auipc	s1,0x9
+    80203500:	81c4b483          	ld	s1,-2020(s1) # 8020bd18 <_GLOBAL_OFFSET_TABLE_+0x40>
+    if(myproc()->killed){
+    80203504:	ffffe097          	auipc	ra,0xffffe
+    80203508:	538080e7          	jalr	1336(ra) # 80201a3c <myproc>
+    8020350c:	591c                	lw	a5,48(a0)
+    8020350e:	ef9d                	bnez	a5,8020354c <sys_sleep+0x9c>
+    sleep(&ticks, &tickslock);
+    80203510:	85ce                	mv	a1,s3
+    80203512:	8526                	mv	a0,s1
+    80203514:	fffff097          	auipc	ra,0xfffff
+    80203518:	ee0080e7          	jalr	-288(ra) # 802023f4 <sleep>
+  while(ticks - ticks0 < n){
+    8020351c:	409c                	lw	a5,0(s1)
+    8020351e:	412787bb          	subw	a5,a5,s2
+    80203522:	fcc42703          	lw	a4,-52(s0)
+    80203526:	fce7efe3          	bltu	a5,a4,80203504 <sys_sleep+0x54>
+  }
+  release(&tickslock);
+    8020352a:	00008517          	auipc	a0,0x8
+    8020352e:	7de53503          	ld	a0,2014(a0) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    80203532:	ffffd097          	auipc	ra,0xffffd
+    80203536:	1e8080e7          	jalr	488(ra) # 8020071a <release>
+  return 0;
+    8020353a:	4781                	li	a5,0
+}
+    8020353c:	853e                	mv	a0,a5
+    8020353e:	70e2                	ld	ra,56(sp)
+    80203540:	7442                	ld	s0,48(sp)
+    80203542:	74a2                	ld	s1,40(sp)
+    80203544:	7902                	ld	s2,32(sp)
+    80203546:	69e2                	ld	s3,24(sp)
+    80203548:	6121                	addi	sp,sp,64
+    8020354a:	8082                	ret
+      release(&tickslock);
+    8020354c:	00008517          	auipc	a0,0x8
+    80203550:	7bc53503          	ld	a0,1980(a0) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    80203554:	ffffd097          	auipc	ra,0xffffd
+    80203558:	1c6080e7          	jalr	454(ra) # 8020071a <release>
+      return -1;
+    8020355c:	57fd                	li	a5,-1
+    8020355e:	bff9                	j	8020353c <sys_sleep+0x8c>
+
+0000000080203560 <sys_nanosleep>:
+
+
+uint64
+sys_nanosleep(void)
+{
+    80203560:	715d                	addi	sp,sp,-80
+    80203562:	e486                	sd	ra,72(sp)
+    80203564:	e0a2                	sd	s0,64(sp)
+    80203566:	fc26                	sd	s1,56(sp)
+    80203568:	f84a                	sd	s2,48(sp)
+    8020356a:	f44e                	sd	s3,40(sp)
+    8020356c:	f052                	sd	s4,32(sp)
+    8020356e:	0880                	addi	s0,sp,80
+  uint64 addr1, addr2;
+  uint64 time0, time;
+  uint64 tv_sec, tv_nsec;
+
+  if(argaddr(0, &addr1) < 0 || argaddr(1, &addr2) < 0)
+    80203570:	fc840593          	addi	a1,s0,-56
+    80203574:	4501                	li	a0,0
+    80203576:	00000097          	auipc	ra,0x0
+    8020357a:	b6e080e7          	jalr	-1170(ra) # 802030e4 <argaddr>
+    return -1;
+    8020357e:	57fd                	li	a5,-1
+  if(argaddr(0, &addr1) < 0 || argaddr(1, &addr2) < 0)
+    80203580:	0a054d63          	bltz	a0,8020363a <sys_nanosleep+0xda>
+    80203584:	fc040593          	addi	a1,s0,-64
+    80203588:	4505                	li	a0,1
+    8020358a:	00000097          	auipc	ra,0x0
+    8020358e:	b5a080e7          	jalr	-1190(ra) # 802030e4 <argaddr>
+    return -1;
+    80203592:	57fd                	li	a5,-1
+  if(argaddr(0, &addr1) < 0 || argaddr(1, &addr2) < 0)
+    80203594:	0a054363          	bltz	a0,8020363a <sys_nanosleep+0xda>
+  if(fetchaddr(addr1, &tv_sec) < 0 || fetchaddr(addr2, &tv_nsec) < 0)
+    80203598:	fb840593          	addi	a1,s0,-72
+    8020359c:	fc843503          	ld	a0,-56(s0)
+    802035a0:	00000097          	auipc	ra,0x0
+    802035a4:	a62080e7          	jalr	-1438(ra) # 80203002 <fetchaddr>
+    return -1;
+    802035a8:	57fd                	li	a5,-1
+  if(fetchaddr(addr1, &tv_sec) < 0 || fetchaddr(addr2, &tv_nsec) < 0)
+    802035aa:	08054863          	bltz	a0,8020363a <sys_nanosleep+0xda>
+    802035ae:	fb040593          	addi	a1,s0,-80
+    802035b2:	fc043503          	ld	a0,-64(s0)
+    802035b6:	00000097          	auipc	ra,0x0
+    802035ba:	a4c080e7          	jalr	-1460(ra) # 80203002 <fetchaddr>
+    return -1;
+    802035be:	57fd                	li	a5,-1
+  if(fetchaddr(addr1, &tv_sec) < 0 || fetchaddr(addr2, &tv_nsec) < 0)
+    802035c0:	06054d63          	bltz	a0,8020363a <sys_nanosleep+0xda>
+  asm volatile("rdtime %0" : "=r" (x) );
+    802035c4:	c0102973          	rdtime	s2
+  
+  time = r_time();
+  time0 = time;
+  acquire(&tickslock);
+    802035c8:	00008517          	auipc	a0,0x8
+    802035cc:	74053503          	ld	a0,1856(a0) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    802035d0:	ffffd097          	auipc	ra,0xffffd
+    802035d4:	0f6080e7          	jalr	246(ra) # 802006c6 <acquire>
+  while(time - time0 < tv_sec * 12500000) {
+    802035d8:	fb843783          	ld	a5,-72(s0)
+    802035dc:	00bec737          	lui	a4,0xbec
+    802035e0:	c2070713          	addi	a4,a4,-992 # bebc20 <_entry-0x7f6143e0>
+    802035e4:	02e787b3          	mul	a5,a5,a4
+    802035e8:	c3a1                	beqz	a5,80203628 <sys_nanosleep+0xc8>
+    if(myproc()->killed) {
+      release(&tickslock);
+      return -1;
+    }
+    sleep(&ticks, &tickslock);
+    802035ea:	00008a17          	auipc	s4,0x8
+    802035ee:	71ea3a03          	ld	s4,1822(s4) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    802035f2:	00008997          	auipc	s3,0x8
+    802035f6:	7269b983          	ld	s3,1830(s3) # 8020bd18 <_GLOBAL_OFFSET_TABLE_+0x40>
+  while(time - time0 < tv_sec * 12500000) {
+    802035fa:	84ba                	mv	s1,a4
+    if(myproc()->killed) {
+    802035fc:	ffffe097          	auipc	ra,0xffffe
+    80203600:	440080e7          	jalr	1088(ra) # 80201a3c <myproc>
+    80203604:	591c                	lw	a5,48(a0)
+    80203606:	e3b9                	bnez	a5,8020364c <sys_nanosleep+0xec>
+    sleep(&ticks, &tickslock);
+    80203608:	85d2                	mv	a1,s4
+    8020360a:	854e                	mv	a0,s3
+    8020360c:	fffff097          	auipc	ra,0xfffff
+    80203610:	de8080e7          	jalr	-536(ra) # 802023f4 <sleep>
+    80203614:	c0102773          	rdtime	a4
+  while(time - time0 < tv_sec * 12500000) {
+    80203618:	41270733          	sub	a4,a4,s2
+    8020361c:	fb843783          	ld	a5,-72(s0)
+    80203620:	029787b3          	mul	a5,a5,s1
+    80203624:	fcf76ce3          	bltu	a4,a5,802035fc <sys_nanosleep+0x9c>
+    time = r_time();
+  }
+  release(&tickslock);
+    80203628:	00008517          	auipc	a0,0x8
+    8020362c:	6e053503          	ld	a0,1760(a0) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    80203630:	ffffd097          	auipc	ra,0xffffd
+    80203634:	0ea080e7          	jalr	234(ra) # 8020071a <release>
+  return 0;
+    80203638:	4781                	li	a5,0
+}
+    8020363a:	853e                	mv	a0,a5
+    8020363c:	60a6                	ld	ra,72(sp)
+    8020363e:	6406                	ld	s0,64(sp)
+    80203640:	74e2                	ld	s1,56(sp)
+    80203642:	7942                	ld	s2,48(sp)
+    80203644:	79a2                	ld	s3,40(sp)
+    80203646:	7a02                	ld	s4,32(sp)
+    80203648:	6161                	addi	sp,sp,80
+    8020364a:	8082                	ret
+      release(&tickslock);
+    8020364c:	00008517          	auipc	a0,0x8
+    80203650:	6bc53503          	ld	a0,1724(a0) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    80203654:	ffffd097          	auipc	ra,0xffffd
+    80203658:	0c6080e7          	jalr	198(ra) # 8020071a <release>
+      return -1;
+    8020365c:	57fd                	li	a5,-1
+    8020365e:	bff1                	j	8020363a <sys_nanosleep+0xda>
+
+0000000080203660 <sys_kill>:
+
+uint64
+sys_kill(void)
+{
+    80203660:	1101                	addi	sp,sp,-32
+    80203662:	ec06                	sd	ra,24(sp)
+    80203664:	e822                	sd	s0,16(sp)
+    80203666:	1000                	addi	s0,sp,32
+  int pid;
+
+  if(argint(0, &pid) < 0)
+    80203668:	fec40593          	addi	a1,s0,-20
+    8020366c:	4501                	li	a0,0
+    8020366e:	00000097          	auipc	ra,0x0
+    80203672:	a14080e7          	jalr	-1516(ra) # 80203082 <argint>
+    80203676:	87aa                	mv	a5,a0
+    return -1;
+    80203678:	557d                	li	a0,-1
+  if(argint(0, &pid) < 0)
+    8020367a:	0007c863          	bltz	a5,8020368a <sys_kill+0x2a>
+  return kill(pid);
+    8020367e:	fec42503          	lw	a0,-20(s0)
+    80203682:	fffff097          	auipc	ra,0xfffff
+    80203686:	074080e7          	jalr	116(ra) # 802026f6 <kill>
+}
+    8020368a:	60e2                	ld	ra,24(sp)
+    8020368c:	6442                	ld	s0,16(sp)
+    8020368e:	6105                	addi	sp,sp,32
+    80203690:	8082                	ret
+
+0000000080203692 <sys_uptime>:
+
+// return how many clock tick interrupts have occurred
+// since start.
+uint64
+sys_uptime(void)
+{
+    80203692:	1101                	addi	sp,sp,-32
+    80203694:	ec06                	sd	ra,24(sp)
+    80203696:	e822                	sd	s0,16(sp)
+    80203698:	e426                	sd	s1,8(sp)
+    8020369a:	1000                	addi	s0,sp,32
+  uint xticks;
+
+  acquire(&tickslock);
+    8020369c:	00008517          	auipc	a0,0x8
+    802036a0:	66c53503          	ld	a0,1644(a0) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    802036a4:	ffffd097          	auipc	ra,0xffffd
+    802036a8:	022080e7          	jalr	34(ra) # 802006c6 <acquire>
+  xticks = ticks;
+    802036ac:	00008797          	auipc	a5,0x8
+    802036b0:	66c7b783          	ld	a5,1644(a5) # 8020bd18 <_GLOBAL_OFFSET_TABLE_+0x40>
+    802036b4:	4384                	lw	s1,0(a5)
+  release(&tickslock);
+    802036b6:	00008517          	auipc	a0,0x8
+    802036ba:	65253503          	ld	a0,1618(a0) # 8020bd08 <_GLOBAL_OFFSET_TABLE_+0x30>
+    802036be:	ffffd097          	auipc	ra,0xffffd
+    802036c2:	05c080e7          	jalr	92(ra) # 8020071a <release>
+  return xticks;
+}
+    802036c6:	02049513          	slli	a0,s1,0x20
+    802036ca:	9101                	srli	a0,a0,0x20
+    802036cc:	60e2                	ld	ra,24(sp)
+    802036ce:	6442                	ld	s0,16(sp)
+    802036d0:	64a2                	ld	s1,8(sp)
+    802036d2:	6105                	addi	sp,sp,32
+    802036d4:	8082                	ret
+
+00000000802036d6 <sys_times>:
+
+uint64
+sys_times(void)
+{
+    802036d6:	1141                	addi	sp,sp,-16
+    802036d8:	e406                	sd	ra,8(sp)
+    802036da:	e022                	sd	s0,0(sp)
+    802036dc:	0800                	addi	s0,sp,16
+  return sys_uptime();
+    802036de:	00000097          	auipc	ra,0x0
+    802036e2:	fb4080e7          	jalr	-76(ra) # 80203692 <sys_uptime>
+}
+    802036e6:	60a2                	ld	ra,8(sp)
+    802036e8:	6402                	ld	s0,0(sp)
+    802036ea:	0141                	addi	sp,sp,16
+    802036ec:	8082                	ret
+
+00000000802036ee <sys_trace>:
+
+
+uint64
+sys_trace(void)
+{
+    802036ee:	1101                	addi	sp,sp,-32
+    802036f0:	ec06                	sd	ra,24(sp)
+    802036f2:	e822                	sd	s0,16(sp)
+    802036f4:	1000                	addi	s0,sp,32
+  int mask;
+  if(argint(0, &mask) < 0) {
+    802036f6:	fec40593          	addi	a1,s0,-20
+    802036fa:	4501                	li	a0,0
+    802036fc:	00000097          	auipc	ra,0x0
+    80203700:	986080e7          	jalr	-1658(ra) # 80203082 <argint>
+    return -1;
+    80203704:	57fd                	li	a5,-1
+  if(argint(0, &mask) < 0) {
+    80203706:	00054b63          	bltz	a0,8020371c <sys_trace+0x2e>
+  }
+  myproc()->tmask = mask;
+    8020370a:	ffffe097          	auipc	ra,0xffffe
+    8020370e:	332080e7          	jalr	818(ra) # 80201a3c <myproc>
+    80203712:	fec42783          	lw	a5,-20(s0)
+    80203716:	16f52823          	sw	a5,368(a0)
+  return 0;
+    8020371a:	4781                	li	a5,0
+}
+    8020371c:	853e                	mv	a0,a5
+    8020371e:	60e2                	ld	ra,24(sp)
+    80203720:	6442                	ld	s0,16(sp)
+    80203722:	6105                	addi	sp,sp,32
+    80203724:	8082                	ret
+
+0000000080203726 <sys_shutdown>:
+
+uint64 
+sys_shutdown(void) {
+    80203726:	1141                	addi	sp,sp,-16
+    80203728:	e422                	sd	s0,8(sp)
+    8020372a:	0800                	addi	s0,sp,16
+	SBI_CALL_0(SBI_SHUTDOWN);
+    8020372c:	4501                	li	a0,0
+    8020372e:	4581                	li	a1,0
+    80203730:	4601                	li	a2,0
+    80203732:	4681                	li	a3,0
+    80203734:	48a1                	li	a7,8
+    80203736:	00000073          	ecall
+  sbi_shutdown();
+  return 0;
+}
+    8020373a:	4501                	li	a0,0
+    8020373c:	6422                	ld	s0,8(sp)
+    8020373e:	0141                	addi	sp,sp,16
+    80203740:	8082                	ret
+
+0000000080203742 <sys_yield>:
+
+uint64 
+sys_yield(void) {
+    80203742:	1141                	addi	sp,sp,-16
+    80203744:	e406                	sd	ra,8(sp)
+    80203746:	e022                	sd	s0,0(sp)
+    80203748:	0800                	addi	s0,sp,16
+  yield();
+    8020374a:	fffff097          	auipc	ra,0xfffff
+    8020374e:	c6e080e7          	jalr	-914(ra) # 802023b8 <yield>
+  return 0;
+}
+    80203752:	4501                	li	a0,0
+    80203754:	60a2                	ld	ra,8(sp)
+    80203756:	6402                	ld	s0,0(sp)
+    80203758:	0141                	addi	sp,sp,16
+    8020375a:	8082                	ret
+
+000000008020375c <sys_gettimeofday>:
+
+
+uint64
+sys_gettimeofday(void)
+{
+    8020375c:	7179                	addi	sp,sp,-48
+    8020375e:	f406                	sd	ra,40(sp)
+    80203760:	f022                	sd	s0,32(sp)
+    80203762:	1800                	addi	s0,sp,48
+    long   tv_sec;        /* ç§’ */
+    long   tv_nsec;       /* 纳秒, 范围在0~999999999 */
+  };
+  struct timespec tm;
+
+  if(argaddr(0, &addr) < 0)
+    80203764:	fe840593          	addi	a1,s0,-24
+    80203768:	4501                	li	a0,0
+    8020376a:	00000097          	auipc	ra,0x0
+    8020376e:	97a080e7          	jalr	-1670(ra) # 802030e4 <argaddr>
+    80203772:	87aa                	mv	a5,a0
+    return -1;
+    80203774:	557d                	li	a0,-1
+  if(argaddr(0, &addr) < 0)
+    80203776:	0207ca63          	bltz	a5,802037aa <sys_gettimeofday+0x4e>
+    8020377a:	c01027f3          	rdtime	a5
+
+  uint64 time = r_time();
+
+  tm.tv_sec = time / 12500000;
+    8020377e:	00bec737          	lui	a4,0xbec
+    80203782:	c2070713          	addi	a4,a4,-992 # bebc20 <_entry-0x7f6143e0>
+    80203786:	02e7d6b3          	divu	a3,a5,a4
+    8020378a:	fcd43c23          	sd	a3,-40(s0)
+  tm.tv_nsec = time % 12500000;
+    8020378e:	02e7f7b3          	remu	a5,a5,a4
+    80203792:	fef43023          	sd	a5,-32(s0)
+  if(copyout2(addr, (char*)&tm, sizeof(tm)) < 0)
+    80203796:	4641                	li	a2,16
+    80203798:	fd840593          	addi	a1,s0,-40
+    8020379c:	fe843503          	ld	a0,-24(s0)
+    802037a0:	ffffe097          	auipc	ra,0xffffe
+    802037a4:	bd2080e7          	jalr	-1070(ra) # 80201372 <copyout2>
+    802037a8:	957d                	srai	a0,a0,0x3f
+    return -1;
+  
+  return 0;
+    802037aa:	70a2                	ld	ra,40(sp)
+    802037ac:	7402                	ld	s0,32(sp)
+    802037ae:	6145                	addi	sp,sp,48
+    802037b0:	8082                	ret
+
+00000000802037b2 <binit>:
+  struct buf head;
+} bcache;
+
+void
+binit(void)
+{
+    802037b2:	7139                	addi	sp,sp,-64
+    802037b4:	fc06                	sd	ra,56(sp)
+    802037b6:	f822                	sd	s0,48(sp)
+    802037b8:	f426                	sd	s1,40(sp)
+    802037ba:	f04a                	sd	s2,32(sp)
+    802037bc:	ec4e                	sd	s3,24(sp)
+    802037be:	e852                	sd	s4,16(sp)
+    802037c0:	e456                	sd	s5,8(sp)
+    802037c2:	0080                	addi	s0,sp,64
+  struct buf *b;
+
+  initlock(&bcache.lock, "bcache");
+    802037c4:	00006597          	auipc	a1,0x6
+    802037c8:	4cc58593          	addi	a1,a1,1228 # 80209c90 <digits+0x910>
+    802037cc:	00015517          	auipc	a0,0x15
+    802037d0:	32450513          	addi	a0,a0,804 # 80218af0 <bcache>
+    802037d4:	ffffd097          	auipc	ra,0xffffd
+    802037d8:	eae080e7          	jalr	-338(ra) # 80200682 <initlock>
+
+  // Create linked list of buffers
+  bcache.head.prev = &bcache.head;
+    802037dc:	00019797          	auipc	a5,0x19
+    802037e0:	31478793          	addi	a5,a5,788 # 8021caf0 <bcache+0x4000>
+    802037e4:	0001a717          	auipc	a4,0x1a
+    802037e8:	97470713          	addi	a4,a4,-1676 # 8021d158 <bcache+0x4668>
+    802037ec:	6ae7b823          	sd	a4,1712(a5)
+  bcache.head.next = &bcache.head;
+    802037f0:	6ae7bc23          	sd	a4,1720(a5)
+  for(b = bcache.buf; b < bcache.buf+NBUF; b++){
+    802037f4:	00015497          	auipc	s1,0x15
+    802037f8:	31448493          	addi	s1,s1,788 # 80218b08 <bcache+0x18>
+    b->refcnt = 0;
+    b->sectorno = ~0;
+    802037fc:	5a7d                	li	s4,-1
+    b->dev = ~0;
+    b->next = bcache.head.next;
+    802037fe:	893e                	mv	s2,a5
+    b->prev = &bcache.head;
+    80203800:	89ba                	mv	s3,a4
+    initsleeplock(&b->lock, "buffer");
+    80203802:	00006a97          	auipc	s5,0x6
+    80203806:	496a8a93          	addi	s5,s5,1174 # 80209c98 <digits+0x918>
+    b->refcnt = 0;
+    8020380a:	0404a023          	sw	zero,64(s1)
+    b->sectorno = ~0;
+    8020380e:	0144a623          	sw	s4,12(s1)
+    b->dev = ~0;
+    80203812:	0144a423          	sw	s4,8(s1)
+    b->next = bcache.head.next;
+    80203816:	6b893783          	ld	a5,1720(s2)
+    8020381a:	e8bc                	sd	a5,80(s1)
+    b->prev = &bcache.head;
+    8020381c:	0534b423          	sd	s3,72(s1)
+    initsleeplock(&b->lock, "buffer");
+    80203820:	85d6                	mv	a1,s5
+    80203822:	01048513          	addi	a0,s1,16
+    80203826:	00000097          	auipc	ra,0x0
+    8020382a:	26e080e7          	jalr	622(ra) # 80203a94 <initsleeplock>
+    bcache.head.next->prev = b;
+    8020382e:	6b893783          	ld	a5,1720(s2)
+    80203832:	e7a4                	sd	s1,72(a5)
+    bcache.head.next = b;
+    80203834:	6a993c23          	sd	s1,1720(s2)
+  for(b = bcache.buf; b < bcache.buf+NBUF; b++){
+    80203838:	25848493          	addi	s1,s1,600
+    8020383c:	fd3497e3          	bne	s1,s3,8020380a <binit+0x58>
+  }
+  #ifdef DEBUG
+  printf("binit\n");
+  #endif
+}
+    80203840:	70e2                	ld	ra,56(sp)
+    80203842:	7442                	ld	s0,48(sp)
+    80203844:	74a2                	ld	s1,40(sp)
+    80203846:	7902                	ld	s2,32(sp)
+    80203848:	69e2                	ld	s3,24(sp)
+    8020384a:	6a42                	ld	s4,16(sp)
+    8020384c:	6aa2                	ld	s5,8(sp)
+    8020384e:	6121                	addi	sp,sp,64
+    80203850:	8082                	ret
+
+0000000080203852 <bread>:
+  panic("bget: no buffers");
+}
+
+// Return a locked buf with the contents of the indicated block.
+struct buf* 
+bread(uint dev, uint sectorno) {
+    80203852:	7179                	addi	sp,sp,-48
+    80203854:	f406                	sd	ra,40(sp)
+    80203856:	f022                	sd	s0,32(sp)
+    80203858:	ec26                	sd	s1,24(sp)
+    8020385a:	e84a                	sd	s2,16(sp)
+    8020385c:	e44e                	sd	s3,8(sp)
+    8020385e:	1800                	addi	s0,sp,48
+    80203860:	892a                	mv	s2,a0
+    80203862:	89ae                	mv	s3,a1
+  acquire(&bcache.lock);
+    80203864:	00015517          	auipc	a0,0x15
+    80203868:	28c50513          	addi	a0,a0,652 # 80218af0 <bcache>
+    8020386c:	ffffd097          	auipc	ra,0xffffd
+    80203870:	e5a080e7          	jalr	-422(ra) # 802006c6 <acquire>
+  for(b = bcache.head.next; b != &bcache.head; b = b->next){
+    80203874:	0001a497          	auipc	s1,0x1a
+    80203878:	9344b483          	ld	s1,-1740(s1) # 8021d1a8 <bcache+0x46b8>
+    8020387c:	0001a797          	auipc	a5,0x1a
+    80203880:	8dc78793          	addi	a5,a5,-1828 # 8021d158 <bcache+0x4668>
+    80203884:	02f48f63          	beq	s1,a5,802038c2 <bread+0x70>
+    80203888:	873e                	mv	a4,a5
+    8020388a:	a021                	j	80203892 <bread+0x40>
+    8020388c:	68a4                	ld	s1,80(s1)
+    8020388e:	02e48a63          	beq	s1,a4,802038c2 <bread+0x70>
+    if(b->dev == dev && b->sectorno == sectorno){
+    80203892:	449c                	lw	a5,8(s1)
+    80203894:	ff279ce3          	bne	a5,s2,8020388c <bread+0x3a>
+    80203898:	44dc                	lw	a5,12(s1)
+    8020389a:	ff3799e3          	bne	a5,s3,8020388c <bread+0x3a>
+      b->refcnt++;
+    8020389e:	40bc                	lw	a5,64(s1)
+    802038a0:	2785                	addiw	a5,a5,1
+    802038a2:	c0bc                	sw	a5,64(s1)
+      release(&bcache.lock);
+    802038a4:	00015517          	auipc	a0,0x15
+    802038a8:	24c50513          	addi	a0,a0,588 # 80218af0 <bcache>
+    802038ac:	ffffd097          	auipc	ra,0xffffd
+    802038b0:	e6e080e7          	jalr	-402(ra) # 8020071a <release>
+      acquiresleep(&b->lock);
+    802038b4:	01048513          	addi	a0,s1,16
+    802038b8:	00000097          	auipc	ra,0x0
+    802038bc:	216080e7          	jalr	534(ra) # 80203ace <acquiresleep>
+      return b;
+    802038c0:	a8b9                	j	8020391e <bread+0xcc>
+  for(b = bcache.head.prev; b != &bcache.head; b = b->prev){
+    802038c2:	0001a497          	auipc	s1,0x1a
+    802038c6:	8de4b483          	ld	s1,-1826(s1) # 8021d1a0 <bcache+0x46b0>
+    802038ca:	0001a797          	auipc	a5,0x1a
+    802038ce:	88e78793          	addi	a5,a5,-1906 # 8021d158 <bcache+0x4668>
+    802038d2:	00f48863          	beq	s1,a5,802038e2 <bread+0x90>
+    802038d6:	873e                	mv	a4,a5
+    if(b->refcnt == 0) {
+    802038d8:	40bc                	lw	a5,64(s1)
+    802038da:	cf81                	beqz	a5,802038f2 <bread+0xa0>
+  for(b = bcache.head.prev; b != &bcache.head; b = b->prev){
+    802038dc:	64a4                	ld	s1,72(s1)
+    802038de:	fee49de3          	bne	s1,a4,802038d8 <bread+0x86>
+  panic("bget: no buffers");
+    802038e2:	00006517          	auipc	a0,0x6
+    802038e6:	3be50513          	addi	a0,a0,958 # 80209ca0 <digits+0x920>
+    802038ea:	ffffd097          	auipc	ra,0xffffd
+    802038ee:	85a080e7          	jalr	-1958(ra) # 80200144 <panic>
+      b->dev = dev;
+    802038f2:	0124a423          	sw	s2,8(s1)
+      b->sectorno = sectorno;
+    802038f6:	0134a623          	sw	s3,12(s1)
+      b->valid = 0;
+    802038fa:	0004a023          	sw	zero,0(s1)
+      b->refcnt = 1;
+    802038fe:	4785                	li	a5,1
+    80203900:	c0bc                	sw	a5,64(s1)
+      release(&bcache.lock);
+    80203902:	00015517          	auipc	a0,0x15
+    80203906:	1ee50513          	addi	a0,a0,494 # 80218af0 <bcache>
+    8020390a:	ffffd097          	auipc	ra,0xffffd
+    8020390e:	e10080e7          	jalr	-496(ra) # 8020071a <release>
+      acquiresleep(&b->lock);
+    80203912:	01048513          	addi	a0,s1,16
+    80203916:	00000097          	auipc	ra,0x0
+    8020391a:	1b8080e7          	jalr	440(ra) # 80203ace <acquiresleep>
+  struct buf *b;
+
+  b = bget(dev, sectorno);
+  if (!b->valid) {
+    8020391e:	409c                	lw	a5,0(s1)
+    80203920:	cb89                	beqz	a5,80203932 <bread+0xe0>
+    disk_read(b);
+    b->valid = 1;
+  }
+
+  return b;
+}
+    80203922:	8526                	mv	a0,s1
+    80203924:	70a2                	ld	ra,40(sp)
+    80203926:	7402                	ld	s0,32(sp)
+    80203928:	64e2                	ld	s1,24(sp)
+    8020392a:	6942                	ld	s2,16(sp)
+    8020392c:	69a2                	ld	s3,8(sp)
+    8020392e:	6145                	addi	sp,sp,48
+    80203930:	8082                	ret
+    disk_read(b);
+    80203932:	8526                	mv	a0,s1
+    80203934:	00002097          	auipc	ra,0x2
+    80203938:	b9e080e7          	jalr	-1122(ra) # 802054d2 <disk_read>
+    b->valid = 1;
+    8020393c:	4785                	li	a5,1
+    8020393e:	c09c                	sw	a5,0(s1)
+  return b;
+    80203940:	b7cd                	j	80203922 <bread+0xd0>
+
+0000000080203942 <bwrite>:
+
+// Write b's contents to disk.  Must be locked.
+void 
+bwrite(struct buf *b) {
+    80203942:	1101                	addi	sp,sp,-32
+    80203944:	ec06                	sd	ra,24(sp)
+    80203946:	e822                	sd	s0,16(sp)
+    80203948:	e426                	sd	s1,8(sp)
+    8020394a:	1000                	addi	s0,sp,32
+    8020394c:	84aa                	mv	s1,a0
+  if(!holdingsleep(&b->lock))
+    8020394e:	0541                	addi	a0,a0,16
+    80203950:	00000097          	auipc	ra,0x0
+    80203954:	218080e7          	jalr	536(ra) # 80203b68 <holdingsleep>
+    80203958:	c919                	beqz	a0,8020396e <bwrite+0x2c>
+    panic("bwrite");
+  disk_write(b);
+    8020395a:	8526                	mv	a0,s1
+    8020395c:	00002097          	auipc	ra,0x2
+    80203960:	b90080e7          	jalr	-1136(ra) # 802054ec <disk_write>
+}
+    80203964:	60e2                	ld	ra,24(sp)
+    80203966:	6442                	ld	s0,16(sp)
+    80203968:	64a2                	ld	s1,8(sp)
+    8020396a:	6105                	addi	sp,sp,32
+    8020396c:	8082                	ret
+    panic("bwrite");
+    8020396e:	00006517          	auipc	a0,0x6
+    80203972:	34a50513          	addi	a0,a0,842 # 80209cb8 <digits+0x938>
+    80203976:	ffffc097          	auipc	ra,0xffffc
+    8020397a:	7ce080e7          	jalr	1998(ra) # 80200144 <panic>
+
+000000008020397e <brelse>:
+
+// Release a locked buffer.
+// Move to the head of the most-recently-used list.
+void
+brelse(struct buf *b)
+{
+    8020397e:	1101                	addi	sp,sp,-32
+    80203980:	ec06                	sd	ra,24(sp)
+    80203982:	e822                	sd	s0,16(sp)
+    80203984:	e426                	sd	s1,8(sp)
+    80203986:	e04a                	sd	s2,0(sp)
+    80203988:	1000                	addi	s0,sp,32
+    8020398a:	84aa                	mv	s1,a0
+  if(!holdingsleep(&b->lock))
+    8020398c:	01050913          	addi	s2,a0,16
+    80203990:	854a                	mv	a0,s2
+    80203992:	00000097          	auipc	ra,0x0
+    80203996:	1d6080e7          	jalr	470(ra) # 80203b68 <holdingsleep>
+    8020399a:	c92d                	beqz	a0,80203a0c <brelse+0x8e>
+    panic("brelse");
+
+  releasesleep(&b->lock);
+    8020399c:	854a                	mv	a0,s2
+    8020399e:	00000097          	auipc	ra,0x0
+    802039a2:	186080e7          	jalr	390(ra) # 80203b24 <releasesleep>
+
+  acquire(&bcache.lock);
+    802039a6:	00015517          	auipc	a0,0x15
+    802039aa:	14a50513          	addi	a0,a0,330 # 80218af0 <bcache>
+    802039ae:	ffffd097          	auipc	ra,0xffffd
+    802039b2:	d18080e7          	jalr	-744(ra) # 802006c6 <acquire>
+  b->refcnt--;
+    802039b6:	40bc                	lw	a5,64(s1)
+    802039b8:	37fd                	addiw	a5,a5,-1
+    802039ba:	0007871b          	sext.w	a4,a5
+    802039be:	c0bc                	sw	a5,64(s1)
+  if (b->refcnt == 0) {
+    802039c0:	eb05                	bnez	a4,802039f0 <brelse+0x72>
+    // no one is waiting for it.
+    b->next->prev = b->prev;
+    802039c2:	68bc                	ld	a5,80(s1)
+    802039c4:	64b8                	ld	a4,72(s1)
+    802039c6:	e7b8                	sd	a4,72(a5)
+    b->prev->next = b->next;
+    802039c8:	64bc                	ld	a5,72(s1)
+    802039ca:	68b8                	ld	a4,80(s1)
+    802039cc:	ebb8                	sd	a4,80(a5)
+    b->next = bcache.head.next;
+    802039ce:	00019797          	auipc	a5,0x19
+    802039d2:	12278793          	addi	a5,a5,290 # 8021caf0 <bcache+0x4000>
+    802039d6:	6b87b703          	ld	a4,1720(a5)
+    802039da:	e8b8                	sd	a4,80(s1)
+    b->prev = &bcache.head;
+    802039dc:	00019717          	auipc	a4,0x19
+    802039e0:	77c70713          	addi	a4,a4,1916 # 8021d158 <bcache+0x4668>
+    802039e4:	e4b8                	sd	a4,72(s1)
+    bcache.head.next->prev = b;
+    802039e6:	6b87b703          	ld	a4,1720(a5)
+    802039ea:	e724                	sd	s1,72(a4)
+    bcache.head.next = b;
+    802039ec:	6a97bc23          	sd	s1,1720(a5)
+  }
+  
+  release(&bcache.lock);
+    802039f0:	00015517          	auipc	a0,0x15
+    802039f4:	10050513          	addi	a0,a0,256 # 80218af0 <bcache>
+    802039f8:	ffffd097          	auipc	ra,0xffffd
+    802039fc:	d22080e7          	jalr	-734(ra) # 8020071a <release>
+}
+    80203a00:	60e2                	ld	ra,24(sp)
+    80203a02:	6442                	ld	s0,16(sp)
+    80203a04:	64a2                	ld	s1,8(sp)
+    80203a06:	6902                	ld	s2,0(sp)
+    80203a08:	6105                	addi	sp,sp,32
+    80203a0a:	8082                	ret
+    panic("brelse");
+    80203a0c:	00006517          	auipc	a0,0x6
+    80203a10:	2b450513          	addi	a0,a0,692 # 80209cc0 <digits+0x940>
+    80203a14:	ffffc097          	auipc	ra,0xffffc
+    80203a18:	730080e7          	jalr	1840(ra) # 80200144 <panic>
+
+0000000080203a1c <bpin>:
+
+void
+bpin(struct buf *b) {
+    80203a1c:	1101                	addi	sp,sp,-32
+    80203a1e:	ec06                	sd	ra,24(sp)
+    80203a20:	e822                	sd	s0,16(sp)
+    80203a22:	e426                	sd	s1,8(sp)
+    80203a24:	1000                	addi	s0,sp,32
+    80203a26:	84aa                	mv	s1,a0
+  acquire(&bcache.lock);
+    80203a28:	00015517          	auipc	a0,0x15
+    80203a2c:	0c850513          	addi	a0,a0,200 # 80218af0 <bcache>
+    80203a30:	ffffd097          	auipc	ra,0xffffd
+    80203a34:	c96080e7          	jalr	-874(ra) # 802006c6 <acquire>
+  b->refcnt++;
+    80203a38:	40bc                	lw	a5,64(s1)
+    80203a3a:	2785                	addiw	a5,a5,1
+    80203a3c:	c0bc                	sw	a5,64(s1)
+  release(&bcache.lock);
+    80203a3e:	00015517          	auipc	a0,0x15
+    80203a42:	0b250513          	addi	a0,a0,178 # 80218af0 <bcache>
+    80203a46:	ffffd097          	auipc	ra,0xffffd
+    80203a4a:	cd4080e7          	jalr	-812(ra) # 8020071a <release>
+}
+    80203a4e:	60e2                	ld	ra,24(sp)
+    80203a50:	6442                	ld	s0,16(sp)
+    80203a52:	64a2                	ld	s1,8(sp)
+    80203a54:	6105                	addi	sp,sp,32
+    80203a56:	8082                	ret
+
+0000000080203a58 <bunpin>:
+
+void
+bunpin(struct buf *b) {
+    80203a58:	1101                	addi	sp,sp,-32
+    80203a5a:	ec06                	sd	ra,24(sp)
+    80203a5c:	e822                	sd	s0,16(sp)
+    80203a5e:	e426                	sd	s1,8(sp)
+    80203a60:	1000                	addi	s0,sp,32
+    80203a62:	84aa                	mv	s1,a0
+  acquire(&bcache.lock);
+    80203a64:	00015517          	auipc	a0,0x15
+    80203a68:	08c50513          	addi	a0,a0,140 # 80218af0 <bcache>
+    80203a6c:	ffffd097          	auipc	ra,0xffffd
+    80203a70:	c5a080e7          	jalr	-934(ra) # 802006c6 <acquire>
+  b->refcnt--;
+    80203a74:	40bc                	lw	a5,64(s1)
+    80203a76:	37fd                	addiw	a5,a5,-1
+    80203a78:	c0bc                	sw	a5,64(s1)
+  release(&bcache.lock);
+    80203a7a:	00015517          	auipc	a0,0x15
+    80203a7e:	07650513          	addi	a0,a0,118 # 80218af0 <bcache>
+    80203a82:	ffffd097          	auipc	ra,0xffffd
+    80203a86:	c98080e7          	jalr	-872(ra) # 8020071a <release>
+}
+    80203a8a:	60e2                	ld	ra,24(sp)
+    80203a8c:	6442                	ld	s0,16(sp)
+    80203a8e:	64a2                	ld	s1,8(sp)
+    80203a90:	6105                	addi	sp,sp,32
+    80203a92:	8082                	ret
+
+0000000080203a94 <initsleeplock>:
+#include "include/proc.h"
+#include "include/sleeplock.h"
+
+void
+initsleeplock(struct sleeplock *lk, char *name)
+{
+    80203a94:	1101                	addi	sp,sp,-32
+    80203a96:	ec06                	sd	ra,24(sp)
+    80203a98:	e822                	sd	s0,16(sp)
+    80203a9a:	e426                	sd	s1,8(sp)
+    80203a9c:	e04a                	sd	s2,0(sp)
+    80203a9e:	1000                	addi	s0,sp,32
+    80203aa0:	84aa                	mv	s1,a0
+    80203aa2:	892e                	mv	s2,a1
+  initlock(&lk->lk, "sleep lock");
+    80203aa4:	00006597          	auipc	a1,0x6
+    80203aa8:	22458593          	addi	a1,a1,548 # 80209cc8 <digits+0x948>
+    80203aac:	0521                	addi	a0,a0,8
+    80203aae:	ffffd097          	auipc	ra,0xffffd
+    80203ab2:	bd4080e7          	jalr	-1068(ra) # 80200682 <initlock>
+  lk->name = name;
+    80203ab6:	0324b023          	sd	s2,32(s1)
+  lk->locked = 0;
+    80203aba:	0004a023          	sw	zero,0(s1)
+  lk->pid = 0;
+    80203abe:	0204a423          	sw	zero,40(s1)
+}
+    80203ac2:	60e2                	ld	ra,24(sp)
+    80203ac4:	6442                	ld	s0,16(sp)
+    80203ac6:	64a2                	ld	s1,8(sp)
+    80203ac8:	6902                	ld	s2,0(sp)
+    80203aca:	6105                	addi	sp,sp,32
+    80203acc:	8082                	ret
+
+0000000080203ace <acquiresleep>:
+
+void
+acquiresleep(struct sleeplock *lk)
+{
+    80203ace:	1101                	addi	sp,sp,-32
+    80203ad0:	ec06                	sd	ra,24(sp)
+    80203ad2:	e822                	sd	s0,16(sp)
+    80203ad4:	e426                	sd	s1,8(sp)
+    80203ad6:	e04a                	sd	s2,0(sp)
+    80203ad8:	1000                	addi	s0,sp,32
+    80203ada:	84aa                	mv	s1,a0
+  acquire(&lk->lk);
+    80203adc:	00850913          	addi	s2,a0,8
+    80203ae0:	854a                	mv	a0,s2
+    80203ae2:	ffffd097          	auipc	ra,0xffffd
+    80203ae6:	be4080e7          	jalr	-1052(ra) # 802006c6 <acquire>
+  while (lk->locked) {
+    80203aea:	409c                	lw	a5,0(s1)
+    80203aec:	cb89                	beqz	a5,80203afe <acquiresleep+0x30>
+    sleep(lk, &lk->lk);
+    80203aee:	85ca                	mv	a1,s2
+    80203af0:	8526                	mv	a0,s1
+    80203af2:	fffff097          	auipc	ra,0xfffff
+    80203af6:	902080e7          	jalr	-1790(ra) # 802023f4 <sleep>
+  while (lk->locked) {
+    80203afa:	409c                	lw	a5,0(s1)
+    80203afc:	fbed                	bnez	a5,80203aee <acquiresleep+0x20>
+  }
+  lk->locked = 1;
+    80203afe:	4785                	li	a5,1
+    80203b00:	c09c                	sw	a5,0(s1)
+  lk->pid = myproc()->pid;
+    80203b02:	ffffe097          	auipc	ra,0xffffe
+    80203b06:	f3a080e7          	jalr	-198(ra) # 80201a3c <myproc>
+    80203b0a:	5d1c                	lw	a5,56(a0)
+    80203b0c:	d49c                	sw	a5,40(s1)
+  release(&lk->lk);
+    80203b0e:	854a                	mv	a0,s2
+    80203b10:	ffffd097          	auipc	ra,0xffffd
+    80203b14:	c0a080e7          	jalr	-1014(ra) # 8020071a <release>
+}
+    80203b18:	60e2                	ld	ra,24(sp)
+    80203b1a:	6442                	ld	s0,16(sp)
+    80203b1c:	64a2                	ld	s1,8(sp)
+    80203b1e:	6902                	ld	s2,0(sp)
+    80203b20:	6105                	addi	sp,sp,32
+    80203b22:	8082                	ret
+
+0000000080203b24 <releasesleep>:
+
+void
+releasesleep(struct sleeplock *lk)
+{
+    80203b24:	1101                	addi	sp,sp,-32
+    80203b26:	ec06                	sd	ra,24(sp)
+    80203b28:	e822                	sd	s0,16(sp)
+    80203b2a:	e426                	sd	s1,8(sp)
+    80203b2c:	e04a                	sd	s2,0(sp)
+    80203b2e:	1000                	addi	s0,sp,32
+    80203b30:	84aa                	mv	s1,a0
+  acquire(&lk->lk);
+    80203b32:	00850913          	addi	s2,a0,8
+    80203b36:	854a                	mv	a0,s2
+    80203b38:	ffffd097          	auipc	ra,0xffffd
+    80203b3c:	b8e080e7          	jalr	-1138(ra) # 802006c6 <acquire>
+  lk->locked = 0;
+    80203b40:	0004a023          	sw	zero,0(s1)
+  lk->pid = 0;
+    80203b44:	0204a423          	sw	zero,40(s1)
+  wakeup(lk);
+    80203b48:	8526                	mv	a0,s1
+    80203b4a:	fffff097          	auipc	ra,0xfffff
+    80203b4e:	b42080e7          	jalr	-1214(ra) # 8020268c <wakeup>
+  release(&lk->lk);
+    80203b52:	854a                	mv	a0,s2
+    80203b54:	ffffd097          	auipc	ra,0xffffd
+    80203b58:	bc6080e7          	jalr	-1082(ra) # 8020071a <release>
+}
+    80203b5c:	60e2                	ld	ra,24(sp)
+    80203b5e:	6442                	ld	s0,16(sp)
+    80203b60:	64a2                	ld	s1,8(sp)
+    80203b62:	6902                	ld	s2,0(sp)
+    80203b64:	6105                	addi	sp,sp,32
+    80203b66:	8082                	ret
+
+0000000080203b68 <holdingsleep>:
+
+int
+holdingsleep(struct sleeplock *lk)
+{
+    80203b68:	7179                	addi	sp,sp,-48
+    80203b6a:	f406                	sd	ra,40(sp)
+    80203b6c:	f022                	sd	s0,32(sp)
+    80203b6e:	ec26                	sd	s1,24(sp)
+    80203b70:	e84a                	sd	s2,16(sp)
+    80203b72:	e44e                	sd	s3,8(sp)
+    80203b74:	1800                	addi	s0,sp,48
+    80203b76:	84aa                	mv	s1,a0
+  int r;
+  
+  acquire(&lk->lk);
+    80203b78:	00850913          	addi	s2,a0,8
+    80203b7c:	854a                	mv	a0,s2
+    80203b7e:	ffffd097          	auipc	ra,0xffffd
+    80203b82:	b48080e7          	jalr	-1208(ra) # 802006c6 <acquire>
+  r = lk->locked && (lk->pid == myproc()->pid);
+    80203b86:	409c                	lw	a5,0(s1)
+    80203b88:	ef99                	bnez	a5,80203ba6 <holdingsleep+0x3e>
+    80203b8a:	4481                	li	s1,0
+  release(&lk->lk);
+    80203b8c:	854a                	mv	a0,s2
+    80203b8e:	ffffd097          	auipc	ra,0xffffd
+    80203b92:	b8c080e7          	jalr	-1140(ra) # 8020071a <release>
+  return r;
+}
+    80203b96:	8526                	mv	a0,s1
+    80203b98:	70a2                	ld	ra,40(sp)
+    80203b9a:	7402                	ld	s0,32(sp)
+    80203b9c:	64e2                	ld	s1,24(sp)
+    80203b9e:	6942                	ld	s2,16(sp)
+    80203ba0:	69a2                	ld	s3,8(sp)
+    80203ba2:	6145                	addi	sp,sp,48
+    80203ba4:	8082                	ret
+  r = lk->locked && (lk->pid == myproc()->pid);
+    80203ba6:	0284a983          	lw	s3,40(s1)
+    80203baa:	ffffe097          	auipc	ra,0xffffe
+    80203bae:	e92080e7          	jalr	-366(ra) # 80201a3c <myproc>
+    80203bb2:	5d04                	lw	s1,56(a0)
+    80203bb4:	413484b3          	sub	s1,s1,s3
+    80203bb8:	0014b493          	seqz	s1,s1
+    80203bbc:	bfc1                	j	80203b8c <holdingsleep+0x24>
+
+0000000080203bbe <fileinit>:
+  struct file file[NFILE];
+} ftable;
+
+void
+fileinit(void)
+{
+    80203bbe:	1101                	addi	sp,sp,-32
+    80203bc0:	ec06                	sd	ra,24(sp)
+    80203bc2:	e822                	sd	s0,16(sp)
+    80203bc4:	e426                	sd	s1,8(sp)
+    80203bc6:	e04a                	sd	s2,0(sp)
+    80203bc8:	1000                	addi	s0,sp,32
+  initlock(&ftable.lock, "ftable");
+    80203bca:	00006597          	auipc	a1,0x6
+    80203bce:	10e58593          	addi	a1,a1,270 # 80209cd8 <digits+0x958>
+    80203bd2:	0001a517          	auipc	a0,0x1a
+    80203bd6:	87e50513          	addi	a0,a0,-1922 # 8021d450 <ftable>
+    80203bda:	ffffd097          	auipc	ra,0xffffd
+    80203bde:	aa8080e7          	jalr	-1368(ra) # 80200682 <initlock>
+  struct file *f;
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
+    80203be2:	0001a497          	auipc	s1,0x1a
+    80203be6:	88648493          	addi	s1,s1,-1914 # 8021d468 <ftable+0x18>
+    80203bea:	0001b917          	auipc	s2,0x1b
+    80203bee:	81e90913          	addi	s2,s2,-2018 # 8021e408 <tickslock>
+    memset(f, 0, sizeof(struct file));
+    80203bf2:	02800613          	li	a2,40
+    80203bf6:	4581                	li	a1,0
+    80203bf8:	8526                	mv	a0,s1
+    80203bfa:	ffffd097          	auipc	ra,0xffffd
+    80203bfe:	b68080e7          	jalr	-1176(ra) # 80200762 <memset>
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
+    80203c02:	02848493          	addi	s1,s1,40
+    80203c06:	ff2496e3          	bne	s1,s2,80203bf2 <fileinit+0x34>
+  }
+  #ifdef DEBUG
+  printf("fileinit\n");
+  #endif
+}
+    80203c0a:	60e2                	ld	ra,24(sp)
+    80203c0c:	6442                	ld	s0,16(sp)
+    80203c0e:	64a2                	ld	s1,8(sp)
+    80203c10:	6902                	ld	s2,0(sp)
+    80203c12:	6105                	addi	sp,sp,32
+    80203c14:	8082                	ret
+
+0000000080203c16 <filealloc>:
+
+// Allocate a file structure.
+struct file*
+filealloc(void)
+{
+    80203c16:	1101                	addi	sp,sp,-32
+    80203c18:	ec06                	sd	ra,24(sp)
+    80203c1a:	e822                	sd	s0,16(sp)
+    80203c1c:	e426                	sd	s1,8(sp)
+    80203c1e:	1000                	addi	s0,sp,32
+  struct file *f;
+
+  acquire(&ftable.lock);
+    80203c20:	0001a517          	auipc	a0,0x1a
+    80203c24:	83050513          	addi	a0,a0,-2000 # 8021d450 <ftable>
+    80203c28:	ffffd097          	auipc	ra,0xffffd
+    80203c2c:	a9e080e7          	jalr	-1378(ra) # 802006c6 <acquire>
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
+    80203c30:	0001a497          	auipc	s1,0x1a
+    80203c34:	83848493          	addi	s1,s1,-1992 # 8021d468 <ftable+0x18>
+    80203c38:	0001a717          	auipc	a4,0x1a
+    80203c3c:	7d070713          	addi	a4,a4,2000 # 8021e408 <tickslock>
+    if(f->ref == 0){
+    80203c40:	40dc                	lw	a5,4(s1)
+    80203c42:	cf99                	beqz	a5,80203c60 <filealloc+0x4a>
+  for(f = ftable.file; f < ftable.file + NFILE; f++){
+    80203c44:	02848493          	addi	s1,s1,40
+    80203c48:	fee49ce3          	bne	s1,a4,80203c40 <filealloc+0x2a>
+      f->ref = 1;
+      release(&ftable.lock);
+      return f;
+    }
+  }
+  release(&ftable.lock);
+    80203c4c:	0001a517          	auipc	a0,0x1a
+    80203c50:	80450513          	addi	a0,a0,-2044 # 8021d450 <ftable>
+    80203c54:	ffffd097          	auipc	ra,0xffffd
+    80203c58:	ac6080e7          	jalr	-1338(ra) # 8020071a <release>
+  return NULL;
+    80203c5c:	4481                	li	s1,0
+    80203c5e:	a819                	j	80203c74 <filealloc+0x5e>
+      f->ref = 1;
+    80203c60:	4785                	li	a5,1
+    80203c62:	c0dc                	sw	a5,4(s1)
+      release(&ftable.lock);
+    80203c64:	00019517          	auipc	a0,0x19
+    80203c68:	7ec50513          	addi	a0,a0,2028 # 8021d450 <ftable>
+    80203c6c:	ffffd097          	auipc	ra,0xffffd
+    80203c70:	aae080e7          	jalr	-1362(ra) # 8020071a <release>
+}
+    80203c74:	8526                	mv	a0,s1
+    80203c76:	60e2                	ld	ra,24(sp)
+    80203c78:	6442                	ld	s0,16(sp)
+    80203c7a:	64a2                	ld	s1,8(sp)
+    80203c7c:	6105                	addi	sp,sp,32
+    80203c7e:	8082                	ret
+
+0000000080203c80 <filedup>:
+
+// Increment ref count for file f.
+struct file*
+filedup(struct file *f)
+{
+    80203c80:	1101                	addi	sp,sp,-32
+    80203c82:	ec06                	sd	ra,24(sp)
+    80203c84:	e822                	sd	s0,16(sp)
+    80203c86:	e426                	sd	s1,8(sp)
+    80203c88:	1000                	addi	s0,sp,32
+    80203c8a:	84aa                	mv	s1,a0
+  acquire(&ftable.lock);
+    80203c8c:	00019517          	auipc	a0,0x19
+    80203c90:	7c450513          	addi	a0,a0,1988 # 8021d450 <ftable>
+    80203c94:	ffffd097          	auipc	ra,0xffffd
+    80203c98:	a32080e7          	jalr	-1486(ra) # 802006c6 <acquire>
+  if(f->ref < 1)
+    80203c9c:	40dc                	lw	a5,4(s1)
+    80203c9e:	02f05263          	blez	a5,80203cc2 <filedup+0x42>
+    panic("filedup");
+  f->ref++;
+    80203ca2:	2785                	addiw	a5,a5,1
+    80203ca4:	c0dc                	sw	a5,4(s1)
+  release(&ftable.lock);
+    80203ca6:	00019517          	auipc	a0,0x19
+    80203caa:	7aa50513          	addi	a0,a0,1962 # 8021d450 <ftable>
+    80203cae:	ffffd097          	auipc	ra,0xffffd
+    80203cb2:	a6c080e7          	jalr	-1428(ra) # 8020071a <release>
+  return f;
+}
+    80203cb6:	8526                	mv	a0,s1
+    80203cb8:	60e2                	ld	ra,24(sp)
+    80203cba:	6442                	ld	s0,16(sp)
+    80203cbc:	64a2                	ld	s1,8(sp)
+    80203cbe:	6105                	addi	sp,sp,32
+    80203cc0:	8082                	ret
+    panic("filedup");
+    80203cc2:	00006517          	auipc	a0,0x6
+    80203cc6:	01e50513          	addi	a0,a0,30 # 80209ce0 <digits+0x960>
+    80203cca:	ffffc097          	auipc	ra,0xffffc
+    80203cce:	47a080e7          	jalr	1146(ra) # 80200144 <panic>
+
+0000000080203cd2 <fileclose>:
+
+// Close file f.  (Decrement ref count, close when reaches 0.)
+void
+fileclose(struct file *f)
+{
+    80203cd2:	7139                	addi	sp,sp,-64
+    80203cd4:	fc06                	sd	ra,56(sp)
+    80203cd6:	f822                	sd	s0,48(sp)
+    80203cd8:	f426                	sd	s1,40(sp)
+    80203cda:	f04a                	sd	s2,32(sp)
+    80203cdc:	ec4e                	sd	s3,24(sp)
+    80203cde:	e852                	sd	s4,16(sp)
+    80203ce0:	e456                	sd	s5,8(sp)
+    80203ce2:	0080                	addi	s0,sp,64
+    80203ce4:	84aa                	mv	s1,a0
+  struct file ff;
+
+  acquire(&ftable.lock);
+    80203ce6:	00019517          	auipc	a0,0x19
+    80203cea:	76a50513          	addi	a0,a0,1898 # 8021d450 <ftable>
+    80203cee:	ffffd097          	auipc	ra,0xffffd
+    80203cf2:	9d8080e7          	jalr	-1576(ra) # 802006c6 <acquire>
+  if(f->ref < 1)
+    80203cf6:	40dc                	lw	a5,4(s1)
+    80203cf8:	04f05863          	blez	a5,80203d48 <fileclose+0x76>
+    panic("fileclose");
+  if(--f->ref > 0){
+    80203cfc:	37fd                	addiw	a5,a5,-1
+    80203cfe:	0007871b          	sext.w	a4,a5
+    80203d02:	c0dc                	sw	a5,4(s1)
+    80203d04:	04e04a63          	bgtz	a4,80203d58 <fileclose+0x86>
+    release(&ftable.lock);
+    return;
+  }
+  ff = *f;
+    80203d08:	0004a903          	lw	s2,0(s1)
+    80203d0c:	0094ca03          	lbu	s4,9(s1)
+    80203d10:	0104b983          	ld	s3,16(s1)
+    80203d14:	0184ba83          	ld	s5,24(s1)
+  f->ref = 0;
+    80203d18:	0004a223          	sw	zero,4(s1)
+  f->type = FD_NONE;
+    80203d1c:	0004a023          	sw	zero,0(s1)
+  release(&ftable.lock);
+    80203d20:	00019517          	auipc	a0,0x19
+    80203d24:	73050513          	addi	a0,a0,1840 # 8021d450 <ftable>
+    80203d28:	ffffd097          	auipc	ra,0xffffd
+    80203d2c:	9f2080e7          	jalr	-1550(ra) # 8020071a <release>
+
+  if(ff.type == FD_PIPE){
+    80203d30:	4785                	li	a5,1
+    80203d32:	04f90463          	beq	s2,a5,80203d7a <fileclose+0xa8>
+    pipeclose(ff.pipe, ff.writable);
+  } else if(ff.type == FD_ENTRY){
+    80203d36:	4789                	li	a5,2
+    80203d38:	02f91863          	bne	s2,a5,80203d68 <fileclose+0x96>
+    eput(ff.ep);
+    80203d3c:	8556                	mv	a0,s5
+    80203d3e:	00003097          	auipc	ra,0x3
+    80203d42:	9b4080e7          	jalr	-1612(ra) # 802066f2 <eput>
+    80203d46:	a00d                	j	80203d68 <fileclose+0x96>
+    panic("fileclose");
+    80203d48:	00006517          	auipc	a0,0x6
+    80203d4c:	fa050513          	addi	a0,a0,-96 # 80209ce8 <digits+0x968>
+    80203d50:	ffffc097          	auipc	ra,0xffffc
+    80203d54:	3f4080e7          	jalr	1012(ra) # 80200144 <panic>
+    release(&ftable.lock);
+    80203d58:	00019517          	auipc	a0,0x19
+    80203d5c:	6f850513          	addi	a0,a0,1784 # 8021d450 <ftable>
+    80203d60:	ffffd097          	auipc	ra,0xffffd
+    80203d64:	9ba080e7          	jalr	-1606(ra) # 8020071a <release>
+  } else if (ff.type == FD_DEVICE) {
+
+  }
+}
+    80203d68:	70e2                	ld	ra,56(sp)
+    80203d6a:	7442                	ld	s0,48(sp)
+    80203d6c:	74a2                	ld	s1,40(sp)
+    80203d6e:	7902                	ld	s2,32(sp)
+    80203d70:	69e2                	ld	s3,24(sp)
+    80203d72:	6a42                	ld	s4,16(sp)
+    80203d74:	6aa2                	ld	s5,8(sp)
+    80203d76:	6121                	addi	sp,sp,64
+    80203d78:	8082                	ret
+    pipeclose(ff.pipe, ff.writable);
+    80203d7a:	85d2                	mv	a1,s4
+    80203d7c:	854e                	mv	a0,s3
+    80203d7e:	00000097          	auipc	ra,0x0
+    80203d82:	3a0080e7          	jalr	928(ra) # 8020411e <pipeclose>
+    80203d86:	b7cd                	j	80203d68 <fileclose+0x96>
+
+0000000080203d88 <filestat>:
+filestat(struct file *f, uint64 addr)
+{
+  // struct proc *p = myproc();
+  struct stat st;
+  
+  if(f->type == FD_ENTRY){
+    80203d88:	4118                	lw	a4,0(a0)
+    80203d8a:	4789                	li	a5,2
+    80203d8c:	04f71e63          	bne	a4,a5,80203de8 <filestat+0x60>
+{
+    80203d90:	7159                	addi	sp,sp,-112
+    80203d92:	f486                	sd	ra,104(sp)
+    80203d94:	f0a2                	sd	s0,96(sp)
+    80203d96:	eca6                	sd	s1,88(sp)
+    80203d98:	e8ca                	sd	s2,80(sp)
+    80203d9a:	e4ce                	sd	s3,72(sp)
+    80203d9c:	1880                	addi	s0,sp,112
+    80203d9e:	84aa                	mv	s1,a0
+    80203da0:	892e                	mv	s2,a1
+    elock(f->ep);
+    80203da2:	6d08                	ld	a0,24(a0)
+    80203da4:	00003097          	auipc	ra,0x3
+    80203da8:	8ca080e7          	jalr	-1846(ra) # 8020666e <elock>
+    estat(f->ep, &st);
+    80203dac:	f9840993          	addi	s3,s0,-104
+    80203db0:	85ce                	mv	a1,s3
+    80203db2:	6c88                	ld	a0,24(s1)
+    80203db4:	00003097          	auipc	ra,0x3
+    80203db8:	a76080e7          	jalr	-1418(ra) # 8020682a <estat>
+    eunlock(f->ep);
+    80203dbc:	6c88                	ld	a0,24(s1)
+    80203dbe:	00003097          	auipc	ra,0x3
+    80203dc2:	8e6080e7          	jalr	-1818(ra) # 802066a4 <eunlock>
+    // if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0)
+    if(copyout2(addr, (char *)&st, sizeof(st)) < 0)
+    80203dc6:	03800613          	li	a2,56
+    80203dca:	85ce                	mv	a1,s3
+    80203dcc:	854a                	mv	a0,s2
+    80203dce:	ffffd097          	auipc	ra,0xffffd
+    80203dd2:	5a4080e7          	jalr	1444(ra) # 80201372 <copyout2>
+    80203dd6:	41f5551b          	sraiw	a0,a0,0x1f
+      return -1;
+    return 0;
+  }
+  return -1;
+}
+    80203dda:	70a6                	ld	ra,104(sp)
+    80203ddc:	7406                	ld	s0,96(sp)
+    80203dde:	64e6                	ld	s1,88(sp)
+    80203de0:	6946                	ld	s2,80(sp)
+    80203de2:	69a6                	ld	s3,72(sp)
+    80203de4:	6165                	addi	sp,sp,112
+    80203de6:	8082                	ret
+  return -1;
+    80203de8:	557d                	li	a0,-1
+}
+    80203dea:	8082                	ret
+
+0000000080203dec <fileread>:
+
+// Read from file f.
+// addr is a user virtual address.
+int
+fileread(struct file *f, uint64 addr, int n)
+{
+    80203dec:	7179                	addi	sp,sp,-48
+    80203dee:	f406                	sd	ra,40(sp)
+    80203df0:	f022                	sd	s0,32(sp)
+    80203df2:	ec26                	sd	s1,24(sp)
+    80203df4:	e84a                	sd	s2,16(sp)
+    80203df6:	e44e                	sd	s3,8(sp)
+    80203df8:	1800                	addi	s0,sp,48
+  int r = 0;
+
+  if(f->readable == 0)
+    80203dfa:	00854783          	lbu	a5,8(a0)
+    80203dfe:	c3d5                	beqz	a5,80203ea2 <fileread+0xb6>
+    80203e00:	84aa                	mv	s1,a0
+    80203e02:	89ae                	mv	s3,a1
+    80203e04:	8932                	mv	s2,a2
+    return -1;
+
+  switch (f->type) {
+    80203e06:	411c                	lw	a5,0(a0)
+    80203e08:	4709                	li	a4,2
+    80203e0a:	06e78263          	beq	a5,a4,80203e6e <fileread+0x82>
+    80203e0e:	470d                	li	a4,3
+    80203e10:	02e78b63          	beq	a5,a4,80203e46 <fileread+0x5a>
+    80203e14:	4705                	li	a4,1
+    80203e16:	00e78a63          	beq	a5,a4,80203e2a <fileread+0x3e>
+          if((r = eread(f->ep, 1, addr, f->off, n)) > 0)
+            f->off += r;
+        eunlock(f->ep);
+        break;
+    default:
+      panic("fileread");
+    80203e1a:	00006517          	auipc	a0,0x6
+    80203e1e:	ede50513          	addi	a0,a0,-290 # 80209cf8 <digits+0x978>
+    80203e22:	ffffc097          	auipc	ra,0xffffc
+    80203e26:	322080e7          	jalr	802(ra) # 80200144 <panic>
+        r = piperead(f->pipe, addr, n);
+    80203e2a:	6908                	ld	a0,16(a0)
+    80203e2c:	00000097          	auipc	ra,0x0
+    80203e30:	466080e7          	jalr	1126(ra) # 80204292 <piperead>
+    80203e34:	892a                	mv	s2,a0
+  }
+
+  return r;
+}
+    80203e36:	854a                	mv	a0,s2
+    80203e38:	70a2                	ld	ra,40(sp)
+    80203e3a:	7402                	ld	s0,32(sp)
+    80203e3c:	64e2                	ld	s1,24(sp)
+    80203e3e:	6942                	ld	s2,16(sp)
+    80203e40:	69a2                	ld	s3,8(sp)
+    80203e42:	6145                	addi	sp,sp,48
+    80203e44:	8082                	ret
+        if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read)
+    80203e46:	02451783          	lh	a5,36(a0)
+    80203e4a:	03079693          	slli	a3,a5,0x30
+    80203e4e:	92c1                	srli	a3,a3,0x30
+    80203e50:	4725                	li	a4,9
+    80203e52:	04d76a63          	bltu	a4,a3,80203ea6 <fileread+0xba>
+    80203e56:	0792                	slli	a5,a5,0x4
+    80203e58:	00019717          	auipc	a4,0x19
+    80203e5c:	55870713          	addi	a4,a4,1368 # 8021d3b0 <devsw>
+    80203e60:	97ba                	add	a5,a5,a4
+    80203e62:	639c                	ld	a5,0(a5)
+    80203e64:	c3b9                	beqz	a5,80203eaa <fileread+0xbe>
+        r = devsw[f->major].read(1, addr, n);
+    80203e66:	4505                	li	a0,1
+    80203e68:	9782                	jalr	a5
+    80203e6a:	892a                	mv	s2,a0
+        break;
+    80203e6c:	b7e9                	j	80203e36 <fileread+0x4a>
+        elock(f->ep);
+    80203e6e:	6d08                	ld	a0,24(a0)
+    80203e70:	00002097          	auipc	ra,0x2
+    80203e74:	7fe080e7          	jalr	2046(ra) # 8020666e <elock>
+          if((r = eread(f->ep, 1, addr, f->off, n)) > 0)
+    80203e78:	874a                	mv	a4,s2
+    80203e7a:	5094                	lw	a3,32(s1)
+    80203e7c:	864e                	mv	a2,s3
+    80203e7e:	4585                	li	a1,1
+    80203e80:	6c88                	ld	a0,24(s1)
+    80203e82:	00002097          	auipc	ra,0x2
+    80203e86:	ee8080e7          	jalr	-280(ra) # 80205d6a <eread>
+    80203e8a:	892a                	mv	s2,a0
+    80203e8c:	00a05563          	blez	a0,80203e96 <fileread+0xaa>
+            f->off += r;
+    80203e90:	509c                	lw	a5,32(s1)
+    80203e92:	9fa9                	addw	a5,a5,a0
+    80203e94:	d09c                	sw	a5,32(s1)
+        eunlock(f->ep);
+    80203e96:	6c88                	ld	a0,24(s1)
+    80203e98:	00003097          	auipc	ra,0x3
+    80203e9c:	80c080e7          	jalr	-2036(ra) # 802066a4 <eunlock>
+        break;
+    80203ea0:	bf59                	j	80203e36 <fileread+0x4a>
+    return -1;
+    80203ea2:	597d                	li	s2,-1
+    80203ea4:	bf49                	j	80203e36 <fileread+0x4a>
+          return -1;
+    80203ea6:	597d                	li	s2,-1
+    80203ea8:	b779                	j	80203e36 <fileread+0x4a>
+    80203eaa:	597d                	li	s2,-1
+    80203eac:	b769                	j	80203e36 <fileread+0x4a>
+
+0000000080203eae <filewrite>:
+
+// Write to file f.
+// addr is a user virtual address.
+int
+filewrite(struct file *f, uint64 addr, int n)
+{
+    80203eae:	7179                	addi	sp,sp,-48
+    80203eb0:	f406                	sd	ra,40(sp)
+    80203eb2:	f022                	sd	s0,32(sp)
+    80203eb4:	ec26                	sd	s1,24(sp)
+    80203eb6:	e84a                	sd	s2,16(sp)
+    80203eb8:	e44e                	sd	s3,8(sp)
+    80203eba:	e052                	sd	s4,0(sp)
+    80203ebc:	1800                	addi	s0,sp,48
+  int ret = 0;
+
+  if(f->writable == 0)
+    80203ebe:	00954783          	lbu	a5,9(a0)
+    80203ec2:	cbc5                	beqz	a5,80203f72 <filewrite+0xc4>
+    80203ec4:	84aa                	mv	s1,a0
+    80203ec6:	892e                	mv	s2,a1
+    80203ec8:	89b2                	mv	s3,a2
+    return -1;
+
+  if(f->type == FD_PIPE){
+    80203eca:	411c                	lw	a5,0(a0)
+    80203ecc:	4705                	li	a4,1
+    80203ece:	04e78963          	beq	a5,a4,80203f20 <filewrite+0x72>
+    ret = pipewrite(f->pipe, addr, n);
+  } else if(f->type == FD_DEVICE){
+    80203ed2:	470d                	li	a4,3
+    80203ed4:	04e78d63          	beq	a5,a4,80203f2e <filewrite+0x80>
+    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_ENTRY){
+    80203ed8:	4709                	li	a4,2
+    80203eda:	08e79463          	bne	a5,a4,80203f62 <filewrite+0xb4>
+    elock(f->ep);
+    80203ede:	6d08                	ld	a0,24(a0)
+    80203ee0:	00002097          	auipc	ra,0x2
+    80203ee4:	78e080e7          	jalr	1934(ra) # 8020666e <elock>
+    if (ewrite(f->ep, 1, addr, f->off, n) == n) {
+    80203ee8:	00098a1b          	sext.w	s4,s3
+    80203eec:	8752                	mv	a4,s4
+    80203eee:	5094                	lw	a3,32(s1)
+    80203ef0:	864a                	mv	a2,s2
+    80203ef2:	4585                	li	a1,1
+    80203ef4:	6c88                	ld	a0,24(s1)
+    80203ef6:	00002097          	auipc	ra,0x2
+    80203efa:	f6c080e7          	jalr	-148(ra) # 80205e62 <ewrite>
+      ret = n;
+      f->off += n;
+    } else {
+      ret = -1;
+    80203efe:	597d                	li	s2,-1
+    if (ewrite(f->ep, 1, addr, f->off, n) == n) {
+    80203f00:	05350b63          	beq	a0,s3,80203f56 <filewrite+0xa8>
+    }
+    eunlock(f->ep);
+    80203f04:	6c88                	ld	a0,24(s1)
+    80203f06:	00002097          	auipc	ra,0x2
+    80203f0a:	79e080e7          	jalr	1950(ra) # 802066a4 <eunlock>
+  } else {
+    panic("filewrite");
+  }
+
+  return ret;
+}
+    80203f0e:	854a                	mv	a0,s2
+    80203f10:	70a2                	ld	ra,40(sp)
+    80203f12:	7402                	ld	s0,32(sp)
+    80203f14:	64e2                	ld	s1,24(sp)
+    80203f16:	6942                	ld	s2,16(sp)
+    80203f18:	69a2                	ld	s3,8(sp)
+    80203f1a:	6a02                	ld	s4,0(sp)
+    80203f1c:	6145                	addi	sp,sp,48
+    80203f1e:	8082                	ret
+    ret = pipewrite(f->pipe, addr, n);
+    80203f20:	6908                	ld	a0,16(a0)
+    80203f22:	00000097          	auipc	ra,0x0
+    80203f26:	26c080e7          	jalr	620(ra) # 8020418e <pipewrite>
+    80203f2a:	892a                	mv	s2,a0
+    80203f2c:	b7cd                	j	80203f0e <filewrite+0x60>
+    if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write)
+    80203f2e:	02451783          	lh	a5,36(a0)
+    80203f32:	03079693          	slli	a3,a5,0x30
+    80203f36:	92c1                	srli	a3,a3,0x30
+    80203f38:	4725                	li	a4,9
+    80203f3a:	02d76e63          	bltu	a4,a3,80203f76 <filewrite+0xc8>
+    80203f3e:	0792                	slli	a5,a5,0x4
+    80203f40:	00019717          	auipc	a4,0x19
+    80203f44:	47070713          	addi	a4,a4,1136 # 8021d3b0 <devsw>
+    80203f48:	97ba                	add	a5,a5,a4
+    80203f4a:	679c                	ld	a5,8(a5)
+    80203f4c:	c79d                	beqz	a5,80203f7a <filewrite+0xcc>
+    ret = devsw[f->major].write(1, addr, n);
+    80203f4e:	4505                	li	a0,1
+    80203f50:	9782                	jalr	a5
+    80203f52:	892a                	mv	s2,a0
+    80203f54:	bf6d                	j	80203f0e <filewrite+0x60>
+      f->off += n;
+    80203f56:	509c                	lw	a5,32(s1)
+    80203f58:	014787bb          	addw	a5,a5,s4
+    80203f5c:	d09c                	sw	a5,32(s1)
+      ret = n;
+    80203f5e:	894e                	mv	s2,s3
+    80203f60:	b755                	j	80203f04 <filewrite+0x56>
+    panic("filewrite");
+    80203f62:	00006517          	auipc	a0,0x6
+    80203f66:	da650513          	addi	a0,a0,-602 # 80209d08 <digits+0x988>
+    80203f6a:	ffffc097          	auipc	ra,0xffffc
+    80203f6e:	1da080e7          	jalr	474(ra) # 80200144 <panic>
+    return -1;
+    80203f72:	597d                	li	s2,-1
+    80203f74:	bf69                	j	80203f0e <filewrite+0x60>
+      return -1;
+    80203f76:	597d                	li	s2,-1
+    80203f78:	bf59                	j	80203f0e <filewrite+0x60>
+    80203f7a:	597d                	li	s2,-1
+    80203f7c:	bf49                	j	80203f0e <filewrite+0x60>
+
+0000000080203f7e <dirnext>:
+int
+dirnext(struct file *f, uint64 addr)
+{
+  // struct proc *p = myproc();
+
+  if(f->readable == 0 || !(f->ep->attribute & ATTR_DIRECTORY))
+    80203f7e:	00854783          	lbu	a5,8(a0)
+    80203f82:	cfdd                	beqz	a5,80204040 <dirnext+0xc2>
+{
+    80203f84:	7141                	addi	sp,sp,-496
+    80203f86:	f786                	sd	ra,488(sp)
+    80203f88:	f3a2                	sd	s0,480(sp)
+    80203f8a:	efa6                	sd	s1,472(sp)
+    80203f8c:	ebca                	sd	s2,464(sp)
+    80203f8e:	e7ce                	sd	s3,456(sp)
+    80203f90:	e3d2                	sd	s4,448(sp)
+    80203f92:	ff56                	sd	s5,440(sp)
+    80203f94:	1b80                	addi	s0,sp,496
+    80203f96:	84aa                	mv	s1,a0
+    80203f98:	8aae                	mv	s5,a1
+  if(f->readable == 0 || !(f->ep->attribute & ATTR_DIRECTORY))
+    80203f9a:	6d18                	ld	a4,24(a0)
+    80203f9c:	10074783          	lbu	a5,256(a4)
+    80203fa0:	8bc1                	andi	a5,a5,16
+    return -1;
+    80203fa2:	557d                	li	a0,-1
+  if(f->readable == 0 || !(f->ep->attribute & ATTR_DIRECTORY))
+    80203fa4:	eb91                	bnez	a5,80203fb8 <dirnext+0x3a>
+  // if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0)
+  if(copyout2(addr, (char *)&st, sizeof(st)) < 0)
+    return -1;
+
+  return 1;
+    80203fa6:	70be                	ld	ra,488(sp)
+    80203fa8:	741e                	ld	s0,480(sp)
+    80203faa:	64fe                	ld	s1,472(sp)
+    80203fac:	695e                	ld	s2,464(sp)
+    80203fae:	69be                	ld	s3,456(sp)
+    80203fb0:	6a1e                	ld	s4,448(sp)
+    80203fb2:	7afa                	ld	s5,440(sp)
+    80203fb4:	617d                	addi	sp,sp,496
+    80203fb6:	8082                	ret
+  int count = 0;
+    80203fb8:	e0042e23          	sw	zero,-484(s0)
+  elock(f->ep);
+    80203fbc:	853a                	mv	a0,a4
+    80203fbe:	00002097          	auipc	ra,0x2
+    80203fc2:	6b0080e7          	jalr	1712(ra) # 8020666e <elock>
+  while ((ret = enext(f->ep, &de, f->off, &count)) == 0) {  // skip empty entry
+    80203fc6:	e1c40a13          	addi	s4,s0,-484
+    80203fca:	e5840993          	addi	s3,s0,-424
+    80203fce:	a801                	j	80203fde <dirnext+0x60>
+    f->off += count * 32;
+    80203fd0:	e1c42783          	lw	a5,-484(s0)
+    80203fd4:	0057979b          	slliw	a5,a5,0x5
+    80203fd8:	5098                	lw	a4,32(s1)
+    80203fda:	9fb9                	addw	a5,a5,a4
+    80203fdc:	d09c                	sw	a5,32(s1)
+  while ((ret = enext(f->ep, &de, f->off, &count)) == 0) {  // skip empty entry
+    80203fde:	86d2                	mv	a3,s4
+    80203fe0:	5090                	lw	a2,32(s1)
+    80203fe2:	85ce                	mv	a1,s3
+    80203fe4:	6c88                	ld	a0,24(s1)
+    80203fe6:	00003097          	auipc	ra,0x3
+    80203fea:	88c080e7          	jalr	-1908(ra) # 80206872 <enext>
+    80203fee:	892a                	mv	s2,a0
+    80203ff0:	d165                	beqz	a0,80203fd0 <dirnext+0x52>
+  eunlock(f->ep);
+    80203ff2:	6c88                	ld	a0,24(s1)
+    80203ff4:	00002097          	auipc	ra,0x2
+    80203ff8:	6b0080e7          	jalr	1712(ra) # 802066a4 <eunlock>
+  if (ret == -1)
+    80203ffc:	57fd                	li	a5,-1
+    return 0;
+    80203ffe:	4501                	li	a0,0
+  if (ret == -1)
+    80204000:	faf903e3          	beq	s2,a5,80203fa6 <dirnext+0x28>
+  f->off += count * 32;
+    80204004:	e1c42783          	lw	a5,-484(s0)
+    80204008:	0057979b          	slliw	a5,a5,0x5
+    8020400c:	5098                	lw	a4,32(s1)
+    8020400e:	9fb9                	addw	a5,a5,a4
+    80204010:	d09c                	sw	a5,32(s1)
+  estat(&de, &st);
+    80204012:	e2040493          	addi	s1,s0,-480
+    80204016:	85a6                	mv	a1,s1
+    80204018:	e5840513          	addi	a0,s0,-424
+    8020401c:	00003097          	auipc	ra,0x3
+    80204020:	80e080e7          	jalr	-2034(ra) # 8020682a <estat>
+  if(copyout2(addr, (char *)&st, sizeof(st)) < 0)
+    80204024:	03800613          	li	a2,56
+    80204028:	85a6                	mv	a1,s1
+    8020402a:	8556                	mv	a0,s5
+    8020402c:	ffffd097          	auipc	ra,0xffffd
+    80204030:	346080e7          	jalr	838(ra) # 80201372 <copyout2>
+    return -1;
+    80204034:	fff54513          	not	a0,a0
+    80204038:	957d                	srai	a0,a0,0x3f
+    8020403a:	8909                	andi	a0,a0,2
+    8020403c:	157d                	addi	a0,a0,-1
+    8020403e:	b7a5                	j	80203fa6 <dirnext+0x28>
+    return -1;
+    80204040:	557d                	li	a0,-1
+    80204042:	8082                	ret
+
+0000000080204044 <pipealloc>:
+#include "include/kalloc.h"
+#include "include/vm.h"
+
+int
+pipealloc(struct file **f0, struct file **f1)
+{
+    80204044:	7179                	addi	sp,sp,-48
+    80204046:	f406                	sd	ra,40(sp)
+    80204048:	f022                	sd	s0,32(sp)
+    8020404a:	ec26                	sd	s1,24(sp)
+    8020404c:	e84a                	sd	s2,16(sp)
+    8020404e:	e44e                	sd	s3,8(sp)
+    80204050:	e052                	sd	s4,0(sp)
+    80204052:	1800                	addi	s0,sp,48
+    80204054:	84aa                	mv	s1,a0
+    80204056:	8a2e                	mv	s4,a1
+  struct pipe *pi;
+
+  pi = 0;
+  *f0 = *f1 = 0;
+    80204058:	0005b023          	sd	zero,0(a1)
+    8020405c:	00053023          	sd	zero,0(a0)
+  if((*f0 = filealloc()) == NULL || (*f1 = filealloc()) == NULL)
+    80204060:	00000097          	auipc	ra,0x0
+    80204064:	bb6080e7          	jalr	-1098(ra) # 80203c16 <filealloc>
+    80204068:	e088                	sd	a0,0(s1)
+    8020406a:	c551                	beqz	a0,802040f6 <pipealloc+0xb2>
+    8020406c:	00000097          	auipc	ra,0x0
+    80204070:	baa080e7          	jalr	-1110(ra) # 80203c16 <filealloc>
+    80204074:	00aa3023          	sd	a0,0(s4)
+    80204078:	c92d                	beqz	a0,802040ea <pipealloc+0xa6>
+    goto bad;
+  if((pi = (struct pipe*)kalloc()) == NULL)
+    8020407a:	ffffc097          	auipc	ra,0xffffc
+    8020407e:	4e0080e7          	jalr	1248(ra) # 8020055a <kalloc>
+    80204082:	892a                	mv	s2,a0
+    80204084:	c125                	beqz	a0,802040e4 <pipealloc+0xa0>
+    goto bad;
+  pi->readopen = 1;
+    80204086:	4985                	li	s3,1
+    80204088:	23352023          	sw	s3,544(a0)
+  pi->writeopen = 1;
+    8020408c:	23352223          	sw	s3,548(a0)
+  pi->nwrite = 0;
+    80204090:	20052e23          	sw	zero,540(a0)
+  pi->nread = 0;
+    80204094:	20052c23          	sw	zero,536(a0)
+  initlock(&pi->lock, "pipe");
+    80204098:	00006597          	auipc	a1,0x6
+    8020409c:	9b858593          	addi	a1,a1,-1608 # 80209a50 <digits+0x6d0>
+    802040a0:	ffffc097          	auipc	ra,0xffffc
+    802040a4:	5e2080e7          	jalr	1506(ra) # 80200682 <initlock>
+  (*f0)->type = FD_PIPE;
+    802040a8:	609c                	ld	a5,0(s1)
+    802040aa:	0137a023          	sw	s3,0(a5)
+  (*f0)->readable = 1;
+    802040ae:	609c                	ld	a5,0(s1)
+    802040b0:	01378423          	sb	s3,8(a5)
+  (*f0)->writable = 0;
+    802040b4:	609c                	ld	a5,0(s1)
+    802040b6:	000784a3          	sb	zero,9(a5)
+  (*f0)->pipe = pi;
+    802040ba:	609c                	ld	a5,0(s1)
+    802040bc:	0127b823          	sd	s2,16(a5)
+  (*f1)->type = FD_PIPE;
+    802040c0:	000a3783          	ld	a5,0(s4)
+    802040c4:	0137a023          	sw	s3,0(a5)
+  (*f1)->readable = 0;
+    802040c8:	000a3783          	ld	a5,0(s4)
+    802040cc:	00078423          	sb	zero,8(a5)
+  (*f1)->writable = 1;
+    802040d0:	000a3783          	ld	a5,0(s4)
+    802040d4:	013784a3          	sb	s3,9(a5)
+  (*f1)->pipe = pi;
+    802040d8:	000a3783          	ld	a5,0(s4)
+    802040dc:	0127b823          	sd	s2,16(a5)
+  return 0;
+    802040e0:	4501                	li	a0,0
+    802040e2:	a025                	j	8020410a <pipealloc+0xc6>
+
+ bad:
+  if(pi)
+    kfree((char*)pi);
+  if(*f0)
+    802040e4:	6088                	ld	a0,0(s1)
+    802040e6:	e501                	bnez	a0,802040ee <pipealloc+0xaa>
+    802040e8:	a039                	j	802040f6 <pipealloc+0xb2>
+    802040ea:	6088                	ld	a0,0(s1)
+    802040ec:	c51d                	beqz	a0,8020411a <pipealloc+0xd6>
+    fileclose(*f0);
+    802040ee:	00000097          	auipc	ra,0x0
+    802040f2:	be4080e7          	jalr	-1052(ra) # 80203cd2 <fileclose>
+  if(*f1)
+    802040f6:	000a3783          	ld	a5,0(s4)
+    fileclose(*f1);
+  return -1;
+    802040fa:	557d                	li	a0,-1
+  if(*f1)
+    802040fc:	c799                	beqz	a5,8020410a <pipealloc+0xc6>
+    fileclose(*f1);
+    802040fe:	853e                	mv	a0,a5
+    80204100:	00000097          	auipc	ra,0x0
+    80204104:	bd2080e7          	jalr	-1070(ra) # 80203cd2 <fileclose>
+  return -1;
+    80204108:	557d                	li	a0,-1
+}
+    8020410a:	70a2                	ld	ra,40(sp)
+    8020410c:	7402                	ld	s0,32(sp)
+    8020410e:	64e2                	ld	s1,24(sp)
+    80204110:	6942                	ld	s2,16(sp)
+    80204112:	69a2                	ld	s3,8(sp)
+    80204114:	6a02                	ld	s4,0(sp)
+    80204116:	6145                	addi	sp,sp,48
+    80204118:	8082                	ret
+  return -1;
+    8020411a:	557d                	li	a0,-1
+    8020411c:	b7fd                	j	8020410a <pipealloc+0xc6>
+
+000000008020411e <pipeclose>:
+
+void
+pipeclose(struct pipe *pi, int writable)
+{
+    8020411e:	1101                	addi	sp,sp,-32
+    80204120:	ec06                	sd	ra,24(sp)
+    80204122:	e822                	sd	s0,16(sp)
+    80204124:	e426                	sd	s1,8(sp)
+    80204126:	e04a                	sd	s2,0(sp)
+    80204128:	1000                	addi	s0,sp,32
+    8020412a:	84aa                	mv	s1,a0
+    8020412c:	892e                	mv	s2,a1
+  acquire(&pi->lock);
+    8020412e:	ffffc097          	auipc	ra,0xffffc
+    80204132:	598080e7          	jalr	1432(ra) # 802006c6 <acquire>
+  if(writable){
+    80204136:	02090d63          	beqz	s2,80204170 <pipeclose+0x52>
+    pi->writeopen = 0;
+    8020413a:	2204a223          	sw	zero,548(s1)
+    wakeup(&pi->nread);
+    8020413e:	21848513          	addi	a0,s1,536
+    80204142:	ffffe097          	auipc	ra,0xffffe
+    80204146:	54a080e7          	jalr	1354(ra) # 8020268c <wakeup>
+  } else {
+    pi->readopen = 0;
+    wakeup(&pi->nwrite);
+  }
+  if(pi->readopen == 0 && pi->writeopen == 0){
+    8020414a:	2204b783          	ld	a5,544(s1)
+    8020414e:	eb95                	bnez	a5,80204182 <pipeclose+0x64>
+    release(&pi->lock);
+    80204150:	8526                	mv	a0,s1
+    80204152:	ffffc097          	auipc	ra,0xffffc
+    80204156:	5c8080e7          	jalr	1480(ra) # 8020071a <release>
+    kfree((char*)pi);
+    8020415a:	8526                	mv	a0,s1
+    8020415c:	ffffc097          	auipc	ra,0xffffc
+    80204160:	2e4080e7          	jalr	740(ra) # 80200440 <kfree>
+  } else
+    release(&pi->lock);
+}
+    80204164:	60e2                	ld	ra,24(sp)
+    80204166:	6442                	ld	s0,16(sp)
+    80204168:	64a2                	ld	s1,8(sp)
+    8020416a:	6902                	ld	s2,0(sp)
+    8020416c:	6105                	addi	sp,sp,32
+    8020416e:	8082                	ret
+    pi->readopen = 0;
+    80204170:	2204a023          	sw	zero,544(s1)
+    wakeup(&pi->nwrite);
+    80204174:	21c48513          	addi	a0,s1,540
+    80204178:	ffffe097          	auipc	ra,0xffffe
+    8020417c:	514080e7          	jalr	1300(ra) # 8020268c <wakeup>
+    80204180:	b7e9                	j	8020414a <pipeclose+0x2c>
+    release(&pi->lock);
+    80204182:	8526                	mv	a0,s1
+    80204184:	ffffc097          	auipc	ra,0xffffc
+    80204188:	596080e7          	jalr	1430(ra) # 8020071a <release>
+}
+    8020418c:	bfe1                	j	80204164 <pipeclose+0x46>
+
+000000008020418e <pipewrite>:
+
+int
+pipewrite(struct pipe *pi, uint64 addr, int n)
+{
+    8020418e:	7159                	addi	sp,sp,-112
+    80204190:	f486                	sd	ra,104(sp)
+    80204192:	f0a2                	sd	s0,96(sp)
+    80204194:	eca6                	sd	s1,88(sp)
+    80204196:	e8ca                	sd	s2,80(sp)
+    80204198:	e4ce                	sd	s3,72(sp)
+    8020419a:	e0d2                	sd	s4,64(sp)
+    8020419c:	fc56                	sd	s5,56(sp)
+    8020419e:	f85a                	sd	s6,48(sp)
+    802041a0:	f45e                	sd	s7,40(sp)
+    802041a2:	f062                	sd	s8,32(sp)
+    802041a4:	ec66                	sd	s9,24(sp)
+    802041a6:	1880                	addi	s0,sp,112
+    802041a8:	84aa                	mv	s1,a0
+    802041aa:	8b2e                	mv	s6,a1
+    802041ac:	8ab2                	mv	s5,a2
+  int i;
+  char ch;
+  struct proc *pr = myproc();
+    802041ae:	ffffe097          	auipc	ra,0xffffe
+    802041b2:	88e080e7          	jalr	-1906(ra) # 80201a3c <myproc>
+    802041b6:	892a                	mv	s2,a0
+
+  acquire(&pi->lock);
+    802041b8:	8526                	mv	a0,s1
+    802041ba:	ffffc097          	auipc	ra,0xffffc
+    802041be:	50c080e7          	jalr	1292(ra) # 802006c6 <acquire>
+  for(i = 0; i < n; i++){
+    802041c2:	09505763          	blez	s5,80204250 <pipewrite+0xc2>
+    802041c6:	4b81                	li	s7,0
+    while(pi->nwrite == pi->nread + PIPESIZE){  //DOC: pipewrite-full
+      if(pi->readopen == 0 || pr->killed){
+        release(&pi->lock);
+        return -1;
+      }
+      wakeup(&pi->nread);
+    802041c8:	21848a13          	addi	s4,s1,536
+      sleep(&pi->nwrite, &pi->lock);
+    802041cc:	21c48993          	addi	s3,s1,540
+    }
+    // if(copyin(pr->pagetable, &ch, addr + i, 1) == -1)
+    if(copyin2(&ch, addr + i, 1) == -1)
+    802041d0:	f9f40c93          	addi	s9,s0,-97
+    802041d4:	5c7d                	li	s8,-1
+    while(pi->nwrite == pi->nread + PIPESIZE){  //DOC: pipewrite-full
+    802041d6:	2184a783          	lw	a5,536(s1)
+    802041da:	21c4a703          	lw	a4,540(s1)
+    802041de:	2007879b          	addiw	a5,a5,512
+    802041e2:	02f71b63          	bne	a4,a5,80204218 <pipewrite+0x8a>
+      if(pi->readopen == 0 || pr->killed){
+    802041e6:	2204a783          	lw	a5,544(s1)
+    802041ea:	c3c1                	beqz	a5,8020426a <pipewrite+0xdc>
+    802041ec:	03092783          	lw	a5,48(s2)
+    802041f0:	efad                	bnez	a5,8020426a <pipewrite+0xdc>
+      wakeup(&pi->nread);
+    802041f2:	8552                	mv	a0,s4
+    802041f4:	ffffe097          	auipc	ra,0xffffe
+    802041f8:	498080e7          	jalr	1176(ra) # 8020268c <wakeup>
+      sleep(&pi->nwrite, &pi->lock);
+    802041fc:	85a6                	mv	a1,s1
+    802041fe:	854e                	mv	a0,s3
+    80204200:	ffffe097          	auipc	ra,0xffffe
+    80204204:	1f4080e7          	jalr	500(ra) # 802023f4 <sleep>
+    while(pi->nwrite == pi->nread + PIPESIZE){  //DOC: pipewrite-full
+    80204208:	2184a783          	lw	a5,536(s1)
+    8020420c:	21c4a703          	lw	a4,540(s1)
+    80204210:	2007879b          	addiw	a5,a5,512
+    80204214:	fcf709e3          	beq	a4,a5,802041e6 <pipewrite+0x58>
+    if(copyin2(&ch, addr + i, 1) == -1)
+    80204218:	4605                	li	a2,1
+    8020421a:	85da                	mv	a1,s6
+    8020421c:	8566                	mv	a0,s9
+    8020421e:	ffffd097          	auipc	ra,0xffffd
+    80204222:	234080e7          	jalr	564(ra) # 80201452 <copyin2>
+    80204226:	03850663          	beq	a0,s8,80204252 <pipewrite+0xc4>
+      break;
+    pi->data[pi->nwrite++ % PIPESIZE] = ch;
+    8020422a:	21c4a783          	lw	a5,540(s1)
+    8020422e:	0017871b          	addiw	a4,a5,1
+    80204232:	20e4ae23          	sw	a4,540(s1)
+    80204236:	1ff7f793          	andi	a5,a5,511
+    8020423a:	97a6                	add	a5,a5,s1
+    8020423c:	f9f44703          	lbu	a4,-97(s0)
+    80204240:	00e78c23          	sb	a4,24(a5)
+  for(i = 0; i < n; i++){
+    80204244:	2b85                	addiw	s7,s7,1
+    80204246:	0b05                	addi	s6,s6,1
+    80204248:	f97a97e3          	bne	s5,s7,802041d6 <pipewrite+0x48>
+    8020424c:	8bd6                	mv	s7,s5
+    8020424e:	a011                	j	80204252 <pipewrite+0xc4>
+    80204250:	4b81                	li	s7,0
+  }
+  wakeup(&pi->nread);
+    80204252:	21848513          	addi	a0,s1,536
+    80204256:	ffffe097          	auipc	ra,0xffffe
+    8020425a:	436080e7          	jalr	1078(ra) # 8020268c <wakeup>
+  release(&pi->lock);
+    8020425e:	8526                	mv	a0,s1
+    80204260:	ffffc097          	auipc	ra,0xffffc
+    80204264:	4ba080e7          	jalr	1210(ra) # 8020071a <release>
+  return i;
+    80204268:	a039                	j	80204276 <pipewrite+0xe8>
+        release(&pi->lock);
+    8020426a:	8526                	mv	a0,s1
+    8020426c:	ffffc097          	auipc	ra,0xffffc
+    80204270:	4ae080e7          	jalr	1198(ra) # 8020071a <release>
+        return -1;
+    80204274:	5bfd                	li	s7,-1
+}
+    80204276:	855e                	mv	a0,s7
+    80204278:	70a6                	ld	ra,104(sp)
+    8020427a:	7406                	ld	s0,96(sp)
+    8020427c:	64e6                	ld	s1,88(sp)
+    8020427e:	6946                	ld	s2,80(sp)
+    80204280:	69a6                	ld	s3,72(sp)
+    80204282:	6a06                	ld	s4,64(sp)
+    80204284:	7ae2                	ld	s5,56(sp)
+    80204286:	7b42                	ld	s6,48(sp)
+    80204288:	7ba2                	ld	s7,40(sp)
+    8020428a:	7c02                	ld	s8,32(sp)
+    8020428c:	6ce2                	ld	s9,24(sp)
+    8020428e:	6165                	addi	sp,sp,112
+    80204290:	8082                	ret
+
+0000000080204292 <piperead>:
+
+int
+piperead(struct pipe *pi, uint64 addr, int n)
+{
+    80204292:	715d                	addi	sp,sp,-80
+    80204294:	e486                	sd	ra,72(sp)
+    80204296:	e0a2                	sd	s0,64(sp)
+    80204298:	fc26                	sd	s1,56(sp)
+    8020429a:	f84a                	sd	s2,48(sp)
+    8020429c:	f44e                	sd	s3,40(sp)
+    8020429e:	f052                	sd	s4,32(sp)
+    802042a0:	ec56                	sd	s5,24(sp)
+    802042a2:	e85a                	sd	s6,16(sp)
+    802042a4:	0880                	addi	s0,sp,80
+    802042a6:	84aa                	mv	s1,a0
+    802042a8:	892e                	mv	s2,a1
+    802042aa:	8a32                	mv	s4,a2
+  int i;
+  struct proc *pr = myproc();
+    802042ac:	ffffd097          	auipc	ra,0xffffd
+    802042b0:	790080e7          	jalr	1936(ra) # 80201a3c <myproc>
+    802042b4:	89aa                	mv	s3,a0
+  char ch;
+
+  acquire(&pi->lock);
+    802042b6:	8526                	mv	a0,s1
+    802042b8:	ffffc097          	auipc	ra,0xffffc
+    802042bc:	40e080e7          	jalr	1038(ra) # 802006c6 <acquire>
+  while(pi->nread == pi->nwrite && pi->writeopen){  //DOC: pipe-empty
+    802042c0:	2184a703          	lw	a4,536(s1)
+    802042c4:	21c4a783          	lw	a5,540(s1)
+    if(pr->killed){
+      release(&pi->lock);
+      return -1;
+    }
+    sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep
+    802042c8:	21848a93          	addi	s5,s1,536
+  while(pi->nread == pi->nwrite && pi->writeopen){  //DOC: pipe-empty
+    802042cc:	02f71463          	bne	a4,a5,802042f4 <piperead+0x62>
+    802042d0:	2244a783          	lw	a5,548(s1)
+    802042d4:	c385                	beqz	a5,802042f4 <piperead+0x62>
+    if(pr->killed){
+    802042d6:	0309a783          	lw	a5,48(s3)
+    802042da:	ebc1                	bnez	a5,8020436a <piperead+0xd8>
+    sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep
+    802042dc:	85a6                	mv	a1,s1
+    802042de:	8556                	mv	a0,s5
+    802042e0:	ffffe097          	auipc	ra,0xffffe
+    802042e4:	114080e7          	jalr	276(ra) # 802023f4 <sleep>
+  while(pi->nread == pi->nwrite && pi->writeopen){  //DOC: pipe-empty
+    802042e8:	2184a703          	lw	a4,536(s1)
+    802042ec:	21c4a783          	lw	a5,540(s1)
+    802042f0:	fef700e3          	beq	a4,a5,802042d0 <piperead+0x3e>
+  }
+  for(i = 0; i < n; i++){  //DOC: piperead-copy
+    802042f4:	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)
+    if(copyout2(addr + i, &ch, 1) == -1)
+    802042f6:	fbf40b13          	addi	s6,s0,-65
+    802042fa:	5afd                	li	s5,-1
+  for(i = 0; i < n; i++){  //DOC: piperead-copy
+    802042fc:	05405163          	blez	s4,8020433e <piperead+0xac>
+    if(pi->nread == pi->nwrite)
+    80204300:	2184a783          	lw	a5,536(s1)
+    80204304:	21c4a703          	lw	a4,540(s1)
+    80204308:	02f70b63          	beq	a4,a5,8020433e <piperead+0xac>
+    ch = pi->data[pi->nread++ % PIPESIZE];
+    8020430c:	0017871b          	addiw	a4,a5,1
+    80204310:	20e4ac23          	sw	a4,536(s1)
+    80204314:	1ff7f793          	andi	a5,a5,511
+    80204318:	97a6                	add	a5,a5,s1
+    8020431a:	0187c783          	lbu	a5,24(a5)
+    8020431e:	faf40fa3          	sb	a5,-65(s0)
+    if(copyout2(addr + i, &ch, 1) == -1)
+    80204322:	4605                	li	a2,1
+    80204324:	85da                	mv	a1,s6
+    80204326:	854a                	mv	a0,s2
+    80204328:	ffffd097          	auipc	ra,0xffffd
+    8020432c:	04a080e7          	jalr	74(ra) # 80201372 <copyout2>
+    80204330:	01550763          	beq	a0,s5,8020433e <piperead+0xac>
+  for(i = 0; i < n; i++){  //DOC: piperead-copy
+    80204334:	2985                	addiw	s3,s3,1
+    80204336:	0905                	addi	s2,s2,1
+    80204338:	fd3a14e3          	bne	s4,s3,80204300 <piperead+0x6e>
+    8020433c:	89d2                	mv	s3,s4
+      break;
+  }
+  wakeup(&pi->nwrite);  //DOC: piperead-wakeup
+    8020433e:	21c48513          	addi	a0,s1,540
+    80204342:	ffffe097          	auipc	ra,0xffffe
+    80204346:	34a080e7          	jalr	842(ra) # 8020268c <wakeup>
+  release(&pi->lock);
+    8020434a:	8526                	mv	a0,s1
+    8020434c:	ffffc097          	auipc	ra,0xffffc
+    80204350:	3ce080e7          	jalr	974(ra) # 8020071a <release>
+  return i;
+}
+    80204354:	854e                	mv	a0,s3
+    80204356:	60a6                	ld	ra,72(sp)
+    80204358:	6406                	ld	s0,64(sp)
+    8020435a:	74e2                	ld	s1,56(sp)
+    8020435c:	7942                	ld	s2,48(sp)
+    8020435e:	79a2                	ld	s3,40(sp)
+    80204360:	7a02                	ld	s4,32(sp)
+    80204362:	6ae2                	ld	s5,24(sp)
+    80204364:	6b42                	ld	s6,16(sp)
+    80204366:	6161                	addi	sp,sp,80
+    80204368:	8082                	ret
+      release(&pi->lock);
+    8020436a:	8526                	mv	a0,s1
+    8020436c:	ffffc097          	auipc	ra,0xffffc
+    80204370:	3ae080e7          	jalr	942(ra) # 8020071a <release>
+      return -1;
+    80204374:	59fd                	li	s3,-1
+    80204376:	bff9                	j	80204354 <piperead+0xc2>
+
+0000000080204378 <exec>:
+  return 0;
+}
+
+
+int exec(char *path, char **argv)
+{
+    80204378:	dd010113          	addi	sp,sp,-560
+    8020437c:	22113423          	sd	ra,552(sp)
+    80204380:	22813023          	sd	s0,544(sp)
+    80204384:	20913c23          	sd	s1,536(sp)
+    80204388:	21213823          	sd	s2,528(sp)
+    8020438c:	21313423          	sd	s3,520(sp)
+    80204390:	21413023          	sd	s4,512(sp)
+    80204394:	ffd6                	sd	s5,504(sp)
+    80204396:	fbda                	sd	s6,496(sp)
+    80204398:	f7de                	sd	s7,488(sp)
+    8020439a:	f3e2                	sd	s8,480(sp)
+    8020439c:	efe6                	sd	s9,472(sp)
+    8020439e:	ebea                	sd	s10,464(sp)
+    802043a0:	e7ee                	sd	s11,456(sp)
+    802043a2:	1c00                	addi	s0,sp,560
+    802043a4:	892a                	mv	s2,a0
+    802043a6:	dca43c23          	sd	a0,-552(s0)
+    802043aa:	deb43423          	sd	a1,-536(s0)
+  struct elfhdr elf;
+  struct dirent *ep;
+  struct proghdr ph;
+  pagetable_t pagetable = 0, oldpagetable;
+  pagetable_t kpagetable = 0, oldkpagetable;
+  struct proc *p = myproc();
+    802043ae:	ffffd097          	auipc	ra,0xffffd
+    802043b2:	68e080e7          	jalr	1678(ra) # 80201a3c <myproc>
+    802043b6:	84aa                	mv	s1,a0
+
+  // Make a copy of p->kpt without old user space, 
+  // but with the same kstack we are using now, which can't be changed
+  if ((kpagetable = (pagetable_t)kalloc()) == NULL) {
+    802043b8:	ffffc097          	auipc	ra,0xffffc
+    802043bc:	1a2080e7          	jalr	418(ra) # 8020055a <kalloc>
+    802043c0:	2a050863          	beqz	a0,80204670 <exec+0x2f8>
+    802043c4:	8b2a                	mv	s6,a0
+    return -1;
+  }
+  memmove(kpagetable, p->kpagetable, PGSIZE);
+    802043c6:	6605                	lui	a2,0x1
+    802043c8:	6cac                	ld	a1,88(s1)
+    802043ca:	ffffc097          	auipc	ra,0xffffc
+    802043ce:	3f4080e7          	jalr	1012(ra) # 802007be <memmove>
+  for (int i = 0; i < PX(2, MAXUVA); i++) {
+    kpagetable[i] = 0;
+    802043d2:	000b3023          	sd	zero,0(s6)
+    802043d6:	000b3423          	sd	zero,8(s6)
+  }
+
+  if((ep = ename(path)) == NULL) {
+    802043da:	854a                	mv	a0,s2
+    802043dc:	00003097          	auipc	ra,0x3
+    802043e0:	a3a080e7          	jalr	-1478(ra) # 80206e16 <ename>
+    802043e4:	8a2a                	mv	s4,a0
+    802043e6:	3a050e63          	beqz	a0,802047a2 <exec+0x42a>
+    #ifdef DEBUG
+    printf("[exec] %s not found\n", path);
+    #endif
+    goto bad;
+  }
+  elock(ep);
+    802043ea:	00002097          	auipc	ra,0x2
+    802043ee:	284080e7          	jalr	644(ra) # 8020666e <elock>
+
+  // Check ELF header
+  if(eread(ep, 0, (uint64) &elf, 0, sizeof(elf)) != sizeof(elf))
+    802043f2:	04000713          	li	a4,64
+    802043f6:	4681                	li	a3,0
+    802043f8:	e4840613          	addi	a2,s0,-440
+    802043fc:	4581                	li	a1,0
+    802043fe:	8552                	mv	a0,s4
+    80204400:	00002097          	auipc	ra,0x2
+    80204404:	96a080e7          	jalr	-1686(ra) # 80205d6a <eread>
+    80204408:	04000793          	li	a5,64
+    8020440c:	00f51a63          	bne	a0,a5,80204420 <exec+0xa8>
+    goto bad;
+  if(elf.magic != ELF_MAGIC)
+    80204410:	e4842703          	lw	a4,-440(s0)
+    80204414:	464c47b7          	lui	a5,0x464c4
+    80204418:	57f78793          	addi	a5,a5,1407 # 464c457f <_entry-0x39d3ba81>
+    8020441c:	00f70963          	beq	a4,a5,8020442e <exec+0xb6>
+  printf("[exec] reach bad\n");
+  #endif
+  if(pagetable)
+    proc_freepagetable(pagetable, sz);
+  if(kpagetable)
+    kvmfree(kpagetable, 0);
+    80204420:	4581                	li	a1,0
+    80204422:	855a                	mv	a0,s6
+    80204424:	ffffd097          	auipc	ra,0xffffd
+    80204428:	24e080e7          	jalr	590(ra) # 80201672 <kvmfree>
+  if(ep){
+    8020442c:	a4bd                	j	8020469a <exec+0x322>
+  if((pagetable = proc_pagetable(p)) == NULL)
+    8020442e:	8526                	mv	a0,s1
+    80204430:	ffffd097          	auipc	ra,0xffffd
+    80204434:	6f0080e7          	jalr	1776(ra) # 80201b20 <proc_pagetable>
+    80204438:	e0a43423          	sd	a0,-504(s0)
+    8020443c:	d175                	beqz	a0,80204420 <exec+0xa8>
+  for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
+    8020443e:	e6842783          	lw	a5,-408(s0)
+    80204442:	e8045703          	lhu	a4,-384(s0)
+    80204446:	cb3d                	beqz	a4,802044bc <exec+0x144>
+  uint64 argc, sz = 0, sp, ustack[MAXARG+1], stackbase;
+    80204448:	4481                	li	s1,0
+  for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
+    8020444a:	e0043023          	sd	zero,-512(s0)
+    if(eread(ep, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph))
+    8020444e:	e1040713          	addi	a4,s0,-496
+    80204452:	dee43023          	sd	a4,-544(s0)
+    if(ph.vaddr % PGSIZE != 0)
+    80204456:	6a85                	lui	s5,0x1
+    80204458:	fffa8713          	addi	a4,s5,-1 # fff <_entry-0x801ff001>
+    8020445c:	dce43823          	sd	a4,-560(s0)
+  for(i = 0; i < sz; i += PGSIZE){
+    80204460:	6d85                	lui	s11,0x1
+    80204462:	7d7d                	lui	s10,0xfffff
+    80204464:	a4c9                	j	80204726 <exec+0x3ae>
+      panic("loadseg: address should exist");
+    80204466:	00006517          	auipc	a0,0x6
+    8020446a:	8b250513          	addi	a0,a0,-1870 # 80209d18 <digits+0x998>
+    8020446e:	ffffc097          	auipc	ra,0xffffc
+    80204472:	cd6080e7          	jalr	-810(ra) # 80200144 <panic>
+    if(eread(ep, 0, (uint64)pa, offset+i, n) != n)
+    80204476:	874a                	mv	a4,s2
+    80204478:	009c86bb          	addw	a3,s9,s1
+    8020447c:	4581                	li	a1,0
+    8020447e:	8552                	mv	a0,s4
+    80204480:	00002097          	auipc	ra,0x2
+    80204484:	8ea080e7          	jalr	-1814(ra) # 80205d6a <eread>
+    80204488:	2501                	sext.w	a0,a0
+    8020448a:	1ea91763          	bne	s2,a0,80204678 <exec+0x300>
+  for(i = 0; i < sz; i += PGSIZE){
+    8020448e:	009d84bb          	addw	s1,s11,s1
+    80204492:	013d09bb          	addw	s3,s10,s3
+    80204496:	2774f863          	bgeu	s1,s7,80204706 <exec+0x38e>
+    pa = walkaddr(pagetable, va + i);
+    8020449a:	02049593          	slli	a1,s1,0x20
+    8020449e:	9181                	srli	a1,a1,0x20
+    802044a0:	95e2                	add	a1,a1,s8
+    802044a2:	e0843503          	ld	a0,-504(s0)
+    802044a6:	ffffc097          	auipc	ra,0xffffc
+    802044aa:	708080e7          	jalr	1800(ra) # 80200bae <walkaddr>
+    802044ae:	862a                	mv	a2,a0
+    if(pa == NULL)
+    802044b0:	d95d                	beqz	a0,80204466 <exec+0xee>
+      n = PGSIZE;
+    802044b2:	8956                	mv	s2,s5
+    if(sz - i < PGSIZE)
+    802044b4:	fd59f1e3          	bgeu	s3,s5,80204476 <exec+0xfe>
+      n = sz - i;
+    802044b8:	894e                	mv	s2,s3
+    802044ba:	bf75                	j	80204476 <exec+0xfe>
+  uint64 argc, sz = 0, sp, ustack[MAXARG+1], stackbase;
+    802044bc:	4481                	li	s1,0
+  eunlock(ep);
+    802044be:	8552                	mv	a0,s4
+    802044c0:	00002097          	auipc	ra,0x2
+    802044c4:	1e4080e7          	jalr	484(ra) # 802066a4 <eunlock>
+  eput(ep);
+    802044c8:	8552                	mv	a0,s4
+    802044ca:	00002097          	auipc	ra,0x2
+    802044ce:	228080e7          	jalr	552(ra) # 802066f2 <eput>
+  p = myproc();
+    802044d2:	ffffd097          	auipc	ra,0xffffd
+    802044d6:	56a080e7          	jalr	1386(ra) # 80201a3c <myproc>
+    802044da:	8aaa                	mv	s5,a0
+  uint64 oldsz = p->sz;
+    802044dc:	04853d03          	ld	s10,72(a0)
+  sz = PGROUNDUP(sz);
+    802044e0:	6785                	lui	a5,0x1
+    802044e2:	17fd                	addi	a5,a5,-1 # fff <_entry-0x801ff001>
+    802044e4:	97a6                	add	a5,a5,s1
+    802044e6:	777d                	lui	a4,0xfffff
+    802044e8:	8ff9                	and	a5,a5,a4
+    802044ea:	def43823          	sd	a5,-528(s0)
+  if((sz1 = uvmalloc(pagetable, kpagetable, sz, sz + 2*PGSIZE)) == 0)
+    802044ee:	6689                	lui	a3,0x2
+    802044f0:	96be                	add	a3,a3,a5
+    802044f2:	863e                	mv	a2,a5
+    802044f4:	85da                	mv	a1,s6
+    802044f6:	e0843483          	ld	s1,-504(s0)
+    802044fa:	8526                	mv	a0,s1
+    802044fc:	ffffd097          	auipc	ra,0xffffd
+    80204500:	b0e080e7          	jalr	-1266(ra) # 8020100a <uvmalloc>
+    80204504:	8caa                	mv	s9,a0
+  ep = 0;
+    80204506:	4a01                	li	s4,0
+  if((sz1 = uvmalloc(pagetable, kpagetable, sz, sz + 2*PGSIZE)) == 0)
+    80204508:	16050863          	beqz	a0,80204678 <exec+0x300>
+  uvmclear(pagetable, sz-2*PGSIZE);
+    8020450c:	75f9                	lui	a1,0xffffe
+    8020450e:	95aa                	add	a1,a1,a0
+    80204510:	8526                	mv	a0,s1
+    80204512:	ffffd097          	auipc	ra,0xffffd
+    80204516:	da2080e7          	jalr	-606(ra) # 802012b4 <uvmclear>
+  stackbase = sp - PGSIZE;
+    8020451a:	7bfd                	lui	s7,0xfffff
+    8020451c:	9be6                	add	s7,s7,s9
+  for(argc = 0; argv[argc]; argc++) {
+    8020451e:	de843783          	ld	a5,-536(s0)
+    80204522:	6388                	ld	a0,0(a5)
+    80204524:	c92d                	beqz	a0,80204596 <exec+0x21e>
+    80204526:	e8840993          	addi	s3,s0,-376
+    8020452a:	f8840c13          	addi	s8,s0,-120
+  sp = sz;
+    8020452e:	8966                	mv	s2,s9
+  for(argc = 0; argv[argc]; argc++) {
+    80204530:	4481                	li	s1,0
+    sp -= strlen(argv[argc]) + 1;
+    80204532:	ffffc097          	auipc	ra,0xffffc
+    80204536:	3b4080e7          	jalr	948(ra) # 802008e6 <strlen>
+    8020453a:	0015079b          	addiw	a5,a0,1
+    8020453e:	40f907b3          	sub	a5,s2,a5
+    sp -= sp % 16; // riscv sp must be 16-byte aligned
+    80204542:	ff07f913          	andi	s2,a5,-16
+    if(sp < stackbase)
+    80204546:	1b796463          	bltu	s2,s7,802046ee <exec+0x376>
+    if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0)
+    8020454a:	de843d83          	ld	s11,-536(s0)
+    8020454e:	000dba03          	ld	s4,0(s11) # 1000 <_entry-0x801ff000>
+    80204552:	8552                	mv	a0,s4
+    80204554:	ffffc097          	auipc	ra,0xffffc
+    80204558:	392080e7          	jalr	914(ra) # 802008e6 <strlen>
+    8020455c:	0015069b          	addiw	a3,a0,1
+    80204560:	8652                	mv	a2,s4
+    80204562:	85ca                	mv	a1,s2
+    80204564:	e0843503          	ld	a0,-504(s0)
+    80204568:	ffffd097          	auipc	ra,0xffffd
+    8020456c:	d7e080e7          	jalr	-642(ra) # 802012e6 <copyout>
+    80204570:	18054363          	bltz	a0,802046f6 <exec+0x37e>
+    ustack[argc] = sp;
+    80204574:	0129b023          	sd	s2,0(s3)
+  for(argc = 0; argv[argc]; argc++) {
+    80204578:	0485                	addi	s1,s1,1
+    8020457a:	008d8793          	addi	a5,s11,8
+    8020457e:	def43423          	sd	a5,-536(s0)
+    80204582:	008db503          	ld	a0,8(s11)
+    80204586:	c911                	beqz	a0,8020459a <exec+0x222>
+    if(argc >= MAXARG)
+    80204588:	09a1                	addi	s3,s3,8
+    8020458a:	fb3c14e3          	bne	s8,s3,80204532 <exec+0x1ba>
+  sz = sz1;
+    8020458e:	df943823          	sd	s9,-528(s0)
+  ep = 0;
+    80204592:	4a01                	li	s4,0
+    80204594:	a0d5                	j	80204678 <exec+0x300>
+  sp = sz;
+    80204596:	8966                	mv	s2,s9
+  for(argc = 0; argv[argc]; argc++) {
+    80204598:	4481                	li	s1,0
+  ustack[argc] = 0;
+    8020459a:	00349793          	slli	a5,s1,0x3
+    8020459e:	f9078793          	addi	a5,a5,-112
+    802045a2:	97a2                	add	a5,a5,s0
+    802045a4:	ee07bc23          	sd	zero,-264(a5)
+  sp -= (argc+1) * sizeof(uint64);
+    802045a8:	00148693          	addi	a3,s1,1
+    802045ac:	068e                	slli	a3,a3,0x3
+    802045ae:	40d90933          	sub	s2,s2,a3
+  sp -= sp % 16;
+    802045b2:	ff097913          	andi	s2,s2,-16
+  if(sp < stackbase)
+    802045b6:	01797663          	bgeu	s2,s7,802045c2 <exec+0x24a>
+  sz = sz1;
+    802045ba:	df943823          	sd	s9,-528(s0)
+  ep = 0;
+    802045be:	4a01                	li	s4,0
+    802045c0:	a865                	j	80204678 <exec+0x300>
+  if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0)
+    802045c2:	e8840613          	addi	a2,s0,-376
+    802045c6:	85ca                	mv	a1,s2
+    802045c8:	e0843503          	ld	a0,-504(s0)
+    802045cc:	ffffd097          	auipc	ra,0xffffd
+    802045d0:	d1a080e7          	jalr	-742(ra) # 802012e6 <copyout>
+    802045d4:	12054563          	bltz	a0,802046fe <exec+0x386>
+  p->trapframe->a1 = sp;
+    802045d8:	060ab783          	ld	a5,96(s5)
+    802045dc:	0727bc23          	sd	s2,120(a5)
+  for(last=s=path; *s; s++)
+    802045e0:	dd843783          	ld	a5,-552(s0)
+    802045e4:	0007c703          	lbu	a4,0(a5)
+    802045e8:	cf11                	beqz	a4,80204604 <exec+0x28c>
+    802045ea:	0785                	addi	a5,a5,1
+    if(*s == '/')
+    802045ec:	02f00693          	li	a3,47
+    802045f0:	a039                	j	802045fe <exec+0x286>
+      last = s+1;
+    802045f2:	dcf43c23          	sd	a5,-552(s0)
+  for(last=s=path; *s; s++)
+    802045f6:	0785                	addi	a5,a5,1
+    802045f8:	fff7c703          	lbu	a4,-1(a5)
+    802045fc:	c701                	beqz	a4,80204604 <exec+0x28c>
+    if(*s == '/')
+    802045fe:	fed71ce3          	bne	a4,a3,802045f6 <exec+0x27e>
+    80204602:	bfc5                	j	802045f2 <exec+0x27a>
+  safestrcpy(p->name, last, sizeof(p->name));
+    80204604:	4641                	li	a2,16
+    80204606:	dd843583          	ld	a1,-552(s0)
+    8020460a:	160a8513          	addi	a0,s5,352
+    8020460e:	ffffc097          	auipc	ra,0xffffc
+    80204612:	2a6080e7          	jalr	678(ra) # 802008b4 <safestrcpy>
+  oldpagetable = p->pagetable;
+    80204616:	050ab503          	ld	a0,80(s5)
+  oldkpagetable = p->kpagetable;
+    8020461a:	058ab983          	ld	s3,88(s5)
+  p->pagetable = pagetable;
+    8020461e:	e0843783          	ld	a5,-504(s0)
+    80204622:	04fab823          	sd	a5,80(s5)
+  p->kpagetable = kpagetable;
+    80204626:	056abc23          	sd	s6,88(s5)
+  p->sz = sz;
+    8020462a:	059ab423          	sd	s9,72(s5)
+  p->trapframe->epc = elf.entry;  // initial program counter = main
+    8020462e:	060ab783          	ld	a5,96(s5)
+    80204632:	e6043703          	ld	a4,-416(s0)
+    80204636:	ef98                	sd	a4,24(a5)
+  p->trapframe->sp = sp; // initial stack pointer
+    80204638:	060ab783          	ld	a5,96(s5)
+    8020463c:	0327b823          	sd	s2,48(a5)
+  proc_freepagetable(oldpagetable, oldsz);
+    80204640:	85ea                	mv	a1,s10
+    80204642:	ffffd097          	auipc	ra,0xffffd
+    80204646:	57a080e7          	jalr	1402(ra) # 80201bbc <proc_freepagetable>
+  w_satp(MAKE_SATP(p->kpagetable));
+    8020464a:	058ab783          	ld	a5,88(s5)
+    8020464e:	83b1                	srli	a5,a5,0xc
+    80204650:	577d                	li	a4,-1
+    80204652:	177e                	slli	a4,a4,0x3f
+    80204654:	8fd9                	or	a5,a5,a4
+  asm volatile("csrw satp, %0" : : "r" (x));
+    80204656:	18079073          	csrw	satp,a5
+  asm volatile("sfence.vma");
+    8020465a:	12000073          	sfence.vma
+  kvmfree(oldkpagetable, 0);
+    8020465e:	4581                	li	a1,0
+    80204660:	854e                	mv	a0,s3
+    80204662:	ffffd097          	auipc	ra,0xffffd
+    80204666:	010080e7          	jalr	16(ra) # 80201672 <kvmfree>
+  return argc; // this ends up in a0, the first argument to main(argc, argv)
+    8020466a:	0004851b          	sext.w	a0,s1
+    8020466e:	a089                	j	802046b0 <exec+0x338>
+    return -1;
+    80204670:	557d                	li	a0,-1
+    80204672:	a83d                	j	802046b0 <exec+0x338>
+    80204674:	de943823          	sd	s1,-528(s0)
+    proc_freepagetable(pagetable, sz);
+    80204678:	df043583          	ld	a1,-528(s0)
+    8020467c:	e0843503          	ld	a0,-504(s0)
+    80204680:	ffffd097          	auipc	ra,0xffffd
+    80204684:	53c080e7          	jalr	1340(ra) # 80201bbc <proc_freepagetable>
+    kvmfree(kpagetable, 0);
+    80204688:	4581                	li	a1,0
+    8020468a:	855a                	mv	a0,s6
+    8020468c:	ffffd097          	auipc	ra,0xffffd
+    80204690:	fe6080e7          	jalr	-26(ra) # 80201672 <kvmfree>
+    eunlock(ep);
+    eput(ep);
+  }
+  return -1;
+    80204694:	557d                	li	a0,-1
+  if(ep){
+    80204696:	000a0d63          	beqz	s4,802046b0 <exec+0x338>
+    eunlock(ep);
+    8020469a:	8552                	mv	a0,s4
+    8020469c:	00002097          	auipc	ra,0x2
+    802046a0:	008080e7          	jalr	8(ra) # 802066a4 <eunlock>
+    eput(ep);
+    802046a4:	8552                	mv	a0,s4
+    802046a6:	00002097          	auipc	ra,0x2
+    802046aa:	04c080e7          	jalr	76(ra) # 802066f2 <eput>
+  return -1;
+    802046ae:	557d                	li	a0,-1
+}
+    802046b0:	22813083          	ld	ra,552(sp)
+    802046b4:	22013403          	ld	s0,544(sp)
+    802046b8:	21813483          	ld	s1,536(sp)
+    802046bc:	21013903          	ld	s2,528(sp)
+    802046c0:	20813983          	ld	s3,520(sp)
+    802046c4:	20013a03          	ld	s4,512(sp)
+    802046c8:	7afe                	ld	s5,504(sp)
+    802046ca:	7b5e                	ld	s6,496(sp)
+    802046cc:	7bbe                	ld	s7,488(sp)
+    802046ce:	7c1e                	ld	s8,480(sp)
+    802046d0:	6cfe                	ld	s9,472(sp)
+    802046d2:	6d5e                	ld	s10,464(sp)
+    802046d4:	6dbe                	ld	s11,456(sp)
+    802046d6:	23010113          	addi	sp,sp,560
+    802046da:	8082                	ret
+    802046dc:	de943823          	sd	s1,-528(s0)
+    802046e0:	bf61                	j	80204678 <exec+0x300>
+    802046e2:	de943823          	sd	s1,-528(s0)
+    802046e6:	bf49                	j	80204678 <exec+0x300>
+    802046e8:	de943823          	sd	s1,-528(s0)
+    802046ec:	b771                	j	80204678 <exec+0x300>
+  sz = sz1;
+    802046ee:	df943823          	sd	s9,-528(s0)
+  ep = 0;
+    802046f2:	4a01                	li	s4,0
+    802046f4:	b751                	j	80204678 <exec+0x300>
+  sz = sz1;
+    802046f6:	df943823          	sd	s9,-528(s0)
+  ep = 0;
+    802046fa:	4a01                	li	s4,0
+    802046fc:	bfb5                	j	80204678 <exec+0x300>
+  sz = sz1;
+    802046fe:	df943823          	sd	s9,-528(s0)
+  ep = 0;
+    80204702:	4a01                	li	s4,0
+    80204704:	bf95                	j	80204678 <exec+0x300>
+    if((sz1 = uvmalloc(pagetable, kpagetable, sz, ph.vaddr + ph.memsz)) == 0)
+    80204706:	df043483          	ld	s1,-528(s0)
+  for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
+    8020470a:	e0043783          	ld	a5,-512(s0)
+    8020470e:	0017869b          	addiw	a3,a5,1
+    80204712:	e0d43023          	sd	a3,-512(s0)
+    80204716:	df843783          	ld	a5,-520(s0)
+    8020471a:	0387879b          	addiw	a5,a5,56
+    8020471e:	e8045703          	lhu	a4,-384(s0)
+    80204722:	d8e6dee3          	bge	a3,a4,802044be <exec+0x146>
+    if(eread(ep, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph))
+    80204726:	2781                	sext.w	a5,a5
+    80204728:	def43c23          	sd	a5,-520(s0)
+    8020472c:	03800713          	li	a4,56
+    80204730:	86be                	mv	a3,a5
+    80204732:	de043603          	ld	a2,-544(s0)
+    80204736:	4581                	li	a1,0
+    80204738:	8552                	mv	a0,s4
+    8020473a:	00001097          	auipc	ra,0x1
+    8020473e:	630080e7          	jalr	1584(ra) # 80205d6a <eread>
+    80204742:	03800793          	li	a5,56
+    80204746:	f2f517e3          	bne	a0,a5,80204674 <exec+0x2fc>
+    if(ph.type != ELF_PROG_LOAD)
+    8020474a:	e1042783          	lw	a5,-496(s0)
+    8020474e:	4705                	li	a4,1
+    80204750:	fae79de3          	bne	a5,a4,8020470a <exec+0x392>
+    if(ph.memsz < ph.filesz)
+    80204754:	e3843683          	ld	a3,-456(s0)
+    80204758:	e3043783          	ld	a5,-464(s0)
+    8020475c:	f8f6e0e3          	bltu	a3,a5,802046dc <exec+0x364>
+    if(ph.vaddr + ph.memsz < ph.vaddr)
+    80204760:	e2043783          	ld	a5,-480(s0)
+    80204764:	96be                	add	a3,a3,a5
+    80204766:	f6f6eee3          	bltu	a3,a5,802046e2 <exec+0x36a>
+    if((sz1 = uvmalloc(pagetable, kpagetable, sz, ph.vaddr + ph.memsz)) == 0)
+    8020476a:	8626                	mv	a2,s1
+    8020476c:	85da                	mv	a1,s6
+    8020476e:	e0843503          	ld	a0,-504(s0)
+    80204772:	ffffd097          	auipc	ra,0xffffd
+    80204776:	898080e7          	jalr	-1896(ra) # 8020100a <uvmalloc>
+    8020477a:	dea43823          	sd	a0,-528(s0)
+    8020477e:	d52d                	beqz	a0,802046e8 <exec+0x370>
+    if(ph.vaddr % PGSIZE != 0)
+    80204780:	e2043c03          	ld	s8,-480(s0)
+    80204784:	dd043783          	ld	a5,-560(s0)
+    80204788:	00fc77b3          	and	a5,s8,a5
+    8020478c:	ee0796e3          	bnez	a5,80204678 <exec+0x300>
+    if(loadseg(pagetable, ph.vaddr, ep, ph.off, ph.filesz) < 0)
+    80204790:	e1842c83          	lw	s9,-488(s0)
+    80204794:	e3042b83          	lw	s7,-464(s0)
+  for(i = 0; i < sz; i += PGSIZE){
+    80204798:	f60b87e3          	beqz	s7,80204706 <exec+0x38e>
+    8020479c:	89de                	mv	s3,s7
+    8020479e:	4481                	li	s1,0
+    802047a0:	b9ed                	j	8020449a <exec+0x122>
+    kvmfree(kpagetable, 0);
+    802047a2:	4581                	li	a1,0
+    802047a4:	855a                	mv	a0,s6
+    802047a6:	ffffd097          	auipc	ra,0xffffd
+    802047aa:	ecc080e7          	jalr	-308(ra) # 80201672 <kvmfree>
+  return -1;
+    802047ae:	557d                	li	a0,-1
+    802047b0:	b701                	j	802046b0 <exec+0x338>
+
+00000000802047b2 <argfd>:
+
+// Fetch the nth word-sized system call argument as a file descriptor
+// and return both the descriptor and the corresponding struct file.
+static int
+argfd(int n, int *pfd, struct file **pf)
+{
+    802047b2:	7179                	addi	sp,sp,-48
+    802047b4:	f406                	sd	ra,40(sp)
+    802047b6:	f022                	sd	s0,32(sp)
+    802047b8:	ec26                	sd	s1,24(sp)
+    802047ba:	e84a                	sd	s2,16(sp)
+    802047bc:	1800                	addi	s0,sp,48
+    802047be:	892e                	mv	s2,a1
+    802047c0:	84b2                	mv	s1,a2
+  int fd;
+  struct file *f;
+
+  if(argint(n, &fd) < 0)
+    802047c2:	fdc40593          	addi	a1,s0,-36
+    802047c6:	fffff097          	auipc	ra,0xfffff
+    802047ca:	8bc080e7          	jalr	-1860(ra) # 80203082 <argint>
+    802047ce:	04054063          	bltz	a0,8020480e <argfd+0x5c>
+    return -1;
+  if(fd < 0 || fd >= NOFILE || (f=myproc()->ofile[fd]) == NULL)
+    802047d2:	fdc42703          	lw	a4,-36(s0)
+    802047d6:	47bd                	li	a5,15
+    802047d8:	02e7ed63          	bltu	a5,a4,80204812 <argfd+0x60>
+    802047dc:	ffffd097          	auipc	ra,0xffffd
+    802047e0:	260080e7          	jalr	608(ra) # 80201a3c <myproc>
+    802047e4:	fdc42703          	lw	a4,-36(s0)
+    802047e8:	01a70793          	addi	a5,a4,26 # fffffffffffff01a <ebss_clear+0xffffffff7fdd901a>
+    802047ec:	078e                	slli	a5,a5,0x3
+    802047ee:	953e                	add	a0,a0,a5
+    802047f0:	651c                	ld	a5,8(a0)
+    802047f2:	c395                	beqz	a5,80204816 <argfd+0x64>
+    return -1;
+  if(pfd)
+    802047f4:	00090463          	beqz	s2,802047fc <argfd+0x4a>
+    *pfd = fd;
+    802047f8:	00e92023          	sw	a4,0(s2)
+  if(pf)
+    *pf = f;
+  return 0;
+    802047fc:	4501                	li	a0,0
+  if(pf)
+    802047fe:	c091                	beqz	s1,80204802 <argfd+0x50>
+    *pf = f;
+    80204800:	e09c                	sd	a5,0(s1)
+}
+    80204802:	70a2                	ld	ra,40(sp)
+    80204804:	7402                	ld	s0,32(sp)
+    80204806:	64e2                	ld	s1,24(sp)
+    80204808:	6942                	ld	s2,16(sp)
+    8020480a:	6145                	addi	sp,sp,48
+    8020480c:	8082                	ret
+    return -1;
+    8020480e:	557d                	li	a0,-1
+    80204810:	bfcd                	j	80204802 <argfd+0x50>
+    return -1;
+    80204812:	557d                	li	a0,-1
+    80204814:	b7fd                	j	80204802 <argfd+0x50>
+    80204816:	557d                	li	a0,-1
+    80204818:	b7ed                	j	80204802 <argfd+0x50>
+
+000000008020481a <fdalloc>:
+
+// Allocate a file descriptor for the given file.
+// Takes over file reference from caller on success.
+static int
+fdalloc(struct file *f)
+{
+    8020481a:	1101                	addi	sp,sp,-32
+    8020481c:	ec06                	sd	ra,24(sp)
+    8020481e:	e822                	sd	s0,16(sp)
+    80204820:	e426                	sd	s1,8(sp)
+    80204822:	1000                	addi	s0,sp,32
+    80204824:	84aa                	mv	s1,a0
+  int fd;
+  struct proc *p = myproc();
+    80204826:	ffffd097          	auipc	ra,0xffffd
+    8020482a:	216080e7          	jalr	534(ra) # 80201a3c <myproc>
+    8020482e:	862a                	mv	a2,a0
+
+  for(fd = 0; fd < NOFILE; fd++){
+    80204830:	0d850793          	addi	a5,a0,216
+    80204834:	4501                	li	a0,0
+    80204836:	46c1                	li	a3,16
+    if(p->ofile[fd] == 0){
+    80204838:	6398                	ld	a4,0(a5)
+    8020483a:	cb19                	beqz	a4,80204850 <fdalloc+0x36>
+  for(fd = 0; fd < NOFILE; fd++){
+    8020483c:	2505                	addiw	a0,a0,1
+    8020483e:	07a1                	addi	a5,a5,8
+    80204840:	fed51ce3          	bne	a0,a3,80204838 <fdalloc+0x1e>
+      p->ofile[fd] = f;
+      return fd;
+    }
+  }
+  return -1;
+    80204844:	557d                	li	a0,-1
+}
+    80204846:	60e2                	ld	ra,24(sp)
+    80204848:	6442                	ld	s0,16(sp)
+    8020484a:	64a2                	ld	s1,8(sp)
+    8020484c:	6105                	addi	sp,sp,32
+    8020484e:	8082                	ret
+      p->ofile[fd] = f;
+    80204850:	01a50793          	addi	a5,a0,26
+    80204854:	078e                	slli	a5,a5,0x3
+    80204856:	963e                	add	a2,a2,a5
+    80204858:	e604                	sd	s1,8(a2)
+      return fd;
+    8020485a:	b7f5                	j	80204846 <fdalloc+0x2c>
+
+000000008020485c <create>:
+  return filestat(f, st);
+}
+
+static struct dirent*
+create(char *path, short type, int mode)
+{
+    8020485c:	7169                	addi	sp,sp,-304
+    8020485e:	f606                	sd	ra,296(sp)
+    80204860:	f222                	sd	s0,288(sp)
+    80204862:	ee26                	sd	s1,280(sp)
+    80204864:	ea4a                	sd	s2,272(sp)
+    80204866:	e64e                	sd	s3,264(sp)
+    80204868:	1a00                	addi	s0,sp,304
+    8020486a:	892e                	mv	s2,a1
+  struct dirent *ep, *dp;
+  char name[FAT32_MAX_FILENAME + 1];
+
+  if((dp = enameparent(path, name)) == NULL)
+    8020486c:	ed040593          	addi	a1,s0,-304
+    80204870:	00002097          	auipc	ra,0x2
+    80204874:	5c4080e7          	jalr	1476(ra) # 80206e34 <enameparent>
+    80204878:	84aa                	mv	s1,a0
+    8020487a:	c945                	beqz	a0,8020492a <create+0xce>
+    mode = ATTR_READ_ONLY;
+  } else {
+    mode = 0;  
+  }
+
+  elock(dp);
+    8020487c:	00002097          	auipc	ra,0x2
+    80204880:	df2080e7          	jalr	-526(ra) # 8020666e <elock>
+  if (type == T_DIR) {
+    80204884:	fff90613          	addi	a2,s2,-1
+    80204888:	00163613          	seqz	a2,a2
+  if ((ep = ealloc(dp, name, mode)) == NULL) {
+    8020488c:	0046161b          	slliw	a2,a2,0x4
+    80204890:	ed040593          	addi	a1,s0,-304
+    80204894:	8526                	mv	a0,s1
+    80204896:	00002097          	auipc	ra,0x2
+    8020489a:	2c4080e7          	jalr	708(ra) # 80206b5a <ealloc>
+    8020489e:	89aa                	mv	s3,a0
+    802048a0:	c529                	beqz	a0,802048ea <create+0x8e>
+    eunlock(dp);
+    eput(dp);
+    return NULL;
+  }
+  
+  if ((type == T_DIR && !(ep->attribute & ATTR_DIRECTORY)) ||
+    802048a2:	0009079b          	sext.w	a5,s2
+    802048a6:	4705                	li	a4,1
+    802048a8:	04e78c63          	beq	a5,a4,80204900 <create+0xa4>
+    802048ac:	2901                	sext.w	s2,s2
+    802048ae:	4789                	li	a5,2
+    802048b0:	00f91663          	bne	s2,a5,802048bc <create+0x60>
+      (type == T_FILE && (ep->attribute & ATTR_DIRECTORY))) {
+    802048b4:	10054783          	lbu	a5,256(a0)
+    802048b8:	8bc1                	andi	a5,a5,16
+    802048ba:	e7b9                	bnez	a5,80204908 <create+0xac>
+    eput(ep);
+    eput(dp);
+    return NULL;
+  }
+
+  eunlock(dp);
+    802048bc:	8526                	mv	a0,s1
+    802048be:	00002097          	auipc	ra,0x2
+    802048c2:	de6080e7          	jalr	-538(ra) # 802066a4 <eunlock>
+  eput(dp);
+    802048c6:	8526                	mv	a0,s1
+    802048c8:	00002097          	auipc	ra,0x2
+    802048cc:	e2a080e7          	jalr	-470(ra) # 802066f2 <eput>
+
+  elock(ep);
+    802048d0:	854e                	mv	a0,s3
+    802048d2:	00002097          	auipc	ra,0x2
+    802048d6:	d9c080e7          	jalr	-612(ra) # 8020666e <elock>
+  return ep;
+}
+    802048da:	854e                	mv	a0,s3
+    802048dc:	70b2                	ld	ra,296(sp)
+    802048de:	7412                	ld	s0,288(sp)
+    802048e0:	64f2                	ld	s1,280(sp)
+    802048e2:	6952                	ld	s2,272(sp)
+    802048e4:	69b2                	ld	s3,264(sp)
+    802048e6:	6155                	addi	sp,sp,304
+    802048e8:	8082                	ret
+    eunlock(dp);
+    802048ea:	8526                	mv	a0,s1
+    802048ec:	00002097          	auipc	ra,0x2
+    802048f0:	db8080e7          	jalr	-584(ra) # 802066a4 <eunlock>
+    eput(dp);
+    802048f4:	8526                	mv	a0,s1
+    802048f6:	00002097          	auipc	ra,0x2
+    802048fa:	dfc080e7          	jalr	-516(ra) # 802066f2 <eput>
+    return NULL;
+    802048fe:	bff1                	j	802048da <create+0x7e>
+  if ((type == T_DIR && !(ep->attribute & ATTR_DIRECTORY)) ||
+    80204900:	10054783          	lbu	a5,256(a0)
+    80204904:	8bc1                	andi	a5,a5,16
+    80204906:	fbdd                	bnez	a5,802048bc <create+0x60>
+    eunlock(dp);
+    80204908:	8526                	mv	a0,s1
+    8020490a:	00002097          	auipc	ra,0x2
+    8020490e:	d9a080e7          	jalr	-614(ra) # 802066a4 <eunlock>
+    eput(ep);
+    80204912:	854e                	mv	a0,s3
+    80204914:	00002097          	auipc	ra,0x2
+    80204918:	dde080e7          	jalr	-546(ra) # 802066f2 <eput>
+    eput(dp);
+    8020491c:	8526                	mv	a0,s1
+    8020491e:	00002097          	auipc	ra,0x2
+    80204922:	dd4080e7          	jalr	-556(ra) # 802066f2 <eput>
+    return NULL;
+    80204926:	4981                	li	s3,0
+    80204928:	bf4d                	j	802048da <create+0x7e>
+    return NULL;
+    8020492a:	89aa                	mv	s3,a0
+    8020492c:	b77d                	j	802048da <create+0x7e>
+
+000000008020492e <sys_dup>:
+{
+    8020492e:	7179                	addi	sp,sp,-48
+    80204930:	f406                	sd	ra,40(sp)
+    80204932:	f022                	sd	s0,32(sp)
+    80204934:	ec26                	sd	s1,24(sp)
+    80204936:	e84a                	sd	s2,16(sp)
+    80204938:	1800                	addi	s0,sp,48
+  if(argfd(0, 0, &f) < 0)
+    8020493a:	fd840613          	addi	a2,s0,-40
+    8020493e:	4581                	li	a1,0
+    80204940:	4501                	li	a0,0
+    80204942:	00000097          	auipc	ra,0x0
+    80204946:	e70080e7          	jalr	-400(ra) # 802047b2 <argfd>
+    return -1;
+    8020494a:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0)
+    8020494c:	02054363          	bltz	a0,80204972 <sys_dup+0x44>
+  if((fd=fdalloc(f)) < 0)
+    80204950:	fd843903          	ld	s2,-40(s0)
+    80204954:	854a                	mv	a0,s2
+    80204956:	00000097          	auipc	ra,0x0
+    8020495a:	ec4080e7          	jalr	-316(ra) # 8020481a <fdalloc>
+    8020495e:	84aa                	mv	s1,a0
+    return -1;
+    80204960:	57fd                	li	a5,-1
+  if((fd=fdalloc(f)) < 0)
+    80204962:	00054863          	bltz	a0,80204972 <sys_dup+0x44>
+  filedup(f);
+    80204966:	854a                	mv	a0,s2
+    80204968:	fffff097          	auipc	ra,0xfffff
+    8020496c:	318080e7          	jalr	792(ra) # 80203c80 <filedup>
+  return fd;
+    80204970:	87a6                	mv	a5,s1
+}
+    80204972:	853e                	mv	a0,a5
+    80204974:	70a2                	ld	ra,40(sp)
+    80204976:	7402                	ld	s0,32(sp)
+    80204978:	64e2                	ld	s1,24(sp)
+    8020497a:	6942                	ld	s2,16(sp)
+    8020497c:	6145                	addi	sp,sp,48
+    8020497e:	8082                	ret
+
+0000000080204980 <sys_read>:
+{
+    80204980:	7179                	addi	sp,sp,-48
+    80204982:	f406                	sd	ra,40(sp)
+    80204984:	f022                	sd	s0,32(sp)
+    80204986:	1800                	addi	s0,sp,48
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    80204988:	fe840613          	addi	a2,s0,-24
+    8020498c:	4581                	li	a1,0
+    8020498e:	4501                	li	a0,0
+    80204990:	00000097          	auipc	ra,0x0
+    80204994:	e22080e7          	jalr	-478(ra) # 802047b2 <argfd>
+    return -1;
+    80204998:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    8020499a:	04054163          	bltz	a0,802049dc <sys_read+0x5c>
+    8020499e:	fe440593          	addi	a1,s0,-28
+    802049a2:	4509                	li	a0,2
+    802049a4:	ffffe097          	auipc	ra,0xffffe
+    802049a8:	6de080e7          	jalr	1758(ra) # 80203082 <argint>
+    return -1;
+    802049ac:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    802049ae:	02054763          	bltz	a0,802049dc <sys_read+0x5c>
+    802049b2:	fd840593          	addi	a1,s0,-40
+    802049b6:	4505                	li	a0,1
+    802049b8:	ffffe097          	auipc	ra,0xffffe
+    802049bc:	72c080e7          	jalr	1836(ra) # 802030e4 <argaddr>
+    return -1;
+    802049c0:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    802049c2:	00054d63          	bltz	a0,802049dc <sys_read+0x5c>
+  return fileread(f, p, n);
+    802049c6:	fe442603          	lw	a2,-28(s0)
+    802049ca:	fd843583          	ld	a1,-40(s0)
+    802049ce:	fe843503          	ld	a0,-24(s0)
+    802049d2:	fffff097          	auipc	ra,0xfffff
+    802049d6:	41a080e7          	jalr	1050(ra) # 80203dec <fileread>
+    802049da:	87aa                	mv	a5,a0
+}
+    802049dc:	853e                	mv	a0,a5
+    802049de:	70a2                	ld	ra,40(sp)
+    802049e0:	7402                	ld	s0,32(sp)
+    802049e2:	6145                	addi	sp,sp,48
+    802049e4:	8082                	ret
+
+00000000802049e6 <sys_write>:
+{
+    802049e6:	7179                	addi	sp,sp,-48
+    802049e8:	f406                	sd	ra,40(sp)
+    802049ea:	f022                	sd	s0,32(sp)
+    802049ec:	1800                	addi	s0,sp,48
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    802049ee:	fe840613          	addi	a2,s0,-24
+    802049f2:	4581                	li	a1,0
+    802049f4:	4501                	li	a0,0
+    802049f6:	00000097          	auipc	ra,0x0
+    802049fa:	dbc080e7          	jalr	-580(ra) # 802047b2 <argfd>
+    return -1;
+    802049fe:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    80204a00:	04054163          	bltz	a0,80204a42 <sys_write+0x5c>
+    80204a04:	fe440593          	addi	a1,s0,-28
+    80204a08:	4509                	li	a0,2
+    80204a0a:	ffffe097          	auipc	ra,0xffffe
+    80204a0e:	678080e7          	jalr	1656(ra) # 80203082 <argint>
+    return -1;
+    80204a12:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    80204a14:	02054763          	bltz	a0,80204a42 <sys_write+0x5c>
+    80204a18:	fd840593          	addi	a1,s0,-40
+    80204a1c:	4505                	li	a0,1
+    80204a1e:	ffffe097          	auipc	ra,0xffffe
+    80204a22:	6c6080e7          	jalr	1734(ra) # 802030e4 <argaddr>
+    return -1;
+    80204a26:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argaddr(1, &p) < 0)
+    80204a28:	00054d63          	bltz	a0,80204a42 <sys_write+0x5c>
+  return filewrite(f, p, n);
+    80204a2c:	fe442603          	lw	a2,-28(s0)
+    80204a30:	fd843583          	ld	a1,-40(s0)
+    80204a34:	fe843503          	ld	a0,-24(s0)
+    80204a38:	fffff097          	auipc	ra,0xfffff
+    80204a3c:	476080e7          	jalr	1142(ra) # 80203eae <filewrite>
+    80204a40:	87aa                	mv	a5,a0
+}
+    80204a42:	853e                	mv	a0,a5
+    80204a44:	70a2                	ld	ra,40(sp)
+    80204a46:	7402                	ld	s0,32(sp)
+    80204a48:	6145                	addi	sp,sp,48
+    80204a4a:	8082                	ret
+
+0000000080204a4c <sys_close>:
+{
+    80204a4c:	1101                	addi	sp,sp,-32
+    80204a4e:	ec06                	sd	ra,24(sp)
+    80204a50:	e822                	sd	s0,16(sp)
+    80204a52:	1000                	addi	s0,sp,32
+  if(argfd(0, &fd, &f) < 0)
+    80204a54:	fe040613          	addi	a2,s0,-32
+    80204a58:	fec40593          	addi	a1,s0,-20
+    80204a5c:	4501                	li	a0,0
+    80204a5e:	00000097          	auipc	ra,0x0
+    80204a62:	d54080e7          	jalr	-684(ra) # 802047b2 <argfd>
+    return -1;
+    80204a66:	57fd                	li	a5,-1
+  if(argfd(0, &fd, &f) < 0)
+    80204a68:	02054463          	bltz	a0,80204a90 <sys_close+0x44>
+  myproc()->ofile[fd] = 0;
+    80204a6c:	ffffd097          	auipc	ra,0xffffd
+    80204a70:	fd0080e7          	jalr	-48(ra) # 80201a3c <myproc>
+    80204a74:	fec42783          	lw	a5,-20(s0)
+    80204a78:	07e9                	addi	a5,a5,26
+    80204a7a:	078e                	slli	a5,a5,0x3
+    80204a7c:	953e                	add	a0,a0,a5
+    80204a7e:	00053423          	sd	zero,8(a0)
+  fileclose(f);
+    80204a82:	fe043503          	ld	a0,-32(s0)
+    80204a86:	fffff097          	auipc	ra,0xfffff
+    80204a8a:	24c080e7          	jalr	588(ra) # 80203cd2 <fileclose>
+  return 0;
+    80204a8e:	4781                	li	a5,0
+}
+    80204a90:	853e                	mv	a0,a5
+    80204a92:	60e2                	ld	ra,24(sp)
+    80204a94:	6442                	ld	s0,16(sp)
+    80204a96:	6105                	addi	sp,sp,32
+    80204a98:	8082                	ret
+
+0000000080204a9a <sys_fstat>:
+{
+    80204a9a:	1101                	addi	sp,sp,-32
+    80204a9c:	ec06                	sd	ra,24(sp)
+    80204a9e:	e822                	sd	s0,16(sp)
+    80204aa0:	1000                	addi	s0,sp,32
+  if(argfd(0, 0, &f) < 0 || argaddr(1, &st) < 0)
+    80204aa2:	fe840613          	addi	a2,s0,-24
+    80204aa6:	4581                	li	a1,0
+    80204aa8:	4501                	li	a0,0
+    80204aaa:	00000097          	auipc	ra,0x0
+    80204aae:	d08080e7          	jalr	-760(ra) # 802047b2 <argfd>
+    return -1;
+    80204ab2:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argaddr(1, &st) < 0)
+    80204ab4:	02054563          	bltz	a0,80204ade <sys_fstat+0x44>
+    80204ab8:	fe040593          	addi	a1,s0,-32
+    80204abc:	4505                	li	a0,1
+    80204abe:	ffffe097          	auipc	ra,0xffffe
+    80204ac2:	626080e7          	jalr	1574(ra) # 802030e4 <argaddr>
+    return -1;
+    80204ac6:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argaddr(1, &st) < 0)
+    80204ac8:	00054b63          	bltz	a0,80204ade <sys_fstat+0x44>
+  return filestat(f, st);
+    80204acc:	fe043583          	ld	a1,-32(s0)
+    80204ad0:	fe843503          	ld	a0,-24(s0)
+    80204ad4:	fffff097          	auipc	ra,0xfffff
+    80204ad8:	2b4080e7          	jalr	692(ra) # 80203d88 <filestat>
+    80204adc:	87aa                	mv	a5,a0
+}
+    80204ade:	853e                	mv	a0,a5
+    80204ae0:	60e2                	ld	ra,24(sp)
+    80204ae2:	6442                	ld	s0,16(sp)
+    80204ae4:	6105                	addi	sp,sp,32
+    80204ae6:	8082                	ret
+
+0000000080204ae8 <sys_open>:
+
+uint64
+sys_open(void)
+{
+    80204ae8:	7129                	addi	sp,sp,-320
+    80204aea:	fe06                	sd	ra,312(sp)
+    80204aec:	fa22                	sd	s0,304(sp)
+    80204aee:	f626                	sd	s1,296(sp)
+    80204af0:	f24a                	sd	s2,288(sp)
+    80204af2:	ee4e                	sd	s3,280(sp)
+    80204af4:	0280                	addi	s0,sp,320
+  char path[FAT32_MAX_PATH];
+  int fd, omode;
+  struct file *f;
+  struct dirent *ep;
+
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || argint(1, &omode) < 0)
+    80204af6:	10400613          	li	a2,260
+    80204afa:	ec840593          	addi	a1,s0,-312
+    80204afe:	4501                	li	a0,0
+    80204b00:	ffffe097          	auipc	ra,0xffffe
+    80204b04:	606080e7          	jalr	1542(ra) # 80203106 <argstr>
+    80204b08:	87aa                	mv	a5,a0
+    return -1;
+    80204b0a:	557d                	li	a0,-1
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || argint(1, &omode) < 0)
+    80204b0c:	0807ce63          	bltz	a5,80204ba8 <sys_open+0xc0>
+    80204b10:	ec440593          	addi	a1,s0,-316
+    80204b14:	4505                	li	a0,1
+    80204b16:	ffffe097          	auipc	ra,0xffffe
+    80204b1a:	56c080e7          	jalr	1388(ra) # 80203082 <argint>
+    80204b1e:	0e054163          	bltz	a0,80204c00 <sys_open+0x118>
+
+  if(omode & O_CREATE){
+    80204b22:	ec442603          	lw	a2,-316(s0)
+    80204b26:	20067793          	andi	a5,a2,512
+    80204b2a:	c7d1                	beqz	a5,80204bb6 <sys_open+0xce>
+    ep = create(path, T_FILE, omode);
+    80204b2c:	4589                	li	a1,2
+    80204b2e:	ec840513          	addi	a0,s0,-312
+    80204b32:	00000097          	auipc	ra,0x0
+    80204b36:	d2a080e7          	jalr	-726(ra) # 8020485c <create>
+    80204b3a:	892a                	mv	s2,a0
+    if(ep == NULL){
+    80204b3c:	c561                	beqz	a0,80204c04 <sys_open+0x11c>
+      eput(ep);
+      return -1;
+    }
+  }
+
+  if((f = filealloc()) == NULL || (fd = fdalloc(f)) < 0){
+    80204b3e:	fffff097          	auipc	ra,0xfffff
+    80204b42:	0d8080e7          	jalr	216(ra) # 80203c16 <filealloc>
+    80204b46:	89aa                	mv	s3,a0
+    80204b48:	c579                	beqz	a0,80204c16 <sys_open+0x12e>
+    80204b4a:	00000097          	auipc	ra,0x0
+    80204b4e:	cd0080e7          	jalr	-816(ra) # 8020481a <fdalloc>
+    80204b52:	84aa                	mv	s1,a0
+    80204b54:	0a054c63          	bltz	a0,80204c0c <sys_open+0x124>
+    eunlock(ep);
+    eput(ep);
+    return -1;
+  }
+
+  if(!(ep->attribute & ATTR_DIRECTORY) && (omode & O_TRUNC)){
+    80204b58:	10094783          	lbu	a5,256(s2)
+    80204b5c:	8bc1                	andi	a5,a5,16
+    80204b5e:	e791                	bnez	a5,80204b6a <sys_open+0x82>
+    80204b60:	ec442783          	lw	a5,-316(s0)
+    80204b64:	4007f793          	andi	a5,a5,1024
+    80204b68:	e7d1                	bnez	a5,80204bf4 <sys_open+0x10c>
+    etrunc(ep);
+  }
+
+  f->type = FD_ENTRY;
+    80204b6a:	4789                	li	a5,2
+    80204b6c:	00f9a023          	sw	a5,0(s3)
+  f->off = (omode & O_APPEND) ? ep->file_size : 0;
+    80204b70:	ec442783          	lw	a5,-316(s0)
+    80204b74:	0047f693          	andi	a3,a5,4
+    80204b78:	4701                	li	a4,0
+    80204b7a:	c299                	beqz	a3,80204b80 <sys_open+0x98>
+    80204b7c:	10892703          	lw	a4,264(s2)
+    80204b80:	02e9a023          	sw	a4,32(s3)
+  f->ep = ep;
+    80204b84:	0129bc23          	sd	s2,24(s3)
+  f->readable = !(omode & O_WRONLY);
+    80204b88:	0017c713          	xori	a4,a5,1
+    80204b8c:	8b05                	andi	a4,a4,1
+    80204b8e:	00e98423          	sb	a4,8(s3)
+  f->writable = (omode & O_WRONLY) || (omode & O_RDWR);
+    80204b92:	8b8d                	andi	a5,a5,3
+    80204b94:	00f037b3          	snez	a5,a5
+    80204b98:	00f984a3          	sb	a5,9(s3)
+
+  eunlock(ep);
+    80204b9c:	854a                	mv	a0,s2
+    80204b9e:	00002097          	auipc	ra,0x2
+    80204ba2:	b06080e7          	jalr	-1274(ra) # 802066a4 <eunlock>
+
+  return fd;
+    80204ba6:	8526                	mv	a0,s1
+}
+    80204ba8:	70f2                	ld	ra,312(sp)
+    80204baa:	7452                	ld	s0,304(sp)
+    80204bac:	74b2                	ld	s1,296(sp)
+    80204bae:	7912                	ld	s2,288(sp)
+    80204bb0:	69f2                	ld	s3,280(sp)
+    80204bb2:	6131                	addi	sp,sp,320
+    80204bb4:	8082                	ret
+    if((ep = ename(path)) == NULL){
+    80204bb6:	ec840513          	addi	a0,s0,-312
+    80204bba:	00002097          	auipc	ra,0x2
+    80204bbe:	25c080e7          	jalr	604(ra) # 80206e16 <ename>
+    80204bc2:	892a                	mv	s2,a0
+    80204bc4:	c131                	beqz	a0,80204c08 <sys_open+0x120>
+    elock(ep);
+    80204bc6:	00002097          	auipc	ra,0x2
+    80204bca:	aa8080e7          	jalr	-1368(ra) # 8020666e <elock>
+    if((ep->attribute & ATTR_DIRECTORY) && omode != O_RDONLY){
+    80204bce:	10094783          	lbu	a5,256(s2)
+    80204bd2:	8bc1                	andi	a5,a5,16
+    80204bd4:	d7ad                	beqz	a5,80204b3e <sys_open+0x56>
+    80204bd6:	ec442783          	lw	a5,-316(s0)
+    80204bda:	d3b5                	beqz	a5,80204b3e <sys_open+0x56>
+      eunlock(ep);
+    80204bdc:	854a                	mv	a0,s2
+    80204bde:	00002097          	auipc	ra,0x2
+    80204be2:	ac6080e7          	jalr	-1338(ra) # 802066a4 <eunlock>
+      eput(ep);
+    80204be6:	854a                	mv	a0,s2
+    80204be8:	00002097          	auipc	ra,0x2
+    80204bec:	b0a080e7          	jalr	-1270(ra) # 802066f2 <eput>
+      return -1;
+    80204bf0:	557d                	li	a0,-1
+    80204bf2:	bf5d                	j	80204ba8 <sys_open+0xc0>
+    etrunc(ep);
+    80204bf4:	854a                	mv	a0,s2
+    80204bf6:	00002097          	auipc	ra,0x2
+    80204bfa:	a0e080e7          	jalr	-1522(ra) # 80206604 <etrunc>
+    80204bfe:	b7b5                	j	80204b6a <sys_open+0x82>
+    return -1;
+    80204c00:	557d                	li	a0,-1
+    80204c02:	b75d                	j	80204ba8 <sys_open+0xc0>
+      return -1;
+    80204c04:	557d                	li	a0,-1
+    80204c06:	b74d                	j	80204ba8 <sys_open+0xc0>
+      return -1;
+    80204c08:	557d                	li	a0,-1
+    80204c0a:	bf79                	j	80204ba8 <sys_open+0xc0>
+      fileclose(f);
+    80204c0c:	854e                	mv	a0,s3
+    80204c0e:	fffff097          	auipc	ra,0xfffff
+    80204c12:	0c4080e7          	jalr	196(ra) # 80203cd2 <fileclose>
+    eunlock(ep);
+    80204c16:	854a                	mv	a0,s2
+    80204c18:	00002097          	auipc	ra,0x2
+    80204c1c:	a8c080e7          	jalr	-1396(ra) # 802066a4 <eunlock>
+    eput(ep);
+    80204c20:	854a                	mv	a0,s2
+    80204c22:	00002097          	auipc	ra,0x2
+    80204c26:	ad0080e7          	jalr	-1328(ra) # 802066f2 <eput>
+    return -1;
+    80204c2a:	557d                	li	a0,-1
+    80204c2c:	bfb5                	j	80204ba8 <sys_open+0xc0>
+
+0000000080204c2e <sys_mkdir>:
+
+uint64
+sys_mkdir(void)
+{
+    80204c2e:	7169                	addi	sp,sp,-304
+    80204c30:	f606                	sd	ra,296(sp)
+    80204c32:	f222                	sd	s0,288(sp)
+    80204c34:	ee26                	sd	s1,280(sp)
+    80204c36:	1a00                	addi	s0,sp,304
+  char path[FAT32_MAX_PATH];
+  struct dirent *ep;
+
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || (ep = create(path, T_DIR, 0)) == 0){
+    80204c38:	10400613          	li	a2,260
+    80204c3c:	ed840593          	addi	a1,s0,-296
+    80204c40:	4501                	li	a0,0
+    80204c42:	ffffe097          	auipc	ra,0xffffe
+    80204c46:	4c4080e7          	jalr	1220(ra) # 80203106 <argstr>
+    return -1;
+    80204c4a:	57fd                	li	a5,-1
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || (ep = create(path, T_DIR, 0)) == 0){
+    80204c4c:	02054663          	bltz	a0,80204c78 <sys_mkdir+0x4a>
+    80204c50:	4601                	li	a2,0
+    80204c52:	4585                	li	a1,1
+    80204c54:	ed840513          	addi	a0,s0,-296
+    80204c58:	00000097          	auipc	ra,0x0
+    80204c5c:	c04080e7          	jalr	-1020(ra) # 8020485c <create>
+    80204c60:	84aa                	mv	s1,a0
+    80204c62:	c10d                	beqz	a0,80204c84 <sys_mkdir+0x56>
+  }
+  eunlock(ep);
+    80204c64:	00002097          	auipc	ra,0x2
+    80204c68:	a40080e7          	jalr	-1472(ra) # 802066a4 <eunlock>
+  eput(ep);
+    80204c6c:	8526                	mv	a0,s1
+    80204c6e:	00002097          	auipc	ra,0x2
+    80204c72:	a84080e7          	jalr	-1404(ra) # 802066f2 <eput>
+  return 0;
+    80204c76:	4781                	li	a5,0
+}
+    80204c78:	853e                	mv	a0,a5
+    80204c7a:	70b2                	ld	ra,296(sp)
+    80204c7c:	7412                	ld	s0,288(sp)
+    80204c7e:	64f2                	ld	s1,280(sp)
+    80204c80:	6155                	addi	sp,sp,304
+    80204c82:	8082                	ret
+    return -1;
+    80204c84:	57fd                	li	a5,-1
+    80204c86:	bfcd                	j	80204c78 <sys_mkdir+0x4a>
+
+0000000080204c88 <sys_chdir>:
+
+uint64
+sys_chdir(void)
+{
+    80204c88:	7169                	addi	sp,sp,-304
+    80204c8a:	f606                	sd	ra,296(sp)
+    80204c8c:	f222                	sd	s0,288(sp)
+    80204c8e:	ee26                	sd	s1,280(sp)
+    80204c90:	ea4a                	sd	s2,272(sp)
+    80204c92:	1a00                	addi	s0,sp,304
+  char path[FAT32_MAX_PATH];
+  struct dirent *ep;
+  struct proc *p = myproc();
+    80204c94:	ffffd097          	auipc	ra,0xffffd
+    80204c98:	da8080e7          	jalr	-600(ra) # 80201a3c <myproc>
+    80204c9c:	892a                	mv	s2,a0
+  
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || (ep = ename(path)) == NULL){
+    80204c9e:	10400613          	li	a2,260
+    80204ca2:	ed840593          	addi	a1,s0,-296
+    80204ca6:	4501                	li	a0,0
+    80204ca8:	ffffe097          	auipc	ra,0xffffe
+    80204cac:	45e080e7          	jalr	1118(ra) # 80203106 <argstr>
+    return -1;
+    80204cb0:	57fd                	li	a5,-1
+  if(argstr(0, path, FAT32_MAX_PATH) < 0 || (ep = ename(path)) == NULL){
+    80204cb2:	04054063          	bltz	a0,80204cf2 <sys_chdir+0x6a>
+    80204cb6:	ed840513          	addi	a0,s0,-296
+    80204cba:	00002097          	auipc	ra,0x2
+    80204cbe:	15c080e7          	jalr	348(ra) # 80206e16 <ename>
+    80204cc2:	84aa                	mv	s1,a0
+    80204cc4:	c931                	beqz	a0,80204d18 <sys_chdir+0x90>
+  }
+  elock(ep);
+    80204cc6:	00002097          	auipc	ra,0x2
+    80204cca:	9a8080e7          	jalr	-1624(ra) # 8020666e <elock>
+  if(!(ep->attribute & ATTR_DIRECTORY)){
+    80204cce:	1004c783          	lbu	a5,256(s1)
+    80204cd2:	8bc1                	andi	a5,a5,16
+    80204cd4:	c795                	beqz	a5,80204d00 <sys_chdir+0x78>
+    eunlock(ep);
+    eput(ep);
+    return -1;
+  }
+  eunlock(ep);
+    80204cd6:	8526                	mv	a0,s1
+    80204cd8:	00002097          	auipc	ra,0x2
+    80204cdc:	9cc080e7          	jalr	-1588(ra) # 802066a4 <eunlock>
+  eput(p->cwd);
+    80204ce0:	15893503          	ld	a0,344(s2)
+    80204ce4:	00002097          	auipc	ra,0x2
+    80204ce8:	a0e080e7          	jalr	-1522(ra) # 802066f2 <eput>
+  p->cwd = ep;
+    80204cec:	14993c23          	sd	s1,344(s2)
+  return 0;
+    80204cf0:	4781                	li	a5,0
+}
+    80204cf2:	853e                	mv	a0,a5
+    80204cf4:	70b2                	ld	ra,296(sp)
+    80204cf6:	7412                	ld	s0,288(sp)
+    80204cf8:	64f2                	ld	s1,280(sp)
+    80204cfa:	6952                	ld	s2,272(sp)
+    80204cfc:	6155                	addi	sp,sp,304
+    80204cfe:	8082                	ret
+    eunlock(ep);
+    80204d00:	8526                	mv	a0,s1
+    80204d02:	00002097          	auipc	ra,0x2
+    80204d06:	9a2080e7          	jalr	-1630(ra) # 802066a4 <eunlock>
+    eput(ep);
+    80204d0a:	8526                	mv	a0,s1
+    80204d0c:	00002097          	auipc	ra,0x2
+    80204d10:	9e6080e7          	jalr	-1562(ra) # 802066f2 <eput>
+    return -1;
+    80204d14:	57fd                	li	a5,-1
+    80204d16:	bff1                	j	80204cf2 <sys_chdir+0x6a>
+    return -1;
+    80204d18:	57fd                	li	a5,-1
+    80204d1a:	bfe1                	j	80204cf2 <sys_chdir+0x6a>
+
+0000000080204d1c <sys_pipe>:
+
+uint64
+sys_pipe(void)
+{
+    80204d1c:	7139                	addi	sp,sp,-64
+    80204d1e:	fc06                	sd	ra,56(sp)
+    80204d20:	f822                	sd	s0,48(sp)
+    80204d22:	f426                	sd	s1,40(sp)
+    80204d24:	0080                	addi	s0,sp,64
+  uint64 fdarray; // user pointer to array of two integers
+  struct file *rf, *wf;
+  int fd0, fd1;
+  struct proc *p = myproc();
+    80204d26:	ffffd097          	auipc	ra,0xffffd
+    80204d2a:	d16080e7          	jalr	-746(ra) # 80201a3c <myproc>
+    80204d2e:	84aa                	mv	s1,a0
+
+  if(argaddr(0, &fdarray) < 0)
+    80204d30:	fd840593          	addi	a1,s0,-40
+    80204d34:	4501                	li	a0,0
+    80204d36:	ffffe097          	auipc	ra,0xffffe
+    80204d3a:	3ae080e7          	jalr	942(ra) # 802030e4 <argaddr>
+    return -1;
+    80204d3e:	57fd                	li	a5,-1
+  if(argaddr(0, &fdarray) < 0)
+    80204d40:	0c054e63          	bltz	a0,80204e1c <sys_pipe+0x100>
+  if(pipealloc(&rf, &wf) < 0)
+    80204d44:	fc840593          	addi	a1,s0,-56
+    80204d48:	fd040513          	addi	a0,s0,-48
+    80204d4c:	fffff097          	auipc	ra,0xfffff
+    80204d50:	2f8080e7          	jalr	760(ra) # 80204044 <pipealloc>
+    return -1;
+    80204d54:	57fd                	li	a5,-1
+  if(pipealloc(&rf, &wf) < 0)
+    80204d56:	0c054363          	bltz	a0,80204e1c <sys_pipe+0x100>
+  fd0 = -1;
+    80204d5a:	fcf42223          	sw	a5,-60(s0)
+  if((fd0 = fdalloc(rf)) < 0 || (fd1 = fdalloc(wf)) < 0){
+    80204d5e:	fd043503          	ld	a0,-48(s0)
+    80204d62:	00000097          	auipc	ra,0x0
+    80204d66:	ab8080e7          	jalr	-1352(ra) # 8020481a <fdalloc>
+    80204d6a:	fca42223          	sw	a0,-60(s0)
+    80204d6e:	08054a63          	bltz	a0,80204e02 <sys_pipe+0xe6>
+    80204d72:	fc843503          	ld	a0,-56(s0)
+    80204d76:	00000097          	auipc	ra,0x0
+    80204d7a:	aa4080e7          	jalr	-1372(ra) # 8020481a <fdalloc>
+    80204d7e:	fca42023          	sw	a0,-64(s0)
+    80204d82:	06054763          	bltz	a0,80204df0 <sys_pipe+0xd4>
+    fileclose(wf);
+    return -1;
+  }
+  // if(copyout(p->pagetable, fdarray, (char*)&fd0, sizeof(fd0)) < 0 ||
+  //    copyout(p->pagetable, fdarray+sizeof(fd0), (char *)&fd1, sizeof(fd1)) < 0){
+  if(copyout2(fdarray, (char*)&fd0, sizeof(fd0)) < 0 ||
+    80204d86:	4611                	li	a2,4
+    80204d88:	fc440593          	addi	a1,s0,-60
+    80204d8c:	fd843503          	ld	a0,-40(s0)
+    80204d90:	ffffc097          	auipc	ra,0xffffc
+    80204d94:	5e2080e7          	jalr	1506(ra) # 80201372 <copyout2>
+    80204d98:	00054f63          	bltz	a0,80204db6 <sys_pipe+0x9a>
+     copyout2(fdarray+sizeof(fd0), (char *)&fd1, sizeof(fd1)) < 0){
+    80204d9c:	4611                	li	a2,4
+    80204d9e:	fc040593          	addi	a1,s0,-64
+    80204da2:	fd843503          	ld	a0,-40(s0)
+    80204da6:	0511                	addi	a0,a0,4
+    80204da8:	ffffc097          	auipc	ra,0xffffc
+    80204dac:	5ca080e7          	jalr	1482(ra) # 80201372 <copyout2>
+    p->ofile[fd1] = 0;
+    fileclose(rf);
+    fileclose(wf);
+    return -1;
+  }
+  return 0;
+    80204db0:	4781                	li	a5,0
+  if(copyout2(fdarray, (char*)&fd0, sizeof(fd0)) < 0 ||
+    80204db2:	06055563          	bgez	a0,80204e1c <sys_pipe+0x100>
+    p->ofile[fd0] = 0;
+    80204db6:	fc442783          	lw	a5,-60(s0)
+    80204dba:	07e9                	addi	a5,a5,26
+    80204dbc:	078e                	slli	a5,a5,0x3
+    80204dbe:	97a6                	add	a5,a5,s1
+    80204dc0:	0007b423          	sd	zero,8(a5)
+    p->ofile[fd1] = 0;
+    80204dc4:	fc042783          	lw	a5,-64(s0)
+    80204dc8:	07e9                	addi	a5,a5,26
+    80204dca:	078e                	slli	a5,a5,0x3
+    80204dcc:	00f48533          	add	a0,s1,a5
+    80204dd0:	00053423          	sd	zero,8(a0)
+    fileclose(rf);
+    80204dd4:	fd043503          	ld	a0,-48(s0)
+    80204dd8:	fffff097          	auipc	ra,0xfffff
+    80204ddc:	efa080e7          	jalr	-262(ra) # 80203cd2 <fileclose>
+    fileclose(wf);
+    80204de0:	fc843503          	ld	a0,-56(s0)
+    80204de4:	fffff097          	auipc	ra,0xfffff
+    80204de8:	eee080e7          	jalr	-274(ra) # 80203cd2 <fileclose>
+    return -1;
+    80204dec:	57fd                	li	a5,-1
+    80204dee:	a03d                	j	80204e1c <sys_pipe+0x100>
+    if(fd0 >= 0)
+    80204df0:	fc442783          	lw	a5,-60(s0)
+    80204df4:	0007c763          	bltz	a5,80204e02 <sys_pipe+0xe6>
+      p->ofile[fd0] = 0;
+    80204df8:	07e9                	addi	a5,a5,26
+    80204dfa:	078e                	slli	a5,a5,0x3
+    80204dfc:	97a6                	add	a5,a5,s1
+    80204dfe:	0007b423          	sd	zero,8(a5)
+    fileclose(rf);
+    80204e02:	fd043503          	ld	a0,-48(s0)
+    80204e06:	fffff097          	auipc	ra,0xfffff
+    80204e0a:	ecc080e7          	jalr	-308(ra) # 80203cd2 <fileclose>
+    fileclose(wf);
+    80204e0e:	fc843503          	ld	a0,-56(s0)
+    80204e12:	fffff097          	auipc	ra,0xfffff
+    80204e16:	ec0080e7          	jalr	-320(ra) # 80203cd2 <fileclose>
+    return -1;
+    80204e1a:	57fd                	li	a5,-1
+}
+    80204e1c:	853e                	mv	a0,a5
+    80204e1e:	70e2                	ld	ra,56(sp)
+    80204e20:	7442                	ld	s0,48(sp)
+    80204e22:	74a2                	ld	s1,40(sp)
+    80204e24:	6121                	addi	sp,sp,64
+    80204e26:	8082                	ret
+
+0000000080204e28 <sys_dev>:
+
+// To open console device.
+uint64
+sys_dev(void)
+{
+    80204e28:	7179                	addi	sp,sp,-48
+    80204e2a:	f406                	sd	ra,40(sp)
+    80204e2c:	f022                	sd	s0,32(sp)
+    80204e2e:	ec26                	sd	s1,24(sp)
+    80204e30:	1800                	addi	s0,sp,48
+  int fd, omode;
+  int major, minor;
+  struct file *f;
+
+  if(argint(0, &omode) < 0 || argint(1, &major) < 0 || argint(2, &minor) < 0){
+    80204e32:	fdc40593          	addi	a1,s0,-36
+    80204e36:	4501                	li	a0,0
+    80204e38:	ffffe097          	auipc	ra,0xffffe
+    80204e3c:	24a080e7          	jalr	586(ra) # 80203082 <argint>
+    80204e40:	08054a63          	bltz	a0,80204ed4 <sys_dev+0xac>
+    80204e44:	fd840593          	addi	a1,s0,-40
+    80204e48:	4505                	li	a0,1
+    80204e4a:	ffffe097          	auipc	ra,0xffffe
+    80204e4e:	238080e7          	jalr	568(ra) # 80203082 <argint>
+    80204e52:	08054763          	bltz	a0,80204ee0 <sys_dev+0xb8>
+    80204e56:	fd440593          	addi	a1,s0,-44
+    80204e5a:	4509                	li	a0,2
+    80204e5c:	ffffe097          	auipc	ra,0xffffe
+    80204e60:	226080e7          	jalr	550(ra) # 80203082 <argint>
+    80204e64:	08054063          	bltz	a0,80204ee4 <sys_dev+0xbc>
+    return -1;
+  }
+
+  if(omode & O_CREATE){
+    80204e68:	fdc42783          	lw	a5,-36(s0)
+    80204e6c:	2007f793          	andi	a5,a5,512
+    80204e70:	ebb1                	bnez	a5,80204ec4 <sys_dev+0x9c>
+    panic("dev file on FAT");
+  }
+
+  if(major < 0 || major >= NDEV)
+    80204e72:	fd842703          	lw	a4,-40(s0)
+    80204e76:	47a5                	li	a5,9
+    return -1;
+    80204e78:	557d                	li	a0,-1
+  if(major < 0 || major >= NDEV)
+    80204e7a:	04e7ee63          	bltu	a5,a4,80204ed6 <sys_dev+0xae>
+
+  if((f = filealloc()) == NULL || (fd = fdalloc(f)) < 0){
+    80204e7e:	fffff097          	auipc	ra,0xfffff
+    80204e82:	d98080e7          	jalr	-616(ra) # 80203c16 <filealloc>
+    80204e86:	84aa                	mv	s1,a0
+    80204e88:	c125                	beqz	a0,80204ee8 <sys_dev+0xc0>
+    80204e8a:	00000097          	auipc	ra,0x0
+    80204e8e:	990080e7          	jalr	-1648(ra) # 8020481a <fdalloc>
+    80204e92:	04054d63          	bltz	a0,80204eec <sys_dev+0xc4>
+    if(f)
+      fileclose(f);
+    return -1;
+  }
+
+  f->type = FD_DEVICE;
+    80204e96:	478d                	li	a5,3
+    80204e98:	c09c                	sw	a5,0(s1)
+  f->off = 0;
+    80204e9a:	0204a023          	sw	zero,32(s1)
+  f->ep = 0;
+    80204e9e:	0004bc23          	sd	zero,24(s1)
+  f->major = major;
+    80204ea2:	fd842783          	lw	a5,-40(s0)
+    80204ea6:	02f49223          	sh	a5,36(s1)
+  f->readable = !(omode & O_WRONLY);
+    80204eaa:	fdc42783          	lw	a5,-36(s0)
+    80204eae:	0017c713          	xori	a4,a5,1
+    80204eb2:	8b05                	andi	a4,a4,1
+    80204eb4:	00e48423          	sb	a4,8(s1)
+  f->writable = (omode & O_WRONLY) || (omode & O_RDWR);
+    80204eb8:	8b8d                	andi	a5,a5,3
+    80204eba:	00f037b3          	snez	a5,a5
+    80204ebe:	00f484a3          	sb	a5,9(s1)
+
+  return fd;
+    80204ec2:	a811                	j	80204ed6 <sys_dev+0xae>
+    panic("dev file on FAT");
+    80204ec4:	00005517          	auipc	a0,0x5
+    80204ec8:	e7450513          	addi	a0,a0,-396 # 80209d38 <digits+0x9b8>
+    80204ecc:	ffffb097          	auipc	ra,0xffffb
+    80204ed0:	278080e7          	jalr	632(ra) # 80200144 <panic>
+    return -1;
+    80204ed4:	557d                	li	a0,-1
+}
+    80204ed6:	70a2                	ld	ra,40(sp)
+    80204ed8:	7402                	ld	s0,32(sp)
+    80204eda:	64e2                	ld	s1,24(sp)
+    80204edc:	6145                	addi	sp,sp,48
+    80204ede:	8082                	ret
+    return -1;
+    80204ee0:	557d                	li	a0,-1
+    80204ee2:	bfd5                	j	80204ed6 <sys_dev+0xae>
+    80204ee4:	557d                	li	a0,-1
+    80204ee6:	bfc5                	j	80204ed6 <sys_dev+0xae>
+    return -1;
+    80204ee8:	557d                	li	a0,-1
+    80204eea:	b7f5                	j	80204ed6 <sys_dev+0xae>
+      fileclose(f);
+    80204eec:	8526                	mv	a0,s1
+    80204eee:	fffff097          	auipc	ra,0xfffff
+    80204ef2:	de4080e7          	jalr	-540(ra) # 80203cd2 <fileclose>
+    return -1;
+    80204ef6:	557d                	li	a0,-1
+    80204ef8:	bff9                	j	80204ed6 <sys_dev+0xae>
+
+0000000080204efa <sys_readdir>:
+
+// To support ls command
+uint64
+sys_readdir(void)
+{
+    80204efa:	1101                	addi	sp,sp,-32
+    80204efc:	ec06                	sd	ra,24(sp)
+    80204efe:	e822                	sd	s0,16(sp)
+    80204f00:	1000                	addi	s0,sp,32
+  struct file *f;
+  uint64 p;
+
+  if(argfd(0, 0, &f) < 0 || argaddr(1, &p) < 0)
+    80204f02:	fe840613          	addi	a2,s0,-24
+    80204f06:	4581                	li	a1,0
+    80204f08:	4501                	li	a0,0
+    80204f0a:	00000097          	auipc	ra,0x0
+    80204f0e:	8a8080e7          	jalr	-1880(ra) # 802047b2 <argfd>
+    return -1;
+    80204f12:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argaddr(1, &p) < 0)
+    80204f14:	02054563          	bltz	a0,80204f3e <sys_readdir+0x44>
+    80204f18:	fe040593          	addi	a1,s0,-32
+    80204f1c:	4505                	li	a0,1
+    80204f1e:	ffffe097          	auipc	ra,0xffffe
+    80204f22:	1c6080e7          	jalr	454(ra) # 802030e4 <argaddr>
+    return -1;
+    80204f26:	57fd                	li	a5,-1
+  if(argfd(0, 0, &f) < 0 || argaddr(1, &p) < 0)
+    80204f28:	00054b63          	bltz	a0,80204f3e <sys_readdir+0x44>
+  return dirnext(f, p);
+    80204f2c:	fe043583          	ld	a1,-32(s0)
+    80204f30:	fe843503          	ld	a0,-24(s0)
+    80204f34:	fffff097          	auipc	ra,0xfffff
+    80204f38:	04a080e7          	jalr	74(ra) # 80203f7e <dirnext>
+    80204f3c:	87aa                	mv	a5,a0
+}
+    80204f3e:	853e                	mv	a0,a5
+    80204f40:	60e2                	ld	ra,24(sp)
+    80204f42:	6442                	ld	s0,16(sp)
+    80204f44:	6105                	addi	sp,sp,32
+    80204f46:	8082                	ret
+
+0000000080204f48 <sys_getcwd>:
+
+// get absolute cwd string
+uint64
+sys_getcwd(void)
+{
+    80204f48:	714d                	addi	sp,sp,-336
+    80204f4a:	e686                	sd	ra,328(sp)
+    80204f4c:	e2a2                	sd	s0,320(sp)
+    80204f4e:	fe26                	sd	s1,312(sp)
+    80204f50:	fa4a                	sd	s2,304(sp)
+    80204f52:	f64e                	sd	s3,296(sp)
+    80204f54:	f252                	sd	s4,288(sp)
+    80204f56:	ee56                	sd	s5,280(sp)
+    80204f58:	0a80                	addi	s0,sp,336
+  uint64 addr;
+  int size;
+  if (argaddr(0, &addr) < 0 || argint(1, &size))
+    80204f5a:	fb840593          	addi	a1,s0,-72
+    80204f5e:	4501                	li	a0,0
+    80204f60:	ffffe097          	auipc	ra,0xffffe
+    80204f64:	184080e7          	jalr	388(ra) # 802030e4 <argaddr>
+    return NULL;
+    80204f68:	4781                	li	a5,0
+  if (argaddr(0, &addr) < 0 || argint(1, &size))
+    80204f6a:	00054b63          	bltz	a0,80204f80 <sys_getcwd+0x38>
+    80204f6e:	fb440593          	addi	a1,s0,-76
+    80204f72:	4505                	li	a0,1
+    80204f74:	ffffe097          	auipc	ra,0xffffe
+    80204f78:	10e080e7          	jalr	270(ra) # 80203082 <argint>
+    return NULL;
+    80204f7c:	4781                	li	a5,0
+  if (argaddr(0, &addr) < 0 || argint(1, &size))
+    80204f7e:	c919                	beqz	a0,80204f94 <sys_getcwd+0x4c>
+  if (copyout2(addr, s, strlen(s) + 1) < 0)
+    return NULL;
+  
+  return addr;
+
+}
+    80204f80:	853e                	mv	a0,a5
+    80204f82:	60b6                	ld	ra,328(sp)
+    80204f84:	6416                	ld	s0,320(sp)
+    80204f86:	74f2                	ld	s1,312(sp)
+    80204f88:	7952                	ld	s2,304(sp)
+    80204f8a:	79b2                	ld	s3,296(sp)
+    80204f8c:	7a12                	ld	s4,288(sp)
+    80204f8e:	6af2                	ld	s5,280(sp)
+    80204f90:	6171                	addi	sp,sp,336
+    80204f92:	8082                	ret
+  struct dirent *de = myproc()->cwd;
+    80204f94:	ffffd097          	auipc	ra,0xffffd
+    80204f98:	aa8080e7          	jalr	-1368(ra) # 80201a3c <myproc>
+    80204f9c:	15853483          	ld	s1,344(a0)
+  if (de->parent == NULL) {
+    80204fa0:	1204b783          	ld	a5,288(s1)
+    80204fa4:	c3c9                	beqz	a5,80205026 <sys_getcwd+0xde>
+    *s = '\0';
+    80204fa6:	fa0409a3          	sb	zero,-77(s0)
+    s = path + FAT32_MAX_PATH - 1;
+    80204faa:	fb340993          	addi	s3,s0,-77
+      if (s <= path)          // can't reach root "/"
+    80204fae:	eb040a13          	addi	s4,s0,-336
+      *--s = '/';
+    80204fb2:	02f00a93          	li	s5,47
+      len = strlen(de->filename);
+    80204fb6:	8526                	mv	a0,s1
+    80204fb8:	ffffc097          	auipc	ra,0xffffc
+    80204fbc:	92e080e7          	jalr	-1746(ra) # 802008e6 <strlen>
+    80204fc0:	862a                	mv	a2,a0
+      s -= len;
+    80204fc2:	40a98933          	sub	s2,s3,a0
+      if (s <= path)          // can't reach root "/"
+    80204fc6:	072a7563          	bgeu	s4,s2,80205030 <sys_getcwd+0xe8>
+      strncpy(s, de->filename, len);
+    80204fca:	85a6                	mv	a1,s1
+    80204fcc:	854a                	mv	a0,s2
+    80204fce:	ffffc097          	auipc	ra,0xffffc
+    80204fd2:	8a8080e7          	jalr	-1880(ra) # 80200876 <strncpy>
+      *--s = '/';
+    80204fd6:	fff90993          	addi	s3,s2,-1
+    80204fda:	ff590fa3          	sb	s5,-1(s2)
+      de = de->parent;
+    80204fde:	1204b483          	ld	s1,288(s1)
+    while (de->parent) {
+    80204fe2:	1204b783          	ld	a5,288(s1)
+    80204fe6:	fbe1                	bnez	a5,80204fb6 <sys_getcwd+0x6e>
+  if(strlen(s) + 1 > size) {
+    80204fe8:	854e                	mv	a0,s3
+    80204fea:	ffffc097          	auipc	ra,0xffffc
+    80204fee:	8fc080e7          	jalr	-1796(ra) # 802008e6 <strlen>
+    80204ff2:	fb442703          	lw	a4,-76(s0)
+    return NULL;
+    80204ff6:	4781                	li	a5,0
+  if(strlen(s) + 1 > size) {
+    80204ff8:	f8e554e3          	bge	a0,a4,80204f80 <sys_getcwd+0x38>
+  if (copyout2(addr, s, strlen(s) + 1) < 0)
+    80204ffc:	fb843483          	ld	s1,-72(s0)
+    80205000:	854e                	mv	a0,s3
+    80205002:	ffffc097          	auipc	ra,0xffffc
+    80205006:	8e4080e7          	jalr	-1820(ra) # 802008e6 <strlen>
+    8020500a:	0015061b          	addiw	a2,a0,1
+    8020500e:	85ce                	mv	a1,s3
+    80205010:	8526                	mv	a0,s1
+    80205012:	ffffc097          	auipc	ra,0xffffc
+    80205016:	360080e7          	jalr	864(ra) # 80201372 <copyout2>
+    return NULL;
+    8020501a:	4781                	li	a5,0
+  if (copyout2(addr, s, strlen(s) + 1) < 0)
+    8020501c:	f60542e3          	bltz	a0,80204f80 <sys_getcwd+0x38>
+  return addr;
+    80205020:	fb843783          	ld	a5,-72(s0)
+    80205024:	bfb1                	j	80204f80 <sys_getcwd+0x38>
+    s = "/";
+    80205026:	00004997          	auipc	s3,0x4
+    8020502a:	60a98993          	addi	s3,s3,1546 # 80209630 <digits+0x2b0>
+    8020502e:	bf6d                	j	80204fe8 <sys_getcwd+0xa0>
+        return -1;
+    80205030:	57fd                	li	a5,-1
+    80205032:	b7b9                	j	80204f80 <sys_getcwd+0x38>
+
+0000000080205034 <sys_remove>:
+  return ret == -1;
+}
+
+uint64
+sys_remove(void)
+{
+    80205034:	d6010113          	addi	sp,sp,-672
+    80205038:	28113c23          	sd	ra,664(sp)
+    8020503c:	28813823          	sd	s0,656(sp)
+    80205040:	28913423          	sd	s1,648(sp)
+    80205044:	1500                	addi	s0,sp,672
+  char path[FAT32_MAX_PATH];
+  struct dirent *ep;
+  int len;
+  if((len = argstr(0, path, FAT32_MAX_PATH)) <= 0)
+    80205046:	10400613          	li	a2,260
+    8020504a:	ed840593          	addi	a1,s0,-296
+    8020504e:	4501                	li	a0,0
+    80205050:	ffffe097          	auipc	ra,0xffffe
+    80205054:	0b6080e7          	jalr	182(ra) # 80203106 <argstr>
+    80205058:	0ea05a63          	blez	a0,8020514c <sys_remove+0x118>
+    return -1;
+
+  char *s = path + len - 1;
+    8020505c:	157d                	addi	a0,a0,-1
+    8020505e:	ed840713          	addi	a4,s0,-296
+    80205062:	00a707b3          	add	a5,a4,a0
+  while (s >= path && *s == '/') {
+    80205066:	02f00693          	li	a3,47
+    8020506a:	863a                	mv	a2,a4
+    8020506c:	00e7e963          	bltu	a5,a4,8020507e <sys_remove+0x4a>
+    80205070:	0007c703          	lbu	a4,0(a5)
+    80205074:	08d71a63          	bne	a4,a3,80205108 <sys_remove+0xd4>
+    s--;
+    80205078:	17fd                	addi	a5,a5,-1
+  while (s >= path && *s == '/') {
+    8020507a:	fec7fbe3          	bgeu	a5,a2,80205070 <sys_remove+0x3c>
+  }
+  if (s >= path && *s == '.' && (s == path || *--s == '/')) {
+    return -1;
+  }
+  
+  if((ep = ename(path)) == NULL){
+    8020507e:	ed840513          	addi	a0,s0,-296
+    80205082:	00002097          	auipc	ra,0x2
+    80205086:	d94080e7          	jalr	-620(ra) # 80206e16 <ename>
+    8020508a:	84aa                	mv	s1,a0
+    8020508c:	c561                	beqz	a0,80205154 <sys_remove+0x120>
+    return -1;
+  }
+  elock(ep);
+    8020508e:	00001097          	auipc	ra,0x1
+    80205092:	5e0080e7          	jalr	1504(ra) # 8020666e <elock>
+  if((ep->attribute & ATTR_DIRECTORY) && !isdirempty(ep)){
+    80205096:	1004c783          	lbu	a5,256(s1)
+    8020509a:	8bc1                	andi	a5,a5,16
+    8020509c:	c38d                	beqz	a5,802050be <sys_remove+0x8a>
+  ep.valid = 0;
+    8020509e:	e8041323          	sh	zero,-378(s0)
+  ret = enext(dp, &ep, 2 * 32, &count);   // skip the "." and ".."
+    802050a2:	d6c40693          	addi	a3,s0,-660
+    802050a6:	04000613          	li	a2,64
+    802050aa:	d7040593          	addi	a1,s0,-656
+    802050ae:	8526                	mv	a0,s1
+    802050b0:	00001097          	auipc	ra,0x1
+    802050b4:	7c2080e7          	jalr	1986(ra) # 80206872 <enext>
+  if((ep->attribute & ATTR_DIRECTORY) && !isdirempty(ep)){
+    802050b8:	57fd                	li	a5,-1
+    802050ba:	06f51d63          	bne	a0,a5,80205134 <sys_remove+0x100>
+      eunlock(ep);
+      eput(ep);
+      return -1;
+  }
+  elock(ep->parent);      // Will this lead to deadlock?
+    802050be:	1204b503          	ld	a0,288(s1)
+    802050c2:	00001097          	auipc	ra,0x1
+    802050c6:	5ac080e7          	jalr	1452(ra) # 8020666e <elock>
+  eremove(ep);
+    802050ca:	8526                	mv	a0,s1
+    802050cc:	00001097          	auipc	ra,0x1
+    802050d0:	46e080e7          	jalr	1134(ra) # 8020653a <eremove>
+  eunlock(ep->parent);
+    802050d4:	1204b503          	ld	a0,288(s1)
+    802050d8:	00001097          	auipc	ra,0x1
+    802050dc:	5cc080e7          	jalr	1484(ra) # 802066a4 <eunlock>
+  eunlock(ep);
+    802050e0:	8526                	mv	a0,s1
+    802050e2:	00001097          	auipc	ra,0x1
+    802050e6:	5c2080e7          	jalr	1474(ra) # 802066a4 <eunlock>
+  eput(ep);
+    802050ea:	8526                	mv	a0,s1
+    802050ec:	00001097          	auipc	ra,0x1
+    802050f0:	606080e7          	jalr	1542(ra) # 802066f2 <eput>
+
+  return 0;
+    802050f4:	4501                	li	a0,0
+}
+    802050f6:	29813083          	ld	ra,664(sp)
+    802050fa:	29013403          	ld	s0,656(sp)
+    802050fe:	28813483          	ld	s1,648(sp)
+    80205102:	2a010113          	addi	sp,sp,672
+    80205106:	8082                	ret
+  if (s >= path && *s == '.' && (s == path || *--s == '/')) {
+    80205108:	ed840713          	addi	a4,s0,-296
+    8020510c:	f6e7e9e3          	bltu	a5,a4,8020507e <sys_remove+0x4a>
+    80205110:	0007c683          	lbu	a3,0(a5)
+    80205114:	02e00713          	li	a4,46
+    80205118:	f6e693e3          	bne	a3,a4,8020507e <sys_remove+0x4a>
+    8020511c:	ed840713          	addi	a4,s0,-296
+    80205120:	02e78863          	beq	a5,a4,80205150 <sys_remove+0x11c>
+    80205124:	fff7c703          	lbu	a4,-1(a5)
+    80205128:	02f00793          	li	a5,47
+    8020512c:	f4f719e3          	bne	a4,a5,8020507e <sys_remove+0x4a>
+    return -1;
+    80205130:	557d                	li	a0,-1
+    80205132:	b7d1                	j	802050f6 <sys_remove+0xc2>
+      eunlock(ep);
+    80205134:	8526                	mv	a0,s1
+    80205136:	00001097          	auipc	ra,0x1
+    8020513a:	56e080e7          	jalr	1390(ra) # 802066a4 <eunlock>
+      eput(ep);
+    8020513e:	8526                	mv	a0,s1
+    80205140:	00001097          	auipc	ra,0x1
+    80205144:	5b2080e7          	jalr	1458(ra) # 802066f2 <eput>
+      return -1;
+    80205148:	557d                	li	a0,-1
+    8020514a:	b775                	j	802050f6 <sys_remove+0xc2>
+    return -1;
+    8020514c:	557d                	li	a0,-1
+    8020514e:	b765                	j	802050f6 <sys_remove+0xc2>
+    return -1;
+    80205150:	557d                	li	a0,-1
+    80205152:	b755                	j	802050f6 <sys_remove+0xc2>
+    return -1;
+    80205154:	557d                	li	a0,-1
+    80205156:	b745                	j	802050f6 <sys_remove+0xc2>
+
+0000000080205158 <sys_rename>:
+
+// Must hold too many locks at a time! It's possible to raise a deadlock.
+// Because this op takes some steps, we can't promise
+uint64
+sys_rename(void)
+{
+    80205158:	c4010113          	addi	sp,sp,-960
+    8020515c:	3a113c23          	sd	ra,952(sp)
+    80205160:	3a813823          	sd	s0,944(sp)
+    80205164:	3a913423          	sd	s1,936(sp)
+    80205168:	3b213023          	sd	s2,928(sp)
+    8020516c:	39313c23          	sd	s3,920(sp)
+    80205170:	39413823          	sd	s4,912(sp)
+    80205174:	0780                	addi	s0,sp,960
+  char old[FAT32_MAX_PATH], new[FAT32_MAX_PATH];
+  if (argstr(0, old, FAT32_MAX_PATH) < 0 || argstr(1, new, FAT32_MAX_PATH) < 0) {
+    80205176:	10400613          	li	a2,260
+    8020517a:	ec840593          	addi	a1,s0,-312
+    8020517e:	4501                	li	a0,0
+    80205180:	ffffe097          	auipc	ra,0xffffe
+    80205184:	f86080e7          	jalr	-122(ra) # 80203106 <argstr>
+      return -1;
+    80205188:	57fd                	li	a5,-1
+  if (argstr(0, old, FAT32_MAX_PATH) < 0 || argstr(1, new, FAT32_MAX_PATH) < 0) {
+    8020518a:	0c054d63          	bltz	a0,80205264 <sys_rename+0x10c>
+    8020518e:	10400613          	li	a2,260
+    80205192:	dc040593          	addi	a1,s0,-576
+    80205196:	4505                	li	a0,1
+    80205198:	ffffe097          	auipc	ra,0xffffe
+    8020519c:	f6e080e7          	jalr	-146(ra) # 80203106 <argstr>
+      return -1;
+    802051a0:	57fd                	li	a5,-1
+  if (argstr(0, old, FAT32_MAX_PATH) < 0 || argstr(1, new, FAT32_MAX_PATH) < 0) {
+    802051a2:	0c054163          	bltz	a0,80205264 <sys_rename+0x10c>
+  }
+
+  struct dirent *src = NULL, *dst = NULL, *pdst = NULL;
+  int srclock = 0;
+  char *name;
+  if ((src = ename(old)) == NULL || (pdst = enameparent(new, old)) == NULL
+    802051a6:	ec840513          	addi	a0,s0,-312
+    802051aa:	00002097          	auipc	ra,0x2
+    802051ae:	c6c080e7          	jalr	-916(ra) # 80206e16 <ename>
+    802051b2:	84aa                	mv	s1,a0
+    802051b4:	1c050963          	beqz	a0,80205386 <sys_rename+0x22e>
+    802051b8:	ec840593          	addi	a1,s0,-312
+    802051bc:	dc040513          	addi	a0,s0,-576
+    802051c0:	00002097          	auipc	ra,0x2
+    802051c4:	c74080e7          	jalr	-908(ra) # 80206e34 <enameparent>
+    802051c8:	892a                	mv	s2,a0
+    802051ca:	cd35                	beqz	a0,80205246 <sys_rename+0xee>
+      || (name = formatname(old)) == NULL) {
+    802051cc:	ec840513          	addi	a0,s0,-312
+    802051d0:	00001097          	auipc	ra,0x1
+    802051d4:	dbe080e7          	jalr	-578(ra) # 80205f8e <formatname>
+    802051d8:	89aa                	mv	s3,a0
+    802051da:	c535                	beqz	a0,80205246 <sys_rename+0xee>
+    goto fail;          // src doesn't exist || dst parent doesn't exist || illegal new name
+  }
+  for (struct dirent *ep = pdst; ep != NULL; ep = ep->parent) {
+    if (ep == src) {    // In what universe can we move a directory into its child?
+    802051dc:	07248563          	beq	s1,s2,80205246 <sys_rename+0xee>
+  for (struct dirent *ep = pdst; ep != NULL; ep = ep->parent) {
+    802051e0:	87ca                	mv	a5,s2
+    802051e2:	1207b783          	ld	a5,288(a5)
+    802051e6:	c781                	beqz	a5,802051ee <sys_rename+0x96>
+    if (ep == src) {    // In what universe can we move a directory into its child?
+    802051e8:	fef49de3          	bne	s1,a5,802051e2 <sys_rename+0x8a>
+    802051ec:	a8a9                	j	80205246 <sys_rename+0xee>
+      goto fail;
+    }
+  }
+
+  uint off;
+  elock(src);     // must hold child's lock before acquiring parent's, because we do so in other similar cases
+    802051ee:	8526                	mv	a0,s1
+    802051f0:	00001097          	auipc	ra,0x1
+    802051f4:	47e080e7          	jalr	1150(ra) # 8020666e <elock>
+  srclock = 1;
+  elock(pdst);
+    802051f8:	854a                	mv	a0,s2
+    802051fa:	00001097          	auipc	ra,0x1
+    802051fe:	474080e7          	jalr	1140(ra) # 8020666e <elock>
+  dst = dirlookup(pdst, name, &off);
+    80205202:	dbc40613          	addi	a2,s0,-580
+    80205206:	85ce                	mv	a1,s3
+    80205208:	854a                	mv	a0,s2
+    8020520a:	00001097          	auipc	ra,0x1
+    8020520e:	7f2080e7          	jalr	2034(ra) # 802069fc <dirlookup>
+    80205212:	8a2a                	mv	s4,a0
+  if (dst != NULL) {
+    80205214:	cd45                	beqz	a0,802052cc <sys_rename+0x174>
+    eunlock(pdst);
+    80205216:	854a                	mv	a0,s2
+    80205218:	00001097          	auipc	ra,0x1
+    8020521c:	48c080e7          	jalr	1164(ra) # 802066a4 <eunlock>
+    if (src == dst) {
+    80205220:	01448963          	beq	s1,s4,80205232 <sys_rename+0xda>
+      goto fail;
+    } else if (src->attribute & dst->attribute & ATTR_DIRECTORY) {
+    80205224:	1004c783          	lbu	a5,256(s1)
+    80205228:	100a4703          	lbu	a4,256(s4)
+    8020522c:	8ff9                	and	a5,a5,a4
+    8020522e:	8bc1                	andi	a5,a5,16
+    80205230:	ebb1                	bnez	a5,80205284 <sys_rename+0x12c>
+
+  return 0;
+
+fail:
+  if (srclock)
+    eunlock(src);
+    80205232:	8526                	mv	a0,s1
+    80205234:	00001097          	auipc	ra,0x1
+    80205238:	470080e7          	jalr	1136(ra) # 802066a4 <eunlock>
+  if (dst)
+    eput(dst);
+    8020523c:	8552                	mv	a0,s4
+    8020523e:	00001097          	auipc	ra,0x1
+    80205242:	4b4080e7          	jalr	1204(ra) # 802066f2 <eput>
+  if (pdst)
+    80205246:	00090763          	beqz	s2,80205254 <sys_rename+0xfc>
+    eput(pdst);
+    8020524a:	854a                	mv	a0,s2
+    8020524c:	00001097          	auipc	ra,0x1
+    80205250:	4a6080e7          	jalr	1190(ra) # 802066f2 <eput>
+  if (src)
+    eput(src);
+  return -1;
+    80205254:	57fd                	li	a5,-1
+  if (src)
+    80205256:	c499                	beqz	s1,80205264 <sys_rename+0x10c>
+    eput(src);
+    80205258:	8526                	mv	a0,s1
+    8020525a:	00001097          	auipc	ra,0x1
+    8020525e:	498080e7          	jalr	1176(ra) # 802066f2 <eput>
+  return -1;
+    80205262:	57fd                	li	a5,-1
+}
+    80205264:	853e                	mv	a0,a5
+    80205266:	3b813083          	ld	ra,952(sp)
+    8020526a:	3b013403          	ld	s0,944(sp)
+    8020526e:	3a813483          	ld	s1,936(sp)
+    80205272:	3a013903          	ld	s2,928(sp)
+    80205276:	39813983          	ld	s3,920(sp)
+    8020527a:	39013a03          	ld	s4,912(sp)
+    8020527e:	3c010113          	addi	sp,sp,960
+    80205282:	8082                	ret
+      elock(dst);
+    80205284:	8552                	mv	a0,s4
+    80205286:	00001097          	auipc	ra,0x1
+    8020528a:	3e8080e7          	jalr	1000(ra) # 8020666e <elock>
+  ep.valid = 0;
+    8020528e:	d6041323          	sh	zero,-666(s0)
+  ret = enext(dp, &ep, 2 * 32, &count);   // skip the "." and ".."
+    80205292:	c4c40693          	addi	a3,s0,-948
+    80205296:	04000613          	li	a2,64
+    8020529a:	c5040593          	addi	a1,s0,-944
+    8020529e:	8552                	mv	a0,s4
+    802052a0:	00001097          	auipc	ra,0x1
+    802052a4:	5d2080e7          	jalr	1490(ra) # 80206872 <enext>
+      if (!isdirempty(dst)) {    // it's ok to overwrite an empty dir
+    802052a8:	57fd                	li	a5,-1
+    802052aa:	0cf51863          	bne	a0,a5,8020537a <sys_rename+0x222>
+      elock(pdst);
+    802052ae:	854a                	mv	a0,s2
+    802052b0:	00001097          	auipc	ra,0x1
+    802052b4:	3be080e7          	jalr	958(ra) # 8020666e <elock>
+    eremove(dst);
+    802052b8:	8552                	mv	a0,s4
+    802052ba:	00001097          	auipc	ra,0x1
+    802052be:	280080e7          	jalr	640(ra) # 8020653a <eremove>
+    eunlock(dst);
+    802052c2:	8552                	mv	a0,s4
+    802052c4:	00001097          	auipc	ra,0x1
+    802052c8:	3e0080e7          	jalr	992(ra) # 802066a4 <eunlock>
+  memmove(src->filename, name, FAT32_MAX_FILENAME);
+    802052cc:	0ff00613          	li	a2,255
+    802052d0:	85ce                	mv	a1,s3
+    802052d2:	8526                	mv	a0,s1
+    802052d4:	ffffb097          	auipc	ra,0xffffb
+    802052d8:	4ea080e7          	jalr	1258(ra) # 802007be <memmove>
+  emake(pdst, src, off);
+    802052dc:	dbc42603          	lw	a2,-580(s0)
+    802052e0:	85a6                	mv	a1,s1
+    802052e2:	854a                	mv	a0,s2
+    802052e4:	00001097          	auipc	ra,0x1
+    802052e8:	d62080e7          	jalr	-670(ra) # 80206046 <emake>
+  if (src->parent != pdst) {
+    802052ec:	1204b783          	ld	a5,288(s1)
+    802052f0:	01278d63          	beq	a5,s2,8020530a <sys_rename+0x1b2>
+    eunlock(pdst);
+    802052f4:	854a                	mv	a0,s2
+    802052f6:	00001097          	auipc	ra,0x1
+    802052fa:	3ae080e7          	jalr	942(ra) # 802066a4 <eunlock>
+    elock(src->parent);
+    802052fe:	1204b503          	ld	a0,288(s1)
+    80205302:	00001097          	auipc	ra,0x1
+    80205306:	36c080e7          	jalr	876(ra) # 8020666e <elock>
+  eremove(src);
+    8020530a:	8526                	mv	a0,s1
+    8020530c:	00001097          	auipc	ra,0x1
+    80205310:	22e080e7          	jalr	558(ra) # 8020653a <eremove>
+  eunlock(src->parent);
+    80205314:	1204b503          	ld	a0,288(s1)
+    80205318:	00001097          	auipc	ra,0x1
+    8020531c:	38c080e7          	jalr	908(ra) # 802066a4 <eunlock>
+  struct dirent *psrc = src->parent;  // src must not be root, or it won't pass the for-loop test
+    80205320:	1204b983          	ld	s3,288(s1)
+  src->parent = edup(pdst);
+    80205324:	854a                	mv	a0,s2
+    80205326:	00001097          	auipc	ra,0x1
+    8020532a:	0ea080e7          	jalr	234(ra) # 80206410 <edup>
+    8020532e:	12a4b023          	sd	a0,288(s1)
+  src->off = off;
+    80205332:	dbc42783          	lw	a5,-580(s0)
+    80205336:	10f4ae23          	sw	a5,284(s1)
+  src->valid = 1;
+    8020533a:	4785                	li	a5,1
+    8020533c:	10f49b23          	sh	a5,278(s1)
+  eunlock(src);
+    80205340:	8526                	mv	a0,s1
+    80205342:	00001097          	auipc	ra,0x1
+    80205346:	362080e7          	jalr	866(ra) # 802066a4 <eunlock>
+  eput(psrc);
+    8020534a:	854e                	mv	a0,s3
+    8020534c:	00001097          	auipc	ra,0x1
+    80205350:	3a6080e7          	jalr	934(ra) # 802066f2 <eput>
+  if (dst) {
+    80205354:	000a0763          	beqz	s4,80205362 <sys_rename+0x20a>
+    eput(dst);
+    80205358:	8552                	mv	a0,s4
+    8020535a:	00001097          	auipc	ra,0x1
+    8020535e:	398080e7          	jalr	920(ra) # 802066f2 <eput>
+  eput(pdst);
+    80205362:	854a                	mv	a0,s2
+    80205364:	00001097          	auipc	ra,0x1
+    80205368:	38e080e7          	jalr	910(ra) # 802066f2 <eput>
+  eput(src);
+    8020536c:	8526                	mv	a0,s1
+    8020536e:	00001097          	auipc	ra,0x1
+    80205372:	384080e7          	jalr	900(ra) # 802066f2 <eput>
+  return 0;
+    80205376:	4781                	li	a5,0
+    80205378:	b5f5                	j	80205264 <sys_rename+0x10c>
+        eunlock(dst);
+    8020537a:	8552                	mv	a0,s4
+    8020537c:	00001097          	auipc	ra,0x1
+    80205380:	328080e7          	jalr	808(ra) # 802066a4 <eunlock>
+        goto fail;
+    80205384:	b57d                	j	80205232 <sys_rename+0xda>
+  struct dirent *src = NULL, *dst = NULL, *pdst = NULL;
+    80205386:	892a                	mv	s2,a0
+  if (dst)
+    80205388:	bd7d                	j	80205246 <sys_rename+0xee>
+    8020538a:	0000                	unimp
+    8020538c:	0000                	unimp
+	...
+
+0000000080205390 <kernelvec>:
+    80205390:	7111                	addi	sp,sp,-256
+    80205392:	e006                	sd	ra,0(sp)
+    80205394:	e40a                	sd	sp,8(sp)
+    80205396:	e80e                	sd	gp,16(sp)
+    80205398:	ec12                	sd	tp,24(sp)
+    8020539a:	f016                	sd	t0,32(sp)
+    8020539c:	f41a                	sd	t1,40(sp)
+    8020539e:	f81e                	sd	t2,48(sp)
+    802053a0:	fc22                	sd	s0,56(sp)
+    802053a2:	e0a6                	sd	s1,64(sp)
+    802053a4:	e4aa                	sd	a0,72(sp)
+    802053a6:	e8ae                	sd	a1,80(sp)
+    802053a8:	ecb2                	sd	a2,88(sp)
+    802053aa:	f0b6                	sd	a3,96(sp)
+    802053ac:	f4ba                	sd	a4,104(sp)
+    802053ae:	f8be                	sd	a5,112(sp)
+    802053b0:	fcc2                	sd	a6,120(sp)
+    802053b2:	e146                	sd	a7,128(sp)
+    802053b4:	e54a                	sd	s2,136(sp)
+    802053b6:	e94e                	sd	s3,144(sp)
+    802053b8:	ed52                	sd	s4,152(sp)
+    802053ba:	f156                	sd	s5,160(sp)
+    802053bc:	f55a                	sd	s6,168(sp)
+    802053be:	f95e                	sd	s7,176(sp)
+    802053c0:	fd62                	sd	s8,184(sp)
+    802053c2:	e1e6                	sd	s9,192(sp)
+    802053c4:	e5ea                	sd	s10,200(sp)
+    802053c6:	e9ee                	sd	s11,208(sp)
+    802053c8:	edf2                	sd	t3,216(sp)
+    802053ca:	f1f6                	sd	t4,224(sp)
+    802053cc:	f5fa                	sd	t5,232(sp)
+    802053ce:	f9fe                	sd	t6,240(sp)
+    802053d0:	fc4fd0ef          	jal	ra,80202b94 <kerneltrap>
+    802053d4:	6082                	ld	ra,0(sp)
+    802053d6:	6122                	ld	sp,8(sp)
+    802053d8:	61c2                	ld	gp,16(sp)
+    802053da:	7282                	ld	t0,32(sp)
+    802053dc:	7322                	ld	t1,40(sp)
+    802053de:	73c2                	ld	t2,48(sp)
+    802053e0:	7462                	ld	s0,56(sp)
+    802053e2:	6486                	ld	s1,64(sp)
+    802053e4:	6526                	ld	a0,72(sp)
+    802053e6:	65c6                	ld	a1,80(sp)
+    802053e8:	6666                	ld	a2,88(sp)
+    802053ea:	7686                	ld	a3,96(sp)
+    802053ec:	7726                	ld	a4,104(sp)
+    802053ee:	77c6                	ld	a5,112(sp)
+    802053f0:	7866                	ld	a6,120(sp)
+    802053f2:	688a                	ld	a7,128(sp)
+    802053f4:	692a                	ld	s2,136(sp)
+    802053f6:	69ca                	ld	s3,144(sp)
+    802053f8:	6a6a                	ld	s4,152(sp)
+    802053fa:	7a8a                	ld	s5,160(sp)
+    802053fc:	7b2a                	ld	s6,168(sp)
+    802053fe:	7bca                	ld	s7,176(sp)
+    80205400:	7c6a                	ld	s8,184(sp)
+    80205402:	6c8e                	ld	s9,192(sp)
+    80205404:	6d2e                	ld	s10,200(sp)
+    80205406:	6dce                	ld	s11,208(sp)
+    80205408:	6e6e                	ld	t3,216(sp)
+    8020540a:	7e8e                	ld	t4,224(sp)
+    8020540c:	7f2e                	ld	t5,232(sp)
+    8020540e:	7fce                	ld	t6,240(sp)
+    80205410:	6111                	addi	sp,sp,256
+    80205412:	10200073          	sret
+	...
+
+000000008020541e <timerinit>:
+#include "include/proc.h"
+
+struct spinlock tickslock;
+uint ticks;
+
+void timerinit() {
+    8020541e:	1141                	addi	sp,sp,-16
+    80205420:	e406                	sd	ra,8(sp)
+    80205422:	e022                	sd	s0,0(sp)
+    80205424:	0800                	addi	s0,sp,16
+    initlock(&tickslock, "time");
+    80205426:	00005597          	auipc	a1,0x5
+    8020542a:	92258593          	addi	a1,a1,-1758 # 80209d48 <digits+0x9c8>
+    8020542e:	00019517          	auipc	a0,0x19
+    80205432:	fda50513          	addi	a0,a0,-38 # 8021e408 <tickslock>
+    80205436:	ffffb097          	auipc	ra,0xffffb
+    8020543a:	24c080e7          	jalr	588(ra) # 80200682 <initlock>
+    #ifdef DEBUG
+    printf("timerinit\n");
+    #endif
+}
+    8020543e:	60a2                	ld	ra,8(sp)
+    80205440:	6402                	ld	s0,0(sp)
+    80205442:	0141                	addi	sp,sp,16
+    80205444:	8082                	ret
+
+0000000080205446 <set_next_timeout>:
+
+void
+set_next_timeout() {
+    80205446:	1141                	addi	sp,sp,-16
+    80205448:	e422                	sd	s0,8(sp)
+    8020544a:	0800                	addi	s0,sp,16
+  asm volatile("rdtime %0" : "=r" (x) );
+    8020544c:	c0102573          	rdtime	a0
+    // if comment the `printf` line below
+    // the timer will not work.
+
+    // this bug seems to disappear automatically
+    // printf("");
+    sbi_set_timer(r_time() + INTERVAL);
+    80205450:	001dc7b7          	lui	a5,0x1dc
+    80205454:	13078793          	addi	a5,a5,304 # 1dc130 <_entry-0x80023ed0>
+    80205458:	953e                	add	a0,a0,a5
+	SBI_CALL_1(SBI_SET_TIMER, stime_value);
+    8020545a:	4581                	li	a1,0
+    8020545c:	4601                	li	a2,0
+    8020545e:	4681                	li	a3,0
+    80205460:	4881                	li	a7,0
+    80205462:	00000073          	ecall
+}
+    80205466:	6422                	ld	s0,8(sp)
+    80205468:	0141                	addi	sp,sp,16
+    8020546a:	8082                	ret
+
+000000008020546c <timer_tick>:
+
+void timer_tick() {
+    8020546c:	1101                	addi	sp,sp,-32
+    8020546e:	ec06                	sd	ra,24(sp)
+    80205470:	e822                	sd	s0,16(sp)
+    80205472:	e426                	sd	s1,8(sp)
+    80205474:	1000                	addi	s0,sp,32
+    acquire(&tickslock);
+    80205476:	00019497          	auipc	s1,0x19
+    8020547a:	f9248493          	addi	s1,s1,-110 # 8021e408 <tickslock>
+    8020547e:	8526                	mv	a0,s1
+    80205480:	ffffb097          	auipc	ra,0xffffb
+    80205484:	246080e7          	jalr	582(ra) # 802006c6 <acquire>
+    ticks++;
+    80205488:	4c9c                	lw	a5,24(s1)
+    8020548a:	2785                	addiw	a5,a5,1
+    8020548c:	cc9c                	sw	a5,24(s1)
+    wakeup(&ticks);
+    8020548e:	00019517          	auipc	a0,0x19
+    80205492:	f9250513          	addi	a0,a0,-110 # 8021e420 <ticks>
+    80205496:	ffffd097          	auipc	ra,0xffffd
+    8020549a:	1f6080e7          	jalr	502(ra) # 8020268c <wakeup>
+    release(&tickslock);
+    8020549e:	8526                	mv	a0,s1
+    802054a0:	ffffb097          	auipc	ra,0xffffb
+    802054a4:	27a080e7          	jalr	634(ra) # 8020071a <release>
+    set_next_timeout();
+    802054a8:	00000097          	auipc	ra,0x0
+    802054ac:	f9e080e7          	jalr	-98(ra) # 80205446 <set_next_timeout>
+}
+    802054b0:	60e2                	ld	ra,24(sp)
+    802054b2:	6442                	ld	s0,16(sp)
+    802054b4:	64a2                	ld	s1,8(sp)
+    802054b6:	6105                	addi	sp,sp,32
+    802054b8:	8082                	ret
+
+00000000802054ba <disk_init>:
+#else
+#include "include/virtio.h"
+#endif 
+
+void disk_init(void)
+{
+    802054ba:	1141                	addi	sp,sp,-16
+    802054bc:	e406                	sd	ra,8(sp)
+    802054be:	e022                	sd	s0,0(sp)
+    802054c0:	0800                	addi	s0,sp,16
+    #ifdef QEMU
+    virtio_disk_init();
+    802054c2:	00002097          	auipc	ra,0x2
+    802054c6:	e8e080e7          	jalr	-370(ra) # 80207350 <virtio_disk_init>
+	#else 
+	sdcard_init();
+    #endif
+}
+    802054ca:	60a2                	ld	ra,8(sp)
+    802054cc:	6402                	ld	s0,0(sp)
+    802054ce:	0141                	addi	sp,sp,16
+    802054d0:	8082                	ret
+
+00000000802054d2 <disk_read>:
+
+void disk_read(struct buf *b)
+{
+    802054d2:	1141                	addi	sp,sp,-16
+    802054d4:	e406                	sd	ra,8(sp)
+    802054d6:	e022                	sd	s0,0(sp)
+    802054d8:	0800                	addi	s0,sp,16
+    #ifdef QEMU
+	virtio_disk_rw(b, 0);
+    802054da:	4581                	li	a1,0
+    802054dc:	00002097          	auipc	ra,0x2
+    802054e0:	ffa080e7          	jalr	-6(ra) # 802074d6 <virtio_disk_rw>
+    #else 
+	sdcard_read_sector(b->data, b->sectorno);
+	#endif
+}
+    802054e4:	60a2                	ld	ra,8(sp)
+    802054e6:	6402                	ld	s0,0(sp)
+    802054e8:	0141                	addi	sp,sp,16
+    802054ea:	8082                	ret
+
+00000000802054ec <disk_write>:
+
+void disk_write(struct buf *b)
+{
+    802054ec:	1141                	addi	sp,sp,-16
+    802054ee:	e406                	sd	ra,8(sp)
+    802054f0:	e022                	sd	s0,0(sp)
+    802054f2:	0800                	addi	s0,sp,16
+    #ifdef QEMU
+	virtio_disk_rw(b, 1);
+    802054f4:	4585                	li	a1,1
+    802054f6:	00002097          	auipc	ra,0x2
+    802054fa:	fe0080e7          	jalr	-32(ra) # 802074d6 <virtio_disk_rw>
+    #else 
+	sdcard_write_sector(b->data, b->sectorno);
+	#endif
+}
+    802054fe:	60a2                	ld	ra,8(sp)
+    80205500:	6402                	ld	s0,0(sp)
+    80205502:	0141                	addi	sp,sp,16
+    80205504:	8082                	ret
+
+0000000080205506 <disk_intr>:
+
+void disk_intr(void)
+{
+    80205506:	1141                	addi	sp,sp,-16
+    80205508:	e406                	sd	ra,8(sp)
+    8020550a:	e022                	sd	s0,0(sp)
+    8020550c:	0800                	addi	s0,sp,16
+    #ifdef QEMU
+    virtio_disk_intr();
+    8020550e:	00002097          	auipc	ra,0x2
+    80205512:	254080e7          	jalr	596(ra) # 80207762 <virtio_disk_intr>
+    #else 
+    dmac_intr(DMAC_CHANNEL0);
+    #endif
+}
+    80205516:	60a2                	ld	ra,8(sp)
+    80205518:	6402                	ld	s0,0(sp)
+    8020551a:	0141                	addi	sp,sp,16
+    8020551c:	8082                	ret
+
+000000008020551e <read_fat>:
+/**
+ * Read the FAT table content corresponded to the given cluster number.
+ * @param   cluster     the number of cluster which you want to read its content in FAT table
+ */
+static uint32 read_fat(uint32 cluster)
+{
+    8020551e:	1101                	addi	sp,sp,-32
+    80205520:	ec06                	sd	ra,24(sp)
+    80205522:	e822                	sd	s0,16(sp)
+    80205524:	e426                	sd	s1,8(sp)
+    80205526:	e04a                	sd	s2,0(sp)
+    80205528:	1000                	addi	s0,sp,32
+    if (cluster >= FAT32_EOC) {
+    8020552a:	100007b7          	lui	a5,0x10000
+    8020552e:	17dd                	addi	a5,a5,-9 # ffffff7 <_entry-0x70200009>
+        return cluster;
+    80205530:	84aa                	mv	s1,a0
+    if (cluster >= FAT32_EOC) {
+    80205532:	00a7ea63          	bltu	a5,a0,80205546 <read_fat+0x28>
+    }
+    if (cluster > fat.data_clus_cnt + 1) {     // because cluster number starts at 2, not 0
+    80205536:	00019797          	auipc	a5,0x19
+    8020553a:	efa7a783          	lw	a5,-262(a5) # 8021e430 <fat+0x8>
+    8020553e:	2785                	addiw	a5,a5,1
+        return 0;
+    80205540:	4481                	li	s1,0
+    if (cluster > fat.data_clus_cnt + 1) {     // because cluster number starts at 2, not 0
+    80205542:	00a7f963          	bgeu	a5,a0,80205554 <read_fat+0x36>
+    // here should be a cache layer for FAT table, but not implemented yet.
+    struct buf *b = bread(0, fat_sec);
+    uint32 next_clus = *(uint32 *)(b->data + fat_offset_of_clus(cluster));
+    brelse(b);
+    return next_clus;
+}
+    80205546:	8526                	mv	a0,s1
+    80205548:	60e2                	ld	ra,24(sp)
+    8020554a:	6442                	ld	s0,16(sp)
+    8020554c:	64a2                	ld	s1,8(sp)
+    8020554e:	6902                	ld	s2,0(sp)
+    80205550:	6105                	addi	sp,sp,32
+    80205552:	8082                	ret
+    return fat.bpb.rsvd_sec_cnt + (cluster << 2) / fat.bpb.byts_per_sec + fat.bpb.fat_sz * (fat_num - 1);
+    80205554:	0025149b          	slliw	s1,a0,0x2
+    80205558:	00019917          	auipc	s2,0x19
+    8020555c:	ed090913          	addi	s2,s2,-304 # 8021e428 <fat>
+    80205560:	01095783          	lhu	a5,16(s2)
+    80205564:	02f4d7bb          	divuw	a5,s1,a5
+    80205568:	01495583          	lhu	a1,20(s2)
+    struct buf *b = bread(0, fat_sec);
+    8020556c:	9dbd                	addw	a1,a1,a5
+    8020556e:	4501                	li	a0,0
+    80205570:	ffffe097          	auipc	ra,0xffffe
+    80205574:	2e2080e7          	jalr	738(ra) # 80203852 <bread>
+    return (cluster << 2) % fat.bpb.byts_per_sec;
+    80205578:	01095783          	lhu	a5,16(s2)
+    8020557c:	02f4f4bb          	remuw	s1,s1,a5
+    uint32 next_clus = *(uint32 *)(b->data + fat_offset_of_clus(cluster));
+    80205580:	1482                	slli	s1,s1,0x20
+    80205582:	9081                	srli	s1,s1,0x20
+    80205584:	009507b3          	add	a5,a0,s1
+    80205588:	4fa4                	lw	s1,88(a5)
+    brelse(b);
+    8020558a:	ffffe097          	auipc	ra,0xffffe
+    8020558e:	3f4080e7          	jalr	1012(ra) # 8020397e <brelse>
+    return next_clus;
+    80205592:	bf55                	j	80205546 <read_fat+0x28>
+
+0000000080205594 <alloc_clus>:
+        brelse(b);
+    }
+}
+
+static uint32 alloc_clus(uint8 dev)
+{
+    80205594:	711d                	addi	sp,sp,-96
+    80205596:	ec86                	sd	ra,88(sp)
+    80205598:	e8a2                	sd	s0,80(sp)
+    8020559a:	e4a6                	sd	s1,72(sp)
+    8020559c:	e0ca                	sd	s2,64(sp)
+    8020559e:	fc4e                	sd	s3,56(sp)
+    802055a0:	f852                	sd	s4,48(sp)
+    802055a2:	f456                	sd	s5,40(sp)
+    802055a4:	f05a                	sd	s6,32(sp)
+    802055a6:	ec5e                	sd	s7,24(sp)
+    802055a8:	e862                	sd	s8,16(sp)
+    802055aa:	e466                	sd	s9,8(sp)
+    802055ac:	1080                	addi	s0,sp,96
+    // should we keep a free cluster list? instead of searching fat every time.
+    struct buf *b;
+    uint32 sec = fat.bpb.rsvd_sec_cnt;
+    802055ae:	00019797          	auipc	a5,0x19
+    802055b2:	e7a78793          	addi	a5,a5,-390 # 8021e428 <fat>
+    802055b6:	0147db83          	lhu	s7,20(a5)
+    uint32 const ent_per_sec = fat.bpb.byts_per_sec / sizeof(uint32);
+    802055ba:	0107d903          	lhu	s2,16(a5)
+    for (uint32 i = 0; i < fat.bpb.fat_sz; i++, sec++) {
+    802055be:	539c                	lw	a5,32(a5)
+    802055c0:	10078363          	beqz	a5,802056c6 <alloc_clus+0x132>
+    802055c4:	0029591b          	srliw	s2,s2,0x2
+    802055c8:	0009099b          	sext.w	s3,s2
+    802055cc:	4b01                	li	s6,0
+        b = bread(dev, sec);
+    802055ce:	00050a9b          	sext.w	s5,a0
+        for (uint32 j = 0; j < ent_per_sec; j++) {
+    802055d2:	4c01                	li	s8,0
+    for (uint32 i = 0; i < fat.bpb.fat_sz; i++, sec++) {
+    802055d4:	00019c97          	auipc	s9,0x19
+    802055d8:	e54c8c93          	addi	s9,s9,-428 # 8021e428 <fat>
+    802055dc:	a0c9                	j	8020569e <alloc_clus+0x10a>
+            if (((uint32 *)(b->data))[j] == 0) {
+                ((uint32 *)(b->data))[j] = FAT32_EOC + 7;
+    802055de:	100007b7          	lui	a5,0x10000
+    802055e2:	17fd                	addi	a5,a5,-1 # fffffff <_entry-0x70200001>
+    802055e4:	c29c                	sw	a5,0(a3)
+                bwrite(b);
+    802055e6:	8552                	mv	a0,s4
+    802055e8:	ffffe097          	auipc	ra,0xffffe
+    802055ec:	35a080e7          	jalr	858(ra) # 80203942 <bwrite>
+                brelse(b);
+    802055f0:	8552                	mv	a0,s4
+    802055f2:	ffffe097          	auipc	ra,0xffffe
+    802055f6:	38c080e7          	jalr	908(ra) # 8020397e <brelse>
+                uint32 clus = i * ent_per_sec + j;
+    802055fa:	0369093b          	mulw	s2,s2,s6
+    802055fe:	0099093b          	addw	s2,s2,s1
+    80205602:	00090a9b          	sext.w	s5,s2
+    return ((cluster - 2) * fat.bpb.sec_per_clus) + fat.first_data_sec;
+    80205606:	00019717          	auipc	a4,0x19
+    8020560a:	e2270713          	addi	a4,a4,-478 # 8021e428 <fat>
+    8020560e:	01274783          	lbu	a5,18(a4)
+    80205612:	ffe9099b          	addiw	s3,s2,-2
+    80205616:	02f989bb          	mulw	s3,s3,a5
+    8020561a:	4318                	lw	a4,0(a4)
+    8020561c:	00e989bb          	addw	s3,s3,a4
+    for (int i = 0; i < fat.bpb.sec_per_clus; i++) {
+    80205620:	c7b1                	beqz	a5,8020566c <alloc_clus+0xd8>
+    80205622:	4901                	li	s2,0
+    80205624:	00019a17          	auipc	s4,0x19
+    80205628:	e04a0a13          	addi	s4,s4,-508 # 8021e428 <fat>
+        b = bread(0, sec++);
+    8020562c:	013905bb          	addw	a1,s2,s3
+    80205630:	4501                	li	a0,0
+    80205632:	ffffe097          	auipc	ra,0xffffe
+    80205636:	220080e7          	jalr	544(ra) # 80203852 <bread>
+    8020563a:	84aa                	mv	s1,a0
+        memset(b->data, 0, BSIZE);
+    8020563c:	20000613          	li	a2,512
+    80205640:	4581                	li	a1,0
+    80205642:	05850513          	addi	a0,a0,88
+    80205646:	ffffb097          	auipc	ra,0xffffb
+    8020564a:	11c080e7          	jalr	284(ra) # 80200762 <memset>
+        bwrite(b);
+    8020564e:	8526                	mv	a0,s1
+    80205650:	ffffe097          	auipc	ra,0xffffe
+    80205654:	2f2080e7          	jalr	754(ra) # 80203942 <bwrite>
+        brelse(b);
+    80205658:	8526                	mv	a0,s1
+    8020565a:	ffffe097          	auipc	ra,0xffffe
+    8020565e:	324080e7          	jalr	804(ra) # 8020397e <brelse>
+    for (int i = 0; i < fat.bpb.sec_per_clus; i++) {
+    80205662:	2905                	addiw	s2,s2,1
+    80205664:	012a4783          	lbu	a5,18(s4)
+    80205668:	fcf942e3          	blt	s2,a5,8020562c <alloc_clus+0x98>
+            }
+        }
+        brelse(b);
+    }
+    panic("no clusters");
+}
+    8020566c:	8556                	mv	a0,s5
+    8020566e:	60e6                	ld	ra,88(sp)
+    80205670:	6446                	ld	s0,80(sp)
+    80205672:	64a6                	ld	s1,72(sp)
+    80205674:	6906                	ld	s2,64(sp)
+    80205676:	79e2                	ld	s3,56(sp)
+    80205678:	7a42                	ld	s4,48(sp)
+    8020567a:	7aa2                	ld	s5,40(sp)
+    8020567c:	7b02                	ld	s6,32(sp)
+    8020567e:	6be2                	ld	s7,24(sp)
+    80205680:	6c42                	ld	s8,16(sp)
+    80205682:	6ca2                	ld	s9,8(sp)
+    80205684:	6125                	addi	sp,sp,96
+    80205686:	8082                	ret
+        brelse(b);
+    80205688:	8552                	mv	a0,s4
+    8020568a:	ffffe097          	auipc	ra,0xffffe
+    8020568e:	2f4080e7          	jalr	756(ra) # 8020397e <brelse>
+    for (uint32 i = 0; i < fat.bpb.fat_sz; i++, sec++) {
+    80205692:	2b05                	addiw	s6,s6,1
+    80205694:	2b85                	addiw	s7,s7,1 # fffffffffffff001 <ebss_clear+0xffffffff7fdd9001>
+    80205696:	020ca783          	lw	a5,32(s9)
+    8020569a:	02fb7663          	bgeu	s6,a5,802056c6 <alloc_clus+0x132>
+        b = bread(dev, sec);
+    8020569e:	85de                	mv	a1,s7
+    802056a0:	8556                	mv	a0,s5
+    802056a2:	ffffe097          	auipc	ra,0xffffe
+    802056a6:	1b0080e7          	jalr	432(ra) # 80203852 <bread>
+    802056aa:	8a2a                	mv	s4,a0
+        for (uint32 j = 0; j < ent_per_sec; j++) {
+    802056ac:	fc098ee3          	beqz	s3,80205688 <alloc_clus+0xf4>
+    802056b0:	05850793          	addi	a5,a0,88
+    802056b4:	84e2                	mv	s1,s8
+            if (((uint32 *)(b->data))[j] == 0) {
+    802056b6:	86be                	mv	a3,a5
+    802056b8:	4398                	lw	a4,0(a5)
+    802056ba:	d315                	beqz	a4,802055de <alloc_clus+0x4a>
+        for (uint32 j = 0; j < ent_per_sec; j++) {
+    802056bc:	2485                	addiw	s1,s1,1
+    802056be:	0791                	addi	a5,a5,4
+    802056c0:	fe999be3          	bne	s3,s1,802056b6 <alloc_clus+0x122>
+    802056c4:	b7d1                	j	80205688 <alloc_clus+0xf4>
+    panic("no clusters");
+    802056c6:	00004517          	auipc	a0,0x4
+    802056ca:	68a50513          	addi	a0,a0,1674 # 80209d50 <digits+0x9d0>
+    802056ce:	ffffb097          	auipc	ra,0xffffb
+    802056d2:	a76080e7          	jalr	-1418(ra) # 80200144 <panic>
+
+00000000802056d6 <write_fat>:
+    if (cluster > fat.data_clus_cnt + 1) {
+    802056d6:	00019797          	auipc	a5,0x19
+    802056da:	d5a7a783          	lw	a5,-678(a5) # 8021e430 <fat+0x8>
+    802056de:	2785                	addiw	a5,a5,1
+    802056e0:	06a7e963          	bltu	a5,a0,80205752 <write_fat+0x7c>
+{
+    802056e4:	7179                	addi	sp,sp,-48
+    802056e6:	f406                	sd	ra,40(sp)
+    802056e8:	f022                	sd	s0,32(sp)
+    802056ea:	ec26                	sd	s1,24(sp)
+    802056ec:	e84a                	sd	s2,16(sp)
+    802056ee:	e44e                	sd	s3,8(sp)
+    802056f0:	e052                	sd	s4,0(sp)
+    802056f2:	1800                	addi	s0,sp,48
+    802056f4:	89ae                	mv	s3,a1
+    return fat.bpb.rsvd_sec_cnt + (cluster << 2) / fat.bpb.byts_per_sec + fat.bpb.fat_sz * (fat_num - 1);
+    802056f6:	0025149b          	slliw	s1,a0,0x2
+    802056fa:	00019a17          	auipc	s4,0x19
+    802056fe:	d2ea0a13          	addi	s4,s4,-722 # 8021e428 <fat>
+    80205702:	010a5783          	lhu	a5,16(s4)
+    80205706:	02f4d7bb          	divuw	a5,s1,a5
+    8020570a:	014a5583          	lhu	a1,20(s4)
+    struct buf *b = bread(0, fat_sec);
+    8020570e:	9dbd                	addw	a1,a1,a5
+    80205710:	4501                	li	a0,0
+    80205712:	ffffe097          	auipc	ra,0xffffe
+    80205716:	140080e7          	jalr	320(ra) # 80203852 <bread>
+    8020571a:	892a                	mv	s2,a0
+    return (cluster << 2) % fat.bpb.byts_per_sec;
+    8020571c:	010a5783          	lhu	a5,16(s4)
+    80205720:	02f4f4bb          	remuw	s1,s1,a5
+    *(uint32 *)(b->data + off) = content;
+    80205724:	1482                	slli	s1,s1,0x20
+    80205726:	9081                	srli	s1,s1,0x20
+    80205728:	94aa                	add	s1,s1,a0
+    8020572a:	0534ac23          	sw	s3,88(s1)
+    bwrite(b);
+    8020572e:	ffffe097          	auipc	ra,0xffffe
+    80205732:	214080e7          	jalr	532(ra) # 80203942 <bwrite>
+    brelse(b);
+    80205736:	854a                	mv	a0,s2
+    80205738:	ffffe097          	auipc	ra,0xffffe
+    8020573c:	246080e7          	jalr	582(ra) # 8020397e <brelse>
+    return 0;
+    80205740:	4501                	li	a0,0
+}
+    80205742:	70a2                	ld	ra,40(sp)
+    80205744:	7402                	ld	s0,32(sp)
+    80205746:	64e2                	ld	s1,24(sp)
+    80205748:	6942                	ld	s2,16(sp)
+    8020574a:	69a2                	ld	s3,8(sp)
+    8020574c:	6a02                	ld	s4,0(sp)
+    8020574e:	6145                	addi	sp,sp,48
+    80205750:	8082                	ret
+        return -1;
+    80205752:	557d                	li	a0,-1
+}
+    80205754:	8082                	ret
+
+0000000080205756 <reloc_clus>:
+ * @param   off         the offset from the beginning of the relative file
+ * @param   alloc       whether alloc new cluster when meeting end of FAT chains
+ * @return              the offset from the new cur_clus
+ */
+static int reloc_clus(struct dirent *entry, uint off, int alloc)
+{
+    80205756:	715d                	addi	sp,sp,-80
+    80205758:	e486                	sd	ra,72(sp)
+    8020575a:	e0a2                	sd	s0,64(sp)
+    8020575c:	fc26                	sd	s1,56(sp)
+    8020575e:	f84a                	sd	s2,48(sp)
+    80205760:	f44e                	sd	s3,40(sp)
+    80205762:	f052                	sd	s4,32(sp)
+    80205764:	ec56                	sd	s5,24(sp)
+    80205766:	e85a                	sd	s6,16(sp)
+    80205768:	e45e                	sd	s7,8(sp)
+    8020576a:	0880                	addi	s0,sp,80
+    8020576c:	84aa                	mv	s1,a0
+    8020576e:	8a2e                	mv	s4,a1
+    int clus_num = off / fat.byts_per_clus;
+    80205770:	00019b97          	auipc	s7,0x19
+    80205774:	cc4bab83          	lw	s7,-828(s7) # 8021e434 <fat+0xc>
+    80205778:	0375d9bb          	divuw	s3,a1,s7
+    while (clus_num > entry->clus_cnt) {
+    8020577c:	11052703          	lw	a4,272(a0)
+    80205780:	07377563          	bgeu	a4,s3,802057ea <reloc_clus+0x94>
+    80205784:	8b32                	mv	s6,a2
+        int clus = read_fat(entry->cur_clus);
+        if (clus >= FAT32_EOC) {
+    80205786:	10000ab7          	lui	s5,0x10000
+    8020578a:	1add                	addi	s5,s5,-9 # ffffff7 <_entry-0x70200009>
+    8020578c:	a81d                	j	802057c2 <reloc_clus+0x6c>
+            if (alloc) {
+                clus = alloc_clus(entry->dev);
+    8020578e:	1144c503          	lbu	a0,276(s1)
+    80205792:	00000097          	auipc	ra,0x0
+    80205796:	e02080e7          	jalr	-510(ra) # 80205594 <alloc_clus>
+    8020579a:	0005091b          	sext.w	s2,a0
+                write_fat(entry->cur_clus, clus);
+    8020579e:	85ca                	mv	a1,s2
+    802057a0:	10c4a503          	lw	a0,268(s1)
+    802057a4:	00000097          	auipc	ra,0x0
+    802057a8:	f32080e7          	jalr	-206(ra) # 802056d6 <write_fat>
+                entry->cur_clus = entry->first_clus;
+                entry->clus_cnt = 0;
+                return -1;
+            }
+        }
+        entry->cur_clus = clus;
+    802057ac:	1124a623          	sw	s2,268(s1)
+        entry->clus_cnt++;
+    802057b0:	1104a783          	lw	a5,272(s1)
+    802057b4:	2785                	addiw	a5,a5,1
+    802057b6:	0007871b          	sext.w	a4,a5
+    802057ba:	10f4a823          	sw	a5,272(s1)
+    while (clus_num > entry->clus_cnt) {
+    802057be:	03377663          	bgeu	a4,s3,802057ea <reloc_clus+0x94>
+        int clus = read_fat(entry->cur_clus);
+    802057c2:	10c4a503          	lw	a0,268(s1)
+    802057c6:	00000097          	auipc	ra,0x0
+    802057ca:	d58080e7          	jalr	-680(ra) # 8020551e <read_fat>
+    802057ce:	0005091b          	sext.w	s2,a0
+        if (clus >= FAT32_EOC) {
+    802057d2:	fd2adde3          	bge	s5,s2,802057ac <reloc_clus+0x56>
+            if (alloc) {
+    802057d6:	fa0b1ce3          	bnez	s6,8020578e <reloc_clus+0x38>
+                entry->cur_clus = entry->first_clus;
+    802057da:	1044a783          	lw	a5,260(s1)
+    802057de:	10f4a623          	sw	a5,268(s1)
+                entry->clus_cnt = 0;
+    802057e2:	1004a823          	sw	zero,272(s1)
+                return -1;
+    802057e6:	557d                	li	a0,-1
+    802057e8:	a881                	j	80205838 <reloc_clus+0xe2>
+    }
+    if (clus_num < entry->clus_cnt) {
+    802057ea:	04e9f163          	bgeu	s3,a4,8020582c <reloc_clus+0xd6>
+        entry->cur_clus = entry->first_clus;
+    802057ee:	1044a783          	lw	a5,260(s1)
+    802057f2:	10f4a623          	sw	a5,268(s1)
+        entry->clus_cnt = 0;
+    802057f6:	1004a823          	sw	zero,272(s1)
+        while (entry->clus_cnt < clus_num) {
+    802057fa:	037a6963          	bltu	s4,s7,8020582c <reloc_clus+0xd6>
+            entry->cur_clus = read_fat(entry->cur_clus);
+            if (entry->cur_clus >= FAT32_EOC) {
+    802057fe:	10000937          	lui	s2,0x10000
+    80205802:	195d                	addi	s2,s2,-9 # ffffff7 <_entry-0x70200009>
+            entry->cur_clus = read_fat(entry->cur_clus);
+    80205804:	10c4a503          	lw	a0,268(s1)
+    80205808:	00000097          	auipc	ra,0x0
+    8020580c:	d16080e7          	jalr	-746(ra) # 8020551e <read_fat>
+    80205810:	2501                	sext.w	a0,a0
+    80205812:	10a4a623          	sw	a0,268(s1)
+            if (entry->cur_clus >= FAT32_EOC) {
+    80205816:	02a96c63          	bltu	s2,a0,8020584e <reloc_clus+0xf8>
+                panic("reloc_clus");
+            }
+            entry->clus_cnt++;
+    8020581a:	1104a783          	lw	a5,272(s1)
+    8020581e:	2785                	addiw	a5,a5,1
+    80205820:	0007871b          	sext.w	a4,a5
+    80205824:	10f4a823          	sw	a5,272(s1)
+        while (entry->clus_cnt < clus_num) {
+    80205828:	fd376ee3          	bltu	a4,s3,80205804 <reloc_clus+0xae>
+        }
+    }
+    return off % fat.byts_per_clus;
+    8020582c:	00019797          	auipc	a5,0x19
+    80205830:	c087a783          	lw	a5,-1016(a5) # 8021e434 <fat+0xc>
+    80205834:	02fa753b          	remuw	a0,s4,a5
+}
+    80205838:	60a6                	ld	ra,72(sp)
+    8020583a:	6406                	ld	s0,64(sp)
+    8020583c:	74e2                	ld	s1,56(sp)
+    8020583e:	7942                	ld	s2,48(sp)
+    80205840:	79a2                	ld	s3,40(sp)
+    80205842:	7a02                	ld	s4,32(sp)
+    80205844:	6ae2                	ld	s5,24(sp)
+    80205846:	6b42                	ld	s6,16(sp)
+    80205848:	6ba2                	ld	s7,8(sp)
+    8020584a:	6161                	addi	sp,sp,80
+    8020584c:	8082                	ret
+                panic("reloc_clus");
+    8020584e:	00004517          	auipc	a0,0x4
+    80205852:	51250513          	addi	a0,a0,1298 # 80209d60 <digits+0x9e0>
+    80205856:	ffffb097          	auipc	ra,0xffffb
+    8020585a:	8ee080e7          	jalr	-1810(ra) # 80200144 <panic>
+
+000000008020585e <rw_clus>:
+{
+    8020585e:	7119                	addi	sp,sp,-128
+    80205860:	fc86                	sd	ra,120(sp)
+    80205862:	f8a2                	sd	s0,112(sp)
+    80205864:	f4a6                	sd	s1,104(sp)
+    80205866:	f0ca                	sd	s2,96(sp)
+    80205868:	ecce                	sd	s3,88(sp)
+    8020586a:	e8d2                	sd	s4,80(sp)
+    8020586c:	e4d6                	sd	s5,72(sp)
+    8020586e:	e0da                	sd	s6,64(sp)
+    80205870:	fc5e                	sd	s7,56(sp)
+    80205872:	f862                	sd	s8,48(sp)
+    80205874:	f466                	sd	s9,40(sp)
+    80205876:	f06a                	sd	s10,32(sp)
+    80205878:	ec6e                	sd	s11,24(sp)
+    8020587a:	0100                	addi	s0,sp,128
+    8020587c:	f8c43423          	sd	a2,-120(s0)
+    80205880:	8b36                	mv	s6,a3
+    80205882:	8c3e                	mv	s8,a5
+    if (off + n > fat.byts_per_clus)
+    80205884:	00f706bb          	addw	a3,a4,a5
+    80205888:	00019797          	auipc	a5,0x19
+    8020588c:	bac7a783          	lw	a5,-1108(a5) # 8021e434 <fat+0xc>
+    80205890:	02d7ef63          	bltu	a5,a3,802058ce <rw_clus+0x70>
+    80205894:	8cae                	mv	s9,a1
+    uint sec = first_sec_of_clus(cluster) + off / fat.bpb.byts_per_sec;
+    80205896:	00019797          	auipc	a5,0x19
+    8020589a:	b9278793          	addi	a5,a5,-1134 # 8021e428 <fat>
+    8020589e:	0107d683          	lhu	a3,16(a5)
+    return ((cluster - 2) * fat.bpb.sec_per_clus) + fat.first_data_sec;
+    802058a2:	ffe5099b          	addiw	s3,a0,-2
+    802058a6:	0127c603          	lbu	a2,18(a5)
+    802058aa:	02c989bb          	mulw	s3,s3,a2
+    802058ae:	439c                	lw	a5,0(a5)
+    802058b0:	00f989bb          	addw	s3,s3,a5
+    uint sec = first_sec_of_clus(cluster) + off / fat.bpb.byts_per_sec;
+    802058b4:	02d757bb          	divuw	a5,a4,a3
+    802058b8:	00f989bb          	addw	s3,s3,a5
+    off = off % fat.bpb.byts_per_sec;
+    802058bc:	02d77abb          	remuw	s5,a4,a3
+    for (tot = 0; tot < n; tot += m, off += m, data += m, sec++) {
+    802058c0:	0e0c0363          	beqz	s8,802059a6 <rw_clus+0x148>
+    802058c4:	4a01                	li	s4,0
+        m = BSIZE - off % BSIZE;
+    802058c6:	20000d93          	li	s11,512
+        if (bad == -1) {
+    802058ca:	5d7d                	li	s10,-1
+    802058cc:	a095                	j	80205930 <rw_clus+0xd2>
+        panic("offset out of range");
+    802058ce:	00004517          	auipc	a0,0x4
+    802058d2:	4a250513          	addi	a0,a0,1186 # 80209d70 <digits+0x9f0>
+    802058d6:	ffffb097          	auipc	ra,0xffffb
+    802058da:	86e080e7          	jalr	-1938(ra) # 80200144 <panic>
+                bwrite(bp);
+    802058de:	854a                	mv	a0,s2
+    802058e0:	ffffe097          	auipc	ra,0xffffe
+    802058e4:	062080e7          	jalr	98(ra) # 80203942 <bwrite>
+        brelse(bp);
+    802058e8:	854a                	mv	a0,s2
+    802058ea:	ffffe097          	auipc	ra,0xffffe
+    802058ee:	094080e7          	jalr	148(ra) # 8020397e <brelse>
+        if (bad == -1) {
+    802058f2:	a02d                	j	8020591c <rw_clus+0xbe>
+            bad = either_copyout(user, data, bp->data + (off % BSIZE), m);
+    802058f4:	05890613          	addi	a2,s2,88
+    802058f8:	1682                	slli	a3,a3,0x20
+    802058fa:	9281                	srli	a3,a3,0x20
+    802058fc:	963a                	add	a2,a2,a4
+    802058fe:	85da                	mv	a1,s6
+    80205900:	f8843503          	ld	a0,-120(s0)
+    80205904:	ffffd097          	auipc	ra,0xffffd
+    80205908:	e62080e7          	jalr	-414(ra) # 80202766 <either_copyout>
+    8020590c:	8baa                	mv	s7,a0
+        brelse(bp);
+    8020590e:	854a                	mv	a0,s2
+    80205910:	ffffe097          	auipc	ra,0xffffe
+    80205914:	06e080e7          	jalr	110(ra) # 8020397e <brelse>
+        if (bad == -1) {
+    80205918:	07ab8763          	beq	s7,s10,80205986 <rw_clus+0x128>
+    for (tot = 0; tot < n; tot += m, off += m, data += m, sec++) {
+    8020591c:	01448a3b          	addw	s4,s1,s4
+    80205920:	01548abb          	addw	s5,s1,s5
+    80205924:	1482                	slli	s1,s1,0x20
+    80205926:	9081                	srli	s1,s1,0x20
+    80205928:	9b26                	add	s6,s6,s1
+    8020592a:	2985                	addiw	s3,s3,1
+    8020592c:	058a7d63          	bgeu	s4,s8,80205986 <rw_clus+0x128>
+        bp = bread(0, sec);
+    80205930:	85ce                	mv	a1,s3
+    80205932:	4501                	li	a0,0
+    80205934:	ffffe097          	auipc	ra,0xffffe
+    80205938:	f1e080e7          	jalr	-226(ra) # 80203852 <bread>
+    8020593c:	892a                	mv	s2,a0
+        m = BSIZE - off % BSIZE;
+    8020593e:	1ffaf713          	andi	a4,s5,511
+        if (n - tot < m) {
+    80205942:	414c07bb          	subw	a5,s8,s4
+        m = BSIZE - off % BSIZE;
+    80205946:	40ed863b          	subw	a2,s11,a4
+    8020594a:	86be                	mv	a3,a5
+    8020594c:	2781                	sext.w	a5,a5
+    8020594e:	0006059b          	sext.w	a1,a2
+    80205952:	00f5f363          	bgeu	a1,a5,80205958 <rw_clus+0xfa>
+    80205956:	86b2                	mv	a3,a2
+    80205958:	0006849b          	sext.w	s1,a3
+        if (write) {
+    8020595c:	f80c8ce3          	beqz	s9,802058f4 <rw_clus+0x96>
+            if ((bad = either_copyin(bp->data + (off % BSIZE), user, data, m)) != -1) {
+    80205960:	05890513          	addi	a0,s2,88
+    80205964:	1682                	slli	a3,a3,0x20
+    80205966:	9281                	srli	a3,a3,0x20
+    80205968:	865a                	mv	a2,s6
+    8020596a:	f8843583          	ld	a1,-120(s0)
+    8020596e:	953a                	add	a0,a0,a4
+    80205970:	ffffd097          	auipc	ra,0xffffd
+    80205974:	e2c080e7          	jalr	-468(ra) # 8020279c <either_copyin>
+    80205978:	f7a513e3          	bne	a0,s10,802058de <rw_clus+0x80>
+        brelse(bp);
+    8020597c:	854a                	mv	a0,s2
+    8020597e:	ffffe097          	auipc	ra,0xffffe
+    80205982:	000080e7          	jalr	ra # 8020397e <brelse>
+}
+    80205986:	8552                	mv	a0,s4
+    80205988:	70e6                	ld	ra,120(sp)
+    8020598a:	7446                	ld	s0,112(sp)
+    8020598c:	74a6                	ld	s1,104(sp)
+    8020598e:	7906                	ld	s2,96(sp)
+    80205990:	69e6                	ld	s3,88(sp)
+    80205992:	6a46                	ld	s4,80(sp)
+    80205994:	6aa6                	ld	s5,72(sp)
+    80205996:	6b06                	ld	s6,64(sp)
+    80205998:	7be2                	ld	s7,56(sp)
+    8020599a:	7c42                	ld	s8,48(sp)
+    8020599c:	7ca2                	ld	s9,40(sp)
+    8020599e:	7d02                	ld	s10,32(sp)
+    802059a0:	6de2                	ld	s11,24(sp)
+    802059a2:	6109                	addi	sp,sp,128
+    802059a4:	8082                	ret
+    for (tot = 0; tot < n; tot += m, off += m, data += m, sec++) {
+    802059a6:	8a62                	mv	s4,s8
+    802059a8:	bff9                	j	80205986 <rw_clus+0x128>
+
+00000000802059aa <eget>:
+// by their whole path. But when parsing a path, we open all the directories through it, 
+// which forms a linked list from the final file to the root. Thus, we use the "parent" pointer 
+// to recognize whether an entry with the "name" as given is really the file we want in the right path.
+// Should never get root by eget, it's easy to understand.
+static struct dirent *eget(struct dirent *parent, char *name)
+{
+    802059aa:	7139                	addi	sp,sp,-64
+    802059ac:	fc06                	sd	ra,56(sp)
+    802059ae:	f822                	sd	s0,48(sp)
+    802059b0:	f426                	sd	s1,40(sp)
+    802059b2:	f04a                	sd	s2,32(sp)
+    802059b4:	ec4e                	sd	s3,24(sp)
+    802059b6:	e852                	sd	s4,16(sp)
+    802059b8:	e456                	sd	s5,8(sp)
+    802059ba:	0080                	addi	s0,sp,64
+    802059bc:	8a2a                	mv	s4,a0
+    802059be:	8aae                	mv	s5,a1
+    struct dirent *ep;
+    acquire(&ecache.lock);
+    802059c0:	00019517          	auipc	a0,0x19
+    802059c4:	bf850513          	addi	a0,a0,-1032 # 8021e5b8 <ecache>
+    802059c8:	ffffb097          	auipc	ra,0xffffb
+    802059cc:	cfe080e7          	jalr	-770(ra) # 802006c6 <acquire>
+    if (name) {
+    802059d0:	060a8b63          	beqz	s5,80205a46 <eget+0x9c>
+        for (ep = root.next; ep != &root; ep = ep->next) {          // LRU algo
+    802059d4:	00019497          	auipc	s1,0x19
+    802059d8:	ba44b483          	ld	s1,-1116(s1) # 8021e578 <root+0x128>
+    802059dc:	00019797          	auipc	a5,0x19
+    802059e0:	a7478793          	addi	a5,a5,-1420 # 8021e450 <root>
+    802059e4:	06f48163          	beq	s1,a5,80205a46 <eget+0x9c>
+            if (ep->valid == 1 && ep->parent == parent
+    802059e8:	4905                	li	s2,1
+        for (ep = root.next; ep != &root; ep = ep->next) {          // LRU algo
+    802059ea:	89be                	mv	s3,a5
+    802059ec:	a029                	j	802059f6 <eget+0x4c>
+    802059ee:	1284b483          	ld	s1,296(s1)
+    802059f2:	05348a63          	beq	s1,s3,80205a46 <eget+0x9c>
+            if (ep->valid == 1 && ep->parent == parent
+    802059f6:	11649783          	lh	a5,278(s1)
+    802059fa:	ff279ae3          	bne	a5,s2,802059ee <eget+0x44>
+    802059fe:	1204b783          	ld	a5,288(s1)
+    80205a02:	ff4796e3          	bne	a5,s4,802059ee <eget+0x44>
+                && strncmp(ep->filename, name, FAT32_MAX_FILENAME) == 0) {
+    80205a06:	0ff00613          	li	a2,255
+    80205a0a:	85d6                	mv	a1,s5
+    80205a0c:	8526                	mv	a0,s1
+    80205a0e:	ffffb097          	auipc	ra,0xffffb
+    80205a12:	e2c080e7          	jalr	-468(ra) # 8020083a <strncmp>
+    80205a16:	fd61                	bnez	a0,802059ee <eget+0x44>
+                if (ep->ref++ == 0) {
+    80205a18:	1184a783          	lw	a5,280(s1)
+    80205a1c:	0017871b          	addiw	a4,a5,1
+    80205a20:	10e4ac23          	sw	a4,280(s1)
+    80205a24:	eb81                	bnez	a5,80205a34 <eget+0x8a>
+                    ep->parent->ref++;
+    80205a26:	1204b703          	ld	a4,288(s1)
+    80205a2a:	11872783          	lw	a5,280(a4)
+    80205a2e:	2785                	addiw	a5,a5,1
+    80205a30:	10f72c23          	sw	a5,280(a4)
+                }
+                release(&ecache.lock);
+    80205a34:	00019517          	auipc	a0,0x19
+    80205a38:	b8450513          	addi	a0,a0,-1148 # 8021e5b8 <ecache>
+    80205a3c:	ffffb097          	auipc	ra,0xffffb
+    80205a40:	cde080e7          	jalr	-802(ra) # 8020071a <release>
+                // edup(ep->parent);
+                return ep;
+    80205a44:	a085                	j	80205aa4 <eget+0xfa>
+            }
+        }
+    }
+    for (ep = root.prev; ep != &root; ep = ep->prev) {              // LRU algo
+    80205a46:	00019497          	auipc	s1,0x19
+    80205a4a:	b3a4b483          	ld	s1,-1222(s1) # 8021e580 <root+0x130>
+    80205a4e:	00019797          	auipc	a5,0x19
+    80205a52:	a0278793          	addi	a5,a5,-1534 # 8021e450 <root>
+    80205a56:	00f48a63          	beq	s1,a5,80205a6a <eget+0xc0>
+    80205a5a:	873e                	mv	a4,a5
+        if (ep->ref == 0) {
+    80205a5c:	1184a783          	lw	a5,280(s1)
+    80205a60:	cf89                	beqz	a5,80205a7a <eget+0xd0>
+    for (ep = root.prev; ep != &root; ep = ep->prev) {              // LRU algo
+    80205a62:	1304b483          	ld	s1,304(s1)
+    80205a66:	fee49be3          	bne	s1,a4,80205a5c <eget+0xb2>
+            ep->dirty = 0;
+            release(&ecache.lock);
+            return ep;
+        }
+    }
+    panic("eget: insufficient ecache");
+    80205a6a:	00004517          	auipc	a0,0x4
+    80205a6e:	31e50513          	addi	a0,a0,798 # 80209d88 <digits+0xa08>
+    80205a72:	ffffa097          	auipc	ra,0xffffa
+    80205a76:	6d2080e7          	jalr	1746(ra) # 80200144 <panic>
+            ep->ref = 1;
+    80205a7a:	4785                	li	a5,1
+    80205a7c:	10f4ac23          	sw	a5,280(s1)
+            ep->dev = parent->dev;
+    80205a80:	114a4783          	lbu	a5,276(s4)
+    80205a84:	10f48a23          	sb	a5,276(s1)
+            ep->off = 0;
+    80205a88:	1004ae23          	sw	zero,284(s1)
+            ep->valid = 0;
+    80205a8c:	10049b23          	sh	zero,278(s1)
+            ep->dirty = 0;
+    80205a90:	10048aa3          	sb	zero,277(s1)
+            release(&ecache.lock);
+    80205a94:	00019517          	auipc	a0,0x19
+    80205a98:	b2450513          	addi	a0,a0,-1244 # 8021e5b8 <ecache>
+    80205a9c:	ffffb097          	auipc	ra,0xffffb
+    80205aa0:	c7e080e7          	jalr	-898(ra) # 8020071a <release>
+    return 0;
+}
+    80205aa4:	8526                	mv	a0,s1
+    80205aa6:	70e2                	ld	ra,56(sp)
+    80205aa8:	7442                	ld	s0,48(sp)
+    80205aaa:	74a2                	ld	s1,40(sp)
+    80205aac:	7902                	ld	s2,32(sp)
+    80205aae:	69e2                	ld	s3,24(sp)
+    80205ab0:	6a42                	ld	s4,16(sp)
+    80205ab2:	6aa2                	ld	s5,8(sp)
+    80205ab4:	6121                	addi	sp,sp,64
+    80205ab6:	8082                	ret
+
+0000000080205ab8 <read_entry_name>:
+ * @param   buffer      pointer to the array that stores the name
+ * @param   raw_entry   pointer to the entry in a sector buffer
+ * @param   islong      if non-zero, read as l-n-e, otherwise s-n-e.
+ */
+static void read_entry_name(char *buffer, union dentry *d)
+{
+    80205ab8:	7139                	addi	sp,sp,-64
+    80205aba:	fc06                	sd	ra,56(sp)
+    80205abc:	f822                	sd	s0,48(sp)
+    80205abe:	f426                	sd	s1,40(sp)
+    80205ac0:	f04a                	sd	s2,32(sp)
+    80205ac2:	ec4e                	sd	s3,24(sp)
+    80205ac4:	0080                	addi	s0,sp,64
+    80205ac6:	84aa                	mv	s1,a0
+    80205ac8:	892e                	mv	s2,a1
+    if (d->lne.attr == ATTR_LONG_NAME) {                       // long entry branch
+    80205aca:	00b5c703          	lbu	a4,11(a1)
+    80205ace:	47bd                	li	a5,15
+    80205ad0:	08f70563          	beq	a4,a5,80205b5a <read_entry_name+0xa2>
+        snstr(buffer, d->lne.name2, NELEM(d->lne.name2));
+        buffer += NELEM(d->lne.name2);
+        snstr(buffer, d->lne.name3, NELEM(d->lne.name3));
+    } else {
+        // assert: only "." and ".." will enter this branch
+        memset(buffer, 0, CHAR_SHORT_NAME + 2); // plus '.' and '\0'
+    80205ad4:	4635                	li	a2,13
+    80205ad6:	4581                	li	a1,0
+    80205ad8:	ffffb097          	auipc	ra,0xffffb
+    80205adc:	c8a080e7          	jalr	-886(ra) # 80200762 <memset>
+        int i;
+        for (i = 0; d->sne.name[i] != ' ' && i < 8; i++) {
+    80205ae0:	00094703          	lbu	a4,0(s2)
+    80205ae4:	02000793          	li	a5,32
+    80205ae8:	0af70c63          	beq	a4,a5,80205ba0 <read_entry_name+0xe8>
+    80205aec:	4785                	li	a5,1
+    80205aee:	02000613          	li	a2,32
+    80205af2:	45a5                	li	a1,9
+            buffer[i] = d->sne.name[i];
+    80205af4:	00f486b3          	add	a3,s1,a5
+    80205af8:	fee68fa3          	sb	a4,-1(a3) # 1fff <_entry-0x801fe001>
+        for (i = 0; d->sne.name[i] != ' ' && i < 8; i++) {
+    80205afc:	0007869b          	sext.w	a3,a5
+    80205b00:	00f90733          	add	a4,s2,a5
+    80205b04:	00074703          	lbu	a4,0(a4)
+    80205b08:	00c70563          	beq	a4,a2,80205b12 <read_entry_name+0x5a>
+    80205b0c:	0785                	addi	a5,a5,1
+    80205b0e:	feb793e3          	bne	a5,a1,80205af4 <read_entry_name+0x3c>
+        }
+        if (d->sne.name[8] != ' ') {
+    80205b12:	00894703          	lbu	a4,8(s2)
+    80205b16:	02000793          	li	a5,32
+    80205b1a:	00f70963          	beq	a4,a5,80205b2c <read_entry_name+0x74>
+            buffer[i++] = '.';
+    80205b1e:	00d487b3          	add	a5,s1,a3
+    80205b22:	02e00713          	li	a4,46
+    80205b26:	00e78023          	sb	a4,0(a5)
+    80205b2a:	2685                	addiw	a3,a3,1
+        }
+        for (int j = 8; j < CHAR_SHORT_NAME; j++, i++) {
+    80205b2c:	00890793          	addi	a5,s2,8
+    80205b30:	94b6                	add	s1,s1,a3
+    80205b32:	092d                	addi	s2,s2,11
+            if (d->sne.name[j] == ' ') { break; }
+    80205b34:	02000693          	li	a3,32
+    80205b38:	0007c703          	lbu	a4,0(a5)
+    80205b3c:	00d70863          	beq	a4,a3,80205b4c <read_entry_name+0x94>
+            buffer[i] = d->sne.name[j];
+    80205b40:	00e48023          	sb	a4,0(s1)
+        for (int j = 8; j < CHAR_SHORT_NAME; j++, i++) {
+    80205b44:	0785                	addi	a5,a5,1
+    80205b46:	0485                	addi	s1,s1,1
+    80205b48:	ff2798e3          	bne	a5,s2,80205b38 <read_entry_name+0x80>
+        }
+    }
+}
+    80205b4c:	70e2                	ld	ra,56(sp)
+    80205b4e:	7442                	ld	s0,48(sp)
+    80205b50:	74a2                	ld	s1,40(sp)
+    80205b52:	7902                	ld	s2,32(sp)
+    80205b54:	69e2                	ld	s3,24(sp)
+    80205b56:	6121                	addi	sp,sp,64
+    80205b58:	8082                	ret
+        memmove(temp, d->lne.name1, sizeof(temp));
+    80205b5a:	4629                	li	a2,10
+    80205b5c:	0585                	addi	a1,a1,1
+    80205b5e:	fc040993          	addi	s3,s0,-64
+    80205b62:	854e                	mv	a0,s3
+    80205b64:	ffffb097          	auipc	ra,0xffffb
+    80205b68:	c5a080e7          	jalr	-934(ra) # 802007be <memmove>
+        snstr(buffer, temp, NELEM(d->lne.name1));
+    80205b6c:	4615                	li	a2,5
+    80205b6e:	85ce                	mv	a1,s3
+    80205b70:	8526                	mv	a0,s1
+    80205b72:	ffffb097          	auipc	ra,0xffffb
+    80205b76:	dd0080e7          	jalr	-560(ra) # 80200942 <snstr>
+        snstr(buffer, d->lne.name2, NELEM(d->lne.name2));
+    80205b7a:	4619                	li	a2,6
+    80205b7c:	00e90593          	addi	a1,s2,14
+    80205b80:	00548513          	addi	a0,s1,5
+    80205b84:	ffffb097          	auipc	ra,0xffffb
+    80205b88:	dbe080e7          	jalr	-578(ra) # 80200942 <snstr>
+        snstr(buffer, d->lne.name3, NELEM(d->lne.name3));
+    80205b8c:	4609                	li	a2,2
+    80205b8e:	01c90593          	addi	a1,s2,28
+    80205b92:	00b48513          	addi	a0,s1,11
+    80205b96:	ffffb097          	auipc	ra,0xffffb
+    80205b9a:	dac080e7          	jalr	-596(ra) # 80200942 <snstr>
+    80205b9e:	b77d                	j	80205b4c <read_entry_name+0x94>
+        for (i = 0; d->sne.name[i] != ' ' && i < 8; i++) {
+    80205ba0:	4681                	li	a3,0
+    80205ba2:	bf85                	j	80205b12 <read_entry_name+0x5a>
+
+0000000080205ba4 <fat32_init>:
+{
+    80205ba4:	7139                	addi	sp,sp,-64
+    80205ba6:	fc06                	sd	ra,56(sp)
+    80205ba8:	f822                	sd	s0,48(sp)
+    80205baa:	f426                	sd	s1,40(sp)
+    80205bac:	f04a                	sd	s2,32(sp)
+    80205bae:	ec4e                	sd	s3,24(sp)
+    80205bb0:	e852                	sd	s4,16(sp)
+    80205bb2:	e456                	sd	s5,8(sp)
+    80205bb4:	0080                	addi	s0,sp,64
+    struct buf *b = bread(0, 0);
+    80205bb6:	4581                	li	a1,0
+    80205bb8:	4501                	li	a0,0
+    80205bba:	ffffe097          	auipc	ra,0xffffe
+    80205bbe:	c98080e7          	jalr	-872(ra) # 80203852 <bread>
+    80205bc2:	892a                	mv	s2,a0
+    if (strncmp((char const*)(b->data + 82), "FAT32", 5))
+    80205bc4:	4615                	li	a2,5
+    80205bc6:	00004597          	auipc	a1,0x4
+    80205bca:	1e258593          	addi	a1,a1,482 # 80209da8 <digits+0xa28>
+    80205bce:	0aa50513          	addi	a0,a0,170
+    80205bd2:	ffffb097          	auipc	ra,0xffffb
+    80205bd6:	c68080e7          	jalr	-920(ra) # 8020083a <strncmp>
+    80205bda:	16051863          	bnez	a0,80205d4a <fat32_init+0x1a6>
+    memmove(&fat.bpb.byts_per_sec, b->data + 11, 2);            // avoid misaligned load on k210
+    80205bde:	00019497          	auipc	s1,0x19
+    80205be2:	84a48493          	addi	s1,s1,-1974 # 8021e428 <fat>
+    80205be6:	4609                	li	a2,2
+    80205be8:	06390593          	addi	a1,s2,99
+    80205bec:	00019517          	auipc	a0,0x19
+    80205bf0:	84c50513          	addi	a0,a0,-1972 # 8021e438 <fat+0x10>
+    80205bf4:	ffffb097          	auipc	ra,0xffffb
+    80205bf8:	bca080e7          	jalr	-1078(ra) # 802007be <memmove>
+    fat.bpb.sec_per_clus = *(b->data + 13);
+    80205bfc:	06594683          	lbu	a3,101(s2)
+    80205c00:	00d48923          	sb	a3,18(s1)
+    fat.bpb.rsvd_sec_cnt = *(uint16 *)(b->data + 14);
+    80205c04:	06695603          	lhu	a2,102(s2)
+    80205c08:	00c49a23          	sh	a2,20(s1)
+    fat.bpb.fat_cnt = *(b->data + 16);
+    80205c0c:	06894703          	lbu	a4,104(s2)
+    80205c10:	00e48b23          	sb	a4,22(s1)
+    fat.bpb.hidd_sec = *(uint32 *)(b->data + 28);
+    80205c14:	07492783          	lw	a5,116(s2)
+    80205c18:	cc9c                	sw	a5,24(s1)
+    fat.bpb.tot_sec = *(uint32 *)(b->data + 32);
+    80205c1a:	07892783          	lw	a5,120(s2)
+    80205c1e:	ccdc                	sw	a5,28(s1)
+    fat.bpb.fat_sz = *(uint32 *)(b->data + 36);
+    80205c20:	07c92583          	lw	a1,124(s2)
+    80205c24:	d08c                	sw	a1,32(s1)
+    fat.bpb.root_clus = *(uint32 *)(b->data + 44);
+    80205c26:	08492503          	lw	a0,132(s2)
+    80205c2a:	d0c8                	sw	a0,36(s1)
+    fat.first_data_sec = fat.bpb.rsvd_sec_cnt + fat.bpb.fat_cnt * fat.bpb.fat_sz;
+    80205c2c:	02b7073b          	mulw	a4,a4,a1
+    80205c30:	9f31                	addw	a4,a4,a2
+    80205c32:	c098                	sw	a4,0(s1)
+    fat.data_sec_cnt = fat.bpb.tot_sec - fat.first_data_sec;
+    80205c34:	9f99                	subw	a5,a5,a4
+    80205c36:	c0dc                	sw	a5,4(s1)
+    fat.data_clus_cnt = fat.data_sec_cnt / fat.bpb.sec_per_clus;
+    80205c38:	02d7d7bb          	divuw	a5,a5,a3
+    80205c3c:	c49c                	sw	a5,8(s1)
+    fat.byts_per_clus = fat.bpb.sec_per_clus * fat.bpb.byts_per_sec;
+    80205c3e:	0104d783          	lhu	a5,16(s1)
+    80205c42:	02d787bb          	mulw	a5,a5,a3
+    80205c46:	c4dc                	sw	a5,12(s1)
+    brelse(b);
+    80205c48:	854a                	mv	a0,s2
+    80205c4a:	ffffe097          	auipc	ra,0xffffe
+    80205c4e:	d34080e7          	jalr	-716(ra) # 8020397e <brelse>
+    if (BSIZE != fat.bpb.byts_per_sec) 
+    80205c52:	0104d703          	lhu	a4,16(s1)
+    80205c56:	20000793          	li	a5,512
+    80205c5a:	10f71063          	bne	a4,a5,80205d5a <fat32_init+0x1b6>
+    initlock(&ecache.lock, "ecache");
+    80205c5e:	00004597          	auipc	a1,0x4
+    80205c62:	18258593          	addi	a1,a1,386 # 80209de0 <digits+0xa60>
+    80205c66:	00019517          	auipc	a0,0x19
+    80205c6a:	95250513          	addi	a0,a0,-1710 # 8021e5b8 <ecache>
+    80205c6e:	ffffb097          	auipc	ra,0xffffb
+    80205c72:	a14080e7          	jalr	-1516(ra) # 80200682 <initlock>
+    memset(&root, 0, sizeof(root));
+    80205c76:	00018497          	auipc	s1,0x18
+    80205c7a:	7b248493          	addi	s1,s1,1970 # 8021e428 <fat>
+    80205c7e:	00018917          	auipc	s2,0x18
+    80205c82:	7d290913          	addi	s2,s2,2002 # 8021e450 <root>
+    80205c86:	16800613          	li	a2,360
+    80205c8a:	4581                	li	a1,0
+    80205c8c:	854a                	mv	a0,s2
+    80205c8e:	ffffb097          	auipc	ra,0xffffb
+    80205c92:	ad4080e7          	jalr	-1324(ra) # 80200762 <memset>
+    initsleeplock(&root.lock, "entry");
+    80205c96:	00004597          	auipc	a1,0x4
+    80205c9a:	15258593          	addi	a1,a1,338 # 80209de8 <digits+0xa68>
+    80205c9e:	00019517          	auipc	a0,0x19
+    80205ca2:	8ea50513          	addi	a0,a0,-1814 # 8021e588 <root+0x138>
+    80205ca6:	ffffe097          	auipc	ra,0xffffe
+    80205caa:	dee080e7          	jalr	-530(ra) # 80203a94 <initsleeplock>
+    root.attribute = (ATTR_DIRECTORY | ATTR_SYSTEM);
+    80205cae:	47d1                	li	a5,20
+    80205cb0:	12f48423          	sb	a5,296(s1)
+    root.first_clus = root.cur_clus = fat.bpb.root_clus;
+    80205cb4:	50dc                	lw	a5,36(s1)
+    80205cb6:	12f4aa23          	sw	a5,308(s1)
+    80205cba:	12f4a623          	sw	a5,300(s1)
+    root.valid = 1;
+    80205cbe:	4785                	li	a5,1
+    80205cc0:	12f49f23          	sh	a5,318(s1)
+    root.prev = &root;
+    80205cc4:	1524bc23          	sd	s2,344(s1)
+    root.next = &root;
+    80205cc8:	1524b823          	sd	s2,336(s1)
+    for(struct dirent *de = ecache.entries; de < ecache.entries + ENTRY_CACHE_NUM; de++) {
+    80205ccc:	00019497          	auipc	s1,0x19
+    80205cd0:	90448493          	addi	s1,s1,-1788 # 8021e5d0 <ecache+0x18>
+        de->next = root.next;
+    80205cd4:	00018917          	auipc	s2,0x18
+    80205cd8:	75490913          	addi	s2,s2,1876 # 8021e428 <fat>
+        de->prev = &root;
+    80205cdc:	00018a97          	auipc	s5,0x18
+    80205ce0:	774a8a93          	addi	s5,s5,1908 # 8021e450 <root>
+        initsleeplock(&de->lock, "entry");
+    80205ce4:	00004a17          	auipc	s4,0x4
+    80205ce8:	104a0a13          	addi	s4,s4,260 # 80209de8 <digits+0xa68>
+    for(struct dirent *de = ecache.entries; de < ecache.entries + ENTRY_CACHE_NUM; de++) {
+    80205cec:	0001d997          	auipc	s3,0x1d
+    80205cf0:	f3498993          	addi	s3,s3,-204 # 80222c20 <cons>
+        de->dev = 0;
+    80205cf4:	10048a23          	sb	zero,276(s1)
+        de->valid = 0;
+    80205cf8:	10049b23          	sh	zero,278(s1)
+        de->ref = 0;
+    80205cfc:	1004ac23          	sw	zero,280(s1)
+        de->dirty = 0;
+    80205d00:	10048aa3          	sb	zero,277(s1)
+        de->parent = 0;
+    80205d04:	1204b023          	sd	zero,288(s1)
+        de->next = root.next;
+    80205d08:	15093783          	ld	a5,336(s2)
+    80205d0c:	12f4b423          	sd	a5,296(s1)
+        de->prev = &root;
+    80205d10:	1354b823          	sd	s5,304(s1)
+        initsleeplock(&de->lock, "entry");
+    80205d14:	85d2                	mv	a1,s4
+    80205d16:	13848513          	addi	a0,s1,312
+    80205d1a:	ffffe097          	auipc	ra,0xffffe
+    80205d1e:	d7a080e7          	jalr	-646(ra) # 80203a94 <initsleeplock>
+        root.next->prev = de;
+    80205d22:	15093783          	ld	a5,336(s2)
+    80205d26:	1297b823          	sd	s1,304(a5)
+        root.next = de;
+    80205d2a:	14993823          	sd	s1,336(s2)
+    for(struct dirent *de = ecache.entries; de < ecache.entries + ENTRY_CACHE_NUM; de++) {
+    80205d2e:	16848493          	addi	s1,s1,360
+    80205d32:	fd3491e3          	bne	s1,s3,80205cf4 <fat32_init+0x150>
+}
+    80205d36:	4501                	li	a0,0
+    80205d38:	70e2                	ld	ra,56(sp)
+    80205d3a:	7442                	ld	s0,48(sp)
+    80205d3c:	74a2                	ld	s1,40(sp)
+    80205d3e:	7902                	ld	s2,32(sp)
+    80205d40:	69e2                	ld	s3,24(sp)
+    80205d42:	6a42                	ld	s4,16(sp)
+    80205d44:	6aa2                	ld	s5,8(sp)
+    80205d46:	6121                	addi	sp,sp,64
+    80205d48:	8082                	ret
+        panic("not FAT32 volume");
+    80205d4a:	00004517          	auipc	a0,0x4
+    80205d4e:	06650513          	addi	a0,a0,102 # 80209db0 <digits+0xa30>
+    80205d52:	ffffa097          	auipc	ra,0xffffa
+    80205d56:	3f2080e7          	jalr	1010(ra) # 80200144 <panic>
+        panic("byts_per_sec != BSIZE");
+    80205d5a:	00004517          	auipc	a0,0x4
+    80205d5e:	06e50513          	addi	a0,a0,110 # 80209dc8 <digits+0xa48>
+    80205d62:	ffffa097          	auipc	ra,0xffffa
+    80205d66:	3e2080e7          	jalr	994(ra) # 80200144 <panic>
+
+0000000080205d6a <eread>:
+    if (off > entry->file_size || off + n < off || (entry->attribute & ATTR_DIRECTORY)) {
+    80205d6a:	10852783          	lw	a5,264(a0)
+    80205d6e:	0ed7e863          	bltu	a5,a3,80205e5e <eread+0xf4>
+{
+    80205d72:	711d                	addi	sp,sp,-96
+    80205d74:	ec86                	sd	ra,88(sp)
+    80205d76:	e8a2                	sd	s0,80(sp)
+    80205d78:	e4a6                	sd	s1,72(sp)
+    80205d7a:	e0ca                	sd	s2,64(sp)
+    80205d7c:	fc4e                	sd	s3,56(sp)
+    80205d7e:	f852                	sd	s4,48(sp)
+    80205d80:	f456                	sd	s5,40(sp)
+    80205d82:	f05a                	sd	s6,32(sp)
+    80205d84:	ec5e                	sd	s7,24(sp)
+    80205d86:	e862                	sd	s8,16(sp)
+    80205d88:	e466                	sd	s9,8(sp)
+    80205d8a:	e06a                	sd	s10,0(sp)
+    80205d8c:	1080                	addi	s0,sp,96
+    80205d8e:	8a2a                	mv	s4,a0
+    80205d90:	8bae                	mv	s7,a1
+    80205d92:	8ab2                	mv	s5,a2
+    80205d94:	8936                	mv	s2,a3
+    80205d96:	8b3a                	mv	s6,a4
+    if (off > entry->file_size || off + n < off || (entry->attribute & ATTR_DIRECTORY)) {
+    80205d98:	9eb9                	addw	a3,a3,a4
+        return 0;
+    80205d9a:	4501                	li	a0,0
+    if (off > entry->file_size || off + n < off || (entry->attribute & ATTR_DIRECTORY)) {
+    80205d9c:	0b26e163          	bltu	a3,s2,80205e3e <eread+0xd4>
+    80205da0:	100a4703          	lbu	a4,256(s4)
+    80205da4:	8b41                	andi	a4,a4,16
+    80205da6:	ef41                	bnez	a4,80205e3e <eread+0xd4>
+    if (off + n > entry->file_size) {
+    80205da8:	00d7f463          	bgeu	a5,a3,80205db0 <eread+0x46>
+        n = entry->file_size - off;
+    80205dac:	41278b3b          	subw	s6,a5,s2
+    for (tot = 0; entry->cur_clus < FAT32_EOC && tot < n; tot += m, off += m, dst += m) {
+    80205db0:	10ca2703          	lw	a4,268(s4)
+    80205db4:	100007b7          	lui	a5,0x10000
+    80205db8:	17dd                	addi	a5,a5,-9 # ffffff7 <_entry-0x70200009>
+    80205dba:	06e7ef63          	bltu	a5,a4,80205e38 <eread+0xce>
+    80205dbe:	080b0e63          	beqz	s6,80205e5a <eread+0xf0>
+    80205dc2:	4981                	li	s3,0
+        m = fat.byts_per_clus - off % fat.byts_per_clus;
+    80205dc4:	00018c97          	auipc	s9,0x18
+    80205dc8:	664c8c93          	addi	s9,s9,1636 # 8021e428 <fat>
+    for (tot = 0; entry->cur_clus < FAT32_EOC && tot < n; tot += m, off += m, dst += m) {
+    80205dcc:	8c3e                	mv	s8,a5
+    80205dce:	a82d                	j	80205e08 <eread+0x9e>
+    80205dd0:	00048d1b          	sext.w	s10,s1
+        if (rw_clus(entry->cur_clus, 0, user_dst, dst, off % fat.byts_per_clus, m) != m) {
+    80205dd4:	87ea                	mv	a5,s10
+    80205dd6:	86d6                	mv	a3,s5
+    80205dd8:	865e                	mv	a2,s7
+    80205dda:	4581                	li	a1,0
+    80205ddc:	10ca2503          	lw	a0,268(s4)
+    80205de0:	00000097          	auipc	ra,0x0
+    80205de4:	a7e080e7          	jalr	-1410(ra) # 8020585e <rw_clus>
+    80205de8:	2501                	sext.w	a0,a0
+    80205dea:	04ad1863          	bne	s10,a0,80205e3a <eread+0xd0>
+    for (tot = 0; entry->cur_clus < FAT32_EOC && tot < n; tot += m, off += m, dst += m) {
+    80205dee:	013489bb          	addw	s3,s1,s3
+    80205df2:	0124893b          	addw	s2,s1,s2
+    80205df6:	1482                	slli	s1,s1,0x20
+    80205df8:	9081                	srli	s1,s1,0x20
+    80205dfa:	9aa6                	add	s5,s5,s1
+    80205dfc:	10ca2783          	lw	a5,268(s4)
+    80205e00:	02fc6d63          	bltu	s8,a5,80205e3a <eread+0xd0>
+    80205e04:	0369fb63          	bgeu	s3,s6,80205e3a <eread+0xd0>
+        reloc_clus(entry, off, 0);
+    80205e08:	4601                	li	a2,0
+    80205e0a:	85ca                	mv	a1,s2
+    80205e0c:	8552                	mv	a0,s4
+    80205e0e:	00000097          	auipc	ra,0x0
+    80205e12:	948080e7          	jalr	-1720(ra) # 80205756 <reloc_clus>
+        m = fat.byts_per_clus - off % fat.byts_per_clus;
+    80205e16:	00cca683          	lw	a3,12(s9)
+    80205e1a:	02d9763b          	remuw	a2,s2,a3
+    80205e1e:	0006071b          	sext.w	a4,a2
+        if (n - tot < m) {
+    80205e22:	413b07bb          	subw	a5,s6,s3
+        m = fat.byts_per_clus - off % fat.byts_per_clus;
+    80205e26:	9e91                	subw	a3,a3,a2
+    80205e28:	84be                	mv	s1,a5
+    80205e2a:	2781                	sext.w	a5,a5
+    80205e2c:	0006861b          	sext.w	a2,a3
+    80205e30:	faf670e3          	bgeu	a2,a5,80205dd0 <eread+0x66>
+    80205e34:	84b6                	mv	s1,a3
+    80205e36:	bf69                	j	80205dd0 <eread+0x66>
+    for (tot = 0; entry->cur_clus < FAT32_EOC && tot < n; tot += m, off += m, dst += m) {
+    80205e38:	4981                	li	s3,0
+    return tot;
+    80205e3a:	0009851b          	sext.w	a0,s3
+}
+    80205e3e:	60e6                	ld	ra,88(sp)
+    80205e40:	6446                	ld	s0,80(sp)
+    80205e42:	64a6                	ld	s1,72(sp)
+    80205e44:	6906                	ld	s2,64(sp)
+    80205e46:	79e2                	ld	s3,56(sp)
+    80205e48:	7a42                	ld	s4,48(sp)
+    80205e4a:	7aa2                	ld	s5,40(sp)
+    80205e4c:	7b02                	ld	s6,32(sp)
+    80205e4e:	6be2                	ld	s7,24(sp)
+    80205e50:	6c42                	ld	s8,16(sp)
+    80205e52:	6ca2                	ld	s9,8(sp)
+    80205e54:	6d02                	ld	s10,0(sp)
+    80205e56:	6125                	addi	sp,sp,96
+    80205e58:	8082                	ret
+    for (tot = 0; entry->cur_clus < FAT32_EOC && tot < n; tot += m, off += m, dst += m) {
+    80205e5a:	89da                	mv	s3,s6
+    80205e5c:	bff9                	j	80205e3a <eread+0xd0>
+        return 0;
+    80205e5e:	4501                	li	a0,0
+}
+    80205e60:	8082                	ret
+
+0000000080205e62 <ewrite>:
+    if (off > entry->file_size || off + n < off || (uint64)off + n > 0xffffffff
+    80205e62:	10852783          	lw	a5,264(a0)
+    80205e66:	0ed7e463          	bltu	a5,a3,80205f4e <ewrite+0xec>
+{
+    80205e6a:	711d                	addi	sp,sp,-96
+    80205e6c:	ec86                	sd	ra,88(sp)
+    80205e6e:	e8a2                	sd	s0,80(sp)
+    80205e70:	e4a6                	sd	s1,72(sp)
+    80205e72:	e0ca                	sd	s2,64(sp)
+    80205e74:	fc4e                	sd	s3,56(sp)
+    80205e76:	f852                	sd	s4,48(sp)
+    80205e78:	f456                	sd	s5,40(sp)
+    80205e7a:	f05a                	sd	s6,32(sp)
+    80205e7c:	ec5e                	sd	s7,24(sp)
+    80205e7e:	e862                	sd	s8,16(sp)
+    80205e80:	e466                	sd	s9,8(sp)
+    80205e82:	1080                	addi	s0,sp,96
+    80205e84:	8aaa                	mv	s5,a0
+    80205e86:	8bae                	mv	s7,a1
+    80205e88:	8a32                	mv	s4,a2
+    80205e8a:	8936                	mv	s2,a3
+    80205e8c:	8b3a                	mv	s6,a4
+    if (off > entry->file_size || off + n < off || (uint64)off + n > 0xffffffff
+    80205e8e:	00e687bb          	addw	a5,a3,a4
+    80205e92:	0cd7e063          	bltu	a5,a3,80205f52 <ewrite+0xf0>
+    80205e96:	02069793          	slli	a5,a3,0x20
+    80205e9a:	9381                	srli	a5,a5,0x20
+    80205e9c:	1702                	slli	a4,a4,0x20
+    80205e9e:	9301                	srli	a4,a4,0x20
+    80205ea0:	97ba                	add	a5,a5,a4
+    80205ea2:	577d                	li	a4,-1
+    80205ea4:	9301                	srli	a4,a4,0x20
+    80205ea6:	0af76863          	bltu	a4,a5,80205f56 <ewrite+0xf4>
+        || (entry->attribute & ATTR_READ_ONLY)) {
+    80205eaa:	10054783          	lbu	a5,256(a0)
+    80205eae:	8b85                	andi	a5,a5,1
+    80205eb0:	e7cd                	bnez	a5,80205f5a <ewrite+0xf8>
+    if (entry->first_clus == 0) {   // so file_size if 0 too, which requests off == 0
+    80205eb2:	10452783          	lw	a5,260(a0)
+    80205eb6:	cb89                	beqz	a5,80205ec8 <ewrite+0x66>
+    for (tot = 0; tot < n; tot += m, off += m, src += m) {
+    80205eb8:	080b0963          	beqz	s6,80205f4a <ewrite+0xe8>
+    80205ebc:	4981                	li	s3,0
+        m = fat.byts_per_clus - off % fat.byts_per_clus;
+    80205ebe:	00018c17          	auipc	s8,0x18
+    80205ec2:	56ac0c13          	addi	s8,s8,1386 # 8021e428 <fat>
+    80205ec6:	a891                	j	80205f1a <ewrite+0xb8>
+        entry->cur_clus = entry->first_clus = alloc_clus(entry->dev);
+    80205ec8:	11454503          	lbu	a0,276(a0)
+    80205ecc:	fffff097          	auipc	ra,0xfffff
+    80205ed0:	6c8080e7          	jalr	1736(ra) # 80205594 <alloc_clus>
+    80205ed4:	2501                	sext.w	a0,a0
+    80205ed6:	10aaa223          	sw	a0,260(s5)
+    80205eda:	10aaa623          	sw	a0,268(s5)
+        entry->clus_cnt = 0;
+    80205ede:	100aa823          	sw	zero,272(s5)
+        entry->dirty = 1;
+    80205ee2:	4785                	li	a5,1
+    80205ee4:	10fa8aa3          	sb	a5,277(s5)
+    80205ee8:	bfc1                	j	80205eb8 <ewrite+0x56>
+    80205eea:	00048c9b          	sext.w	s9,s1
+        if (rw_clus(entry->cur_clus, 1, user_src, src, off % fat.byts_per_clus, m) != m) {
+    80205eee:	87e6                	mv	a5,s9
+    80205ef0:	86d2                	mv	a3,s4
+    80205ef2:	865e                	mv	a2,s7
+    80205ef4:	4585                	li	a1,1
+    80205ef6:	10caa503          	lw	a0,268(s5)
+    80205efa:	00000097          	auipc	ra,0x0
+    80205efe:	964080e7          	jalr	-1692(ra) # 8020585e <rw_clus>
+    80205f02:	2501                	sext.w	a0,a0
+    80205f04:	04ac9d63          	bne	s9,a0,80205f5e <ewrite+0xfc>
+    for (tot = 0; tot < n; tot += m, off += m, src += m) {
+    80205f08:	013489bb          	addw	s3,s1,s3
+    80205f0c:	0124893b          	addw	s2,s1,s2
+    80205f10:	1482                	slli	s1,s1,0x20
+    80205f12:	9081                	srli	s1,s1,0x20
+    80205f14:	9a26                	add	s4,s4,s1
+    80205f16:	0569f463          	bgeu	s3,s6,80205f5e <ewrite+0xfc>
+        reloc_clus(entry, off, 1);
+    80205f1a:	4605                	li	a2,1
+    80205f1c:	85ca                	mv	a1,s2
+    80205f1e:	8556                	mv	a0,s5
+    80205f20:	00000097          	auipc	ra,0x0
+    80205f24:	836080e7          	jalr	-1994(ra) # 80205756 <reloc_clus>
+        m = fat.byts_per_clus - off % fat.byts_per_clus;
+    80205f28:	00cc2683          	lw	a3,12(s8)
+    80205f2c:	02d9763b          	remuw	a2,s2,a3
+    80205f30:	0006071b          	sext.w	a4,a2
+        if (n - tot < m) {
+    80205f34:	413b07bb          	subw	a5,s6,s3
+        m = fat.byts_per_clus - off % fat.byts_per_clus;
+    80205f38:	9e91                	subw	a3,a3,a2
+    80205f3a:	84be                	mv	s1,a5
+    80205f3c:	2781                	sext.w	a5,a5
+    80205f3e:	0006861b          	sext.w	a2,a3
+    80205f42:	faf674e3          	bgeu	a2,a5,80205eea <ewrite+0x88>
+    80205f46:	84b6                	mv	s1,a3
+    80205f48:	b74d                	j	80205eea <ewrite+0x88>
+    for (tot = 0; tot < n; tot += m, off += m, src += m) {
+    80205f4a:	89da                	mv	s3,s6
+    80205f4c:	a015                	j	80205f70 <ewrite+0x10e>
+        return -1;
+    80205f4e:	557d                	li	a0,-1
+}
+    80205f50:	8082                	ret
+        return -1;
+    80205f52:	557d                	li	a0,-1
+    80205f54:	a005                	j	80205f74 <ewrite+0x112>
+    80205f56:	557d                	li	a0,-1
+    80205f58:	a831                	j	80205f74 <ewrite+0x112>
+    80205f5a:	557d                	li	a0,-1
+    80205f5c:	a821                	j	80205f74 <ewrite+0x112>
+        if(off > entry->file_size) {
+    80205f5e:	108aa783          	lw	a5,264(s5)
+    80205f62:	0127f763          	bgeu	a5,s2,80205f70 <ewrite+0x10e>
+            entry->file_size = off;
+    80205f66:	112aa423          	sw	s2,264(s5)
+            entry->dirty = 1;
+    80205f6a:	4785                	li	a5,1
+    80205f6c:	10fa8aa3          	sb	a5,277(s5)
+    return tot;
+    80205f70:	0009851b          	sext.w	a0,s3
+}
+    80205f74:	60e6                	ld	ra,88(sp)
+    80205f76:	6446                	ld	s0,80(sp)
+    80205f78:	64a6                	ld	s1,72(sp)
+    80205f7a:	6906                	ld	s2,64(sp)
+    80205f7c:	79e2                	ld	s3,56(sp)
+    80205f7e:	7a42                	ld	s4,48(sp)
+    80205f80:	7aa2                	ld	s5,40(sp)
+    80205f82:	7b02                	ld	s6,32(sp)
+    80205f84:	6be2                	ld	s7,24(sp)
+    80205f86:	6c42                	ld	s8,16(sp)
+    80205f88:	6ca2                	ld	s9,8(sp)
+    80205f8a:	6125                	addi	sp,sp,96
+    80205f8c:	8082                	ret
+
+0000000080205f8e <formatname>:
+{
+    80205f8e:	7179                	addi	sp,sp,-48
+    80205f90:	f406                	sd	ra,40(sp)
+    80205f92:	f022                	sd	s0,32(sp)
+    80205f94:	ec26                	sd	s1,24(sp)
+    80205f96:	e84a                	sd	s2,16(sp)
+    80205f98:	e44e                	sd	s3,8(sp)
+    80205f9a:	e052                	sd	s4,0(sp)
+    80205f9c:	1800                	addi	s0,sp,48
+    80205f9e:	84aa                	mv	s1,a0
+    while (*name == ' ' || *name == '.') { name++; }
+    80205fa0:	02000793          	li	a5,32
+    80205fa4:	02e00713          	li	a4,46
+    80205fa8:	a011                	j	80205fac <formatname+0x1e>
+    80205faa:	0485                	addi	s1,s1,1
+    80205fac:	0004c583          	lbu	a1,0(s1)
+    80205fb0:	fef58de3          	beq	a1,a5,80205faa <formatname+0x1c>
+    80205fb4:	fee58be3          	beq	a1,a4,80205faa <formatname+0x1c>
+    for (p = name; *p; p++) {
+    80205fb8:	c1b9                	beqz	a1,80205ffe <formatname+0x70>
+    80205fba:	8926                	mv	s2,s1
+        if (c < 0x20 || strchr(illegal, c)) {
+    80205fbc:	49fd                	li	s3,31
+    80205fbe:	00006a17          	auipc	s4,0x6
+    80205fc2:	d02a0a13          	addi	s4,s4,-766 # 8020bcc0 <illegal.1>
+    80205fc6:	02b9fe63          	bgeu	s3,a1,80206002 <formatname+0x74>
+    80205fca:	8552                	mv	a0,s4
+    80205fcc:	ffffb097          	auipc	ra,0xffffb
+    80205fd0:	9f4080e7          	jalr	-1548(ra) # 802009c0 <strchr>
+    80205fd4:	e121                	bnez	a0,80206014 <formatname+0x86>
+    for (p = name; *p; p++) {
+    80205fd6:	0905                	addi	s2,s2,1
+    80205fd8:	00094583          	lbu	a1,0(s2)
+    80205fdc:	f5ed                	bnez	a1,80205fc6 <formatname+0x38>
+        if (*p != ' ') {
+    80205fde:	02000693          	li	a3,32
+    80205fe2:	874a                	mv	a4,s2
+    while (p-- > name) {
+    80205fe4:	0124fb63          	bgeu	s1,s2,80205ffa <formatname+0x6c>
+        if (*p != ' ') {
+    80205fe8:	197d                	addi	s2,s2,-1
+    80205fea:	00094783          	lbu	a5,0(s2)
+    80205fee:	fed78ae3          	beq	a5,a3,80205fe2 <formatname+0x54>
+            p[1] = '\0';
+    80205ff2:	00070023          	sb	zero,0(a4)
+            break;
+    80205ff6:	8526                	mv	a0,s1
+    80205ff8:	a031                	j	80206004 <formatname+0x76>
+    80205ffa:	8526                	mv	a0,s1
+    80205ffc:	a021                	j	80206004 <formatname+0x76>
+    for (p = name; *p; p++) {
+    80205ffe:	8526                	mv	a0,s1
+    80206000:	a011                	j	80206004 <formatname+0x76>
+            return 0;
+    80206002:	4501                	li	a0,0
+}
+    80206004:	70a2                	ld	ra,40(sp)
+    80206006:	7402                	ld	s0,32(sp)
+    80206008:	64e2                	ld	s1,24(sp)
+    8020600a:	6942                	ld	s2,16(sp)
+    8020600c:	69a2                	ld	s3,8(sp)
+    8020600e:	6a02                	ld	s4,0(sp)
+    80206010:	6145                	addi	sp,sp,48
+    80206012:	8082                	ret
+            return 0;
+    80206014:	4501                	li	a0,0
+    80206016:	b7fd                	j	80206004 <formatname+0x76>
+
+0000000080206018 <cal_checksum>:
+{
+    80206018:	1141                	addi	sp,sp,-16
+    8020601a:	e422                	sd	s0,8(sp)
+    8020601c:	0800                	addi	s0,sp,16
+    8020601e:	87aa                	mv	a5,a0
+    for (int i = CHAR_SHORT_NAME; i != 0; i--) {
+    80206020:	00b50613          	addi	a2,a0,11
+    uint8 sum = 0;
+    80206024:	4501                	li	a0,0
+        sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + *shortname++;
+    80206026:	0075171b          	slliw	a4,a0,0x7
+    8020602a:	0785                	addi	a5,a5,1
+    8020602c:	0015551b          	srliw	a0,a0,0x1
+    80206030:	fff7c683          	lbu	a3,-1(a5)
+    80206034:	9d35                	addw	a0,a0,a3
+    80206036:	953a                	add	a0,a0,a4
+    80206038:	0ff57513          	zext.b	a0,a0
+    for (int i = CHAR_SHORT_NAME; i != 0; i--) {
+    8020603c:	fef615e3          	bne	a2,a5,80206026 <cal_checksum+0xe>
+}
+    80206040:	6422                	ld	s0,8(sp)
+    80206042:	0141                	addi	sp,sp,16
+    80206044:	8082                	ret
+
+0000000080206046 <emake>:
+{
+    80206046:	7131                	addi	sp,sp,-192
+    80206048:	fd06                	sd	ra,184(sp)
+    8020604a:	f922                	sd	s0,176(sp)
+    8020604c:	f526                	sd	s1,168(sp)
+    8020604e:	f14a                	sd	s2,160(sp)
+    80206050:	ed4e                	sd	s3,152(sp)
+    80206052:	e952                	sd	s4,144(sp)
+    80206054:	e556                	sd	s5,136(sp)
+    80206056:	e15a                	sd	s6,128(sp)
+    80206058:	fcde                	sd	s7,120(sp)
+    8020605a:	f8e2                	sd	s8,112(sp)
+    8020605c:	f4e6                	sd	s9,104(sp)
+    8020605e:	f0ea                	sd	s10,96(sp)
+    80206060:	ecee                	sd	s11,88(sp)
+    80206062:	0180                	addi	s0,sp,192
+    if (!(dp->attribute & ATTR_DIRECTORY))
+    80206064:	10054783          	lbu	a5,256(a0)
+    80206068:	8bc1                	andi	a5,a5,16
+    8020606a:	c3d5                	beqz	a5,8020610e <emake+0xc8>
+    8020606c:	8b2a                	mv	s6,a0
+    8020606e:	8d2e                	mv	s10,a1
+    80206070:	8cb2                	mv	s9,a2
+    if (off % sizeof(union dentry))
+    80206072:	01f67793          	andi	a5,a2,31
+    80206076:	e7c5                	bnez	a5,8020611e <emake+0xd8>
+    memset(&de, 0, sizeof(de));
+    80206078:	02000613          	li	a2,32
+    8020607c:	4581                	li	a1,0
+    8020607e:	f7040513          	addi	a0,s0,-144
+    80206082:	ffffa097          	auipc	ra,0xffffa
+    80206086:	6e0080e7          	jalr	1760(ra) # 80200762 <memset>
+    if (off <= 32) {
+    8020608a:	02000793          	li	a5,32
+    8020608e:	0b97ec63          	bltu	a5,s9,80206146 <emake+0x100>
+        if (off == 0) {
+    80206092:	080c9e63          	bnez	s9,8020612e <emake+0xe8>
+            strncpy(de.sne.name, ".          ", sizeof(de.sne.name));
+    80206096:	462d                	li	a2,11
+    80206098:	00004597          	auipc	a1,0x4
+    8020609c:	d8058593          	addi	a1,a1,-640 # 80209e18 <digits+0xa98>
+    802060a0:	f7040513          	addi	a0,s0,-144
+    802060a4:	ffffa097          	auipc	ra,0xffffa
+    802060a8:	7d2080e7          	jalr	2002(ra) # 80200876 <strncpy>
+        de.sne.attr = ATTR_DIRECTORY;
+    802060ac:	47c1                	li	a5,16
+    802060ae:	f6f40da3          	sb	a5,-133(s0)
+        de.sne.fst_clus_hi = (uint16)(ep->first_clus >> 16);        // first clus high 16 bits
+    802060b2:	104d2783          	lw	a5,260(s10) # fffffffffffff104 <ebss_clear+0xffffffff7fdd9104>
+    802060b6:	0107d71b          	srliw	a4,a5,0x10
+    802060ba:	f8e41223          	sh	a4,-124(s0)
+        de.sne.fst_clus_lo = (uint16)(ep->first_clus & 0xffff);       // low 16 bits
+    802060be:	f8f41523          	sh	a5,-118(s0)
+        de.sne.file_size = 0;                                       // filesize is updated in eupdate()
+    802060c2:	f8042623          	sw	zero,-116(s0)
+        off = reloc_clus(dp, off, 1);
+    802060c6:	4605                	li	a2,1
+    802060c8:	85e6                	mv	a1,s9
+    802060ca:	855a                	mv	a0,s6
+    802060cc:	fffff097          	auipc	ra,0xfffff
+    802060d0:	68a080e7          	jalr	1674(ra) # 80205756 <reloc_clus>
+        rw_clus(dp->cur_clus, 1, 0, (uint64)&de, off, sizeof(de));
+    802060d4:	02000793          	li	a5,32
+    802060d8:	0005071b          	sext.w	a4,a0
+    802060dc:	f7040693          	addi	a3,s0,-144
+    802060e0:	4601                	li	a2,0
+    802060e2:	4585                	li	a1,1
+    802060e4:	10cb2503          	lw	a0,268(s6)
+    802060e8:	fffff097          	auipc	ra,0xfffff
+    802060ec:	776080e7          	jalr	1910(ra) # 8020585e <rw_clus>
+}
+    802060f0:	70ea                	ld	ra,184(sp)
+    802060f2:	744a                	ld	s0,176(sp)
+    802060f4:	74aa                	ld	s1,168(sp)
+    802060f6:	790a                	ld	s2,160(sp)
+    802060f8:	69ea                	ld	s3,152(sp)
+    802060fa:	6a4a                	ld	s4,144(sp)
+    802060fc:	6aaa                	ld	s5,136(sp)
+    802060fe:	6b0a                	ld	s6,128(sp)
+    80206100:	7be6                	ld	s7,120(sp)
+    80206102:	7c46                	ld	s8,112(sp)
+    80206104:	7ca6                	ld	s9,104(sp)
+    80206106:	7d06                	ld	s10,96(sp)
+    80206108:	6de6                	ld	s11,88(sp)
+    8020610a:	6129                	addi	sp,sp,192
+    8020610c:	8082                	ret
+        panic("emake: not dir");
+    8020610e:	00004517          	auipc	a0,0x4
+    80206112:	ce250513          	addi	a0,a0,-798 # 80209df0 <digits+0xa70>
+    80206116:	ffffa097          	auipc	ra,0xffffa
+    8020611a:	02e080e7          	jalr	46(ra) # 80200144 <panic>
+        panic("emake: not aligned");
+    8020611e:	00004517          	auipc	a0,0x4
+    80206122:	ce250513          	addi	a0,a0,-798 # 80209e00 <digits+0xa80>
+    80206126:	ffffa097          	auipc	ra,0xffffa
+    8020612a:	01e080e7          	jalr	30(ra) # 80200144 <panic>
+            strncpy(de.sne.name, "..         ", sizeof(de.sne.name));
+    8020612e:	462d                	li	a2,11
+    80206130:	00004597          	auipc	a1,0x4
+    80206134:	cf858593          	addi	a1,a1,-776 # 80209e28 <digits+0xaa8>
+    80206138:	f7040513          	addi	a0,s0,-144
+    8020613c:	ffffa097          	auipc	ra,0xffffa
+    80206140:	73a080e7          	jalr	1850(ra) # 80200876 <strncpy>
+    80206144:	b7a5                	j	802060ac <emake+0x66>
+        int entcnt = (strlen(ep->filename) + CHAR_LONG_NAME - 1) / CHAR_LONG_NAME;   // count of l-n-entries, rounds up
+    80206146:	896a                	mv	s2,s10
+    80206148:	856a                	mv	a0,s10
+    8020614a:	ffffa097          	auipc	ra,0xffffa
+    8020614e:	79c080e7          	jalr	1948(ra) # 802008e6 <strlen>
+    80206152:	f4a43423          	sd	a0,-184(s0)
+    80206156:	00c5071b          	addiw	a4,a0,12
+    8020615a:	47b5                	li	a5,13
+    8020615c:	02f747bb          	divw	a5,a4,a5
+    80206160:	f4f42c23          	sw	a5,-168(s0)
+    80206164:	00078d9b          	sext.w	s11,a5
+        memset(shortname, 0, sizeof(shortname));
+    80206168:	4631                	li	a2,12
+    8020616a:	4581                	li	a1,0
+    8020616c:	f6040513          	addi	a0,s0,-160
+    80206170:	ffffa097          	auipc	ra,0xffffa
+    80206174:	5f2080e7          	jalr	1522(ra) # 80200762 <memset>
+    for (int j = strlen(name) - 1; j >= 0; j--) {
+    80206178:	856a                	mv	a0,s10
+    8020617a:	ffffa097          	auipc	ra,0xffffa
+    8020617e:	76c080e7          	jalr	1900(ra) # 802008e6 <strlen>
+    80206182:	fff5079b          	addiw	a5,a0,-1
+    80206186:	0207cf63          	bltz	a5,802061c4 <emake+0x17e>
+    8020618a:	97ea                	add	a5,a5,s10
+    8020618c:	ffed0693          	addi	a3,s10,-2
+    80206190:	96aa                	add	a3,a3,a0
+    80206192:	fff5071b          	addiw	a4,a0,-1
+    80206196:	1702                	slli	a4,a4,0x20
+    80206198:	9301                	srli	a4,a4,0x20
+    8020619a:	8e99                	sub	a3,a3,a4
+        if (name[j] == '.') {
+    8020619c:	02e00613          	li	a2,46
+    802061a0:	89be                	mv	s3,a5
+    802061a2:	0007c703          	lbu	a4,0(a5)
+    802061a6:	00c70663          	beq	a4,a2,802061b2 <emake+0x16c>
+    for (int j = strlen(name) - 1; j >= 0; j--) {
+    802061aa:	17fd                	addi	a5,a5,-1
+    802061ac:	fed79ae3          	bne	a5,a3,802061a0 <emake+0x15a>
+    char c, *p = name;
+    802061b0:	89ea                	mv	s3,s10
+        shortname[i++] = c;
+    802061b2:	4481                	li	s1,0
+        if (i == 8 && p) {
+    802061b4:	4aa1                	li	s5,8
+    while (i < CHAR_SHORT_NAME && (c = *name++)) {
+    802061b6:	4ba9                	li	s7,10
+        if (c >= 'a' && c <= 'z') {
+    802061b8:	4c65                	li	s8,25
+                memset(shortname + i, ' ', 8 - i);
+    802061ba:	f6040793          	addi	a5,s0,-160
+    802061be:	f4f43823          	sd	a5,-176(s0)
+    802061c2:	a8d9                	j	80206298 <emake+0x252>
+    char c, *p = name;
+    802061c4:	89ea                	mv	s3,s10
+    802061c6:	b7f5                	j	802061b2 <emake+0x16c>
+        if (i == 8 && p) {
+    802061c8:	22098b63          	beqz	s3,802063fe <emake+0x3b8>
+            if (p + 1 < name) { break; }            // no '.'
+    802061cc:	0985                	addi	s3,s3,1
+    802061ce:	0949fc63          	bgeu	s3,s4,80206266 <emake+0x220>
+    802061d2:	f6040793          	addi	a5,s0,-160
+    802061d6:	97a6                	add	a5,a5,s1
+        shortname[i++] = ' ';
+    802061d8:	02000693          	li	a3,32
+    while (i < CHAR_SHORT_NAME) {
+    802061dc:	4729                	li	a4,10
+        shortname[i++] = ' ';
+    802061de:	2485                	addiw	s1,s1,1
+    802061e0:	00d78023          	sb	a3,0(a5)
+    while (i < CHAR_SHORT_NAME) {
+    802061e4:	0785                	addi	a5,a5,1
+    802061e6:	fe975ce3          	bge	a4,s1,802061de <emake+0x198>
+        de.lne.checksum = cal_checksum((uchar *)shortname);
+    802061ea:	f6040513          	addi	a0,s0,-160
+    802061ee:	00000097          	auipc	ra,0x0
+    802061f2:	e2a080e7          	jalr	-470(ra) # 80206018 <cal_checksum>
+    802061f6:	f6a40ea3          	sb	a0,-131(s0)
+        de.lne.attr = ATTR_LONG_NAME;
+    802061fa:	47bd                	li	a5,15
+    802061fc:	f6f40da3          	sb	a5,-133(s0)
+        for (int i = entcnt; i > 0; i--) {
+    80206200:	f4843783          	ld	a5,-184(s0)
+    80206204:	14f05c63          	blez	a5,8020635c <emake+0x316>
+    80206208:	f5842783          	lw	a5,-168(s0)
+    8020620c:	37fd                	addiw	a5,a5,-1
+    8020620e:	f4f42223          	sw	a5,-188(s0)
+    80206212:	00179b9b          	slliw	s7,a5,0x1
+    80206216:	00fb8bbb          	addw	s7,s7,a5
+    8020621a:	002b9b9b          	slliw	s7,s7,0x2
+    8020621e:	00fb8bbb          	addw	s7,s7,a5
+    80206222:	9bea                	add	s7,s7,s10
+    80206224:	8aee                	mv	s5,s11
+    80206226:	8c66                	mv	s8,s9
+            int end = 0;
+    80206228:	4981                	li	s3,0
+            uint8 *w = (uint8 *)de.lne.name1;
+    8020622a:	f7140793          	addi	a5,s0,-143
+    8020622e:	f4f43823          	sd	a5,-176(s0)
+    80206232:	0ff00913          	li	s2,255
+                    case 5:     w = (uint8 *)de.lne.name2; break;
+    80206236:	f7e40793          	addi	a5,s0,-130
+    8020623a:	f4f43c23          	sd	a5,-168(s0)
+                switch (j) {
+    8020623e:	44ad                	li	s1,11
+    80206240:	f8c40a13          	addi	s4,s0,-116
+    80206244:	a0c5                	j	80206324 <emake+0x2de>
+            if (name > p) {                    // last '.'
+    80206246:	0549f663          	bgeu	s3,s4,80206292 <emake+0x24c>
+                memset(shortname + i, ' ', 8 - i);
+    8020624a:	47a1                	li	a5,8
+    8020624c:	4097863b          	subw	a2,a5,s1
+    80206250:	02000593          	li	a1,32
+    80206254:	f5043783          	ld	a5,-176(s0)
+    80206258:	00978533          	add	a0,a5,s1
+    8020625c:	ffffa097          	auipc	ra,0xffffa
+    80206260:	506080e7          	jalr	1286(ra) # 80200762 <memset>
+    while (i < CHAR_SHORT_NAME && (c = *name++)) {
+    80206264:	89d2                	mv	s3,s4
+        shortname[i++] = c;
+    80206266:	8a4e                	mv	s4,s3
+    80206268:	84d6                	mv	s1,s5
+    8020626a:	4981                	li	s3,0
+    8020626c:	a02d                	j	80206296 <emake+0x250>
+            if (strchr(illegal, c) != NULL) {
+    8020626e:	85ca                	mv	a1,s2
+    80206270:	00006517          	auipc	a0,0x6
+    80206274:	a6050513          	addi	a0,a0,-1440 # 8020bcd0 <illegal.0>
+    80206278:	ffffa097          	auipc	ra,0xffffa
+    8020627c:	748080e7          	jalr	1864(ra) # 802009c0 <strchr>
+    80206280:	c119                	beqz	a0,80206286 <emake+0x240>
+                c = '_';
+    80206282:	05f00913          	li	s2,95
+        shortname[i++] = c;
+    80206286:	f9048793          	addi	a5,s1,-112
+    8020628a:	97a2                	add	a5,a5,s0
+    8020628c:	fd278823          	sb	s2,-48(a5)
+    80206290:	2485                	addiw	s1,s1,1
+    while (i < CHAR_SHORT_NAME && (c = *name++)) {
+    80206292:	f49bcce3          	blt	s7,s1,802061ea <emake+0x1a4>
+        shortname[i++] = c;
+    80206296:	8952                	mv	s2,s4
+    while (i < CHAR_SHORT_NAME && (c = *name++)) {
+    80206298:	00190a13          	addi	s4,s2,1
+    8020629c:	00094903          	lbu	s2,0(s2)
+    802062a0:	02090663          	beqz	s2,802062cc <emake+0x286>
+        if (i == 8 && p) {
+    802062a4:	f35482e3          	beq	s1,s5,802061c8 <emake+0x182>
+        if (c == ' ') { continue; }
+    802062a8:	02000793          	li	a5,32
+    802062ac:	fef903e3          	beq	s2,a5,80206292 <emake+0x24c>
+        if (c == '.') {
+    802062b0:	02e00793          	li	a5,46
+    802062b4:	f8f909e3          	beq	s2,a5,80206246 <emake+0x200>
+        if (c >= 'a' && c <= 'z') {
+    802062b8:	f9f9079b          	addiw	a5,s2,-97
+    802062bc:	0ff7f793          	zext.b	a5,a5
+    802062c0:	fafc67e3          	bltu	s8,a5,8020626e <emake+0x228>
+            c += 'A' - 'a';
+    802062c4:	3901                	addiw	s2,s2,-32
+    802062c6:	0ff97913          	zext.b	s2,s2
+    802062ca:	bf75                	j	80206286 <emake+0x240>
+    while (i < CHAR_SHORT_NAME) {
+    802062cc:	47a9                	li	a5,10
+    802062ce:	f097d2e3          	bge	a5,s1,802061d2 <emake+0x18c>
+    802062d2:	bf21                	j	802061ea <emake+0x1a4>
+                de.lne.order |= LAST_LONG_ENTRY;
+    802062d4:	0407e793          	ori	a5,a5,64
+    802062d8:	f6f40823          	sb	a5,-144(s0)
+    802062dc:	a891                	j	80206330 <emake+0x2ea>
+                    if ((*w++ = *p++) == 0) {
+    802062de:	00084603          	lbu	a2,0(a6)
+                        end = 1;
+    802062e2:	00163513          	seqz	a0,a2
+                    *w++ = 0;
+    802062e6:	00278893          	addi	a7,a5,2
+                    if ((*w++ = *p++) == 0) {
+    802062ea:	0805                	addi	a6,a6,1
+                    *w++ = 0;
+    802062ec:	85ce                	mv	a1,s3
+    802062ee:	a8d5                	j	802063e2 <emake+0x39c>
+            uint off2 = reloc_clus(dp, off, 1);
+    802062f0:	4605                	li	a2,1
+    802062f2:	85e2                	mv	a1,s8
+    802062f4:	855a                	mv	a0,s6
+    802062f6:	fffff097          	auipc	ra,0xfffff
+    802062fa:	460080e7          	jalr	1120(ra) # 80205756 <reloc_clus>
+            rw_clus(dp->cur_clus, 1, 0, (uint64)&de, off2, sizeof(de));
+    802062fe:	02000793          	li	a5,32
+    80206302:	0005071b          	sext.w	a4,a0
+    80206306:	f7040693          	addi	a3,s0,-144
+    8020630a:	864e                	mv	a2,s3
+    8020630c:	4585                	li	a1,1
+    8020630e:	10cb2503          	lw	a0,268(s6)
+    80206312:	fffff097          	auipc	ra,0xfffff
+    80206316:	54c080e7          	jalr	1356(ra) # 8020585e <rw_clus>
+            off += sizeof(de);
+    8020631a:	020c0c1b          	addiw	s8,s8,32
+        for (int i = entcnt; i > 0; i--) {
+    8020631e:	1bcd                	addi	s7,s7,-13
+    80206320:	03505163          	blez	s5,80206342 <emake+0x2fc>
+            if ((de.lne.order = i) == entcnt) {
+    80206324:	0ffaf793          	zext.b	a5,s5
+    80206328:	fafd86e3          	beq	s11,a5,802062d4 <emake+0x28e>
+    8020632c:	f6f40823          	sb	a5,-144(s0)
+            char *p = ep->filename + (i - 1) * CHAR_LONG_NAME;
+    80206330:	3afd                	addiw	s5,s5,-1
+    80206332:	885e                	mv	a6,s7
+    80206334:	4709                	li	a4,2
+            int end = 0;
+    80206336:	854e                	mv	a0,s3
+            uint8 *w = (uint8 *)de.lne.name1;
+    80206338:	f5043783          	ld	a5,-176(s0)
+                switch (j) {
+    8020633c:	4315                	li	t1,5
+            for (int j = 1; j <= CHAR_LONG_NAME; j++) {
+    8020633e:	4e35                	li	t3,13
+    80206340:	a851                	j	802063d4 <emake+0x38e>
+    80206342:	020c8c9b          	addiw	s9,s9,32
+            off += sizeof(de);
+    80206346:	4781                	li	a5,0
+    80206348:	f4843703          	ld	a4,-184(s0)
+    8020634c:	00e05663          	blez	a4,80206358 <emake+0x312>
+    80206350:	f4442783          	lw	a5,-188(s0)
+    80206354:	0057979b          	slliw	a5,a5,0x5
+    80206358:	01978cbb          	addw	s9,a5,s9
+        memset(&de, 0, sizeof(de));
+    8020635c:	02000613          	li	a2,32
+    80206360:	4581                	li	a1,0
+    80206362:	f7040493          	addi	s1,s0,-144
+    80206366:	8526                	mv	a0,s1
+    80206368:	ffffa097          	auipc	ra,0xffffa
+    8020636c:	3fa080e7          	jalr	1018(ra) # 80200762 <memset>
+        strncpy(de.sne.name, shortname, sizeof(de.sne.name));
+    80206370:	462d                	li	a2,11
+    80206372:	f6040593          	addi	a1,s0,-160
+    80206376:	8526                	mv	a0,s1
+    80206378:	ffffa097          	auipc	ra,0xffffa
+    8020637c:	4fe080e7          	jalr	1278(ra) # 80200876 <strncpy>
+        de.sne.attr = ep->attribute;
+    80206380:	100d4783          	lbu	a5,256(s10)
+    80206384:	f6f40da3          	sb	a5,-133(s0)
+        de.sne.fst_clus_hi = (uint16)(ep->first_clus >> 16);      // first clus high 16 bits
+    80206388:	104d2783          	lw	a5,260(s10)
+    8020638c:	0107d71b          	srliw	a4,a5,0x10
+    80206390:	f8e41223          	sh	a4,-124(s0)
+        de.sne.fst_clus_lo = (uint16)(ep->first_clus & 0xffff);     // low 16 bits
+    80206394:	f8f41523          	sh	a5,-118(s0)
+        de.sne.file_size = ep->file_size;                         // filesize is updated in eupdate()
+    80206398:	108d2783          	lw	a5,264(s10)
+    8020639c:	f8f42623          	sw	a5,-116(s0)
+        off = reloc_clus(dp, off, 1);
+    802063a0:	4605                	li	a2,1
+    802063a2:	85e6                	mv	a1,s9
+    802063a4:	855a                	mv	a0,s6
+    802063a6:	fffff097          	auipc	ra,0xfffff
+    802063aa:	3b0080e7          	jalr	944(ra) # 80205756 <reloc_clus>
+        rw_clus(dp->cur_clus, 1, 0, (uint64)&de, off, sizeof(de));
+    802063ae:	02000793          	li	a5,32
+    802063b2:	0005071b          	sext.w	a4,a0
+    802063b6:	86a6                	mv	a3,s1
+    802063b8:	4601                	li	a2,0
+    802063ba:	4585                	li	a1,1
+    802063bc:	10cb2503          	lw	a0,268(s6)
+    802063c0:	fffff097          	auipc	ra,0xfffff
+    802063c4:	49e080e7          	jalr	1182(ra) # 8020585e <rw_clus>
+}
+    802063c8:	b325                	j	802060f0 <emake+0xaa>
+                    case 5:     w = (uint8 *)de.lne.name2; break;
+    802063ca:	f5843783          	ld	a5,-168(s0)
+    802063ce:	a011                	j	802063d2 <emake+0x38c>
+                switch (j) {
+    802063d0:	87d2                	mv	a5,s4
+            for (int j = 1; j <= CHAR_LONG_NAME; j++) {
+    802063d2:	2705                	addiw	a4,a4,1
+    802063d4:	fff7069b          	addiw	a3,a4,-1
+                if (end) {
+    802063d8:	d119                	beqz	a0,802062de <emake+0x298>
+                    *w++ = 0xff;
+    802063da:	00278893          	addi	a7,a5,2
+    802063de:	864a                	mv	a2,s2
+    802063e0:	85ca                	mv	a1,s2
+                    *w++ = 0xff;            // on k210, unaligned reading is illegal
+    802063e2:	00c78023          	sb	a2,0(a5)
+                    *w++ = 0xff;
+    802063e6:	00b780a3          	sb	a1,1(a5)
+                switch (j) {
+    802063ea:	fe6680e3          	beq	a3,t1,802063ca <emake+0x384>
+    802063ee:	fe9681e3          	beq	a3,s1,802063d0 <emake+0x38a>
+            for (int j = 1; j <= CHAR_LONG_NAME; j++) {
+    802063f2:	0007079b          	sext.w	a5,a4
+    802063f6:	eefe4de3          	blt	t3,a5,802062f0 <emake+0x2aa>
+    802063fa:	87c6                	mv	a5,a7
+    802063fc:	bfd9                	j	802063d2 <emake+0x38c>
+        if (c == ' ') { continue; }
+    802063fe:	02000793          	li	a5,32
+    80206402:	e8f90ae3          	beq	s2,a5,80206296 <emake+0x250>
+        if (c == '.') {
+    80206406:	02e00793          	li	a5,46
+    8020640a:	eaf917e3          	bne	s2,a5,802062b8 <emake+0x272>
+    8020640e:	bd35                	j	8020624a <emake+0x204>
+
+0000000080206410 <edup>:
+{
+    80206410:	1101                	addi	sp,sp,-32
+    80206412:	ec06                	sd	ra,24(sp)
+    80206414:	e822                	sd	s0,16(sp)
+    80206416:	e426                	sd	s1,8(sp)
+    80206418:	1000                	addi	s0,sp,32
+    8020641a:	84aa                	mv	s1,a0
+    if (entry != 0) {
+    8020641c:	c515                	beqz	a0,80206448 <edup+0x38>
+        acquire(&ecache.lock);
+    8020641e:	00018517          	auipc	a0,0x18
+    80206422:	19a50513          	addi	a0,a0,410 # 8021e5b8 <ecache>
+    80206426:	ffffa097          	auipc	ra,0xffffa
+    8020642a:	2a0080e7          	jalr	672(ra) # 802006c6 <acquire>
+        entry->ref++;
+    8020642e:	1184a783          	lw	a5,280(s1)
+    80206432:	2785                	addiw	a5,a5,1
+    80206434:	10f4ac23          	sw	a5,280(s1)
+        release(&ecache.lock);
+    80206438:	00018517          	auipc	a0,0x18
+    8020643c:	18050513          	addi	a0,a0,384 # 8021e5b8 <ecache>
+    80206440:	ffffa097          	auipc	ra,0xffffa
+    80206444:	2da080e7          	jalr	730(ra) # 8020071a <release>
+}
+    80206448:	8526                	mv	a0,s1
+    8020644a:	60e2                	ld	ra,24(sp)
+    8020644c:	6442                	ld	s0,16(sp)
+    8020644e:	64a2                	ld	s1,8(sp)
+    80206450:	6105                	addi	sp,sp,32
+    80206452:	8082                	ret
+
+0000000080206454 <eupdate>:
+    if (!entry->dirty || entry->valid != 1) { return; }
+    80206454:	11554783          	lbu	a5,277(a0)
+    80206458:	c3e5                	beqz	a5,80206538 <eupdate+0xe4>
+{
+    8020645a:	711d                	addi	sp,sp,-96
+    8020645c:	ec86                	sd	ra,88(sp)
+    8020645e:	e8a2                	sd	s0,80(sp)
+    80206460:	e4a6                	sd	s1,72(sp)
+    80206462:	e0ca                	sd	s2,64(sp)
+    80206464:	fc4e                	sd	s3,56(sp)
+    80206466:	1080                	addi	s0,sp,96
+    80206468:	84aa                	mv	s1,a0
+    if (!entry->dirty || entry->valid != 1) { return; }
+    8020646a:	11651703          	lh	a4,278(a0)
+    8020646e:	4785                	li	a5,1
+    80206470:	00f70963          	beq	a4,a5,80206482 <eupdate+0x2e>
+}
+    80206474:	60e6                	ld	ra,88(sp)
+    80206476:	6446                	ld	s0,80(sp)
+    80206478:	64a6                	ld	s1,72(sp)
+    8020647a:	6906                	ld	s2,64(sp)
+    8020647c:	79e2                	ld	s3,56(sp)
+    8020647e:	6125                	addi	sp,sp,96
+    80206480:	8082                	ret
+    uint entcnt = 0;
+    80206482:	fc042623          	sw	zero,-52(s0)
+    uint32 off = reloc_clus(entry->parent, entry->off, 0);
+    80206486:	4601                	li	a2,0
+    80206488:	11c52583          	lw	a1,284(a0)
+    8020648c:	12053503          	ld	a0,288(a0)
+    80206490:	fffff097          	auipc	ra,0xfffff
+    80206494:	2c6080e7          	jalr	710(ra) # 80205756 <reloc_clus>
+    rw_clus(entry->parent->cur_clus, 0, 0, (uint64) &entcnt, off, 1);
+    80206498:	1204b803          	ld	a6,288(s1)
+    8020649c:	4785                	li	a5,1
+    8020649e:	0005071b          	sext.w	a4,a0
+    802064a2:	fcc40693          	addi	a3,s0,-52
+    802064a6:	4601                	li	a2,0
+    802064a8:	4581                	li	a1,0
+    802064aa:	10c82503          	lw	a0,268(a6)
+    802064ae:	fffff097          	auipc	ra,0xfffff
+    802064b2:	3b0080e7          	jalr	944(ra) # 8020585e <rw_clus>
+    entcnt &= ~LAST_LONG_ENTRY;
+    802064b6:	fcc42583          	lw	a1,-52(s0)
+    802064ba:	fbf5f593          	andi	a1,a1,-65
+    802064be:	fcb42623          	sw	a1,-52(s0)
+    off = reloc_clus(entry->parent, entry->off + (entcnt << 5), 0);
+    802064c2:	0055959b          	slliw	a1,a1,0x5
+    802064c6:	11c4a783          	lw	a5,284(s1)
+    802064ca:	4601                	li	a2,0
+    802064cc:	9dbd                	addw	a1,a1,a5
+    802064ce:	1204b503          	ld	a0,288(s1)
+    802064d2:	fffff097          	auipc	ra,0xfffff
+    802064d6:	284080e7          	jalr	644(ra) # 80205756 <reloc_clus>
+    802064da:	0005099b          	sext.w	s3,a0
+    rw_clus(entry->parent->cur_clus, 0, 0, (uint64)&de, off, sizeof(de));
+    802064de:	1204b503          	ld	a0,288(s1)
+    802064e2:	02000793          	li	a5,32
+    802064e6:	874e                	mv	a4,s3
+    802064e8:	fa840913          	addi	s2,s0,-88
+    802064ec:	86ca                	mv	a3,s2
+    802064ee:	4601                	li	a2,0
+    802064f0:	4581                	li	a1,0
+    802064f2:	10c52503          	lw	a0,268(a0)
+    802064f6:	fffff097          	auipc	ra,0xfffff
+    802064fa:	368080e7          	jalr	872(ra) # 8020585e <rw_clus>
+    de.sne.fst_clus_hi = (uint16)(entry->first_clus >> 16);
+    802064fe:	1044a783          	lw	a5,260(s1)
+    80206502:	0107d71b          	srliw	a4,a5,0x10
+    80206506:	fae41e23          	sh	a4,-68(s0)
+    de.sne.fst_clus_lo = (uint16)(entry->first_clus & 0xffff);
+    8020650a:	fcf41123          	sh	a5,-62(s0)
+    de.sne.file_size = entry->file_size;
+    8020650e:	1084a783          	lw	a5,264(s1)
+    80206512:	fcf42223          	sw	a5,-60(s0)
+    rw_clus(entry->parent->cur_clus, 1, 0, (uint64)&de, off, sizeof(de));
+    80206516:	1204b503          	ld	a0,288(s1)
+    8020651a:	02000793          	li	a5,32
+    8020651e:	874e                	mv	a4,s3
+    80206520:	86ca                	mv	a3,s2
+    80206522:	4601                	li	a2,0
+    80206524:	4585                	li	a1,1
+    80206526:	10c52503          	lw	a0,268(a0)
+    8020652a:	fffff097          	auipc	ra,0xfffff
+    8020652e:	334080e7          	jalr	820(ra) # 8020585e <rw_clus>
+    entry->dirty = 0;
+    80206532:	10048aa3          	sb	zero,277(s1)
+    80206536:	bf3d                	j	80206474 <eupdate+0x20>
+    80206538:	8082                	ret
+
+000000008020653a <eremove>:
+    if (entry->valid != 1) { return; }
+    8020653a:	11651703          	lh	a4,278(a0)
+    8020653e:	4785                	li	a5,1
+    80206540:	00f70363          	beq	a4,a5,80206546 <eremove+0xc>
+    80206544:	8082                	ret
+{
+    80206546:	715d                	addi	sp,sp,-80
+    80206548:	e486                	sd	ra,72(sp)
+    8020654a:	e0a2                	sd	s0,64(sp)
+    8020654c:	fc26                	sd	s1,56(sp)
+    8020654e:	f84a                	sd	s2,48(sp)
+    80206550:	f44e                	sd	s3,40(sp)
+    80206552:	f052                	sd	s4,32(sp)
+    80206554:	ec56                	sd	s5,24(sp)
+    80206556:	0880                	addi	s0,sp,80
+    80206558:	89aa                	mv	s3,a0
+    uint entcnt = 0;
+    8020655a:	fa042e23          	sw	zero,-68(s0)
+    uint32 off = entry->off;
+    8020655e:	11c52a03          	lw	s4,284(a0)
+    uint32 off2 = reloc_clus(entry->parent, off, 0);
+    80206562:	4601                	li	a2,0
+    80206564:	85d2                	mv	a1,s4
+    80206566:	12053503          	ld	a0,288(a0)
+    8020656a:	fffff097          	auipc	ra,0xfffff
+    8020656e:	1ec080e7          	jalr	492(ra) # 80205756 <reloc_clus>
+    80206572:	0005049b          	sext.w	s1,a0
+    rw_clus(entry->parent->cur_clus, 0, 0, (uint64) &entcnt, off2, 1);
+    80206576:	1209b503          	ld	a0,288(s3)
+    8020657a:	4785                	li	a5,1
+    8020657c:	8726                	mv	a4,s1
+    8020657e:	fbc40693          	addi	a3,s0,-68
+    80206582:	4601                	li	a2,0
+    80206584:	4581                	li	a1,0
+    80206586:	10c52503          	lw	a0,268(a0)
+    8020658a:	fffff097          	auipc	ra,0xfffff
+    8020658e:	2d4080e7          	jalr	724(ra) # 8020585e <rw_clus>
+    entcnt &= ~LAST_LONG_ENTRY;
+    80206592:	fbc42783          	lw	a5,-68(s0)
+    80206596:	fbf7f793          	andi	a5,a5,-65
+    8020659a:	faf42e23          	sw	a5,-68(s0)
+    uint8 flag = EMPTY_ENTRY;
+    8020659e:	5795                	li	a5,-27
+    802065a0:	faf40da3          	sb	a5,-69(s0)
+    for (int i = 0; i <= entcnt; i++) {
+    802065a4:	4901                	li	s2,0
+        rw_clus(entry->parent->cur_clus, 1, 0, (uint64) &flag, off2, 1);
+    802065a6:	fbb40a93          	addi	s5,s0,-69
+    802065aa:	1209b503          	ld	a0,288(s3)
+    802065ae:	4785                	li	a5,1
+    802065b0:	8726                	mv	a4,s1
+    802065b2:	86d6                	mv	a3,s5
+    802065b4:	4601                	li	a2,0
+    802065b6:	4585                	li	a1,1
+    802065b8:	10c52503          	lw	a0,268(a0)
+    802065bc:	fffff097          	auipc	ra,0xfffff
+    802065c0:	2a2080e7          	jalr	674(ra) # 8020585e <rw_clus>
+        off += 32;
+    802065c4:	020a0a1b          	addiw	s4,s4,32
+        off2 = reloc_clus(entry->parent, off, 0);
+    802065c8:	4601                	li	a2,0
+    802065ca:	85d2                	mv	a1,s4
+    802065cc:	1209b503          	ld	a0,288(s3)
+    802065d0:	fffff097          	auipc	ra,0xfffff
+    802065d4:	186080e7          	jalr	390(ra) # 80205756 <reloc_clus>
+    802065d8:	0005049b          	sext.w	s1,a0
+    for (int i = 0; i <= entcnt; i++) {
+    802065dc:	0019079b          	addiw	a5,s2,1
+    802065e0:	0007891b          	sext.w	s2,a5
+    802065e4:	fbc42703          	lw	a4,-68(s0)
+    802065e8:	fd2771e3          	bgeu	a4,s2,802065aa <eremove+0x70>
+    entry->valid = -1;
+    802065ec:	57fd                	li	a5,-1
+    802065ee:	10f99b23          	sh	a5,278(s3)
+}
+    802065f2:	60a6                	ld	ra,72(sp)
+    802065f4:	6406                	ld	s0,64(sp)
+    802065f6:	74e2                	ld	s1,56(sp)
+    802065f8:	7942                	ld	s2,48(sp)
+    802065fa:	79a2                	ld	s3,40(sp)
+    802065fc:	7a02                	ld	s4,32(sp)
+    802065fe:	6ae2                	ld	s5,24(sp)
+    80206600:	6161                	addi	sp,sp,80
+    80206602:	8082                	ret
+
+0000000080206604 <etrunc>:
+{
+    80206604:	7179                	addi	sp,sp,-48
+    80206606:	f406                	sd	ra,40(sp)
+    80206608:	f022                	sd	s0,32(sp)
+    8020660a:	ec26                	sd	s1,24(sp)
+    8020660c:	e84a                	sd	s2,16(sp)
+    8020660e:	e44e                	sd	s3,8(sp)
+    80206610:	e052                	sd	s4,0(sp)
+    80206612:	1800                	addi	s0,sp,48
+    80206614:	8a2a                	mv	s4,a0
+    for (uint32 clus = entry->first_clus; clus >= 2 && clus < FAT32_EOC; ) {
+    80206616:	10452483          	lw	s1,260(a0)
+    8020661a:	ffe4871b          	addiw	a4,s1,-2
+    8020661e:	100007b7          	lui	a5,0x10000
+    80206622:	17d5                	addi	a5,a5,-11 # ffffff5 <_entry-0x7020000b>
+    80206624:	02e7e663          	bltu	a5,a4,80206650 <etrunc+0x4c>
+    80206628:	89be                	mv	s3,a5
+        uint32 next = read_fat(clus);
+    8020662a:	0004891b          	sext.w	s2,s1
+    8020662e:	8526                	mv	a0,s1
+    80206630:	fffff097          	auipc	ra,0xfffff
+    80206634:	eee080e7          	jalr	-274(ra) # 8020551e <read_fat>
+    80206638:	0005049b          	sext.w	s1,a0
+    write_fat(cluster, 0);
+    8020663c:	4581                	li	a1,0
+    8020663e:	854a                	mv	a0,s2
+    80206640:	fffff097          	auipc	ra,0xfffff
+    80206644:	096080e7          	jalr	150(ra) # 802056d6 <write_fat>
+    for (uint32 clus = entry->first_clus; clus >= 2 && clus < FAT32_EOC; ) {
+    80206648:	ffe4879b          	addiw	a5,s1,-2
+    8020664c:	fcf9ffe3          	bgeu	s3,a5,8020662a <etrunc+0x26>
+    entry->file_size = 0;
+    80206650:	100a2423          	sw	zero,264(s4)
+    entry->first_clus = 0;
+    80206654:	100a2223          	sw	zero,260(s4)
+    entry->dirty = 1;
+    80206658:	4785                	li	a5,1
+    8020665a:	10fa0aa3          	sb	a5,277(s4)
+}
+    8020665e:	70a2                	ld	ra,40(sp)
+    80206660:	7402                	ld	s0,32(sp)
+    80206662:	64e2                	ld	s1,24(sp)
+    80206664:	6942                	ld	s2,16(sp)
+    80206666:	69a2                	ld	s3,8(sp)
+    80206668:	6a02                	ld	s4,0(sp)
+    8020666a:	6145                	addi	sp,sp,48
+    8020666c:	8082                	ret
+
+000000008020666e <elock>:
+{
+    8020666e:	1141                	addi	sp,sp,-16
+    80206670:	e406                	sd	ra,8(sp)
+    80206672:	e022                	sd	s0,0(sp)
+    80206674:	0800                	addi	s0,sp,16
+    if (entry == 0 || entry->ref < 1)
+    80206676:	cd19                	beqz	a0,80206694 <elock+0x26>
+    80206678:	11852783          	lw	a5,280(a0)
+    8020667c:	00f05c63          	blez	a5,80206694 <elock+0x26>
+    acquiresleep(&entry->lock);
+    80206680:	13850513          	addi	a0,a0,312
+    80206684:	ffffd097          	auipc	ra,0xffffd
+    80206688:	44a080e7          	jalr	1098(ra) # 80203ace <acquiresleep>
+}
+    8020668c:	60a2                	ld	ra,8(sp)
+    8020668e:	6402                	ld	s0,0(sp)
+    80206690:	0141                	addi	sp,sp,16
+    80206692:	8082                	ret
+        panic("elock");
+    80206694:	00003517          	auipc	a0,0x3
+    80206698:	7a450513          	addi	a0,a0,1956 # 80209e38 <digits+0xab8>
+    8020669c:	ffffa097          	auipc	ra,0xffffa
+    802066a0:	aa8080e7          	jalr	-1368(ra) # 80200144 <panic>
+
+00000000802066a4 <eunlock>:
+{
+    802066a4:	1101                	addi	sp,sp,-32
+    802066a6:	ec06                	sd	ra,24(sp)
+    802066a8:	e822                	sd	s0,16(sp)
+    802066aa:	e426                	sd	s1,8(sp)
+    802066ac:	e04a                	sd	s2,0(sp)
+    802066ae:	1000                	addi	s0,sp,32
+    if (entry == 0 || !holdingsleep(&entry->lock) || entry->ref < 1)
+    802066b0:	c90d                	beqz	a0,802066e2 <eunlock+0x3e>
+    802066b2:	84aa                	mv	s1,a0
+    802066b4:	13850913          	addi	s2,a0,312
+    802066b8:	854a                	mv	a0,s2
+    802066ba:	ffffd097          	auipc	ra,0xffffd
+    802066be:	4ae080e7          	jalr	1198(ra) # 80203b68 <holdingsleep>
+    802066c2:	c105                	beqz	a0,802066e2 <eunlock+0x3e>
+    802066c4:	1184a783          	lw	a5,280(s1)
+    802066c8:	00f05d63          	blez	a5,802066e2 <eunlock+0x3e>
+    releasesleep(&entry->lock);
+    802066cc:	854a                	mv	a0,s2
+    802066ce:	ffffd097          	auipc	ra,0xffffd
+    802066d2:	456080e7          	jalr	1110(ra) # 80203b24 <releasesleep>
+}
+    802066d6:	60e2                	ld	ra,24(sp)
+    802066d8:	6442                	ld	s0,16(sp)
+    802066da:	64a2                	ld	s1,8(sp)
+    802066dc:	6902                	ld	s2,0(sp)
+    802066de:	6105                	addi	sp,sp,32
+    802066e0:	8082                	ret
+        panic("eunlock");
+    802066e2:	00003517          	auipc	a0,0x3
+    802066e6:	75e50513          	addi	a0,a0,1886 # 80209e40 <digits+0xac0>
+    802066ea:	ffffa097          	auipc	ra,0xffffa
+    802066ee:	a5a080e7          	jalr	-1446(ra) # 80200144 <panic>
+
+00000000802066f2 <eput>:
+{
+    802066f2:	1101                	addi	sp,sp,-32
+    802066f4:	ec06                	sd	ra,24(sp)
+    802066f6:	e822                	sd	s0,16(sp)
+    802066f8:	e426                	sd	s1,8(sp)
+    802066fa:	e04a                	sd	s2,0(sp)
+    802066fc:	1000                	addi	s0,sp,32
+    802066fe:	84aa                	mv	s1,a0
+    acquire(&ecache.lock);
+    80206700:	00018517          	auipc	a0,0x18
+    80206704:	eb850513          	addi	a0,a0,-328 # 8021e5b8 <ecache>
+    80206708:	ffffa097          	auipc	ra,0xffffa
+    8020670c:	fbe080e7          	jalr	-66(ra) # 802006c6 <acquire>
+    if (entry != &root && entry->valid != 0 && entry->ref == 1) {
+    80206710:	00018797          	auipc	a5,0x18
+    80206714:	d4078793          	addi	a5,a5,-704 # 8021e450 <root>
+    80206718:	00f48a63          	beq	s1,a5,8020672c <eput+0x3a>
+    8020671c:	11649783          	lh	a5,278(s1)
+    80206720:	c791                	beqz	a5,8020672c <eput+0x3a>
+    80206722:	1184a703          	lw	a4,280(s1)
+    80206726:	4785                	li	a5,1
+    80206728:	02f70563          	beq	a4,a5,80206752 <eput+0x60>
+    entry->ref--;
+    8020672c:	1184a783          	lw	a5,280(s1)
+    80206730:	37fd                	addiw	a5,a5,-1
+    80206732:	10f4ac23          	sw	a5,280(s1)
+    release(&ecache.lock);
+    80206736:	00018517          	auipc	a0,0x18
+    8020673a:	e8250513          	addi	a0,a0,-382 # 8021e5b8 <ecache>
+    8020673e:	ffffa097          	auipc	ra,0xffffa
+    80206742:	fdc080e7          	jalr	-36(ra) # 8020071a <release>
+}
+    80206746:	60e2                	ld	ra,24(sp)
+    80206748:	6442                	ld	s0,16(sp)
+    8020674a:	64a2                	ld	s1,8(sp)
+    8020674c:	6902                	ld	s2,0(sp)
+    8020674e:	6105                	addi	sp,sp,32
+    80206750:	8082                	ret
+        acquiresleep(&entry->lock);
+    80206752:	13848913          	addi	s2,s1,312
+    80206756:	854a                	mv	a0,s2
+    80206758:	ffffd097          	auipc	ra,0xffffd
+    8020675c:	376080e7          	jalr	886(ra) # 80203ace <acquiresleep>
+        entry->next->prev = entry->prev;
+    80206760:	1284b703          	ld	a4,296(s1)
+    80206764:	1304b783          	ld	a5,304(s1)
+    80206768:	12f73823          	sd	a5,304(a4)
+        entry->prev->next = entry->next;
+    8020676c:	1284b703          	ld	a4,296(s1)
+    80206770:	12e7b423          	sd	a4,296(a5)
+        entry->next = root.next;
+    80206774:	00018797          	auipc	a5,0x18
+    80206778:	cb478793          	addi	a5,a5,-844 # 8021e428 <fat>
+    8020677c:	1507b703          	ld	a4,336(a5)
+    80206780:	12e4b423          	sd	a4,296(s1)
+        entry->prev = &root;
+    80206784:	00018697          	auipc	a3,0x18
+    80206788:	ccc68693          	addi	a3,a3,-820 # 8021e450 <root>
+    8020678c:	12d4b823          	sd	a3,304(s1)
+        root.next->prev = entry;
+    80206790:	12973823          	sd	s1,304(a4)
+        root.next = entry;
+    80206794:	1497b823          	sd	s1,336(a5)
+        release(&ecache.lock);
+    80206798:	00018517          	auipc	a0,0x18
+    8020679c:	e2050513          	addi	a0,a0,-480 # 8021e5b8 <ecache>
+    802067a0:	ffffa097          	auipc	ra,0xffffa
+    802067a4:	f7a080e7          	jalr	-134(ra) # 8020071a <release>
+        if (entry->valid == -1) {       // this means some one has called eremove()
+    802067a8:	11649703          	lh	a4,278(s1)
+    802067ac:	57fd                	li	a5,-1
+    802067ae:	06f70863          	beq	a4,a5,8020681e <eput+0x12c>
+            elock(entry->parent);
+    802067b2:	1204b503          	ld	a0,288(s1)
+    802067b6:	00000097          	auipc	ra,0x0
+    802067ba:	eb8080e7          	jalr	-328(ra) # 8020666e <elock>
+            eupdate(entry);
+    802067be:	8526                	mv	a0,s1
+    802067c0:	00000097          	auipc	ra,0x0
+    802067c4:	c94080e7          	jalr	-876(ra) # 80206454 <eupdate>
+            eunlock(entry->parent);
+    802067c8:	1204b503          	ld	a0,288(s1)
+    802067cc:	00000097          	auipc	ra,0x0
+    802067d0:	ed8080e7          	jalr	-296(ra) # 802066a4 <eunlock>
+        releasesleep(&entry->lock);
+    802067d4:	854a                	mv	a0,s2
+    802067d6:	ffffd097          	auipc	ra,0xffffd
+    802067da:	34e080e7          	jalr	846(ra) # 80203b24 <releasesleep>
+        struct dirent *eparent = entry->parent;
+    802067de:	1204b903          	ld	s2,288(s1)
+        acquire(&ecache.lock);
+    802067e2:	00018517          	auipc	a0,0x18
+    802067e6:	dd650513          	addi	a0,a0,-554 # 8021e5b8 <ecache>
+    802067ea:	ffffa097          	auipc	ra,0xffffa
+    802067ee:	edc080e7          	jalr	-292(ra) # 802006c6 <acquire>
+        entry->ref--;
+    802067f2:	1184a783          	lw	a5,280(s1)
+    802067f6:	37fd                	addiw	a5,a5,-1
+    802067f8:	10f4ac23          	sw	a5,280(s1)
+        release(&ecache.lock);
+    802067fc:	00018517          	auipc	a0,0x18
+    80206800:	dbc50513          	addi	a0,a0,-580 # 8021e5b8 <ecache>
+    80206804:	ffffa097          	auipc	ra,0xffffa
+    80206808:	f16080e7          	jalr	-234(ra) # 8020071a <release>
+        if (entry->ref == 0) {
+    8020680c:	1184a783          	lw	a5,280(s1)
+    80206810:	fb9d                	bnez	a5,80206746 <eput+0x54>
+            eput(eparent);
+    80206812:	854a                	mv	a0,s2
+    80206814:	00000097          	auipc	ra,0x0
+    80206818:	ede080e7          	jalr	-290(ra) # 802066f2 <eput>
+    8020681c:	b72d                	j	80206746 <eput+0x54>
+            etrunc(entry);
+    8020681e:	8526                	mv	a0,s1
+    80206820:	00000097          	auipc	ra,0x0
+    80206824:	de4080e7          	jalr	-540(ra) # 80206604 <etrunc>
+    80206828:	b775                	j	802067d4 <eput+0xe2>
+
+000000008020682a <estat>:
+{
+    8020682a:	1101                	addi	sp,sp,-32
+    8020682c:	ec06                	sd	ra,24(sp)
+    8020682e:	e822                	sd	s0,16(sp)
+    80206830:	e426                	sd	s1,8(sp)
+    80206832:	e04a                	sd	s2,0(sp)
+    80206834:	1000                	addi	s0,sp,32
+    80206836:	892a                	mv	s2,a0
+    80206838:	84ae                	mv	s1,a1
+    strncpy(st->name, de->filename, STAT_MAX_NAME);
+    8020683a:	02000613          	li	a2,32
+    8020683e:	85aa                	mv	a1,a0
+    80206840:	8526                	mv	a0,s1
+    80206842:	ffffa097          	auipc	ra,0xffffa
+    80206846:	034080e7          	jalr	52(ra) # 80200876 <strncpy>
+    st->type = (de->attribute & ATTR_DIRECTORY) ? T_DIR : T_FILE;
+    8020684a:	10094783          	lbu	a5,256(s2)
+    8020684e:	8bc1                	andi	a5,a5,16
+    80206850:	0017b793          	seqz	a5,a5
+    80206854:	0785                	addi	a5,a5,1
+    80206856:	02f49423          	sh	a5,40(s1)
+    st->dev = de->dev;
+    8020685a:	11494783          	lbu	a5,276(s2)
+    8020685e:	d0dc                	sw	a5,36(s1)
+    st->size = de->file_size;
+    80206860:	10896783          	lwu	a5,264(s2)
+    80206864:	f89c                	sd	a5,48(s1)
+}
+    80206866:	60e2                	ld	ra,24(sp)
+    80206868:	6442                	ld	s0,16(sp)
+    8020686a:	64a2                	ld	s1,8(sp)
+    8020686c:	6902                	ld	s2,0(sp)
+    8020686e:	6105                	addi	sp,sp,32
+    80206870:	8082                	ret
+
+0000000080206872 <enext>:
+ * @return  -1      meet the end of dir
+ *          0       find empty slots
+ *          1       find a file with all its entries
+ */
+int enext(struct dirent *dp, struct dirent *ep, uint off, int *count)
+{
+    80206872:	7119                	addi	sp,sp,-128
+    80206874:	fc86                	sd	ra,120(sp)
+    80206876:	f8a2                	sd	s0,112(sp)
+    80206878:	f4a6                	sd	s1,104(sp)
+    8020687a:	f0ca                	sd	s2,96(sp)
+    8020687c:	ecce                	sd	s3,88(sp)
+    8020687e:	e8d2                	sd	s4,80(sp)
+    80206880:	e4d6                	sd	s5,72(sp)
+    80206882:	e0da                	sd	s6,64(sp)
+    80206884:	fc5e                	sd	s7,56(sp)
+    80206886:	f862                	sd	s8,48(sp)
+    80206888:	f466                	sd	s9,40(sp)
+    8020688a:	0100                	addi	s0,sp,128
+    if (!(dp->attribute & ATTR_DIRECTORY))
+    8020688c:	10054783          	lbu	a5,256(a0)
+    80206890:	8bc1                	andi	a5,a5,16
+    80206892:	cf95                	beqz	a5,802068ce <enext+0x5c>
+    80206894:	892a                	mv	s2,a0
+    80206896:	89ae                	mv	s3,a1
+    80206898:	84b2                	mv	s1,a2
+    8020689a:	8ab6                	mv	s5,a3
+        panic("enext not dir");
+    if (ep->valid)
+    8020689c:	11659783          	lh	a5,278(a1)
+    802068a0:	ef9d                	bnez	a5,802068de <enext+0x6c>
+        panic("enext ep valid");
+    if (off % 32)
+    802068a2:	01f67793          	andi	a5,a2,31
+    802068a6:	e7a1                	bnez	a5,802068ee <enext+0x7c>
+        panic("enext not align");
+    if (dp->valid != 1) { return -1; }
+    802068a8:	11651703          	lh	a4,278(a0)
+    802068ac:	4785                	li	a5,1
+    802068ae:	557d                	li	a0,-1
+    802068b0:	04f70763          	beq	a4,a5,802068fe <enext+0x8c>
+            read_entry_info(ep, &de);
+            return 1;
+        }
+    }
+    return -1;
+}
+    802068b4:	70e6                	ld	ra,120(sp)
+    802068b6:	7446                	ld	s0,112(sp)
+    802068b8:	74a6                	ld	s1,104(sp)
+    802068ba:	7906                	ld	s2,96(sp)
+    802068bc:	69e6                	ld	s3,88(sp)
+    802068be:	6a46                	ld	s4,80(sp)
+    802068c0:	6aa6                	ld	s5,72(sp)
+    802068c2:	6b06                	ld	s6,64(sp)
+    802068c4:	7be2                	ld	s7,56(sp)
+    802068c6:	7c42                	ld	s8,48(sp)
+    802068c8:	7ca2                	ld	s9,40(sp)
+    802068ca:	6109                	addi	sp,sp,128
+    802068cc:	8082                	ret
+        panic("enext not dir");
+    802068ce:	00003517          	auipc	a0,0x3
+    802068d2:	57a50513          	addi	a0,a0,1402 # 80209e48 <digits+0xac8>
+    802068d6:	ffffa097          	auipc	ra,0xffffa
+    802068da:	86e080e7          	jalr	-1938(ra) # 80200144 <panic>
+        panic("enext ep valid");
+    802068de:	00003517          	auipc	a0,0x3
+    802068e2:	57a50513          	addi	a0,a0,1402 # 80209e58 <digits+0xad8>
+    802068e6:	ffffa097          	auipc	ra,0xffffa
+    802068ea:	85e080e7          	jalr	-1954(ra) # 80200144 <panic>
+        panic("enext not align");
+    802068ee:	00003517          	auipc	a0,0x3
+    802068f2:	57a50513          	addi	a0,a0,1402 # 80209e68 <digits+0xae8>
+    802068f6:	ffffa097          	auipc	ra,0xffffa
+    802068fa:	84e080e7          	jalr	-1970(ra) # 80200144 <panic>
+    memset(ep->filename, 0, FAT32_MAX_FILENAME + 1);
+    802068fe:	10000613          	li	a2,256
+    80206902:	4581                	li	a1,0
+    80206904:	854e                	mv	a0,s3
+    80206906:	ffffa097          	auipc	ra,0xffffa
+    8020690a:	e5c080e7          	jalr	-420(ra) # 80200762 <memset>
+    int cnt = 0;
+    8020690e:	4b01                	li	s6,0
+    for (int off2; (off2 = reloc_clus(dp, off, 0)) != -1; off += 32) {
+    80206910:	5bfd                	li	s7,-1
+        if (rw_clus(dp->cur_clus, 0, 0, (uint64)&de, off2, 32) != 32 || de.lne.order == END_OF_ENTRY) {
+    80206912:	f8040a13          	addi	s4,s0,-128
+        if (de.lne.order == EMPTY_ENTRY) {
+    80206916:	0e500c13          	li	s8,229
+        if (de.lne.attr == ATTR_LONG_NAME) {
+    8020691a:	4cbd                	li	s9,15
+    for (int off2; (off2 = reloc_clus(dp, off, 0)) != -1; off += 32) {
+    8020691c:	a03d                	j	8020694a <enext+0xd8>
+            cnt++;
+    8020691e:	2b05                	addiw	s6,s6,1
+            continue;
+    80206920:	a01d                	j	80206946 <enext+0xd4>
+            *count = cnt;
+    80206922:	016aa023          	sw	s6,0(s5)
+            return 0;
+    80206926:	4501                	li	a0,0
+    80206928:	b771                	j	802068b4 <enext+0x42>
+            read_entry_name(ep->filename + (lcnt - 1) * CHAR_LONG_NAME, &de);
+    8020692a:	fff7079b          	addiw	a5,a4,-1
+    8020692e:	0017951b          	slliw	a0,a5,0x1
+    80206932:	9d3d                	addw	a0,a0,a5
+    80206934:	0025151b          	slliw	a0,a0,0x2
+    80206938:	9d3d                	addw	a0,a0,a5
+    8020693a:	85d2                	mv	a1,s4
+    8020693c:	954e                	add	a0,a0,s3
+    8020693e:	fffff097          	auipc	ra,0xfffff
+    80206942:	17a080e7          	jalr	378(ra) # 80205ab8 <read_entry_name>
+    for (int off2; (off2 = reloc_clus(dp, off, 0)) != -1; off += 32) {
+    80206946:	0204849b          	addiw	s1,s1,32
+    8020694a:	4601                	li	a2,0
+    8020694c:	85a6                	mv	a1,s1
+    8020694e:	854a                	mv	a0,s2
+    80206950:	fffff097          	auipc	ra,0xfffff
+    80206954:	e06080e7          	jalr	-506(ra) # 80205756 <reloc_clus>
+    80206958:	f5750ee3          	beq	a0,s7,802068b4 <enext+0x42>
+        if (rw_clus(dp->cur_clus, 0, 0, (uint64)&de, off2, 32) != 32 || de.lne.order == END_OF_ENTRY) {
+    8020695c:	02000793          	li	a5,32
+    80206960:	0005071b          	sext.w	a4,a0
+    80206964:	86d2                	mv	a3,s4
+    80206966:	4601                	li	a2,0
+    80206968:	4581                	li	a1,0
+    8020696a:	10c92503          	lw	a0,268(s2)
+    8020696e:	fffff097          	auipc	ra,0xfffff
+    80206972:	ef0080e7          	jalr	-272(ra) # 8020585e <rw_clus>
+    80206976:	2501                	sext.w	a0,a0
+    80206978:	02000793          	li	a5,32
+    8020697c:	06f51c63          	bne	a0,a5,802069f4 <enext+0x182>
+    80206980:	f8044783          	lbu	a5,-128(s0)
+    80206984:	cbb5                	beqz	a5,802069f8 <enext+0x186>
+        if (de.lne.order == EMPTY_ENTRY) {
+    80206986:	f9878ce3          	beq	a5,s8,8020691e <enext+0xac>
+        } else if (cnt) {
+    8020698a:	f80b1ce3          	bnez	s6,80206922 <enext+0xb0>
+        if (de.lne.attr == ATTR_LONG_NAME) {
+    8020698e:	f8b44703          	lbu	a4,-117(s0)
+    80206992:	01971d63          	bne	a4,s9,802069ac <enext+0x13a>
+            int lcnt = de.lne.order & ~LAST_LONG_ENTRY;
+    80206996:	0bf7f713          	andi	a4,a5,191
+            if (de.lne.order & LAST_LONG_ENTRY) {
+    8020699a:	0407f793          	andi	a5,a5,64
+    8020699e:	d7d1                	beqz	a5,8020692a <enext+0xb8>
+                *count = lcnt + 1;                              // plus the s-n-e;
+    802069a0:	0017079b          	addiw	a5,a4,1
+    802069a4:	00faa023          	sw	a5,0(s5)
+                count = 0;
+    802069a8:	4a81                	li	s5,0
+    802069aa:	b741                	j	8020692a <enext+0xb8>
+            if (count) {
+    802069ac:	000a8c63          	beqz	s5,802069c4 <enext+0x152>
+                *count = 1;
+    802069b0:	4785                	li	a5,1
+    802069b2:	00faa023          	sw	a5,0(s5)
+                read_entry_name(ep->filename, &de);
+    802069b6:	f8040593          	addi	a1,s0,-128
+    802069ba:	854e                	mv	a0,s3
+    802069bc:	fffff097          	auipc	ra,0xfffff
+    802069c0:	0fc080e7          	jalr	252(ra) # 80205ab8 <read_entry_name>
+    entry->attribute = d->sne.attr;
+    802069c4:	f8b44783          	lbu	a5,-117(s0)
+    802069c8:	10f98023          	sb	a5,256(s3)
+    entry->first_clus = ((uint32)d->sne.fst_clus_hi << 16) | d->sne.fst_clus_lo;
+    802069cc:	f9445783          	lhu	a5,-108(s0)
+    802069d0:	0107979b          	slliw	a5,a5,0x10
+    802069d4:	f9a45703          	lhu	a4,-102(s0)
+    802069d8:	8fd9                	or	a5,a5,a4
+    802069da:	2781                	sext.w	a5,a5
+    802069dc:	10f9a223          	sw	a5,260(s3)
+    entry->file_size = d->sne.file_size;
+    802069e0:	f9c42703          	lw	a4,-100(s0)
+    802069e4:	10e9a423          	sw	a4,264(s3)
+    entry->cur_clus = entry->first_clus;
+    802069e8:	10f9a623          	sw	a5,268(s3)
+    entry->clus_cnt = 0;
+    802069ec:	1009a823          	sw	zero,272(s3)
+            return 1;
+    802069f0:	4505                	li	a0,1
+}
+    802069f2:	b5c9                	j	802068b4 <enext+0x42>
+            return -1;
+    802069f4:	557d                	li	a0,-1
+    802069f6:	bd7d                	j	802068b4 <enext+0x42>
+    802069f8:	557d                	li	a0,-1
+    802069fa:	bd6d                	j	802068b4 <enext+0x42>
+
+00000000802069fc <dirlookup>:
+ * @param   dp          entry of a directory file
+ * @param   filename    target filename
+ * @param   poff        offset of proper empty entry slots from the beginning of the dir
+ */
+struct dirent *dirlookup(struct dirent *dp, char *filename, uint *poff)
+{
+    802069fc:	711d                	addi	sp,sp,-96
+    802069fe:	ec86                	sd	ra,88(sp)
+    80206a00:	e8a2                	sd	s0,80(sp)
+    80206a02:	e4a6                	sd	s1,72(sp)
+    80206a04:	e0ca                	sd	s2,64(sp)
+    80206a06:	fc4e                	sd	s3,56(sp)
+    80206a08:	f852                	sd	s4,48(sp)
+    80206a0a:	f456                	sd	s5,40(sp)
+    80206a0c:	f05a                	sd	s6,32(sp)
+    80206a0e:	ec5e                	sd	s7,24(sp)
+    80206a10:	1080                	addi	s0,sp,96
+    if (!(dp->attribute & ATTR_DIRECTORY))
+    80206a12:	10054783          	lbu	a5,256(a0)
+    80206a16:	8bc1                	andi	a5,a5,16
+    80206a18:	cbb1                	beqz	a5,80206a6c <dirlookup+0x70>
+    80206a1a:	84aa                	mv	s1,a0
+    80206a1c:	89ae                	mv	s3,a1
+    80206a1e:	8ab2                	mv	s5,a2
+        panic("dirlookup not DIR");
+    if (strncmp(filename, ".", FAT32_MAX_FILENAME) == 0) {
+    80206a20:	0ff00613          	li	a2,255
+    80206a24:	00003597          	auipc	a1,0x3
+    80206a28:	46c58593          	addi	a1,a1,1132 # 80209e90 <digits+0xb10>
+    80206a2c:	854e                	mv	a0,s3
+    80206a2e:	ffffa097          	auipc	ra,0xffffa
+    80206a32:	e0c080e7          	jalr	-500(ra) # 8020083a <strncmp>
+    80206a36:	c139                	beqz	a0,80206a7c <dirlookup+0x80>
+        return edup(dp);
+    } else if (strncmp(filename, "..", FAT32_MAX_FILENAME) == 0) {
+    80206a38:	0ff00613          	li	a2,255
+    80206a3c:	00003597          	auipc	a1,0x3
+    80206a40:	45c58593          	addi	a1,a1,1116 # 80209e98 <digits+0xb18>
+    80206a44:	854e                	mv	a0,s3
+    80206a46:	ffffa097          	auipc	ra,0xffffa
+    80206a4a:	df4080e7          	jalr	-524(ra) # 8020083a <strncmp>
+    80206a4e:	e125                	bnez	a0,80206aae <dirlookup+0xb2>
+        if (dp == &root) {
+    80206a50:	00018797          	auipc	a5,0x18
+    80206a54:	a0078793          	addi	a5,a5,-1536 # 8021e450 <root>
+    80206a58:	04f48463          	beq	s1,a5,80206aa0 <dirlookup+0xa4>
+            return edup(&root);
+        }
+        return edup(dp->parent);
+    80206a5c:	1204b503          	ld	a0,288(s1)
+    80206a60:	00000097          	auipc	ra,0x0
+    80206a64:	9b0080e7          	jalr	-1616(ra) # 80206410 <edup>
+    80206a68:	892a                	mv	s2,a0
+    80206a6a:	a839                	j	80206a88 <dirlookup+0x8c>
+        panic("dirlookup not DIR");
+    80206a6c:	00003517          	auipc	a0,0x3
+    80206a70:	40c50513          	addi	a0,a0,1036 # 80209e78 <digits+0xaf8>
+    80206a74:	ffff9097          	auipc	ra,0xffff9
+    80206a78:	6d0080e7          	jalr	1744(ra) # 80200144 <panic>
+        return edup(dp);
+    80206a7c:	8526                	mv	a0,s1
+    80206a7e:	00000097          	auipc	ra,0x0
+    80206a82:	992080e7          	jalr	-1646(ra) # 80206410 <edup>
+    80206a86:	892a                	mv	s2,a0
+    if (poff) {
+        *poff = off;
+    }
+    eput(ep);
+    return NULL;
+}
+    80206a88:	854a                	mv	a0,s2
+    80206a8a:	60e6                	ld	ra,88(sp)
+    80206a8c:	6446                	ld	s0,80(sp)
+    80206a8e:	64a6                	ld	s1,72(sp)
+    80206a90:	6906                	ld	s2,64(sp)
+    80206a92:	79e2                	ld	s3,56(sp)
+    80206a94:	7a42                	ld	s4,48(sp)
+    80206a96:	7aa2                	ld	s5,40(sp)
+    80206a98:	7b02                	ld	s6,32(sp)
+    80206a9a:	6be2                	ld	s7,24(sp)
+    80206a9c:	6125                	addi	sp,sp,96
+    80206a9e:	8082                	ret
+            return edup(&root);
+    80206aa0:	853e                	mv	a0,a5
+    80206aa2:	00000097          	auipc	ra,0x0
+    80206aa6:	96e080e7          	jalr	-1682(ra) # 80206410 <edup>
+    80206aaa:	892a                	mv	s2,a0
+    80206aac:	bff1                	j	80206a88 <dirlookup+0x8c>
+    if (dp->valid != 1) {
+    80206aae:	11649703          	lh	a4,278(s1)
+    80206ab2:	4785                	li	a5,1
+        return NULL;
+    80206ab4:	4901                	li	s2,0
+    if (dp->valid != 1) {
+    80206ab6:	fcf719e3          	bne	a4,a5,80206a88 <dirlookup+0x8c>
+    struct dirent *ep = eget(dp, filename);
+    80206aba:	85ce                	mv	a1,s3
+    80206abc:	8526                	mv	a0,s1
+    80206abe:	fffff097          	auipc	ra,0xfffff
+    80206ac2:	eec080e7          	jalr	-276(ra) # 802059aa <eget>
+    80206ac6:	892a                	mv	s2,a0
+    if (ep->valid == 1) { return ep; }                               // ecache hits
+    80206ac8:	11651703          	lh	a4,278(a0)
+    80206acc:	4785                	li	a5,1
+    80206ace:	faf70de3          	beq	a4,a5,80206a88 <dirlookup+0x8c>
+    int len = strlen(filename);
+    80206ad2:	854e                	mv	a0,s3
+    80206ad4:	ffffa097          	auipc	ra,0xffffa
+    80206ad8:	e12080e7          	jalr	-494(ra) # 802008e6 <strlen>
+    int count = 0;
+    80206adc:	fa042623          	sw	zero,-84(s0)
+    reloc_clus(dp, 0, 0);
+    80206ae0:	4601                	li	a2,0
+    80206ae2:	4581                	li	a1,0
+    80206ae4:	8526                	mv	a0,s1
+    80206ae6:	fffff097          	auipc	ra,0xfffff
+    80206aea:	c70080e7          	jalr	-912(ra) # 80205756 <reloc_clus>
+    uint off = 0;
+    80206aee:	4a01                	li	s4,0
+    while ((type = enext(dp, ep, off, &count) != -1)) {
+    80206af0:	fac40b93          	addi	s7,s0,-84
+    80206af4:	5b7d                	li	s6,-1
+    80206af6:	86de                	mv	a3,s7
+    80206af8:	8652                	mv	a2,s4
+    80206afa:	85ca                	mv	a1,s2
+    80206afc:	8526                	mv	a0,s1
+    80206afe:	00000097          	auipc	ra,0x0
+    80206b02:	d74080e7          	jalr	-652(ra) # 80206872 <enext>
+    80206b06:	03650f63          	beq	a0,s6,80206b44 <dirlookup+0x148>
+        } else if (strncmp(filename, ep->filename, FAT32_MAX_FILENAME) == 0) {
+    80206b0a:	0ff00613          	li	a2,255
+    80206b0e:	85ca                	mv	a1,s2
+    80206b10:	854e                	mv	a0,s3
+    80206b12:	ffffa097          	auipc	ra,0xffffa
+    80206b16:	d28080e7          	jalr	-728(ra) # 8020083a <strncmp>
+    80206b1a:	c901                	beqz	a0,80206b2a <dirlookup+0x12e>
+        off += count << 5;
+    80206b1c:	fac42783          	lw	a5,-84(s0)
+    80206b20:	0057979b          	slliw	a5,a5,0x5
+    80206b24:	01478a3b          	addw	s4,a5,s4
+    80206b28:	b7f9                	j	80206af6 <dirlookup+0xfa>
+            ep->parent = edup(dp);
+    80206b2a:	8526                	mv	a0,s1
+    80206b2c:	00000097          	auipc	ra,0x0
+    80206b30:	8e4080e7          	jalr	-1820(ra) # 80206410 <edup>
+    80206b34:	12a93023          	sd	a0,288(s2)
+            ep->off = off;
+    80206b38:	11492e23          	sw	s4,284(s2)
+            ep->valid = 1;
+    80206b3c:	4785                	li	a5,1
+    80206b3e:	10f91b23          	sh	a5,278(s2)
+            return ep;
+    80206b42:	b799                	j	80206a88 <dirlookup+0x8c>
+    if (poff) {
+    80206b44:	000a8463          	beqz	s5,80206b4c <dirlookup+0x150>
+        *poff = off;
+    80206b48:	014aa023          	sw	s4,0(s5)
+    eput(ep);
+    80206b4c:	854a                	mv	a0,s2
+    80206b4e:	00000097          	auipc	ra,0x0
+    80206b52:	ba4080e7          	jalr	-1116(ra) # 802066f2 <eput>
+    return NULL;
+    80206b56:	4901                	li	s2,0
+    80206b58:	bf05                	j	80206a88 <dirlookup+0x8c>
+
+0000000080206b5a <ealloc>:
+{
+    80206b5a:	715d                	addi	sp,sp,-80
+    80206b5c:	e486                	sd	ra,72(sp)
+    80206b5e:	e0a2                	sd	s0,64(sp)
+    80206b60:	fc26                	sd	s1,56(sp)
+    80206b62:	f84a                	sd	s2,48(sp)
+    80206b64:	f44e                	sd	s3,40(sp)
+    80206b66:	f052                	sd	s4,32(sp)
+    80206b68:	ec56                	sd	s5,24(sp)
+    80206b6a:	0880                	addi	s0,sp,80
+    80206b6c:	892a                	mv	s2,a0
+    if (!(dp->attribute & ATTR_DIRECTORY)) {
+    80206b6e:	10054783          	lbu	a5,256(a0)
+    80206b72:	8bc1                	andi	a5,a5,16
+    80206b74:	c7b1                	beqz	a5,80206bc0 <ealloc+0x66>
+    80206b76:	852e                	mv	a0,a1
+    80206b78:	8a32                	mv	s4,a2
+    if (dp->valid != 1 || !(name = formatname(name))) {        // detect illegal character
+    80206b7a:	11691703          	lh	a4,278(s2)
+    80206b7e:	4785                	li	a5,1
+        return NULL;
+    80206b80:	4481                	li	s1,0
+    if (dp->valid != 1 || !(name = formatname(name))) {        // detect illegal character
+    80206b82:	02f71563          	bne	a4,a5,80206bac <ealloc+0x52>
+    80206b86:	fffff097          	auipc	ra,0xfffff
+    80206b8a:	408080e7          	jalr	1032(ra) # 80205f8e <formatname>
+    80206b8e:	89aa                	mv	s3,a0
+    80206b90:	10050663          	beqz	a0,80206c9c <ealloc+0x142>
+    uint off = 0;
+    80206b94:	fa042e23          	sw	zero,-68(s0)
+    if ((ep = dirlookup(dp, name, &off)) != 0) {      // entry exists
+    80206b98:	fbc40613          	addi	a2,s0,-68
+    80206b9c:	85aa                	mv	a1,a0
+    80206b9e:	854a                	mv	a0,s2
+    80206ba0:	00000097          	auipc	ra,0x0
+    80206ba4:	e5c080e7          	jalr	-420(ra) # 802069fc <dirlookup>
+    80206ba8:	84aa                	mv	s1,a0
+    80206baa:	c11d                	beqz	a0,80206bd0 <ealloc+0x76>
+}
+    80206bac:	8526                	mv	a0,s1
+    80206bae:	60a6                	ld	ra,72(sp)
+    80206bb0:	6406                	ld	s0,64(sp)
+    80206bb2:	74e2                	ld	s1,56(sp)
+    80206bb4:	7942                	ld	s2,48(sp)
+    80206bb6:	79a2                	ld	s3,40(sp)
+    80206bb8:	7a02                	ld	s4,32(sp)
+    80206bba:	6ae2                	ld	s5,24(sp)
+    80206bbc:	6161                	addi	sp,sp,80
+    80206bbe:	8082                	ret
+        panic("ealloc not dir");
+    80206bc0:	00003517          	auipc	a0,0x3
+    80206bc4:	2e050513          	addi	a0,a0,736 # 80209ea0 <digits+0xb20>
+    80206bc8:	ffff9097          	auipc	ra,0xffff9
+    80206bcc:	57c080e7          	jalr	1404(ra) # 80200144 <panic>
+    ep = eget(dp, name);
+    80206bd0:	85ce                	mv	a1,s3
+    80206bd2:	854a                	mv	a0,s2
+    80206bd4:	fffff097          	auipc	ra,0xfffff
+    80206bd8:	dd6080e7          	jalr	-554(ra) # 802059aa <eget>
+    80206bdc:	84aa                	mv	s1,a0
+    elock(ep);
+    80206bde:	00000097          	auipc	ra,0x0
+    80206be2:	a90080e7          	jalr	-1392(ra) # 8020666e <elock>
+    ep->attribute = attr;
+    80206be6:	11448023          	sb	s4,256(s1)
+    ep->file_size = 0;
+    80206bea:	1004a423          	sw	zero,264(s1)
+    ep->first_clus = 0;
+    80206bee:	1004a223          	sw	zero,260(s1)
+    ep->parent = edup(dp);
+    80206bf2:	854a                	mv	a0,s2
+    80206bf4:	00000097          	auipc	ra,0x0
+    80206bf8:	81c080e7          	jalr	-2020(ra) # 80206410 <edup>
+    80206bfc:	12a4b023          	sd	a0,288(s1)
+    ep->off = off;
+    80206c00:	fbc42a83          	lw	s5,-68(s0)
+    80206c04:	1154ae23          	sw	s5,284(s1)
+    ep->clus_cnt = 0;
+    80206c08:	1004a823          	sw	zero,272(s1)
+    ep->cur_clus = 0;
+    80206c0c:	1004a623          	sw	zero,268(s1)
+    ep->dirty = 0;
+    80206c10:	10048aa3          	sb	zero,277(s1)
+    strncpy(ep->filename, name, FAT32_MAX_FILENAME);
+    80206c14:	0ff00613          	li	a2,255
+    80206c18:	85ce                	mv	a1,s3
+    80206c1a:	8526                	mv	a0,s1
+    80206c1c:	ffffa097          	auipc	ra,0xffffa
+    80206c20:	c5a080e7          	jalr	-934(ra) # 80200876 <strncpy>
+    ep->filename[FAT32_MAX_FILENAME] = '\0';
+    80206c24:	0e048fa3          	sb	zero,255(s1)
+    if (attr == ATTR_DIRECTORY) {    // generate "." and ".." for ep
+    80206c28:	47c1                	li	a5,16
+    80206c2a:	02fa0863          	beq	s4,a5,80206c5a <ealloc+0x100>
+        ep->attribute |= ATTR_ARCHIVE;
+    80206c2e:	1004c783          	lbu	a5,256(s1)
+    80206c32:	0207e793          	ori	a5,a5,32
+    80206c36:	10f48023          	sb	a5,256(s1)
+    emake(dp, ep, off);
+    80206c3a:	8656                	mv	a2,s5
+    80206c3c:	85a6                	mv	a1,s1
+    80206c3e:	854a                	mv	a0,s2
+    80206c40:	fffff097          	auipc	ra,0xfffff
+    80206c44:	406080e7          	jalr	1030(ra) # 80206046 <emake>
+    ep->valid = 1;
+    80206c48:	4785                	li	a5,1
+    80206c4a:	10f49b23          	sh	a5,278(s1)
+    eunlock(ep);
+    80206c4e:	8526                	mv	a0,s1
+    80206c50:	00000097          	auipc	ra,0x0
+    80206c54:	a54080e7          	jalr	-1452(ra) # 802066a4 <eunlock>
+    return ep;
+    80206c58:	bf91                	j	80206bac <ealloc+0x52>
+        ep->attribute |= ATTR_DIRECTORY;
+    80206c5a:	1004c783          	lbu	a5,256(s1)
+    80206c5e:	0107e793          	ori	a5,a5,16
+    80206c62:	10f48023          	sb	a5,256(s1)
+        ep->cur_clus = ep->first_clus = alloc_clus(dp->dev);
+    80206c66:	11494503          	lbu	a0,276(s2)
+    80206c6a:	fffff097          	auipc	ra,0xfffff
+    80206c6e:	92a080e7          	jalr	-1750(ra) # 80205594 <alloc_clus>
+    80206c72:	2501                	sext.w	a0,a0
+    80206c74:	10a4a223          	sw	a0,260(s1)
+    80206c78:	10a4a623          	sw	a0,268(s1)
+        emake(ep, ep, 0);
+    80206c7c:	4601                	li	a2,0
+    80206c7e:	85a6                	mv	a1,s1
+    80206c80:	8526                	mv	a0,s1
+    80206c82:	fffff097          	auipc	ra,0xfffff
+    80206c86:	3c4080e7          	jalr	964(ra) # 80206046 <emake>
+        emake(ep, dp, 32);
+    80206c8a:	02000613          	li	a2,32
+    80206c8e:	85ca                	mv	a1,s2
+    80206c90:	8526                	mv	a0,s1
+    80206c92:	fffff097          	auipc	ra,0xfffff
+    80206c96:	3b4080e7          	jalr	948(ra) # 80206046 <emake>
+    80206c9a:	b745                	j	80206c3a <ealloc+0xe0>
+        return NULL;
+    80206c9c:	84aa                	mv	s1,a0
+    80206c9e:	b739                	j	80206bac <ealloc+0x52>
+
+0000000080206ca0 <lookup_path>:
+    return path;
+}
+
+// FAT32 version of namex in xv6's original file system.
+static struct dirent *lookup_path(char *path, int parent, char *name)
+{
+    80206ca0:	715d                	addi	sp,sp,-80
+    80206ca2:	e486                	sd	ra,72(sp)
+    80206ca4:	e0a2                	sd	s0,64(sp)
+    80206ca6:	fc26                	sd	s1,56(sp)
+    80206ca8:	f84a                	sd	s2,48(sp)
+    80206caa:	f44e                	sd	s3,40(sp)
+    80206cac:	f052                	sd	s4,32(sp)
+    80206cae:	ec56                	sd	s5,24(sp)
+    80206cb0:	e85a                	sd	s6,16(sp)
+    80206cb2:	e45e                	sd	s7,8(sp)
+    80206cb4:	e062                	sd	s8,0(sp)
+    80206cb6:	0880                	addi	s0,sp,80
+    80206cb8:	892a                	mv	s2,a0
+    80206cba:	8b2e                	mv	s6,a1
+    80206cbc:	8ab2                	mv	s5,a2
+    struct dirent *entry, *next;
+    if (*path == '/') {
+    80206cbe:	00054783          	lbu	a5,0(a0)
+    80206cc2:	02f00713          	li	a4,47
+    80206cc6:	02e78663          	beq	a5,a4,80206cf2 <lookup_path+0x52>
+        entry = edup(&root);
+    } else if (*path != '\0') {
+        entry = edup(myproc()->cwd);
+    } else {
+        return NULL;
+    80206cca:	4a01                	li	s4,0
+    } else if (*path != '\0') {
+    80206ccc:	cba1                	beqz	a5,80206d1c <lookup_path+0x7c>
+        entry = edup(myproc()->cwd);
+    80206cce:	ffffb097          	auipc	ra,0xffffb
+    80206cd2:	d6e080e7          	jalr	-658(ra) # 80201a3c <myproc>
+    80206cd6:	15853503          	ld	a0,344(a0)
+    80206cda:	fffff097          	auipc	ra,0xfffff
+    80206cde:	736080e7          	jalr	1846(ra) # 80206410 <edup>
+    80206ce2:	8a2a                	mv	s4,a0
+    while (*path == '/') {
+    80206ce4:	02f00993          	li	s3,47
+    80206ce8:	0ff00b93          	li	s7,255
+    80206cec:	0ff00c13          	li	s8,255
+    80206cf0:	a0e5                	j	80206dd8 <lookup_path+0x138>
+        entry = edup(&root);
+    80206cf2:	00017517          	auipc	a0,0x17
+    80206cf6:	75e50513          	addi	a0,a0,1886 # 8021e450 <root>
+    80206cfa:	fffff097          	auipc	ra,0xfffff
+    80206cfe:	716080e7          	jalr	1814(ra) # 80206410 <edup>
+    80206d02:	8a2a                	mv	s4,a0
+    80206d04:	b7c5                	j	80206ce4 <lookup_path+0x44>
+    }
+    while ((path = skipelem(path, name)) != 0) {
+        elock(entry);
+        if (!(entry->attribute & ATTR_DIRECTORY)) {
+            eunlock(entry);
+    80206d06:	8552                	mv	a0,s4
+    80206d08:	00000097          	auipc	ra,0x0
+    80206d0c:	99c080e7          	jalr	-1636(ra) # 802066a4 <eunlock>
+            eput(entry);
+    80206d10:	8552                	mv	a0,s4
+    80206d12:	00000097          	auipc	ra,0x0
+    80206d16:	9e0080e7          	jalr	-1568(ra) # 802066f2 <eput>
+            return NULL;
+    80206d1a:	4a01                	li	s4,0
+    if (parent) {
+        eput(entry);
+        return NULL;
+    }
+    return entry;
+}
+    80206d1c:	8552                	mv	a0,s4
+    80206d1e:	60a6                	ld	ra,72(sp)
+    80206d20:	6406                	ld	s0,64(sp)
+    80206d22:	74e2                	ld	s1,56(sp)
+    80206d24:	7942                	ld	s2,48(sp)
+    80206d26:	79a2                	ld	s3,40(sp)
+    80206d28:	7a02                	ld	s4,32(sp)
+    80206d2a:	6ae2                	ld	s5,24(sp)
+    80206d2c:	6b42                	ld	s6,16(sp)
+    80206d2e:	6ba2                	ld	s7,8(sp)
+    80206d30:	6c02                	ld	s8,0(sp)
+    80206d32:	6161                	addi	sp,sp,80
+    80206d34:	8082                	ret
+            eunlock(entry);
+    80206d36:	8552                	mv	a0,s4
+    80206d38:	00000097          	auipc	ra,0x0
+    80206d3c:	96c080e7          	jalr	-1684(ra) # 802066a4 <eunlock>
+            return entry;
+    80206d40:	bff1                	j	80206d1c <lookup_path+0x7c>
+            eunlock(entry);
+    80206d42:	8552                	mv	a0,s4
+    80206d44:	00000097          	auipc	ra,0x0
+    80206d48:	960080e7          	jalr	-1696(ra) # 802066a4 <eunlock>
+            eput(entry);
+    80206d4c:	8552                	mv	a0,s4
+    80206d4e:	00000097          	auipc	ra,0x0
+    80206d52:	9a4080e7          	jalr	-1628(ra) # 802066f2 <eput>
+            return NULL;
+    80206d56:	8a4a                	mv	s4,s2
+    80206d58:	b7d1                	j	80206d1c <lookup_path+0x7c>
+    int len = path - s;
+    80206d5a:	412487b3          	sub	a5,s1,s2
+    80206d5e:	863e                	mv	a2,a5
+    80206d60:	2781                	sext.w	a5,a5
+    80206d62:	00fbd363          	bge	s7,a5,80206d68 <lookup_path+0xc8>
+    80206d66:	8662                	mv	a2,s8
+    80206d68:	0006079b          	sext.w	a5,a2
+    name[len] = 0;
+    80206d6c:	97d6                	add	a5,a5,s5
+    80206d6e:	00078023          	sb	zero,0(a5)
+    memmove(name, s, len);
+    80206d72:	2601                	sext.w	a2,a2
+    80206d74:	85ca                	mv	a1,s2
+    80206d76:	8556                	mv	a0,s5
+    80206d78:	ffffa097          	auipc	ra,0xffffa
+    80206d7c:	a46080e7          	jalr	-1466(ra) # 802007be <memmove>
+    while (*path == '/') {
+    80206d80:	0004c783          	lbu	a5,0(s1)
+    80206d84:	01379763          	bne	a5,s3,80206d92 <lookup_path+0xf2>
+        path++;
+    80206d88:	0485                	addi	s1,s1,1
+    while (*path == '/') {
+    80206d8a:	0004c783          	lbu	a5,0(s1)
+    80206d8e:	ff378de3          	beq	a5,s3,80206d88 <lookup_path+0xe8>
+        elock(entry);
+    80206d92:	8552                	mv	a0,s4
+    80206d94:	00000097          	auipc	ra,0x0
+    80206d98:	8da080e7          	jalr	-1830(ra) # 8020666e <elock>
+        if (!(entry->attribute & ATTR_DIRECTORY)) {
+    80206d9c:	100a4783          	lbu	a5,256(s4)
+    80206da0:	8bc1                	andi	a5,a5,16
+    80206da2:	d3b5                	beqz	a5,80206d06 <lookup_path+0x66>
+        if (parent && *path == '\0') {
+    80206da4:	000b0563          	beqz	s6,80206dae <lookup_path+0x10e>
+    80206da8:	0004c783          	lbu	a5,0(s1)
+    80206dac:	d7c9                	beqz	a5,80206d36 <lookup_path+0x96>
+        if ((next = dirlookup(entry, name, 0)) == 0) {
+    80206dae:	4601                	li	a2,0
+    80206db0:	85d6                	mv	a1,s5
+    80206db2:	8552                	mv	a0,s4
+    80206db4:	00000097          	auipc	ra,0x0
+    80206db8:	c48080e7          	jalr	-952(ra) # 802069fc <dirlookup>
+    80206dbc:	892a                	mv	s2,a0
+    80206dbe:	d151                	beqz	a0,80206d42 <lookup_path+0xa2>
+        eunlock(entry);
+    80206dc0:	8552                	mv	a0,s4
+    80206dc2:	00000097          	auipc	ra,0x0
+    80206dc6:	8e2080e7          	jalr	-1822(ra) # 802066a4 <eunlock>
+        eput(entry);
+    80206dca:	8552                	mv	a0,s4
+    80206dcc:	00000097          	auipc	ra,0x0
+    80206dd0:	926080e7          	jalr	-1754(ra) # 802066f2 <eput>
+        entry = next;
+    80206dd4:	8a4a                	mv	s4,s2
+        eput(entry);
+    80206dd6:	8926                	mv	s2,s1
+    while (*path == '/') {
+    80206dd8:	00094783          	lbu	a5,0(s2)
+    80206ddc:	03379363          	bne	a5,s3,80206e02 <lookup_path+0x162>
+        path++;
+    80206de0:	0905                	addi	s2,s2,1
+    while (*path == '/') {
+    80206de2:	00094783          	lbu	a5,0(s2)
+    80206de6:	ff378de3          	beq	a5,s3,80206de0 <lookup_path+0x140>
+    if (*path == 0) { return NULL; }
+    80206dea:	cf89                	beqz	a5,80206e04 <lookup_path+0x164>
+        path++;
+    80206dec:	84ca                	mv	s1,s2
+    while (*path != '/' && *path != 0) {
+    80206dee:	f73786e3          	beq	a5,s3,80206d5a <lookup_path+0xba>
+        eput(entry);
+    80206df2:	84ca                	mv	s1,s2
+    while (*path != '/' && *path != 0) {
+    80206df4:	d3bd                	beqz	a5,80206d5a <lookup_path+0xba>
+        path++;
+    80206df6:	0485                	addi	s1,s1,1
+    while (*path != '/' && *path != 0) {
+    80206df8:	0004c783          	lbu	a5,0(s1)
+    80206dfc:	ff379ce3          	bne	a5,s3,80206df4 <lookup_path+0x154>
+    80206e00:	bfa9                	j	80206d5a <lookup_path+0xba>
+    if (*path == 0) { return NULL; }
+    80206e02:	fbe5                	bnez	a5,80206df2 <lookup_path+0x152>
+    if (parent) {
+    80206e04:	f00b0ce3          	beqz	s6,80206d1c <lookup_path+0x7c>
+        eput(entry);
+    80206e08:	8552                	mv	a0,s4
+    80206e0a:	00000097          	auipc	ra,0x0
+    80206e0e:	8e8080e7          	jalr	-1816(ra) # 802066f2 <eput>
+        return NULL;
+    80206e12:	4a01                	li	s4,0
+    80206e14:	b721                	j	80206d1c <lookup_path+0x7c>
+
+0000000080206e16 <ename>:
+
+struct dirent *ename(char *path)
+{
+    80206e16:	716d                	addi	sp,sp,-272
+    80206e18:	e606                	sd	ra,264(sp)
+    80206e1a:	e222                	sd	s0,256(sp)
+    80206e1c:	0a00                	addi	s0,sp,272
+    char name[FAT32_MAX_FILENAME + 1];
+    return lookup_path(path, 0, name);
+    80206e1e:	ef040613          	addi	a2,s0,-272
+    80206e22:	4581                	li	a1,0
+    80206e24:	00000097          	auipc	ra,0x0
+    80206e28:	e7c080e7          	jalr	-388(ra) # 80206ca0 <lookup_path>
+}
+    80206e2c:	60b2                	ld	ra,264(sp)
+    80206e2e:	6412                	ld	s0,256(sp)
+    80206e30:	6151                	addi	sp,sp,272
+    80206e32:	8082                	ret
+
+0000000080206e34 <enameparent>:
+
+struct dirent *enameparent(char *path, char *name)
+{
+    80206e34:	1141                	addi	sp,sp,-16
+    80206e36:	e406                	sd	ra,8(sp)
+    80206e38:	e022                	sd	s0,0(sp)
+    80206e3a:	0800                	addi	s0,sp,16
+    80206e3c:	862e                	mv	a2,a1
+    return lookup_path(path, 1, name);
+    80206e3e:	4585                	li	a1,1
+    80206e40:	00000097          	auipc	ra,0x0
+    80206e44:	e60080e7          	jalr	-416(ra) # 80206ca0 <lookup_path>
+}
+    80206e48:	60a2                	ld	ra,8(sp)
+    80206e4a:	6402                	ld	s0,0(sp)
+    80206e4c:	0141                	addi	sp,sp,16
+    80206e4e:	8082                	ret
+
+0000000080206e50 <plicinit>:
+
+//
+// the riscv Platform Level Interrupt Controller (PLIC).
+//
+
+void plicinit(void) {
+    80206e50:	1141                	addi	sp,sp,-16
+    80206e52:	e422                	sd	s0,8(sp)
+    80206e54:	0800                	addi	s0,sp,16
+	writed(1, PLIC_V + DISK_IRQ * sizeof(uint32));
+    80206e56:	00fc37b7          	lui	a5,0xfc3
+    80206e5a:	07ba                	slli	a5,a5,0xe
+    80206e5c:	4705                	li	a4,1
+    80206e5e:	c3d8                	sw	a4,4(a5)
+	writed(1, PLIC_V + UART_IRQ * sizeof(uint32));
+    80206e60:	d798                	sw	a4,40(a5)
+
+	#ifdef DEBUG 
+	printf("plicinit\n");
+	#endif 
+}
+    80206e62:	6422                	ld	s0,8(sp)
+    80206e64:	0141                	addi	sp,sp,16
+    80206e66:	8082                	ret
+
+0000000080206e68 <plicinithart>:
+
+void
+plicinithart(void)
+{
+    80206e68:	1141                	addi	sp,sp,-16
+    80206e6a:	e406                	sd	ra,8(sp)
+    80206e6c:	e022                	sd	s0,0(sp)
+    80206e6e:	0800                	addi	s0,sp,16
+  int hart = cpuid();
+    80206e70:	ffffb097          	auipc	ra,0xffffb
+    80206e74:	ba0080e7          	jalr	-1120(ra) # 80201a10 <cpuid>
+  #ifdef QEMU
+  // set uart's enable bit for this hart's S-mode. 
+  *(uint32*)PLIC_SENABLE(hart)= (1 << UART_IRQ) | (1 << DISK_IRQ);
+    80206e78:	0085171b          	slliw	a4,a0,0x8
+    80206e7c:	01f867b7          	lui	a5,0x1f86
+    80206e80:	0785                	addi	a5,a5,1 # 1f86001 <_entry-0x7e279fff>
+    80206e82:	07b6                	slli	a5,a5,0xd
+    80206e84:	97ba                	add	a5,a5,a4
+    80206e86:	40200713          	li	a4,1026
+    80206e8a:	08e7a023          	sw	a4,128(a5)
+  // set this hart's S-mode priority threshold to 0.
+  *(uint32*)PLIC_SPRIORITY(hart) = 0;
+    80206e8e:	00d5151b          	slliw	a0,a0,0xd
+    80206e92:	03f0c7b7          	lui	a5,0x3f0c
+    80206e96:	20178793          	addi	a5,a5,513 # 3f0c201 <_entry-0x7c2f3dff>
+    80206e9a:	07b2                	slli	a5,a5,0xc
+    80206e9c:	97aa                	add	a5,a5,a0
+    80206e9e:	0007a023          	sw	zero,0(a5)
+  *(hart0_m_int_enable_hi) = readd(hart0_m_int_enable_hi) | (1 << (UART_IRQ % 32));
+  #endif
+  #ifdef DEBUG
+  printf("plicinithart\n");
+  #endif
+}
+    80206ea2:	60a2                	ld	ra,8(sp)
+    80206ea4:	6402                	ld	s0,0(sp)
+    80206ea6:	0141                	addi	sp,sp,16
+    80206ea8:	8082                	ret
+
+0000000080206eaa <plic_claim>:
+
+// ask the PLIC what interrupt we should serve.
+int
+plic_claim(void)
+{
+    80206eaa:	1141                	addi	sp,sp,-16
+    80206eac:	e406                	sd	ra,8(sp)
+    80206eae:	e022                	sd	s0,0(sp)
+    80206eb0:	0800                	addi	s0,sp,16
+  int hart = cpuid();
+    80206eb2:	ffffb097          	auipc	ra,0xffffb
+    80206eb6:	b5e080e7          	jalr	-1186(ra) # 80201a10 <cpuid>
+  int irq;
+  #ifndef QEMU
+  irq = *(uint32*)PLIC_MCLAIM(hart);
+  #else
+  irq = *(uint32*)PLIC_SCLAIM(hart);
+    80206eba:	00d5151b          	slliw	a0,a0,0xd
+    80206ebe:	03f0c7b7          	lui	a5,0x3f0c
+    80206ec2:	20178793          	addi	a5,a5,513 # 3f0c201 <_entry-0x7c2f3dff>
+    80206ec6:	07b2                	slli	a5,a5,0xc
+    80206ec8:	97aa                	add	a5,a5,a0
+  #endif
+  return irq;
+}
+    80206eca:	43c8                	lw	a0,4(a5)
+    80206ecc:	60a2                	ld	ra,8(sp)
+    80206ece:	6402                	ld	s0,0(sp)
+    80206ed0:	0141                	addi	sp,sp,16
+    80206ed2:	8082                	ret
+
+0000000080206ed4 <plic_complete>:
+
+// tell the PLIC we've served this IRQ.
+void
+plic_complete(int irq)
+{
+    80206ed4:	1101                	addi	sp,sp,-32
+    80206ed6:	ec06                	sd	ra,24(sp)
+    80206ed8:	e822                	sd	s0,16(sp)
+    80206eda:	e426                	sd	s1,8(sp)
+    80206edc:	1000                	addi	s0,sp,32
+    80206ede:	84aa                	mv	s1,a0
+  int hart = cpuid();
+    80206ee0:	ffffb097          	auipc	ra,0xffffb
+    80206ee4:	b30080e7          	jalr	-1232(ra) # 80201a10 <cpuid>
+  #ifndef QEMU
+  *(uint32*)PLIC_MCLAIM(hart) = irq;
+  #else
+  *(uint32*)PLIC_SCLAIM(hart) = irq;
+    80206ee8:	00d5151b          	slliw	a0,a0,0xd
+    80206eec:	03f0c7b7          	lui	a5,0x3f0c
+    80206ef0:	20178793          	addi	a5,a5,513 # 3f0c201 <_entry-0x7c2f3dff>
+    80206ef4:	07b2                	slli	a5,a5,0xc
+    80206ef6:	97aa                	add	a5,a5,a0
+    80206ef8:	c3c4                	sw	s1,4(a5)
+  #endif
+}
+    80206efa:	60e2                	ld	ra,24(sp)
+    80206efc:	6442                	ld	s0,16(sp)
+    80206efe:	64a2                	ld	s1,8(sp)
+    80206f00:	6105                	addi	sp,sp,32
+    80206f02:	8082                	ret
+
+0000000080206f04 <consolewrite>:
+//
+// user write()s to the console go here.
+//
+int
+consolewrite(int user_src, uint64 src, int n)
+{
+    80206f04:	715d                	addi	sp,sp,-80
+    80206f06:	e486                	sd	ra,72(sp)
+    80206f08:	e0a2                	sd	s0,64(sp)
+    80206f0a:	fc26                	sd	s1,56(sp)
+    80206f0c:	f84a                	sd	s2,48(sp)
+    80206f0e:	f44e                	sd	s3,40(sp)
+    80206f10:	f052                	sd	s4,32(sp)
+    80206f12:	ec56                	sd	s5,24(sp)
+    80206f14:	e85a                	sd	s6,16(sp)
+    80206f16:	0880                	addi	s0,sp,80
+    80206f18:	8a2a                	mv	s4,a0
+    80206f1a:	84ae                	mv	s1,a1
+    80206f1c:	89b2                	mv	s3,a2
+  int i;
+
+  acquire(&cons.lock);
+    80206f1e:	0001c517          	auipc	a0,0x1c
+    80206f22:	d0250513          	addi	a0,a0,-766 # 80222c20 <cons>
+    80206f26:	ffff9097          	auipc	ra,0xffff9
+    80206f2a:	7a0080e7          	jalr	1952(ra) # 802006c6 <acquire>
+  for(i = 0; i < n; i++){
+    80206f2e:	07305063          	blez	s3,80206f8e <consolewrite+0x8a>
+    80206f32:	4901                	li	s2,0
+    char c;
+    if(either_copyin(&c, user_src, src+i, 1) == -1)
+    80206f34:	fbf40b13          	addi	s6,s0,-65
+    80206f38:	5afd                	li	s5,-1
+    80206f3a:	4685                	li	a3,1
+    80206f3c:	8626                	mv	a2,s1
+    80206f3e:	85d2                	mv	a1,s4
+    80206f40:	855a                	mv	a0,s6
+    80206f42:	ffffc097          	auipc	ra,0xffffc
+    80206f46:	85a080e7          	jalr	-1958(ra) # 8020279c <either_copyin>
+    80206f4a:	01550f63          	beq	a0,s5,80206f68 <consolewrite+0x64>
+	SBI_CALL_1(SBI_CONSOLE_PUTCHAR, ch);
+    80206f4e:	fbf44503          	lbu	a0,-65(s0)
+    80206f52:	4581                	li	a1,0
+    80206f54:	4601                	li	a2,0
+    80206f56:	4681                	li	a3,0
+    80206f58:	4885                	li	a7,1
+    80206f5a:	00000073          	ecall
+  for(i = 0; i < n; i++){
+    80206f5e:	2905                	addiw	s2,s2,1
+    80206f60:	0485                	addi	s1,s1,1
+    80206f62:	fd299ce3          	bne	s3,s2,80206f3a <consolewrite+0x36>
+    80206f66:	894e                	mv	s2,s3
+      break;
+    sbi_console_putchar(c);
+  }
+  release(&cons.lock);
+    80206f68:	0001c517          	auipc	a0,0x1c
+    80206f6c:	cb850513          	addi	a0,a0,-840 # 80222c20 <cons>
+    80206f70:	ffff9097          	auipc	ra,0xffff9
+    80206f74:	7aa080e7          	jalr	1962(ra) # 8020071a <release>
+
+  return i;
+}
+    80206f78:	854a                	mv	a0,s2
+    80206f7a:	60a6                	ld	ra,72(sp)
+    80206f7c:	6406                	ld	s0,64(sp)
+    80206f7e:	74e2                	ld	s1,56(sp)
+    80206f80:	7942                	ld	s2,48(sp)
+    80206f82:	79a2                	ld	s3,40(sp)
+    80206f84:	7a02                	ld	s4,32(sp)
+    80206f86:	6ae2                	ld	s5,24(sp)
+    80206f88:	6b42                	ld	s6,16(sp)
+    80206f8a:	6161                	addi	sp,sp,80
+    80206f8c:	8082                	ret
+  for(i = 0; i < n; i++){
+    80206f8e:	4901                	li	s2,0
+    80206f90:	bfe1                	j	80206f68 <consolewrite+0x64>
+
+0000000080206f92 <consoleread>:
+// user_dist indicates whether dst is a user
+// or kernel address.
+//
+int
+consoleread(int user_dst, uint64 dst, int n)
+{
+    80206f92:	7119                	addi	sp,sp,-128
+    80206f94:	fc86                	sd	ra,120(sp)
+    80206f96:	f8a2                	sd	s0,112(sp)
+    80206f98:	f4a6                	sd	s1,104(sp)
+    80206f9a:	f0ca                	sd	s2,96(sp)
+    80206f9c:	ecce                	sd	s3,88(sp)
+    80206f9e:	e8d2                	sd	s4,80(sp)
+    80206fa0:	e4d6                	sd	s5,72(sp)
+    80206fa2:	e0da                	sd	s6,64(sp)
+    80206fa4:	fc5e                	sd	s7,56(sp)
+    80206fa6:	f862                	sd	s8,48(sp)
+    80206fa8:	f466                	sd	s9,40(sp)
+    80206faa:	f06a                	sd	s10,32(sp)
+    80206fac:	ec6e                	sd	s11,24(sp)
+    80206fae:	0100                	addi	s0,sp,128
+    80206fb0:	8aaa                	mv	s5,a0
+    80206fb2:	8a2e                	mv	s4,a1
+    80206fb4:	89b2                	mv	s3,a2
+  uint target;
+  int c;
+  char cbuf;
+
+  target = n;
+    80206fb6:	00060b1b          	sext.w	s6,a2
+  acquire(&cons.lock);
+    80206fba:	0001c517          	auipc	a0,0x1c
+    80206fbe:	c6650513          	addi	a0,a0,-922 # 80222c20 <cons>
+    80206fc2:	ffff9097          	auipc	ra,0xffff9
+    80206fc6:	704080e7          	jalr	1796(ra) # 802006c6 <acquire>
+  while(n > 0){
+    // wait until interrupt handler has put some
+    // input into cons.buffer.
+    while(cons.r == cons.w){
+    80206fca:	0001c497          	auipc	s1,0x1c
+    80206fce:	c5648493          	addi	s1,s1,-938 # 80222c20 <cons>
+      if(myproc()->killed){
+        release(&cons.lock);
+        return -1;
+      }
+      sleep(&cons.r, &cons.lock);
+    80206fd2:	0001c917          	auipc	s2,0x1c
+    80206fd6:	ce690913          	addi	s2,s2,-794 # 80222cb8 <cons+0x98>
+    }
+
+    c = cons.buf[cons.r++ % INPUT_BUF];
+
+    if(c == C('D')){  // end-of-file
+    80206fda:	4c11                	li	s8,4
+      break;
+    }
+
+    // copy the input byte to the user-space buffer.
+    cbuf = c;
+    if(either_copyout(user_dst, dst, &cbuf, 1) == -1)
+    80206fdc:	f8f40d13          	addi	s10,s0,-113
+    80206fe0:	5cfd                	li	s9,-1
+      break;
+
+    dst++;
+    --n;
+
+    if(c == '\n'){
+    80206fe2:	4da9                	li	s11,10
+  while(n > 0){
+    80206fe4:	07305763          	blez	s3,80207052 <consoleread+0xc0>
+    while(cons.r == cons.w){
+    80206fe8:	0984a783          	lw	a5,152(s1)
+    80206fec:	09c4a703          	lw	a4,156(s1)
+    80206ff0:	02f71463          	bne	a4,a5,80207018 <consoleread+0x86>
+      if(myproc()->killed){
+    80206ff4:	ffffb097          	auipc	ra,0xffffb
+    80206ff8:	a48080e7          	jalr	-1464(ra) # 80201a3c <myproc>
+    80206ffc:	591c                	lw	a5,48(a0)
+    80206ffe:	e7ad                	bnez	a5,80207068 <consoleread+0xd6>
+      sleep(&cons.r, &cons.lock);
+    80207000:	85a6                	mv	a1,s1
+    80207002:	854a                	mv	a0,s2
+    80207004:	ffffb097          	auipc	ra,0xffffb
+    80207008:	3f0080e7          	jalr	1008(ra) # 802023f4 <sleep>
+    while(cons.r == cons.w){
+    8020700c:	0984a783          	lw	a5,152(s1)
+    80207010:	09c4a703          	lw	a4,156(s1)
+    80207014:	fef700e3          	beq	a4,a5,80206ff4 <consoleread+0x62>
+    c = cons.buf[cons.r++ % INPUT_BUF];
+    80207018:	0017871b          	addiw	a4,a5,1
+    8020701c:	08e4ac23          	sw	a4,152(s1)
+    80207020:	07f7f713          	andi	a4,a5,127
+    80207024:	9726                	add	a4,a4,s1
+    80207026:	01874703          	lbu	a4,24(a4)
+    8020702a:	00070b9b          	sext.w	s7,a4
+    if(c == C('D')){  // end-of-file
+    8020702e:	078b8563          	beq	s7,s8,80207098 <consoleread+0x106>
+    cbuf = c;
+    80207032:	f8e407a3          	sb	a4,-113(s0)
+    if(either_copyout(user_dst, dst, &cbuf, 1) == -1)
+    80207036:	4685                	li	a3,1
+    80207038:	866a                	mv	a2,s10
+    8020703a:	85d2                	mv	a1,s4
+    8020703c:	8556                	mv	a0,s5
+    8020703e:	ffffb097          	auipc	ra,0xffffb
+    80207042:	728080e7          	jalr	1832(ra) # 80202766 <either_copyout>
+    80207046:	01950663          	beq	a0,s9,80207052 <consoleread+0xc0>
+    dst++;
+    8020704a:	0a05                	addi	s4,s4,1
+    --n;
+    8020704c:	39fd                	addiw	s3,s3,-1
+    if(c == '\n'){
+    8020704e:	f9bb9be3          	bne	s7,s11,80206fe4 <consoleread+0x52>
+      // a whole line has arrived, return to
+      // the user-level read().
+      break;
+    }
+  }
+  release(&cons.lock);
+    80207052:	0001c517          	auipc	a0,0x1c
+    80207056:	bce50513          	addi	a0,a0,-1074 # 80222c20 <cons>
+    8020705a:	ffff9097          	auipc	ra,0xffff9
+    8020705e:	6c0080e7          	jalr	1728(ra) # 8020071a <release>
+
+  return target - n;
+    80207062:	413b053b          	subw	a0,s6,s3
+    80207066:	a811                	j	8020707a <consoleread+0xe8>
+        release(&cons.lock);
+    80207068:	0001c517          	auipc	a0,0x1c
+    8020706c:	bb850513          	addi	a0,a0,-1096 # 80222c20 <cons>
+    80207070:	ffff9097          	auipc	ra,0xffff9
+    80207074:	6aa080e7          	jalr	1706(ra) # 8020071a <release>
+        return -1;
+    80207078:	557d                	li	a0,-1
+}
+    8020707a:	70e6                	ld	ra,120(sp)
+    8020707c:	7446                	ld	s0,112(sp)
+    8020707e:	74a6                	ld	s1,104(sp)
+    80207080:	7906                	ld	s2,96(sp)
+    80207082:	69e6                	ld	s3,88(sp)
+    80207084:	6a46                	ld	s4,80(sp)
+    80207086:	6aa6                	ld	s5,72(sp)
+    80207088:	6b06                	ld	s6,64(sp)
+    8020708a:	7be2                	ld	s7,56(sp)
+    8020708c:	7c42                	ld	s8,48(sp)
+    8020708e:	7ca2                	ld	s9,40(sp)
+    80207090:	7d02                	ld	s10,32(sp)
+    80207092:	6de2                	ld	s11,24(sp)
+    80207094:	6109                	addi	sp,sp,128
+    80207096:	8082                	ret
+      if(n < target){
+    80207098:	0009871b          	sext.w	a4,s3
+    8020709c:	fb677be3          	bgeu	a4,s6,80207052 <consoleread+0xc0>
+        cons.r--;
+    802070a0:	0001c717          	auipc	a4,0x1c
+    802070a4:	c0f72c23          	sw	a5,-1000(a4) # 80222cb8 <cons+0x98>
+    802070a8:	b76d                	j	80207052 <consoleread+0xc0>
+
+00000000802070aa <consputc>:
+void consputc(int c) {
+    802070aa:	1141                	addi	sp,sp,-16
+    802070ac:	e422                	sd	s0,8(sp)
+    802070ae:	0800                	addi	s0,sp,16
+  if(c == BACKSPACE){
+    802070b0:	10000793          	li	a5,256
+    802070b4:	00f50b63          	beq	a0,a5,802070ca <consputc+0x20>
+    802070b8:	4581                	li	a1,0
+    802070ba:	4601                	li	a2,0
+    802070bc:	4681                	li	a3,0
+    802070be:	4885                	li	a7,1
+    802070c0:	00000073          	ecall
+}
+    802070c4:	6422                	ld	s0,8(sp)
+    802070c6:	0141                	addi	sp,sp,16
+    802070c8:	8082                	ret
+    802070ca:	4521                	li	a0,8
+    802070cc:	4581                	li	a1,0
+    802070ce:	4601                	li	a2,0
+    802070d0:	4681                	li	a3,0
+    802070d2:	4885                	li	a7,1
+    802070d4:	00000073          	ecall
+    802070d8:	02000513          	li	a0,32
+    802070dc:	00000073          	ecall
+    802070e0:	4521                	li	a0,8
+    802070e2:	00000073          	ecall
+}
+    802070e6:	bff9                	j	802070c4 <consputc+0x1a>
+
+00000000802070e8 <consoleintr>:
+// do erase/kill processing, append to cons.buf,
+// wake up consoleread() if a whole line has arrived.
+//
+void
+consoleintr(int c)
+{
+    802070e8:	1101                	addi	sp,sp,-32
+    802070ea:	ec06                	sd	ra,24(sp)
+    802070ec:	e822                	sd	s0,16(sp)
+    802070ee:	e426                	sd	s1,8(sp)
+    802070f0:	e04a                	sd	s2,0(sp)
+    802070f2:	1000                	addi	s0,sp,32
+    802070f4:	84aa                	mv	s1,a0
+  acquire(&cons.lock);
+    802070f6:	0001c517          	auipc	a0,0x1c
+    802070fa:	b2a50513          	addi	a0,a0,-1238 # 80222c20 <cons>
+    802070fe:	ffff9097          	auipc	ra,0xffff9
+    80207102:	5c8080e7          	jalr	1480(ra) # 802006c6 <acquire>
+
+  switch(c){
+    80207106:	47d5                	li	a5,21
+    80207108:	0af48663          	beq	s1,a5,802071b4 <consoleintr+0xcc>
+    8020710c:	0297ca63          	blt	a5,s1,80207140 <consoleintr+0x58>
+    80207110:	47a1                	li	a5,8
+    80207112:	0ef48763          	beq	s1,a5,80207200 <consoleintr+0x118>
+    80207116:	47c1                	li	a5,16
+    80207118:	10f49a63          	bne	s1,a5,8020722c <consoleintr+0x144>
+  case C('P'):  // Print process list.
+    procdump();
+    8020711c:	ffffb097          	auipc	ra,0xffffb
+    80207120:	6b4080e7          	jalr	1716(ra) # 802027d0 <procdump>
+      }
+    }
+    break;
+  }
+  
+  release(&cons.lock);
+    80207124:	0001c517          	auipc	a0,0x1c
+    80207128:	afc50513          	addi	a0,a0,-1284 # 80222c20 <cons>
+    8020712c:	ffff9097          	auipc	ra,0xffff9
+    80207130:	5ee080e7          	jalr	1518(ra) # 8020071a <release>
+}
+    80207134:	60e2                	ld	ra,24(sp)
+    80207136:	6442                	ld	s0,16(sp)
+    80207138:	64a2                	ld	s1,8(sp)
+    8020713a:	6902                	ld	s2,0(sp)
+    8020713c:	6105                	addi	sp,sp,32
+    8020713e:	8082                	ret
+  switch(c){
+    80207140:	07f00793          	li	a5,127
+    80207144:	0af48e63          	beq	s1,a5,80207200 <consoleintr+0x118>
+    if(c != 0 && cons.e-cons.r < INPUT_BUF){
+    80207148:	0001c717          	auipc	a4,0x1c
+    8020714c:	ad870713          	addi	a4,a4,-1320 # 80222c20 <cons>
+    80207150:	0a072783          	lw	a5,160(a4)
+    80207154:	09872703          	lw	a4,152(a4)
+    80207158:	9f99                	subw	a5,a5,a4
+    8020715a:	07f00713          	li	a4,127
+    8020715e:	fcf763e3          	bltu	a4,a5,80207124 <consoleintr+0x3c>
+      c = (c == '\r') ? '\n' : c;
+    80207162:	47b5                	li	a5,13
+    80207164:	0cf48763          	beq	s1,a5,80207232 <consoleintr+0x14a>
+      consputc(c);
+    80207168:	8526                	mv	a0,s1
+    8020716a:	00000097          	auipc	ra,0x0
+    8020716e:	f40080e7          	jalr	-192(ra) # 802070aa <consputc>
+      cons.buf[cons.e++ % INPUT_BUF] = c;
+    80207172:	0001c797          	auipc	a5,0x1c
+    80207176:	aae78793          	addi	a5,a5,-1362 # 80222c20 <cons>
+    8020717a:	0a07a703          	lw	a4,160(a5)
+    8020717e:	0017069b          	addiw	a3,a4,1
+    80207182:	0006861b          	sext.w	a2,a3
+    80207186:	0ad7a023          	sw	a3,160(a5)
+    8020718a:	07f77713          	andi	a4,a4,127
+    8020718e:	97ba                	add	a5,a5,a4
+    80207190:	00978c23          	sb	s1,24(a5)
+      if(c == '\n' || c == C('D') || cons.e == cons.r+INPUT_BUF){
+    80207194:	47a9                	li	a5,10
+    80207196:	0cf48563          	beq	s1,a5,80207260 <consoleintr+0x178>
+    8020719a:	4791                	li	a5,4
+    8020719c:	0cf48263          	beq	s1,a5,80207260 <consoleintr+0x178>
+    802071a0:	0001c797          	auipc	a5,0x1c
+    802071a4:	b187a783          	lw	a5,-1256(a5) # 80222cb8 <cons+0x98>
+    802071a8:	0807879b          	addiw	a5,a5,128
+    802071ac:	f6f61ce3          	bne	a2,a5,80207124 <consoleintr+0x3c>
+      cons.buf[cons.e++ % INPUT_BUF] = c;
+    802071b0:	863e                	mv	a2,a5
+    802071b2:	a07d                	j	80207260 <consoleintr+0x178>
+    while(cons.e != cons.w &&
+    802071b4:	0001c717          	auipc	a4,0x1c
+    802071b8:	a6c70713          	addi	a4,a4,-1428 # 80222c20 <cons>
+    802071bc:	0a072783          	lw	a5,160(a4)
+    802071c0:	09c72703          	lw	a4,156(a4)
+          cons.buf[(cons.e-1) % INPUT_BUF] != '\n'){
+    802071c4:	0001c497          	auipc	s1,0x1c
+    802071c8:	a5c48493          	addi	s1,s1,-1444 # 80222c20 <cons>
+    while(cons.e != cons.w &&
+    802071cc:	4929                	li	s2,10
+    802071ce:	f4f70be3          	beq	a4,a5,80207124 <consoleintr+0x3c>
+          cons.buf[(cons.e-1) % INPUT_BUF] != '\n'){
+    802071d2:	37fd                	addiw	a5,a5,-1
+    802071d4:	07f7f713          	andi	a4,a5,127
+    802071d8:	9726                	add	a4,a4,s1
+    while(cons.e != cons.w &&
+    802071da:	01874703          	lbu	a4,24(a4)
+    802071de:	f52703e3          	beq	a4,s2,80207124 <consoleintr+0x3c>
+      cons.e--;
+    802071e2:	0af4a023          	sw	a5,160(s1)
+      consputc(BACKSPACE);
+    802071e6:	10000513          	li	a0,256
+    802071ea:	00000097          	auipc	ra,0x0
+    802071ee:	ec0080e7          	jalr	-320(ra) # 802070aa <consputc>
+    while(cons.e != cons.w &&
+    802071f2:	0a04a783          	lw	a5,160(s1)
+    802071f6:	09c4a703          	lw	a4,156(s1)
+    802071fa:	fcf71ce3          	bne	a4,a5,802071d2 <consoleintr+0xea>
+    802071fe:	b71d                	j	80207124 <consoleintr+0x3c>
+    if(cons.e != cons.w){
+    80207200:	0001c717          	auipc	a4,0x1c
+    80207204:	a2070713          	addi	a4,a4,-1504 # 80222c20 <cons>
+    80207208:	0a072783          	lw	a5,160(a4)
+    8020720c:	09c72703          	lw	a4,156(a4)
+    80207210:	f0f70ae3          	beq	a4,a5,80207124 <consoleintr+0x3c>
+      cons.e--;
+    80207214:	37fd                	addiw	a5,a5,-1
+    80207216:	0001c717          	auipc	a4,0x1c
+    8020721a:	aaf72523          	sw	a5,-1366(a4) # 80222cc0 <cons+0xa0>
+      consputc(BACKSPACE);
+    8020721e:	10000513          	li	a0,256
+    80207222:	00000097          	auipc	ra,0x0
+    80207226:	e88080e7          	jalr	-376(ra) # 802070aa <consputc>
+    8020722a:	bded                	j	80207124 <consoleintr+0x3c>
+    if(c != 0 && cons.e-cons.r < INPUT_BUF){
+    8020722c:	ee048ce3          	beqz	s1,80207124 <consoleintr+0x3c>
+    80207230:	bf21                	j	80207148 <consoleintr+0x60>
+      consputc(c);
+    80207232:	4529                	li	a0,10
+    80207234:	00000097          	auipc	ra,0x0
+    80207238:	e76080e7          	jalr	-394(ra) # 802070aa <consputc>
+      cons.buf[cons.e++ % INPUT_BUF] = c;
+    8020723c:	0001c797          	auipc	a5,0x1c
+    80207240:	9e478793          	addi	a5,a5,-1564 # 80222c20 <cons>
+    80207244:	0a07a703          	lw	a4,160(a5)
+    80207248:	0017069b          	addiw	a3,a4,1
+    8020724c:	0006861b          	sext.w	a2,a3
+    80207250:	0ad7a023          	sw	a3,160(a5)
+    80207254:	07f77713          	andi	a4,a4,127
+    80207258:	97ba                	add	a5,a5,a4
+    8020725a:	4729                	li	a4,10
+    8020725c:	00e78c23          	sb	a4,24(a5)
+        cons.w = cons.e;
+    80207260:	0001c797          	auipc	a5,0x1c
+    80207264:	a4c7ae23          	sw	a2,-1444(a5) # 80222cbc <cons+0x9c>
+        wakeup(&cons.r);
+    80207268:	0001c517          	auipc	a0,0x1c
+    8020726c:	a5050513          	addi	a0,a0,-1456 # 80222cb8 <cons+0x98>
+    80207270:	ffffb097          	auipc	ra,0xffffb
+    80207274:	41c080e7          	jalr	1052(ra) # 8020268c <wakeup>
+    80207278:	b575                	j	80207124 <consoleintr+0x3c>
+
+000000008020727a <consoleinit>:
+
+void
+consoleinit(void)
+{
+    8020727a:	1101                	addi	sp,sp,-32
+    8020727c:	ec06                	sd	ra,24(sp)
+    8020727e:	e822                	sd	s0,16(sp)
+    80207280:	e426                	sd	s1,8(sp)
+    80207282:	1000                	addi	s0,sp,32
+  initlock(&cons.lock, "cons");
+    80207284:	0001c497          	auipc	s1,0x1c
+    80207288:	99c48493          	addi	s1,s1,-1636 # 80222c20 <cons>
+    8020728c:	00003597          	auipc	a1,0x3
+    80207290:	c2458593          	addi	a1,a1,-988 # 80209eb0 <digits+0xb30>
+    80207294:	8526                	mv	a0,s1
+    80207296:	ffff9097          	auipc	ra,0xffff9
+    8020729a:	3ec080e7          	jalr	1004(ra) # 80200682 <initlock>
+
+  cons.e = cons.w = cons.r = 0;
+    8020729e:	0804ac23          	sw	zero,152(s1)
+    802072a2:	0804ae23          	sw	zero,156(s1)
+    802072a6:	0a04a023          	sw	zero,160(s1)
+  
+  // connect read and write system calls
+  // to consoleread and consolewrite.
+  devsw[CONSOLE].read = consoleread;
+    802072aa:	00005797          	auipc	a5,0x5
+    802072ae:	a867b783          	ld	a5,-1402(a5) # 8020bd30 <_GLOBAL_OFFSET_TABLE_+0x58>
+    802072b2:	00000717          	auipc	a4,0x0
+    802072b6:	ce070713          	addi	a4,a4,-800 # 80206f92 <consoleread>
+    802072ba:	eb98                	sd	a4,16(a5)
+  devsw[CONSOLE].write = consolewrite;
+    802072bc:	00000717          	auipc	a4,0x0
+    802072c0:	c4870713          	addi	a4,a4,-952 # 80206f04 <consolewrite>
+    802072c4:	ef98                	sd	a4,24(a5)
+}
+    802072c6:	60e2                	ld	ra,24(sp)
+    802072c8:	6442                	ld	s0,16(sp)
+    802072ca:	64a2                	ld	s1,8(sp)
+    802072cc:	6105                	addi	sp,sp,32
+    802072ce:	8082                	ret
+
+00000000802072d0 <free_desc>:
+}
+
+// mark a descriptor as free.
+static void
+free_desc(int i)
+{
+    802072d0:	1141                	addi	sp,sp,-16
+    802072d2:	e406                	sd	ra,8(sp)
+    802072d4:	e022                	sd	s0,0(sp)
+    802072d6:	0800                	addi	s0,sp,16
+  if(i >= NUM)
+    802072d8:	479d                	li	a5,7
+    802072da:	04a7cb63          	blt	a5,a0,80207330 <free_desc+0x60>
+    panic("virtio_disk_intr 1");
+  if(disk.free[i])
+    802072de:	0001c717          	auipc	a4,0x1c
+    802072e2:	d2270713          	addi	a4,a4,-734 # 80223000 <disk>
+    802072e6:	972a                	add	a4,a4,a0
+    802072e8:	6789                	lui	a5,0x2
+    802072ea:	97ba                	add	a5,a5,a4
+    802072ec:	0187c783          	lbu	a5,24(a5) # 2018 <_entry-0x801fdfe8>
+    802072f0:	eba1                	bnez	a5,80207340 <free_desc+0x70>
+    panic("virtio_disk_intr 2");
+  disk.desc[i].addr = 0;
+    802072f2:	00451713          	slli	a4,a0,0x4
+    802072f6:	0001e797          	auipc	a5,0x1e
+    802072fa:	d0a7b783          	ld	a5,-758(a5) # 80225000 <disk+0x2000>
+    802072fe:	97ba                	add	a5,a5,a4
+    80207300:	0007b023          	sd	zero,0(a5)
+  disk.free[i] = 1;
+    80207304:	0001c717          	auipc	a4,0x1c
+    80207308:	cfc70713          	addi	a4,a4,-772 # 80223000 <disk>
+    8020730c:	972a                	add	a4,a4,a0
+    8020730e:	6789                	lui	a5,0x2
+    80207310:	97ba                	add	a5,a5,a4
+    80207312:	4705                	li	a4,1
+    80207314:	00e78c23          	sb	a4,24(a5) # 2018 <_entry-0x801fdfe8>
+  wakeup(&disk.free[0]);
+    80207318:	0001e517          	auipc	a0,0x1e
+    8020731c:	d0050513          	addi	a0,a0,-768 # 80225018 <disk+0x2018>
+    80207320:	ffffb097          	auipc	ra,0xffffb
+    80207324:	36c080e7          	jalr	876(ra) # 8020268c <wakeup>
+}
+    80207328:	60a2                	ld	ra,8(sp)
+    8020732a:	6402                	ld	s0,0(sp)
+    8020732c:	0141                	addi	sp,sp,16
+    8020732e:	8082                	ret
+    panic("virtio_disk_intr 1");
+    80207330:	00003517          	auipc	a0,0x3
+    80207334:	b8850513          	addi	a0,a0,-1144 # 80209eb8 <digits+0xb38>
+    80207338:	ffff9097          	auipc	ra,0xffff9
+    8020733c:	e0c080e7          	jalr	-500(ra) # 80200144 <panic>
+    panic("virtio_disk_intr 2");
+    80207340:	00003517          	auipc	a0,0x3
+    80207344:	b9050513          	addi	a0,a0,-1136 # 80209ed0 <digits+0xb50>
+    80207348:	ffff9097          	auipc	ra,0xffff9
+    8020734c:	dfc080e7          	jalr	-516(ra) # 80200144 <panic>
+
+0000000080207350 <virtio_disk_init>:
+{
+    80207350:	1141                	addi	sp,sp,-16
+    80207352:	e406                	sd	ra,8(sp)
+    80207354:	e022                	sd	s0,0(sp)
+    80207356:	0800                	addi	s0,sp,16
+  initlock(&disk.vdisk_lock, "virtio_disk");
+    80207358:	00003597          	auipc	a1,0x3
+    8020735c:	b9058593          	addi	a1,a1,-1136 # 80209ee8 <digits+0xb68>
+    80207360:	0001e517          	auipc	a0,0x1e
+    80207364:	d4850513          	addi	a0,a0,-696 # 802250a8 <disk+0x20a8>
+    80207368:	ffff9097          	auipc	ra,0xffff9
+    8020736c:	31a080e7          	jalr	794(ra) # 80200682 <initlock>
+  if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 ||
+    80207370:	03f107b7          	lui	a5,0x3f10
+    80207374:	0785                	addi	a5,a5,1 # 3f10001 <_entry-0x7c2effff>
+    80207376:	07b2                	slli	a5,a5,0xc
+    80207378:	4398                	lw	a4,0(a5)
+    8020737a:	2701                	sext.w	a4,a4
+    8020737c:	747277b7          	lui	a5,0x74727
+    80207380:	97678793          	addi	a5,a5,-1674 # 74726976 <_entry-0xbad968a>
+    80207384:	12f71163          	bne	a4,a5,802074a6 <virtio_disk_init+0x156>
+     *R(VIRTIO_MMIO_VERSION) != 1 ||
+    80207388:	00003797          	auipc	a5,0x3
+    8020738c:	be87b783          	ld	a5,-1048(a5) # 80209f70 <digits+0xbf0>
+    80207390:	439c                	lw	a5,0(a5)
+    80207392:	2781                	sext.w	a5,a5
+  if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 ||
+    80207394:	4705                	li	a4,1
+    80207396:	10e79863          	bne	a5,a4,802074a6 <virtio_disk_init+0x156>
+     *R(VIRTIO_MMIO_DEVICE_ID) != 2 ||
+    8020739a:	00003797          	auipc	a5,0x3
+    8020739e:	bde7b783          	ld	a5,-1058(a5) # 80209f78 <digits+0xbf8>
+    802073a2:	439c                	lw	a5,0(a5)
+    802073a4:	2781                	sext.w	a5,a5
+     *R(VIRTIO_MMIO_VERSION) != 1 ||
+    802073a6:	4709                	li	a4,2
+    802073a8:	0ee79f63          	bne	a5,a4,802074a6 <virtio_disk_init+0x156>
+     *R(VIRTIO_MMIO_VENDOR_ID) != 0x554d4551){
+    802073ac:	00003797          	auipc	a5,0x3
+    802073b0:	bd47b783          	ld	a5,-1068(a5) # 80209f80 <digits+0xc00>
+    802073b4:	4398                	lw	a4,0(a5)
+    802073b6:	2701                	sext.w	a4,a4
+     *R(VIRTIO_MMIO_DEVICE_ID) != 2 ||
+    802073b8:	554d47b7          	lui	a5,0x554d4
+    802073bc:	55178793          	addi	a5,a5,1361 # 554d4551 <_entry-0x2ad2baaf>
+    802073c0:	0ef71363          	bne	a4,a5,802074a6 <virtio_disk_init+0x156>
+  *R(VIRTIO_MMIO_STATUS) = status;
+    802073c4:	00003797          	auipc	a5,0x3
+    802073c8:	bc47b783          	ld	a5,-1084(a5) # 80209f88 <digits+0xc08>
+    802073cc:	4705                	li	a4,1
+    802073ce:	c398                	sw	a4,0(a5)
+  *R(VIRTIO_MMIO_STATUS) = status;
+    802073d0:	470d                	li	a4,3
+    802073d2:	c398                	sw	a4,0(a5)
+  uint64 features = *R(VIRTIO_MMIO_DEVICE_FEATURES);
+    802073d4:	00003717          	auipc	a4,0x3
+    802073d8:	bbc73703          	ld	a4,-1092(a4) # 80209f90 <digits+0xc10>
+    802073dc:	4318                	lw	a4,0(a4)
+  *R(VIRTIO_MMIO_DRIVER_FEATURES) = features;
+    802073de:	c7ffe6b7          	lui	a3,0xc7ffe
+    802073e2:	75f68693          	addi	a3,a3,1887 # ffffffffc7ffe75f <ebss_clear+0xffffffff47dd875f>
+    802073e6:	8f75                	and	a4,a4,a3
+    802073e8:	00003697          	auipc	a3,0x3
+    802073ec:	bb06b683          	ld	a3,-1104(a3) # 80209f98 <digits+0xc18>
+    802073f0:	c298                	sw	a4,0(a3)
+  *R(VIRTIO_MMIO_STATUS) = status;
+    802073f2:	472d                	li	a4,11
+    802073f4:	c398                	sw	a4,0(a5)
+  *R(VIRTIO_MMIO_STATUS) = status;
+    802073f6:	473d                	li	a4,15
+    802073f8:	c398                	sw	a4,0(a5)
+  *R(VIRTIO_MMIO_GUEST_PAGE_SIZE) = PGSIZE;
+    802073fa:	00003797          	auipc	a5,0x3
+    802073fe:	ba67b783          	ld	a5,-1114(a5) # 80209fa0 <digits+0xc20>
+    80207402:	6705                	lui	a4,0x1
+    80207404:	c398                	sw	a4,0(a5)
+  *R(VIRTIO_MMIO_QUEUE_SEL) = 0;
+    80207406:	00003797          	auipc	a5,0x3
+    8020740a:	ba27b783          	ld	a5,-1118(a5) # 80209fa8 <digits+0xc28>
+    8020740e:	0007a023          	sw	zero,0(a5)
+  uint32 max = *R(VIRTIO_MMIO_QUEUE_NUM_MAX);
+    80207412:	00003797          	auipc	a5,0x3
+    80207416:	b9e7b783          	ld	a5,-1122(a5) # 80209fb0 <digits+0xc30>
+    8020741a:	439c                	lw	a5,0(a5)
+    8020741c:	2781                	sext.w	a5,a5
+  if(max == 0)
+    8020741e:	cfc1                	beqz	a5,802074b6 <virtio_disk_init+0x166>
+  if(max < NUM)
+    80207420:	471d                	li	a4,7
+    80207422:	0af77263          	bgeu	a4,a5,802074c6 <virtio_disk_init+0x176>
+  *R(VIRTIO_MMIO_QUEUE_NUM) = NUM;
+    80207426:	00003797          	auipc	a5,0x3
+    8020742a:	b927b783          	ld	a5,-1134(a5) # 80209fb8 <digits+0xc38>
+    8020742e:	4721                	li	a4,8
+    80207430:	c398                	sw	a4,0(a5)
+  memset(disk.pages, 0, sizeof(disk.pages));
+    80207432:	6609                	lui	a2,0x2
+    80207434:	4581                	li	a1,0
+    80207436:	0001c517          	auipc	a0,0x1c
+    8020743a:	bca50513          	addi	a0,a0,-1078 # 80223000 <disk>
+    8020743e:	ffff9097          	auipc	ra,0xffff9
+    80207442:	324080e7          	jalr	804(ra) # 80200762 <memset>
+  *R(VIRTIO_MMIO_QUEUE_PFN) = ((uint64)disk.pages) >> PGSHIFT;
+    80207446:	0001c717          	auipc	a4,0x1c
+    8020744a:	bba70713          	addi	a4,a4,-1094 # 80223000 <disk>
+    8020744e:	00c75793          	srli	a5,a4,0xc
+    80207452:	2781                	sext.w	a5,a5
+    80207454:	00003697          	auipc	a3,0x3
+    80207458:	b6c6b683          	ld	a3,-1172(a3) # 80209fc0 <digits+0xc40>
+    8020745c:	c29c                	sw	a5,0(a3)
+  disk.desc = (struct VRingDesc *) disk.pages;
+    8020745e:	0001e797          	auipc	a5,0x1e
+    80207462:	ba278793          	addi	a5,a5,-1118 # 80225000 <disk+0x2000>
+    80207466:	e398                	sd	a4,0(a5)
+  disk.avail = (uint16*)(((char*)disk.desc) + NUM*sizeof(struct VRingDesc));
+    80207468:	0001c717          	auipc	a4,0x1c
+    8020746c:	c1870713          	addi	a4,a4,-1000 # 80223080 <disk+0x80>
+    80207470:	e798                	sd	a4,8(a5)
+  disk.used = (struct UsedArea *) (disk.pages + PGSIZE);
+    80207472:	0001d717          	auipc	a4,0x1d
+    80207476:	b8e70713          	addi	a4,a4,-1138 # 80224000 <disk+0x1000>
+    8020747a:	eb98                	sd	a4,16(a5)
+    disk.free[i] = 1;
+    8020747c:	4705                	li	a4,1
+    8020747e:	00e78c23          	sb	a4,24(a5)
+    80207482:	00e78ca3          	sb	a4,25(a5)
+    80207486:	00e78d23          	sb	a4,26(a5)
+    8020748a:	00e78da3          	sb	a4,27(a5)
+    8020748e:	00e78e23          	sb	a4,28(a5)
+    80207492:	00e78ea3          	sb	a4,29(a5)
+    80207496:	00e78f23          	sb	a4,30(a5)
+    8020749a:	00e78fa3          	sb	a4,31(a5)
+}
+    8020749e:	60a2                	ld	ra,8(sp)
+    802074a0:	6402                	ld	s0,0(sp)
+    802074a2:	0141                	addi	sp,sp,16
+    802074a4:	8082                	ret
+    panic("could not find virtio disk");
+    802074a6:	00003517          	auipc	a0,0x3
+    802074aa:	a5250513          	addi	a0,a0,-1454 # 80209ef8 <digits+0xb78>
+    802074ae:	ffff9097          	auipc	ra,0xffff9
+    802074b2:	c96080e7          	jalr	-874(ra) # 80200144 <panic>
+    panic("virtio disk has no queue 0");
+    802074b6:	00003517          	auipc	a0,0x3
+    802074ba:	a6250513          	addi	a0,a0,-1438 # 80209f18 <digits+0xb98>
+    802074be:	ffff9097          	auipc	ra,0xffff9
+    802074c2:	c86080e7          	jalr	-890(ra) # 80200144 <panic>
+    panic("virtio disk max queue too short");
+    802074c6:	00003517          	auipc	a0,0x3
+    802074ca:	a7250513          	addi	a0,a0,-1422 # 80209f38 <digits+0xbb8>
+    802074ce:	ffff9097          	auipc	ra,0xffff9
+    802074d2:	c76080e7          	jalr	-906(ra) # 80200144 <panic>
+
+00000000802074d6 <virtio_disk_rw>:
+  return 0;
+}
+
+void
+virtio_disk_rw(struct buf *b, int write)
+{
+    802074d6:	7175                	addi	sp,sp,-144
+    802074d8:	e506                	sd	ra,136(sp)
+    802074da:	e122                	sd	s0,128(sp)
+    802074dc:	fca6                	sd	s1,120(sp)
+    802074de:	f8ca                	sd	s2,112(sp)
+    802074e0:	f4ce                	sd	s3,104(sp)
+    802074e2:	f0d2                	sd	s4,96(sp)
+    802074e4:	ecd6                	sd	s5,88(sp)
+    802074e6:	e8da                	sd	s6,80(sp)
+    802074e8:	e4de                	sd	s7,72(sp)
+    802074ea:	e0e2                	sd	s8,64(sp)
+    802074ec:	fc66                	sd	s9,56(sp)
+    802074ee:	f86a                	sd	s10,48(sp)
+    802074f0:	f46e                	sd	s11,40(sp)
+    802074f2:	0900                	addi	s0,sp,144
+    802074f4:	8aaa                	mv	s5,a0
+    802074f6:	8cae                	mv	s9,a1
+  uint64 sector = b->sectorno;
+    802074f8:	00c56d03          	lwu	s10,12(a0)
+
+  acquire(&disk.vdisk_lock);
+    802074fc:	0001e517          	auipc	a0,0x1e
+    80207500:	bac50513          	addi	a0,a0,-1108 # 802250a8 <disk+0x20a8>
+    80207504:	ffff9097          	auipc	ra,0xffff9
+    80207508:	1c2080e7          	jalr	450(ra) # 802006c6 <acquire>
+  for(int i = 0; i < 3; i++){
+    8020750c:	4981                	li	s3,0
+  for(int i = 0; i < NUM; i++){
+    8020750e:	44a1                	li	s1,8
+      disk.free[i] = 0;
+    80207510:	0001cc17          	auipc	s8,0x1c
+    80207514:	af0c0c13          	addi	s8,s8,-1296 # 80223000 <disk>
+    80207518:	6b89                	lui	s7,0x2
+  for(int i = 0; i < 3; i++){
+    8020751a:	4b0d                	li	s6,3
+    8020751c:	a0ad                	j	80207586 <virtio_disk_rw+0xb0>
+      disk.free[i] = 0;
+    8020751e:	00fc0733          	add	a4,s8,a5
+    80207522:	975e                	add	a4,a4,s7
+    80207524:	00070c23          	sb	zero,24(a4)
+    idx[i] = alloc_desc();
+    80207528:	c19c                	sw	a5,0(a1)
+    if(idx[i] < 0){
+    8020752a:	0207c563          	bltz	a5,80207554 <virtio_disk_rw+0x7e>
+  for(int i = 0; i < 3; i++){
+    8020752e:	2905                	addiw	s2,s2,1
+    80207530:	0611                	addi	a2,a2,4 # 2004 <_entry-0x801fdffc>
+    80207532:	19690e63          	beq	s2,s6,802076ce <virtio_disk_rw+0x1f8>
+    idx[i] = alloc_desc();
+    80207536:	85b2                	mv	a1,a2
+  for(int i = 0; i < NUM; i++){
+    80207538:	0001e717          	auipc	a4,0x1e
+    8020753c:	ae070713          	addi	a4,a4,-1312 # 80225018 <disk+0x2018>
+    80207540:	87ce                	mv	a5,s3
+    if(disk.free[i]){
+    80207542:	00074683          	lbu	a3,0(a4)
+    80207546:	fee1                	bnez	a3,8020751e <virtio_disk_rw+0x48>
+  for(int i = 0; i < NUM; i++){
+    80207548:	2785                	addiw	a5,a5,1
+    8020754a:	0705                	addi	a4,a4,1
+    8020754c:	fe979be3          	bne	a5,s1,80207542 <virtio_disk_rw+0x6c>
+    idx[i] = alloc_desc();
+    80207550:	57fd                	li	a5,-1
+    80207552:	c19c                	sw	a5,0(a1)
+      for(int j = 0; j < i; j++)
+    80207554:	01205d63          	blez	s2,8020756e <virtio_disk_rw+0x98>
+    80207558:	8dce                	mv	s11,s3
+        free_desc(idx[j]);
+    8020755a:	000a2503          	lw	a0,0(s4)
+    8020755e:	00000097          	auipc	ra,0x0
+    80207562:	d72080e7          	jalr	-654(ra) # 802072d0 <free_desc>
+      for(int j = 0; j < i; j++)
+    80207566:	2d85                	addiw	s11,s11,1
+    80207568:	0a11                	addi	s4,s4,4
+    8020756a:	ff2d98e3          	bne	s11,s2,8020755a <virtio_disk_rw+0x84>
+  int idx[3];
+  while(1){
+    if(alloc3_desc(idx) == 0) {
+      break;
+    }
+    sleep(&disk.free[0], &disk.vdisk_lock);
+    8020756e:	0001e597          	auipc	a1,0x1e
+    80207572:	b3a58593          	addi	a1,a1,-1222 # 802250a8 <disk+0x20a8>
+    80207576:	0001e517          	auipc	a0,0x1e
+    8020757a:	aa250513          	addi	a0,a0,-1374 # 80225018 <disk+0x2018>
+    8020757e:	ffffb097          	auipc	ra,0xffffb
+    80207582:	e76080e7          	jalr	-394(ra) # 802023f4 <sleep>
+  for(int i = 0; i < 3; i++){
+    80207586:	f8040a13          	addi	s4,s0,-128
+{
+    8020758a:	8652                	mv	a2,s4
+  for(int i = 0; i < 3; i++){
+    8020758c:	894e                	mv	s2,s3
+    8020758e:	b765                	j	80207536 <virtio_disk_rw+0x60>
+  disk.desc[idx[0]].next = idx[1];
+
+  disk.desc[idx[1]].addr = (uint64) b->data;
+  disk.desc[idx[1]].len = BSIZE;
+  if(write)
+    disk.desc[idx[1]].flags = 0; // device reads b->data
+    80207590:	0001e717          	auipc	a4,0x1e
+    80207594:	a7073703          	ld	a4,-1424(a4) # 80225000 <disk+0x2000>
+    80207598:	973e                	add	a4,a4,a5
+    8020759a:	00071623          	sh	zero,12(a4)
+  else
+    disk.desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data
+  disk.desc[idx[1]].flags |= VRING_DESC_F_NEXT;
+    8020759e:	0001c517          	auipc	a0,0x1c
+    802075a2:	a6250513          	addi	a0,a0,-1438 # 80223000 <disk>
+    802075a6:	0001e717          	auipc	a4,0x1e
+    802075aa:	a5a70713          	addi	a4,a4,-1446 # 80225000 <disk+0x2000>
+    802075ae:	6314                	ld	a3,0(a4)
+    802075b0:	96be                	add	a3,a3,a5
+    802075b2:	00c6d603          	lhu	a2,12(a3)
+    802075b6:	00166613          	ori	a2,a2,1
+    802075ba:	00c69623          	sh	a2,12(a3)
+  disk.desc[idx[1]].next = idx[2];
+    802075be:	f8842683          	lw	a3,-120(s0)
+    802075c2:	6310                	ld	a2,0(a4)
+    802075c4:	97b2                	add	a5,a5,a2
+    802075c6:	00d79723          	sh	a3,14(a5)
+
+  disk.info[idx[0]].status = 0;
+    802075ca:	20048613          	addi	a2,s1,512
+    802075ce:	0612                	slli	a2,a2,0x4
+    802075d0:	962a                	add	a2,a2,a0
+    802075d2:	02060823          	sb	zero,48(a2)
+  disk.desc[idx[2]].addr = (uint64) &disk.info[idx[0]].status;
+    802075d6:	00469793          	slli	a5,a3,0x4
+    802075da:	630c                	ld	a1,0(a4)
+    802075dc:	95be                	add	a1,a1,a5
+    802075de:	6689                	lui	a3,0x2
+    802075e0:	03068693          	addi	a3,a3,48 # 2030 <_entry-0x801fdfd0>
+    802075e4:	96ca                	add	a3,a3,s2
+    802075e6:	96aa                	add	a3,a3,a0
+    802075e8:	e194                	sd	a3,0(a1)
+  disk.desc[idx[2]].len = 1;
+    802075ea:	6314                	ld	a3,0(a4)
+    802075ec:	96be                	add	a3,a3,a5
+    802075ee:	4585                	li	a1,1
+    802075f0:	c68c                	sw	a1,8(a3)
+  disk.desc[idx[2]].flags = VRING_DESC_F_WRITE; // device writes the status
+    802075f2:	6314                	ld	a3,0(a4)
+    802075f4:	96be                	add	a3,a3,a5
+    802075f6:	4509                	li	a0,2
+    802075f8:	00a69623          	sh	a0,12(a3)
+  disk.desc[idx[2]].next = 0;
+    802075fc:	6314                	ld	a3,0(a4)
+    802075fe:	97b6                	add	a5,a5,a3
+    80207600:	00079723          	sh	zero,14(a5)
+
+  // record struct buf for virtio_disk_intr().
+  b->disk = 1;
+    80207604:	00baa223          	sw	a1,4(s5)
+  disk.info[idx[0]].b = b;
+    80207608:	03563423          	sd	s5,40(a2)
+
+  // avail[0] is flags
+  // avail[1] tells the device how far to look in avail[2...].
+  // avail[2...] are desc[] indices the device should process.
+  // we only tell device the first index in our chain of descriptors.
+  disk.avail[2 + (disk.avail[1] % NUM)] = idx[0];
+    8020760c:	6714                	ld	a3,8(a4)
+    8020760e:	0026d783          	lhu	a5,2(a3)
+    80207612:	8b9d                	andi	a5,a5,7
+    80207614:	0789                	addi	a5,a5,2
+    80207616:	0786                	slli	a5,a5,0x1
+    80207618:	96be                	add	a3,a3,a5
+    8020761a:	00969023          	sh	s1,0(a3)
+  __sync_synchronize();
+    8020761e:	0ff0000f          	fence
+  disk.avail[1] = disk.avail[1] + 1;
+    80207622:	6718                	ld	a4,8(a4)
+    80207624:	00275783          	lhu	a5,2(a4)
+    80207628:	2785                	addiw	a5,a5,1
+    8020762a:	00f71123          	sh	a5,2(a4)
+
+  *R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number
+    8020762e:	00003797          	auipc	a5,0x3
+    80207632:	99a7b783          	ld	a5,-1638(a5) # 80209fc8 <digits+0xc48>
+    80207636:	0007a023          	sw	zero,0(a5)
+
+  // Wait for virtio_disk_intr() to say request has finished.
+  while(b->disk == 1) {
+    8020763a:	004aa783          	lw	a5,4(s5)
+    8020763e:	02b79163          	bne	a5,a1,80207660 <virtio_disk_rw+0x18a>
+    sleep(b, &disk.vdisk_lock);
+    80207642:	0001e917          	auipc	s2,0x1e
+    80207646:	a6690913          	addi	s2,s2,-1434 # 802250a8 <disk+0x20a8>
+  while(b->disk == 1) {
+    8020764a:	4485                	li	s1,1
+    sleep(b, &disk.vdisk_lock);
+    8020764c:	85ca                	mv	a1,s2
+    8020764e:	8556                	mv	a0,s5
+    80207650:	ffffb097          	auipc	ra,0xffffb
+    80207654:	da4080e7          	jalr	-604(ra) # 802023f4 <sleep>
+  while(b->disk == 1) {
+    80207658:	004aa783          	lw	a5,4(s5)
+    8020765c:	fe9788e3          	beq	a5,s1,8020764c <virtio_disk_rw+0x176>
+  }
+
+  disk.info[idx[0]].b = 0;
+    80207660:	f8042483          	lw	s1,-128(s0)
+    80207664:	20048713          	addi	a4,s1,512
+    80207668:	0712                	slli	a4,a4,0x4
+    8020766a:	0001c797          	auipc	a5,0x1c
+    8020766e:	99678793          	addi	a5,a5,-1642 # 80223000 <disk>
+    80207672:	97ba                	add	a5,a5,a4
+    80207674:	0207b423          	sd	zero,40(a5)
+    if(disk.desc[i].flags & VRING_DESC_F_NEXT)
+    80207678:	0001e917          	auipc	s2,0x1e
+    8020767c:	98890913          	addi	s2,s2,-1656 # 80225000 <disk+0x2000>
+    80207680:	a019                	j	80207686 <virtio_disk_rw+0x1b0>
+      i = disk.desc[i].next;
+    80207682:	00e7d483          	lhu	s1,14(a5)
+    free_desc(i);
+    80207686:	8526                	mv	a0,s1
+    80207688:	00000097          	auipc	ra,0x0
+    8020768c:	c48080e7          	jalr	-952(ra) # 802072d0 <free_desc>
+    if(disk.desc[i].flags & VRING_DESC_F_NEXT)
+    80207690:	0492                	slli	s1,s1,0x4
+    80207692:	00093783          	ld	a5,0(s2)
+    80207696:	97a6                	add	a5,a5,s1
+    80207698:	00c7d703          	lhu	a4,12(a5)
+    8020769c:	8b05                	andi	a4,a4,1
+    8020769e:	f375                	bnez	a4,80207682 <virtio_disk_rw+0x1ac>
+  free_chain(idx[0]);
+
+  release(&disk.vdisk_lock);
+    802076a0:	0001e517          	auipc	a0,0x1e
+    802076a4:	a0850513          	addi	a0,a0,-1528 # 802250a8 <disk+0x20a8>
+    802076a8:	ffff9097          	auipc	ra,0xffff9
+    802076ac:	072080e7          	jalr	114(ra) # 8020071a <release>
+}
+    802076b0:	60aa                	ld	ra,136(sp)
+    802076b2:	640a                	ld	s0,128(sp)
+    802076b4:	74e6                	ld	s1,120(sp)
+    802076b6:	7946                	ld	s2,112(sp)
+    802076b8:	79a6                	ld	s3,104(sp)
+    802076ba:	7a06                	ld	s4,96(sp)
+    802076bc:	6ae6                	ld	s5,88(sp)
+    802076be:	6b46                	ld	s6,80(sp)
+    802076c0:	6ba6                	ld	s7,72(sp)
+    802076c2:	6c06                	ld	s8,64(sp)
+    802076c4:	7ce2                	ld	s9,56(sp)
+    802076c6:	7d42                	ld	s10,48(sp)
+    802076c8:	7da2                	ld	s11,40(sp)
+    802076ca:	6149                	addi	sp,sp,144
+    802076cc:	8082                	ret
+  if(write)
+    802076ce:	019037b3          	snez	a5,s9
+    802076d2:	f6f42823          	sw	a5,-144(s0)
+  buf0.reserved = 0;
+    802076d6:	f6042a23          	sw	zero,-140(s0)
+  buf0.sector = sector;
+    802076da:	f7a43c23          	sd	s10,-136(s0)
+  disk.desc[idx[0]].addr = (uint64) kwalkaddr(myproc()->kpagetable, (uint64) &buf0);
+    802076de:	ffffa097          	auipc	ra,0xffffa
+    802076e2:	35e080e7          	jalr	862(ra) # 80201a3c <myproc>
+    802076e6:	f8042483          	lw	s1,-128(s0)
+    802076ea:	00449913          	slli	s2,s1,0x4
+    802076ee:	0001e997          	auipc	s3,0x1e
+    802076f2:	91298993          	addi	s3,s3,-1774 # 80225000 <disk+0x2000>
+    802076f6:	0009ba03          	ld	s4,0(s3)
+    802076fa:	9a4a                	add	s4,s4,s2
+    802076fc:	f7040593          	addi	a1,s0,-144
+    80207700:	6d28                	ld	a0,88(a0)
+    80207702:	ffff9097          	auipc	ra,0xffff9
+    80207706:	4ee080e7          	jalr	1262(ra) # 80200bf0 <kwalkaddr>
+    8020770a:	00aa3023          	sd	a0,0(s4)
+  disk.desc[idx[0]].len = sizeof(buf0);
+    8020770e:	0009b783          	ld	a5,0(s3)
+    80207712:	97ca                	add	a5,a5,s2
+    80207714:	4741                	li	a4,16
+    80207716:	c798                	sw	a4,8(a5)
+  disk.desc[idx[0]].flags = VRING_DESC_F_NEXT;
+    80207718:	0009b783          	ld	a5,0(s3)
+    8020771c:	97ca                	add	a5,a5,s2
+    8020771e:	4705                	li	a4,1
+    80207720:	00e79623          	sh	a4,12(a5)
+  disk.desc[idx[0]].next = idx[1];
+    80207724:	f8442783          	lw	a5,-124(s0)
+    80207728:	0009b703          	ld	a4,0(s3)
+    8020772c:	974a                	add	a4,a4,s2
+    8020772e:	00f71723          	sh	a5,14(a4)
+  disk.desc[idx[1]].addr = (uint64) b->data;
+    80207732:	0792                	slli	a5,a5,0x4
+    80207734:	0009b703          	ld	a4,0(s3)
+    80207738:	973e                	add	a4,a4,a5
+    8020773a:	058a8693          	addi	a3,s5,88
+    8020773e:	e314                	sd	a3,0(a4)
+  disk.desc[idx[1]].len = BSIZE;
+    80207740:	0009b703          	ld	a4,0(s3)
+    80207744:	973e                	add	a4,a4,a5
+    80207746:	20000693          	li	a3,512
+    8020774a:	c714                	sw	a3,8(a4)
+  if(write)
+    8020774c:	e40c92e3          	bnez	s9,80207590 <virtio_disk_rw+0xba>
+    disk.desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data
+    80207750:	0001e717          	auipc	a4,0x1e
+    80207754:	8b073703          	ld	a4,-1872(a4) # 80225000 <disk+0x2000>
+    80207758:	973e                	add	a4,a4,a5
+    8020775a:	4689                	li	a3,2
+    8020775c:	00d71623          	sh	a3,12(a4)
+    80207760:	bd3d                	j	8020759e <virtio_disk_rw+0xc8>
+
+0000000080207762 <virtio_disk_intr>:
+
+void
+virtio_disk_intr()
+{
+    80207762:	1101                	addi	sp,sp,-32
+    80207764:	ec06                	sd	ra,24(sp)
+    80207766:	e822                	sd	s0,16(sp)
+    80207768:	e426                	sd	s1,8(sp)
+    8020776a:	e04a                	sd	s2,0(sp)
+    8020776c:	1000                	addi	s0,sp,32
+  acquire(&disk.vdisk_lock);
+    8020776e:	0001e517          	auipc	a0,0x1e
+    80207772:	93a50513          	addi	a0,a0,-1734 # 802250a8 <disk+0x20a8>
+    80207776:	ffff9097          	auipc	ra,0xffff9
+    8020777a:	f50080e7          	jalr	-176(ra) # 802006c6 <acquire>
+
+  while((disk.used_idx % NUM) != (disk.used->id % NUM)){
+    8020777e:	0001e717          	auipc	a4,0x1e
+    80207782:	88270713          	addi	a4,a4,-1918 # 80225000 <disk+0x2000>
+    80207786:	02075783          	lhu	a5,32(a4)
+    8020778a:	6b18                	ld	a4,16(a4)
+    8020778c:	00275683          	lhu	a3,2(a4)
+    80207790:	8ebd                	xor	a3,a3,a5
+    80207792:	8a9d                	andi	a3,a3,7
+    80207794:	cab9                	beqz	a3,802077ea <virtio_disk_intr+0x88>
+    int id = disk.used->elems[disk.used_idx].id;
+
+    if(disk.info[id].status != 0)
+    80207796:	0001c917          	auipc	s2,0x1c
+    8020779a:	86a90913          	addi	s2,s2,-1942 # 80223000 <disk>
+      panic("virtio_disk_intr status");
+    
+    disk.info[id].b->disk = 0;   // disk is done with buf
+    wakeup(disk.info[id].b);
+
+    disk.used_idx = (disk.used_idx + 1) % NUM;
+    8020779e:	0001e497          	auipc	s1,0x1e
+    802077a2:	86248493          	addi	s1,s1,-1950 # 80225000 <disk+0x2000>
+    int id = disk.used->elems[disk.used_idx].id;
+    802077a6:	078e                	slli	a5,a5,0x3
+    802077a8:	973e                	add	a4,a4,a5
+    802077aa:	435c                	lw	a5,4(a4)
+    if(disk.info[id].status != 0)
+    802077ac:	20078713          	addi	a4,a5,512
+    802077b0:	0712                	slli	a4,a4,0x4
+    802077b2:	974a                	add	a4,a4,s2
+    802077b4:	03074703          	lbu	a4,48(a4)
+    802077b8:	e335                	bnez	a4,8020781c <virtio_disk_intr+0xba>
+    disk.info[id].b->disk = 0;   // disk is done with buf
+    802077ba:	20078793          	addi	a5,a5,512
+    802077be:	0792                	slli	a5,a5,0x4
+    802077c0:	97ca                	add	a5,a5,s2
+    802077c2:	7798                	ld	a4,40(a5)
+    802077c4:	00072223          	sw	zero,4(a4)
+    wakeup(disk.info[id].b);
+    802077c8:	7788                	ld	a0,40(a5)
+    802077ca:	ffffb097          	auipc	ra,0xffffb
+    802077ce:	ec2080e7          	jalr	-318(ra) # 8020268c <wakeup>
+    disk.used_idx = (disk.used_idx + 1) % NUM;
+    802077d2:	0204d783          	lhu	a5,32(s1)
+    802077d6:	2785                	addiw	a5,a5,1
+    802077d8:	8b9d                	andi	a5,a5,7
+    802077da:	02f49023          	sh	a5,32(s1)
+  while((disk.used_idx % NUM) != (disk.used->id % NUM)){
+    802077de:	6898                	ld	a4,16(s1)
+    802077e0:	00275683          	lhu	a3,2(a4)
+    802077e4:	8a9d                	andi	a3,a3,7
+    802077e6:	fcf690e3          	bne	a3,a5,802077a6 <virtio_disk_intr+0x44>
+  }
+  *R(VIRTIO_MMIO_INTERRUPT_ACK) = *R(VIRTIO_MMIO_INTERRUPT_STATUS) & 0x3;
+    802077ea:	00002797          	auipc	a5,0x2
+    802077ee:	7e67b783          	ld	a5,2022(a5) # 80209fd0 <digits+0xc50>
+    802077f2:	439c                	lw	a5,0(a5)
+    802077f4:	8b8d                	andi	a5,a5,3
+    802077f6:	00002717          	auipc	a4,0x2
+    802077fa:	7e273703          	ld	a4,2018(a4) # 80209fd8 <digits+0xc58>
+    802077fe:	c31c                	sw	a5,0(a4)
+
+  release(&disk.vdisk_lock);
+    80207800:	0001e517          	auipc	a0,0x1e
+    80207804:	8a850513          	addi	a0,a0,-1880 # 802250a8 <disk+0x20a8>
+    80207808:	ffff9097          	auipc	ra,0xffff9
+    8020780c:	f12080e7          	jalr	-238(ra) # 8020071a <release>
+}
+    80207810:	60e2                	ld	ra,24(sp)
+    80207812:	6442                	ld	s0,16(sp)
+    80207814:	64a2                	ld	s1,8(sp)
+    80207816:	6902                	ld	s2,0(sp)
+    80207818:	6105                	addi	sp,sp,32
+    8020781a:	8082                	ret
+      panic("virtio_disk_intr status");
+    8020781c:	00002517          	auipc	a0,0x2
+    80207820:	73c50513          	addi	a0,a0,1852 # 80209f58 <digits+0xbd8>
+    80207824:	ffff9097          	auipc	ra,0xffff9
+    80207828:	920080e7          	jalr	-1760(ra) # 80200144 <panic>
+	...
+
+0000000080208000 <_trampoline>:
+    80208000:	14051573          	csrrw	a0,sscratch,a0
+    80208004:	02153423          	sd	ra,40(a0)
+    80208008:	02253823          	sd	sp,48(a0)
+    8020800c:	02353c23          	sd	gp,56(a0)
+    80208010:	04453023          	sd	tp,64(a0)
+    80208014:	04553423          	sd	t0,72(a0)
+    80208018:	04653823          	sd	t1,80(a0)
+    8020801c:	04753c23          	sd	t2,88(a0)
+    80208020:	f120                	sd	s0,96(a0)
+    80208022:	f524                	sd	s1,104(a0)
+    80208024:	fd2c                	sd	a1,120(a0)
+    80208026:	e150                	sd	a2,128(a0)
+    80208028:	e554                	sd	a3,136(a0)
+    8020802a:	e958                	sd	a4,144(a0)
+    8020802c:	ed5c                	sd	a5,152(a0)
+    8020802e:	0b053023          	sd	a6,160(a0)
+    80208032:	0b153423          	sd	a7,168(a0)
+    80208036:	0b253823          	sd	s2,176(a0)
+    8020803a:	0b353c23          	sd	s3,184(a0)
+    8020803e:	0d453023          	sd	s4,192(a0)
+    80208042:	0d553423          	sd	s5,200(a0)
+    80208046:	0d653823          	sd	s6,208(a0)
+    8020804a:	0d753c23          	sd	s7,216(a0)
+    8020804e:	0f853023          	sd	s8,224(a0)
+    80208052:	0f953423          	sd	s9,232(a0)
+    80208056:	0fa53823          	sd	s10,240(a0)
+    8020805a:	0fb53c23          	sd	s11,248(a0)
+    8020805e:	11c53023          	sd	t3,256(a0)
+    80208062:	11d53423          	sd	t4,264(a0)
+    80208066:	11e53823          	sd	t5,272(a0)
+    8020806a:	11f53c23          	sd	t6,280(a0)
+    8020806e:	140022f3          	csrr	t0,sscratch
+    80208072:	06553823          	sd	t0,112(a0)
+    80208076:	00853103          	ld	sp,8(a0)
+    8020807a:	02053203          	ld	tp,32(a0)
+    8020807e:	01053283          	ld	t0,16(a0)
+    80208082:	00053303          	ld	t1,0(a0)
+    80208086:	18031073          	csrw	satp,t1
+    8020808a:	12000073          	sfence.vma
+    8020808e:	8282                	jr	t0
+
+0000000080208090 <userret>:
+    80208090:	18059073          	csrw	satp,a1
+    80208094:	12000073          	sfence.vma
+    80208098:	07053283          	ld	t0,112(a0)
+    8020809c:	14029073          	csrw	sscratch,t0
+    802080a0:	02853083          	ld	ra,40(a0)
+    802080a4:	03053103          	ld	sp,48(a0)
+    802080a8:	03853183          	ld	gp,56(a0)
+    802080ac:	04053203          	ld	tp,64(a0)
+    802080b0:	04853283          	ld	t0,72(a0)
+    802080b4:	05053303          	ld	t1,80(a0)
+    802080b8:	05853383          	ld	t2,88(a0)
+    802080bc:	7120                	ld	s0,96(a0)
+    802080be:	7524                	ld	s1,104(a0)
+    802080c0:	7d2c                	ld	a1,120(a0)
+    802080c2:	6150                	ld	a2,128(a0)
+    802080c4:	6554                	ld	a3,136(a0)
+    802080c6:	6958                	ld	a4,144(a0)
+    802080c8:	6d5c                	ld	a5,152(a0)
+    802080ca:	0a053803          	ld	a6,160(a0)
+    802080ce:	0a853883          	ld	a7,168(a0)
+    802080d2:	0b053903          	ld	s2,176(a0)
+    802080d6:	0b853983          	ld	s3,184(a0)
+    802080da:	0c053a03          	ld	s4,192(a0)
+    802080de:	0c853a83          	ld	s5,200(a0)
+    802080e2:	0d053b03          	ld	s6,208(a0)
+    802080e6:	0d853b83          	ld	s7,216(a0)
+    802080ea:	0e053c03          	ld	s8,224(a0)
+    802080ee:	0e853c83          	ld	s9,232(a0)
+    802080f2:	0f053d03          	ld	s10,240(a0)
+    802080f6:	0f853d83          	ld	s11,248(a0)
+    802080fa:	10053e03          	ld	t3,256(a0)
+    802080fe:	10853e83          	ld	t4,264(a0)
+    80208102:	11053f03          	ld	t5,272(a0)
+    80208106:	11853f83          	ld	t6,280(a0)
+    8020810a:	14051573          	csrrw	a0,sscratch,a0
+    8020810e:	10200073          	sret
+	...
diff --git a/target/kernel.sym b/target/kernel.sym
new file mode 100644
index 0000000000000000000000000000000000000000..deade5b43d12a81c77ad8d98134215b058b638f7
--- /dev/null
+++ b/target/kernel.sym
@@ -0,0 +1,306 @@
+0000000080200000 .text
+0000000080209000 .rodata
+000000008020a000 .data
+000000008020bcd8 .got
+000000008020bd38 .got.plt
+000000008020c000 .bss
+0000000000000000 .riscv.attributes
+0000000000000000 .comment
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_loclists
+0000000000000000 .debug_aranges
+0000000000000000 .debug_rnglists
+0000000000000000 .debug_line
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_frame
+0000000000000000 entry_qemu.o
+0000000080200014 loop
+0000000000000000 printf.c
+0000000080200016 printint
+0000000080209380 digits
+0000000080214008 pr
+0000000000000000 kalloc.c
+0000000000000000 intr.c
+0000000000000000 spinlock.c
+0000000000000000 string.c
+0000000000000000 main.c
+0000000080214050 started
+0000000000000000 vm.c
+0000000000000000 proc.c
+0000000080201850 wakeup1
+0000000080201c0e freeproc
+0000000080201c78 allocproc
+000000008020a000 first.1
+000000008020ac48 states.0
+0000000000000000 swtch.o
+0000000000000000 trap.c
+0000000000000000 syscall.c
+0000000080202ee0 argraw
+000000008020ac70 syscalls
+000000008020b498 sysnames
+0000000000000000 sysproc.c
+0000000000000000 bio.c
+0000000000000000 sleeplock.c
+0000000000000000 file.c
+0000000000000000 pipe.c
+0000000000000000 exec.c
+0000000000000000 sysfile.c
+00000000802047b2 argfd
+000000008020481a fdalloc
+000000008020485c create
+0000000000000000 kernelvec.o
+0000000000000000 timer.c
+0000000000000000 disk.c
+0000000000000000 fat32.c
+000000008020551e read_fat
+0000000080205594 alloc_clus
+00000000802056d6 write_fat
+0000000080205756 reloc_clus
+000000008020585e rw_clus
+00000000802059aa eget
+000000008021e5b8 ecache
+0000000080205ab8 read_entry_name
+0000000080206ca0 lookup_path
+000000008020bcc0 illegal.1
+000000008020bcd0 illegal.0
+000000008021e428 fat
+000000008021e450 root
+0000000000000000 plic.c
+0000000000000000 console.c
+0000000000000000 virtio_disk.c
+00000000802072d0 free_desc
+0000000080223000 disk
+000000008020bcd8 _GLOBAL_OFFSET_TABLE_
+0000000080205034 sys_remove
+0000000080206410 edup
+0000000080200c68 mappages
+00000000802014a4 copyinstr
+0000000080206f92 consoleread
+00000000802008b4 safestrcpy
+0000000080204a4c sys_close
+00000000802023b8 yield
+0000000080214028 kmem
+0000000080202766 either_copyout
+000000008020541e timerinit
+0000000080214180 proc
+00000000802016cc proc_kpagetable
+0000000080203dec fileread
+000000008020018e printf
+0000000080203466 sys_sbrk
+0000000080203742 sys_yield
+0000000080208000 trampoline
+0000000080214000 panicked
+0000000080206046 emake
+0000000080206eaa plic_claim
+0000000080204e28 sys_dev
+0000000080206e50 plicinit
+0000000080206ed4 plic_complete
+00000000802021e2 sched
+00000000802007be memmove
+0000000080203136 syscall
+0000000080201a10 cpuid
+0000000080203386 sys_fork
+0000000080218af0 bcache
+0000000080204c2e sys_mkdir
+0000000080206604 etrunc
+0000000080206e68 plicinithart
+0000000080202092 reparent
+0000000080205ba4 fat32_init
+0000000080206e34 enameparent
+0000000080203106 argstr
+0000000080200f9e uvmdealloc
+000000008020339e sys_clone
+000000008020a000 sdata
+0000000080203c80 filedup
+00000000802037b2 binit
+00000000802012b4 uvmclear
+000000008020653a eremove
+0000000080204980 sys_read
+0000000080200822 memcpy
+0000000080200cf6 kvmmap
+0000000080200440 kfree
+0000000080201a20 mycpu
+00000000802029f8 devintr
+0000000080205d6a eread
+000000008020a004 nextpid
+0000000080203bbe fileinit
+0000000080208090 userret
+0000000080200682 initlock
+0000000080205f8e formatname
+00000000802012e6 copyout
+00000000802023f4 sleep
+00000000802000b8 printstring
+0000000080205390 kernelvec
+000000008020bcd7 edata
+0000000080200988 wcsncmp
+0000000080203660 sys_kill
+000000008020411e pipeclose
+0000000080204a9a sys_fstat
+0000000080206f04 consolewrite
+0000000080209000 rodata_start
+0000000080206e16 ename
+00000000802004c2 freerange
+000000008020666e elock
+0000000080200ae4 kvminithart
+000000008020100a uvmalloc
+0000000080200f14 uvminit
+00000000802011a6 uvmcopy
+0000000080214178 initproc
+0000000080201bbc proc_freepagetable
+0000000080201894 reg_info
+0000000080201b20 proc_pagetable
+00000000802034b0 sys_sleep
+0000000080201672 kvmfree
+00000000802054ba disk_init
+0000000080203f7e dirnext
+0000000080203c16 filealloc
+000000008020268c wakeup
+0000000080207350 virtio_disk_init
+0000000080201a3c myproc
+0000000080200000 BASE_ADDRESS
+0000000080202570 wait4
+0000000080204efa sys_readdir
+0000000080200b08 walk
+0000000080204ae8 sys_open
+00000000802000e4 backtrace
+00000000802070e8 consoleintr
+00000000802070aa consputc
+00000000802026f6 kill
+0000000080201ada allocpid
+00000000802013c4 copyin
+0000000080200910 wnstr
+000000008020116c uvmfree
+0000000080201372 copyout2
+0000000080203eae filewrite
+0000000080200942 snstr
+0000000080203082 argint
+0000000080209000 srodata
+0000000080200e22 vmunmap
+00000000802036d6 sys_times
+00000000802036ee sys_trace
+0000000080204378 exec
+0000000080209000 etext
+00000000802049e6 sys_write
+000000008020071a release
+0000000080203052 fetchstr
+0000000080202472 wait
+00000000802066f2 eput
+0000000080214000 boot_stack_top
+000000008020295a usertrapret
+00000000802020f8 scheduler
+0000000080206018 cal_checksum
+0000000080208000 _trampoline
+0000000080226000 kernel_end
+00000000802069fc dirlookup
+0000000080203402 sys_wait4
+0000000080203cd2 fileclose
+0000000080206b5a ealloc
+0000000080200bf0 kwalkaddr
+00000000802005c0 freemem_amount
+0000000080202a9c usertrap
+000000008020083a strncmp
+000000008021e408 tickslock
+000000008020418e pipewrite
+0000000080205506 disk_intr
+0000000080200876 strncpy
+000000008021d450 ftable
+0000000080207762 virtio_disk_intr
+0000000080209fe0 erodata
+000000008020492e sys_dup
+0000000080201452 copyin2
+0000000080200144 panic
+000000008020c000 bss_start
+0000000080201a74 forkret
+000000008020050e kinit
+0000000080200784 memcmp
+000000008020279c either_copyin
+0000000080201e42 fork
+0000000080214078 cpus
+0000000080203b24 releasesleep
+0000000080200000 _entry
+0000000080200698 holding
+00000000802006c6 acquire
+0000000080202f48 sys_uname
+0000000080214000 sbss_clear
+0000000080203560 sys_nanosleep
+000000008020a008 initcode
+000000008020291e trapinithart
+0000000080200762 memset
+00000000802030a4 sys_test_proc
+00000000802009e4 main
+0000000080203ace acquiresleep
+0000000080208000 uservec
+0000000080200d2e kvminit
+00000000802015c4 kfreewalk
+0000000080203a58 bunpin
+00000000802030e4 argaddr
+0000000080200000 text_start
+0000000080203726 sys_shutdown
+0000000080203692 sys_uptime
+000000008020a000 data_start
+0000000080204f48 sys_getcwd
+000000008020036e printfinit
+0000000080201732 vmprint
+0000000080200ee6 uvmcreate
+0000000080205e62 ewrite
+0000000080201dc6 growproc
+0000000080203b68 holdingsleep
+0000000080201554 copyinstr2
+0000000080201d4a userinit
+0000000080203852 bread
+0000000080204292 piperead
+00000000802003a0 print_logo
+000000008021e420 ticks
+000000008020727a consoleinit
+0000000080200bae walkaddr
+0000000080202c82 trapframedump
+00000000802027d0 procdump
+000000008020397e brelse
+0000000080202fb8 sys_sysinfo
+0000000080205446 set_next_timeout
+00000000802031da sys_exec
+0000000080200c46 kvmpa
+000000008020682a estat
+00000000802028b4 swtch
+0000000080226000 ebss_clear
+00000000802005d6 push_off
+0000000080205158 sys_rename
+0000000080200622 pop_off
+0000000080203942 bwrite
+000000008020546c timer_tick
+00000000802054ec disk_write
+00000000802022b8 exit
+0000000080201100 freewalk
+00000000802033d0 sys_wait
+000000008020331c sys_exit
+0000000080203a94 initsleeplock
+00000000802066a4 eunlock
+000000008020375c sys_gettimeofday
+0000000080214058 kernel_pagetable
+00000000802074d6 virtio_disk_rw
+00000000802008e6 strlen
+00000000802054d2 disk_read
+0000000080204d1c sys_pipe
+0000000080201f5a clone
+000000008020c000 boot_stack
+0000000080202884 procnum
+00000000802009c0 strchr
+0000000080206872 enext
+0000000080201620 kvmfreeusr
+0000000080222c20 cons
+000000008020055a kalloc
+0000000080203002 fetchaddr
+000000008021d3b0 devsw
+0000000080203350 sys_getpid
+0000000080204044 pipealloc
+000000008020336a sys_getppid
+0000000080200000 kernel_start
+0000000080204c88 sys_chdir
+0000000080206454 eupdate
+0000000080202b94 kerneltrap
+0000000080203a1c bpin
+000000008020199a procinit
+0000000080203d88 filestat
+0000000080214060 pid_lock
diff --git a/xv6-user/_cat b/xv6-user/_cat
new file mode 100644
index 0000000000000000000000000000000000000000..b494aa5b214b30b33239cc1370360b7fa8074b29
Binary files /dev/null and b/xv6-user/_cat differ
diff --git a/xv6-user/_echo b/xv6-user/_echo
new file mode 100644
index 0000000000000000000000000000000000000000..8a8434dee18c56242cb261d108a6bb0112e68a4f
Binary files /dev/null and b/xv6-user/_echo differ
diff --git a/xv6-user/_find b/xv6-user/_find
new file mode 100644
index 0000000000000000000000000000000000000000..83c4d1627e7da5ceb9919e7133276838c3049834
Binary files /dev/null and b/xv6-user/_find differ
diff --git a/xv6-user/_grep b/xv6-user/_grep
new file mode 100644
index 0000000000000000000000000000000000000000..b79afa5b64462a6c2d7171d93c88fe0d89b7fe71
Binary files /dev/null and b/xv6-user/_grep differ
diff --git a/xv6-user/_init b/xv6-user/_init
new file mode 100644
index 0000000000000000000000000000000000000000..23f0f61a9dc28ef7d21279d4a3deeab2b92128ae
Binary files /dev/null and b/xv6-user/_init differ
diff --git a/xv6-user/_kill b/xv6-user/_kill
new file mode 100644
index 0000000000000000000000000000000000000000..3fa3e7733564fbd01b28d677843187297afcd9c0
Binary files /dev/null and b/xv6-user/_kill differ
diff --git a/xv6-user/_ls b/xv6-user/_ls
new file mode 100644
index 0000000000000000000000000000000000000000..2f884dbb5fa278a8c87787addc53943e8e2e239e
Binary files /dev/null and b/xv6-user/_ls differ
diff --git a/xv6-user/_mkdir b/xv6-user/_mkdir
new file mode 100644
index 0000000000000000000000000000000000000000..d2cc842b3733c165a9503f697fa0b58d88dd20db
Binary files /dev/null and b/xv6-user/_mkdir differ
diff --git a/xv6-user/_mv b/xv6-user/_mv
new file mode 100644
index 0000000000000000000000000000000000000000..fc1f22cd88acbadb95fc7055bcb965cd14f32a5c
Binary files /dev/null and b/xv6-user/_mv differ
diff --git a/xv6-user/_rm b/xv6-user/_rm
new file mode 100644
index 0000000000000000000000000000000000000000..4c4f5ad57b5a558318fa786dbbe301b4a5be2800
Binary files /dev/null and b/xv6-user/_rm differ
diff --git a/xv6-user/_sh b/xv6-user/_sh
new file mode 100644
index 0000000000000000000000000000000000000000..44df6ae97d2fa7a33fe57d10ff9ea13de34fd816
Binary files /dev/null and b/xv6-user/_sh differ
diff --git a/xv6-user/_sleep b/xv6-user/_sleep
new file mode 100644
index 0000000000000000000000000000000000000000..f06e20bd3755f9872409ab072fbdfcdaf0e2392c
Binary files /dev/null and b/xv6-user/_sleep differ
diff --git a/xv6-user/_strace b/xv6-user/_strace
new file mode 100644
index 0000000000000000000000000000000000000000..0820d0c885a4317d5ad2a25c2eb6dbb8fb738cf2
Binary files /dev/null and b/xv6-user/_strace differ
diff --git a/xv6-user/_sysinfo b/xv6-user/_sysinfo
new file mode 100644
index 0000000000000000000000000000000000000000..f91e34884e4f3aec81238ef8ddee17c0a20acf13
Binary files /dev/null and b/xv6-user/_sysinfo differ
diff --git a/xv6-user/_test b/xv6-user/_test
new file mode 100644
index 0000000000000000000000000000000000000000..0b0438aa5b222c724a625e9d439710bec74c374a
Binary files /dev/null and b/xv6-user/_test differ
diff --git a/xv6-user/_usertests b/xv6-user/_usertests
new file mode 100644
index 0000000000000000000000000000000000000000..58b4b5e5ee68ddf239b44a80b0dbc85dfc4dec80
Binary files /dev/null and b/xv6-user/_usertests differ
diff --git a/xv6-user/_wc b/xv6-user/_wc
new file mode 100644
index 0000000000000000000000000000000000000000..655e497b596511d1b726d4add3226c71f699f05d
Binary files /dev/null and b/xv6-user/_wc differ
diff --git a/xv6-user/_xargs b/xv6-user/_xargs
new file mode 100644
index 0000000000000000000000000000000000000000..62eaee2727c815ff604a1f44f489cdc9c5cb99de
Binary files /dev/null and b/xv6-user/_xargs differ
diff --git a/xv6-user/cat.asm b/xv6-user/cat.asm
new file mode 100644
index 0000000000000000000000000000000000000000..c6cd26c889f378e3bc4a54552a9fef9c8d7a8a4d
--- /dev/null
+++ b/xv6-user/cat.asm
@@ -0,0 +1,1530 @@
+
+xv6-user/_cat:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <cat>:
+
+char buf[512];
+
+void
+cat(int fd)
+{
+   0:	7179                	addi	sp,sp,-48
+   2:	f406                	sd	ra,40(sp)
+   4:	f022                	sd	s0,32(sp)
+   6:	ec26                	sd	s1,24(sp)
+   8:	e84a                	sd	s2,16(sp)
+   a:	e44e                	sd	s3,8(sp)
+   c:	1800                	addi	s0,sp,48
+   e:	89aa                	mv	s3,a0
+  int n;
+
+  while((n = read(fd, buf, sizeof(buf))) > 0) {
+  10:	00001917          	auipc	s2,0x1
+  14:	9f090913          	addi	s2,s2,-1552 # a00 <buf>
+  18:	20000613          	li	a2,512
+  1c:	85ca                	mv	a1,s2
+  1e:	854e                	mv	a0,s3
+  20:	00000097          	auipc	ra,0x0
+  24:	3d2080e7          	jalr	978(ra) # 3f2 <read>
+  28:	84aa                	mv	s1,a0
+  2a:	02a05963          	blez	a0,5c <cat+0x5c>
+    if (write(1, buf, n) != n) {
+  2e:	8626                	mv	a2,s1
+  30:	85ca                	mv	a1,s2
+  32:	4505                	li	a0,1
+  34:	00000097          	auipc	ra,0x0
+  38:	3c8080e7          	jalr	968(ra) # 3fc <write>
+  3c:	fc950ee3          	beq	a0,s1,18 <cat+0x18>
+      fprintf(2, "cat: write error\n");
+  40:	00001597          	auipc	a1,0x1
+  44:	90058593          	addi	a1,a1,-1792 # 940 <malloc+0xee>
+  48:	4509                	li	a0,2
+  4a:	00000097          	auipc	ra,0x0
+  4e:	722080e7          	jalr	1826(ra) # 76c <fprintf>
+      exit(1);
+  52:	4505                	li	a0,1
+  54:	00000097          	auipc	ra,0x0
+  58:	382080e7          	jalr	898(ra) # 3d6 <exit>
+    }
+  }
+  if(n < 0){
+  5c:	00054963          	bltz	a0,6e <cat+0x6e>
+    fprintf(2, "cat: read error\n");
+    exit(1);
+  }
+}
+  60:	70a2                	ld	ra,40(sp)
+  62:	7402                	ld	s0,32(sp)
+  64:	64e2                	ld	s1,24(sp)
+  66:	6942                	ld	s2,16(sp)
+  68:	69a2                	ld	s3,8(sp)
+  6a:	6145                	addi	sp,sp,48
+  6c:	8082                	ret
+    fprintf(2, "cat: read error\n");
+  6e:	00001597          	auipc	a1,0x1
+  72:	8ea58593          	addi	a1,a1,-1814 # 958 <malloc+0x106>
+  76:	4509                	li	a0,2
+  78:	00000097          	auipc	ra,0x0
+  7c:	6f4080e7          	jalr	1780(ra) # 76c <fprintf>
+    exit(1);
+  80:	4505                	li	a0,1
+  82:	00000097          	auipc	ra,0x0
+  86:	354080e7          	jalr	852(ra) # 3d6 <exit>
+
+000000000000008a <main>:
+
+int
+main(int argc, char *argv[])
+{
+  8a:	7179                	addi	sp,sp,-48
+  8c:	f406                	sd	ra,40(sp)
+  8e:	f022                	sd	s0,32(sp)
+  90:	ec26                	sd	s1,24(sp)
+  92:	e84a                	sd	s2,16(sp)
+  94:	e44e                	sd	s3,8(sp)
+  96:	e052                	sd	s4,0(sp)
+  98:	1800                	addi	s0,sp,48
+  int fd, i;
+
+  if(argc <= 1){
+  9a:	4785                	li	a5,1
+  9c:	04a7d763          	bge	a5,a0,ea <main+0x60>
+  a0:	00858913          	addi	s2,a1,8
+  a4:	ffe5099b          	addiw	s3,a0,-2
+  a8:	02099793          	slli	a5,s3,0x20
+  ac:	01d7d993          	srli	s3,a5,0x1d
+  b0:	05c1                	addi	a1,a1,16
+  b2:	99ae                	add	s3,s3,a1
+    cat(0);
+    exit(0);
+  }
+
+  for(i = 1; i < argc; i++){
+    if((fd = open(argv[i], 0)) < 0){
+  b4:	4581                	li	a1,0
+  b6:	00093503          	ld	a0,0(s2)
+  ba:	00000097          	auipc	ra,0x0
+  be:	368080e7          	jalr	872(ra) # 422 <open>
+  c2:	84aa                	mv	s1,a0
+  c4:	02054d63          	bltz	a0,fe <main+0x74>
+      fprintf(2, "cat: cannot open %s\n", argv[i]);
+      exit(1);
+    }
+    cat(fd);
+  c8:	00000097          	auipc	ra,0x0
+  cc:	f38080e7          	jalr	-200(ra) # 0 <cat>
+    close(fd);
+  d0:	8526                	mv	a0,s1
+  d2:	00000097          	auipc	ra,0x0
+  d6:	334080e7          	jalr	820(ra) # 406 <close>
+  for(i = 1; i < argc; i++){
+  da:	0921                	addi	s2,s2,8
+  dc:	fd391ce3          	bne	s2,s3,b4 <main+0x2a>
+  }
+  exit(0);
+  e0:	4501                	li	a0,0
+  e2:	00000097          	auipc	ra,0x0
+  e6:	2f4080e7          	jalr	756(ra) # 3d6 <exit>
+    cat(0);
+  ea:	4501                	li	a0,0
+  ec:	00000097          	auipc	ra,0x0
+  f0:	f14080e7          	jalr	-236(ra) # 0 <cat>
+    exit(0);
+  f4:	4501                	li	a0,0
+  f6:	00000097          	auipc	ra,0x0
+  fa:	2e0080e7          	jalr	736(ra) # 3d6 <exit>
+      fprintf(2, "cat: cannot open %s\n", argv[i]);
+  fe:	00093603          	ld	a2,0(s2)
+ 102:	00001597          	auipc	a1,0x1
+ 106:	86e58593          	addi	a1,a1,-1938 # 970 <malloc+0x11e>
+ 10a:	4509                	li	a0,2
+ 10c:	00000097          	auipc	ra,0x0
+ 110:	660080e7          	jalr	1632(ra) # 76c <fprintf>
+      exit(1);
+ 114:	4505                	li	a0,1
+ 116:	00000097          	auipc	ra,0x0
+ 11a:	2c0080e7          	jalr	704(ra) # 3d6 <exit>
+
+000000000000011e <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+ 11e:	1141                	addi	sp,sp,-16
+ 120:	e422                	sd	s0,8(sp)
+ 122:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+ 124:	87aa                	mv	a5,a0
+ 126:	0585                	addi	a1,a1,1
+ 128:	0785                	addi	a5,a5,1
+ 12a:	fff5c703          	lbu	a4,-1(a1)
+ 12e:	fee78fa3          	sb	a4,-1(a5)
+ 132:	fb75                	bnez	a4,126 <strcpy+0x8>
+    ;
+  return os;
+}
+ 134:	6422                	ld	s0,8(sp)
+ 136:	0141                	addi	sp,sp,16
+ 138:	8082                	ret
+
+000000000000013a <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+ 13a:	1141                	addi	sp,sp,-16
+ 13c:	e422                	sd	s0,8(sp)
+ 13e:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+ 140:	00054783          	lbu	a5,0(a0)
+ 144:	c385                	beqz	a5,164 <strcat+0x2a>
+ 146:	87aa                	mv	a5,a0
+    s++;
+ 148:	0785                	addi	a5,a5,1
+  while(*s)
+ 14a:	0007c703          	lbu	a4,0(a5)
+ 14e:	ff6d                	bnez	a4,148 <strcat+0xe>
+  while((*s++ = *t++))
+ 150:	0585                	addi	a1,a1,1
+ 152:	0785                	addi	a5,a5,1
+ 154:	fff5c703          	lbu	a4,-1(a1)
+ 158:	fee78fa3          	sb	a4,-1(a5)
+ 15c:	fb75                	bnez	a4,150 <strcat+0x16>
+    ;
+  return os;
+}
+ 15e:	6422                	ld	s0,8(sp)
+ 160:	0141                	addi	sp,sp,16
+ 162:	8082                	ret
+  while(*s)
+ 164:	87aa                	mv	a5,a0
+ 166:	b7ed                	j	150 <strcat+0x16>
+
+0000000000000168 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+ 168:	1141                	addi	sp,sp,-16
+ 16a:	e422                	sd	s0,8(sp)
+ 16c:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+ 16e:	00054783          	lbu	a5,0(a0)
+ 172:	cb91                	beqz	a5,186 <strcmp+0x1e>
+ 174:	0005c703          	lbu	a4,0(a1)
+ 178:	00f71763          	bne	a4,a5,186 <strcmp+0x1e>
+    p++, q++;
+ 17c:	0505                	addi	a0,a0,1
+ 17e:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+ 180:	00054783          	lbu	a5,0(a0)
+ 184:	fbe5                	bnez	a5,174 <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+ 186:	0005c503          	lbu	a0,0(a1)
+}
+ 18a:	40a7853b          	subw	a0,a5,a0
+ 18e:	6422                	ld	s0,8(sp)
+ 190:	0141                	addi	sp,sp,16
+ 192:	8082                	ret
+
+0000000000000194 <strlen>:
+
+uint
+strlen(const char *s)
+{
+ 194:	1141                	addi	sp,sp,-16
+ 196:	e422                	sd	s0,8(sp)
+ 198:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 19a:	00054783          	lbu	a5,0(a0)
+ 19e:	cf91                	beqz	a5,1ba <strlen+0x26>
+ 1a0:	0505                	addi	a0,a0,1
+ 1a2:	87aa                	mv	a5,a0
+ 1a4:	4685                	li	a3,1
+ 1a6:	9e89                	subw	a3,a3,a0
+ 1a8:	00f6853b          	addw	a0,a3,a5
+ 1ac:	0785                	addi	a5,a5,1
+ 1ae:	fff7c703          	lbu	a4,-1(a5)
+ 1b2:	fb7d                	bnez	a4,1a8 <strlen+0x14>
+    ;
+  return n;
+}
+ 1b4:	6422                	ld	s0,8(sp)
+ 1b6:	0141                	addi	sp,sp,16
+ 1b8:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 1ba:	4501                	li	a0,0
+ 1bc:	bfe5                	j	1b4 <strlen+0x20>
+
+00000000000001be <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 1be:	1141                	addi	sp,sp,-16
+ 1c0:	e422                	sd	s0,8(sp)
+ 1c2:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 1c4:	ca19                	beqz	a2,1da <memset+0x1c>
+ 1c6:	87aa                	mv	a5,a0
+ 1c8:	1602                	slli	a2,a2,0x20
+ 1ca:	9201                	srli	a2,a2,0x20
+ 1cc:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 1d0:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 1d4:	0785                	addi	a5,a5,1
+ 1d6:	fee79de3          	bne	a5,a4,1d0 <memset+0x12>
+  }
+  return dst;
+}
+ 1da:	6422                	ld	s0,8(sp)
+ 1dc:	0141                	addi	sp,sp,16
+ 1de:	8082                	ret
+
+00000000000001e0 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 1e0:	1141                	addi	sp,sp,-16
+ 1e2:	e422                	sd	s0,8(sp)
+ 1e4:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 1e6:	00054783          	lbu	a5,0(a0)
+ 1ea:	cb99                	beqz	a5,200 <strchr+0x20>
+    if(*s == c)
+ 1ec:	00f58763          	beq	a1,a5,1fa <strchr+0x1a>
+  for(; *s; s++)
+ 1f0:	0505                	addi	a0,a0,1
+ 1f2:	00054783          	lbu	a5,0(a0)
+ 1f6:	fbfd                	bnez	a5,1ec <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 1f8:	4501                	li	a0,0
+}
+ 1fa:	6422                	ld	s0,8(sp)
+ 1fc:	0141                	addi	sp,sp,16
+ 1fe:	8082                	ret
+  return 0;
+ 200:	4501                	li	a0,0
+ 202:	bfe5                	j	1fa <strchr+0x1a>
+
+0000000000000204 <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 204:	711d                	addi	sp,sp,-96
+ 206:	ec86                	sd	ra,88(sp)
+ 208:	e8a2                	sd	s0,80(sp)
+ 20a:	e4a6                	sd	s1,72(sp)
+ 20c:	e0ca                	sd	s2,64(sp)
+ 20e:	fc4e                	sd	s3,56(sp)
+ 210:	f852                	sd	s4,48(sp)
+ 212:	f456                	sd	s5,40(sp)
+ 214:	f05a                	sd	s6,32(sp)
+ 216:	ec5e                	sd	s7,24(sp)
+ 218:	e862                	sd	s8,16(sp)
+ 21a:	1080                	addi	s0,sp,96
+ 21c:	8baa                	mv	s7,a0
+ 21e:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 220:	892a                	mv	s2,a0
+ 222:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 224:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 228:	4b29                	li	s6,10
+ 22a:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 22c:	89a6                	mv	s3,s1
+ 22e:	2485                	addiw	s1,s1,1
+ 230:	0344d763          	bge	s1,s4,25e <gets+0x5a>
+    cc = read(0, &c, 1);
+ 234:	4605                	li	a2,1
+ 236:	85d6                	mv	a1,s5
+ 238:	4501                	li	a0,0
+ 23a:	00000097          	auipc	ra,0x0
+ 23e:	1b8080e7          	jalr	440(ra) # 3f2 <read>
+    if(cc < 1)
+ 242:	00a05e63          	blez	a0,25e <gets+0x5a>
+    buf[i++] = c;
+ 246:	faf44783          	lbu	a5,-81(s0)
+ 24a:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 24e:	01678763          	beq	a5,s6,25c <gets+0x58>
+ 252:	0905                	addi	s2,s2,1
+ 254:	fd879ce3          	bne	a5,s8,22c <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 258:	89a6                	mv	s3,s1
+ 25a:	a011                	j	25e <gets+0x5a>
+ 25c:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 25e:	99de                	add	s3,s3,s7
+ 260:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 264:	855e                	mv	a0,s7
+ 266:	60e6                	ld	ra,88(sp)
+ 268:	6446                	ld	s0,80(sp)
+ 26a:	64a6                	ld	s1,72(sp)
+ 26c:	6906                	ld	s2,64(sp)
+ 26e:	79e2                	ld	s3,56(sp)
+ 270:	7a42                	ld	s4,48(sp)
+ 272:	7aa2                	ld	s5,40(sp)
+ 274:	7b02                	ld	s6,32(sp)
+ 276:	6be2                	ld	s7,24(sp)
+ 278:	6c42                	ld	s8,16(sp)
+ 27a:	6125                	addi	sp,sp,96
+ 27c:	8082                	ret
+
+000000000000027e <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 27e:	1101                	addi	sp,sp,-32
+ 280:	ec06                	sd	ra,24(sp)
+ 282:	e822                	sd	s0,16(sp)
+ 284:	e426                	sd	s1,8(sp)
+ 286:	e04a                	sd	s2,0(sp)
+ 288:	1000                	addi	s0,sp,32
+ 28a:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 28c:	4581                	li	a1,0
+ 28e:	00000097          	auipc	ra,0x0
+ 292:	194080e7          	jalr	404(ra) # 422 <open>
+  if(fd < 0)
+ 296:	02054563          	bltz	a0,2c0 <stat+0x42>
+ 29a:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 29c:	85ca                	mv	a1,s2
+ 29e:	00000097          	auipc	ra,0x0
+ 2a2:	18e080e7          	jalr	398(ra) # 42c <fstat>
+ 2a6:	892a                	mv	s2,a0
+  close(fd);
+ 2a8:	8526                	mv	a0,s1
+ 2aa:	00000097          	auipc	ra,0x0
+ 2ae:	15c080e7          	jalr	348(ra) # 406 <close>
+  return r;
+}
+ 2b2:	854a                	mv	a0,s2
+ 2b4:	60e2                	ld	ra,24(sp)
+ 2b6:	6442                	ld	s0,16(sp)
+ 2b8:	64a2                	ld	s1,8(sp)
+ 2ba:	6902                	ld	s2,0(sp)
+ 2bc:	6105                	addi	sp,sp,32
+ 2be:	8082                	ret
+    return -1;
+ 2c0:	597d                	li	s2,-1
+ 2c2:	bfc5                	j	2b2 <stat+0x34>
+
+00000000000002c4 <atoi>:
+
+int
+atoi(const char *s)
+{
+ 2c4:	1141                	addi	sp,sp,-16
+ 2c6:	e422                	sd	s0,8(sp)
+ 2c8:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 2ca:	00054703          	lbu	a4,0(a0)
+ 2ce:	02d00793          	li	a5,45
+  int neg = 1;
+ 2d2:	4585                	li	a1,1
+  if (*s == '-') {
+ 2d4:	04f70363          	beq	a4,a5,31a <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 2d8:	00054703          	lbu	a4,0(a0)
+ 2dc:	fd07079b          	addiw	a5,a4,-48
+ 2e0:	0ff7f793          	zext.b	a5,a5
+ 2e4:	46a5                	li	a3,9
+ 2e6:	02f6ed63          	bltu	a3,a5,320 <atoi+0x5c>
+  n = 0;
+ 2ea:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 2ec:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 2ee:	0505                	addi	a0,a0,1
+ 2f0:	0026979b          	slliw	a5,a3,0x2
+ 2f4:	9fb5                	addw	a5,a5,a3
+ 2f6:	0017979b          	slliw	a5,a5,0x1
+ 2fa:	9fb9                	addw	a5,a5,a4
+ 2fc:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 300:	00054703          	lbu	a4,0(a0)
+ 304:	fd07079b          	addiw	a5,a4,-48
+ 308:	0ff7f793          	zext.b	a5,a5
+ 30c:	fef671e3          	bgeu	a2,a5,2ee <atoi+0x2a>
+  return n * neg;
+}
+ 310:	02d5853b          	mulw	a0,a1,a3
+ 314:	6422                	ld	s0,8(sp)
+ 316:	0141                	addi	sp,sp,16
+ 318:	8082                	ret
+    s++;
+ 31a:	0505                	addi	a0,a0,1
+    neg = -1;
+ 31c:	55fd                	li	a1,-1
+ 31e:	bf6d                	j	2d8 <atoi+0x14>
+  n = 0;
+ 320:	4681                	li	a3,0
+ 322:	b7fd                	j	310 <atoi+0x4c>
+
+0000000000000324 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 324:	1141                	addi	sp,sp,-16
+ 326:	e422                	sd	s0,8(sp)
+ 328:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 32a:	02b57463          	bgeu	a0,a1,352 <memmove+0x2e>
+    while(n-- > 0)
+ 32e:	00c05f63          	blez	a2,34c <memmove+0x28>
+ 332:	1602                	slli	a2,a2,0x20
+ 334:	9201                	srli	a2,a2,0x20
+ 336:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 33a:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 33c:	0585                	addi	a1,a1,1
+ 33e:	0705                	addi	a4,a4,1
+ 340:	fff5c683          	lbu	a3,-1(a1)
+ 344:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 348:	fee79ae3          	bne	a5,a4,33c <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 34c:	6422                	ld	s0,8(sp)
+ 34e:	0141                	addi	sp,sp,16
+ 350:	8082                	ret
+    dst += n;
+ 352:	00c50733          	add	a4,a0,a2
+    src += n;
+ 356:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 358:	fec05ae3          	blez	a2,34c <memmove+0x28>
+ 35c:	fff6079b          	addiw	a5,a2,-1
+ 360:	1782                	slli	a5,a5,0x20
+ 362:	9381                	srli	a5,a5,0x20
+ 364:	fff7c793          	not	a5,a5
+ 368:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 36a:	15fd                	addi	a1,a1,-1
+ 36c:	177d                	addi	a4,a4,-1
+ 36e:	0005c683          	lbu	a3,0(a1)
+ 372:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 376:	fee79ae3          	bne	a5,a4,36a <memmove+0x46>
+ 37a:	bfc9                	j	34c <memmove+0x28>
+
+000000000000037c <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 37c:	1141                	addi	sp,sp,-16
+ 37e:	e422                	sd	s0,8(sp)
+ 380:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 382:	ca05                	beqz	a2,3b2 <memcmp+0x36>
+ 384:	fff6069b          	addiw	a3,a2,-1
+ 388:	1682                	slli	a3,a3,0x20
+ 38a:	9281                	srli	a3,a3,0x20
+ 38c:	0685                	addi	a3,a3,1
+ 38e:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 390:	00054783          	lbu	a5,0(a0)
+ 394:	0005c703          	lbu	a4,0(a1)
+ 398:	00e79863          	bne	a5,a4,3a8 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 39c:	0505                	addi	a0,a0,1
+    p2++;
+ 39e:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 3a0:	fed518e3          	bne	a0,a3,390 <memcmp+0x14>
+  }
+  return 0;
+ 3a4:	4501                	li	a0,0
+ 3a6:	a019                	j	3ac <memcmp+0x30>
+      return *p1 - *p2;
+ 3a8:	40e7853b          	subw	a0,a5,a4
+}
+ 3ac:	6422                	ld	s0,8(sp)
+ 3ae:	0141                	addi	sp,sp,16
+ 3b0:	8082                	ret
+  return 0;
+ 3b2:	4501                	li	a0,0
+ 3b4:	bfe5                	j	3ac <memcmp+0x30>
+
+00000000000003b6 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 3b6:	1141                	addi	sp,sp,-16
+ 3b8:	e406                	sd	ra,8(sp)
+ 3ba:	e022                	sd	s0,0(sp)
+ 3bc:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 3be:	00000097          	auipc	ra,0x0
+ 3c2:	f66080e7          	jalr	-154(ra) # 324 <memmove>
+}
+ 3c6:	60a2                	ld	ra,8(sp)
+ 3c8:	6402                	ld	s0,0(sp)
+ 3ca:	0141                	addi	sp,sp,16
+ 3cc:	8082                	ret
+
+00000000000003ce <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 3ce:	4885                	li	a7,1
+ ecall
+ 3d0:	00000073          	ecall
+ ret
+ 3d4:	8082                	ret
+
+00000000000003d6 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 3d6:	05d00893          	li	a7,93
+ ecall
+ 3da:	00000073          	ecall
+ ret
+ 3de:	8082                	ret
+
+00000000000003e0 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 3e0:	488d                	li	a7,3
+ ecall
+ 3e2:	00000073          	ecall
+ ret
+ 3e6:	8082                	ret
+
+00000000000003e8 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 3e8:	03b00893          	li	a7,59
+ ecall
+ 3ec:	00000073          	ecall
+ ret
+ 3f0:	8082                	ret
+
+00000000000003f2 <read>:
+.global read
+read:
+ li a7, SYS_read
+ 3f2:	03f00893          	li	a7,63
+ ecall
+ 3f6:	00000073          	ecall
+ ret
+ 3fa:	8082                	ret
+
+00000000000003fc <write>:
+.global write
+write:
+ li a7, SYS_write
+ 3fc:	04000893          	li	a7,64
+ ecall
+ 400:	00000073          	ecall
+ ret
+ 404:	8082                	ret
+
+0000000000000406 <close>:
+.global close
+close:
+ li a7, SYS_close
+ 406:	03900893          	li	a7,57
+ ecall
+ 40a:	00000073          	ecall
+ ret
+ 40e:	8082                	ret
+
+0000000000000410 <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 410:	4899                	li	a7,6
+ ecall
+ 412:	00000073          	ecall
+ ret
+ 416:	8082                	ret
+
+0000000000000418 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 418:	0dd00893          	li	a7,221
+ ecall
+ 41c:	00000073          	ecall
+ ret
+ 420:	8082                	ret
+
+0000000000000422 <open>:
+.global open
+open:
+ li a7, SYS_open
+ 422:	03800893          	li	a7,56
+ ecall
+ 426:	00000073          	ecall
+ ret
+ 42a:	8082                	ret
+
+000000000000042c <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 42c:	05000893          	li	a7,80
+ ecall
+ 430:	00000073          	ecall
+ ret
+ 434:	8082                	ret
+
+0000000000000436 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 436:	02200893          	li	a7,34
+ ecall
+ 43a:	00000073          	ecall
+ ret
+ 43e:	8082                	ret
+
+0000000000000440 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 440:	03100893          	li	a7,49
+ ecall
+ 444:	00000073          	ecall
+ ret
+ 448:	8082                	ret
+
+000000000000044a <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 44a:	48dd                	li	a7,23
+ ecall
+ 44c:	00000073          	ecall
+ ret
+ 450:	8082                	ret
+
+0000000000000452 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 452:	0ac00893          	li	a7,172
+ ecall
+ 456:	00000073          	ecall
+ ret
+ 45a:	8082                	ret
+
+000000000000045c <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 45c:	48b1                	li	a7,12
+ ecall
+ 45e:	00000073          	ecall
+ ret
+ 462:	8082                	ret
+
+0000000000000464 <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 464:	48b5                	li	a7,13
+ ecall
+ 466:	00000073          	ecall
+ ret
+ 46a:	8082                	ret
+
+000000000000046c <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 46c:	48b9                	li	a7,14
+ ecall
+ 46e:	00000073          	ecall
+ ret
+ 472:	8082                	ret
+
+0000000000000474 <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 474:	48d9                	li	a7,22
+ ecall
+ 476:	00000073          	ecall
+ ret
+ 47a:	8082                	ret
+
+000000000000047c <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 47c:	03200893          	li	a7,50
+ ecall
+ 480:	00000073          	ecall
+ ret
+ 484:	8082                	ret
+
+0000000000000486 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 486:	48ed                	li	a7,27
+ ecall
+ 488:	00000073          	ecall
+ ret
+ 48c:	8082                	ret
+
+000000000000048e <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 48e:	48c5                	li	a7,17
+ ecall
+ 490:	00000073          	ecall
+ ret
+ 494:	8082                	ret
+
+0000000000000496 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 496:	07500893          	li	a7,117
+ ecall
+ 49a:	00000073          	ecall
+ ret
+ 49e:	8082                	ret
+
+00000000000004a0 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 4a0:	48c9                	li	a7,18
+ ecall
+ 4a2:	00000073          	ecall
+ ret
+ 4a6:	8082                	ret
+
+00000000000004a8 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 4a8:	48cd                	li	a7,19
+ ecall
+ 4aa:	00000073          	ecall
+ ret
+ 4ae:	8082                	ret
+
+00000000000004b0 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 4b0:	48e9                	li	a7,26
+ ecall
+ 4b2:	00000073          	ecall
+ ret
+ 4b6:	8082                	ret
+
+00000000000004b8 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 4b8:	0d200893          	li	a7,210
+ ecall
+ 4bc:	00000073          	ecall
+ ret
+ 4c0:	8082                	ret
+
+00000000000004c2 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 4c2:	1101                	addi	sp,sp,-32
+ 4c4:	ec06                	sd	ra,24(sp)
+ 4c6:	e822                	sd	s0,16(sp)
+ 4c8:	1000                	addi	s0,sp,32
+ 4ca:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 4ce:	4605                	li	a2,1
+ 4d0:	fef40593          	addi	a1,s0,-17
+ 4d4:	00000097          	auipc	ra,0x0
+ 4d8:	f28080e7          	jalr	-216(ra) # 3fc <write>
+}
+ 4dc:	60e2                	ld	ra,24(sp)
+ 4de:	6442                	ld	s0,16(sp)
+ 4e0:	6105                	addi	sp,sp,32
+ 4e2:	8082                	ret
+
+00000000000004e4 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 4e4:	7139                	addi	sp,sp,-64
+ 4e6:	fc06                	sd	ra,56(sp)
+ 4e8:	f822                	sd	s0,48(sp)
+ 4ea:	f426                	sd	s1,40(sp)
+ 4ec:	f04a                	sd	s2,32(sp)
+ 4ee:	ec4e                	sd	s3,24(sp)
+ 4f0:	0080                	addi	s0,sp,64
+ 4f2:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 4f4:	c299                	beqz	a3,4fa <printint+0x16>
+ 4f6:	0805c863          	bltz	a1,586 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 4fa:	2581                	sext.w	a1,a1
+  neg = 0;
+ 4fc:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 4fe:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 502:	86ce                	mv	a3,s3
+  i = 0;
+ 504:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 506:	2601                	sext.w	a2,a2
+ 508:	00000517          	auipc	a0,0x0
+ 50c:	4e050513          	addi	a0,a0,1248 # 9e8 <digits>
+ 510:	883a                	mv	a6,a4
+ 512:	2705                	addiw	a4,a4,1
+ 514:	02c5f7bb          	remuw	a5,a1,a2
+ 518:	1782                	slli	a5,a5,0x20
+ 51a:	9381                	srli	a5,a5,0x20
+ 51c:	97aa                	add	a5,a5,a0
+ 51e:	0007c783          	lbu	a5,0(a5)
+ 522:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 526:	0005879b          	sext.w	a5,a1
+ 52a:	02c5d5bb          	divuw	a1,a1,a2
+ 52e:	0685                	addi	a3,a3,1
+ 530:	fec7f0e3          	bgeu	a5,a2,510 <printint+0x2c>
+  if(neg)
+ 534:	00088c63          	beqz	a7,54c <printint+0x68>
+    buf[i++] = '-';
+ 538:	fd070793          	addi	a5,a4,-48
+ 53c:	00878733          	add	a4,a5,s0
+ 540:	02d00793          	li	a5,45
+ 544:	fef70823          	sb	a5,-16(a4)
+ 548:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 54c:	02e05663          	blez	a4,578 <printint+0x94>
+ 550:	fc040913          	addi	s2,s0,-64
+ 554:	993a                	add	s2,s2,a4
+ 556:	19fd                	addi	s3,s3,-1
+ 558:	99ba                	add	s3,s3,a4
+ 55a:	377d                	addiw	a4,a4,-1
+ 55c:	1702                	slli	a4,a4,0x20
+ 55e:	9301                	srli	a4,a4,0x20
+ 560:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 564:	fff94583          	lbu	a1,-1(s2)
+ 568:	8526                	mv	a0,s1
+ 56a:	00000097          	auipc	ra,0x0
+ 56e:	f58080e7          	jalr	-168(ra) # 4c2 <putc>
+  while(--i >= 0)
+ 572:	197d                	addi	s2,s2,-1
+ 574:	ff3918e3          	bne	s2,s3,564 <printint+0x80>
+}
+ 578:	70e2                	ld	ra,56(sp)
+ 57a:	7442                	ld	s0,48(sp)
+ 57c:	74a2                	ld	s1,40(sp)
+ 57e:	7902                	ld	s2,32(sp)
+ 580:	69e2                	ld	s3,24(sp)
+ 582:	6121                	addi	sp,sp,64
+ 584:	8082                	ret
+    x = -xx;
+ 586:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 58a:	4885                	li	a7,1
+    x = -xx;
+ 58c:	bf8d                	j	4fe <printint+0x1a>
+
+000000000000058e <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 58e:	7119                	addi	sp,sp,-128
+ 590:	fc86                	sd	ra,120(sp)
+ 592:	f8a2                	sd	s0,112(sp)
+ 594:	f4a6                	sd	s1,104(sp)
+ 596:	f0ca                	sd	s2,96(sp)
+ 598:	ecce                	sd	s3,88(sp)
+ 59a:	e8d2                	sd	s4,80(sp)
+ 59c:	e4d6                	sd	s5,72(sp)
+ 59e:	e0da                	sd	s6,64(sp)
+ 5a0:	fc5e                	sd	s7,56(sp)
+ 5a2:	f862                	sd	s8,48(sp)
+ 5a4:	f466                	sd	s9,40(sp)
+ 5a6:	f06a                	sd	s10,32(sp)
+ 5a8:	ec6e                	sd	s11,24(sp)
+ 5aa:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 5ac:	0005c903          	lbu	s2,0(a1)
+ 5b0:	18090f63          	beqz	s2,74e <vprintf+0x1c0>
+ 5b4:	8aaa                	mv	s5,a0
+ 5b6:	8b32                	mv	s6,a2
+ 5b8:	00158493          	addi	s1,a1,1
+  state = 0;
+ 5bc:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 5be:	02500a13          	li	s4,37
+ 5c2:	4c55                	li	s8,21
+ 5c4:	00000c97          	auipc	s9,0x0
+ 5c8:	3ccc8c93          	addi	s9,s9,972 # 990 <malloc+0x13e>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 5cc:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 5d0:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 5d2:	00000b97          	auipc	s7,0x0
+ 5d6:	416b8b93          	addi	s7,s7,1046 # 9e8 <digits>
+ 5da:	a839                	j	5f8 <vprintf+0x6a>
+        putc(fd, c);
+ 5dc:	85ca                	mv	a1,s2
+ 5de:	8556                	mv	a0,s5
+ 5e0:	00000097          	auipc	ra,0x0
+ 5e4:	ee2080e7          	jalr	-286(ra) # 4c2 <putc>
+ 5e8:	a019                	j	5ee <vprintf+0x60>
+    } else if(state == '%'){
+ 5ea:	01498d63          	beq	s3,s4,604 <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 5ee:	0485                	addi	s1,s1,1
+ 5f0:	fff4c903          	lbu	s2,-1(s1)
+ 5f4:	14090d63          	beqz	s2,74e <vprintf+0x1c0>
+    if(state == 0){
+ 5f8:	fe0999e3          	bnez	s3,5ea <vprintf+0x5c>
+      if(c == '%'){
+ 5fc:	ff4910e3          	bne	s2,s4,5dc <vprintf+0x4e>
+        state = '%';
+ 600:	89d2                	mv	s3,s4
+ 602:	b7f5                	j	5ee <vprintf+0x60>
+      if(c == 'd'){
+ 604:	11490c63          	beq	s2,s4,71c <vprintf+0x18e>
+ 608:	f9d9079b          	addiw	a5,s2,-99
+ 60c:	0ff7f793          	zext.b	a5,a5
+ 610:	10fc6e63          	bltu	s8,a5,72c <vprintf+0x19e>
+ 614:	f9d9079b          	addiw	a5,s2,-99
+ 618:	0ff7f713          	zext.b	a4,a5
+ 61c:	10ec6863          	bltu	s8,a4,72c <vprintf+0x19e>
+ 620:	00271793          	slli	a5,a4,0x2
+ 624:	97e6                	add	a5,a5,s9
+ 626:	439c                	lw	a5,0(a5)
+ 628:	97e6                	add	a5,a5,s9
+ 62a:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 62c:	008b0913          	addi	s2,s6,8
+ 630:	4685                	li	a3,1
+ 632:	4629                	li	a2,10
+ 634:	000b2583          	lw	a1,0(s6)
+ 638:	8556                	mv	a0,s5
+ 63a:	00000097          	auipc	ra,0x0
+ 63e:	eaa080e7          	jalr	-342(ra) # 4e4 <printint>
+ 642:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 644:	4981                	li	s3,0
+ 646:	b765                	j	5ee <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 648:	008b0913          	addi	s2,s6,8
+ 64c:	4681                	li	a3,0
+ 64e:	4629                	li	a2,10
+ 650:	000b2583          	lw	a1,0(s6)
+ 654:	8556                	mv	a0,s5
+ 656:	00000097          	auipc	ra,0x0
+ 65a:	e8e080e7          	jalr	-370(ra) # 4e4 <printint>
+ 65e:	8b4a                	mv	s6,s2
+      state = 0;
+ 660:	4981                	li	s3,0
+ 662:	b771                	j	5ee <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 664:	008b0913          	addi	s2,s6,8
+ 668:	4681                	li	a3,0
+ 66a:	866a                	mv	a2,s10
+ 66c:	000b2583          	lw	a1,0(s6)
+ 670:	8556                	mv	a0,s5
+ 672:	00000097          	auipc	ra,0x0
+ 676:	e72080e7          	jalr	-398(ra) # 4e4 <printint>
+ 67a:	8b4a                	mv	s6,s2
+      state = 0;
+ 67c:	4981                	li	s3,0
+ 67e:	bf85                	j	5ee <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 680:	008b0793          	addi	a5,s6,8
+ 684:	f8f43423          	sd	a5,-120(s0)
+ 688:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 68c:	03000593          	li	a1,48
+ 690:	8556                	mv	a0,s5
+ 692:	00000097          	auipc	ra,0x0
+ 696:	e30080e7          	jalr	-464(ra) # 4c2 <putc>
+  putc(fd, 'x');
+ 69a:	07800593          	li	a1,120
+ 69e:	8556                	mv	a0,s5
+ 6a0:	00000097          	auipc	ra,0x0
+ 6a4:	e22080e7          	jalr	-478(ra) # 4c2 <putc>
+ 6a8:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 6aa:	03c9d793          	srli	a5,s3,0x3c
+ 6ae:	97de                	add	a5,a5,s7
+ 6b0:	0007c583          	lbu	a1,0(a5)
+ 6b4:	8556                	mv	a0,s5
+ 6b6:	00000097          	auipc	ra,0x0
+ 6ba:	e0c080e7          	jalr	-500(ra) # 4c2 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 6be:	0992                	slli	s3,s3,0x4
+ 6c0:	397d                	addiw	s2,s2,-1
+ 6c2:	fe0914e3          	bnez	s2,6aa <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 6c6:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 6ca:	4981                	li	s3,0
+ 6cc:	b70d                	j	5ee <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 6ce:	008b0913          	addi	s2,s6,8
+ 6d2:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 6d6:	02098163          	beqz	s3,6f8 <vprintf+0x16a>
+        while(*s != 0){
+ 6da:	0009c583          	lbu	a1,0(s3)
+ 6de:	c5ad                	beqz	a1,748 <vprintf+0x1ba>
+          putc(fd, *s);
+ 6e0:	8556                	mv	a0,s5
+ 6e2:	00000097          	auipc	ra,0x0
+ 6e6:	de0080e7          	jalr	-544(ra) # 4c2 <putc>
+          s++;
+ 6ea:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 6ec:	0009c583          	lbu	a1,0(s3)
+ 6f0:	f9e5                	bnez	a1,6e0 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 6f2:	8b4a                	mv	s6,s2
+      state = 0;
+ 6f4:	4981                	li	s3,0
+ 6f6:	bde5                	j	5ee <vprintf+0x60>
+          s = "(null)";
+ 6f8:	00000997          	auipc	s3,0x0
+ 6fc:	29098993          	addi	s3,s3,656 # 988 <malloc+0x136>
+        while(*s != 0){
+ 700:	85ee                	mv	a1,s11
+ 702:	bff9                	j	6e0 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 704:	008b0913          	addi	s2,s6,8
+ 708:	000b4583          	lbu	a1,0(s6)
+ 70c:	8556                	mv	a0,s5
+ 70e:	00000097          	auipc	ra,0x0
+ 712:	db4080e7          	jalr	-588(ra) # 4c2 <putc>
+ 716:	8b4a                	mv	s6,s2
+      state = 0;
+ 718:	4981                	li	s3,0
+ 71a:	bdd1                	j	5ee <vprintf+0x60>
+        putc(fd, c);
+ 71c:	85d2                	mv	a1,s4
+ 71e:	8556                	mv	a0,s5
+ 720:	00000097          	auipc	ra,0x0
+ 724:	da2080e7          	jalr	-606(ra) # 4c2 <putc>
+      state = 0;
+ 728:	4981                	li	s3,0
+ 72a:	b5d1                	j	5ee <vprintf+0x60>
+        putc(fd, '%');
+ 72c:	85d2                	mv	a1,s4
+ 72e:	8556                	mv	a0,s5
+ 730:	00000097          	auipc	ra,0x0
+ 734:	d92080e7          	jalr	-622(ra) # 4c2 <putc>
+        putc(fd, c);
+ 738:	85ca                	mv	a1,s2
+ 73a:	8556                	mv	a0,s5
+ 73c:	00000097          	auipc	ra,0x0
+ 740:	d86080e7          	jalr	-634(ra) # 4c2 <putc>
+      state = 0;
+ 744:	4981                	li	s3,0
+ 746:	b565                	j	5ee <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 748:	8b4a                	mv	s6,s2
+      state = 0;
+ 74a:	4981                	li	s3,0
+ 74c:	b54d                	j	5ee <vprintf+0x60>
+    }
+  }
+}
+ 74e:	70e6                	ld	ra,120(sp)
+ 750:	7446                	ld	s0,112(sp)
+ 752:	74a6                	ld	s1,104(sp)
+ 754:	7906                	ld	s2,96(sp)
+ 756:	69e6                	ld	s3,88(sp)
+ 758:	6a46                	ld	s4,80(sp)
+ 75a:	6aa6                	ld	s5,72(sp)
+ 75c:	6b06                	ld	s6,64(sp)
+ 75e:	7be2                	ld	s7,56(sp)
+ 760:	7c42                	ld	s8,48(sp)
+ 762:	7ca2                	ld	s9,40(sp)
+ 764:	7d02                	ld	s10,32(sp)
+ 766:	6de2                	ld	s11,24(sp)
+ 768:	6109                	addi	sp,sp,128
+ 76a:	8082                	ret
+
+000000000000076c <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 76c:	715d                	addi	sp,sp,-80
+ 76e:	ec06                	sd	ra,24(sp)
+ 770:	e822                	sd	s0,16(sp)
+ 772:	1000                	addi	s0,sp,32
+ 774:	e010                	sd	a2,0(s0)
+ 776:	e414                	sd	a3,8(s0)
+ 778:	e818                	sd	a4,16(s0)
+ 77a:	ec1c                	sd	a5,24(s0)
+ 77c:	03043023          	sd	a6,32(s0)
+ 780:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 784:	8622                	mv	a2,s0
+ 786:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 78a:	00000097          	auipc	ra,0x0
+ 78e:	e04080e7          	jalr	-508(ra) # 58e <vprintf>
+}
+ 792:	60e2                	ld	ra,24(sp)
+ 794:	6442                	ld	s0,16(sp)
+ 796:	6161                	addi	sp,sp,80
+ 798:	8082                	ret
+
+000000000000079a <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 79a:	711d                	addi	sp,sp,-96
+ 79c:	ec06                	sd	ra,24(sp)
+ 79e:	e822                	sd	s0,16(sp)
+ 7a0:	1000                	addi	s0,sp,32
+ 7a2:	e40c                	sd	a1,8(s0)
+ 7a4:	e810                	sd	a2,16(s0)
+ 7a6:	ec14                	sd	a3,24(s0)
+ 7a8:	f018                	sd	a4,32(s0)
+ 7aa:	f41c                	sd	a5,40(s0)
+ 7ac:	03043823          	sd	a6,48(s0)
+ 7b0:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 7b4:	00840613          	addi	a2,s0,8
+ 7b8:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 7bc:	85aa                	mv	a1,a0
+ 7be:	4505                	li	a0,1
+ 7c0:	00000097          	auipc	ra,0x0
+ 7c4:	dce080e7          	jalr	-562(ra) # 58e <vprintf>
+}
+ 7c8:	60e2                	ld	ra,24(sp)
+ 7ca:	6442                	ld	s0,16(sp)
+ 7cc:	6125                	addi	sp,sp,96
+ 7ce:	8082                	ret
+
+00000000000007d0 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 7d0:	1141                	addi	sp,sp,-16
+ 7d2:	e422                	sd	s0,8(sp)
+ 7d4:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 7d6:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 7da:	00000797          	auipc	a5,0x0
+ 7de:	4267b783          	ld	a5,1062(a5) # c00 <freep>
+ 7e2:	a02d                	j	80c <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;
+ 7e4:	4618                	lw	a4,8(a2)
+ 7e6:	9f2d                	addw	a4,a4,a1
+ 7e8:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 7ec:	6398                	ld	a4,0(a5)
+ 7ee:	6310                	ld	a2,0(a4)
+ 7f0:	a83d                	j	82e <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 7f2:	ff852703          	lw	a4,-8(a0)
+ 7f6:	9f31                	addw	a4,a4,a2
+ 7f8:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 7fa:	ff053683          	ld	a3,-16(a0)
+ 7fe:	a091                	j	842 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 800:	6398                	ld	a4,0(a5)
+ 802:	00e7e463          	bltu	a5,a4,80a <free+0x3a>
+ 806:	00e6ea63          	bltu	a3,a4,81a <free+0x4a>
+{
+ 80a:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 80c:	fed7fae3          	bgeu	a5,a3,800 <free+0x30>
+ 810:	6398                	ld	a4,0(a5)
+ 812:	00e6e463          	bltu	a3,a4,81a <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 816:	fee7eae3          	bltu	a5,a4,80a <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 81a:	ff852583          	lw	a1,-8(a0)
+ 81e:	6390                	ld	a2,0(a5)
+ 820:	02059813          	slli	a6,a1,0x20
+ 824:	01c85713          	srli	a4,a6,0x1c
+ 828:	9736                	add	a4,a4,a3
+ 82a:	fae60de3          	beq	a2,a4,7e4 <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 82e:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 832:	4790                	lw	a2,8(a5)
+ 834:	02061593          	slli	a1,a2,0x20
+ 838:	01c5d713          	srli	a4,a1,0x1c
+ 83c:	973e                	add	a4,a4,a5
+ 83e:	fae68ae3          	beq	a3,a4,7f2 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 842:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 844:	00000717          	auipc	a4,0x0
+ 848:	3af73e23          	sd	a5,956(a4) # c00 <freep>
+}
+ 84c:	6422                	ld	s0,8(sp)
+ 84e:	0141                	addi	sp,sp,16
+ 850:	8082                	ret
+
+0000000000000852 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 852:	7139                	addi	sp,sp,-64
+ 854:	fc06                	sd	ra,56(sp)
+ 856:	f822                	sd	s0,48(sp)
+ 858:	f426                	sd	s1,40(sp)
+ 85a:	f04a                	sd	s2,32(sp)
+ 85c:	ec4e                	sd	s3,24(sp)
+ 85e:	e852                	sd	s4,16(sp)
+ 860:	e456                	sd	s5,8(sp)
+ 862:	e05a                	sd	s6,0(sp)
+ 864:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 866:	02051493          	slli	s1,a0,0x20
+ 86a:	9081                	srli	s1,s1,0x20
+ 86c:	04bd                	addi	s1,s1,15
+ 86e:	8091                	srli	s1,s1,0x4
+ 870:	00148a1b          	addiw	s4,s1,1
+ 874:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 876:	00000517          	auipc	a0,0x0
+ 87a:	38a53503          	ld	a0,906(a0) # c00 <freep>
+ 87e:	c515                	beqz	a0,8aa <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  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:	04977163          	bgeu	a4,s1,8c6 <malloc+0x74>
+ 888:	89d2                	mv	s3,s4
+ 88a:	000a071b          	sext.w	a4,s4
+ 88e:	6685                	lui	a3,0x1
+ 890:	00d77363          	bgeu	a4,a3,896 <malloc+0x44>
+ 894:	6985                	lui	s3,0x1
+ 896:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 89a:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 89e:	00000917          	auipc	s2,0x0
+ 8a2:	36290913          	addi	s2,s2,866 # c00 <freep>
+  if(p == (char*)-1)
+ 8a6:	5afd                	li	s5,-1
+ 8a8:	a8a5                	j	920 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 8aa:	00000797          	auipc	a5,0x0
+ 8ae:	35678793          	addi	a5,a5,854 # c00 <freep>
+ 8b2:	00000717          	auipc	a4,0x0
+ 8b6:	35670713          	addi	a4,a4,854 # c08 <base>
+ 8ba:	e398                	sd	a4,0(a5)
+ 8bc:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 8be:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 8c2:	87ba                	mv	a5,a4
+ 8c4:	b7d1                	j	888 <malloc+0x36>
+      if(p->s.size == nunits)
+ 8c6:	02e48c63          	beq	s1,a4,8fe <malloc+0xac>
+        p->s.size -= nunits;
+ 8ca:	4147073b          	subw	a4,a4,s4
+ 8ce:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 8d0:	02071693          	slli	a3,a4,0x20
+ 8d4:	01c6d713          	srli	a4,a3,0x1c
+ 8d8:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 8da:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 8de:	00000717          	auipc	a4,0x0
+ 8e2:	32a73123          	sd	a0,802(a4) # c00 <freep>
+      return (void*)(p + 1);
+ 8e6:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 8ea:	70e2                	ld	ra,56(sp)
+ 8ec:	7442                	ld	s0,48(sp)
+ 8ee:	74a2                	ld	s1,40(sp)
+ 8f0:	7902                	ld	s2,32(sp)
+ 8f2:	69e2                	ld	s3,24(sp)
+ 8f4:	6a42                	ld	s4,16(sp)
+ 8f6:	6aa2                	ld	s5,8(sp)
+ 8f8:	6b02                	ld	s6,0(sp)
+ 8fa:	6121                	addi	sp,sp,64
+ 8fc:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 8fe:	6398                	ld	a4,0(a5)
+ 900:	e118                	sd	a4,0(a0)
+ 902:	bff1                	j	8de <malloc+0x8c>
+  hp->s.size = nu;
+ 904:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 908:	0541                	addi	a0,a0,16
+ 90a:	00000097          	auipc	ra,0x0
+ 90e:	ec6080e7          	jalr	-314(ra) # 7d0 <free>
+  return freep;
+ 912:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 916:	d971                	beqz	a0,8ea <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 918:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 91a:	4798                	lw	a4,8(a5)
+ 91c:	fa9775e3          	bgeu	a4,s1,8c6 <malloc+0x74>
+    if(p == freep)
+ 920:	00093703          	ld	a4,0(s2)
+ 924:	853e                	mv	a0,a5
+ 926:	fef719e3          	bne	a4,a5,918 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 92a:	854e                	mv	a0,s3
+ 92c:	00000097          	auipc	ra,0x0
+ 930:	b30080e7          	jalr	-1232(ra) # 45c <sbrk>
+  if(p == (char*)-1)
+ 934:	fd5518e3          	bne	a0,s5,904 <malloc+0xb2>
+        return 0;
+ 938:	4501                	li	a0,0
+ 93a:	bf45                	j	8ea <malloc+0x98>
diff --git a/xv6-user/cat.c b/xv6-user/cat.c
new file mode 100644
index 0000000000000000000000000000000000000000..f9f86b5b220a93cf6c79a24fe1ac9909ddabacfd
--- /dev/null
+++ b/xv6-user/cat.c
@@ -0,0 +1,43 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+char buf[512];
+
+void
+cat(int fd)
+{
+  int n;
+
+  while((n = read(fd, buf, sizeof(buf))) > 0) {
+    if (write(1, buf, n) != n) {
+      fprintf(2, "cat: write error\n");
+      exit(1);
+    }
+  }
+  if(n < 0){
+    fprintf(2, "cat: read error\n");
+    exit(1);
+  }
+}
+
+int
+main(int argc, char *argv[])
+{
+  int fd, i;
+
+  if(argc <= 1){
+    cat(0);
+    exit(0);
+  }
+
+  for(i = 1; i < argc; i++){
+    if((fd = open(argv[i], 0)) < 0){
+      fprintf(2, "cat: cannot open %s\n", argv[i]);
+      exit(1);
+    }
+    cat(fd);
+    close(fd);
+  }
+  exit(0);
+}
diff --git a/xv6-user/cat.d b/xv6-user/cat.d
new file mode 100644
index 0000000000000000000000000000000000000000..2cc0456a35fe77d5e62d646ccd307f00efa3092e
--- /dev/null
+++ b/xv6-user/cat.d
@@ -0,0 +1,2 @@
+xv6-user/cat.o: xv6-user/cat.c kernel/include/types.h \
+ kernel/include/stat.h xv6-user/user.h kernel/include/fcntl.h
diff --git a/xv6-user/cat.o b/xv6-user/cat.o
new file mode 100644
index 0000000000000000000000000000000000000000..0f48dc9f082e60f9672bc8158d4692647607859b
Binary files /dev/null and b/xv6-user/cat.o differ
diff --git a/xv6-user/cat.sym b/xv6-user/cat.sym
new file mode 100644
index 0000000000000000000000000000000000000000..674cd1cbb12f0113134a58126f0a5649f38c7f21
--- /dev/null
+++ b/xv6-user/cat.sym
@@ -0,0 +1,78 @@
+0000000000000000 .text
+0000000000000940 .rodata
+0000000000000a00 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 cat.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+00000000000004c2 putc
+00000000000004e4 printint
+00000000000009e8 digits
+0000000000000000 umalloc.c
+0000000000000c00 freep
+0000000000000c08 base
+000000000000011e strcpy
+000000000000079a printf
+00000000000011f9 __global_pointer$
+000000000000047c dev
+0000000000000324 memmove
+00000000000004a0 trace
+0000000000000204 gets
+00000000000009f9 __SDATA_BEGIN__
+0000000000000452 getpid
+00000000000003b6 memcpy
+0000000000000000 cat
+0000000000000852 malloc
+0000000000000496 remove
+0000000000000464 sleep
+00000000000004a8 sysinfo
+0000000000000486 readdir
+00000000000003e8 pipe
+00000000000004b0 rename
+00000000000003fc write
+000000000000042c fstat
+000000000000076c fprintf
+0000000000000410 kill
+000000000000013a strcat
+000000000000058e vprintf
+0000000000000440 chdir
+0000000000000418 exec
+00000000000003e0 wait
+00000000000003f2 read
+000000000000037c memcmp
+00000000000003ce fork
+0000000000000c18 __BSS_END__
+000000000000045c sbrk
+0000000000000474 test_proc
+000000000000046c uptime
+00000000000009f9 __bss_start
+00000000000001be memset
+000000000000008a main
+0000000000000168 strcmp
+00000000000004b8 shutdown
+000000000000044a dup
+000000000000048e getcwd
+0000000000000a00 buf
+00000000000009f9 __DATA_BEGIN__
+000000000000027e stat
+00000000000009f9 _edata
+0000000000000c18 _end
+00000000000003d6 exit
+00000000000002c4 atoi
+0000000000000194 strlen
+0000000000000422 open
+00000000000001e0 strchr
+0000000000000436 mkdir
+0000000000000406 close
+00000000000007d0 free
diff --git a/xv6-user/echo.asm b/xv6-user/echo.asm
new file mode 100644
index 0000000000000000000000000000000000000000..7d27438ab278ff36dfb7c182f8ab552a84e23304
--- /dev/null
+++ b/xv6-user/echo.asm
@@ -0,0 +1,1453 @@
+
+xv6-user/_echo:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+   0:	7179                	addi	sp,sp,-48
+   2:	f406                	sd	ra,40(sp)
+   4:	f022                	sd	s0,32(sp)
+   6:	ec26                	sd	s1,24(sp)
+   8:	e84a                	sd	s2,16(sp)
+   a:	e44e                	sd	s3,8(sp)
+   c:	e052                	sd	s4,0(sp)
+   e:	1800                	addi	s0,sp,48
+  int i;
+
+  for(i = 1; i < argc; i++){
+  10:	4785                	li	a5,1
+  12:	06a7d463          	bge	a5,a0,7a <main+0x7a>
+  16:	00858493          	addi	s1,a1,8
+  1a:	ffe5099b          	addiw	s3,a0,-2
+  1e:	02099793          	slli	a5,s3,0x20
+  22:	01d7d993          	srli	s3,a5,0x1d
+  26:	05c1                	addi	a1,a1,16
+  28:	99ae                	add	s3,s3,a1
+    write(1, argv[i], strlen(argv[i]));
+    if(i + 1 < argc){
+      write(1, " ", 1);
+  2a:	00001a17          	auipc	s4,0x1
+  2e:	87ea0a13          	addi	s4,s4,-1922 # 8a8 <malloc+0xf0>
+    write(1, argv[i], strlen(argv[i]));
+  32:	0004b903          	ld	s2,0(s1)
+  36:	854a                	mv	a0,s2
+  38:	00000097          	auipc	ra,0x0
+  3c:	0c2080e7          	jalr	194(ra) # fa <strlen>
+  40:	0005061b          	sext.w	a2,a0
+  44:	85ca                	mv	a1,s2
+  46:	4505                	li	a0,1
+  48:	00000097          	auipc	ra,0x0
+  4c:	31a080e7          	jalr	794(ra) # 362 <write>
+    if(i + 1 < argc){
+  50:	04a1                	addi	s1,s1,8
+  52:	01348a63          	beq	s1,s3,66 <main+0x66>
+      write(1, " ", 1);
+  56:	4605                	li	a2,1
+  58:	85d2                	mv	a1,s4
+  5a:	4505                	li	a0,1
+  5c:	00000097          	auipc	ra,0x0
+  60:	306080e7          	jalr	774(ra) # 362 <write>
+  for(i = 1; i < argc; i++){
+  64:	b7f9                	j	32 <main+0x32>
+    } else {
+      write(1, "\n", 1);
+  66:	4605                	li	a2,1
+  68:	00001597          	auipc	a1,0x1
+  6c:	84858593          	addi	a1,a1,-1976 # 8b0 <malloc+0xf8>
+  70:	4505                	li	a0,1
+  72:	00000097          	auipc	ra,0x0
+  76:	2f0080e7          	jalr	752(ra) # 362 <write>
+    }
+  }
+  exit(0);
+  7a:	4501                	li	a0,0
+  7c:	00000097          	auipc	ra,0x0
+  80:	2c0080e7          	jalr	704(ra) # 33c <exit>
+
+0000000000000084 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+  84:	1141                	addi	sp,sp,-16
+  86:	e422                	sd	s0,8(sp)
+  88:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+  8a:	87aa                	mv	a5,a0
+  8c:	0585                	addi	a1,a1,1
+  8e:	0785                	addi	a5,a5,1
+  90:	fff5c703          	lbu	a4,-1(a1)
+  94:	fee78fa3          	sb	a4,-1(a5)
+  98:	fb75                	bnez	a4,8c <strcpy+0x8>
+    ;
+  return os;
+}
+  9a:	6422                	ld	s0,8(sp)
+  9c:	0141                	addi	sp,sp,16
+  9e:	8082                	ret
+
+00000000000000a0 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+  a0:	1141                	addi	sp,sp,-16
+  a2:	e422                	sd	s0,8(sp)
+  a4:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+  a6:	00054783          	lbu	a5,0(a0)
+  aa:	c385                	beqz	a5,ca <strcat+0x2a>
+  ac:	87aa                	mv	a5,a0
+    s++;
+  ae:	0785                	addi	a5,a5,1
+  while(*s)
+  b0:	0007c703          	lbu	a4,0(a5)
+  b4:	ff6d                	bnez	a4,ae <strcat+0xe>
+  while((*s++ = *t++))
+  b6:	0585                	addi	a1,a1,1
+  b8:	0785                	addi	a5,a5,1
+  ba:	fff5c703          	lbu	a4,-1(a1)
+  be:	fee78fa3          	sb	a4,-1(a5)
+  c2:	fb75                	bnez	a4,b6 <strcat+0x16>
+    ;
+  return os;
+}
+  c4:	6422                	ld	s0,8(sp)
+  c6:	0141                	addi	sp,sp,16
+  c8:	8082                	ret
+  while(*s)
+  ca:	87aa                	mv	a5,a0
+  cc:	b7ed                	j	b6 <strcat+0x16>
+
+00000000000000ce <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+  ce:	1141                	addi	sp,sp,-16
+  d0:	e422                	sd	s0,8(sp)
+  d2:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+  d4:	00054783          	lbu	a5,0(a0)
+  d8:	cb91                	beqz	a5,ec <strcmp+0x1e>
+  da:	0005c703          	lbu	a4,0(a1)
+  de:	00f71763          	bne	a4,a5,ec <strcmp+0x1e>
+    p++, q++;
+  e2:	0505                	addi	a0,a0,1
+  e4:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+  e6:	00054783          	lbu	a5,0(a0)
+  ea:	fbe5                	bnez	a5,da <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+  ec:	0005c503          	lbu	a0,0(a1)
+}
+  f0:	40a7853b          	subw	a0,a5,a0
+  f4:	6422                	ld	s0,8(sp)
+  f6:	0141                	addi	sp,sp,16
+  f8:	8082                	ret
+
+00000000000000fa <strlen>:
+
+uint
+strlen(const char *s)
+{
+  fa:	1141                	addi	sp,sp,-16
+  fc:	e422                	sd	s0,8(sp)
+  fe:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 100:	00054783          	lbu	a5,0(a0)
+ 104:	cf91                	beqz	a5,120 <strlen+0x26>
+ 106:	0505                	addi	a0,a0,1
+ 108:	87aa                	mv	a5,a0
+ 10a:	4685                	li	a3,1
+ 10c:	9e89                	subw	a3,a3,a0
+ 10e:	00f6853b          	addw	a0,a3,a5
+ 112:	0785                	addi	a5,a5,1
+ 114:	fff7c703          	lbu	a4,-1(a5)
+ 118:	fb7d                	bnez	a4,10e <strlen+0x14>
+    ;
+  return n;
+}
+ 11a:	6422                	ld	s0,8(sp)
+ 11c:	0141                	addi	sp,sp,16
+ 11e:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 120:	4501                	li	a0,0
+ 122:	bfe5                	j	11a <strlen+0x20>
+
+0000000000000124 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 124:	1141                	addi	sp,sp,-16
+ 126:	e422                	sd	s0,8(sp)
+ 128:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 12a:	ca19                	beqz	a2,140 <memset+0x1c>
+ 12c:	87aa                	mv	a5,a0
+ 12e:	1602                	slli	a2,a2,0x20
+ 130:	9201                	srli	a2,a2,0x20
+ 132:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 136:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 13a:	0785                	addi	a5,a5,1
+ 13c:	fee79de3          	bne	a5,a4,136 <memset+0x12>
+  }
+  return dst;
+}
+ 140:	6422                	ld	s0,8(sp)
+ 142:	0141                	addi	sp,sp,16
+ 144:	8082                	ret
+
+0000000000000146 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 146:	1141                	addi	sp,sp,-16
+ 148:	e422                	sd	s0,8(sp)
+ 14a:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 14c:	00054783          	lbu	a5,0(a0)
+ 150:	cb99                	beqz	a5,166 <strchr+0x20>
+    if(*s == c)
+ 152:	00f58763          	beq	a1,a5,160 <strchr+0x1a>
+  for(; *s; s++)
+ 156:	0505                	addi	a0,a0,1
+ 158:	00054783          	lbu	a5,0(a0)
+ 15c:	fbfd                	bnez	a5,152 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 15e:	4501                	li	a0,0
+}
+ 160:	6422                	ld	s0,8(sp)
+ 162:	0141                	addi	sp,sp,16
+ 164:	8082                	ret
+  return 0;
+ 166:	4501                	li	a0,0
+ 168:	bfe5                	j	160 <strchr+0x1a>
+
+000000000000016a <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 16a:	711d                	addi	sp,sp,-96
+ 16c:	ec86                	sd	ra,88(sp)
+ 16e:	e8a2                	sd	s0,80(sp)
+ 170:	e4a6                	sd	s1,72(sp)
+ 172:	e0ca                	sd	s2,64(sp)
+ 174:	fc4e                	sd	s3,56(sp)
+ 176:	f852                	sd	s4,48(sp)
+ 178:	f456                	sd	s5,40(sp)
+ 17a:	f05a                	sd	s6,32(sp)
+ 17c:	ec5e                	sd	s7,24(sp)
+ 17e:	e862                	sd	s8,16(sp)
+ 180:	1080                	addi	s0,sp,96
+ 182:	8baa                	mv	s7,a0
+ 184:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 186:	892a                	mv	s2,a0
+ 188:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 18a:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 18e:	4b29                	li	s6,10
+ 190:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 192:	89a6                	mv	s3,s1
+ 194:	2485                	addiw	s1,s1,1
+ 196:	0344d763          	bge	s1,s4,1c4 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 19a:	4605                	li	a2,1
+ 19c:	85d6                	mv	a1,s5
+ 19e:	4501                	li	a0,0
+ 1a0:	00000097          	auipc	ra,0x0
+ 1a4:	1b8080e7          	jalr	440(ra) # 358 <read>
+    if(cc < 1)
+ 1a8:	00a05e63          	blez	a0,1c4 <gets+0x5a>
+    buf[i++] = c;
+ 1ac:	faf44783          	lbu	a5,-81(s0)
+ 1b0:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 1b4:	01678763          	beq	a5,s6,1c2 <gets+0x58>
+ 1b8:	0905                	addi	s2,s2,1
+ 1ba:	fd879ce3          	bne	a5,s8,192 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 1be:	89a6                	mv	s3,s1
+ 1c0:	a011                	j	1c4 <gets+0x5a>
+ 1c2:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 1c4:	99de                	add	s3,s3,s7
+ 1c6:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 1ca:	855e                	mv	a0,s7
+ 1cc:	60e6                	ld	ra,88(sp)
+ 1ce:	6446                	ld	s0,80(sp)
+ 1d0:	64a6                	ld	s1,72(sp)
+ 1d2:	6906                	ld	s2,64(sp)
+ 1d4:	79e2                	ld	s3,56(sp)
+ 1d6:	7a42                	ld	s4,48(sp)
+ 1d8:	7aa2                	ld	s5,40(sp)
+ 1da:	7b02                	ld	s6,32(sp)
+ 1dc:	6be2                	ld	s7,24(sp)
+ 1de:	6c42                	ld	s8,16(sp)
+ 1e0:	6125                	addi	sp,sp,96
+ 1e2:	8082                	ret
+
+00000000000001e4 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 1e4:	1101                	addi	sp,sp,-32
+ 1e6:	ec06                	sd	ra,24(sp)
+ 1e8:	e822                	sd	s0,16(sp)
+ 1ea:	e426                	sd	s1,8(sp)
+ 1ec:	e04a                	sd	s2,0(sp)
+ 1ee:	1000                	addi	s0,sp,32
+ 1f0:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 1f2:	4581                	li	a1,0
+ 1f4:	00000097          	auipc	ra,0x0
+ 1f8:	194080e7          	jalr	404(ra) # 388 <open>
+  if(fd < 0)
+ 1fc:	02054563          	bltz	a0,226 <stat+0x42>
+ 200:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 202:	85ca                	mv	a1,s2
+ 204:	00000097          	auipc	ra,0x0
+ 208:	18e080e7          	jalr	398(ra) # 392 <fstat>
+ 20c:	892a                	mv	s2,a0
+  close(fd);
+ 20e:	8526                	mv	a0,s1
+ 210:	00000097          	auipc	ra,0x0
+ 214:	15c080e7          	jalr	348(ra) # 36c <close>
+  return r;
+}
+ 218:	854a                	mv	a0,s2
+ 21a:	60e2                	ld	ra,24(sp)
+ 21c:	6442                	ld	s0,16(sp)
+ 21e:	64a2                	ld	s1,8(sp)
+ 220:	6902                	ld	s2,0(sp)
+ 222:	6105                	addi	sp,sp,32
+ 224:	8082                	ret
+    return -1;
+ 226:	597d                	li	s2,-1
+ 228:	bfc5                	j	218 <stat+0x34>
+
+000000000000022a <atoi>:
+
+int
+atoi(const char *s)
+{
+ 22a:	1141                	addi	sp,sp,-16
+ 22c:	e422                	sd	s0,8(sp)
+ 22e:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 230:	00054703          	lbu	a4,0(a0)
+ 234:	02d00793          	li	a5,45
+  int neg = 1;
+ 238:	4585                	li	a1,1
+  if (*s == '-') {
+ 23a:	04f70363          	beq	a4,a5,280 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 23e:	00054703          	lbu	a4,0(a0)
+ 242:	fd07079b          	addiw	a5,a4,-48
+ 246:	0ff7f793          	zext.b	a5,a5
+ 24a:	46a5                	li	a3,9
+ 24c:	02f6ed63          	bltu	a3,a5,286 <atoi+0x5c>
+  n = 0;
+ 250:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 252:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 254:	0505                	addi	a0,a0,1
+ 256:	0026979b          	slliw	a5,a3,0x2
+ 25a:	9fb5                	addw	a5,a5,a3
+ 25c:	0017979b          	slliw	a5,a5,0x1
+ 260:	9fb9                	addw	a5,a5,a4
+ 262:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 266:	00054703          	lbu	a4,0(a0)
+ 26a:	fd07079b          	addiw	a5,a4,-48
+ 26e:	0ff7f793          	zext.b	a5,a5
+ 272:	fef671e3          	bgeu	a2,a5,254 <atoi+0x2a>
+  return n * neg;
+}
+ 276:	02d5853b          	mulw	a0,a1,a3
+ 27a:	6422                	ld	s0,8(sp)
+ 27c:	0141                	addi	sp,sp,16
+ 27e:	8082                	ret
+    s++;
+ 280:	0505                	addi	a0,a0,1
+    neg = -1;
+ 282:	55fd                	li	a1,-1
+ 284:	bf6d                	j	23e <atoi+0x14>
+  n = 0;
+ 286:	4681                	li	a3,0
+ 288:	b7fd                	j	276 <atoi+0x4c>
+
+000000000000028a <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 28a:	1141                	addi	sp,sp,-16
+ 28c:	e422                	sd	s0,8(sp)
+ 28e:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 290:	02b57463          	bgeu	a0,a1,2b8 <memmove+0x2e>
+    while(n-- > 0)
+ 294:	00c05f63          	blez	a2,2b2 <memmove+0x28>
+ 298:	1602                	slli	a2,a2,0x20
+ 29a:	9201                	srli	a2,a2,0x20
+ 29c:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 2a0:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 2a2:	0585                	addi	a1,a1,1
+ 2a4:	0705                	addi	a4,a4,1
+ 2a6:	fff5c683          	lbu	a3,-1(a1)
+ 2aa:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 2ae:	fee79ae3          	bne	a5,a4,2a2 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 2b2:	6422                	ld	s0,8(sp)
+ 2b4:	0141                	addi	sp,sp,16
+ 2b6:	8082                	ret
+    dst += n;
+ 2b8:	00c50733          	add	a4,a0,a2
+    src += n;
+ 2bc:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 2be:	fec05ae3          	blez	a2,2b2 <memmove+0x28>
+ 2c2:	fff6079b          	addiw	a5,a2,-1
+ 2c6:	1782                	slli	a5,a5,0x20
+ 2c8:	9381                	srli	a5,a5,0x20
+ 2ca:	fff7c793          	not	a5,a5
+ 2ce:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 2d0:	15fd                	addi	a1,a1,-1
+ 2d2:	177d                	addi	a4,a4,-1
+ 2d4:	0005c683          	lbu	a3,0(a1)
+ 2d8:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 2dc:	fee79ae3          	bne	a5,a4,2d0 <memmove+0x46>
+ 2e0:	bfc9                	j	2b2 <memmove+0x28>
+
+00000000000002e2 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 2e2:	1141                	addi	sp,sp,-16
+ 2e4:	e422                	sd	s0,8(sp)
+ 2e6:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 2e8:	ca05                	beqz	a2,318 <memcmp+0x36>
+ 2ea:	fff6069b          	addiw	a3,a2,-1
+ 2ee:	1682                	slli	a3,a3,0x20
+ 2f0:	9281                	srli	a3,a3,0x20
+ 2f2:	0685                	addi	a3,a3,1
+ 2f4:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 2f6:	00054783          	lbu	a5,0(a0)
+ 2fa:	0005c703          	lbu	a4,0(a1)
+ 2fe:	00e79863          	bne	a5,a4,30e <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 302:	0505                	addi	a0,a0,1
+    p2++;
+ 304:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 306:	fed518e3          	bne	a0,a3,2f6 <memcmp+0x14>
+  }
+  return 0;
+ 30a:	4501                	li	a0,0
+ 30c:	a019                	j	312 <memcmp+0x30>
+      return *p1 - *p2;
+ 30e:	40e7853b          	subw	a0,a5,a4
+}
+ 312:	6422                	ld	s0,8(sp)
+ 314:	0141                	addi	sp,sp,16
+ 316:	8082                	ret
+  return 0;
+ 318:	4501                	li	a0,0
+ 31a:	bfe5                	j	312 <memcmp+0x30>
+
+000000000000031c <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 31c:	1141                	addi	sp,sp,-16
+ 31e:	e406                	sd	ra,8(sp)
+ 320:	e022                	sd	s0,0(sp)
+ 322:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 324:	00000097          	auipc	ra,0x0
+ 328:	f66080e7          	jalr	-154(ra) # 28a <memmove>
+}
+ 32c:	60a2                	ld	ra,8(sp)
+ 32e:	6402                	ld	s0,0(sp)
+ 330:	0141                	addi	sp,sp,16
+ 332:	8082                	ret
+
+0000000000000334 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 334:	4885                	li	a7,1
+ ecall
+ 336:	00000073          	ecall
+ ret
+ 33a:	8082                	ret
+
+000000000000033c <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 33c:	05d00893          	li	a7,93
+ ecall
+ 340:	00000073          	ecall
+ ret
+ 344:	8082                	ret
+
+0000000000000346 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 346:	488d                	li	a7,3
+ ecall
+ 348:	00000073          	ecall
+ ret
+ 34c:	8082                	ret
+
+000000000000034e <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 34e:	03b00893          	li	a7,59
+ ecall
+ 352:	00000073          	ecall
+ ret
+ 356:	8082                	ret
+
+0000000000000358 <read>:
+.global read
+read:
+ li a7, SYS_read
+ 358:	03f00893          	li	a7,63
+ ecall
+ 35c:	00000073          	ecall
+ ret
+ 360:	8082                	ret
+
+0000000000000362 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 362:	04000893          	li	a7,64
+ ecall
+ 366:	00000073          	ecall
+ ret
+ 36a:	8082                	ret
+
+000000000000036c <close>:
+.global close
+close:
+ li a7, SYS_close
+ 36c:	03900893          	li	a7,57
+ ecall
+ 370:	00000073          	ecall
+ ret
+ 374:	8082                	ret
+
+0000000000000376 <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 376:	4899                	li	a7,6
+ ecall
+ 378:	00000073          	ecall
+ ret
+ 37c:	8082                	ret
+
+000000000000037e <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 37e:	0dd00893          	li	a7,221
+ ecall
+ 382:	00000073          	ecall
+ ret
+ 386:	8082                	ret
+
+0000000000000388 <open>:
+.global open
+open:
+ li a7, SYS_open
+ 388:	03800893          	li	a7,56
+ ecall
+ 38c:	00000073          	ecall
+ ret
+ 390:	8082                	ret
+
+0000000000000392 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 392:	05000893          	li	a7,80
+ ecall
+ 396:	00000073          	ecall
+ ret
+ 39a:	8082                	ret
+
+000000000000039c <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 39c:	02200893          	li	a7,34
+ ecall
+ 3a0:	00000073          	ecall
+ ret
+ 3a4:	8082                	ret
+
+00000000000003a6 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 3a6:	03100893          	li	a7,49
+ ecall
+ 3aa:	00000073          	ecall
+ ret
+ 3ae:	8082                	ret
+
+00000000000003b0 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 3b0:	48dd                	li	a7,23
+ ecall
+ 3b2:	00000073          	ecall
+ ret
+ 3b6:	8082                	ret
+
+00000000000003b8 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 3b8:	0ac00893          	li	a7,172
+ ecall
+ 3bc:	00000073          	ecall
+ ret
+ 3c0:	8082                	ret
+
+00000000000003c2 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 3c2:	48b1                	li	a7,12
+ ecall
+ 3c4:	00000073          	ecall
+ ret
+ 3c8:	8082                	ret
+
+00000000000003ca <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 3ca:	48b5                	li	a7,13
+ ecall
+ 3cc:	00000073          	ecall
+ ret
+ 3d0:	8082                	ret
+
+00000000000003d2 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 3d2:	48b9                	li	a7,14
+ ecall
+ 3d4:	00000073          	ecall
+ ret
+ 3d8:	8082                	ret
+
+00000000000003da <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 3da:	48d9                	li	a7,22
+ ecall
+ 3dc:	00000073          	ecall
+ ret
+ 3e0:	8082                	ret
+
+00000000000003e2 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 3e2:	03200893          	li	a7,50
+ ecall
+ 3e6:	00000073          	ecall
+ ret
+ 3ea:	8082                	ret
+
+00000000000003ec <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 3ec:	48ed                	li	a7,27
+ ecall
+ 3ee:	00000073          	ecall
+ ret
+ 3f2:	8082                	ret
+
+00000000000003f4 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 3f4:	48c5                	li	a7,17
+ ecall
+ 3f6:	00000073          	ecall
+ ret
+ 3fa:	8082                	ret
+
+00000000000003fc <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 3fc:	07500893          	li	a7,117
+ ecall
+ 400:	00000073          	ecall
+ ret
+ 404:	8082                	ret
+
+0000000000000406 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 406:	48c9                	li	a7,18
+ ecall
+ 408:	00000073          	ecall
+ ret
+ 40c:	8082                	ret
+
+000000000000040e <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 40e:	48cd                	li	a7,19
+ ecall
+ 410:	00000073          	ecall
+ ret
+ 414:	8082                	ret
+
+0000000000000416 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 416:	48e9                	li	a7,26
+ ecall
+ 418:	00000073          	ecall
+ ret
+ 41c:	8082                	ret
+
+000000000000041e <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 41e:	0d200893          	li	a7,210
+ ecall
+ 422:	00000073          	ecall
+ ret
+ 426:	8082                	ret
+
+0000000000000428 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 428:	1101                	addi	sp,sp,-32
+ 42a:	ec06                	sd	ra,24(sp)
+ 42c:	e822                	sd	s0,16(sp)
+ 42e:	1000                	addi	s0,sp,32
+ 430:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 434:	4605                	li	a2,1
+ 436:	fef40593          	addi	a1,s0,-17
+ 43a:	00000097          	auipc	ra,0x0
+ 43e:	f28080e7          	jalr	-216(ra) # 362 <write>
+}
+ 442:	60e2                	ld	ra,24(sp)
+ 444:	6442                	ld	s0,16(sp)
+ 446:	6105                	addi	sp,sp,32
+ 448:	8082                	ret
+
+000000000000044a <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 44a:	7139                	addi	sp,sp,-64
+ 44c:	fc06                	sd	ra,56(sp)
+ 44e:	f822                	sd	s0,48(sp)
+ 450:	f426                	sd	s1,40(sp)
+ 452:	f04a                	sd	s2,32(sp)
+ 454:	ec4e                	sd	s3,24(sp)
+ 456:	0080                	addi	s0,sp,64
+ 458:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 45a:	c299                	beqz	a3,460 <printint+0x16>
+ 45c:	0805c863          	bltz	a1,4ec <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 460:	2581                	sext.w	a1,a1
+  neg = 0;
+ 462:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 464:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 468:	86ce                	mv	a3,s3
+  i = 0;
+ 46a:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 46c:	2601                	sext.w	a2,a2
+ 46e:	00000517          	auipc	a0,0x0
+ 472:	4aa50513          	addi	a0,a0,1194 # 918 <digits>
+ 476:	883a                	mv	a6,a4
+ 478:	2705                	addiw	a4,a4,1
+ 47a:	02c5f7bb          	remuw	a5,a1,a2
+ 47e:	1782                	slli	a5,a5,0x20
+ 480:	9381                	srli	a5,a5,0x20
+ 482:	97aa                	add	a5,a5,a0
+ 484:	0007c783          	lbu	a5,0(a5)
+ 488:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 48c:	0005879b          	sext.w	a5,a1
+ 490:	02c5d5bb          	divuw	a1,a1,a2
+ 494:	0685                	addi	a3,a3,1
+ 496:	fec7f0e3          	bgeu	a5,a2,476 <printint+0x2c>
+  if(neg)
+ 49a:	00088c63          	beqz	a7,4b2 <printint+0x68>
+    buf[i++] = '-';
+ 49e:	fd070793          	addi	a5,a4,-48
+ 4a2:	00878733          	add	a4,a5,s0
+ 4a6:	02d00793          	li	a5,45
+ 4aa:	fef70823          	sb	a5,-16(a4)
+ 4ae:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 4b2:	02e05663          	blez	a4,4de <printint+0x94>
+ 4b6:	fc040913          	addi	s2,s0,-64
+ 4ba:	993a                	add	s2,s2,a4
+ 4bc:	19fd                	addi	s3,s3,-1
+ 4be:	99ba                	add	s3,s3,a4
+ 4c0:	377d                	addiw	a4,a4,-1
+ 4c2:	1702                	slli	a4,a4,0x20
+ 4c4:	9301                	srli	a4,a4,0x20
+ 4c6:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 4ca:	fff94583          	lbu	a1,-1(s2)
+ 4ce:	8526                	mv	a0,s1
+ 4d0:	00000097          	auipc	ra,0x0
+ 4d4:	f58080e7          	jalr	-168(ra) # 428 <putc>
+  while(--i >= 0)
+ 4d8:	197d                	addi	s2,s2,-1
+ 4da:	ff3918e3          	bne	s2,s3,4ca <printint+0x80>
+}
+ 4de:	70e2                	ld	ra,56(sp)
+ 4e0:	7442                	ld	s0,48(sp)
+ 4e2:	74a2                	ld	s1,40(sp)
+ 4e4:	7902                	ld	s2,32(sp)
+ 4e6:	69e2                	ld	s3,24(sp)
+ 4e8:	6121                	addi	sp,sp,64
+ 4ea:	8082                	ret
+    x = -xx;
+ 4ec:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 4f0:	4885                	li	a7,1
+    x = -xx;
+ 4f2:	bf8d                	j	464 <printint+0x1a>
+
+00000000000004f4 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 4f4:	7119                	addi	sp,sp,-128
+ 4f6:	fc86                	sd	ra,120(sp)
+ 4f8:	f8a2                	sd	s0,112(sp)
+ 4fa:	f4a6                	sd	s1,104(sp)
+ 4fc:	f0ca                	sd	s2,96(sp)
+ 4fe:	ecce                	sd	s3,88(sp)
+ 500:	e8d2                	sd	s4,80(sp)
+ 502:	e4d6                	sd	s5,72(sp)
+ 504:	e0da                	sd	s6,64(sp)
+ 506:	fc5e                	sd	s7,56(sp)
+ 508:	f862                	sd	s8,48(sp)
+ 50a:	f466                	sd	s9,40(sp)
+ 50c:	f06a                	sd	s10,32(sp)
+ 50e:	ec6e                	sd	s11,24(sp)
+ 510:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 512:	0005c903          	lbu	s2,0(a1)
+ 516:	18090f63          	beqz	s2,6b4 <vprintf+0x1c0>
+ 51a:	8aaa                	mv	s5,a0
+ 51c:	8b32                	mv	s6,a2
+ 51e:	00158493          	addi	s1,a1,1
+  state = 0;
+ 522:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 524:	02500a13          	li	s4,37
+ 528:	4c55                	li	s8,21
+ 52a:	00000c97          	auipc	s9,0x0
+ 52e:	396c8c93          	addi	s9,s9,918 # 8c0 <malloc+0x108>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 532:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 536:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 538:	00000b97          	auipc	s7,0x0
+ 53c:	3e0b8b93          	addi	s7,s7,992 # 918 <digits>
+ 540:	a839                	j	55e <vprintf+0x6a>
+        putc(fd, c);
+ 542:	85ca                	mv	a1,s2
+ 544:	8556                	mv	a0,s5
+ 546:	00000097          	auipc	ra,0x0
+ 54a:	ee2080e7          	jalr	-286(ra) # 428 <putc>
+ 54e:	a019                	j	554 <vprintf+0x60>
+    } else if(state == '%'){
+ 550:	01498d63          	beq	s3,s4,56a <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 554:	0485                	addi	s1,s1,1
+ 556:	fff4c903          	lbu	s2,-1(s1)
+ 55a:	14090d63          	beqz	s2,6b4 <vprintf+0x1c0>
+    if(state == 0){
+ 55e:	fe0999e3          	bnez	s3,550 <vprintf+0x5c>
+      if(c == '%'){
+ 562:	ff4910e3          	bne	s2,s4,542 <vprintf+0x4e>
+        state = '%';
+ 566:	89d2                	mv	s3,s4
+ 568:	b7f5                	j	554 <vprintf+0x60>
+      if(c == 'd'){
+ 56a:	11490c63          	beq	s2,s4,682 <vprintf+0x18e>
+ 56e:	f9d9079b          	addiw	a5,s2,-99
+ 572:	0ff7f793          	zext.b	a5,a5
+ 576:	10fc6e63          	bltu	s8,a5,692 <vprintf+0x19e>
+ 57a:	f9d9079b          	addiw	a5,s2,-99
+ 57e:	0ff7f713          	zext.b	a4,a5
+ 582:	10ec6863          	bltu	s8,a4,692 <vprintf+0x19e>
+ 586:	00271793          	slli	a5,a4,0x2
+ 58a:	97e6                	add	a5,a5,s9
+ 58c:	439c                	lw	a5,0(a5)
+ 58e:	97e6                	add	a5,a5,s9
+ 590:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 592:	008b0913          	addi	s2,s6,8
+ 596:	4685                	li	a3,1
+ 598:	4629                	li	a2,10
+ 59a:	000b2583          	lw	a1,0(s6)
+ 59e:	8556                	mv	a0,s5
+ 5a0:	00000097          	auipc	ra,0x0
+ 5a4:	eaa080e7          	jalr	-342(ra) # 44a <printint>
+ 5a8:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 5aa:	4981                	li	s3,0
+ 5ac:	b765                	j	554 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 5ae:	008b0913          	addi	s2,s6,8
+ 5b2:	4681                	li	a3,0
+ 5b4:	4629                	li	a2,10
+ 5b6:	000b2583          	lw	a1,0(s6)
+ 5ba:	8556                	mv	a0,s5
+ 5bc:	00000097          	auipc	ra,0x0
+ 5c0:	e8e080e7          	jalr	-370(ra) # 44a <printint>
+ 5c4:	8b4a                	mv	s6,s2
+      state = 0;
+ 5c6:	4981                	li	s3,0
+ 5c8:	b771                	j	554 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 5ca:	008b0913          	addi	s2,s6,8
+ 5ce:	4681                	li	a3,0
+ 5d0:	866a                	mv	a2,s10
+ 5d2:	000b2583          	lw	a1,0(s6)
+ 5d6:	8556                	mv	a0,s5
+ 5d8:	00000097          	auipc	ra,0x0
+ 5dc:	e72080e7          	jalr	-398(ra) # 44a <printint>
+ 5e0:	8b4a                	mv	s6,s2
+      state = 0;
+ 5e2:	4981                	li	s3,0
+ 5e4:	bf85                	j	554 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 5e6:	008b0793          	addi	a5,s6,8
+ 5ea:	f8f43423          	sd	a5,-120(s0)
+ 5ee:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 5f2:	03000593          	li	a1,48
+ 5f6:	8556                	mv	a0,s5
+ 5f8:	00000097          	auipc	ra,0x0
+ 5fc:	e30080e7          	jalr	-464(ra) # 428 <putc>
+  putc(fd, 'x');
+ 600:	07800593          	li	a1,120
+ 604:	8556                	mv	a0,s5
+ 606:	00000097          	auipc	ra,0x0
+ 60a:	e22080e7          	jalr	-478(ra) # 428 <putc>
+ 60e:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 610:	03c9d793          	srli	a5,s3,0x3c
+ 614:	97de                	add	a5,a5,s7
+ 616:	0007c583          	lbu	a1,0(a5)
+ 61a:	8556                	mv	a0,s5
+ 61c:	00000097          	auipc	ra,0x0
+ 620:	e0c080e7          	jalr	-500(ra) # 428 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 624:	0992                	slli	s3,s3,0x4
+ 626:	397d                	addiw	s2,s2,-1
+ 628:	fe0914e3          	bnez	s2,610 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 62c:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 630:	4981                	li	s3,0
+ 632:	b70d                	j	554 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 634:	008b0913          	addi	s2,s6,8
+ 638:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 63c:	02098163          	beqz	s3,65e <vprintf+0x16a>
+        while(*s != 0){
+ 640:	0009c583          	lbu	a1,0(s3)
+ 644:	c5ad                	beqz	a1,6ae <vprintf+0x1ba>
+          putc(fd, *s);
+ 646:	8556                	mv	a0,s5
+ 648:	00000097          	auipc	ra,0x0
+ 64c:	de0080e7          	jalr	-544(ra) # 428 <putc>
+          s++;
+ 650:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 652:	0009c583          	lbu	a1,0(s3)
+ 656:	f9e5                	bnez	a1,646 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 658:	8b4a                	mv	s6,s2
+      state = 0;
+ 65a:	4981                	li	s3,0
+ 65c:	bde5                	j	554 <vprintf+0x60>
+          s = "(null)";
+ 65e:	00000997          	auipc	s3,0x0
+ 662:	25a98993          	addi	s3,s3,602 # 8b8 <malloc+0x100>
+        while(*s != 0){
+ 666:	85ee                	mv	a1,s11
+ 668:	bff9                	j	646 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 66a:	008b0913          	addi	s2,s6,8
+ 66e:	000b4583          	lbu	a1,0(s6)
+ 672:	8556                	mv	a0,s5
+ 674:	00000097          	auipc	ra,0x0
+ 678:	db4080e7          	jalr	-588(ra) # 428 <putc>
+ 67c:	8b4a                	mv	s6,s2
+      state = 0;
+ 67e:	4981                	li	s3,0
+ 680:	bdd1                	j	554 <vprintf+0x60>
+        putc(fd, c);
+ 682:	85d2                	mv	a1,s4
+ 684:	8556                	mv	a0,s5
+ 686:	00000097          	auipc	ra,0x0
+ 68a:	da2080e7          	jalr	-606(ra) # 428 <putc>
+      state = 0;
+ 68e:	4981                	li	s3,0
+ 690:	b5d1                	j	554 <vprintf+0x60>
+        putc(fd, '%');
+ 692:	85d2                	mv	a1,s4
+ 694:	8556                	mv	a0,s5
+ 696:	00000097          	auipc	ra,0x0
+ 69a:	d92080e7          	jalr	-622(ra) # 428 <putc>
+        putc(fd, c);
+ 69e:	85ca                	mv	a1,s2
+ 6a0:	8556                	mv	a0,s5
+ 6a2:	00000097          	auipc	ra,0x0
+ 6a6:	d86080e7          	jalr	-634(ra) # 428 <putc>
+      state = 0;
+ 6aa:	4981                	li	s3,0
+ 6ac:	b565                	j	554 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 6ae:	8b4a                	mv	s6,s2
+      state = 0;
+ 6b0:	4981                	li	s3,0
+ 6b2:	b54d                	j	554 <vprintf+0x60>
+    }
+  }
+}
+ 6b4:	70e6                	ld	ra,120(sp)
+ 6b6:	7446                	ld	s0,112(sp)
+ 6b8:	74a6                	ld	s1,104(sp)
+ 6ba:	7906                	ld	s2,96(sp)
+ 6bc:	69e6                	ld	s3,88(sp)
+ 6be:	6a46                	ld	s4,80(sp)
+ 6c0:	6aa6                	ld	s5,72(sp)
+ 6c2:	6b06                	ld	s6,64(sp)
+ 6c4:	7be2                	ld	s7,56(sp)
+ 6c6:	7c42                	ld	s8,48(sp)
+ 6c8:	7ca2                	ld	s9,40(sp)
+ 6ca:	7d02                	ld	s10,32(sp)
+ 6cc:	6de2                	ld	s11,24(sp)
+ 6ce:	6109                	addi	sp,sp,128
+ 6d0:	8082                	ret
+
+00000000000006d2 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 6d2:	715d                	addi	sp,sp,-80
+ 6d4:	ec06                	sd	ra,24(sp)
+ 6d6:	e822                	sd	s0,16(sp)
+ 6d8:	1000                	addi	s0,sp,32
+ 6da:	e010                	sd	a2,0(s0)
+ 6dc:	e414                	sd	a3,8(s0)
+ 6de:	e818                	sd	a4,16(s0)
+ 6e0:	ec1c                	sd	a5,24(s0)
+ 6e2:	03043023          	sd	a6,32(s0)
+ 6e6:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6ea:	8622                	mv	a2,s0
+ 6ec:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 6f0:	00000097          	auipc	ra,0x0
+ 6f4:	e04080e7          	jalr	-508(ra) # 4f4 <vprintf>
+}
+ 6f8:	60e2                	ld	ra,24(sp)
+ 6fa:	6442                	ld	s0,16(sp)
+ 6fc:	6161                	addi	sp,sp,80
+ 6fe:	8082                	ret
+
+0000000000000700 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 700:	711d                	addi	sp,sp,-96
+ 702:	ec06                	sd	ra,24(sp)
+ 704:	e822                	sd	s0,16(sp)
+ 706:	1000                	addi	s0,sp,32
+ 708:	e40c                	sd	a1,8(s0)
+ 70a:	e810                	sd	a2,16(s0)
+ 70c:	ec14                	sd	a3,24(s0)
+ 70e:	f018                	sd	a4,32(s0)
+ 710:	f41c                	sd	a5,40(s0)
+ 712:	03043823          	sd	a6,48(s0)
+ 716:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 71a:	00840613          	addi	a2,s0,8
+ 71e:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 722:	85aa                	mv	a1,a0
+ 724:	4505                	li	a0,1
+ 726:	00000097          	auipc	ra,0x0
+ 72a:	dce080e7          	jalr	-562(ra) # 4f4 <vprintf>
+}
+ 72e:	60e2                	ld	ra,24(sp)
+ 730:	6442                	ld	s0,16(sp)
+ 732:	6125                	addi	sp,sp,96
+ 734:	8082                	ret
+
+0000000000000736 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 736:	1141                	addi	sp,sp,-16
+ 738:	e422                	sd	s0,8(sp)
+ 73a:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 73c:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 740:	00000797          	auipc	a5,0x0
+ 744:	1f07b783          	ld	a5,496(a5) # 930 <freep>
+ 748:	a02d                	j	772 <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;
+ 74a:	4618                	lw	a4,8(a2)
+ 74c:	9f2d                	addw	a4,a4,a1
+ 74e:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 752:	6398                	ld	a4,0(a5)
+ 754:	6310                	ld	a2,0(a4)
+ 756:	a83d                	j	794 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 758:	ff852703          	lw	a4,-8(a0)
+ 75c:	9f31                	addw	a4,a4,a2
+ 75e:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 760:	ff053683          	ld	a3,-16(a0)
+ 764:	a091                	j	7a8 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 766:	6398                	ld	a4,0(a5)
+ 768:	00e7e463          	bltu	a5,a4,770 <free+0x3a>
+ 76c:	00e6ea63          	bltu	a3,a4,780 <free+0x4a>
+{
+ 770:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 772:	fed7fae3          	bgeu	a5,a3,766 <free+0x30>
+ 776:	6398                	ld	a4,0(a5)
+ 778:	00e6e463          	bltu	a3,a4,780 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 77c:	fee7eae3          	bltu	a5,a4,770 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 780:	ff852583          	lw	a1,-8(a0)
+ 784:	6390                	ld	a2,0(a5)
+ 786:	02059813          	slli	a6,a1,0x20
+ 78a:	01c85713          	srli	a4,a6,0x1c
+ 78e:	9736                	add	a4,a4,a3
+ 790:	fae60de3          	beq	a2,a4,74a <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 794:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 798:	4790                	lw	a2,8(a5)
+ 79a:	02061593          	slli	a1,a2,0x20
+ 79e:	01c5d713          	srli	a4,a1,0x1c
+ 7a2:	973e                	add	a4,a4,a5
+ 7a4:	fae68ae3          	beq	a3,a4,758 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 7a8:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 7aa:	00000717          	auipc	a4,0x0
+ 7ae:	18f73323          	sd	a5,390(a4) # 930 <freep>
+}
+ 7b2:	6422                	ld	s0,8(sp)
+ 7b4:	0141                	addi	sp,sp,16
+ 7b6:	8082                	ret
+
+00000000000007b8 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 7b8:	7139                	addi	sp,sp,-64
+ 7ba:	fc06                	sd	ra,56(sp)
+ 7bc:	f822                	sd	s0,48(sp)
+ 7be:	f426                	sd	s1,40(sp)
+ 7c0:	f04a                	sd	s2,32(sp)
+ 7c2:	ec4e                	sd	s3,24(sp)
+ 7c4:	e852                	sd	s4,16(sp)
+ 7c6:	e456                	sd	s5,8(sp)
+ 7c8:	e05a                	sd	s6,0(sp)
+ 7ca:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 7cc:	02051493          	slli	s1,a0,0x20
+ 7d0:	9081                	srli	s1,s1,0x20
+ 7d2:	04bd                	addi	s1,s1,15
+ 7d4:	8091                	srli	s1,s1,0x4
+ 7d6:	00148a1b          	addiw	s4,s1,1
+ 7da:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 7dc:	00000517          	auipc	a0,0x0
+ 7e0:	15453503          	ld	a0,340(a0) # 930 <freep>
+ 7e4:	c515                	beqz	a0,810 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 7e6:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 7e8:	4798                	lw	a4,8(a5)
+ 7ea:	04977163          	bgeu	a4,s1,82c <malloc+0x74>
+ 7ee:	89d2                	mv	s3,s4
+ 7f0:	000a071b          	sext.w	a4,s4
+ 7f4:	6685                	lui	a3,0x1
+ 7f6:	00d77363          	bgeu	a4,a3,7fc <malloc+0x44>
+ 7fa:	6985                	lui	s3,0x1
+ 7fc:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 800:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 804:	00000917          	auipc	s2,0x0
+ 808:	12c90913          	addi	s2,s2,300 # 930 <freep>
+  if(p == (char*)-1)
+ 80c:	5afd                	li	s5,-1
+ 80e:	a8a5                	j	886 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 810:	00000797          	auipc	a5,0x0
+ 814:	12078793          	addi	a5,a5,288 # 930 <freep>
+ 818:	00000717          	auipc	a4,0x0
+ 81c:	12070713          	addi	a4,a4,288 # 938 <base>
+ 820:	e398                	sd	a4,0(a5)
+ 822:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 824:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 828:	87ba                	mv	a5,a4
+ 82a:	b7d1                	j	7ee <malloc+0x36>
+      if(p->s.size == nunits)
+ 82c:	02e48c63          	beq	s1,a4,864 <malloc+0xac>
+        p->s.size -= nunits;
+ 830:	4147073b          	subw	a4,a4,s4
+ 834:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 836:	02071693          	slli	a3,a4,0x20
+ 83a:	01c6d713          	srli	a4,a3,0x1c
+ 83e:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 840:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 844:	00000717          	auipc	a4,0x0
+ 848:	0ea73623          	sd	a0,236(a4) # 930 <freep>
+      return (void*)(p + 1);
+ 84c:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 850:	70e2                	ld	ra,56(sp)
+ 852:	7442                	ld	s0,48(sp)
+ 854:	74a2                	ld	s1,40(sp)
+ 856:	7902                	ld	s2,32(sp)
+ 858:	69e2                	ld	s3,24(sp)
+ 85a:	6a42                	ld	s4,16(sp)
+ 85c:	6aa2                	ld	s5,8(sp)
+ 85e:	6b02                	ld	s6,0(sp)
+ 860:	6121                	addi	sp,sp,64
+ 862:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 864:	6398                	ld	a4,0(a5)
+ 866:	e118                	sd	a4,0(a0)
+ 868:	bff1                	j	844 <malloc+0x8c>
+  hp->s.size = nu;
+ 86a:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 86e:	0541                	addi	a0,a0,16
+ 870:	00000097          	auipc	ra,0x0
+ 874:	ec6080e7          	jalr	-314(ra) # 736 <free>
+  return freep;
+ 878:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 87c:	d971                	beqz	a0,850 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 87e:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 880:	4798                	lw	a4,8(a5)
+ 882:	fa9775e3          	bgeu	a4,s1,82c <malloc+0x74>
+    if(p == freep)
+ 886:	00093703          	ld	a4,0(s2)
+ 88a:	853e                	mv	a0,a5
+ 88c:	fef719e3          	bne	a4,a5,87e <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 890:	854e                	mv	a0,s3
+ 892:	00000097          	auipc	ra,0x0
+ 896:	b30080e7          	jalr	-1232(ra) # 3c2 <sbrk>
+  if(p == (char*)-1)
+ 89a:	fd5518e3          	bne	a0,s5,86a <malloc+0xb2>
+        return 0;
+ 89e:	4501                	li	a0,0
+ 8a0:	bf45                	j	850 <malloc+0x98>
diff --git a/xv6-user/echo.c b/xv6-user/echo.c
new file mode 100644
index 0000000000000000000000000000000000000000..1eb7b7bcb050e38212e9614359ec93a8d5003188
--- /dev/null
+++ b/xv6-user/echo.c
@@ -0,0 +1,19 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+  int i;
+
+  for(i = 1; i < argc; i++){
+    write(1, argv[i], strlen(argv[i]));
+    if(i + 1 < argc){
+      write(1, " ", 1);
+    } else {
+      write(1, "\n", 1);
+    }
+  }
+  exit(0);
+}
diff --git a/xv6-user/echo.d b/xv6-user/echo.d
new file mode 100644
index 0000000000000000000000000000000000000000..537516d1d48c42af024851d4e7bb00b8d361e126
--- /dev/null
+++ b/xv6-user/echo.d
@@ -0,0 +1,2 @@
+xv6-user/echo.o: xv6-user/echo.c kernel/include/types.h \
+ kernel/include/stat.h xv6-user/user.h kernel/include/fcntl.h
diff --git a/xv6-user/echo.o b/xv6-user/echo.o
new file mode 100644
index 0000000000000000000000000000000000000000..2e732782bcae8afbbeadcceb0f0e805cdc8d877a
Binary files /dev/null and b/xv6-user/echo.o differ
diff --git a/xv6-user/echo.sym b/xv6-user/echo.sym
new file mode 100644
index 0000000000000000000000000000000000000000..6a80fee417e396a2b334ccfbaaed4262d0d6328d
--- /dev/null
+++ b/xv6-user/echo.sym
@@ -0,0 +1,76 @@
+0000000000000000 .text
+00000000000008a8 .rodata
+0000000000000930 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 echo.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+0000000000000428 putc
+000000000000044a printint
+0000000000000918 digits
+0000000000000000 umalloc.c
+0000000000000930 freep
+0000000000000938 base
+0000000000000084 strcpy
+0000000000000700 printf
+0000000000001129 __global_pointer$
+00000000000003e2 dev
+000000000000028a memmove
+0000000000000406 trace
+000000000000016a gets
+0000000000000929 __SDATA_BEGIN__
+00000000000003b8 getpid
+000000000000031c memcpy
+00000000000007b8 malloc
+00000000000003fc remove
+00000000000003ca sleep
+000000000000040e sysinfo
+00000000000003ec readdir
+000000000000034e pipe
+0000000000000416 rename
+0000000000000362 write
+0000000000000392 fstat
+00000000000006d2 fprintf
+0000000000000376 kill
+00000000000000a0 strcat
+00000000000004f4 vprintf
+00000000000003a6 chdir
+000000000000037e exec
+0000000000000346 wait
+0000000000000358 read
+00000000000002e2 memcmp
+0000000000000334 fork
+0000000000000948 __BSS_END__
+00000000000003c2 sbrk
+00000000000003da test_proc
+00000000000003d2 uptime
+0000000000000929 __bss_start
+0000000000000124 memset
+0000000000000000 main
+00000000000000ce strcmp
+000000000000041e shutdown
+00000000000003b0 dup
+00000000000003f4 getcwd
+0000000000000929 __DATA_BEGIN__
+00000000000001e4 stat
+0000000000000929 _edata
+0000000000000948 _end
+000000000000033c exit
+000000000000022a atoi
+00000000000000fa strlen
+0000000000000388 open
+0000000000000146 strchr
+000000000000039c mkdir
+000000000000036c close
+0000000000000736 free
diff --git a/xv6-user/find.asm b/xv6-user/find.asm
new file mode 100644
index 0000000000000000000000000000000000000000..ac6fe3c23192479f43bea5bcfbf3d9206340c6fc
--- /dev/null
+++ b/xv6-user/find.asm
@@ -0,0 +1,1619 @@
+
+xv6-user/_find:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <find>:
+#include "xv6-user/user.h"
+
+static char path[512];
+
+void find(char *filename)
+{
+   0:	7175                	addi	sp,sp,-144
+   2:	e506                	sd	ra,136(sp)
+   4:	e122                	sd	s0,128(sp)
+   6:	fca6                	sd	s1,120(sp)
+   8:	f8ca                	sd	s2,112(sp)
+   a:	f4ce                	sd	s3,104(sp)
+   c:	f0d2                	sd	s4,96(sp)
+   e:	ecd6                	sd	s5,88(sp)
+  10:	e8da                	sd	s6,80(sp)
+  12:	e4de                	sd	s7,72(sp)
+  14:	e0e2                	sd	s8,64(sp)
+  16:	0900                	addi	s0,sp,144
+  18:	8a2a                	mv	s4,a0
+    int fd;
+    struct stat st;
+    if ((fd = open(path, O_RDONLY)) < 0) {
+  1a:	4581                	li	a1,0
+  1c:	00001517          	auipc	a0,0x1
+  20:	b0450513          	addi	a0,a0,-1276 # b20 <path>
+  24:	00000097          	auipc	ra,0x0
+  28:	4e6080e7          	jalr	1254(ra) # 50a <open>
+  2c:	04054163          	bltz	a0,6e <find+0x6e>
+  30:	84aa                	mv	s1,a0
+        fprintf(2, "find: cannot open %s\n", path);
+        return;
+    }
+    if (fstat(fd, &st) < 0) {
+  32:	f7840593          	addi	a1,s0,-136
+  36:	00000097          	auipc	ra,0x0
+  3a:	4de080e7          	jalr	1246(ra) # 514 <fstat>
+  3e:	04054663          	bltz	a0,8a <find+0x8a>
+        fprintf(2, "find: cannot stat %s\n", path);
+        close(fd);
+        return;
+    }
+    if (st.type != T_DIR) {
+  42:	fa041703          	lh	a4,-96(s0)
+  46:	4785                	li	a5,1
+  48:	06f70463          	beq	a4,a5,b0 <find+0xb0>
+        close(fd);
+  4c:	8526                	mv	a0,s1
+  4e:	00000097          	auipc	ra,0x0
+  52:	4a0080e7          	jalr	1184(ra) # 4ee <close>
+        }
+        find(filename);
+    }
+    close(fd);
+    return;
+}
+  56:	60aa                	ld	ra,136(sp)
+  58:	640a                	ld	s0,128(sp)
+  5a:	74e6                	ld	s1,120(sp)
+  5c:	7946                	ld	s2,112(sp)
+  5e:	79a6                	ld	s3,104(sp)
+  60:	7a06                	ld	s4,96(sp)
+  62:	6ae6                	ld	s5,88(sp)
+  64:	6b46                	ld	s6,80(sp)
+  66:	6ba6                	ld	s7,72(sp)
+  68:	6c06                	ld	s8,64(sp)
+  6a:	6149                	addi	sp,sp,144
+  6c:	8082                	ret
+        fprintf(2, "find: cannot open %s\n", path);
+  6e:	00001617          	auipc	a2,0x1
+  72:	ab260613          	addi	a2,a2,-1358 # b20 <path>
+  76:	00001597          	auipc	a1,0x1
+  7a:	9b258593          	addi	a1,a1,-1614 # a28 <malloc+0xee>
+  7e:	4509                	li	a0,2
+  80:	00000097          	auipc	ra,0x0
+  84:	7d4080e7          	jalr	2004(ra) # 854 <fprintf>
+        return;
+  88:	b7f9                	j	56 <find+0x56>
+        fprintf(2, "find: cannot stat %s\n", path);
+  8a:	00001617          	auipc	a2,0x1
+  8e:	a9660613          	addi	a2,a2,-1386 # b20 <path>
+  92:	00001597          	auipc	a1,0x1
+  96:	9ae58593          	addi	a1,a1,-1618 # a40 <malloc+0x106>
+  9a:	4509                	li	a0,2
+  9c:	00000097          	auipc	ra,0x0
+  a0:	7b8080e7          	jalr	1976(ra) # 854 <fprintf>
+        close(fd);
+  a4:	8526                	mv	a0,s1
+  a6:	00000097          	auipc	ra,0x0
+  aa:	448080e7          	jalr	1096(ra) # 4ee <close>
+        return;
+  ae:	b765                	j	56 <find+0x56>
+    if (strlen(path) + 255 + 2 > sizeof(path)) {
+  b0:	00001517          	auipc	a0,0x1
+  b4:	a7050513          	addi	a0,a0,-1424 # b20 <path>
+  b8:	00000097          	auipc	ra,0x0
+  bc:	1c4080e7          	jalr	452(ra) # 27c <strlen>
+  c0:	1015051b          	addiw	a0,a0,257
+  c4:	20000793          	li	a5,512
+  c8:	0aa7e863          	bltu	a5,a0,178 <find+0x178>
+    char *p = path + strlen(path) - 1;
+  cc:	00001917          	auipc	s2,0x1
+  d0:	a5490913          	addi	s2,s2,-1452 # b20 <path>
+  d4:	854a                	mv	a0,s2
+  d6:	00000097          	auipc	ra,0x0
+  da:	1a6080e7          	jalr	422(ra) # 27c <strlen>
+  de:	1502                	slli	a0,a0,0x20
+  e0:	9101                	srli	a0,a0,0x20
+  e2:	fff50793          	addi	a5,a0,-1
+  e6:	993e                	add	s2,s2,a5
+    if (*p != '/') {
+  e8:	00094703          	lbu	a4,0(s2)
+  ec:	02f00793          	li	a5,47
+  f0:	00f70963          	beq	a4,a5,102 <find+0x102>
+        *++p = '/';
+  f4:	00f900a3          	sb	a5,1(s2)
+  f8:	00001917          	auipc	s2,0x1
+  fc:	a2890913          	addi	s2,s2,-1496 # b20 <path>
+ 100:	992a                	add	s2,s2,a0
+    p++;
+ 102:	0905                	addi	s2,s2,1
+    while (readdir(fd, &st)) {
+ 104:	f7840993          	addi	s3,s0,-136
+        if (strcmp(p, ".") == 0 || strcmp(p, "..") == 0) {
+ 108:	00001a97          	auipc	s5,0x1
+ 10c:	968a8a93          	addi	s5,s5,-1688 # a70 <malloc+0x136>
+ 110:	00001b17          	auipc	s6,0x1
+ 114:	968b0b13          	addi	s6,s6,-1688 # a78 <malloc+0x13e>
+            fprintf(1, "%s\n", path);
+ 118:	00001c17          	auipc	s8,0x1
+ 11c:	a08c0c13          	addi	s8,s8,-1528 # b20 <path>
+ 120:	00001b97          	auipc	s7,0x1
+ 124:	960b8b93          	addi	s7,s7,-1696 # a80 <malloc+0x146>
+    while (readdir(fd, &st)) {
+ 128:	85ce                	mv	a1,s3
+ 12a:	8526                	mv	a0,s1
+ 12c:	00000097          	auipc	ra,0x0
+ 130:	442080e7          	jalr	1090(ra) # 56e <readdir>
+ 134:	c92d                	beqz	a0,1a6 <find+0x1a6>
+        strcpy(p, st.name);
+ 136:	85ce                	mv	a1,s3
+ 138:	854a                	mv	a0,s2
+ 13a:	00000097          	auipc	ra,0x0
+ 13e:	0cc080e7          	jalr	204(ra) # 206 <strcpy>
+        if (strcmp(p, ".") == 0 || strcmp(p, "..") == 0) {
+ 142:	85d6                	mv	a1,s5
+ 144:	854a                	mv	a0,s2
+ 146:	00000097          	auipc	ra,0x0
+ 14a:	10a080e7          	jalr	266(ra) # 250 <strcmp>
+ 14e:	dd69                	beqz	a0,128 <find+0x128>
+ 150:	85da                	mv	a1,s6
+ 152:	854a                	mv	a0,s2
+ 154:	00000097          	auipc	ra,0x0
+ 158:	0fc080e7          	jalr	252(ra) # 250 <strcmp>
+ 15c:	d571                	beqz	a0,128 <find+0x128>
+        if (strcmp(p, filename) == 0) {
+ 15e:	85d2                	mv	a1,s4
+ 160:	854a                	mv	a0,s2
+ 162:	00000097          	auipc	ra,0x0
+ 166:	0ee080e7          	jalr	238(ra) # 250 <strcmp>
+ 16a:	c515                	beqz	a0,196 <find+0x196>
+        find(filename);
+ 16c:	8552                	mv	a0,s4
+ 16e:	00000097          	auipc	ra,0x0
+ 172:	e92080e7          	jalr	-366(ra) # 0 <find>
+ 176:	bf4d                	j	128 <find+0x128>
+        fprintf(2, "find: path too long\n");
+ 178:	00001597          	auipc	a1,0x1
+ 17c:	8e058593          	addi	a1,a1,-1824 # a58 <malloc+0x11e>
+ 180:	4509                	li	a0,2
+ 182:	00000097          	auipc	ra,0x0
+ 186:	6d2080e7          	jalr	1746(ra) # 854 <fprintf>
+        close(fd);
+ 18a:	8526                	mv	a0,s1
+ 18c:	00000097          	auipc	ra,0x0
+ 190:	362080e7          	jalr	866(ra) # 4ee <close>
+        return;
+ 194:	b5c9                	j	56 <find+0x56>
+            fprintf(1, "%s\n", path);
+ 196:	8662                	mv	a2,s8
+ 198:	85de                	mv	a1,s7
+ 19a:	4505                	li	a0,1
+ 19c:	00000097          	auipc	ra,0x0
+ 1a0:	6b8080e7          	jalr	1720(ra) # 854 <fprintf>
+ 1a4:	b7e1                	j	16c <find+0x16c>
+    close(fd);
+ 1a6:	8526                	mv	a0,s1
+ 1a8:	00000097          	auipc	ra,0x0
+ 1ac:	346080e7          	jalr	838(ra) # 4ee <close>
+    return;
+ 1b0:	b55d                	j	56 <find+0x56>
+
+00000000000001b2 <main>:
+
+
+int main(int argc, char *argv[])
+{
+ 1b2:	1101                	addi	sp,sp,-32
+ 1b4:	ec06                	sd	ra,24(sp)
+ 1b6:	e822                	sd	s0,16(sp)
+ 1b8:	e426                	sd	s1,8(sp)
+ 1ba:	1000                	addi	s0,sp,32
+    if (argc < 3) {
+ 1bc:	4789                	li	a5,2
+ 1be:	02a7c063          	blt	a5,a0,1de <main+0x2c>
+        fprintf(2, "Usage: find DIR FILENAME\n");
+ 1c2:	00001597          	auipc	a1,0x1
+ 1c6:	8c658593          	addi	a1,a1,-1850 # a88 <malloc+0x14e>
+ 1ca:	4509                	li	a0,2
+ 1cc:	00000097          	auipc	ra,0x0
+ 1d0:	688080e7          	jalr	1672(ra) # 854 <fprintf>
+        exit(0);
+ 1d4:	4501                	li	a0,0
+ 1d6:	00000097          	auipc	ra,0x0
+ 1da:	2e8080e7          	jalr	744(ra) # 4be <exit>
+ 1de:	84ae                	mv	s1,a1
+    } else {
+        strcpy(path, argv[1]);
+ 1e0:	658c                	ld	a1,8(a1)
+ 1e2:	00001517          	auipc	a0,0x1
+ 1e6:	93e50513          	addi	a0,a0,-1730 # b20 <path>
+ 1ea:	00000097          	auipc	ra,0x0
+ 1ee:	01c080e7          	jalr	28(ra) # 206 <strcpy>
+        find(argv[2]);
+ 1f2:	6888                	ld	a0,16(s1)
+ 1f4:	00000097          	auipc	ra,0x0
+ 1f8:	e0c080e7          	jalr	-500(ra) # 0 <find>
+    }
+    exit(0);
+ 1fc:	4501                	li	a0,0
+ 1fe:	00000097          	auipc	ra,0x0
+ 202:	2c0080e7          	jalr	704(ra) # 4be <exit>
+
+0000000000000206 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+ 206:	1141                	addi	sp,sp,-16
+ 208:	e422                	sd	s0,8(sp)
+ 20a:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+ 20c:	87aa                	mv	a5,a0
+ 20e:	0585                	addi	a1,a1,1
+ 210:	0785                	addi	a5,a5,1
+ 212:	fff5c703          	lbu	a4,-1(a1)
+ 216:	fee78fa3          	sb	a4,-1(a5)
+ 21a:	fb75                	bnez	a4,20e <strcpy+0x8>
+    ;
+  return os;
+}
+ 21c:	6422                	ld	s0,8(sp)
+ 21e:	0141                	addi	sp,sp,16
+ 220:	8082                	ret
+
+0000000000000222 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+ 222:	1141                	addi	sp,sp,-16
+ 224:	e422                	sd	s0,8(sp)
+ 226:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+ 228:	00054783          	lbu	a5,0(a0)
+ 22c:	c385                	beqz	a5,24c <strcat+0x2a>
+ 22e:	87aa                	mv	a5,a0
+    s++;
+ 230:	0785                	addi	a5,a5,1
+  while(*s)
+ 232:	0007c703          	lbu	a4,0(a5)
+ 236:	ff6d                	bnez	a4,230 <strcat+0xe>
+  while((*s++ = *t++))
+ 238:	0585                	addi	a1,a1,1
+ 23a:	0785                	addi	a5,a5,1
+ 23c:	fff5c703          	lbu	a4,-1(a1)
+ 240:	fee78fa3          	sb	a4,-1(a5)
+ 244:	fb75                	bnez	a4,238 <strcat+0x16>
+    ;
+  return os;
+}
+ 246:	6422                	ld	s0,8(sp)
+ 248:	0141                	addi	sp,sp,16
+ 24a:	8082                	ret
+  while(*s)
+ 24c:	87aa                	mv	a5,a0
+ 24e:	b7ed                	j	238 <strcat+0x16>
+
+0000000000000250 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+ 250:	1141                	addi	sp,sp,-16
+ 252:	e422                	sd	s0,8(sp)
+ 254:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+ 256:	00054783          	lbu	a5,0(a0)
+ 25a:	cb91                	beqz	a5,26e <strcmp+0x1e>
+ 25c:	0005c703          	lbu	a4,0(a1)
+ 260:	00f71763          	bne	a4,a5,26e <strcmp+0x1e>
+    p++, q++;
+ 264:	0505                	addi	a0,a0,1
+ 266:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+ 268:	00054783          	lbu	a5,0(a0)
+ 26c:	fbe5                	bnez	a5,25c <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+ 26e:	0005c503          	lbu	a0,0(a1)
+}
+ 272:	40a7853b          	subw	a0,a5,a0
+ 276:	6422                	ld	s0,8(sp)
+ 278:	0141                	addi	sp,sp,16
+ 27a:	8082                	ret
+
+000000000000027c <strlen>:
+
+uint
+strlen(const char *s)
+{
+ 27c:	1141                	addi	sp,sp,-16
+ 27e:	e422                	sd	s0,8(sp)
+ 280:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 282:	00054783          	lbu	a5,0(a0)
+ 286:	cf91                	beqz	a5,2a2 <strlen+0x26>
+ 288:	0505                	addi	a0,a0,1
+ 28a:	87aa                	mv	a5,a0
+ 28c:	4685                	li	a3,1
+ 28e:	9e89                	subw	a3,a3,a0
+ 290:	00f6853b          	addw	a0,a3,a5
+ 294:	0785                	addi	a5,a5,1
+ 296:	fff7c703          	lbu	a4,-1(a5)
+ 29a:	fb7d                	bnez	a4,290 <strlen+0x14>
+    ;
+  return n;
+}
+ 29c:	6422                	ld	s0,8(sp)
+ 29e:	0141                	addi	sp,sp,16
+ 2a0:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 2a2:	4501                	li	a0,0
+ 2a4:	bfe5                	j	29c <strlen+0x20>
+
+00000000000002a6 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 2a6:	1141                	addi	sp,sp,-16
+ 2a8:	e422                	sd	s0,8(sp)
+ 2aa:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 2ac:	ca19                	beqz	a2,2c2 <memset+0x1c>
+ 2ae:	87aa                	mv	a5,a0
+ 2b0:	1602                	slli	a2,a2,0x20
+ 2b2:	9201                	srli	a2,a2,0x20
+ 2b4:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 2b8:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 2bc:	0785                	addi	a5,a5,1
+ 2be:	fee79de3          	bne	a5,a4,2b8 <memset+0x12>
+  }
+  return dst;
+}
+ 2c2:	6422                	ld	s0,8(sp)
+ 2c4:	0141                	addi	sp,sp,16
+ 2c6:	8082                	ret
+
+00000000000002c8 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 2c8:	1141                	addi	sp,sp,-16
+ 2ca:	e422                	sd	s0,8(sp)
+ 2cc:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 2ce:	00054783          	lbu	a5,0(a0)
+ 2d2:	cb99                	beqz	a5,2e8 <strchr+0x20>
+    if(*s == c)
+ 2d4:	00f58763          	beq	a1,a5,2e2 <strchr+0x1a>
+  for(; *s; s++)
+ 2d8:	0505                	addi	a0,a0,1
+ 2da:	00054783          	lbu	a5,0(a0)
+ 2de:	fbfd                	bnez	a5,2d4 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 2e0:	4501                	li	a0,0
+}
+ 2e2:	6422                	ld	s0,8(sp)
+ 2e4:	0141                	addi	sp,sp,16
+ 2e6:	8082                	ret
+  return 0;
+ 2e8:	4501                	li	a0,0
+ 2ea:	bfe5                	j	2e2 <strchr+0x1a>
+
+00000000000002ec <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 2ec:	711d                	addi	sp,sp,-96
+ 2ee:	ec86                	sd	ra,88(sp)
+ 2f0:	e8a2                	sd	s0,80(sp)
+ 2f2:	e4a6                	sd	s1,72(sp)
+ 2f4:	e0ca                	sd	s2,64(sp)
+ 2f6:	fc4e                	sd	s3,56(sp)
+ 2f8:	f852                	sd	s4,48(sp)
+ 2fa:	f456                	sd	s5,40(sp)
+ 2fc:	f05a                	sd	s6,32(sp)
+ 2fe:	ec5e                	sd	s7,24(sp)
+ 300:	e862                	sd	s8,16(sp)
+ 302:	1080                	addi	s0,sp,96
+ 304:	8baa                	mv	s7,a0
+ 306:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 308:	892a                	mv	s2,a0
+ 30a:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 30c:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 310:	4b29                	li	s6,10
+ 312:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 314:	89a6                	mv	s3,s1
+ 316:	2485                	addiw	s1,s1,1
+ 318:	0344d763          	bge	s1,s4,346 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 31c:	4605                	li	a2,1
+ 31e:	85d6                	mv	a1,s5
+ 320:	4501                	li	a0,0
+ 322:	00000097          	auipc	ra,0x0
+ 326:	1b8080e7          	jalr	440(ra) # 4da <read>
+    if(cc < 1)
+ 32a:	00a05e63          	blez	a0,346 <gets+0x5a>
+    buf[i++] = c;
+ 32e:	faf44783          	lbu	a5,-81(s0)
+ 332:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 336:	01678763          	beq	a5,s6,344 <gets+0x58>
+ 33a:	0905                	addi	s2,s2,1
+ 33c:	fd879ce3          	bne	a5,s8,314 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 340:	89a6                	mv	s3,s1
+ 342:	a011                	j	346 <gets+0x5a>
+ 344:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 346:	99de                	add	s3,s3,s7
+ 348:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 34c:	855e                	mv	a0,s7
+ 34e:	60e6                	ld	ra,88(sp)
+ 350:	6446                	ld	s0,80(sp)
+ 352:	64a6                	ld	s1,72(sp)
+ 354:	6906                	ld	s2,64(sp)
+ 356:	79e2                	ld	s3,56(sp)
+ 358:	7a42                	ld	s4,48(sp)
+ 35a:	7aa2                	ld	s5,40(sp)
+ 35c:	7b02                	ld	s6,32(sp)
+ 35e:	6be2                	ld	s7,24(sp)
+ 360:	6c42                	ld	s8,16(sp)
+ 362:	6125                	addi	sp,sp,96
+ 364:	8082                	ret
+
+0000000000000366 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 366:	1101                	addi	sp,sp,-32
+ 368:	ec06                	sd	ra,24(sp)
+ 36a:	e822                	sd	s0,16(sp)
+ 36c:	e426                	sd	s1,8(sp)
+ 36e:	e04a                	sd	s2,0(sp)
+ 370:	1000                	addi	s0,sp,32
+ 372:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 374:	4581                	li	a1,0
+ 376:	00000097          	auipc	ra,0x0
+ 37a:	194080e7          	jalr	404(ra) # 50a <open>
+  if(fd < 0)
+ 37e:	02054563          	bltz	a0,3a8 <stat+0x42>
+ 382:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 384:	85ca                	mv	a1,s2
+ 386:	00000097          	auipc	ra,0x0
+ 38a:	18e080e7          	jalr	398(ra) # 514 <fstat>
+ 38e:	892a                	mv	s2,a0
+  close(fd);
+ 390:	8526                	mv	a0,s1
+ 392:	00000097          	auipc	ra,0x0
+ 396:	15c080e7          	jalr	348(ra) # 4ee <close>
+  return r;
+}
+ 39a:	854a                	mv	a0,s2
+ 39c:	60e2                	ld	ra,24(sp)
+ 39e:	6442                	ld	s0,16(sp)
+ 3a0:	64a2                	ld	s1,8(sp)
+ 3a2:	6902                	ld	s2,0(sp)
+ 3a4:	6105                	addi	sp,sp,32
+ 3a6:	8082                	ret
+    return -1;
+ 3a8:	597d                	li	s2,-1
+ 3aa:	bfc5                	j	39a <stat+0x34>
+
+00000000000003ac <atoi>:
+
+int
+atoi(const char *s)
+{
+ 3ac:	1141                	addi	sp,sp,-16
+ 3ae:	e422                	sd	s0,8(sp)
+ 3b0:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 3b2:	00054703          	lbu	a4,0(a0)
+ 3b6:	02d00793          	li	a5,45
+  int neg = 1;
+ 3ba:	4585                	li	a1,1
+  if (*s == '-') {
+ 3bc:	04f70363          	beq	a4,a5,402 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 3c0:	00054703          	lbu	a4,0(a0)
+ 3c4:	fd07079b          	addiw	a5,a4,-48
+ 3c8:	0ff7f793          	zext.b	a5,a5
+ 3cc:	46a5                	li	a3,9
+ 3ce:	02f6ed63          	bltu	a3,a5,408 <atoi+0x5c>
+  n = 0;
+ 3d2:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 3d4:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 3d6:	0505                	addi	a0,a0,1
+ 3d8:	0026979b          	slliw	a5,a3,0x2
+ 3dc:	9fb5                	addw	a5,a5,a3
+ 3de:	0017979b          	slliw	a5,a5,0x1
+ 3e2:	9fb9                	addw	a5,a5,a4
+ 3e4:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 3e8:	00054703          	lbu	a4,0(a0)
+ 3ec:	fd07079b          	addiw	a5,a4,-48
+ 3f0:	0ff7f793          	zext.b	a5,a5
+ 3f4:	fef671e3          	bgeu	a2,a5,3d6 <atoi+0x2a>
+  return n * neg;
+}
+ 3f8:	02d5853b          	mulw	a0,a1,a3
+ 3fc:	6422                	ld	s0,8(sp)
+ 3fe:	0141                	addi	sp,sp,16
+ 400:	8082                	ret
+    s++;
+ 402:	0505                	addi	a0,a0,1
+    neg = -1;
+ 404:	55fd                	li	a1,-1
+ 406:	bf6d                	j	3c0 <atoi+0x14>
+  n = 0;
+ 408:	4681                	li	a3,0
+ 40a:	b7fd                	j	3f8 <atoi+0x4c>
+
+000000000000040c <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 40c:	1141                	addi	sp,sp,-16
+ 40e:	e422                	sd	s0,8(sp)
+ 410:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 412:	02b57463          	bgeu	a0,a1,43a <memmove+0x2e>
+    while(n-- > 0)
+ 416:	00c05f63          	blez	a2,434 <memmove+0x28>
+ 41a:	1602                	slli	a2,a2,0x20
+ 41c:	9201                	srli	a2,a2,0x20
+ 41e:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 422:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 424:	0585                	addi	a1,a1,1
+ 426:	0705                	addi	a4,a4,1
+ 428:	fff5c683          	lbu	a3,-1(a1)
+ 42c:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 430:	fee79ae3          	bne	a5,a4,424 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 434:	6422                	ld	s0,8(sp)
+ 436:	0141                	addi	sp,sp,16
+ 438:	8082                	ret
+    dst += n;
+ 43a:	00c50733          	add	a4,a0,a2
+    src += n;
+ 43e:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 440:	fec05ae3          	blez	a2,434 <memmove+0x28>
+ 444:	fff6079b          	addiw	a5,a2,-1
+ 448:	1782                	slli	a5,a5,0x20
+ 44a:	9381                	srli	a5,a5,0x20
+ 44c:	fff7c793          	not	a5,a5
+ 450:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 452:	15fd                	addi	a1,a1,-1
+ 454:	177d                	addi	a4,a4,-1
+ 456:	0005c683          	lbu	a3,0(a1)
+ 45a:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 45e:	fee79ae3          	bne	a5,a4,452 <memmove+0x46>
+ 462:	bfc9                	j	434 <memmove+0x28>
+
+0000000000000464 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 464:	1141                	addi	sp,sp,-16
+ 466:	e422                	sd	s0,8(sp)
+ 468:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 46a:	ca05                	beqz	a2,49a <memcmp+0x36>
+ 46c:	fff6069b          	addiw	a3,a2,-1
+ 470:	1682                	slli	a3,a3,0x20
+ 472:	9281                	srli	a3,a3,0x20
+ 474:	0685                	addi	a3,a3,1
+ 476:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 478:	00054783          	lbu	a5,0(a0)
+ 47c:	0005c703          	lbu	a4,0(a1)
+ 480:	00e79863          	bne	a5,a4,490 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 484:	0505                	addi	a0,a0,1
+    p2++;
+ 486:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 488:	fed518e3          	bne	a0,a3,478 <memcmp+0x14>
+  }
+  return 0;
+ 48c:	4501                	li	a0,0
+ 48e:	a019                	j	494 <memcmp+0x30>
+      return *p1 - *p2;
+ 490:	40e7853b          	subw	a0,a5,a4
+}
+ 494:	6422                	ld	s0,8(sp)
+ 496:	0141                	addi	sp,sp,16
+ 498:	8082                	ret
+  return 0;
+ 49a:	4501                	li	a0,0
+ 49c:	bfe5                	j	494 <memcmp+0x30>
+
+000000000000049e <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 49e:	1141                	addi	sp,sp,-16
+ 4a0:	e406                	sd	ra,8(sp)
+ 4a2:	e022                	sd	s0,0(sp)
+ 4a4:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 4a6:	00000097          	auipc	ra,0x0
+ 4aa:	f66080e7          	jalr	-154(ra) # 40c <memmove>
+}
+ 4ae:	60a2                	ld	ra,8(sp)
+ 4b0:	6402                	ld	s0,0(sp)
+ 4b2:	0141                	addi	sp,sp,16
+ 4b4:	8082                	ret
+
+00000000000004b6 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 4b6:	4885                	li	a7,1
+ ecall
+ 4b8:	00000073          	ecall
+ ret
+ 4bc:	8082                	ret
+
+00000000000004be <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 4be:	05d00893          	li	a7,93
+ ecall
+ 4c2:	00000073          	ecall
+ ret
+ 4c6:	8082                	ret
+
+00000000000004c8 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 4c8:	488d                	li	a7,3
+ ecall
+ 4ca:	00000073          	ecall
+ ret
+ 4ce:	8082                	ret
+
+00000000000004d0 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 4d0:	03b00893          	li	a7,59
+ ecall
+ 4d4:	00000073          	ecall
+ ret
+ 4d8:	8082                	ret
+
+00000000000004da <read>:
+.global read
+read:
+ li a7, SYS_read
+ 4da:	03f00893          	li	a7,63
+ ecall
+ 4de:	00000073          	ecall
+ ret
+ 4e2:	8082                	ret
+
+00000000000004e4 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 4e4:	04000893          	li	a7,64
+ ecall
+ 4e8:	00000073          	ecall
+ ret
+ 4ec:	8082                	ret
+
+00000000000004ee <close>:
+.global close
+close:
+ li a7, SYS_close
+ 4ee:	03900893          	li	a7,57
+ ecall
+ 4f2:	00000073          	ecall
+ ret
+ 4f6:	8082                	ret
+
+00000000000004f8 <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 4f8:	4899                	li	a7,6
+ ecall
+ 4fa:	00000073          	ecall
+ ret
+ 4fe:	8082                	ret
+
+0000000000000500 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 500:	0dd00893          	li	a7,221
+ ecall
+ 504:	00000073          	ecall
+ ret
+ 508:	8082                	ret
+
+000000000000050a <open>:
+.global open
+open:
+ li a7, SYS_open
+ 50a:	03800893          	li	a7,56
+ ecall
+ 50e:	00000073          	ecall
+ ret
+ 512:	8082                	ret
+
+0000000000000514 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 514:	05000893          	li	a7,80
+ ecall
+ 518:	00000073          	ecall
+ ret
+ 51c:	8082                	ret
+
+000000000000051e <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 51e:	02200893          	li	a7,34
+ ecall
+ 522:	00000073          	ecall
+ ret
+ 526:	8082                	ret
+
+0000000000000528 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 528:	03100893          	li	a7,49
+ ecall
+ 52c:	00000073          	ecall
+ ret
+ 530:	8082                	ret
+
+0000000000000532 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 532:	48dd                	li	a7,23
+ ecall
+ 534:	00000073          	ecall
+ ret
+ 538:	8082                	ret
+
+000000000000053a <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 53a:	0ac00893          	li	a7,172
+ ecall
+ 53e:	00000073          	ecall
+ ret
+ 542:	8082                	ret
+
+0000000000000544 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 544:	48b1                	li	a7,12
+ ecall
+ 546:	00000073          	ecall
+ ret
+ 54a:	8082                	ret
+
+000000000000054c <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 54c:	48b5                	li	a7,13
+ ecall
+ 54e:	00000073          	ecall
+ ret
+ 552:	8082                	ret
+
+0000000000000554 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 554:	48b9                	li	a7,14
+ ecall
+ 556:	00000073          	ecall
+ ret
+ 55a:	8082                	ret
+
+000000000000055c <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 55c:	48d9                	li	a7,22
+ ecall
+ 55e:	00000073          	ecall
+ ret
+ 562:	8082                	ret
+
+0000000000000564 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 564:	03200893          	li	a7,50
+ ecall
+ 568:	00000073          	ecall
+ ret
+ 56c:	8082                	ret
+
+000000000000056e <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 56e:	48ed                	li	a7,27
+ ecall
+ 570:	00000073          	ecall
+ ret
+ 574:	8082                	ret
+
+0000000000000576 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 576:	48c5                	li	a7,17
+ ecall
+ 578:	00000073          	ecall
+ ret
+ 57c:	8082                	ret
+
+000000000000057e <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 57e:	07500893          	li	a7,117
+ ecall
+ 582:	00000073          	ecall
+ ret
+ 586:	8082                	ret
+
+0000000000000588 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 588:	48c9                	li	a7,18
+ ecall
+ 58a:	00000073          	ecall
+ ret
+ 58e:	8082                	ret
+
+0000000000000590 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 590:	48cd                	li	a7,19
+ ecall
+ 592:	00000073          	ecall
+ ret
+ 596:	8082                	ret
+
+0000000000000598 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 598:	48e9                	li	a7,26
+ ecall
+ 59a:	00000073          	ecall
+ ret
+ 59e:	8082                	ret
+
+00000000000005a0 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 5a0:	0d200893          	li	a7,210
+ ecall
+ 5a4:	00000073          	ecall
+ ret
+ 5a8:	8082                	ret
+
+00000000000005aa <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 5aa:	1101                	addi	sp,sp,-32
+ 5ac:	ec06                	sd	ra,24(sp)
+ 5ae:	e822                	sd	s0,16(sp)
+ 5b0:	1000                	addi	s0,sp,32
+ 5b2:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 5b6:	4605                	li	a2,1
+ 5b8:	fef40593          	addi	a1,s0,-17
+ 5bc:	00000097          	auipc	ra,0x0
+ 5c0:	f28080e7          	jalr	-216(ra) # 4e4 <write>
+}
+ 5c4:	60e2                	ld	ra,24(sp)
+ 5c6:	6442                	ld	s0,16(sp)
+ 5c8:	6105                	addi	sp,sp,32
+ 5ca:	8082                	ret
+
+00000000000005cc <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 5cc:	7139                	addi	sp,sp,-64
+ 5ce:	fc06                	sd	ra,56(sp)
+ 5d0:	f822                	sd	s0,48(sp)
+ 5d2:	f426                	sd	s1,40(sp)
+ 5d4:	f04a                	sd	s2,32(sp)
+ 5d6:	ec4e                	sd	s3,24(sp)
+ 5d8:	0080                	addi	s0,sp,64
+ 5da:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 5dc:	c299                	beqz	a3,5e2 <printint+0x16>
+ 5de:	0805c863          	bltz	a1,66e <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 5e2:	2581                	sext.w	a1,a1
+  neg = 0;
+ 5e4:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 5e6:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 5ea:	86ce                	mv	a3,s3
+  i = 0;
+ 5ec:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 5ee:	2601                	sext.w	a2,a2
+ 5f0:	00000517          	auipc	a0,0x0
+ 5f4:	51850513          	addi	a0,a0,1304 # b08 <digits>
+ 5f8:	883a                	mv	a6,a4
+ 5fa:	2705                	addiw	a4,a4,1
+ 5fc:	02c5f7bb          	remuw	a5,a1,a2
+ 600:	1782                	slli	a5,a5,0x20
+ 602:	9381                	srli	a5,a5,0x20
+ 604:	97aa                	add	a5,a5,a0
+ 606:	0007c783          	lbu	a5,0(a5)
+ 60a:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 60e:	0005879b          	sext.w	a5,a1
+ 612:	02c5d5bb          	divuw	a1,a1,a2
+ 616:	0685                	addi	a3,a3,1
+ 618:	fec7f0e3          	bgeu	a5,a2,5f8 <printint+0x2c>
+  if(neg)
+ 61c:	00088c63          	beqz	a7,634 <printint+0x68>
+    buf[i++] = '-';
+ 620:	fd070793          	addi	a5,a4,-48
+ 624:	00878733          	add	a4,a5,s0
+ 628:	02d00793          	li	a5,45
+ 62c:	fef70823          	sb	a5,-16(a4)
+ 630:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 634:	02e05663          	blez	a4,660 <printint+0x94>
+ 638:	fc040913          	addi	s2,s0,-64
+ 63c:	993a                	add	s2,s2,a4
+ 63e:	19fd                	addi	s3,s3,-1
+ 640:	99ba                	add	s3,s3,a4
+ 642:	377d                	addiw	a4,a4,-1
+ 644:	1702                	slli	a4,a4,0x20
+ 646:	9301                	srli	a4,a4,0x20
+ 648:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 64c:	fff94583          	lbu	a1,-1(s2)
+ 650:	8526                	mv	a0,s1
+ 652:	00000097          	auipc	ra,0x0
+ 656:	f58080e7          	jalr	-168(ra) # 5aa <putc>
+  while(--i >= 0)
+ 65a:	197d                	addi	s2,s2,-1
+ 65c:	ff3918e3          	bne	s2,s3,64c <printint+0x80>
+}
+ 660:	70e2                	ld	ra,56(sp)
+ 662:	7442                	ld	s0,48(sp)
+ 664:	74a2                	ld	s1,40(sp)
+ 666:	7902                	ld	s2,32(sp)
+ 668:	69e2                	ld	s3,24(sp)
+ 66a:	6121                	addi	sp,sp,64
+ 66c:	8082                	ret
+    x = -xx;
+ 66e:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 672:	4885                	li	a7,1
+    x = -xx;
+ 674:	bf8d                	j	5e6 <printint+0x1a>
+
+0000000000000676 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 676:	7119                	addi	sp,sp,-128
+ 678:	fc86                	sd	ra,120(sp)
+ 67a:	f8a2                	sd	s0,112(sp)
+ 67c:	f4a6                	sd	s1,104(sp)
+ 67e:	f0ca                	sd	s2,96(sp)
+ 680:	ecce                	sd	s3,88(sp)
+ 682:	e8d2                	sd	s4,80(sp)
+ 684:	e4d6                	sd	s5,72(sp)
+ 686:	e0da                	sd	s6,64(sp)
+ 688:	fc5e                	sd	s7,56(sp)
+ 68a:	f862                	sd	s8,48(sp)
+ 68c:	f466                	sd	s9,40(sp)
+ 68e:	f06a                	sd	s10,32(sp)
+ 690:	ec6e                	sd	s11,24(sp)
+ 692:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 694:	0005c903          	lbu	s2,0(a1)
+ 698:	18090f63          	beqz	s2,836 <vprintf+0x1c0>
+ 69c:	8aaa                	mv	s5,a0
+ 69e:	8b32                	mv	s6,a2
+ 6a0:	00158493          	addi	s1,a1,1
+  state = 0;
+ 6a4:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 6a6:	02500a13          	li	s4,37
+ 6aa:	4c55                	li	s8,21
+ 6ac:	00000c97          	auipc	s9,0x0
+ 6b0:	404c8c93          	addi	s9,s9,1028 # ab0 <malloc+0x176>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 6b4:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 6b8:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 6ba:	00000b97          	auipc	s7,0x0
+ 6be:	44eb8b93          	addi	s7,s7,1102 # b08 <digits>
+ 6c2:	a839                	j	6e0 <vprintf+0x6a>
+        putc(fd, c);
+ 6c4:	85ca                	mv	a1,s2
+ 6c6:	8556                	mv	a0,s5
+ 6c8:	00000097          	auipc	ra,0x0
+ 6cc:	ee2080e7          	jalr	-286(ra) # 5aa <putc>
+ 6d0:	a019                	j	6d6 <vprintf+0x60>
+    } else if(state == '%'){
+ 6d2:	01498d63          	beq	s3,s4,6ec <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 6d6:	0485                	addi	s1,s1,1
+ 6d8:	fff4c903          	lbu	s2,-1(s1)
+ 6dc:	14090d63          	beqz	s2,836 <vprintf+0x1c0>
+    if(state == 0){
+ 6e0:	fe0999e3          	bnez	s3,6d2 <vprintf+0x5c>
+      if(c == '%'){
+ 6e4:	ff4910e3          	bne	s2,s4,6c4 <vprintf+0x4e>
+        state = '%';
+ 6e8:	89d2                	mv	s3,s4
+ 6ea:	b7f5                	j	6d6 <vprintf+0x60>
+      if(c == 'd'){
+ 6ec:	11490c63          	beq	s2,s4,804 <vprintf+0x18e>
+ 6f0:	f9d9079b          	addiw	a5,s2,-99
+ 6f4:	0ff7f793          	zext.b	a5,a5
+ 6f8:	10fc6e63          	bltu	s8,a5,814 <vprintf+0x19e>
+ 6fc:	f9d9079b          	addiw	a5,s2,-99
+ 700:	0ff7f713          	zext.b	a4,a5
+ 704:	10ec6863          	bltu	s8,a4,814 <vprintf+0x19e>
+ 708:	00271793          	slli	a5,a4,0x2
+ 70c:	97e6                	add	a5,a5,s9
+ 70e:	439c                	lw	a5,0(a5)
+ 710:	97e6                	add	a5,a5,s9
+ 712:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 714:	008b0913          	addi	s2,s6,8
+ 718:	4685                	li	a3,1
+ 71a:	4629                	li	a2,10
+ 71c:	000b2583          	lw	a1,0(s6)
+ 720:	8556                	mv	a0,s5
+ 722:	00000097          	auipc	ra,0x0
+ 726:	eaa080e7          	jalr	-342(ra) # 5cc <printint>
+ 72a:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 72c:	4981                	li	s3,0
+ 72e:	b765                	j	6d6 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 730:	008b0913          	addi	s2,s6,8
+ 734:	4681                	li	a3,0
+ 736:	4629                	li	a2,10
+ 738:	000b2583          	lw	a1,0(s6)
+ 73c:	8556                	mv	a0,s5
+ 73e:	00000097          	auipc	ra,0x0
+ 742:	e8e080e7          	jalr	-370(ra) # 5cc <printint>
+ 746:	8b4a                	mv	s6,s2
+      state = 0;
+ 748:	4981                	li	s3,0
+ 74a:	b771                	j	6d6 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 74c:	008b0913          	addi	s2,s6,8
+ 750:	4681                	li	a3,0
+ 752:	866a                	mv	a2,s10
+ 754:	000b2583          	lw	a1,0(s6)
+ 758:	8556                	mv	a0,s5
+ 75a:	00000097          	auipc	ra,0x0
+ 75e:	e72080e7          	jalr	-398(ra) # 5cc <printint>
+ 762:	8b4a                	mv	s6,s2
+      state = 0;
+ 764:	4981                	li	s3,0
+ 766:	bf85                	j	6d6 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 768:	008b0793          	addi	a5,s6,8
+ 76c:	f8f43423          	sd	a5,-120(s0)
+ 770:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 774:	03000593          	li	a1,48
+ 778:	8556                	mv	a0,s5
+ 77a:	00000097          	auipc	ra,0x0
+ 77e:	e30080e7          	jalr	-464(ra) # 5aa <putc>
+  putc(fd, 'x');
+ 782:	07800593          	li	a1,120
+ 786:	8556                	mv	a0,s5
+ 788:	00000097          	auipc	ra,0x0
+ 78c:	e22080e7          	jalr	-478(ra) # 5aa <putc>
+ 790:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 792:	03c9d793          	srli	a5,s3,0x3c
+ 796:	97de                	add	a5,a5,s7
+ 798:	0007c583          	lbu	a1,0(a5)
+ 79c:	8556                	mv	a0,s5
+ 79e:	00000097          	auipc	ra,0x0
+ 7a2:	e0c080e7          	jalr	-500(ra) # 5aa <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 7a6:	0992                	slli	s3,s3,0x4
+ 7a8:	397d                	addiw	s2,s2,-1
+ 7aa:	fe0914e3          	bnez	s2,792 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 7ae:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 7b2:	4981                	li	s3,0
+ 7b4:	b70d                	j	6d6 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 7b6:	008b0913          	addi	s2,s6,8
+ 7ba:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 7be:	02098163          	beqz	s3,7e0 <vprintf+0x16a>
+        while(*s != 0){
+ 7c2:	0009c583          	lbu	a1,0(s3)
+ 7c6:	c5ad                	beqz	a1,830 <vprintf+0x1ba>
+          putc(fd, *s);
+ 7c8:	8556                	mv	a0,s5
+ 7ca:	00000097          	auipc	ra,0x0
+ 7ce:	de0080e7          	jalr	-544(ra) # 5aa <putc>
+          s++;
+ 7d2:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 7d4:	0009c583          	lbu	a1,0(s3)
+ 7d8:	f9e5                	bnez	a1,7c8 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 7da:	8b4a                	mv	s6,s2
+      state = 0;
+ 7dc:	4981                	li	s3,0
+ 7de:	bde5                	j	6d6 <vprintf+0x60>
+          s = "(null)";
+ 7e0:	00000997          	auipc	s3,0x0
+ 7e4:	2c898993          	addi	s3,s3,712 # aa8 <malloc+0x16e>
+        while(*s != 0){
+ 7e8:	85ee                	mv	a1,s11
+ 7ea:	bff9                	j	7c8 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 7ec:	008b0913          	addi	s2,s6,8
+ 7f0:	000b4583          	lbu	a1,0(s6)
+ 7f4:	8556                	mv	a0,s5
+ 7f6:	00000097          	auipc	ra,0x0
+ 7fa:	db4080e7          	jalr	-588(ra) # 5aa <putc>
+ 7fe:	8b4a                	mv	s6,s2
+      state = 0;
+ 800:	4981                	li	s3,0
+ 802:	bdd1                	j	6d6 <vprintf+0x60>
+        putc(fd, c);
+ 804:	85d2                	mv	a1,s4
+ 806:	8556                	mv	a0,s5
+ 808:	00000097          	auipc	ra,0x0
+ 80c:	da2080e7          	jalr	-606(ra) # 5aa <putc>
+      state = 0;
+ 810:	4981                	li	s3,0
+ 812:	b5d1                	j	6d6 <vprintf+0x60>
+        putc(fd, '%');
+ 814:	85d2                	mv	a1,s4
+ 816:	8556                	mv	a0,s5
+ 818:	00000097          	auipc	ra,0x0
+ 81c:	d92080e7          	jalr	-622(ra) # 5aa <putc>
+        putc(fd, c);
+ 820:	85ca                	mv	a1,s2
+ 822:	8556                	mv	a0,s5
+ 824:	00000097          	auipc	ra,0x0
+ 828:	d86080e7          	jalr	-634(ra) # 5aa <putc>
+      state = 0;
+ 82c:	4981                	li	s3,0
+ 82e:	b565                	j	6d6 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 830:	8b4a                	mv	s6,s2
+      state = 0;
+ 832:	4981                	li	s3,0
+ 834:	b54d                	j	6d6 <vprintf+0x60>
+    }
+  }
+}
+ 836:	70e6                	ld	ra,120(sp)
+ 838:	7446                	ld	s0,112(sp)
+ 83a:	74a6                	ld	s1,104(sp)
+ 83c:	7906                	ld	s2,96(sp)
+ 83e:	69e6                	ld	s3,88(sp)
+ 840:	6a46                	ld	s4,80(sp)
+ 842:	6aa6                	ld	s5,72(sp)
+ 844:	6b06                	ld	s6,64(sp)
+ 846:	7be2                	ld	s7,56(sp)
+ 848:	7c42                	ld	s8,48(sp)
+ 84a:	7ca2                	ld	s9,40(sp)
+ 84c:	7d02                	ld	s10,32(sp)
+ 84e:	6de2                	ld	s11,24(sp)
+ 850:	6109                	addi	sp,sp,128
+ 852:	8082                	ret
+
+0000000000000854 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 854:	715d                	addi	sp,sp,-80
+ 856:	ec06                	sd	ra,24(sp)
+ 858:	e822                	sd	s0,16(sp)
+ 85a:	1000                	addi	s0,sp,32
+ 85c:	e010                	sd	a2,0(s0)
+ 85e:	e414                	sd	a3,8(s0)
+ 860:	e818                	sd	a4,16(s0)
+ 862:	ec1c                	sd	a5,24(s0)
+ 864:	03043023          	sd	a6,32(s0)
+ 868:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 86c:	8622                	mv	a2,s0
+ 86e:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 872:	00000097          	auipc	ra,0x0
+ 876:	e04080e7          	jalr	-508(ra) # 676 <vprintf>
+}
+ 87a:	60e2                	ld	ra,24(sp)
+ 87c:	6442                	ld	s0,16(sp)
+ 87e:	6161                	addi	sp,sp,80
+ 880:	8082                	ret
+
+0000000000000882 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 882:	711d                	addi	sp,sp,-96
+ 884:	ec06                	sd	ra,24(sp)
+ 886:	e822                	sd	s0,16(sp)
+ 888:	1000                	addi	s0,sp,32
+ 88a:	e40c                	sd	a1,8(s0)
+ 88c:	e810                	sd	a2,16(s0)
+ 88e:	ec14                	sd	a3,24(s0)
+ 890:	f018                	sd	a4,32(s0)
+ 892:	f41c                	sd	a5,40(s0)
+ 894:	03043823          	sd	a6,48(s0)
+ 898:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 89c:	00840613          	addi	a2,s0,8
+ 8a0:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 8a4:	85aa                	mv	a1,a0
+ 8a6:	4505                	li	a0,1
+ 8a8:	00000097          	auipc	ra,0x0
+ 8ac:	dce080e7          	jalr	-562(ra) # 676 <vprintf>
+}
+ 8b0:	60e2                	ld	ra,24(sp)
+ 8b2:	6442                	ld	s0,16(sp)
+ 8b4:	6125                	addi	sp,sp,96
+ 8b6:	8082                	ret
+
+00000000000008b8 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 8b8:	1141                	addi	sp,sp,-16
+ 8ba:	e422                	sd	s0,8(sp)
+ 8bc:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 8be:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 8c2:	00000797          	auipc	a5,0x0
+ 8c6:	45e7b783          	ld	a5,1118(a5) # d20 <freep>
+ 8ca:	a02d                	j	8f4 <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;
+ 8cc:	4618                	lw	a4,8(a2)
+ 8ce:	9f2d                	addw	a4,a4,a1
+ 8d0:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 8d4:	6398                	ld	a4,0(a5)
+ 8d6:	6310                	ld	a2,0(a4)
+ 8d8:	a83d                	j	916 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 8da:	ff852703          	lw	a4,-8(a0)
+ 8de:	9f31                	addw	a4,a4,a2
+ 8e0:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 8e2:	ff053683          	ld	a3,-16(a0)
+ 8e6:	a091                	j	92a <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 8e8:	6398                	ld	a4,0(a5)
+ 8ea:	00e7e463          	bltu	a5,a4,8f2 <free+0x3a>
+ 8ee:	00e6ea63          	bltu	a3,a4,902 <free+0x4a>
+{
+ 8f2:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 8f4:	fed7fae3          	bgeu	a5,a3,8e8 <free+0x30>
+ 8f8:	6398                	ld	a4,0(a5)
+ 8fa:	00e6e463          	bltu	a3,a4,902 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 8fe:	fee7eae3          	bltu	a5,a4,8f2 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 902:	ff852583          	lw	a1,-8(a0)
+ 906:	6390                	ld	a2,0(a5)
+ 908:	02059813          	slli	a6,a1,0x20
+ 90c:	01c85713          	srli	a4,a6,0x1c
+ 910:	9736                	add	a4,a4,a3
+ 912:	fae60de3          	beq	a2,a4,8cc <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 916:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 91a:	4790                	lw	a2,8(a5)
+ 91c:	02061593          	slli	a1,a2,0x20
+ 920:	01c5d713          	srli	a4,a1,0x1c
+ 924:	973e                	add	a4,a4,a5
+ 926:	fae68ae3          	beq	a3,a4,8da <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 92a:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 92c:	00000717          	auipc	a4,0x0
+ 930:	3ef73a23          	sd	a5,1012(a4) # d20 <freep>
+}
+ 934:	6422                	ld	s0,8(sp)
+ 936:	0141                	addi	sp,sp,16
+ 938:	8082                	ret
+
+000000000000093a <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 93a:	7139                	addi	sp,sp,-64
+ 93c:	fc06                	sd	ra,56(sp)
+ 93e:	f822                	sd	s0,48(sp)
+ 940:	f426                	sd	s1,40(sp)
+ 942:	f04a                	sd	s2,32(sp)
+ 944:	ec4e                	sd	s3,24(sp)
+ 946:	e852                	sd	s4,16(sp)
+ 948:	e456                	sd	s5,8(sp)
+ 94a:	e05a                	sd	s6,0(sp)
+ 94c:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 94e:	02051493          	slli	s1,a0,0x20
+ 952:	9081                	srli	s1,s1,0x20
+ 954:	04bd                	addi	s1,s1,15
+ 956:	8091                	srli	s1,s1,0x4
+ 958:	00148a1b          	addiw	s4,s1,1
+ 95c:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 95e:	00000517          	auipc	a0,0x0
+ 962:	3c253503          	ld	a0,962(a0) # d20 <freep>
+ 966:	c515                	beqz	a0,992 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 968:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 96a:	4798                	lw	a4,8(a5)
+ 96c:	04977163          	bgeu	a4,s1,9ae <malloc+0x74>
+ 970:	89d2                	mv	s3,s4
+ 972:	000a071b          	sext.w	a4,s4
+ 976:	6685                	lui	a3,0x1
+ 978:	00d77363          	bgeu	a4,a3,97e <malloc+0x44>
+ 97c:	6985                	lui	s3,0x1
+ 97e:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 982:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 986:	00000917          	auipc	s2,0x0
+ 98a:	39a90913          	addi	s2,s2,922 # d20 <freep>
+  if(p == (char*)-1)
+ 98e:	5afd                	li	s5,-1
+ 990:	a8a5                	j	a08 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 992:	00000797          	auipc	a5,0x0
+ 996:	38e78793          	addi	a5,a5,910 # d20 <freep>
+ 99a:	00000717          	auipc	a4,0x0
+ 99e:	38e70713          	addi	a4,a4,910 # d28 <base>
+ 9a2:	e398                	sd	a4,0(a5)
+ 9a4:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 9a6:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 9aa:	87ba                	mv	a5,a4
+ 9ac:	b7d1                	j	970 <malloc+0x36>
+      if(p->s.size == nunits)
+ 9ae:	02e48c63          	beq	s1,a4,9e6 <malloc+0xac>
+        p->s.size -= nunits;
+ 9b2:	4147073b          	subw	a4,a4,s4
+ 9b6:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 9b8:	02071693          	slli	a3,a4,0x20
+ 9bc:	01c6d713          	srli	a4,a3,0x1c
+ 9c0:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 9c2:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 9c6:	00000717          	auipc	a4,0x0
+ 9ca:	34a73d23          	sd	a0,858(a4) # d20 <freep>
+      return (void*)(p + 1);
+ 9ce:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 9d2:	70e2                	ld	ra,56(sp)
+ 9d4:	7442                	ld	s0,48(sp)
+ 9d6:	74a2                	ld	s1,40(sp)
+ 9d8:	7902                	ld	s2,32(sp)
+ 9da:	69e2                	ld	s3,24(sp)
+ 9dc:	6a42                	ld	s4,16(sp)
+ 9de:	6aa2                	ld	s5,8(sp)
+ 9e0:	6b02                	ld	s6,0(sp)
+ 9e2:	6121                	addi	sp,sp,64
+ 9e4:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 9e6:	6398                	ld	a4,0(a5)
+ 9e8:	e118                	sd	a4,0(a0)
+ 9ea:	bff1                	j	9c6 <malloc+0x8c>
+  hp->s.size = nu;
+ 9ec:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 9f0:	0541                	addi	a0,a0,16
+ 9f2:	00000097          	auipc	ra,0x0
+ 9f6:	ec6080e7          	jalr	-314(ra) # 8b8 <free>
+  return freep;
+ 9fa:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 9fe:	d971                	beqz	a0,9d2 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ a00:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ a02:	4798                	lw	a4,8(a5)
+ a04:	fa9775e3          	bgeu	a4,s1,9ae <malloc+0x74>
+    if(p == freep)
+ a08:	00093703          	ld	a4,0(s2)
+ a0c:	853e                	mv	a0,a5
+ a0e:	fef719e3          	bne	a4,a5,a00 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ a12:	854e                	mv	a0,s3
+ a14:	00000097          	auipc	ra,0x0
+ a18:	b30080e7          	jalr	-1232(ra) # 544 <sbrk>
+  if(p == (char*)-1)
+ a1c:	fd5518e3          	bne	a0,s5,9ec <malloc+0xb2>
+        return 0;
+ a20:	4501                	li	a0,0
+ a22:	bf45                	j	9d2 <malloc+0x98>
diff --git a/xv6-user/find.c b/xv6-user/find.c
new file mode 100644
index 0000000000000000000000000000000000000000..b6891703d8334349fbbb29120a2dcc57881c91a7
--- /dev/null
+++ b/xv6-user/find.c
@@ -0,0 +1,60 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+static char path[512];
+
+void find(char *filename)
+{
+    int fd;
+    struct stat st;
+    if ((fd = open(path, O_RDONLY)) < 0) {
+        fprintf(2, "find: cannot open %s\n", path);
+        return;
+    }
+    if (fstat(fd, &st) < 0) {
+        fprintf(2, "find: cannot stat %s\n", path);
+        close(fd);
+        return;
+    }
+    if (st.type != T_DIR) {
+        close(fd);
+        return;
+    }
+    if (strlen(path) + 255 + 2 > sizeof(path)) {
+        fprintf(2, "find: path too long\n");
+        close(fd);
+        return;
+    }
+    char *p = path + strlen(path) - 1;
+    if (*p != '/') {
+        *++p = '/';
+    }
+    p++;
+    while (readdir(fd, &st)) {
+        strcpy(p, st.name);
+        if (strcmp(p, ".") == 0 || strcmp(p, "..") == 0) {
+            continue;
+        }
+        if (strcmp(p, filename) == 0) {
+            fprintf(1, "%s\n", path);
+        }
+        find(filename);
+    }
+    close(fd);
+    return;
+}
+
+
+int main(int argc, char *argv[])
+{
+    if (argc < 3) {
+        fprintf(2, "Usage: find DIR FILENAME\n");
+        exit(0);
+    } else {
+        strcpy(path, argv[1]);
+        find(argv[2]);
+    }
+    exit(0);
+}
diff --git a/xv6-user/find.d b/xv6-user/find.d
new file mode 100644
index 0000000000000000000000000000000000000000..524a923fc101ba278cfa5947522cc8920220ce70
--- /dev/null
+++ b/xv6-user/find.d
@@ -0,0 +1,2 @@
+xv6-user/find.o: xv6-user/find.c kernel/include/types.h \
+ kernel/include/stat.h kernel/include/fcntl.h xv6-user/user.h
diff --git a/xv6-user/find.o b/xv6-user/find.o
new file mode 100644
index 0000000000000000000000000000000000000000..a360e583082690b378168c8282a5592692d532db
Binary files /dev/null and b/xv6-user/find.o differ
diff --git a/xv6-user/find.sym b/xv6-user/find.sym
new file mode 100644
index 0000000000000000000000000000000000000000..c68bfea39267ba7f7ad0776b9e12820603a94ddd
--- /dev/null
+++ b/xv6-user/find.sym
@@ -0,0 +1,78 @@
+0000000000000000 .text
+0000000000000a28 .rodata
+0000000000000b20 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 find.c
+0000000000000b20 path
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+00000000000005aa putc
+00000000000005cc printint
+0000000000000b08 digits
+0000000000000000 umalloc.c
+0000000000000d20 freep
+0000000000000d28 base
+0000000000000206 strcpy
+0000000000000882 printf
+0000000000001319 __global_pointer$
+0000000000000564 dev
+000000000000040c memmove
+0000000000000588 trace
+00000000000002ec gets
+0000000000000b19 __SDATA_BEGIN__
+000000000000053a getpid
+000000000000049e memcpy
+000000000000093a malloc
+000000000000057e remove
+000000000000054c sleep
+0000000000000590 sysinfo
+000000000000056e readdir
+00000000000004d0 pipe
+0000000000000598 rename
+00000000000004e4 write
+0000000000000514 fstat
+0000000000000854 fprintf
+00000000000004f8 kill
+0000000000000222 strcat
+0000000000000676 vprintf
+0000000000000528 chdir
+0000000000000500 exec
+00000000000004c8 wait
+00000000000004da read
+0000000000000000 find
+0000000000000464 memcmp
+00000000000004b6 fork
+0000000000000d38 __BSS_END__
+0000000000000544 sbrk
+000000000000055c test_proc
+0000000000000554 uptime
+0000000000000b19 __bss_start
+00000000000002a6 memset
+00000000000001b2 main
+0000000000000250 strcmp
+00000000000005a0 shutdown
+0000000000000532 dup
+0000000000000576 getcwd
+0000000000000b19 __DATA_BEGIN__
+0000000000000366 stat
+0000000000000b19 _edata
+0000000000000d38 _end
+00000000000004be exit
+00000000000003ac atoi
+000000000000027c strlen
+000000000000050a open
+00000000000002c8 strchr
+000000000000051e mkdir
+00000000000004ee close
+00000000000008b8 free
diff --git a/xv6-user/forktest.c b/xv6-user/forktest.c
new file mode 100644
index 0000000000000000000000000000000000000000..ca72bade90124a38512e432a2f72fe49ec3b4e1a
--- /dev/null
+++ b/xv6-user/forktest.c
@@ -0,0 +1,56 @@
+// Test that fork fails gracefully.
+// Tiny executable so that the limit can be filling the proc table.
+
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+#define N  1000
+
+void
+print(const char *s)
+{
+  write(1, s, strlen(s));
+}
+
+void
+forktest(void)
+{
+  int n, pid;
+
+  print("fork test\n");
+
+  for(n=0; n<N; n++){
+    pid = fork();
+    if(pid < 0)
+      break;
+    if(pid == 0)
+      exit(0);
+  }
+
+  if(n == N){
+    print("fork claimed to work N times!\n");
+    exit(1);
+  }
+
+  for(; n > 0; n--){
+    if(wait(0) < 0){
+      print("wait stopped early\n");
+      exit(1);
+    }
+  }
+
+  if(wait(0) != -1){
+    print("wait got too many\n");
+    exit(1);
+  }
+
+  print("fork test OK\n");
+}
+
+int
+main(void)
+{
+  forktest();
+  exit(0);
+}
diff --git a/xv6-user/grep.asm b/xv6-user/grep.asm
new file mode 100644
index 0000000000000000000000000000000000000000..3cab3552df5e2a5af29ec5d3d8f204c0a8c0e049
--- /dev/null
+++ b/xv6-user/grep.asm
@@ -0,0 +1,1709 @@
+
+xv6-user/_grep:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <matchstar>:
+  return 0;
+}
+
+// matchstar: search for c*re at beginning of text
+int matchstar(int c, char *re, char *text)
+{
+   0:	7179                	addi	sp,sp,-48
+   2:	f406                	sd	ra,40(sp)
+   4:	f022                	sd	s0,32(sp)
+   6:	ec26                	sd	s1,24(sp)
+   8:	e84a                	sd	s2,16(sp)
+   a:	e44e                	sd	s3,8(sp)
+   c:	e052                	sd	s4,0(sp)
+   e:	1800                	addi	s0,sp,48
+  10:	892a                	mv	s2,a0
+  12:	89ae                	mv	s3,a1
+  14:	84b2                	mv	s1,a2
+  do{  // a * matches zero or more instances
+    if(matchhere(re, text))
+      return 1;
+  }while(*text!='\0' && (*text++==c || c=='.'));
+  16:	02e00a13          	li	s4,46
+    if(matchhere(re, text))
+  1a:	85a6                	mv	a1,s1
+  1c:	854e                	mv	a0,s3
+  1e:	00000097          	auipc	ra,0x0
+  22:	030080e7          	jalr	48(ra) # 4e <matchhere>
+  26:	e919                	bnez	a0,3c <matchstar+0x3c>
+  }while(*text!='\0' && (*text++==c || c=='.'));
+  28:	0004c783          	lbu	a5,0(s1)
+  2c:	cb89                	beqz	a5,3e <matchstar+0x3e>
+  2e:	0485                	addi	s1,s1,1
+  30:	2781                	sext.w	a5,a5
+  32:	ff2784e3          	beq	a5,s2,1a <matchstar+0x1a>
+  36:	ff4902e3          	beq	s2,s4,1a <matchstar+0x1a>
+  3a:	a011                	j	3e <matchstar+0x3e>
+      return 1;
+  3c:	4505                	li	a0,1
+  return 0;
+}
+  3e:	70a2                	ld	ra,40(sp)
+  40:	7402                	ld	s0,32(sp)
+  42:	64e2                	ld	s1,24(sp)
+  44:	6942                	ld	s2,16(sp)
+  46:	69a2                	ld	s3,8(sp)
+  48:	6a02                	ld	s4,0(sp)
+  4a:	6145                	addi	sp,sp,48
+  4c:	8082                	ret
+
+000000000000004e <matchhere>:
+  if(re[0] == '\0')
+  4e:	00054703          	lbu	a4,0(a0)
+  52:	cb3d                	beqz	a4,c8 <matchhere+0x7a>
+{
+  54:	1141                	addi	sp,sp,-16
+  56:	e406                	sd	ra,8(sp)
+  58:	e022                	sd	s0,0(sp)
+  5a:	0800                	addi	s0,sp,16
+  5c:	87aa                	mv	a5,a0
+  if(re[1] == '*')
+  5e:	00154683          	lbu	a3,1(a0)
+  62:	02a00613          	li	a2,42
+  66:	02c68563          	beq	a3,a2,90 <matchhere+0x42>
+  if(re[0] == '$' && re[1] == '\0')
+  6a:	02400613          	li	a2,36
+  6e:	02c70a63          	beq	a4,a2,a2 <matchhere+0x54>
+  if(*text!='\0' && (re[0]=='.' || re[0]==*text))
+  72:	0005c683          	lbu	a3,0(a1)
+  return 0;
+  76:	4501                	li	a0,0
+  if(*text!='\0' && (re[0]=='.' || re[0]==*text))
+  78:	ca81                	beqz	a3,88 <matchhere+0x3a>
+  7a:	02e00613          	li	a2,46
+  7e:	02c70d63          	beq	a4,a2,b8 <matchhere+0x6a>
+  return 0;
+  82:	4501                	li	a0,0
+  if(*text!='\0' && (re[0]=='.' || re[0]==*text))
+  84:	02d70a63          	beq	a4,a3,b8 <matchhere+0x6a>
+}
+  88:	60a2                	ld	ra,8(sp)
+  8a:	6402                	ld	s0,0(sp)
+  8c:	0141                	addi	sp,sp,16
+  8e:	8082                	ret
+    return matchstar(re[0], re+2, text);
+  90:	862e                	mv	a2,a1
+  92:	00250593          	addi	a1,a0,2
+  96:	853a                	mv	a0,a4
+  98:	00000097          	auipc	ra,0x0
+  9c:	f68080e7          	jalr	-152(ra) # 0 <matchstar>
+  a0:	b7e5                	j	88 <matchhere+0x3a>
+  if(re[0] == '$' && re[1] == '\0')
+  a2:	c691                	beqz	a3,ae <matchhere+0x60>
+  if(*text!='\0' && (re[0]=='.' || re[0]==*text))
+  a4:	0005c683          	lbu	a3,0(a1)
+  a8:	fee9                	bnez	a3,82 <matchhere+0x34>
+  return 0;
+  aa:	4501                	li	a0,0
+  ac:	bff1                	j	88 <matchhere+0x3a>
+    return *text == '\0';
+  ae:	0005c503          	lbu	a0,0(a1)
+  b2:	00153513          	seqz	a0,a0
+  b6:	bfc9                	j	88 <matchhere+0x3a>
+    return matchhere(re+1, text+1);
+  b8:	0585                	addi	a1,a1,1
+  ba:	00178513          	addi	a0,a5,1
+  be:	00000097          	auipc	ra,0x0
+  c2:	f90080e7          	jalr	-112(ra) # 4e <matchhere>
+  c6:	b7c9                	j	88 <matchhere+0x3a>
+    return 1;
+  c8:	4505                	li	a0,1
+}
+  ca:	8082                	ret
+
+00000000000000cc <match>:
+{
+  cc:	1101                	addi	sp,sp,-32
+  ce:	ec06                	sd	ra,24(sp)
+  d0:	e822                	sd	s0,16(sp)
+  d2:	e426                	sd	s1,8(sp)
+  d4:	e04a                	sd	s2,0(sp)
+  d6:	1000                	addi	s0,sp,32
+  d8:	892a                	mv	s2,a0
+  da:	84ae                	mv	s1,a1
+  if(re[0] == '^')
+  dc:	00054703          	lbu	a4,0(a0)
+  e0:	05e00793          	li	a5,94
+  e4:	00f70e63          	beq	a4,a5,100 <match+0x34>
+    if(matchhere(re, text))
+  e8:	85a6                	mv	a1,s1
+  ea:	854a                	mv	a0,s2
+  ec:	00000097          	auipc	ra,0x0
+  f0:	f62080e7          	jalr	-158(ra) # 4e <matchhere>
+  f4:	ed01                	bnez	a0,10c <match+0x40>
+  }while(*text++ != '\0');
+  f6:	0485                	addi	s1,s1,1
+  f8:	fff4c783          	lbu	a5,-1(s1)
+  fc:	f7f5                	bnez	a5,e8 <match+0x1c>
+  fe:	a801                	j	10e <match+0x42>
+    return matchhere(re+1, text);
+ 100:	0505                	addi	a0,a0,1
+ 102:	00000097          	auipc	ra,0x0
+ 106:	f4c080e7          	jalr	-180(ra) # 4e <matchhere>
+ 10a:	a011                	j	10e <match+0x42>
+      return 1;
+ 10c:	4505                	li	a0,1
+}
+ 10e:	60e2                	ld	ra,24(sp)
+ 110:	6442                	ld	s0,16(sp)
+ 112:	64a2                	ld	s1,8(sp)
+ 114:	6902                	ld	s2,0(sp)
+ 116:	6105                	addi	sp,sp,32
+ 118:	8082                	ret
+
+000000000000011a <grep>:
+{
+ 11a:	715d                	addi	sp,sp,-80
+ 11c:	e486                	sd	ra,72(sp)
+ 11e:	e0a2                	sd	s0,64(sp)
+ 120:	fc26                	sd	s1,56(sp)
+ 122:	f84a                	sd	s2,48(sp)
+ 124:	f44e                	sd	s3,40(sp)
+ 126:	f052                	sd	s4,32(sp)
+ 128:	ec56                	sd	s5,24(sp)
+ 12a:	e85a                	sd	s6,16(sp)
+ 12c:	e45e                	sd	s7,8(sp)
+ 12e:	0880                	addi	s0,sp,80
+ 130:	89aa                	mv	s3,a0
+ 132:	8b2e                	mv	s6,a1
+  m = 0;
+ 134:	4a01                	li	s4,0
+  while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){
+ 136:	3ff00b93          	li	s7,1023
+ 13a:	00001a97          	auipc	s5,0x1
+ 13e:	a36a8a93          	addi	s5,s5,-1482 # b70 <buf>
+ 142:	a0a1                	j	18a <grep+0x70>
+      p = q+1;
+ 144:	00148913          	addi	s2,s1,1
+    while((q = strchr(p, '\n')) != 0){
+ 148:	45a9                	li	a1,10
+ 14a:	854a                	mv	a0,s2
+ 14c:	00000097          	auipc	ra,0x0
+ 150:	214080e7          	jalr	532(ra) # 360 <strchr>
+ 154:	84aa                	mv	s1,a0
+ 156:	c905                	beqz	a0,186 <grep+0x6c>
+      *q = 0;
+ 158:	00048023          	sb	zero,0(s1)
+      if(match(pattern, p)){
+ 15c:	85ca                	mv	a1,s2
+ 15e:	854e                	mv	a0,s3
+ 160:	00000097          	auipc	ra,0x0
+ 164:	f6c080e7          	jalr	-148(ra) # cc <match>
+ 168:	dd71                	beqz	a0,144 <grep+0x2a>
+        *q = '\n';
+ 16a:	47a9                	li	a5,10
+ 16c:	00f48023          	sb	a5,0(s1)
+        write(1, p, q+1 - p);
+ 170:	00148613          	addi	a2,s1,1
+ 174:	4126063b          	subw	a2,a2,s2
+ 178:	85ca                	mv	a1,s2
+ 17a:	4505                	li	a0,1
+ 17c:	00000097          	auipc	ra,0x0
+ 180:	400080e7          	jalr	1024(ra) # 57c <write>
+ 184:	b7c1                	j	144 <grep+0x2a>
+    if(m > 0){
+ 186:	03404563          	bgtz	s4,1b0 <grep+0x96>
+  while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){
+ 18a:	414b863b          	subw	a2,s7,s4
+ 18e:	014a85b3          	add	a1,s5,s4
+ 192:	855a                	mv	a0,s6
+ 194:	00000097          	auipc	ra,0x0
+ 198:	3de080e7          	jalr	990(ra) # 572 <read>
+ 19c:	02a05663          	blez	a0,1c8 <grep+0xae>
+    m += n;
+ 1a0:	00aa0a3b          	addw	s4,s4,a0
+    buf[m] = '\0';
+ 1a4:	014a87b3          	add	a5,s5,s4
+ 1a8:	00078023          	sb	zero,0(a5)
+    p = buf;
+ 1ac:	8956                	mv	s2,s5
+    while((q = strchr(p, '\n')) != 0){
+ 1ae:	bf69                	j	148 <grep+0x2e>
+      m -= p - buf;
+ 1b0:	415907b3          	sub	a5,s2,s5
+ 1b4:	40fa0a3b          	subw	s4,s4,a5
+      memmove(buf, p, m);
+ 1b8:	8652                	mv	a2,s4
+ 1ba:	85ca                	mv	a1,s2
+ 1bc:	8556                	mv	a0,s5
+ 1be:	00000097          	auipc	ra,0x0
+ 1c2:	2e6080e7          	jalr	742(ra) # 4a4 <memmove>
+ 1c6:	b7d1                	j	18a <grep+0x70>
+}
+ 1c8:	60a6                	ld	ra,72(sp)
+ 1ca:	6406                	ld	s0,64(sp)
+ 1cc:	74e2                	ld	s1,56(sp)
+ 1ce:	7942                	ld	s2,48(sp)
+ 1d0:	79a2                	ld	s3,40(sp)
+ 1d2:	7a02                	ld	s4,32(sp)
+ 1d4:	6ae2                	ld	s5,24(sp)
+ 1d6:	6b42                	ld	s6,16(sp)
+ 1d8:	6ba2                	ld	s7,8(sp)
+ 1da:	6161                	addi	sp,sp,80
+ 1dc:	8082                	ret
+
+00000000000001de <main>:
+{
+ 1de:	7139                	addi	sp,sp,-64
+ 1e0:	fc06                	sd	ra,56(sp)
+ 1e2:	f822                	sd	s0,48(sp)
+ 1e4:	f426                	sd	s1,40(sp)
+ 1e6:	f04a                	sd	s2,32(sp)
+ 1e8:	ec4e                	sd	s3,24(sp)
+ 1ea:	e852                	sd	s4,16(sp)
+ 1ec:	e456                	sd	s5,8(sp)
+ 1ee:	0080                	addi	s0,sp,64
+  if(argc <= 1){
+ 1f0:	4785                	li	a5,1
+ 1f2:	04a7de63          	bge	a5,a0,24e <main+0x70>
+  pattern = argv[1];
+ 1f6:	0085ba03          	ld	s4,8(a1)
+  if(argc <= 2){
+ 1fa:	4789                	li	a5,2
+ 1fc:	06a7d763          	bge	a5,a0,26a <main+0x8c>
+ 200:	01058913          	addi	s2,a1,16
+ 204:	ffd5099b          	addiw	s3,a0,-3
+ 208:	02099793          	slli	a5,s3,0x20
+ 20c:	01d7d993          	srli	s3,a5,0x1d
+ 210:	05e1                	addi	a1,a1,24
+ 212:	99ae                	add	s3,s3,a1
+    if((fd = open(argv[i], 0)) < 0){
+ 214:	4581                	li	a1,0
+ 216:	00093503          	ld	a0,0(s2)
+ 21a:	00000097          	auipc	ra,0x0
+ 21e:	388080e7          	jalr	904(ra) # 5a2 <open>
+ 222:	84aa                	mv	s1,a0
+ 224:	04054e63          	bltz	a0,280 <main+0xa2>
+    grep(pattern, fd);
+ 228:	85aa                	mv	a1,a0
+ 22a:	8552                	mv	a0,s4
+ 22c:	00000097          	auipc	ra,0x0
+ 230:	eee080e7          	jalr	-274(ra) # 11a <grep>
+    close(fd);
+ 234:	8526                	mv	a0,s1
+ 236:	00000097          	auipc	ra,0x0
+ 23a:	350080e7          	jalr	848(ra) # 586 <close>
+  for(i = 2; i < argc; i++){
+ 23e:	0921                	addi	s2,s2,8
+ 240:	fd391ae3          	bne	s2,s3,214 <main+0x36>
+  exit(0);
+ 244:	4501                	li	a0,0
+ 246:	00000097          	auipc	ra,0x0
+ 24a:	310080e7          	jalr	784(ra) # 556 <exit>
+    fprintf(2, "usage: grep pattern [file ...]\n");
+ 24e:	00001597          	auipc	a1,0x1
+ 252:	87258593          	addi	a1,a1,-1934 # ac0 <malloc+0xee>
+ 256:	4509                	li	a0,2
+ 258:	00000097          	auipc	ra,0x0
+ 25c:	694080e7          	jalr	1684(ra) # 8ec <fprintf>
+    exit(1);
+ 260:	4505                	li	a0,1
+ 262:	00000097          	auipc	ra,0x0
+ 266:	2f4080e7          	jalr	756(ra) # 556 <exit>
+    grep(pattern, 0);
+ 26a:	4581                	li	a1,0
+ 26c:	8552                	mv	a0,s4
+ 26e:	00000097          	auipc	ra,0x0
+ 272:	eac080e7          	jalr	-340(ra) # 11a <grep>
+    exit(0);
+ 276:	4501                	li	a0,0
+ 278:	00000097          	auipc	ra,0x0
+ 27c:	2de080e7          	jalr	734(ra) # 556 <exit>
+      printf("grep: cannot open %s\n", argv[i]);
+ 280:	00093583          	ld	a1,0(s2)
+ 284:	00001517          	auipc	a0,0x1
+ 288:	85c50513          	addi	a0,a0,-1956 # ae0 <malloc+0x10e>
+ 28c:	00000097          	auipc	ra,0x0
+ 290:	68e080e7          	jalr	1678(ra) # 91a <printf>
+      exit(1);
+ 294:	4505                	li	a0,1
+ 296:	00000097          	auipc	ra,0x0
+ 29a:	2c0080e7          	jalr	704(ra) # 556 <exit>
+
+000000000000029e <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+ 29e:	1141                	addi	sp,sp,-16
+ 2a0:	e422                	sd	s0,8(sp)
+ 2a2:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+ 2a4:	87aa                	mv	a5,a0
+ 2a6:	0585                	addi	a1,a1,1
+ 2a8:	0785                	addi	a5,a5,1
+ 2aa:	fff5c703          	lbu	a4,-1(a1)
+ 2ae:	fee78fa3          	sb	a4,-1(a5)
+ 2b2:	fb75                	bnez	a4,2a6 <strcpy+0x8>
+    ;
+  return os;
+}
+ 2b4:	6422                	ld	s0,8(sp)
+ 2b6:	0141                	addi	sp,sp,16
+ 2b8:	8082                	ret
+
+00000000000002ba <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+ 2ba:	1141                	addi	sp,sp,-16
+ 2bc:	e422                	sd	s0,8(sp)
+ 2be:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+ 2c0:	00054783          	lbu	a5,0(a0)
+ 2c4:	c385                	beqz	a5,2e4 <strcat+0x2a>
+ 2c6:	87aa                	mv	a5,a0
+    s++;
+ 2c8:	0785                	addi	a5,a5,1
+  while(*s)
+ 2ca:	0007c703          	lbu	a4,0(a5)
+ 2ce:	ff6d                	bnez	a4,2c8 <strcat+0xe>
+  while((*s++ = *t++))
+ 2d0:	0585                	addi	a1,a1,1
+ 2d2:	0785                	addi	a5,a5,1
+ 2d4:	fff5c703          	lbu	a4,-1(a1)
+ 2d8:	fee78fa3          	sb	a4,-1(a5)
+ 2dc:	fb75                	bnez	a4,2d0 <strcat+0x16>
+    ;
+  return os;
+}
+ 2de:	6422                	ld	s0,8(sp)
+ 2e0:	0141                	addi	sp,sp,16
+ 2e2:	8082                	ret
+  while(*s)
+ 2e4:	87aa                	mv	a5,a0
+ 2e6:	b7ed                	j	2d0 <strcat+0x16>
+
+00000000000002e8 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+ 2e8:	1141                	addi	sp,sp,-16
+ 2ea:	e422                	sd	s0,8(sp)
+ 2ec:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+ 2ee:	00054783          	lbu	a5,0(a0)
+ 2f2:	cb91                	beqz	a5,306 <strcmp+0x1e>
+ 2f4:	0005c703          	lbu	a4,0(a1)
+ 2f8:	00f71763          	bne	a4,a5,306 <strcmp+0x1e>
+    p++, q++;
+ 2fc:	0505                	addi	a0,a0,1
+ 2fe:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+ 300:	00054783          	lbu	a5,0(a0)
+ 304:	fbe5                	bnez	a5,2f4 <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+ 306:	0005c503          	lbu	a0,0(a1)
+}
+ 30a:	40a7853b          	subw	a0,a5,a0
+ 30e:	6422                	ld	s0,8(sp)
+ 310:	0141                	addi	sp,sp,16
+ 312:	8082                	ret
+
+0000000000000314 <strlen>:
+
+uint
+strlen(const char *s)
+{
+ 314:	1141                	addi	sp,sp,-16
+ 316:	e422                	sd	s0,8(sp)
+ 318:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 31a:	00054783          	lbu	a5,0(a0)
+ 31e:	cf91                	beqz	a5,33a <strlen+0x26>
+ 320:	0505                	addi	a0,a0,1
+ 322:	87aa                	mv	a5,a0
+ 324:	4685                	li	a3,1
+ 326:	9e89                	subw	a3,a3,a0
+ 328:	00f6853b          	addw	a0,a3,a5
+ 32c:	0785                	addi	a5,a5,1
+ 32e:	fff7c703          	lbu	a4,-1(a5)
+ 332:	fb7d                	bnez	a4,328 <strlen+0x14>
+    ;
+  return n;
+}
+ 334:	6422                	ld	s0,8(sp)
+ 336:	0141                	addi	sp,sp,16
+ 338:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 33a:	4501                	li	a0,0
+ 33c:	bfe5                	j	334 <strlen+0x20>
+
+000000000000033e <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 33e:	1141                	addi	sp,sp,-16
+ 340:	e422                	sd	s0,8(sp)
+ 342:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 344:	ca19                	beqz	a2,35a <memset+0x1c>
+ 346:	87aa                	mv	a5,a0
+ 348:	1602                	slli	a2,a2,0x20
+ 34a:	9201                	srli	a2,a2,0x20
+ 34c:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 350:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 354:	0785                	addi	a5,a5,1
+ 356:	fee79de3          	bne	a5,a4,350 <memset+0x12>
+  }
+  return dst;
+}
+ 35a:	6422                	ld	s0,8(sp)
+ 35c:	0141                	addi	sp,sp,16
+ 35e:	8082                	ret
+
+0000000000000360 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 360:	1141                	addi	sp,sp,-16
+ 362:	e422                	sd	s0,8(sp)
+ 364:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 366:	00054783          	lbu	a5,0(a0)
+ 36a:	cb99                	beqz	a5,380 <strchr+0x20>
+    if(*s == c)
+ 36c:	00f58763          	beq	a1,a5,37a <strchr+0x1a>
+  for(; *s; s++)
+ 370:	0505                	addi	a0,a0,1
+ 372:	00054783          	lbu	a5,0(a0)
+ 376:	fbfd                	bnez	a5,36c <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 378:	4501                	li	a0,0
+}
+ 37a:	6422                	ld	s0,8(sp)
+ 37c:	0141                	addi	sp,sp,16
+ 37e:	8082                	ret
+  return 0;
+ 380:	4501                	li	a0,0
+ 382:	bfe5                	j	37a <strchr+0x1a>
+
+0000000000000384 <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 384:	711d                	addi	sp,sp,-96
+ 386:	ec86                	sd	ra,88(sp)
+ 388:	e8a2                	sd	s0,80(sp)
+ 38a:	e4a6                	sd	s1,72(sp)
+ 38c:	e0ca                	sd	s2,64(sp)
+ 38e:	fc4e                	sd	s3,56(sp)
+ 390:	f852                	sd	s4,48(sp)
+ 392:	f456                	sd	s5,40(sp)
+ 394:	f05a                	sd	s6,32(sp)
+ 396:	ec5e                	sd	s7,24(sp)
+ 398:	e862                	sd	s8,16(sp)
+ 39a:	1080                	addi	s0,sp,96
+ 39c:	8baa                	mv	s7,a0
+ 39e:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 3a0:	892a                	mv	s2,a0
+ 3a2:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 3a4:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 3a8:	4b29                	li	s6,10
+ 3aa:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 3ac:	89a6                	mv	s3,s1
+ 3ae:	2485                	addiw	s1,s1,1
+ 3b0:	0344d763          	bge	s1,s4,3de <gets+0x5a>
+    cc = read(0, &c, 1);
+ 3b4:	4605                	li	a2,1
+ 3b6:	85d6                	mv	a1,s5
+ 3b8:	4501                	li	a0,0
+ 3ba:	00000097          	auipc	ra,0x0
+ 3be:	1b8080e7          	jalr	440(ra) # 572 <read>
+    if(cc < 1)
+ 3c2:	00a05e63          	blez	a0,3de <gets+0x5a>
+    buf[i++] = c;
+ 3c6:	faf44783          	lbu	a5,-81(s0)
+ 3ca:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 3ce:	01678763          	beq	a5,s6,3dc <gets+0x58>
+ 3d2:	0905                	addi	s2,s2,1
+ 3d4:	fd879ce3          	bne	a5,s8,3ac <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 3d8:	89a6                	mv	s3,s1
+ 3da:	a011                	j	3de <gets+0x5a>
+ 3dc:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 3de:	99de                	add	s3,s3,s7
+ 3e0:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 3e4:	855e                	mv	a0,s7
+ 3e6:	60e6                	ld	ra,88(sp)
+ 3e8:	6446                	ld	s0,80(sp)
+ 3ea:	64a6                	ld	s1,72(sp)
+ 3ec:	6906                	ld	s2,64(sp)
+ 3ee:	79e2                	ld	s3,56(sp)
+ 3f0:	7a42                	ld	s4,48(sp)
+ 3f2:	7aa2                	ld	s5,40(sp)
+ 3f4:	7b02                	ld	s6,32(sp)
+ 3f6:	6be2                	ld	s7,24(sp)
+ 3f8:	6c42                	ld	s8,16(sp)
+ 3fa:	6125                	addi	sp,sp,96
+ 3fc:	8082                	ret
+
+00000000000003fe <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 3fe:	1101                	addi	sp,sp,-32
+ 400:	ec06                	sd	ra,24(sp)
+ 402:	e822                	sd	s0,16(sp)
+ 404:	e426                	sd	s1,8(sp)
+ 406:	e04a                	sd	s2,0(sp)
+ 408:	1000                	addi	s0,sp,32
+ 40a:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 40c:	4581                	li	a1,0
+ 40e:	00000097          	auipc	ra,0x0
+ 412:	194080e7          	jalr	404(ra) # 5a2 <open>
+  if(fd < 0)
+ 416:	02054563          	bltz	a0,440 <stat+0x42>
+ 41a:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 41c:	85ca                	mv	a1,s2
+ 41e:	00000097          	auipc	ra,0x0
+ 422:	18e080e7          	jalr	398(ra) # 5ac <fstat>
+ 426:	892a                	mv	s2,a0
+  close(fd);
+ 428:	8526                	mv	a0,s1
+ 42a:	00000097          	auipc	ra,0x0
+ 42e:	15c080e7          	jalr	348(ra) # 586 <close>
+  return r;
+}
+ 432:	854a                	mv	a0,s2
+ 434:	60e2                	ld	ra,24(sp)
+ 436:	6442                	ld	s0,16(sp)
+ 438:	64a2                	ld	s1,8(sp)
+ 43a:	6902                	ld	s2,0(sp)
+ 43c:	6105                	addi	sp,sp,32
+ 43e:	8082                	ret
+    return -1;
+ 440:	597d                	li	s2,-1
+ 442:	bfc5                	j	432 <stat+0x34>
+
+0000000000000444 <atoi>:
+
+int
+atoi(const char *s)
+{
+ 444:	1141                	addi	sp,sp,-16
+ 446:	e422                	sd	s0,8(sp)
+ 448:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 44a:	00054703          	lbu	a4,0(a0)
+ 44e:	02d00793          	li	a5,45
+  int neg = 1;
+ 452:	4585                	li	a1,1
+  if (*s == '-') {
+ 454:	04f70363          	beq	a4,a5,49a <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 458:	00054703          	lbu	a4,0(a0)
+ 45c:	fd07079b          	addiw	a5,a4,-48
+ 460:	0ff7f793          	zext.b	a5,a5
+ 464:	46a5                	li	a3,9
+ 466:	02f6ed63          	bltu	a3,a5,4a0 <atoi+0x5c>
+  n = 0;
+ 46a:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 46c:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 46e:	0505                	addi	a0,a0,1
+ 470:	0026979b          	slliw	a5,a3,0x2
+ 474:	9fb5                	addw	a5,a5,a3
+ 476:	0017979b          	slliw	a5,a5,0x1
+ 47a:	9fb9                	addw	a5,a5,a4
+ 47c:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 480:	00054703          	lbu	a4,0(a0)
+ 484:	fd07079b          	addiw	a5,a4,-48
+ 488:	0ff7f793          	zext.b	a5,a5
+ 48c:	fef671e3          	bgeu	a2,a5,46e <atoi+0x2a>
+  return n * neg;
+}
+ 490:	02d5853b          	mulw	a0,a1,a3
+ 494:	6422                	ld	s0,8(sp)
+ 496:	0141                	addi	sp,sp,16
+ 498:	8082                	ret
+    s++;
+ 49a:	0505                	addi	a0,a0,1
+    neg = -1;
+ 49c:	55fd                	li	a1,-1
+ 49e:	bf6d                	j	458 <atoi+0x14>
+  n = 0;
+ 4a0:	4681                	li	a3,0
+ 4a2:	b7fd                	j	490 <atoi+0x4c>
+
+00000000000004a4 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 4a4:	1141                	addi	sp,sp,-16
+ 4a6:	e422                	sd	s0,8(sp)
+ 4a8:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 4aa:	02b57463          	bgeu	a0,a1,4d2 <memmove+0x2e>
+    while(n-- > 0)
+ 4ae:	00c05f63          	blez	a2,4cc <memmove+0x28>
+ 4b2:	1602                	slli	a2,a2,0x20
+ 4b4:	9201                	srli	a2,a2,0x20
+ 4b6:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 4ba:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 4bc:	0585                	addi	a1,a1,1
+ 4be:	0705                	addi	a4,a4,1
+ 4c0:	fff5c683          	lbu	a3,-1(a1)
+ 4c4:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 4c8:	fee79ae3          	bne	a5,a4,4bc <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 4cc:	6422                	ld	s0,8(sp)
+ 4ce:	0141                	addi	sp,sp,16
+ 4d0:	8082                	ret
+    dst += n;
+ 4d2:	00c50733          	add	a4,a0,a2
+    src += n;
+ 4d6:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 4d8:	fec05ae3          	blez	a2,4cc <memmove+0x28>
+ 4dc:	fff6079b          	addiw	a5,a2,-1
+ 4e0:	1782                	slli	a5,a5,0x20
+ 4e2:	9381                	srli	a5,a5,0x20
+ 4e4:	fff7c793          	not	a5,a5
+ 4e8:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 4ea:	15fd                	addi	a1,a1,-1
+ 4ec:	177d                	addi	a4,a4,-1
+ 4ee:	0005c683          	lbu	a3,0(a1)
+ 4f2:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 4f6:	fee79ae3          	bne	a5,a4,4ea <memmove+0x46>
+ 4fa:	bfc9                	j	4cc <memmove+0x28>
+
+00000000000004fc <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 4fc:	1141                	addi	sp,sp,-16
+ 4fe:	e422                	sd	s0,8(sp)
+ 500:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 502:	ca05                	beqz	a2,532 <memcmp+0x36>
+ 504:	fff6069b          	addiw	a3,a2,-1
+ 508:	1682                	slli	a3,a3,0x20
+ 50a:	9281                	srli	a3,a3,0x20
+ 50c:	0685                	addi	a3,a3,1
+ 50e:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 510:	00054783          	lbu	a5,0(a0)
+ 514:	0005c703          	lbu	a4,0(a1)
+ 518:	00e79863          	bne	a5,a4,528 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 51c:	0505                	addi	a0,a0,1
+    p2++;
+ 51e:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 520:	fed518e3          	bne	a0,a3,510 <memcmp+0x14>
+  }
+  return 0;
+ 524:	4501                	li	a0,0
+ 526:	a019                	j	52c <memcmp+0x30>
+      return *p1 - *p2;
+ 528:	40e7853b          	subw	a0,a5,a4
+}
+ 52c:	6422                	ld	s0,8(sp)
+ 52e:	0141                	addi	sp,sp,16
+ 530:	8082                	ret
+  return 0;
+ 532:	4501                	li	a0,0
+ 534:	bfe5                	j	52c <memcmp+0x30>
+
+0000000000000536 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 536:	1141                	addi	sp,sp,-16
+ 538:	e406                	sd	ra,8(sp)
+ 53a:	e022                	sd	s0,0(sp)
+ 53c:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 53e:	00000097          	auipc	ra,0x0
+ 542:	f66080e7          	jalr	-154(ra) # 4a4 <memmove>
+}
+ 546:	60a2                	ld	ra,8(sp)
+ 548:	6402                	ld	s0,0(sp)
+ 54a:	0141                	addi	sp,sp,16
+ 54c:	8082                	ret
+
+000000000000054e <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 54e:	4885                	li	a7,1
+ ecall
+ 550:	00000073          	ecall
+ ret
+ 554:	8082                	ret
+
+0000000000000556 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 556:	05d00893          	li	a7,93
+ ecall
+ 55a:	00000073          	ecall
+ ret
+ 55e:	8082                	ret
+
+0000000000000560 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 560:	488d                	li	a7,3
+ ecall
+ 562:	00000073          	ecall
+ ret
+ 566:	8082                	ret
+
+0000000000000568 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 568:	03b00893          	li	a7,59
+ ecall
+ 56c:	00000073          	ecall
+ ret
+ 570:	8082                	ret
+
+0000000000000572 <read>:
+.global read
+read:
+ li a7, SYS_read
+ 572:	03f00893          	li	a7,63
+ ecall
+ 576:	00000073          	ecall
+ ret
+ 57a:	8082                	ret
+
+000000000000057c <write>:
+.global write
+write:
+ li a7, SYS_write
+ 57c:	04000893          	li	a7,64
+ ecall
+ 580:	00000073          	ecall
+ ret
+ 584:	8082                	ret
+
+0000000000000586 <close>:
+.global close
+close:
+ li a7, SYS_close
+ 586:	03900893          	li	a7,57
+ ecall
+ 58a:	00000073          	ecall
+ ret
+ 58e:	8082                	ret
+
+0000000000000590 <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 590:	4899                	li	a7,6
+ ecall
+ 592:	00000073          	ecall
+ ret
+ 596:	8082                	ret
+
+0000000000000598 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 598:	0dd00893          	li	a7,221
+ ecall
+ 59c:	00000073          	ecall
+ ret
+ 5a0:	8082                	ret
+
+00000000000005a2 <open>:
+.global open
+open:
+ li a7, SYS_open
+ 5a2:	03800893          	li	a7,56
+ ecall
+ 5a6:	00000073          	ecall
+ ret
+ 5aa:	8082                	ret
+
+00000000000005ac <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 5ac:	05000893          	li	a7,80
+ ecall
+ 5b0:	00000073          	ecall
+ ret
+ 5b4:	8082                	ret
+
+00000000000005b6 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 5b6:	02200893          	li	a7,34
+ ecall
+ 5ba:	00000073          	ecall
+ ret
+ 5be:	8082                	ret
+
+00000000000005c0 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 5c0:	03100893          	li	a7,49
+ ecall
+ 5c4:	00000073          	ecall
+ ret
+ 5c8:	8082                	ret
+
+00000000000005ca <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 5ca:	48dd                	li	a7,23
+ ecall
+ 5cc:	00000073          	ecall
+ ret
+ 5d0:	8082                	ret
+
+00000000000005d2 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 5d2:	0ac00893          	li	a7,172
+ ecall
+ 5d6:	00000073          	ecall
+ ret
+ 5da:	8082                	ret
+
+00000000000005dc <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 5dc:	48b1                	li	a7,12
+ ecall
+ 5de:	00000073          	ecall
+ ret
+ 5e2:	8082                	ret
+
+00000000000005e4 <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 5e4:	48b5                	li	a7,13
+ ecall
+ 5e6:	00000073          	ecall
+ ret
+ 5ea:	8082                	ret
+
+00000000000005ec <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 5ec:	48b9                	li	a7,14
+ ecall
+ 5ee:	00000073          	ecall
+ ret
+ 5f2:	8082                	ret
+
+00000000000005f4 <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 5f4:	48d9                	li	a7,22
+ ecall
+ 5f6:	00000073          	ecall
+ ret
+ 5fa:	8082                	ret
+
+00000000000005fc <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 5fc:	03200893          	li	a7,50
+ ecall
+ 600:	00000073          	ecall
+ ret
+ 604:	8082                	ret
+
+0000000000000606 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 606:	48ed                	li	a7,27
+ ecall
+ 608:	00000073          	ecall
+ ret
+ 60c:	8082                	ret
+
+000000000000060e <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 60e:	48c5                	li	a7,17
+ ecall
+ 610:	00000073          	ecall
+ ret
+ 614:	8082                	ret
+
+0000000000000616 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 616:	07500893          	li	a7,117
+ ecall
+ 61a:	00000073          	ecall
+ ret
+ 61e:	8082                	ret
+
+0000000000000620 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 620:	48c9                	li	a7,18
+ ecall
+ 622:	00000073          	ecall
+ ret
+ 626:	8082                	ret
+
+0000000000000628 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 628:	48cd                	li	a7,19
+ ecall
+ 62a:	00000073          	ecall
+ ret
+ 62e:	8082                	ret
+
+0000000000000630 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 630:	48e9                	li	a7,26
+ ecall
+ 632:	00000073          	ecall
+ ret
+ 636:	8082                	ret
+
+0000000000000638 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 638:	0d200893          	li	a7,210
+ ecall
+ 63c:	00000073          	ecall
+ ret
+ 640:	8082                	ret
+
+0000000000000642 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 642:	1101                	addi	sp,sp,-32
+ 644:	ec06                	sd	ra,24(sp)
+ 646:	e822                	sd	s0,16(sp)
+ 648:	1000                	addi	s0,sp,32
+ 64a:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 64e:	4605                	li	a2,1
+ 650:	fef40593          	addi	a1,s0,-17
+ 654:	00000097          	auipc	ra,0x0
+ 658:	f28080e7          	jalr	-216(ra) # 57c <write>
+}
+ 65c:	60e2                	ld	ra,24(sp)
+ 65e:	6442                	ld	s0,16(sp)
+ 660:	6105                	addi	sp,sp,32
+ 662:	8082                	ret
+
+0000000000000664 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 664:	7139                	addi	sp,sp,-64
+ 666:	fc06                	sd	ra,56(sp)
+ 668:	f822                	sd	s0,48(sp)
+ 66a:	f426                	sd	s1,40(sp)
+ 66c:	f04a                	sd	s2,32(sp)
+ 66e:	ec4e                	sd	s3,24(sp)
+ 670:	0080                	addi	s0,sp,64
+ 672:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 674:	c299                	beqz	a3,67a <printint+0x16>
+ 676:	0805c863          	bltz	a1,706 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 67a:	2581                	sext.w	a1,a1
+  neg = 0;
+ 67c:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 67e:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 682:	86ce                	mv	a3,s3
+  i = 0;
+ 684:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 686:	2601                	sext.w	a2,a2
+ 688:	00000517          	auipc	a0,0x0
+ 68c:	4d050513          	addi	a0,a0,1232 # b58 <digits>
+ 690:	883a                	mv	a6,a4
+ 692:	2705                	addiw	a4,a4,1
+ 694:	02c5f7bb          	remuw	a5,a1,a2
+ 698:	1782                	slli	a5,a5,0x20
+ 69a:	9381                	srli	a5,a5,0x20
+ 69c:	97aa                	add	a5,a5,a0
+ 69e:	0007c783          	lbu	a5,0(a5)
+ 6a2:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 6a6:	0005879b          	sext.w	a5,a1
+ 6aa:	02c5d5bb          	divuw	a1,a1,a2
+ 6ae:	0685                	addi	a3,a3,1
+ 6b0:	fec7f0e3          	bgeu	a5,a2,690 <printint+0x2c>
+  if(neg)
+ 6b4:	00088c63          	beqz	a7,6cc <printint+0x68>
+    buf[i++] = '-';
+ 6b8:	fd070793          	addi	a5,a4,-48
+ 6bc:	00878733          	add	a4,a5,s0
+ 6c0:	02d00793          	li	a5,45
+ 6c4:	fef70823          	sb	a5,-16(a4)
+ 6c8:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 6cc:	02e05663          	blez	a4,6f8 <printint+0x94>
+ 6d0:	fc040913          	addi	s2,s0,-64
+ 6d4:	993a                	add	s2,s2,a4
+ 6d6:	19fd                	addi	s3,s3,-1
+ 6d8:	99ba                	add	s3,s3,a4
+ 6da:	377d                	addiw	a4,a4,-1
+ 6dc:	1702                	slli	a4,a4,0x20
+ 6de:	9301                	srli	a4,a4,0x20
+ 6e0:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 6e4:	fff94583          	lbu	a1,-1(s2)
+ 6e8:	8526                	mv	a0,s1
+ 6ea:	00000097          	auipc	ra,0x0
+ 6ee:	f58080e7          	jalr	-168(ra) # 642 <putc>
+  while(--i >= 0)
+ 6f2:	197d                	addi	s2,s2,-1
+ 6f4:	ff3918e3          	bne	s2,s3,6e4 <printint+0x80>
+}
+ 6f8:	70e2                	ld	ra,56(sp)
+ 6fa:	7442                	ld	s0,48(sp)
+ 6fc:	74a2                	ld	s1,40(sp)
+ 6fe:	7902                	ld	s2,32(sp)
+ 700:	69e2                	ld	s3,24(sp)
+ 702:	6121                	addi	sp,sp,64
+ 704:	8082                	ret
+    x = -xx;
+ 706:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 70a:	4885                	li	a7,1
+    x = -xx;
+ 70c:	bf8d                	j	67e <printint+0x1a>
+
+000000000000070e <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 70e:	7119                	addi	sp,sp,-128
+ 710:	fc86                	sd	ra,120(sp)
+ 712:	f8a2                	sd	s0,112(sp)
+ 714:	f4a6                	sd	s1,104(sp)
+ 716:	f0ca                	sd	s2,96(sp)
+ 718:	ecce                	sd	s3,88(sp)
+ 71a:	e8d2                	sd	s4,80(sp)
+ 71c:	e4d6                	sd	s5,72(sp)
+ 71e:	e0da                	sd	s6,64(sp)
+ 720:	fc5e                	sd	s7,56(sp)
+ 722:	f862                	sd	s8,48(sp)
+ 724:	f466                	sd	s9,40(sp)
+ 726:	f06a                	sd	s10,32(sp)
+ 728:	ec6e                	sd	s11,24(sp)
+ 72a:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 72c:	0005c903          	lbu	s2,0(a1)
+ 730:	18090f63          	beqz	s2,8ce <vprintf+0x1c0>
+ 734:	8aaa                	mv	s5,a0
+ 736:	8b32                	mv	s6,a2
+ 738:	00158493          	addi	s1,a1,1
+  state = 0;
+ 73c:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 73e:	02500a13          	li	s4,37
+ 742:	4c55                	li	s8,21
+ 744:	00000c97          	auipc	s9,0x0
+ 748:	3bcc8c93          	addi	s9,s9,956 # b00 <malloc+0x12e>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 74c:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 750:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 752:	00000b97          	auipc	s7,0x0
+ 756:	406b8b93          	addi	s7,s7,1030 # b58 <digits>
+ 75a:	a839                	j	778 <vprintf+0x6a>
+        putc(fd, c);
+ 75c:	85ca                	mv	a1,s2
+ 75e:	8556                	mv	a0,s5
+ 760:	00000097          	auipc	ra,0x0
+ 764:	ee2080e7          	jalr	-286(ra) # 642 <putc>
+ 768:	a019                	j	76e <vprintf+0x60>
+    } else if(state == '%'){
+ 76a:	01498d63          	beq	s3,s4,784 <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 76e:	0485                	addi	s1,s1,1
+ 770:	fff4c903          	lbu	s2,-1(s1)
+ 774:	14090d63          	beqz	s2,8ce <vprintf+0x1c0>
+    if(state == 0){
+ 778:	fe0999e3          	bnez	s3,76a <vprintf+0x5c>
+      if(c == '%'){
+ 77c:	ff4910e3          	bne	s2,s4,75c <vprintf+0x4e>
+        state = '%';
+ 780:	89d2                	mv	s3,s4
+ 782:	b7f5                	j	76e <vprintf+0x60>
+      if(c == 'd'){
+ 784:	11490c63          	beq	s2,s4,89c <vprintf+0x18e>
+ 788:	f9d9079b          	addiw	a5,s2,-99
+ 78c:	0ff7f793          	zext.b	a5,a5
+ 790:	10fc6e63          	bltu	s8,a5,8ac <vprintf+0x19e>
+ 794:	f9d9079b          	addiw	a5,s2,-99
+ 798:	0ff7f713          	zext.b	a4,a5
+ 79c:	10ec6863          	bltu	s8,a4,8ac <vprintf+0x19e>
+ 7a0:	00271793          	slli	a5,a4,0x2
+ 7a4:	97e6                	add	a5,a5,s9
+ 7a6:	439c                	lw	a5,0(a5)
+ 7a8:	97e6                	add	a5,a5,s9
+ 7aa:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 7ac:	008b0913          	addi	s2,s6,8
+ 7b0:	4685                	li	a3,1
+ 7b2:	4629                	li	a2,10
+ 7b4:	000b2583          	lw	a1,0(s6)
+ 7b8:	8556                	mv	a0,s5
+ 7ba:	00000097          	auipc	ra,0x0
+ 7be:	eaa080e7          	jalr	-342(ra) # 664 <printint>
+ 7c2:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 7c4:	4981                	li	s3,0
+ 7c6:	b765                	j	76e <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 7c8:	008b0913          	addi	s2,s6,8
+ 7cc:	4681                	li	a3,0
+ 7ce:	4629                	li	a2,10
+ 7d0:	000b2583          	lw	a1,0(s6)
+ 7d4:	8556                	mv	a0,s5
+ 7d6:	00000097          	auipc	ra,0x0
+ 7da:	e8e080e7          	jalr	-370(ra) # 664 <printint>
+ 7de:	8b4a                	mv	s6,s2
+      state = 0;
+ 7e0:	4981                	li	s3,0
+ 7e2:	b771                	j	76e <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 7e4:	008b0913          	addi	s2,s6,8
+ 7e8:	4681                	li	a3,0
+ 7ea:	866a                	mv	a2,s10
+ 7ec:	000b2583          	lw	a1,0(s6)
+ 7f0:	8556                	mv	a0,s5
+ 7f2:	00000097          	auipc	ra,0x0
+ 7f6:	e72080e7          	jalr	-398(ra) # 664 <printint>
+ 7fa:	8b4a                	mv	s6,s2
+      state = 0;
+ 7fc:	4981                	li	s3,0
+ 7fe:	bf85                	j	76e <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 800:	008b0793          	addi	a5,s6,8
+ 804:	f8f43423          	sd	a5,-120(s0)
+ 808:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 80c:	03000593          	li	a1,48
+ 810:	8556                	mv	a0,s5
+ 812:	00000097          	auipc	ra,0x0
+ 816:	e30080e7          	jalr	-464(ra) # 642 <putc>
+  putc(fd, 'x');
+ 81a:	07800593          	li	a1,120
+ 81e:	8556                	mv	a0,s5
+ 820:	00000097          	auipc	ra,0x0
+ 824:	e22080e7          	jalr	-478(ra) # 642 <putc>
+ 828:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 82a:	03c9d793          	srli	a5,s3,0x3c
+ 82e:	97de                	add	a5,a5,s7
+ 830:	0007c583          	lbu	a1,0(a5)
+ 834:	8556                	mv	a0,s5
+ 836:	00000097          	auipc	ra,0x0
+ 83a:	e0c080e7          	jalr	-500(ra) # 642 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 83e:	0992                	slli	s3,s3,0x4
+ 840:	397d                	addiw	s2,s2,-1
+ 842:	fe0914e3          	bnez	s2,82a <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 846:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 84a:	4981                	li	s3,0
+ 84c:	b70d                	j	76e <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 84e:	008b0913          	addi	s2,s6,8
+ 852:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 856:	02098163          	beqz	s3,878 <vprintf+0x16a>
+        while(*s != 0){
+ 85a:	0009c583          	lbu	a1,0(s3)
+ 85e:	c5ad                	beqz	a1,8c8 <vprintf+0x1ba>
+          putc(fd, *s);
+ 860:	8556                	mv	a0,s5
+ 862:	00000097          	auipc	ra,0x0
+ 866:	de0080e7          	jalr	-544(ra) # 642 <putc>
+          s++;
+ 86a:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 86c:	0009c583          	lbu	a1,0(s3)
+ 870:	f9e5                	bnez	a1,860 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 872:	8b4a                	mv	s6,s2
+      state = 0;
+ 874:	4981                	li	s3,0
+ 876:	bde5                	j	76e <vprintf+0x60>
+          s = "(null)";
+ 878:	00000997          	auipc	s3,0x0
+ 87c:	28098993          	addi	s3,s3,640 # af8 <malloc+0x126>
+        while(*s != 0){
+ 880:	85ee                	mv	a1,s11
+ 882:	bff9                	j	860 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 884:	008b0913          	addi	s2,s6,8
+ 888:	000b4583          	lbu	a1,0(s6)
+ 88c:	8556                	mv	a0,s5
+ 88e:	00000097          	auipc	ra,0x0
+ 892:	db4080e7          	jalr	-588(ra) # 642 <putc>
+ 896:	8b4a                	mv	s6,s2
+      state = 0;
+ 898:	4981                	li	s3,0
+ 89a:	bdd1                	j	76e <vprintf+0x60>
+        putc(fd, c);
+ 89c:	85d2                	mv	a1,s4
+ 89e:	8556                	mv	a0,s5
+ 8a0:	00000097          	auipc	ra,0x0
+ 8a4:	da2080e7          	jalr	-606(ra) # 642 <putc>
+      state = 0;
+ 8a8:	4981                	li	s3,0
+ 8aa:	b5d1                	j	76e <vprintf+0x60>
+        putc(fd, '%');
+ 8ac:	85d2                	mv	a1,s4
+ 8ae:	8556                	mv	a0,s5
+ 8b0:	00000097          	auipc	ra,0x0
+ 8b4:	d92080e7          	jalr	-622(ra) # 642 <putc>
+        putc(fd, c);
+ 8b8:	85ca                	mv	a1,s2
+ 8ba:	8556                	mv	a0,s5
+ 8bc:	00000097          	auipc	ra,0x0
+ 8c0:	d86080e7          	jalr	-634(ra) # 642 <putc>
+      state = 0;
+ 8c4:	4981                	li	s3,0
+ 8c6:	b565                	j	76e <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 8c8:	8b4a                	mv	s6,s2
+      state = 0;
+ 8ca:	4981                	li	s3,0
+ 8cc:	b54d                	j	76e <vprintf+0x60>
+    }
+  }
+}
+ 8ce:	70e6                	ld	ra,120(sp)
+ 8d0:	7446                	ld	s0,112(sp)
+ 8d2:	74a6                	ld	s1,104(sp)
+ 8d4:	7906                	ld	s2,96(sp)
+ 8d6:	69e6                	ld	s3,88(sp)
+ 8d8:	6a46                	ld	s4,80(sp)
+ 8da:	6aa6                	ld	s5,72(sp)
+ 8dc:	6b06                	ld	s6,64(sp)
+ 8de:	7be2                	ld	s7,56(sp)
+ 8e0:	7c42                	ld	s8,48(sp)
+ 8e2:	7ca2                	ld	s9,40(sp)
+ 8e4:	7d02                	ld	s10,32(sp)
+ 8e6:	6de2                	ld	s11,24(sp)
+ 8e8:	6109                	addi	sp,sp,128
+ 8ea:	8082                	ret
+
+00000000000008ec <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 8ec:	715d                	addi	sp,sp,-80
+ 8ee:	ec06                	sd	ra,24(sp)
+ 8f0:	e822                	sd	s0,16(sp)
+ 8f2:	1000                	addi	s0,sp,32
+ 8f4:	e010                	sd	a2,0(s0)
+ 8f6:	e414                	sd	a3,8(s0)
+ 8f8:	e818                	sd	a4,16(s0)
+ 8fa:	ec1c                	sd	a5,24(s0)
+ 8fc:	03043023          	sd	a6,32(s0)
+ 900:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 904:	8622                	mv	a2,s0
+ 906:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 90a:	00000097          	auipc	ra,0x0
+ 90e:	e04080e7          	jalr	-508(ra) # 70e <vprintf>
+}
+ 912:	60e2                	ld	ra,24(sp)
+ 914:	6442                	ld	s0,16(sp)
+ 916:	6161                	addi	sp,sp,80
+ 918:	8082                	ret
+
+000000000000091a <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 91a:	711d                	addi	sp,sp,-96
+ 91c:	ec06                	sd	ra,24(sp)
+ 91e:	e822                	sd	s0,16(sp)
+ 920:	1000                	addi	s0,sp,32
+ 922:	e40c                	sd	a1,8(s0)
+ 924:	e810                	sd	a2,16(s0)
+ 926:	ec14                	sd	a3,24(s0)
+ 928:	f018                	sd	a4,32(s0)
+ 92a:	f41c                	sd	a5,40(s0)
+ 92c:	03043823          	sd	a6,48(s0)
+ 930:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 934:	00840613          	addi	a2,s0,8
+ 938:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 93c:	85aa                	mv	a1,a0
+ 93e:	4505                	li	a0,1
+ 940:	00000097          	auipc	ra,0x0
+ 944:	dce080e7          	jalr	-562(ra) # 70e <vprintf>
+}
+ 948:	60e2                	ld	ra,24(sp)
+ 94a:	6442                	ld	s0,16(sp)
+ 94c:	6125                	addi	sp,sp,96
+ 94e:	8082                	ret
+
+0000000000000950 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 950:	1141                	addi	sp,sp,-16
+ 952:	e422                	sd	s0,8(sp)
+ 954:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 956:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 95a:	00000797          	auipc	a5,0x0
+ 95e:	6167b783          	ld	a5,1558(a5) # f70 <freep>
+ 962:	a02d                	j	98c <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;
+ 964:	4618                	lw	a4,8(a2)
+ 966:	9f2d                	addw	a4,a4,a1
+ 968:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 96c:	6398                	ld	a4,0(a5)
+ 96e:	6310                	ld	a2,0(a4)
+ 970:	a83d                	j	9ae <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 972:	ff852703          	lw	a4,-8(a0)
+ 976:	9f31                	addw	a4,a4,a2
+ 978:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 97a:	ff053683          	ld	a3,-16(a0)
+ 97e:	a091                	j	9c2 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 980:	6398                	ld	a4,0(a5)
+ 982:	00e7e463          	bltu	a5,a4,98a <free+0x3a>
+ 986:	00e6ea63          	bltu	a3,a4,99a <free+0x4a>
+{
+ 98a:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 98c:	fed7fae3          	bgeu	a5,a3,980 <free+0x30>
+ 990:	6398                	ld	a4,0(a5)
+ 992:	00e6e463          	bltu	a3,a4,99a <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 996:	fee7eae3          	bltu	a5,a4,98a <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 99a:	ff852583          	lw	a1,-8(a0)
+ 99e:	6390                	ld	a2,0(a5)
+ 9a0:	02059813          	slli	a6,a1,0x20
+ 9a4:	01c85713          	srli	a4,a6,0x1c
+ 9a8:	9736                	add	a4,a4,a3
+ 9aa:	fae60de3          	beq	a2,a4,964 <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 9ae:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 9b2:	4790                	lw	a2,8(a5)
+ 9b4:	02061593          	slli	a1,a2,0x20
+ 9b8:	01c5d713          	srli	a4,a1,0x1c
+ 9bc:	973e                	add	a4,a4,a5
+ 9be:	fae68ae3          	beq	a3,a4,972 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 9c2:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 9c4:	00000717          	auipc	a4,0x0
+ 9c8:	5af73623          	sd	a5,1452(a4) # f70 <freep>
+}
+ 9cc:	6422                	ld	s0,8(sp)
+ 9ce:	0141                	addi	sp,sp,16
+ 9d0:	8082                	ret
+
+00000000000009d2 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 9d2:	7139                	addi	sp,sp,-64
+ 9d4:	fc06                	sd	ra,56(sp)
+ 9d6:	f822                	sd	s0,48(sp)
+ 9d8:	f426                	sd	s1,40(sp)
+ 9da:	f04a                	sd	s2,32(sp)
+ 9dc:	ec4e                	sd	s3,24(sp)
+ 9de:	e852                	sd	s4,16(sp)
+ 9e0:	e456                	sd	s5,8(sp)
+ 9e2:	e05a                	sd	s6,0(sp)
+ 9e4:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 9e6:	02051493          	slli	s1,a0,0x20
+ 9ea:	9081                	srli	s1,s1,0x20
+ 9ec:	04bd                	addi	s1,s1,15
+ 9ee:	8091                	srli	s1,s1,0x4
+ 9f0:	00148a1b          	addiw	s4,s1,1
+ 9f4:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 9f6:	00000517          	auipc	a0,0x0
+ 9fa:	57a53503          	ld	a0,1402(a0) # f70 <freep>
+ 9fe:	c515                	beqz	a0,a2a <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ a00:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ a02:	4798                	lw	a4,8(a5)
+ a04:	04977163          	bgeu	a4,s1,a46 <malloc+0x74>
+ a08:	89d2                	mv	s3,s4
+ a0a:	000a071b          	sext.w	a4,s4
+ a0e:	6685                	lui	a3,0x1
+ a10:	00d77363          	bgeu	a4,a3,a16 <malloc+0x44>
+ a14:	6985                	lui	s3,0x1
+ a16:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ a1a:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ a1e:	00000917          	auipc	s2,0x0
+ a22:	55290913          	addi	s2,s2,1362 # f70 <freep>
+  if(p == (char*)-1)
+ a26:	5afd                	li	s5,-1
+ a28:	a8a5                	j	aa0 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ a2a:	00000797          	auipc	a5,0x0
+ a2e:	54678793          	addi	a5,a5,1350 # f70 <freep>
+ a32:	00000717          	auipc	a4,0x0
+ a36:	54670713          	addi	a4,a4,1350 # f78 <base>
+ a3a:	e398                	sd	a4,0(a5)
+ a3c:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ a3e:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ a42:	87ba                	mv	a5,a4
+ a44:	b7d1                	j	a08 <malloc+0x36>
+      if(p->s.size == nunits)
+ a46:	02e48c63          	beq	s1,a4,a7e <malloc+0xac>
+        p->s.size -= nunits;
+ a4a:	4147073b          	subw	a4,a4,s4
+ a4e:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ a50:	02071693          	slli	a3,a4,0x20
+ a54:	01c6d713          	srli	a4,a3,0x1c
+ a58:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ a5a:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ a5e:	00000717          	auipc	a4,0x0
+ a62:	50a73923          	sd	a0,1298(a4) # f70 <freep>
+      return (void*)(p + 1);
+ a66:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ a6a:	70e2                	ld	ra,56(sp)
+ a6c:	7442                	ld	s0,48(sp)
+ a6e:	74a2                	ld	s1,40(sp)
+ a70:	7902                	ld	s2,32(sp)
+ a72:	69e2                	ld	s3,24(sp)
+ a74:	6a42                	ld	s4,16(sp)
+ a76:	6aa2                	ld	s5,8(sp)
+ a78:	6b02                	ld	s6,0(sp)
+ a7a:	6121                	addi	sp,sp,64
+ a7c:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ a7e:	6398                	ld	a4,0(a5)
+ a80:	e118                	sd	a4,0(a0)
+ a82:	bff1                	j	a5e <malloc+0x8c>
+  hp->s.size = nu;
+ a84:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ a88:	0541                	addi	a0,a0,16
+ a8a:	00000097          	auipc	ra,0x0
+ a8e:	ec6080e7          	jalr	-314(ra) # 950 <free>
+  return freep;
+ a92:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ a96:	d971                	beqz	a0,a6a <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ a98:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ a9a:	4798                	lw	a4,8(a5)
+ a9c:	fa9775e3          	bgeu	a4,s1,a46 <malloc+0x74>
+    if(p == freep)
+ aa0:	00093703          	ld	a4,0(s2)
+ aa4:	853e                	mv	a0,a5
+ aa6:	fef719e3          	bne	a4,a5,a98 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ aaa:	854e                	mv	a0,s3
+ aac:	00000097          	auipc	ra,0x0
+ ab0:	b30080e7          	jalr	-1232(ra) # 5dc <sbrk>
+  if(p == (char*)-1)
+ ab4:	fd5518e3          	bne	a0,s5,a84 <malloc+0xb2>
+        return 0;
+ ab8:	4501                	li	a0,0
+ aba:	bf45                	j	a6a <malloc+0x98>
diff --git a/xv6-user/grep.c b/xv6-user/grep.c
new file mode 100644
index 0000000000000000000000000000000000000000..50579de690069502df2206904c6f437333447300
--- /dev/null
+++ b/xv6-user/grep.c
@@ -0,0 +1,105 @@
+// Simple grep.  Only supports ^ . * $ operators.
+
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+char buf[1024];
+int match(char*, char*);
+
+void
+grep(char *pattern, int fd)
+{
+  int n, m;
+  char *p, *q;
+
+  m = 0;
+  while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){
+    m += n;
+    buf[m] = '\0';
+    p = buf;
+    while((q = strchr(p, '\n')) != 0){
+      *q = 0;
+      if(match(pattern, p)){
+        *q = '\n';
+        write(1, p, q+1 - p);
+      }
+      p = q+1;
+    }
+    if(m > 0){
+      m -= p - buf;
+      memmove(buf, p, m);
+    }
+  }
+}
+
+int
+main(int argc, char *argv[])
+{
+  int fd, i;
+  char *pattern;
+
+  if(argc <= 1){
+    fprintf(2, "usage: grep pattern [file ...]\n");
+    exit(1);
+  }
+  pattern = argv[1];
+
+  if(argc <= 2){
+    grep(pattern, 0);
+    exit(0);
+  }
+
+  for(i = 2; i < argc; i++){
+    if((fd = open(argv[i], 0)) < 0){
+      printf("grep: cannot open %s\n", argv[i]);
+      exit(1);
+    }
+    grep(pattern, fd);
+    close(fd);
+  }
+  exit(0);
+}
+
+// Regexp matcher from Kernighan & Pike,
+// The Practice of Programming, Chapter 9.
+
+int matchhere(char*, char*);
+int matchstar(int, char*, char*);
+
+int
+match(char *re, char *text)
+{
+  if(re[0] == '^')
+    return matchhere(re+1, text);
+  do{  // must look at empty string
+    if(matchhere(re, text))
+      return 1;
+  }while(*text++ != '\0');
+  return 0;
+}
+
+// matchhere: search for re at beginning of text
+int matchhere(char *re, char *text)
+{
+  if(re[0] == '\0')
+    return 1;
+  if(re[1] == '*')
+    return matchstar(re[0], re+2, text);
+  if(re[0] == '$' && re[1] == '\0')
+    return *text == '\0';
+  if(*text!='\0' && (re[0]=='.' || re[0]==*text))
+    return matchhere(re+1, text+1);
+  return 0;
+}
+
+// matchstar: search for c*re at beginning of text
+int matchstar(int c, char *re, char *text)
+{
+  do{  // a * matches zero or more instances
+    if(matchhere(re, text))
+      return 1;
+  }while(*text!='\0' && (*text++==c || c=='.'));
+  return 0;
+}
+
diff --git a/xv6-user/grep.d b/xv6-user/grep.d
new file mode 100644
index 0000000000000000000000000000000000000000..9b9c76fd7bf45f7930e12df74e2029b4a7dd9dd6
--- /dev/null
+++ b/xv6-user/grep.d
@@ -0,0 +1,2 @@
+xv6-user/grep.o: xv6-user/grep.c kernel/include/types.h \
+ kernel/include/stat.h xv6-user/user.h kernel/include/fcntl.h
diff --git a/xv6-user/grep.o b/xv6-user/grep.o
new file mode 100644
index 0000000000000000000000000000000000000000..b4de4ff0ebb82646d17961bc6242c0699f380af6
Binary files /dev/null and b/xv6-user/grep.o differ
diff --git a/xv6-user/grep.sym b/xv6-user/grep.sym
new file mode 100644
index 0000000000000000000000000000000000000000..96ec18f6cf1593de06226c4a3dd2a062121de891
--- /dev/null
+++ b/xv6-user/grep.sym
@@ -0,0 +1,81 @@
+0000000000000000 .text
+0000000000000ac0 .rodata
+0000000000000b70 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 grep.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+0000000000000642 putc
+0000000000000664 printint
+0000000000000b58 digits
+0000000000000000 umalloc.c
+0000000000000f70 freep
+0000000000000f78 base
+000000000000029e strcpy
+000000000000091a printf
+0000000000001369 __global_pointer$
+00000000000005fc dev
+00000000000004a4 memmove
+000000000000004e matchhere
+0000000000000620 trace
+0000000000000384 gets
+0000000000000b69 __SDATA_BEGIN__
+00000000000005d2 getpid
+0000000000000536 memcpy
+000000000000011a grep
+00000000000009d2 malloc
+0000000000000616 remove
+00000000000005e4 sleep
+0000000000000628 sysinfo
+0000000000000606 readdir
+0000000000000568 pipe
+0000000000000630 rename
+000000000000057c write
+00000000000005ac fstat
+00000000000008ec fprintf
+0000000000000590 kill
+00000000000002ba strcat
+000000000000070e vprintf
+00000000000005c0 chdir
+0000000000000598 exec
+0000000000000560 wait
+0000000000000572 read
+00000000000004fc memcmp
+000000000000054e fork
+0000000000000f88 __BSS_END__
+00000000000005dc sbrk
+00000000000005f4 test_proc
+00000000000005ec uptime
+0000000000000b69 __bss_start
+000000000000033e memset
+00000000000001de main
+0000000000000000 matchstar
+00000000000002e8 strcmp
+0000000000000638 shutdown
+00000000000005ca dup
+000000000000060e getcwd
+0000000000000b70 buf
+0000000000000b69 __DATA_BEGIN__
+00000000000003fe stat
+0000000000000b69 _edata
+0000000000000f88 _end
+00000000000000cc match
+0000000000000556 exit
+0000000000000444 atoi
+0000000000000314 strlen
+00000000000005a2 open
+0000000000000360 strchr
+00000000000005b6 mkdir
+0000000000000586 close
+0000000000000950 free
diff --git a/xv6-user/grind.c b/xv6-user/grind.c
new file mode 100644
index 0000000000000000000000000000000000000000..cfdf8b85b19f669e9c6b5425cfcefc1628131eed
--- /dev/null
+++ b/xv6-user/grind.c
@@ -0,0 +1,349 @@
+//
+// run random system calls in parallel forever.
+//
+
+#include "kernel/include/param.h"
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+#include "kernel/include/fs.h"
+#include "kernel/include/fcntl.h"
+#include "kernel/include/syscall.h"
+#include "kernel/include/memlayout.h"
+#include "kernel/include/riscv.h"
+
+// from FreeBSD.
+int
+do_rand(unsigned long *ctx)
+{
+/*
+ * Compute x = (7^5 * x) mod (2^31 - 1)
+ * without overflowing 31 bits:
+ *      (2^31 - 1) = 127773 * (7^5) + 2836
+ * From "Random number generators: good ones are hard to find",
+ * Park and Miller, Communications of the ACM, vol. 31, no. 10,
+ * October 1988, p. 1195.
+ */
+    long hi, lo, x;
+
+    /* Transform to [1, 0x7ffffffe] range. */
+    x = (*ctx % 0x7ffffffe) + 1;
+    hi = x / 127773;
+    lo = x % 127773;
+    x = 16807 * lo - 2836 * hi;
+    if (x < 0)
+        x += 0x7fffffff;
+    /* Transform to [0, 0x7ffffffd] range. */
+    x--;
+    *ctx = x;
+    return (x);
+}
+
+unsigned long rand_next = 1;
+
+int
+rand(void)
+{
+    return (do_rand(&rand_next));
+}
+
+void
+go(int which_child)
+{
+  int fd = -1;
+  static char buf[999];
+  char *break0 = sbrk(0);
+  uint64 iters = 0;
+
+  mkdir("grindir");
+  if(chdir("grindir") != 0){
+    printf("chdir grindir failed\n");
+    exit(1);
+  }
+  chdir("/");
+  
+  while(1){
+    iters++;
+    if((iters % 500) == 0)
+      write(1, which_child?"B":"A", 1);
+    int what = rand() % 23;
+    if(what == 1){
+      close(open("grindir/../a", O_CREATE|O_RDWR));
+    } else if(what == 2){
+      close(open("grindir/../grindir/../b", O_CREATE|O_RDWR));
+    } else if(what == 3){
+      unlink("grindir/../a");
+    } else if(what == 4){
+      if(chdir("grindir") != 0){
+        printf("chdir grindir failed\n");
+        exit(1);
+      }
+      unlink("../b");
+      chdir("/");
+    } else if(what == 5){
+      close(fd);
+      fd = open("/grindir/../a", O_CREATE|O_RDWR);
+    } else if(what == 6){
+      close(fd);
+      fd = open("/./grindir/./../b", O_CREATE|O_RDWR);
+    } else if(what == 7){
+      write(fd, buf, sizeof(buf));
+    } else if(what == 8){
+      read(fd, buf, sizeof(buf));
+    } else if(what == 9){
+      mkdir("grindir/../a");
+      close(open("a/../a/./a", O_CREATE|O_RDWR));
+      unlink("a/a");
+    } else if(what == 10){
+      mkdir("/../b");
+      close(open("grindir/../b/b", O_CREATE|O_RDWR));
+      unlink("b/b");
+    } else if(what == 11){
+      unlink("b");
+      link("../grindir/./../a", "../b");
+    } else if(what == 12){
+      unlink("../grindir/../a");
+      link(".././b", "/grindir/../a");
+    } else if(what == 13){
+      int pid = fork();
+      if(pid == 0){
+        exit(0);
+      } else if(pid < 0){
+        printf("grind: fork failed\n");
+        exit(1);
+      }
+      wait(0);
+    } else if(what == 14){
+      int pid = fork();
+      if(pid == 0){
+        fork();
+        fork();
+        exit(0);
+      } else if(pid < 0){
+        printf("grind: fork failed\n");
+        exit(1);
+      }
+      wait(0);
+    } else if(what == 15){
+      sbrk(6011);
+    } else if(what == 16){
+      if(sbrk(0) > break0)
+        sbrk(-(sbrk(0) - break0));
+    } else if(what == 17){
+      int pid = fork();
+      if(pid == 0){
+        close(open("a", O_CREATE|O_RDWR));
+        exit(0);
+      } else if(pid < 0){
+        printf("grind: fork failed\n");
+        exit(1);
+      }
+      if(chdir("../grindir/..") != 0){
+        printf("chdir failed\n");
+        exit(1);
+      }
+      kill(pid);
+      wait(0);
+    } else if(what == 18){
+      int pid = fork();
+      if(pid == 0){
+        kill(getpid());
+        exit(0);
+      } else if(pid < 0){
+        printf("grind: fork failed\n");
+        exit(1);
+      }
+      wait(0);
+    } else if(what == 19){
+      int fds[2];
+      if(pipe(fds) < 0){
+        printf("grind: pipe failed\n");
+        exit(1);
+      }
+      int pid = fork();
+      if(pid == 0){
+        fork();
+        fork();
+        if(write(fds[1], "x", 1) != 1)
+          printf("grind: pipe write failed\n");
+        char c;
+        if(read(fds[0], &c, 1) != 1)
+          printf("grind: pipe read failed\n");
+        exit(0);
+      } else if(pid < 0){
+        printf("grind: fork failed\n");
+        exit(1);
+      }
+      close(fds[0]);
+      close(fds[1]);
+      wait(0);
+    } else if(what == 20){
+      int pid = fork();
+      if(pid == 0){
+        unlink("a");
+        mkdir("a");
+        chdir("a");
+        unlink("../a");
+        fd = open("x", O_CREATE|O_RDWR);
+        unlink("x");
+        exit(0);
+      } else if(pid < 0){
+        printf("fork failed\n");
+        exit(1);
+      }
+      wait(0);
+    } else if(what == 21){
+      unlink("c");
+      // should always succeed. check that there are free i-nodes,
+      // file descriptors, blocks.
+      int fd1 = open("c", O_CREATE|O_RDWR);
+      if(fd1 < 0){
+        printf("create c failed\n");
+        exit(1);
+      }
+      if(write(fd1, "x", 1) != 1){
+        printf("write c failed\n");
+        exit(1);
+      }
+      struct stat st;
+      if(fstat(fd1, &st) != 0){
+        printf("fstat failed\n");
+        exit(1);
+      }
+      if(st.size != 1){
+        printf("fstat reports wrong size %d\n", (int)st.size);
+        exit(1);
+      }
+      if(st.ino > 200){
+        printf("fstat reports crazy i-number %d\n", st.ino);
+        exit(1);
+      }
+      close(fd1);
+      unlink("c");
+    } else if(what == 22){
+      // echo hi | cat
+      int aa[2], bb[2];
+      if(pipe(aa) < 0){
+        fprintf(2, "pipe failed\n");
+        exit(1);
+      }
+      if(pipe(bb) < 0){
+        fprintf(2, "pipe failed\n");
+        exit(1);
+      }
+      int pid1 = fork();
+      if(pid1 == 0){
+        close(bb[0]);
+        close(bb[1]);
+        close(aa[0]);
+        close(1);
+        if(dup(aa[1]) != 1){
+          fprintf(2, "dup failed\n");
+          exit(1);
+        }
+        close(aa[1]);
+        char *args[3] = { "echo", "hi", 0 };
+        exec("grindir/../echo", args);
+        fprintf(2, "echo: not found\n");
+        exit(2);
+      } else if(pid1 < 0){
+        fprintf(2, "fork failed\n");
+        exit(3);
+      }
+      int pid2 = fork();
+      if(pid2 == 0){
+        close(aa[1]);
+        close(bb[0]);
+        close(0);
+        if(dup(aa[0]) != 0){
+          fprintf(2, "dup failed\n");
+          exit(4);
+        }
+        close(aa[0]);
+        close(1);
+        if(dup(bb[1]) != 1){
+          fprintf(2, "dup failed\n");
+          exit(5);
+        }
+        close(bb[1]);
+        char *args[2] = { "cat", 0 };
+        exec("/cat", args);
+        fprintf(2, "cat: not found\n");
+        exit(6);
+      } else if(pid2 < 0){
+        fprintf(2, "fork failed\n");
+        exit(7);
+      }
+      close(aa[0]);
+      close(aa[1]);
+      close(bb[1]);
+      char buf[3] = { 0, 0, 0 };
+      read(bb[0], buf+0, 1);
+      read(bb[0], buf+1, 1);
+      close(bb[0]);
+      int st1, st2;
+      wait(&st1);
+      wait(&st2);
+      if(st1 != 0 || st2 != 0 || strcmp(buf, "hi") != 0){
+        printf("exec pipeline failed %d %d \"%s\"\n", st1, st2, buf);
+        exit(1);
+      }
+    }
+  }
+}
+
+void
+iter()
+{
+  unlink("a");
+  unlink("b");
+  
+  int pid1 = fork();
+  if(pid1 < 0){
+    printf("grind: fork failed\n");
+    exit(1);
+  }
+  if(pid1 == 0){
+    rand_next = 31;
+    go(0);
+    exit(0);
+  }
+
+  int pid2 = fork();
+  if(pid2 < 0){
+    printf("grind: fork failed\n");
+    exit(1);
+  }
+  if(pid2 == 0){
+    rand_next = 7177;
+    go(1);
+    exit(0);
+  }
+
+  int st1 = -1;
+  wait(&st1);
+  if(st1 != 0){
+    kill(pid1);
+    kill(pid2);
+  }
+  int st2 = -1;
+  wait(&st2);
+
+  exit(0);
+}
+
+int
+main()
+{
+  while(1){
+    int pid = fork();
+    if(pid == 0){
+      iter();
+      exit(0);
+    }
+    if(pid > 0){
+      wait(0);
+    }
+    sleep(20);
+  }
+}
diff --git a/xv6-user/init.asm b/xv6-user/init.asm
new file mode 100644
index 0000000000000000000000000000000000000000..279a2e91a807db93c2cce5347a47e2defb1bf2c5
--- /dev/null
+++ b/xv6-user/init.asm
@@ -0,0 +1,1525 @@
+
+xv6-user/_init:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+ __asm_syscall("r"(a7))
+}
+
+int
+main(void)
+{
+   0:	7179                	addi	sp,sp,-48
+   2:	f406                	sd	ra,40(sp)
+   4:	f022                	sd	s0,32(sp)
+   6:	ec26                	sd	s1,24(sp)
+   8:	e84a                	sd	s2,16(sp)
+   a:	e44e                	sd	s3,8(sp)
+   c:	e052                	sd	s4,0(sp)
+   e:	1800                	addi	s0,sp,48
+
+  // if(open("console", O_RDWR) < 0){
+  //   mknod("console", CONSOLE, 0);
+  //   open("console", O_RDWR);
+  // }
+  dev(O_RDWR, CONSOLE, 0);
+  10:	4601                	li	a2,0
+  12:	4585                	li	a1,1
+  14:	4509                	li	a0,2
+  16:	00000097          	auipc	ra,0x0
+  1a:	456080e7          	jalr	1110(ra) # 46c <dev>
+  dup(0);  // stdout
+  1e:	4501                	li	a0,0
+  20:	00000097          	auipc	ra,0x0
+  24:	41a080e7          	jalr	1050(ra) # 43a <dup>
+  dup(0);  // stderr
+  28:	4501                	li	a0,0
+  2a:	00000097          	auipc	ra,0x0
+  2e:	410080e7          	jalr	1040(ra) # 43a <dup>
+
+  for(int i=0;i<counts;i++){
+  32:	00001797          	auipc	a5,0x1
+  36:	afe7a783          	lw	a5,-1282(a5) # b30 <counts>
+  3a:	0af05d63          	blez	a5,f4 <main+0xf4>
+  3e:	4901                	li	s2,0
+    printf("init: starting sh\n");
+  40:	00001a17          	auipc	s4,0x1
+  44:	8f0a0a13          	addi	s4,s4,-1808 # 930 <malloc+0xee>
+  for(int i=0;i<counts;i++){
+  48:	00001997          	auipc	s3,0x1
+  4c:	ae898993          	addi	s3,s3,-1304 # b30 <counts>
+  50:	a8b9                	j	ae <main+0xae>
+    pid = fork();
+    if(pid < 0){
+      printf("init: fork failed\n");
+  52:	00001517          	auipc	a0,0x1
+  56:	8f650513          	addi	a0,a0,-1802 # 948 <malloc+0x106>
+  5a:	00000097          	auipc	ra,0x0
+  5e:	730080e7          	jalr	1840(ra) # 78a <printf>
+      exit(1);
+  62:	4505                	li	a0,1
+  64:	00000097          	auipc	ra,0x0
+  68:	362080e7          	jalr	866(ra) # 3c6 <exit>
+    }
+    if(pid == 0){
+      exec(tests[i], argv);
+  6c:	090e                	slli	s2,s2,0x3
+  6e:	00001797          	auipc	a5,0x1
+  72:	aca78793          	addi	a5,a5,-1334 # b38 <tests>
+  76:	97ca                	add	a5,a5,s2
+  78:	00001597          	auipc	a1,0x1
+  7c:	bc858593          	addi	a1,a1,-1080 # c40 <argv>
+  80:	6388                	ld	a0,0(a5)
+  82:	00000097          	auipc	ra,0x0
+  86:	386080e7          	jalr	902(ra) # 408 <exec>
+      printf("init: exec sh failed\n");
+  8a:	00001517          	auipc	a0,0x1
+  8e:	8d650513          	addi	a0,a0,-1834 # 960 <malloc+0x11e>
+  92:	00000097          	auipc	ra,0x0
+  96:	6f8080e7          	jalr	1784(ra) # 78a <printf>
+      exit(1);
+  9a:	4505                	li	a0,1
+  9c:	00000097          	auipc	ra,0x0
+  a0:	32a080e7          	jalr	810(ra) # 3c6 <exit>
+  for(int i=0;i<counts;i++){
+  a4:	2905                	addiw	s2,s2,1
+  a6:	0009a783          	lw	a5,0(s3)
+  aa:	04f95563          	bge	s2,a5,f4 <main+0xf4>
+    printf("init: starting sh\n");
+  ae:	8552                	mv	a0,s4
+  b0:	00000097          	auipc	ra,0x0
+  b4:	6da080e7          	jalr	1754(ra) # 78a <printf>
+    pid = fork();
+  b8:	00000097          	auipc	ra,0x0
+  bc:	306080e7          	jalr	774(ra) # 3be <fork>
+  c0:	84aa                	mv	s1,a0
+    if(pid < 0){
+  c2:	f80548e3          	bltz	a0,52 <main+0x52>
+    if(pid == 0){
+  c6:	d15d                	beqz	a0,6c <main+0x6c>
+    }
+
+    for(;;){
+      // this call to wait() returns if the shell exits,
+      // or if a parentless process exits.
+      wpid = wait((int *) 0);
+  c8:	4501                	li	a0,0
+  ca:	00000097          	auipc	ra,0x0
+  ce:	306080e7          	jalr	774(ra) # 3d0 <wait>
+      if(wpid == pid){
+  d2:	fca489e3          	beq	s1,a0,a4 <main+0xa4>
+        // the shell exited; restart it.
+        break;
+      } else if(wpid < 0){
+  d6:	fe0559e3          	bgez	a0,c8 <main+0xc8>
+        printf("init: wait returned an error\n");
+  da:	00001517          	auipc	a0,0x1
+  de:	89e50513          	addi	a0,a0,-1890 # 978 <malloc+0x136>
+  e2:	00000097          	auipc	ra,0x0
+  e6:	6a8080e7          	jalr	1704(ra) # 78a <printf>
+        exit(1);
+  ea:	4505                	li	a0,1
+  ec:	00000097          	auipc	ra,0x0
+  f0:	2da080e7          	jalr	730(ra) # 3c6 <exit>
+ register long a7 __asm__("a7") = n;
+  f4:	0d200893          	li	a7,210
+ __asm_syscall("r"(a7))
+  f8:	00000073          	ecall
+      }
+    }
+  }
+  __syscall0(SYS_shutdown);
+  return 0;
+}
+  fc:	4501                	li	a0,0
+  fe:	70a2                	ld	ra,40(sp)
+ 100:	7402                	ld	s0,32(sp)
+ 102:	64e2                	ld	s1,24(sp)
+ 104:	6942                	ld	s2,16(sp)
+ 106:	69a2                	ld	s3,8(sp)
+ 108:	6a02                	ld	s4,0(sp)
+ 10a:	6145                	addi	sp,sp,48
+ 10c:	8082                	ret
+
+000000000000010e <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+ 10e:	1141                	addi	sp,sp,-16
+ 110:	e422                	sd	s0,8(sp)
+ 112:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+ 114:	87aa                	mv	a5,a0
+ 116:	0585                	addi	a1,a1,1
+ 118:	0785                	addi	a5,a5,1
+ 11a:	fff5c703          	lbu	a4,-1(a1)
+ 11e:	fee78fa3          	sb	a4,-1(a5)
+ 122:	fb75                	bnez	a4,116 <strcpy+0x8>
+    ;
+  return os;
+}
+ 124:	6422                	ld	s0,8(sp)
+ 126:	0141                	addi	sp,sp,16
+ 128:	8082                	ret
+
+000000000000012a <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+ 12a:	1141                	addi	sp,sp,-16
+ 12c:	e422                	sd	s0,8(sp)
+ 12e:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+ 130:	00054783          	lbu	a5,0(a0)
+ 134:	c385                	beqz	a5,154 <strcat+0x2a>
+ 136:	87aa                	mv	a5,a0
+    s++;
+ 138:	0785                	addi	a5,a5,1
+  while(*s)
+ 13a:	0007c703          	lbu	a4,0(a5)
+ 13e:	ff6d                	bnez	a4,138 <strcat+0xe>
+  while((*s++ = *t++))
+ 140:	0585                	addi	a1,a1,1
+ 142:	0785                	addi	a5,a5,1
+ 144:	fff5c703          	lbu	a4,-1(a1)
+ 148:	fee78fa3          	sb	a4,-1(a5)
+ 14c:	fb75                	bnez	a4,140 <strcat+0x16>
+    ;
+  return os;
+}
+ 14e:	6422                	ld	s0,8(sp)
+ 150:	0141                	addi	sp,sp,16
+ 152:	8082                	ret
+  while(*s)
+ 154:	87aa                	mv	a5,a0
+ 156:	b7ed                	j	140 <strcat+0x16>
+
+0000000000000158 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+ 158:	1141                	addi	sp,sp,-16
+ 15a:	e422                	sd	s0,8(sp)
+ 15c:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+ 15e:	00054783          	lbu	a5,0(a0)
+ 162:	cb91                	beqz	a5,176 <strcmp+0x1e>
+ 164:	0005c703          	lbu	a4,0(a1)
+ 168:	00f71763          	bne	a4,a5,176 <strcmp+0x1e>
+    p++, q++;
+ 16c:	0505                	addi	a0,a0,1
+ 16e:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+ 170:	00054783          	lbu	a5,0(a0)
+ 174:	fbe5                	bnez	a5,164 <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+ 176:	0005c503          	lbu	a0,0(a1)
+}
+ 17a:	40a7853b          	subw	a0,a5,a0
+ 17e:	6422                	ld	s0,8(sp)
+ 180:	0141                	addi	sp,sp,16
+ 182:	8082                	ret
+
+0000000000000184 <strlen>:
+
+uint
+strlen(const char *s)
+{
+ 184:	1141                	addi	sp,sp,-16
+ 186:	e422                	sd	s0,8(sp)
+ 188:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 18a:	00054783          	lbu	a5,0(a0)
+ 18e:	cf91                	beqz	a5,1aa <strlen+0x26>
+ 190:	0505                	addi	a0,a0,1
+ 192:	87aa                	mv	a5,a0
+ 194:	4685                	li	a3,1
+ 196:	9e89                	subw	a3,a3,a0
+ 198:	00f6853b          	addw	a0,a3,a5
+ 19c:	0785                	addi	a5,a5,1
+ 19e:	fff7c703          	lbu	a4,-1(a5)
+ 1a2:	fb7d                	bnez	a4,198 <strlen+0x14>
+    ;
+  return n;
+}
+ 1a4:	6422                	ld	s0,8(sp)
+ 1a6:	0141                	addi	sp,sp,16
+ 1a8:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 1aa:	4501                	li	a0,0
+ 1ac:	bfe5                	j	1a4 <strlen+0x20>
+
+00000000000001ae <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 1ae:	1141                	addi	sp,sp,-16
+ 1b0:	e422                	sd	s0,8(sp)
+ 1b2:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 1b4:	ca19                	beqz	a2,1ca <memset+0x1c>
+ 1b6:	87aa                	mv	a5,a0
+ 1b8:	1602                	slli	a2,a2,0x20
+ 1ba:	9201                	srli	a2,a2,0x20
+ 1bc:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 1c0:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 1c4:	0785                	addi	a5,a5,1
+ 1c6:	fee79de3          	bne	a5,a4,1c0 <memset+0x12>
+  }
+  return dst;
+}
+ 1ca:	6422                	ld	s0,8(sp)
+ 1cc:	0141                	addi	sp,sp,16
+ 1ce:	8082                	ret
+
+00000000000001d0 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 1d0:	1141                	addi	sp,sp,-16
+ 1d2:	e422                	sd	s0,8(sp)
+ 1d4:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 1d6:	00054783          	lbu	a5,0(a0)
+ 1da:	cb99                	beqz	a5,1f0 <strchr+0x20>
+    if(*s == c)
+ 1dc:	00f58763          	beq	a1,a5,1ea <strchr+0x1a>
+  for(; *s; s++)
+ 1e0:	0505                	addi	a0,a0,1
+ 1e2:	00054783          	lbu	a5,0(a0)
+ 1e6:	fbfd                	bnez	a5,1dc <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 1e8:	4501                	li	a0,0
+}
+ 1ea:	6422                	ld	s0,8(sp)
+ 1ec:	0141                	addi	sp,sp,16
+ 1ee:	8082                	ret
+  return 0;
+ 1f0:	4501                	li	a0,0
+ 1f2:	bfe5                	j	1ea <strchr+0x1a>
+
+00000000000001f4 <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 1f4:	711d                	addi	sp,sp,-96
+ 1f6:	ec86                	sd	ra,88(sp)
+ 1f8:	e8a2                	sd	s0,80(sp)
+ 1fa:	e4a6                	sd	s1,72(sp)
+ 1fc:	e0ca                	sd	s2,64(sp)
+ 1fe:	fc4e                	sd	s3,56(sp)
+ 200:	f852                	sd	s4,48(sp)
+ 202:	f456                	sd	s5,40(sp)
+ 204:	f05a                	sd	s6,32(sp)
+ 206:	ec5e                	sd	s7,24(sp)
+ 208:	e862                	sd	s8,16(sp)
+ 20a:	1080                	addi	s0,sp,96
+ 20c:	8baa                	mv	s7,a0
+ 20e:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 210:	892a                	mv	s2,a0
+ 212:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 214:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 218:	4b29                	li	s6,10
+ 21a:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 21c:	89a6                	mv	s3,s1
+ 21e:	2485                	addiw	s1,s1,1
+ 220:	0344d763          	bge	s1,s4,24e <gets+0x5a>
+    cc = read(0, &c, 1);
+ 224:	4605                	li	a2,1
+ 226:	85d6                	mv	a1,s5
+ 228:	4501                	li	a0,0
+ 22a:	00000097          	auipc	ra,0x0
+ 22e:	1b8080e7          	jalr	440(ra) # 3e2 <read>
+    if(cc < 1)
+ 232:	00a05e63          	blez	a0,24e <gets+0x5a>
+    buf[i++] = c;
+ 236:	faf44783          	lbu	a5,-81(s0)
+ 23a:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 23e:	01678763          	beq	a5,s6,24c <gets+0x58>
+ 242:	0905                	addi	s2,s2,1
+ 244:	fd879ce3          	bne	a5,s8,21c <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 248:	89a6                	mv	s3,s1
+ 24a:	a011                	j	24e <gets+0x5a>
+ 24c:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 24e:	99de                	add	s3,s3,s7
+ 250:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 254:	855e                	mv	a0,s7
+ 256:	60e6                	ld	ra,88(sp)
+ 258:	6446                	ld	s0,80(sp)
+ 25a:	64a6                	ld	s1,72(sp)
+ 25c:	6906                	ld	s2,64(sp)
+ 25e:	79e2                	ld	s3,56(sp)
+ 260:	7a42                	ld	s4,48(sp)
+ 262:	7aa2                	ld	s5,40(sp)
+ 264:	7b02                	ld	s6,32(sp)
+ 266:	6be2                	ld	s7,24(sp)
+ 268:	6c42                	ld	s8,16(sp)
+ 26a:	6125                	addi	sp,sp,96
+ 26c:	8082                	ret
+
+000000000000026e <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 26e:	1101                	addi	sp,sp,-32
+ 270:	ec06                	sd	ra,24(sp)
+ 272:	e822                	sd	s0,16(sp)
+ 274:	e426                	sd	s1,8(sp)
+ 276:	e04a                	sd	s2,0(sp)
+ 278:	1000                	addi	s0,sp,32
+ 27a:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 27c:	4581                	li	a1,0
+ 27e:	00000097          	auipc	ra,0x0
+ 282:	194080e7          	jalr	404(ra) # 412 <open>
+  if(fd < 0)
+ 286:	02054563          	bltz	a0,2b0 <stat+0x42>
+ 28a:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 28c:	85ca                	mv	a1,s2
+ 28e:	00000097          	auipc	ra,0x0
+ 292:	18e080e7          	jalr	398(ra) # 41c <fstat>
+ 296:	892a                	mv	s2,a0
+  close(fd);
+ 298:	8526                	mv	a0,s1
+ 29a:	00000097          	auipc	ra,0x0
+ 29e:	15c080e7          	jalr	348(ra) # 3f6 <close>
+  return r;
+}
+ 2a2:	854a                	mv	a0,s2
+ 2a4:	60e2                	ld	ra,24(sp)
+ 2a6:	6442                	ld	s0,16(sp)
+ 2a8:	64a2                	ld	s1,8(sp)
+ 2aa:	6902                	ld	s2,0(sp)
+ 2ac:	6105                	addi	sp,sp,32
+ 2ae:	8082                	ret
+    return -1;
+ 2b0:	597d                	li	s2,-1
+ 2b2:	bfc5                	j	2a2 <stat+0x34>
+
+00000000000002b4 <atoi>:
+
+int
+atoi(const char *s)
+{
+ 2b4:	1141                	addi	sp,sp,-16
+ 2b6:	e422                	sd	s0,8(sp)
+ 2b8:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 2ba:	00054703          	lbu	a4,0(a0)
+ 2be:	02d00793          	li	a5,45
+  int neg = 1;
+ 2c2:	4585                	li	a1,1
+  if (*s == '-') {
+ 2c4:	04f70363          	beq	a4,a5,30a <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 2c8:	00054703          	lbu	a4,0(a0)
+ 2cc:	fd07079b          	addiw	a5,a4,-48
+ 2d0:	0ff7f793          	zext.b	a5,a5
+ 2d4:	46a5                	li	a3,9
+ 2d6:	02f6ed63          	bltu	a3,a5,310 <atoi+0x5c>
+  n = 0;
+ 2da:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 2dc:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 2de:	0505                	addi	a0,a0,1
+ 2e0:	0026979b          	slliw	a5,a3,0x2
+ 2e4:	9fb5                	addw	a5,a5,a3
+ 2e6:	0017979b          	slliw	a5,a5,0x1
+ 2ea:	9fb9                	addw	a5,a5,a4
+ 2ec:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 2f0:	00054703          	lbu	a4,0(a0)
+ 2f4:	fd07079b          	addiw	a5,a4,-48
+ 2f8:	0ff7f793          	zext.b	a5,a5
+ 2fc:	fef671e3          	bgeu	a2,a5,2de <atoi+0x2a>
+  return n * neg;
+}
+ 300:	02d5853b          	mulw	a0,a1,a3
+ 304:	6422                	ld	s0,8(sp)
+ 306:	0141                	addi	sp,sp,16
+ 308:	8082                	ret
+    s++;
+ 30a:	0505                	addi	a0,a0,1
+    neg = -1;
+ 30c:	55fd                	li	a1,-1
+ 30e:	bf6d                	j	2c8 <atoi+0x14>
+  n = 0;
+ 310:	4681                	li	a3,0
+ 312:	b7fd                	j	300 <atoi+0x4c>
+
+0000000000000314 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 314:	1141                	addi	sp,sp,-16
+ 316:	e422                	sd	s0,8(sp)
+ 318:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 31a:	02b57463          	bgeu	a0,a1,342 <memmove+0x2e>
+    while(n-- > 0)
+ 31e:	00c05f63          	blez	a2,33c <memmove+0x28>
+ 322:	1602                	slli	a2,a2,0x20
+ 324:	9201                	srli	a2,a2,0x20
+ 326:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 32a:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 32c:	0585                	addi	a1,a1,1
+ 32e:	0705                	addi	a4,a4,1
+ 330:	fff5c683          	lbu	a3,-1(a1)
+ 334:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 338:	fee79ae3          	bne	a5,a4,32c <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 33c:	6422                	ld	s0,8(sp)
+ 33e:	0141                	addi	sp,sp,16
+ 340:	8082                	ret
+    dst += n;
+ 342:	00c50733          	add	a4,a0,a2
+    src += n;
+ 346:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 348:	fec05ae3          	blez	a2,33c <memmove+0x28>
+ 34c:	fff6079b          	addiw	a5,a2,-1
+ 350:	1782                	slli	a5,a5,0x20
+ 352:	9381                	srli	a5,a5,0x20
+ 354:	fff7c793          	not	a5,a5
+ 358:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 35a:	15fd                	addi	a1,a1,-1
+ 35c:	177d                	addi	a4,a4,-1
+ 35e:	0005c683          	lbu	a3,0(a1)
+ 362:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 366:	fee79ae3          	bne	a5,a4,35a <memmove+0x46>
+ 36a:	bfc9                	j	33c <memmove+0x28>
+
+000000000000036c <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 36c:	1141                	addi	sp,sp,-16
+ 36e:	e422                	sd	s0,8(sp)
+ 370:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 372:	ca05                	beqz	a2,3a2 <memcmp+0x36>
+ 374:	fff6069b          	addiw	a3,a2,-1
+ 378:	1682                	slli	a3,a3,0x20
+ 37a:	9281                	srli	a3,a3,0x20
+ 37c:	0685                	addi	a3,a3,1
+ 37e:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 380:	00054783          	lbu	a5,0(a0)
+ 384:	0005c703          	lbu	a4,0(a1)
+ 388:	00e79863          	bne	a5,a4,398 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 38c:	0505                	addi	a0,a0,1
+    p2++;
+ 38e:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 390:	fed518e3          	bne	a0,a3,380 <memcmp+0x14>
+  }
+  return 0;
+ 394:	4501                	li	a0,0
+ 396:	a019                	j	39c <memcmp+0x30>
+      return *p1 - *p2;
+ 398:	40e7853b          	subw	a0,a5,a4
+}
+ 39c:	6422                	ld	s0,8(sp)
+ 39e:	0141                	addi	sp,sp,16
+ 3a0:	8082                	ret
+  return 0;
+ 3a2:	4501                	li	a0,0
+ 3a4:	bfe5                	j	39c <memcmp+0x30>
+
+00000000000003a6 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 3a6:	1141                	addi	sp,sp,-16
+ 3a8:	e406                	sd	ra,8(sp)
+ 3aa:	e022                	sd	s0,0(sp)
+ 3ac:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 3ae:	00000097          	auipc	ra,0x0
+ 3b2:	f66080e7          	jalr	-154(ra) # 314 <memmove>
+}
+ 3b6:	60a2                	ld	ra,8(sp)
+ 3b8:	6402                	ld	s0,0(sp)
+ 3ba:	0141                	addi	sp,sp,16
+ 3bc:	8082                	ret
+
+00000000000003be <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.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:	05d00893          	li	a7,93
+ ecall
+ 3ca:	00000073          	ecall
+ ret
+ 3ce:	8082                	ret
+
+00000000000003d0 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 3d0:	488d                	li	a7,3
+ ecall
+ 3d2:	00000073          	ecall
+ ret
+ 3d6:	8082                	ret
+
+00000000000003d8 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 3d8:	03b00893          	li	a7,59
+ ecall
+ 3dc:	00000073          	ecall
+ ret
+ 3e0:	8082                	ret
+
+00000000000003e2 <read>:
+.global read
+read:
+ li a7, SYS_read
+ 3e2:	03f00893          	li	a7,63
+ ecall
+ 3e6:	00000073          	ecall
+ ret
+ 3ea:	8082                	ret
+
+00000000000003ec <write>:
+.global write
+write:
+ li a7, SYS_write
+ 3ec:	04000893          	li	a7,64
+ ecall
+ 3f0:	00000073          	ecall
+ ret
+ 3f4:	8082                	ret
+
+00000000000003f6 <close>:
+.global close
+close:
+ li a7, SYS_close
+ 3f6:	03900893          	li	a7,57
+ ecall
+ 3fa:	00000073          	ecall
+ ret
+ 3fe:	8082                	ret
+
+0000000000000400 <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 400:	4899                	li	a7,6
+ ecall
+ 402:	00000073          	ecall
+ ret
+ 406:	8082                	ret
+
+0000000000000408 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 408:	0dd00893          	li	a7,221
+ ecall
+ 40c:	00000073          	ecall
+ ret
+ 410:	8082                	ret
+
+0000000000000412 <open>:
+.global open
+open:
+ li a7, SYS_open
+ 412:	03800893          	li	a7,56
+ ecall
+ 416:	00000073          	ecall
+ ret
+ 41a:	8082                	ret
+
+000000000000041c <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 41c:	05000893          	li	a7,80
+ ecall
+ 420:	00000073          	ecall
+ ret
+ 424:	8082                	ret
+
+0000000000000426 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 426:	02200893          	li	a7,34
+ ecall
+ 42a:	00000073          	ecall
+ ret
+ 42e:	8082                	ret
+
+0000000000000430 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 430:	03100893          	li	a7,49
+ ecall
+ 434:	00000073          	ecall
+ ret
+ 438:	8082                	ret
+
+000000000000043a <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 43a:	48dd                	li	a7,23
+ ecall
+ 43c:	00000073          	ecall
+ ret
+ 440:	8082                	ret
+
+0000000000000442 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 442:	0ac00893          	li	a7,172
+ ecall
+ 446:	00000073          	ecall
+ ret
+ 44a:	8082                	ret
+
+000000000000044c <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 44c:	48b1                	li	a7,12
+ ecall
+ 44e:	00000073          	ecall
+ ret
+ 452:	8082                	ret
+
+0000000000000454 <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 454:	48b5                	li	a7,13
+ ecall
+ 456:	00000073          	ecall
+ ret
+ 45a:	8082                	ret
+
+000000000000045c <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 45c:	48b9                	li	a7,14
+ ecall
+ 45e:	00000073          	ecall
+ ret
+ 462:	8082                	ret
+
+0000000000000464 <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 464:	48d9                	li	a7,22
+ ecall
+ 466:	00000073          	ecall
+ ret
+ 46a:	8082                	ret
+
+000000000000046c <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 46c:	03200893          	li	a7,50
+ ecall
+ 470:	00000073          	ecall
+ ret
+ 474:	8082                	ret
+
+0000000000000476 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 476:	48ed                	li	a7,27
+ ecall
+ 478:	00000073          	ecall
+ ret
+ 47c:	8082                	ret
+
+000000000000047e <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 47e:	48c5                	li	a7,17
+ ecall
+ 480:	00000073          	ecall
+ ret
+ 484:	8082                	ret
+
+0000000000000486 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 486:	07500893          	li	a7,117
+ ecall
+ 48a:	00000073          	ecall
+ ret
+ 48e:	8082                	ret
+
+0000000000000490 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 490:	48c9                	li	a7,18
+ ecall
+ 492:	00000073          	ecall
+ ret
+ 496:	8082                	ret
+
+0000000000000498 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 498:	48cd                	li	a7,19
+ ecall
+ 49a:	00000073          	ecall
+ ret
+ 49e:	8082                	ret
+
+00000000000004a0 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 4a0:	48e9                	li	a7,26
+ ecall
+ 4a2:	00000073          	ecall
+ ret
+ 4a6:	8082                	ret
+
+00000000000004a8 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 4a8:	0d200893          	li	a7,210
+ ecall
+ 4ac:	00000073          	ecall
+ ret
+ 4b0:	8082                	ret
+
+00000000000004b2 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 4b2:	1101                	addi	sp,sp,-32
+ 4b4:	ec06                	sd	ra,24(sp)
+ 4b6:	e822                	sd	s0,16(sp)
+ 4b8:	1000                	addi	s0,sp,32
+ 4ba:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 4be:	4605                	li	a2,1
+ 4c0:	fef40593          	addi	a1,s0,-17
+ 4c4:	00000097          	auipc	ra,0x0
+ 4c8:	f28080e7          	jalr	-216(ra) # 3ec <write>
+}
+ 4cc:	60e2                	ld	ra,24(sp)
+ 4ce:	6442                	ld	s0,16(sp)
+ 4d0:	6105                	addi	sp,sp,32
+ 4d2:	8082                	ret
+
+00000000000004d4 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 4d4:	7139                	addi	sp,sp,-64
+ 4d6:	fc06                	sd	ra,56(sp)
+ 4d8:	f822                	sd	s0,48(sp)
+ 4da:	f426                	sd	s1,40(sp)
+ 4dc:	f04a                	sd	s2,32(sp)
+ 4de:	ec4e                	sd	s3,24(sp)
+ 4e0:	0080                	addi	s0,sp,64
+ 4e2:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 4e4:	c299                	beqz	a3,4ea <printint+0x16>
+ 4e6:	0805c863          	bltz	a1,576 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 4ea:	2581                	sext.w	a1,a1
+  neg = 0;
+ 4ec:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 4ee:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 4f2:	86ce                	mv	a3,s3
+  i = 0;
+ 4f4:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 4f6:	2601                	sext.w	a2,a2
+ 4f8:	00000517          	auipc	a0,0x0
+ 4fc:	62050513          	addi	a0,a0,1568 # b18 <digits>
+ 500:	883a                	mv	a6,a4
+ 502:	2705                	addiw	a4,a4,1
+ 504:	02c5f7bb          	remuw	a5,a1,a2
+ 508:	1782                	slli	a5,a5,0x20
+ 50a:	9381                	srli	a5,a5,0x20
+ 50c:	97aa                	add	a5,a5,a0
+ 50e:	0007c783          	lbu	a5,0(a5)
+ 512:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 516:	0005879b          	sext.w	a5,a1
+ 51a:	02c5d5bb          	divuw	a1,a1,a2
+ 51e:	0685                	addi	a3,a3,1
+ 520:	fec7f0e3          	bgeu	a5,a2,500 <printint+0x2c>
+  if(neg)
+ 524:	00088c63          	beqz	a7,53c <printint+0x68>
+    buf[i++] = '-';
+ 528:	fd070793          	addi	a5,a4,-48
+ 52c:	00878733          	add	a4,a5,s0
+ 530:	02d00793          	li	a5,45
+ 534:	fef70823          	sb	a5,-16(a4)
+ 538:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 53c:	02e05663          	blez	a4,568 <printint+0x94>
+ 540:	fc040913          	addi	s2,s0,-64
+ 544:	993a                	add	s2,s2,a4
+ 546:	19fd                	addi	s3,s3,-1
+ 548:	99ba                	add	s3,s3,a4
+ 54a:	377d                	addiw	a4,a4,-1
+ 54c:	1702                	slli	a4,a4,0x20
+ 54e:	9301                	srli	a4,a4,0x20
+ 550:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 554:	fff94583          	lbu	a1,-1(s2)
+ 558:	8526                	mv	a0,s1
+ 55a:	00000097          	auipc	ra,0x0
+ 55e:	f58080e7          	jalr	-168(ra) # 4b2 <putc>
+  while(--i >= 0)
+ 562:	197d                	addi	s2,s2,-1
+ 564:	ff3918e3          	bne	s2,s3,554 <printint+0x80>
+}
+ 568:	70e2                	ld	ra,56(sp)
+ 56a:	7442                	ld	s0,48(sp)
+ 56c:	74a2                	ld	s1,40(sp)
+ 56e:	7902                	ld	s2,32(sp)
+ 570:	69e2                	ld	s3,24(sp)
+ 572:	6121                	addi	sp,sp,64
+ 574:	8082                	ret
+    x = -xx;
+ 576:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 57a:	4885                	li	a7,1
+    x = -xx;
+ 57c:	bf8d                	j	4ee <printint+0x1a>
+
+000000000000057e <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 57e:	7119                	addi	sp,sp,-128
+ 580:	fc86                	sd	ra,120(sp)
+ 582:	f8a2                	sd	s0,112(sp)
+ 584:	f4a6                	sd	s1,104(sp)
+ 586:	f0ca                	sd	s2,96(sp)
+ 588:	ecce                	sd	s3,88(sp)
+ 58a:	e8d2                	sd	s4,80(sp)
+ 58c:	e4d6                	sd	s5,72(sp)
+ 58e:	e0da                	sd	s6,64(sp)
+ 590:	fc5e                	sd	s7,56(sp)
+ 592:	f862                	sd	s8,48(sp)
+ 594:	f466                	sd	s9,40(sp)
+ 596:	f06a                	sd	s10,32(sp)
+ 598:	ec6e                	sd	s11,24(sp)
+ 59a:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 59c:	0005c903          	lbu	s2,0(a1)
+ 5a0:	18090f63          	beqz	s2,73e <vprintf+0x1c0>
+ 5a4:	8aaa                	mv	s5,a0
+ 5a6:	8b32                	mv	s6,a2
+ 5a8:	00158493          	addi	s1,a1,1
+  state = 0;
+ 5ac:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 5ae:	02500a13          	li	s4,37
+ 5b2:	4c55                	li	s8,21
+ 5b4:	00000c97          	auipc	s9,0x0
+ 5b8:	50cc8c93          	addi	s9,s9,1292 # ac0 <malloc+0x27e>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 5bc:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 5c0:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 5c2:	00000b97          	auipc	s7,0x0
+ 5c6:	556b8b93          	addi	s7,s7,1366 # b18 <digits>
+ 5ca:	a839                	j	5e8 <vprintf+0x6a>
+        putc(fd, c);
+ 5cc:	85ca                	mv	a1,s2
+ 5ce:	8556                	mv	a0,s5
+ 5d0:	00000097          	auipc	ra,0x0
+ 5d4:	ee2080e7          	jalr	-286(ra) # 4b2 <putc>
+ 5d8:	a019                	j	5de <vprintf+0x60>
+    } else if(state == '%'){
+ 5da:	01498d63          	beq	s3,s4,5f4 <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 5de:	0485                	addi	s1,s1,1
+ 5e0:	fff4c903          	lbu	s2,-1(s1)
+ 5e4:	14090d63          	beqz	s2,73e <vprintf+0x1c0>
+    if(state == 0){
+ 5e8:	fe0999e3          	bnez	s3,5da <vprintf+0x5c>
+      if(c == '%'){
+ 5ec:	ff4910e3          	bne	s2,s4,5cc <vprintf+0x4e>
+        state = '%';
+ 5f0:	89d2                	mv	s3,s4
+ 5f2:	b7f5                	j	5de <vprintf+0x60>
+      if(c == 'd'){
+ 5f4:	11490c63          	beq	s2,s4,70c <vprintf+0x18e>
+ 5f8:	f9d9079b          	addiw	a5,s2,-99
+ 5fc:	0ff7f793          	zext.b	a5,a5
+ 600:	10fc6e63          	bltu	s8,a5,71c <vprintf+0x19e>
+ 604:	f9d9079b          	addiw	a5,s2,-99
+ 608:	0ff7f713          	zext.b	a4,a5
+ 60c:	10ec6863          	bltu	s8,a4,71c <vprintf+0x19e>
+ 610:	00271793          	slli	a5,a4,0x2
+ 614:	97e6                	add	a5,a5,s9
+ 616:	439c                	lw	a5,0(a5)
+ 618:	97e6                	add	a5,a5,s9
+ 61a:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 61c:	008b0913          	addi	s2,s6,8
+ 620:	4685                	li	a3,1
+ 622:	4629                	li	a2,10
+ 624:	000b2583          	lw	a1,0(s6)
+ 628:	8556                	mv	a0,s5
+ 62a:	00000097          	auipc	ra,0x0
+ 62e:	eaa080e7          	jalr	-342(ra) # 4d4 <printint>
+ 632:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 634:	4981                	li	s3,0
+ 636:	b765                	j	5de <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 638:	008b0913          	addi	s2,s6,8
+ 63c:	4681                	li	a3,0
+ 63e:	4629                	li	a2,10
+ 640:	000b2583          	lw	a1,0(s6)
+ 644:	8556                	mv	a0,s5
+ 646:	00000097          	auipc	ra,0x0
+ 64a:	e8e080e7          	jalr	-370(ra) # 4d4 <printint>
+ 64e:	8b4a                	mv	s6,s2
+      state = 0;
+ 650:	4981                	li	s3,0
+ 652:	b771                	j	5de <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 654:	008b0913          	addi	s2,s6,8
+ 658:	4681                	li	a3,0
+ 65a:	866a                	mv	a2,s10
+ 65c:	000b2583          	lw	a1,0(s6)
+ 660:	8556                	mv	a0,s5
+ 662:	00000097          	auipc	ra,0x0
+ 666:	e72080e7          	jalr	-398(ra) # 4d4 <printint>
+ 66a:	8b4a                	mv	s6,s2
+      state = 0;
+ 66c:	4981                	li	s3,0
+ 66e:	bf85                	j	5de <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 670:	008b0793          	addi	a5,s6,8
+ 674:	f8f43423          	sd	a5,-120(s0)
+ 678:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 67c:	03000593          	li	a1,48
+ 680:	8556                	mv	a0,s5
+ 682:	00000097          	auipc	ra,0x0
+ 686:	e30080e7          	jalr	-464(ra) # 4b2 <putc>
+  putc(fd, 'x');
+ 68a:	07800593          	li	a1,120
+ 68e:	8556                	mv	a0,s5
+ 690:	00000097          	auipc	ra,0x0
+ 694:	e22080e7          	jalr	-478(ra) # 4b2 <putc>
+ 698:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 69a:	03c9d793          	srli	a5,s3,0x3c
+ 69e:	97de                	add	a5,a5,s7
+ 6a0:	0007c583          	lbu	a1,0(a5)
+ 6a4:	8556                	mv	a0,s5
+ 6a6:	00000097          	auipc	ra,0x0
+ 6aa:	e0c080e7          	jalr	-500(ra) # 4b2 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 6ae:	0992                	slli	s3,s3,0x4
+ 6b0:	397d                	addiw	s2,s2,-1
+ 6b2:	fe0914e3          	bnez	s2,69a <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 6b6:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 6ba:	4981                	li	s3,0
+ 6bc:	b70d                	j	5de <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 6be:	008b0913          	addi	s2,s6,8
+ 6c2:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 6c6:	02098163          	beqz	s3,6e8 <vprintf+0x16a>
+        while(*s != 0){
+ 6ca:	0009c583          	lbu	a1,0(s3)
+ 6ce:	c5ad                	beqz	a1,738 <vprintf+0x1ba>
+          putc(fd, *s);
+ 6d0:	8556                	mv	a0,s5
+ 6d2:	00000097          	auipc	ra,0x0
+ 6d6:	de0080e7          	jalr	-544(ra) # 4b2 <putc>
+          s++;
+ 6da:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 6dc:	0009c583          	lbu	a1,0(s3)
+ 6e0:	f9e5                	bnez	a1,6d0 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 6e2:	8b4a                	mv	s6,s2
+      state = 0;
+ 6e4:	4981                	li	s3,0
+ 6e6:	bde5                	j	5de <vprintf+0x60>
+          s = "(null)";
+ 6e8:	00000997          	auipc	s3,0x0
+ 6ec:	3d098993          	addi	s3,s3,976 # ab8 <malloc+0x276>
+        while(*s != 0){
+ 6f0:	85ee                	mv	a1,s11
+ 6f2:	bff9                	j	6d0 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 6f4:	008b0913          	addi	s2,s6,8
+ 6f8:	000b4583          	lbu	a1,0(s6)
+ 6fc:	8556                	mv	a0,s5
+ 6fe:	00000097          	auipc	ra,0x0
+ 702:	db4080e7          	jalr	-588(ra) # 4b2 <putc>
+ 706:	8b4a                	mv	s6,s2
+      state = 0;
+ 708:	4981                	li	s3,0
+ 70a:	bdd1                	j	5de <vprintf+0x60>
+        putc(fd, c);
+ 70c:	85d2                	mv	a1,s4
+ 70e:	8556                	mv	a0,s5
+ 710:	00000097          	auipc	ra,0x0
+ 714:	da2080e7          	jalr	-606(ra) # 4b2 <putc>
+      state = 0;
+ 718:	4981                	li	s3,0
+ 71a:	b5d1                	j	5de <vprintf+0x60>
+        putc(fd, '%');
+ 71c:	85d2                	mv	a1,s4
+ 71e:	8556                	mv	a0,s5
+ 720:	00000097          	auipc	ra,0x0
+ 724:	d92080e7          	jalr	-622(ra) # 4b2 <putc>
+        putc(fd, c);
+ 728:	85ca                	mv	a1,s2
+ 72a:	8556                	mv	a0,s5
+ 72c:	00000097          	auipc	ra,0x0
+ 730:	d86080e7          	jalr	-634(ra) # 4b2 <putc>
+      state = 0;
+ 734:	4981                	li	s3,0
+ 736:	b565                	j	5de <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 738:	8b4a                	mv	s6,s2
+      state = 0;
+ 73a:	4981                	li	s3,0
+ 73c:	b54d                	j	5de <vprintf+0x60>
+    }
+  }
+}
+ 73e:	70e6                	ld	ra,120(sp)
+ 740:	7446                	ld	s0,112(sp)
+ 742:	74a6                	ld	s1,104(sp)
+ 744:	7906                	ld	s2,96(sp)
+ 746:	69e6                	ld	s3,88(sp)
+ 748:	6a46                	ld	s4,80(sp)
+ 74a:	6aa6                	ld	s5,72(sp)
+ 74c:	6b06                	ld	s6,64(sp)
+ 74e:	7be2                	ld	s7,56(sp)
+ 750:	7c42                	ld	s8,48(sp)
+ 752:	7ca2                	ld	s9,40(sp)
+ 754:	7d02                	ld	s10,32(sp)
+ 756:	6de2                	ld	s11,24(sp)
+ 758:	6109                	addi	sp,sp,128
+ 75a:	8082                	ret
+
+000000000000075c <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 75c:	715d                	addi	sp,sp,-80
+ 75e:	ec06                	sd	ra,24(sp)
+ 760:	e822                	sd	s0,16(sp)
+ 762:	1000                	addi	s0,sp,32
+ 764:	e010                	sd	a2,0(s0)
+ 766:	e414                	sd	a3,8(s0)
+ 768:	e818                	sd	a4,16(s0)
+ 76a:	ec1c                	sd	a5,24(s0)
+ 76c:	03043023          	sd	a6,32(s0)
+ 770:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 774:	8622                	mv	a2,s0
+ 776:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 77a:	00000097          	auipc	ra,0x0
+ 77e:	e04080e7          	jalr	-508(ra) # 57e <vprintf>
+}
+ 782:	60e2                	ld	ra,24(sp)
+ 784:	6442                	ld	s0,16(sp)
+ 786:	6161                	addi	sp,sp,80
+ 788:	8082                	ret
+
+000000000000078a <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 78a:	711d                	addi	sp,sp,-96
+ 78c:	ec06                	sd	ra,24(sp)
+ 78e:	e822                	sd	s0,16(sp)
+ 790:	1000                	addi	s0,sp,32
+ 792:	e40c                	sd	a1,8(s0)
+ 794:	e810                	sd	a2,16(s0)
+ 796:	ec14                	sd	a3,24(s0)
+ 798:	f018                	sd	a4,32(s0)
+ 79a:	f41c                	sd	a5,40(s0)
+ 79c:	03043823          	sd	a6,48(s0)
+ 7a0:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 7a4:	00840613          	addi	a2,s0,8
+ 7a8:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 7ac:	85aa                	mv	a1,a0
+ 7ae:	4505                	li	a0,1
+ 7b0:	00000097          	auipc	ra,0x0
+ 7b4:	dce080e7          	jalr	-562(ra) # 57e <vprintf>
+}
+ 7b8:	60e2                	ld	ra,24(sp)
+ 7ba:	6442                	ld	s0,16(sp)
+ 7bc:	6125                	addi	sp,sp,96
+ 7be:	8082                	ret
+
+00000000000007c0 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 7c0:	1141                	addi	sp,sp,-16
+ 7c2:	e422                	sd	s0,8(sp)
+ 7c4:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 7c6:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 7ca:	00000797          	auipc	a5,0x0
+ 7ce:	47e7b783          	ld	a5,1150(a5) # c48 <freep>
+ 7d2:	a02d                	j	7fc <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;
+ 7d4:	4618                	lw	a4,8(a2)
+ 7d6:	9f2d                	addw	a4,a4,a1
+ 7d8:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 7dc:	6398                	ld	a4,0(a5)
+ 7de:	6310                	ld	a2,0(a4)
+ 7e0:	a83d                	j	81e <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 7e2:	ff852703          	lw	a4,-8(a0)
+ 7e6:	9f31                	addw	a4,a4,a2
+ 7e8:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 7ea:	ff053683          	ld	a3,-16(a0)
+ 7ee:	a091                	j	832 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 7f0:	6398                	ld	a4,0(a5)
+ 7f2:	00e7e463          	bltu	a5,a4,7fa <free+0x3a>
+ 7f6:	00e6ea63          	bltu	a3,a4,80a <free+0x4a>
+{
+ 7fa:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 7fc:	fed7fae3          	bgeu	a5,a3,7f0 <free+0x30>
+ 800:	6398                	ld	a4,0(a5)
+ 802:	00e6e463          	bltu	a3,a4,80a <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 806:	fee7eae3          	bltu	a5,a4,7fa <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 80a:	ff852583          	lw	a1,-8(a0)
+ 80e:	6390                	ld	a2,0(a5)
+ 810:	02059813          	slli	a6,a1,0x20
+ 814:	01c85713          	srli	a4,a6,0x1c
+ 818:	9736                	add	a4,a4,a3
+ 81a:	fae60de3          	beq	a2,a4,7d4 <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 81e:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 822:	4790                	lw	a2,8(a5)
+ 824:	02061593          	slli	a1,a2,0x20
+ 828:	01c5d713          	srli	a4,a1,0x1c
+ 82c:	973e                	add	a4,a4,a5
+ 82e:	fae68ae3          	beq	a3,a4,7e2 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 832:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 834:	00000717          	auipc	a4,0x0
+ 838:	40f73a23          	sd	a5,1044(a4) # c48 <freep>
+}
+ 83c:	6422                	ld	s0,8(sp)
+ 83e:	0141                	addi	sp,sp,16
+ 840:	8082                	ret
+
+0000000000000842 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 842:	7139                	addi	sp,sp,-64
+ 844:	fc06                	sd	ra,56(sp)
+ 846:	f822                	sd	s0,48(sp)
+ 848:	f426                	sd	s1,40(sp)
+ 84a:	f04a                	sd	s2,32(sp)
+ 84c:	ec4e                	sd	s3,24(sp)
+ 84e:	e852                	sd	s4,16(sp)
+ 850:	e456                	sd	s5,8(sp)
+ 852:	e05a                	sd	s6,0(sp)
+ 854:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 856:	02051493          	slli	s1,a0,0x20
+ 85a:	9081                	srli	s1,s1,0x20
+ 85c:	04bd                	addi	s1,s1,15
+ 85e:	8091                	srli	s1,s1,0x4
+ 860:	00148a1b          	addiw	s4,s1,1
+ 864:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 866:	00000517          	auipc	a0,0x0
+ 86a:	3e253503          	ld	a0,994(a0) # c48 <freep>
+ 86e:	c515                	beqz	a0,89a <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 870:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 872:	4798                	lw	a4,8(a5)
+ 874:	04977163          	bgeu	a4,s1,8b6 <malloc+0x74>
+ 878:	89d2                	mv	s3,s4
+ 87a:	000a071b          	sext.w	a4,s4
+ 87e:	6685                	lui	a3,0x1
+ 880:	00d77363          	bgeu	a4,a3,886 <malloc+0x44>
+ 884:	6985                	lui	s3,0x1
+ 886:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 88a:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 88e:	00000917          	auipc	s2,0x0
+ 892:	3ba90913          	addi	s2,s2,954 # c48 <freep>
+  if(p == (char*)-1)
+ 896:	5afd                	li	s5,-1
+ 898:	a8a5                	j	910 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 89a:	00000797          	auipc	a5,0x0
+ 89e:	3ae78793          	addi	a5,a5,942 # c48 <freep>
+ 8a2:	00000717          	auipc	a4,0x0
+ 8a6:	3ae70713          	addi	a4,a4,942 # c50 <base>
+ 8aa:	e398                	sd	a4,0(a5)
+ 8ac:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 8ae:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 8b2:	87ba                	mv	a5,a4
+ 8b4:	b7d1                	j	878 <malloc+0x36>
+      if(p->s.size == nunits)
+ 8b6:	02e48c63          	beq	s1,a4,8ee <malloc+0xac>
+        p->s.size -= nunits;
+ 8ba:	4147073b          	subw	a4,a4,s4
+ 8be:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 8c0:	02071693          	slli	a3,a4,0x20
+ 8c4:	01c6d713          	srli	a4,a3,0x1c
+ 8c8:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 8ca:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 8ce:	00000717          	auipc	a4,0x0
+ 8d2:	36a73d23          	sd	a0,890(a4) # c48 <freep>
+      return (void*)(p + 1);
+ 8d6:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 8da:	70e2                	ld	ra,56(sp)
+ 8dc:	7442                	ld	s0,48(sp)
+ 8de:	74a2                	ld	s1,40(sp)
+ 8e0:	7902                	ld	s2,32(sp)
+ 8e2:	69e2                	ld	s3,24(sp)
+ 8e4:	6a42                	ld	s4,16(sp)
+ 8e6:	6aa2                	ld	s5,8(sp)
+ 8e8:	6b02                	ld	s6,0(sp)
+ 8ea:	6121                	addi	sp,sp,64
+ 8ec:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 8ee:	6398                	ld	a4,0(a5)
+ 8f0:	e118                	sd	a4,0(a0)
+ 8f2:	bff1                	j	8ce <malloc+0x8c>
+  hp->s.size = nu;
+ 8f4:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 8f8:	0541                	addi	a0,a0,16
+ 8fa:	00000097          	auipc	ra,0x0
+ 8fe:	ec6080e7          	jalr	-314(ra) # 7c0 <free>
+  return freep;
+ 902:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 906:	d971                	beqz	a0,8da <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 908:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 90a:	4798                	lw	a4,8(a5)
+ 90c:	fa9775e3          	bgeu	a4,s1,8b6 <malloc+0x74>
+    if(p == freep)
+ 910:	00093703          	ld	a4,0(s2)
+ 914:	853e                	mv	a0,a5
+ 916:	fef719e3          	bne	a4,a5,908 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 91a:	854e                	mv	a0,s3
+ 91c:	00000097          	auipc	ra,0x0
+ 920:	b30080e7          	jalr	-1232(ra) # 44c <sbrk>
+  if(p == (char*)-1)
+ 924:	fd5518e3          	bne	a0,s5,8f4 <malloc+0xb2>
+        return 0;
+ 928:	4501                	li	a0,0
+ 92a:	bf45                	j	8da <malloc+0x98>
diff --git a/xv6-user/init.c b/xv6-user/init.c
new file mode 100644
index 0000000000000000000000000000000000000000..998cc8a4ea28d060f79b52aeb5e02b59347fce63
--- /dev/null
+++ b/xv6-user/init.c
@@ -0,0 +1,104 @@
+// init: The initial user-level program
+
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "kernel/include/file.h"
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+#include "kernel/include/sysnum.h"
+char *argv[] = {0};
+char *tests[]={
+  "brk",
+  "chdir",
+  "clone",
+  "close",
+  "dup",
+  "dup2",
+  "execve",
+  "exit",
+  "fork",
+  "fstat",
+  "getcwd",
+  "getdents",
+  "getpid",
+  "getppid",
+  "gettimeofday",
+  "mkdir_",
+  "mmap",
+  "mount",
+  "munmap",
+  "open",
+  "openat",
+  "pipe",
+  "read",
+  "sleep",
+  "test_echo",
+  "times",
+  "umount",
+  "uname",
+  "unlink",
+  "wait",
+  "waitpid",
+  "write",
+  "yield",
+};
+int counts = sizeof(tests) / sizeof((tests)[0]);
+
+#define __asm_syscall(...) \
+ __asm__ __volatile__("ecall\n\t" \
+ : "=r"(a0) \
+ : __VA_ARGS__ \
+ : "memory"); \
+ return a0;
+static inline long __syscall0(long n)
+{
+ register long a7 __asm__("a7") = n;
+ register long a0 __asm__("a0");
+ __asm_syscall("r"(a7))
+}
+
+int
+main(void)
+{
+  int pid, wpid;
+
+  // if(open("console", O_RDWR) < 0){
+  //   mknod("console", CONSOLE, 0);
+  //   open("console", O_RDWR);
+  // }
+  dev(O_RDWR, CONSOLE, 0);
+  dup(0);  // stdout
+  dup(0);  // stderr
+
+  for(int i=0;i<counts;i++){
+    printf("init: starting sh\n");
+    pid = fork();
+    if(pid < 0){
+      printf("init: fork failed\n");
+      exit(1);
+    }
+    if(pid == 0){
+      exec(tests[i], argv);
+      printf("init: exec sh failed\n");
+      exit(1);
+    }
+
+    for(;;){
+      // this call to wait() returns if the shell exits,
+      // or if a parentless process exits.
+      wpid = wait((int *) 0);
+      if(wpid == pid){
+        // the shell exited; restart it.
+        break;
+      } else if(wpid < 0){
+        printf("init: wait returned an error\n");
+        exit(1);
+      } else {
+        // it was a parentless process; do nothing.
+      }
+    }
+  }
+  __syscall0(SYS_shutdown);
+  return 0;
+}
diff --git a/xv6-user/init.d b/xv6-user/init.d
new file mode 100644
index 0000000000000000000000000000000000000000..d717fb9d03c05733da373d381ca89e3e6297ceba
--- /dev/null
+++ b/xv6-user/init.d
@@ -0,0 +1,3 @@
+xv6-user/init.o: xv6-user/init.c kernel/include/types.h \
+ kernel/include/stat.h kernel/include/file.h kernel/include/fcntl.h \
+ xv6-user/user.h kernel/include/sysnum.h
diff --git a/xv6-user/init.o b/xv6-user/init.o
new file mode 100644
index 0000000000000000000000000000000000000000..4d026c5db0a932a5c6b25b0942529ec2bd8c4990
Binary files /dev/null and b/xv6-user/init.o differ
diff --git a/xv6-user/init.sym b/xv6-user/init.sym
new file mode 100644
index 0000000000000000000000000000000000000000..232294b54881081bbe4a405656aa94fe80d6d505
--- /dev/null
+++ b/xv6-user/init.sym
@@ -0,0 +1,80 @@
+0000000000000000 .text
+0000000000000930 .rodata
+0000000000000b30 .data
+0000000000000c40 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 init.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+00000000000004b2 putc
+00000000000004d4 printint
+0000000000000b18 digits
+0000000000000000 umalloc.c
+0000000000000c48 freep
+0000000000000c50 base
+000000000000010e strcpy
+000000000000078a printf
+0000000000001330 __global_pointer$
+000000000000046c dev
+0000000000000c40 argv
+0000000000000314 memmove
+0000000000000490 trace
+00000000000001f4 gets
+0000000000000c40 __SDATA_BEGIN__
+0000000000000442 getpid
+00000000000003a6 memcpy
+0000000000000842 malloc
+0000000000000486 remove
+0000000000000454 sleep
+0000000000000498 sysinfo
+0000000000000476 readdir
+00000000000003d8 pipe
+00000000000004a0 rename
+00000000000003ec write
+000000000000041c fstat
+000000000000075c fprintf
+0000000000000400 kill
+000000000000012a strcat
+000000000000057e vprintf
+0000000000000430 chdir
+0000000000000408 exec
+00000000000003d0 wait
+00000000000003e2 read
+000000000000036c memcmp
+00000000000003be fork
+0000000000000c60 __BSS_END__
+000000000000044c sbrk
+0000000000000464 test_proc
+000000000000045c uptime
+0000000000000c40 __bss_start
+00000000000001ae memset
+0000000000000000 main
+0000000000000b38 tests
+0000000000000158 strcmp
+00000000000004a8 shutdown
+000000000000043a dup
+000000000000047e getcwd
+0000000000000b30 __DATA_BEGIN__
+000000000000026e stat
+0000000000000c40 _edata
+0000000000000c60 _end
+00000000000003c6 exit
+00000000000002b4 atoi
+0000000000000184 strlen
+0000000000000412 open
+00000000000001d0 strchr
+0000000000000b30 counts
+0000000000000426 mkdir
+00000000000003f6 close
+00000000000007c0 free
diff --git a/xv6-user/initcode b/xv6-user/initcode
new file mode 100644
index 0000000000000000000000000000000000000000..d67c5f3d7e9c60c03d2efeef72ce8778768e065c
Binary files /dev/null and b/xv6-user/initcode differ
diff --git a/xv6-user/initcode.S b/xv6-user/initcode.S
new file mode 100644
index 0000000000000000000000000000000000000000..656395c91c65dd4ae1113f6adf5f56fa35a7a39d
--- /dev/null
+++ b/xv6-user/initcode.S
@@ -0,0 +1,28 @@
+# Initial process that execs /init.
+# This code runs in user space.
+
+#include "include/sysnum.h"
+
+# exec(init, argv)
+.globl start
+start:
+        la a0, init
+        la a1, argv
+        li a7, SYS_exec
+        ecall
+
+# for(;;) exit();
+exit:
+        li a7, SYS_exit
+        ecall
+        jal exit
+
+# char init[] = "/init\0";
+init:
+  .string "/init\0"
+
+# char *argv[] = { init, 0 };
+.p2align 2
+argv:
+  .long init
+  .long 0
diff --git a/xv6-user/initcode.asm b/xv6-user/initcode.asm
new file mode 100644
index 0000000000000000000000000000000000000000..594574bdd18940db7352cfff436746a1c2d7f892
--- /dev/null
+++ b/xv6-user/initcode.asm
@@ -0,0 +1,41 @@
+
+xv6-user/initcode.o:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <start>:
+#include "include/sysnum.h"
+
+# exec(init, argv)
+.globl start
+start:
+        la a0, init
+   0:	00000517          	auipc	a0,0x0
+   4:	00053503          	ld	a0,0(a0) # 0 <start>
+        la a1, argv
+   8:	00000597          	auipc	a1,0x0
+   c:	0005b583          	ld	a1,0(a1) # 8 <start+0x8>
+        li a7, SYS_exec
+  10:	0dd00893          	li	a7,221
+        ecall
+  14:	00000073          	ecall
+
+0000000000000018 <exit>:
+
+# for(;;) exit();
+exit:
+        li a7, SYS_exit
+  18:	05d00893          	li	a7,93
+        ecall
+  1c:	00000073          	ecall
+        jal exit
+  20:	ff9ff0ef          	jal	ra,18 <exit>
+
+0000000000000024 <init>:
+  24:	696e692f          	.word	0x696e692f
+  28:	           	Address 0x0000000000000028 is out of bounds.
+
+
+000000000000002b <argv>:
+	...
diff --git a/xv6-user/initcode.d b/xv6-user/initcode.d
new file mode 100644
index 0000000000000000000000000000000000000000..5e38d6f574ccc8ccb1eaad4c379b7ceb53a1865e
--- /dev/null
+++ b/xv6-user/initcode.d
@@ -0,0 +1 @@
+xv6-user/initcode.o: xv6-user/initcode.S kernel/include/sysnum.h
diff --git a/xv6-user/initcode.o b/xv6-user/initcode.o
new file mode 100644
index 0000000000000000000000000000000000000000..39b646b5e61d0d35a05fdd78f88e1f8b4e3aff11
Binary files /dev/null and b/xv6-user/initcode.o differ
diff --git a/xv6-user/initcode.out b/xv6-user/initcode.out
new file mode 100644
index 0000000000000000000000000000000000000000..94964173e5a767f67e60fc517bf20e31996abb84
Binary files /dev/null and b/xv6-user/initcode.out differ
diff --git a/xv6-user/kill.asm b/xv6-user/kill.asm
new file mode 100644
index 0000000000000000000000000000000000000000..133741abe05442a956820ccc2371044521958c82
--- /dev/null
+++ b/xv6-user/kill.asm
@@ -0,0 +1,1438 @@
+
+xv6-user/_kill:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char **argv)
+{
+   0:	1101                	addi	sp,sp,-32
+   2:	ec06                	sd	ra,24(sp)
+   4:	e822                	sd	s0,16(sp)
+   6:	e426                	sd	s1,8(sp)
+   8:	e04a                	sd	s2,0(sp)
+   a:	1000                	addi	s0,sp,32
+  int i;
+
+  if(argc < 2){
+   c:	4785                	li	a5,1
+   e:	02a7dd63          	bge	a5,a0,48 <main+0x48>
+  12:	00858493          	addi	s1,a1,8
+  16:	ffe5091b          	addiw	s2,a0,-2
+  1a:	02091793          	slli	a5,s2,0x20
+  1e:	01d7d913          	srli	s2,a5,0x1d
+  22:	05c1                	addi	a1,a1,16
+  24:	992e                	add	s2,s2,a1
+    fprintf(2, "usage: kill pid...\n");
+    exit(1);
+  }
+  for(i=1; i<argc; i++)
+    kill(atoi(argv[i]));
+  26:	6088                	ld	a0,0(s1)
+  28:	00000097          	auipc	ra,0x0
+  2c:	1e2080e7          	jalr	482(ra) # 20a <atoi>
+  30:	00000097          	auipc	ra,0x0
+  34:	326080e7          	jalr	806(ra) # 356 <kill>
+  for(i=1; i<argc; i++)
+  38:	04a1                	addi	s1,s1,8
+  3a:	ff2496e3          	bne	s1,s2,26 <main+0x26>
+  exit(0);
+  3e:	4501                	li	a0,0
+  40:	00000097          	auipc	ra,0x0
+  44:	2dc080e7          	jalr	732(ra) # 31c <exit>
+    fprintf(2, "usage: kill pid...\n");
+  48:	00001597          	auipc	a1,0x1
+  4c:	84058593          	addi	a1,a1,-1984 # 888 <malloc+0xf0>
+  50:	4509                	li	a0,2
+  52:	00000097          	auipc	ra,0x0
+  56:	660080e7          	jalr	1632(ra) # 6b2 <fprintf>
+    exit(1);
+  5a:	4505                	li	a0,1
+  5c:	00000097          	auipc	ra,0x0
+  60:	2c0080e7          	jalr	704(ra) # 31c <exit>
+
+0000000000000064 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+  64:	1141                	addi	sp,sp,-16
+  66:	e422                	sd	s0,8(sp)
+  68:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+  6a:	87aa                	mv	a5,a0
+  6c:	0585                	addi	a1,a1,1
+  6e:	0785                	addi	a5,a5,1
+  70:	fff5c703          	lbu	a4,-1(a1)
+  74:	fee78fa3          	sb	a4,-1(a5)
+  78:	fb75                	bnez	a4,6c <strcpy+0x8>
+    ;
+  return os;
+}
+  7a:	6422                	ld	s0,8(sp)
+  7c:	0141                	addi	sp,sp,16
+  7e:	8082                	ret
+
+0000000000000080 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+  80:	1141                	addi	sp,sp,-16
+  82:	e422                	sd	s0,8(sp)
+  84:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+  86:	00054783          	lbu	a5,0(a0)
+  8a:	c385                	beqz	a5,aa <strcat+0x2a>
+  8c:	87aa                	mv	a5,a0
+    s++;
+  8e:	0785                	addi	a5,a5,1
+  while(*s)
+  90:	0007c703          	lbu	a4,0(a5)
+  94:	ff6d                	bnez	a4,8e <strcat+0xe>
+  while((*s++ = *t++))
+  96:	0585                	addi	a1,a1,1
+  98:	0785                	addi	a5,a5,1
+  9a:	fff5c703          	lbu	a4,-1(a1)
+  9e:	fee78fa3          	sb	a4,-1(a5)
+  a2:	fb75                	bnez	a4,96 <strcat+0x16>
+    ;
+  return os;
+}
+  a4:	6422                	ld	s0,8(sp)
+  a6:	0141                	addi	sp,sp,16
+  a8:	8082                	ret
+  while(*s)
+  aa:	87aa                	mv	a5,a0
+  ac:	b7ed                	j	96 <strcat+0x16>
+
+00000000000000ae <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+  ae:	1141                	addi	sp,sp,-16
+  b0:	e422                	sd	s0,8(sp)
+  b2:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+  b4:	00054783          	lbu	a5,0(a0)
+  b8:	cb91                	beqz	a5,cc <strcmp+0x1e>
+  ba:	0005c703          	lbu	a4,0(a1)
+  be:	00f71763          	bne	a4,a5,cc <strcmp+0x1e>
+    p++, q++;
+  c2:	0505                	addi	a0,a0,1
+  c4:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+  c6:	00054783          	lbu	a5,0(a0)
+  ca:	fbe5                	bnez	a5,ba <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+  cc:	0005c503          	lbu	a0,0(a1)
+}
+  d0:	40a7853b          	subw	a0,a5,a0
+  d4:	6422                	ld	s0,8(sp)
+  d6:	0141                	addi	sp,sp,16
+  d8:	8082                	ret
+
+00000000000000da <strlen>:
+
+uint
+strlen(const char *s)
+{
+  da:	1141                	addi	sp,sp,-16
+  dc:	e422                	sd	s0,8(sp)
+  de:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+  e0:	00054783          	lbu	a5,0(a0)
+  e4:	cf91                	beqz	a5,100 <strlen+0x26>
+  e6:	0505                	addi	a0,a0,1
+  e8:	87aa                	mv	a5,a0
+  ea:	4685                	li	a3,1
+  ec:	9e89                	subw	a3,a3,a0
+  ee:	00f6853b          	addw	a0,a3,a5
+  f2:	0785                	addi	a5,a5,1
+  f4:	fff7c703          	lbu	a4,-1(a5)
+  f8:	fb7d                	bnez	a4,ee <strlen+0x14>
+    ;
+  return n;
+}
+  fa:	6422                	ld	s0,8(sp)
+  fc:	0141                	addi	sp,sp,16
+  fe:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 100:	4501                	li	a0,0
+ 102:	bfe5                	j	fa <strlen+0x20>
+
+0000000000000104 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 104:	1141                	addi	sp,sp,-16
+ 106:	e422                	sd	s0,8(sp)
+ 108:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 10a:	ca19                	beqz	a2,120 <memset+0x1c>
+ 10c:	87aa                	mv	a5,a0
+ 10e:	1602                	slli	a2,a2,0x20
+ 110:	9201                	srli	a2,a2,0x20
+ 112:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 116:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 11a:	0785                	addi	a5,a5,1
+ 11c:	fee79de3          	bne	a5,a4,116 <memset+0x12>
+  }
+  return dst;
+}
+ 120:	6422                	ld	s0,8(sp)
+ 122:	0141                	addi	sp,sp,16
+ 124:	8082                	ret
+
+0000000000000126 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 126:	1141                	addi	sp,sp,-16
+ 128:	e422                	sd	s0,8(sp)
+ 12a:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 12c:	00054783          	lbu	a5,0(a0)
+ 130:	cb99                	beqz	a5,146 <strchr+0x20>
+    if(*s == c)
+ 132:	00f58763          	beq	a1,a5,140 <strchr+0x1a>
+  for(; *s; s++)
+ 136:	0505                	addi	a0,a0,1
+ 138:	00054783          	lbu	a5,0(a0)
+ 13c:	fbfd                	bnez	a5,132 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 13e:	4501                	li	a0,0
+}
+ 140:	6422                	ld	s0,8(sp)
+ 142:	0141                	addi	sp,sp,16
+ 144:	8082                	ret
+  return 0;
+ 146:	4501                	li	a0,0
+ 148:	bfe5                	j	140 <strchr+0x1a>
+
+000000000000014a <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 14a:	711d                	addi	sp,sp,-96
+ 14c:	ec86                	sd	ra,88(sp)
+ 14e:	e8a2                	sd	s0,80(sp)
+ 150:	e4a6                	sd	s1,72(sp)
+ 152:	e0ca                	sd	s2,64(sp)
+ 154:	fc4e                	sd	s3,56(sp)
+ 156:	f852                	sd	s4,48(sp)
+ 158:	f456                	sd	s5,40(sp)
+ 15a:	f05a                	sd	s6,32(sp)
+ 15c:	ec5e                	sd	s7,24(sp)
+ 15e:	e862                	sd	s8,16(sp)
+ 160:	1080                	addi	s0,sp,96
+ 162:	8baa                	mv	s7,a0
+ 164:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 166:	892a                	mv	s2,a0
+ 168:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 16a:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 16e:	4b29                	li	s6,10
+ 170:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 172:	89a6                	mv	s3,s1
+ 174:	2485                	addiw	s1,s1,1
+ 176:	0344d763          	bge	s1,s4,1a4 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 17a:	4605                	li	a2,1
+ 17c:	85d6                	mv	a1,s5
+ 17e:	4501                	li	a0,0
+ 180:	00000097          	auipc	ra,0x0
+ 184:	1b8080e7          	jalr	440(ra) # 338 <read>
+    if(cc < 1)
+ 188:	00a05e63          	blez	a0,1a4 <gets+0x5a>
+    buf[i++] = c;
+ 18c:	faf44783          	lbu	a5,-81(s0)
+ 190:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 194:	01678763          	beq	a5,s6,1a2 <gets+0x58>
+ 198:	0905                	addi	s2,s2,1
+ 19a:	fd879ce3          	bne	a5,s8,172 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 19e:	89a6                	mv	s3,s1
+ 1a0:	a011                	j	1a4 <gets+0x5a>
+ 1a2:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 1a4:	99de                	add	s3,s3,s7
+ 1a6:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 1aa:	855e                	mv	a0,s7
+ 1ac:	60e6                	ld	ra,88(sp)
+ 1ae:	6446                	ld	s0,80(sp)
+ 1b0:	64a6                	ld	s1,72(sp)
+ 1b2:	6906                	ld	s2,64(sp)
+ 1b4:	79e2                	ld	s3,56(sp)
+ 1b6:	7a42                	ld	s4,48(sp)
+ 1b8:	7aa2                	ld	s5,40(sp)
+ 1ba:	7b02                	ld	s6,32(sp)
+ 1bc:	6be2                	ld	s7,24(sp)
+ 1be:	6c42                	ld	s8,16(sp)
+ 1c0:	6125                	addi	sp,sp,96
+ 1c2:	8082                	ret
+
+00000000000001c4 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 1c4:	1101                	addi	sp,sp,-32
+ 1c6:	ec06                	sd	ra,24(sp)
+ 1c8:	e822                	sd	s0,16(sp)
+ 1ca:	e426                	sd	s1,8(sp)
+ 1cc:	e04a                	sd	s2,0(sp)
+ 1ce:	1000                	addi	s0,sp,32
+ 1d0:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 1d2:	4581                	li	a1,0
+ 1d4:	00000097          	auipc	ra,0x0
+ 1d8:	194080e7          	jalr	404(ra) # 368 <open>
+  if(fd < 0)
+ 1dc:	02054563          	bltz	a0,206 <stat+0x42>
+ 1e0:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 1e2:	85ca                	mv	a1,s2
+ 1e4:	00000097          	auipc	ra,0x0
+ 1e8:	18e080e7          	jalr	398(ra) # 372 <fstat>
+ 1ec:	892a                	mv	s2,a0
+  close(fd);
+ 1ee:	8526                	mv	a0,s1
+ 1f0:	00000097          	auipc	ra,0x0
+ 1f4:	15c080e7          	jalr	348(ra) # 34c <close>
+  return r;
+}
+ 1f8:	854a                	mv	a0,s2
+ 1fa:	60e2                	ld	ra,24(sp)
+ 1fc:	6442                	ld	s0,16(sp)
+ 1fe:	64a2                	ld	s1,8(sp)
+ 200:	6902                	ld	s2,0(sp)
+ 202:	6105                	addi	sp,sp,32
+ 204:	8082                	ret
+    return -1;
+ 206:	597d                	li	s2,-1
+ 208:	bfc5                	j	1f8 <stat+0x34>
+
+000000000000020a <atoi>:
+
+int
+atoi(const char *s)
+{
+ 20a:	1141                	addi	sp,sp,-16
+ 20c:	e422                	sd	s0,8(sp)
+ 20e:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 210:	00054703          	lbu	a4,0(a0)
+ 214:	02d00793          	li	a5,45
+  int neg = 1;
+ 218:	4585                	li	a1,1
+  if (*s == '-') {
+ 21a:	04f70363          	beq	a4,a5,260 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 21e:	00054703          	lbu	a4,0(a0)
+ 222:	fd07079b          	addiw	a5,a4,-48
+ 226:	0ff7f793          	zext.b	a5,a5
+ 22a:	46a5                	li	a3,9
+ 22c:	02f6ed63          	bltu	a3,a5,266 <atoi+0x5c>
+  n = 0;
+ 230:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 232:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 234:	0505                	addi	a0,a0,1
+ 236:	0026979b          	slliw	a5,a3,0x2
+ 23a:	9fb5                	addw	a5,a5,a3
+ 23c:	0017979b          	slliw	a5,a5,0x1
+ 240:	9fb9                	addw	a5,a5,a4
+ 242:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 246:	00054703          	lbu	a4,0(a0)
+ 24a:	fd07079b          	addiw	a5,a4,-48
+ 24e:	0ff7f793          	zext.b	a5,a5
+ 252:	fef671e3          	bgeu	a2,a5,234 <atoi+0x2a>
+  return n * neg;
+}
+ 256:	02d5853b          	mulw	a0,a1,a3
+ 25a:	6422                	ld	s0,8(sp)
+ 25c:	0141                	addi	sp,sp,16
+ 25e:	8082                	ret
+    s++;
+ 260:	0505                	addi	a0,a0,1
+    neg = -1;
+ 262:	55fd                	li	a1,-1
+ 264:	bf6d                	j	21e <atoi+0x14>
+  n = 0;
+ 266:	4681                	li	a3,0
+ 268:	b7fd                	j	256 <atoi+0x4c>
+
+000000000000026a <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 26a:	1141                	addi	sp,sp,-16
+ 26c:	e422                	sd	s0,8(sp)
+ 26e:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 270:	02b57463          	bgeu	a0,a1,298 <memmove+0x2e>
+    while(n-- > 0)
+ 274:	00c05f63          	blez	a2,292 <memmove+0x28>
+ 278:	1602                	slli	a2,a2,0x20
+ 27a:	9201                	srli	a2,a2,0x20
+ 27c:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 280:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 282:	0585                	addi	a1,a1,1
+ 284:	0705                	addi	a4,a4,1
+ 286:	fff5c683          	lbu	a3,-1(a1)
+ 28a:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 28e:	fee79ae3          	bne	a5,a4,282 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 292:	6422                	ld	s0,8(sp)
+ 294:	0141                	addi	sp,sp,16
+ 296:	8082                	ret
+    dst += n;
+ 298:	00c50733          	add	a4,a0,a2
+    src += n;
+ 29c:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 29e:	fec05ae3          	blez	a2,292 <memmove+0x28>
+ 2a2:	fff6079b          	addiw	a5,a2,-1
+ 2a6:	1782                	slli	a5,a5,0x20
+ 2a8:	9381                	srli	a5,a5,0x20
+ 2aa:	fff7c793          	not	a5,a5
+ 2ae:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 2b0:	15fd                	addi	a1,a1,-1
+ 2b2:	177d                	addi	a4,a4,-1
+ 2b4:	0005c683          	lbu	a3,0(a1)
+ 2b8:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 2bc:	fee79ae3          	bne	a5,a4,2b0 <memmove+0x46>
+ 2c0:	bfc9                	j	292 <memmove+0x28>
+
+00000000000002c2 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 2c2:	1141                	addi	sp,sp,-16
+ 2c4:	e422                	sd	s0,8(sp)
+ 2c6:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 2c8:	ca05                	beqz	a2,2f8 <memcmp+0x36>
+ 2ca:	fff6069b          	addiw	a3,a2,-1
+ 2ce:	1682                	slli	a3,a3,0x20
+ 2d0:	9281                	srli	a3,a3,0x20
+ 2d2:	0685                	addi	a3,a3,1
+ 2d4:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 2d6:	00054783          	lbu	a5,0(a0)
+ 2da:	0005c703          	lbu	a4,0(a1)
+ 2de:	00e79863          	bne	a5,a4,2ee <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 2e2:	0505                	addi	a0,a0,1
+    p2++;
+ 2e4:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 2e6:	fed518e3          	bne	a0,a3,2d6 <memcmp+0x14>
+  }
+  return 0;
+ 2ea:	4501                	li	a0,0
+ 2ec:	a019                	j	2f2 <memcmp+0x30>
+      return *p1 - *p2;
+ 2ee:	40e7853b          	subw	a0,a5,a4
+}
+ 2f2:	6422                	ld	s0,8(sp)
+ 2f4:	0141                	addi	sp,sp,16
+ 2f6:	8082                	ret
+  return 0;
+ 2f8:	4501                	li	a0,0
+ 2fa:	bfe5                	j	2f2 <memcmp+0x30>
+
+00000000000002fc <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 2fc:	1141                	addi	sp,sp,-16
+ 2fe:	e406                	sd	ra,8(sp)
+ 300:	e022                	sd	s0,0(sp)
+ 302:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 304:	00000097          	auipc	ra,0x0
+ 308:	f66080e7          	jalr	-154(ra) # 26a <memmove>
+}
+ 30c:	60a2                	ld	ra,8(sp)
+ 30e:	6402                	ld	s0,0(sp)
+ 310:	0141                	addi	sp,sp,16
+ 312:	8082                	ret
+
+0000000000000314 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 314:	4885                	li	a7,1
+ ecall
+ 316:	00000073          	ecall
+ ret
+ 31a:	8082                	ret
+
+000000000000031c <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 31c:	05d00893          	li	a7,93
+ ecall
+ 320:	00000073          	ecall
+ ret
+ 324:	8082                	ret
+
+0000000000000326 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 326:	488d                	li	a7,3
+ ecall
+ 328:	00000073          	ecall
+ ret
+ 32c:	8082                	ret
+
+000000000000032e <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 32e:	03b00893          	li	a7,59
+ ecall
+ 332:	00000073          	ecall
+ ret
+ 336:	8082                	ret
+
+0000000000000338 <read>:
+.global read
+read:
+ li a7, SYS_read
+ 338:	03f00893          	li	a7,63
+ ecall
+ 33c:	00000073          	ecall
+ ret
+ 340:	8082                	ret
+
+0000000000000342 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 342:	04000893          	li	a7,64
+ ecall
+ 346:	00000073          	ecall
+ ret
+ 34a:	8082                	ret
+
+000000000000034c <close>:
+.global close
+close:
+ li a7, SYS_close
+ 34c:	03900893          	li	a7,57
+ 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:	0dd00893          	li	a7,221
+ ecall
+ 362:	00000073          	ecall
+ ret
+ 366:	8082                	ret
+
+0000000000000368 <open>:
+.global open
+open:
+ li a7, SYS_open
+ 368:	03800893          	li	a7,56
+ ecall
+ 36c:	00000073          	ecall
+ ret
+ 370:	8082                	ret
+
+0000000000000372 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 372:	05000893          	li	a7,80
+ ecall
+ 376:	00000073          	ecall
+ ret
+ 37a:	8082                	ret
+
+000000000000037c <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 37c:	02200893          	li	a7,34
+ ecall
+ 380:	00000073          	ecall
+ ret
+ 384:	8082                	ret
+
+0000000000000386 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 386:	03100893          	li	a7,49
+ ecall
+ 38a:	00000073          	ecall
+ ret
+ 38e:	8082                	ret
+
+0000000000000390 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 390:	48dd                	li	a7,23
+ ecall
+ 392:	00000073          	ecall
+ ret
+ 396:	8082                	ret
+
+0000000000000398 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 398:	0ac00893          	li	a7,172
+ ecall
+ 39c:	00000073          	ecall
+ ret
+ 3a0:	8082                	ret
+
+00000000000003a2 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 3a2:	48b1                	li	a7,12
+ ecall
+ 3a4:	00000073          	ecall
+ ret
+ 3a8:	8082                	ret
+
+00000000000003aa <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 3aa:	48b5                	li	a7,13
+ ecall
+ 3ac:	00000073          	ecall
+ ret
+ 3b0:	8082                	ret
+
+00000000000003b2 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 3b2:	48b9                	li	a7,14
+ ecall
+ 3b4:	00000073          	ecall
+ ret
+ 3b8:	8082                	ret
+
+00000000000003ba <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 3ba:	48d9                	li	a7,22
+ ecall
+ 3bc:	00000073          	ecall
+ ret
+ 3c0:	8082                	ret
+
+00000000000003c2 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 3c2:	03200893          	li	a7,50
+ ecall
+ 3c6:	00000073          	ecall
+ ret
+ 3ca:	8082                	ret
+
+00000000000003cc <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 3cc:	48ed                	li	a7,27
+ ecall
+ 3ce:	00000073          	ecall
+ ret
+ 3d2:	8082                	ret
+
+00000000000003d4 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 3d4:	48c5                	li	a7,17
+ ecall
+ 3d6:	00000073          	ecall
+ ret
+ 3da:	8082                	ret
+
+00000000000003dc <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 3dc:	07500893          	li	a7,117
+ ecall
+ 3e0:	00000073          	ecall
+ ret
+ 3e4:	8082                	ret
+
+00000000000003e6 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 3e6:	48c9                	li	a7,18
+ ecall
+ 3e8:	00000073          	ecall
+ ret
+ 3ec:	8082                	ret
+
+00000000000003ee <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 3ee:	48cd                	li	a7,19
+ ecall
+ 3f0:	00000073          	ecall
+ ret
+ 3f4:	8082                	ret
+
+00000000000003f6 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 3f6:	48e9                	li	a7,26
+ ecall
+ 3f8:	00000073          	ecall
+ ret
+ 3fc:	8082                	ret
+
+00000000000003fe <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 3fe:	0d200893          	li	a7,210
+ ecall
+ 402:	00000073          	ecall
+ ret
+ 406:	8082                	ret
+
+0000000000000408 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 408:	1101                	addi	sp,sp,-32
+ 40a:	ec06                	sd	ra,24(sp)
+ 40c:	e822                	sd	s0,16(sp)
+ 40e:	1000                	addi	s0,sp,32
+ 410:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 414:	4605                	li	a2,1
+ 416:	fef40593          	addi	a1,s0,-17
+ 41a:	00000097          	auipc	ra,0x0
+ 41e:	f28080e7          	jalr	-216(ra) # 342 <write>
+}
+ 422:	60e2                	ld	ra,24(sp)
+ 424:	6442                	ld	s0,16(sp)
+ 426:	6105                	addi	sp,sp,32
+ 428:	8082                	ret
+
+000000000000042a <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 42a:	7139                	addi	sp,sp,-64
+ 42c:	fc06                	sd	ra,56(sp)
+ 42e:	f822                	sd	s0,48(sp)
+ 430:	f426                	sd	s1,40(sp)
+ 432:	f04a                	sd	s2,32(sp)
+ 434:	ec4e                	sd	s3,24(sp)
+ 436:	0080                	addi	s0,sp,64
+ 438:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 43a:	c299                	beqz	a3,440 <printint+0x16>
+ 43c:	0805c863          	bltz	a1,4cc <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 440:	2581                	sext.w	a1,a1
+  neg = 0;
+ 442:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 444:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 448:	86ce                	mv	a3,s3
+  i = 0;
+ 44a:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 44c:	2601                	sext.w	a2,a2
+ 44e:	00000517          	auipc	a0,0x0
+ 452:	4b250513          	addi	a0,a0,1202 # 900 <digits>
+ 456:	883a                	mv	a6,a4
+ 458:	2705                	addiw	a4,a4,1
+ 45a:	02c5f7bb          	remuw	a5,a1,a2
+ 45e:	1782                	slli	a5,a5,0x20
+ 460:	9381                	srli	a5,a5,0x20
+ 462:	97aa                	add	a5,a5,a0
+ 464:	0007c783          	lbu	a5,0(a5)
+ 468:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 46c:	0005879b          	sext.w	a5,a1
+ 470:	02c5d5bb          	divuw	a1,a1,a2
+ 474:	0685                	addi	a3,a3,1
+ 476:	fec7f0e3          	bgeu	a5,a2,456 <printint+0x2c>
+  if(neg)
+ 47a:	00088c63          	beqz	a7,492 <printint+0x68>
+    buf[i++] = '-';
+ 47e:	fd070793          	addi	a5,a4,-48
+ 482:	00878733          	add	a4,a5,s0
+ 486:	02d00793          	li	a5,45
+ 48a:	fef70823          	sb	a5,-16(a4)
+ 48e:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 492:	02e05663          	blez	a4,4be <printint+0x94>
+ 496:	fc040913          	addi	s2,s0,-64
+ 49a:	993a                	add	s2,s2,a4
+ 49c:	19fd                	addi	s3,s3,-1
+ 49e:	99ba                	add	s3,s3,a4
+ 4a0:	377d                	addiw	a4,a4,-1
+ 4a2:	1702                	slli	a4,a4,0x20
+ 4a4:	9301                	srli	a4,a4,0x20
+ 4a6:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 4aa:	fff94583          	lbu	a1,-1(s2)
+ 4ae:	8526                	mv	a0,s1
+ 4b0:	00000097          	auipc	ra,0x0
+ 4b4:	f58080e7          	jalr	-168(ra) # 408 <putc>
+  while(--i >= 0)
+ 4b8:	197d                	addi	s2,s2,-1
+ 4ba:	ff3918e3          	bne	s2,s3,4aa <printint+0x80>
+}
+ 4be:	70e2                	ld	ra,56(sp)
+ 4c0:	7442                	ld	s0,48(sp)
+ 4c2:	74a2                	ld	s1,40(sp)
+ 4c4:	7902                	ld	s2,32(sp)
+ 4c6:	69e2                	ld	s3,24(sp)
+ 4c8:	6121                	addi	sp,sp,64
+ 4ca:	8082                	ret
+    x = -xx;
+ 4cc:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 4d0:	4885                	li	a7,1
+    x = -xx;
+ 4d2:	bf8d                	j	444 <printint+0x1a>
+
+00000000000004d4 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 4d4:	7119                	addi	sp,sp,-128
+ 4d6:	fc86                	sd	ra,120(sp)
+ 4d8:	f8a2                	sd	s0,112(sp)
+ 4da:	f4a6                	sd	s1,104(sp)
+ 4dc:	f0ca                	sd	s2,96(sp)
+ 4de:	ecce                	sd	s3,88(sp)
+ 4e0:	e8d2                	sd	s4,80(sp)
+ 4e2:	e4d6                	sd	s5,72(sp)
+ 4e4:	e0da                	sd	s6,64(sp)
+ 4e6:	fc5e                	sd	s7,56(sp)
+ 4e8:	f862                	sd	s8,48(sp)
+ 4ea:	f466                	sd	s9,40(sp)
+ 4ec:	f06a                	sd	s10,32(sp)
+ 4ee:	ec6e                	sd	s11,24(sp)
+ 4f0:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 4f2:	0005c903          	lbu	s2,0(a1)
+ 4f6:	18090f63          	beqz	s2,694 <vprintf+0x1c0>
+ 4fa:	8aaa                	mv	s5,a0
+ 4fc:	8b32                	mv	s6,a2
+ 4fe:	00158493          	addi	s1,a1,1
+  state = 0;
+ 502:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 504:	02500a13          	li	s4,37
+ 508:	4c55                	li	s8,21
+ 50a:	00000c97          	auipc	s9,0x0
+ 50e:	39ec8c93          	addi	s9,s9,926 # 8a8 <malloc+0x110>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 512:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 516:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 518:	00000b97          	auipc	s7,0x0
+ 51c:	3e8b8b93          	addi	s7,s7,1000 # 900 <digits>
+ 520:	a839                	j	53e <vprintf+0x6a>
+        putc(fd, c);
+ 522:	85ca                	mv	a1,s2
+ 524:	8556                	mv	a0,s5
+ 526:	00000097          	auipc	ra,0x0
+ 52a:	ee2080e7          	jalr	-286(ra) # 408 <putc>
+ 52e:	a019                	j	534 <vprintf+0x60>
+    } else if(state == '%'){
+ 530:	01498d63          	beq	s3,s4,54a <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 534:	0485                	addi	s1,s1,1
+ 536:	fff4c903          	lbu	s2,-1(s1)
+ 53a:	14090d63          	beqz	s2,694 <vprintf+0x1c0>
+    if(state == 0){
+ 53e:	fe0999e3          	bnez	s3,530 <vprintf+0x5c>
+      if(c == '%'){
+ 542:	ff4910e3          	bne	s2,s4,522 <vprintf+0x4e>
+        state = '%';
+ 546:	89d2                	mv	s3,s4
+ 548:	b7f5                	j	534 <vprintf+0x60>
+      if(c == 'd'){
+ 54a:	11490c63          	beq	s2,s4,662 <vprintf+0x18e>
+ 54e:	f9d9079b          	addiw	a5,s2,-99
+ 552:	0ff7f793          	zext.b	a5,a5
+ 556:	10fc6e63          	bltu	s8,a5,672 <vprintf+0x19e>
+ 55a:	f9d9079b          	addiw	a5,s2,-99
+ 55e:	0ff7f713          	zext.b	a4,a5
+ 562:	10ec6863          	bltu	s8,a4,672 <vprintf+0x19e>
+ 566:	00271793          	slli	a5,a4,0x2
+ 56a:	97e6                	add	a5,a5,s9
+ 56c:	439c                	lw	a5,0(a5)
+ 56e:	97e6                	add	a5,a5,s9
+ 570:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 572:	008b0913          	addi	s2,s6,8
+ 576:	4685                	li	a3,1
+ 578:	4629                	li	a2,10
+ 57a:	000b2583          	lw	a1,0(s6)
+ 57e:	8556                	mv	a0,s5
+ 580:	00000097          	auipc	ra,0x0
+ 584:	eaa080e7          	jalr	-342(ra) # 42a <printint>
+ 588:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 58a:	4981                	li	s3,0
+ 58c:	b765                	j	534 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 58e:	008b0913          	addi	s2,s6,8
+ 592:	4681                	li	a3,0
+ 594:	4629                	li	a2,10
+ 596:	000b2583          	lw	a1,0(s6)
+ 59a:	8556                	mv	a0,s5
+ 59c:	00000097          	auipc	ra,0x0
+ 5a0:	e8e080e7          	jalr	-370(ra) # 42a <printint>
+ 5a4:	8b4a                	mv	s6,s2
+      state = 0;
+ 5a6:	4981                	li	s3,0
+ 5a8:	b771                	j	534 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 5aa:	008b0913          	addi	s2,s6,8
+ 5ae:	4681                	li	a3,0
+ 5b0:	866a                	mv	a2,s10
+ 5b2:	000b2583          	lw	a1,0(s6)
+ 5b6:	8556                	mv	a0,s5
+ 5b8:	00000097          	auipc	ra,0x0
+ 5bc:	e72080e7          	jalr	-398(ra) # 42a <printint>
+ 5c0:	8b4a                	mv	s6,s2
+      state = 0;
+ 5c2:	4981                	li	s3,0
+ 5c4:	bf85                	j	534 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 5c6:	008b0793          	addi	a5,s6,8
+ 5ca:	f8f43423          	sd	a5,-120(s0)
+ 5ce:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 5d2:	03000593          	li	a1,48
+ 5d6:	8556                	mv	a0,s5
+ 5d8:	00000097          	auipc	ra,0x0
+ 5dc:	e30080e7          	jalr	-464(ra) # 408 <putc>
+  putc(fd, 'x');
+ 5e0:	07800593          	li	a1,120
+ 5e4:	8556                	mv	a0,s5
+ 5e6:	00000097          	auipc	ra,0x0
+ 5ea:	e22080e7          	jalr	-478(ra) # 408 <putc>
+ 5ee:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 5f0:	03c9d793          	srli	a5,s3,0x3c
+ 5f4:	97de                	add	a5,a5,s7
+ 5f6:	0007c583          	lbu	a1,0(a5)
+ 5fa:	8556                	mv	a0,s5
+ 5fc:	00000097          	auipc	ra,0x0
+ 600:	e0c080e7          	jalr	-500(ra) # 408 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 604:	0992                	slli	s3,s3,0x4
+ 606:	397d                	addiw	s2,s2,-1
+ 608:	fe0914e3          	bnez	s2,5f0 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 60c:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 610:	4981                	li	s3,0
+ 612:	b70d                	j	534 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 614:	008b0913          	addi	s2,s6,8
+ 618:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 61c:	02098163          	beqz	s3,63e <vprintf+0x16a>
+        while(*s != 0){
+ 620:	0009c583          	lbu	a1,0(s3)
+ 624:	c5ad                	beqz	a1,68e <vprintf+0x1ba>
+          putc(fd, *s);
+ 626:	8556                	mv	a0,s5
+ 628:	00000097          	auipc	ra,0x0
+ 62c:	de0080e7          	jalr	-544(ra) # 408 <putc>
+          s++;
+ 630:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 632:	0009c583          	lbu	a1,0(s3)
+ 636:	f9e5                	bnez	a1,626 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 638:	8b4a                	mv	s6,s2
+      state = 0;
+ 63a:	4981                	li	s3,0
+ 63c:	bde5                	j	534 <vprintf+0x60>
+          s = "(null)";
+ 63e:	00000997          	auipc	s3,0x0
+ 642:	26298993          	addi	s3,s3,610 # 8a0 <malloc+0x108>
+        while(*s != 0){
+ 646:	85ee                	mv	a1,s11
+ 648:	bff9                	j	626 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 64a:	008b0913          	addi	s2,s6,8
+ 64e:	000b4583          	lbu	a1,0(s6)
+ 652:	8556                	mv	a0,s5
+ 654:	00000097          	auipc	ra,0x0
+ 658:	db4080e7          	jalr	-588(ra) # 408 <putc>
+ 65c:	8b4a                	mv	s6,s2
+      state = 0;
+ 65e:	4981                	li	s3,0
+ 660:	bdd1                	j	534 <vprintf+0x60>
+        putc(fd, c);
+ 662:	85d2                	mv	a1,s4
+ 664:	8556                	mv	a0,s5
+ 666:	00000097          	auipc	ra,0x0
+ 66a:	da2080e7          	jalr	-606(ra) # 408 <putc>
+      state = 0;
+ 66e:	4981                	li	s3,0
+ 670:	b5d1                	j	534 <vprintf+0x60>
+        putc(fd, '%');
+ 672:	85d2                	mv	a1,s4
+ 674:	8556                	mv	a0,s5
+ 676:	00000097          	auipc	ra,0x0
+ 67a:	d92080e7          	jalr	-622(ra) # 408 <putc>
+        putc(fd, c);
+ 67e:	85ca                	mv	a1,s2
+ 680:	8556                	mv	a0,s5
+ 682:	00000097          	auipc	ra,0x0
+ 686:	d86080e7          	jalr	-634(ra) # 408 <putc>
+      state = 0;
+ 68a:	4981                	li	s3,0
+ 68c:	b565                	j	534 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 68e:	8b4a                	mv	s6,s2
+      state = 0;
+ 690:	4981                	li	s3,0
+ 692:	b54d                	j	534 <vprintf+0x60>
+    }
+  }
+}
+ 694:	70e6                	ld	ra,120(sp)
+ 696:	7446                	ld	s0,112(sp)
+ 698:	74a6                	ld	s1,104(sp)
+ 69a:	7906                	ld	s2,96(sp)
+ 69c:	69e6                	ld	s3,88(sp)
+ 69e:	6a46                	ld	s4,80(sp)
+ 6a0:	6aa6                	ld	s5,72(sp)
+ 6a2:	6b06                	ld	s6,64(sp)
+ 6a4:	7be2                	ld	s7,56(sp)
+ 6a6:	7c42                	ld	s8,48(sp)
+ 6a8:	7ca2                	ld	s9,40(sp)
+ 6aa:	7d02                	ld	s10,32(sp)
+ 6ac:	6de2                	ld	s11,24(sp)
+ 6ae:	6109                	addi	sp,sp,128
+ 6b0:	8082                	ret
+
+00000000000006b2 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 6b2:	715d                	addi	sp,sp,-80
+ 6b4:	ec06                	sd	ra,24(sp)
+ 6b6:	e822                	sd	s0,16(sp)
+ 6b8:	1000                	addi	s0,sp,32
+ 6ba:	e010                	sd	a2,0(s0)
+ 6bc:	e414                	sd	a3,8(s0)
+ 6be:	e818                	sd	a4,16(s0)
+ 6c0:	ec1c                	sd	a5,24(s0)
+ 6c2:	03043023          	sd	a6,32(s0)
+ 6c6:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6ca:	8622                	mv	a2,s0
+ 6cc:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 6d0:	00000097          	auipc	ra,0x0
+ 6d4:	e04080e7          	jalr	-508(ra) # 4d4 <vprintf>
+}
+ 6d8:	60e2                	ld	ra,24(sp)
+ 6da:	6442                	ld	s0,16(sp)
+ 6dc:	6161                	addi	sp,sp,80
+ 6de:	8082                	ret
+
+00000000000006e0 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 6e0:	711d                	addi	sp,sp,-96
+ 6e2:	ec06                	sd	ra,24(sp)
+ 6e4:	e822                	sd	s0,16(sp)
+ 6e6:	1000                	addi	s0,sp,32
+ 6e8:	e40c                	sd	a1,8(s0)
+ 6ea:	e810                	sd	a2,16(s0)
+ 6ec:	ec14                	sd	a3,24(s0)
+ 6ee:	f018                	sd	a4,32(s0)
+ 6f0:	f41c                	sd	a5,40(s0)
+ 6f2:	03043823          	sd	a6,48(s0)
+ 6f6:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6fa:	00840613          	addi	a2,s0,8
+ 6fe:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 702:	85aa                	mv	a1,a0
+ 704:	4505                	li	a0,1
+ 706:	00000097          	auipc	ra,0x0
+ 70a:	dce080e7          	jalr	-562(ra) # 4d4 <vprintf>
+}
+ 70e:	60e2                	ld	ra,24(sp)
+ 710:	6442                	ld	s0,16(sp)
+ 712:	6125                	addi	sp,sp,96
+ 714:	8082                	ret
+
+0000000000000716 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 716:	1141                	addi	sp,sp,-16
+ 718:	e422                	sd	s0,8(sp)
+ 71a:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 71c:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 720:	00000797          	auipc	a5,0x0
+ 724:	1f87b783          	ld	a5,504(a5) # 918 <freep>
+ 728:	a02d                	j	752 <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;
+ 72a:	4618                	lw	a4,8(a2)
+ 72c:	9f2d                	addw	a4,a4,a1
+ 72e:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 732:	6398                	ld	a4,0(a5)
+ 734:	6310                	ld	a2,0(a4)
+ 736:	a83d                	j	774 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 738:	ff852703          	lw	a4,-8(a0)
+ 73c:	9f31                	addw	a4,a4,a2
+ 73e:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 740:	ff053683          	ld	a3,-16(a0)
+ 744:	a091                	j	788 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 746:	6398                	ld	a4,0(a5)
+ 748:	00e7e463          	bltu	a5,a4,750 <free+0x3a>
+ 74c:	00e6ea63          	bltu	a3,a4,760 <free+0x4a>
+{
+ 750:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 752:	fed7fae3          	bgeu	a5,a3,746 <free+0x30>
+ 756:	6398                	ld	a4,0(a5)
+ 758:	00e6e463          	bltu	a3,a4,760 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 75c:	fee7eae3          	bltu	a5,a4,750 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 760:	ff852583          	lw	a1,-8(a0)
+ 764:	6390                	ld	a2,0(a5)
+ 766:	02059813          	slli	a6,a1,0x20
+ 76a:	01c85713          	srli	a4,a6,0x1c
+ 76e:	9736                	add	a4,a4,a3
+ 770:	fae60de3          	beq	a2,a4,72a <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 774:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 778:	4790                	lw	a2,8(a5)
+ 77a:	02061593          	slli	a1,a2,0x20
+ 77e:	01c5d713          	srli	a4,a1,0x1c
+ 782:	973e                	add	a4,a4,a5
+ 784:	fae68ae3          	beq	a3,a4,738 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 788:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 78a:	00000717          	auipc	a4,0x0
+ 78e:	18f73723          	sd	a5,398(a4) # 918 <freep>
+}
+ 792:	6422                	ld	s0,8(sp)
+ 794:	0141                	addi	sp,sp,16
+ 796:	8082                	ret
+
+0000000000000798 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 798:	7139                	addi	sp,sp,-64
+ 79a:	fc06                	sd	ra,56(sp)
+ 79c:	f822                	sd	s0,48(sp)
+ 79e:	f426                	sd	s1,40(sp)
+ 7a0:	f04a                	sd	s2,32(sp)
+ 7a2:	ec4e                	sd	s3,24(sp)
+ 7a4:	e852                	sd	s4,16(sp)
+ 7a6:	e456                	sd	s5,8(sp)
+ 7a8:	e05a                	sd	s6,0(sp)
+ 7aa:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 7ac:	02051493          	slli	s1,a0,0x20
+ 7b0:	9081                	srli	s1,s1,0x20
+ 7b2:	04bd                	addi	s1,s1,15
+ 7b4:	8091                	srli	s1,s1,0x4
+ 7b6:	00148a1b          	addiw	s4,s1,1
+ 7ba:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 7bc:	00000517          	auipc	a0,0x0
+ 7c0:	15c53503          	ld	a0,348(a0) # 918 <freep>
+ 7c4:	c515                	beqz	a0,7f0 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 7c6:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 7c8:	4798                	lw	a4,8(a5)
+ 7ca:	04977163          	bgeu	a4,s1,80c <malloc+0x74>
+ 7ce:	89d2                	mv	s3,s4
+ 7d0:	000a071b          	sext.w	a4,s4
+ 7d4:	6685                	lui	a3,0x1
+ 7d6:	00d77363          	bgeu	a4,a3,7dc <malloc+0x44>
+ 7da:	6985                	lui	s3,0x1
+ 7dc:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 7e0:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 7e4:	00000917          	auipc	s2,0x0
+ 7e8:	13490913          	addi	s2,s2,308 # 918 <freep>
+  if(p == (char*)-1)
+ 7ec:	5afd                	li	s5,-1
+ 7ee:	a8a5                	j	866 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 7f0:	00000797          	auipc	a5,0x0
+ 7f4:	12878793          	addi	a5,a5,296 # 918 <freep>
+ 7f8:	00000717          	auipc	a4,0x0
+ 7fc:	12870713          	addi	a4,a4,296 # 920 <base>
+ 800:	e398                	sd	a4,0(a5)
+ 802:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 804:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 808:	87ba                	mv	a5,a4
+ 80a:	b7d1                	j	7ce <malloc+0x36>
+      if(p->s.size == nunits)
+ 80c:	02e48c63          	beq	s1,a4,844 <malloc+0xac>
+        p->s.size -= nunits;
+ 810:	4147073b          	subw	a4,a4,s4
+ 814:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 816:	02071693          	slli	a3,a4,0x20
+ 81a:	01c6d713          	srli	a4,a3,0x1c
+ 81e:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 820:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 824:	00000717          	auipc	a4,0x0
+ 828:	0ea73a23          	sd	a0,244(a4) # 918 <freep>
+      return (void*)(p + 1);
+ 82c:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 830:	70e2                	ld	ra,56(sp)
+ 832:	7442                	ld	s0,48(sp)
+ 834:	74a2                	ld	s1,40(sp)
+ 836:	7902                	ld	s2,32(sp)
+ 838:	69e2                	ld	s3,24(sp)
+ 83a:	6a42                	ld	s4,16(sp)
+ 83c:	6aa2                	ld	s5,8(sp)
+ 83e:	6b02                	ld	s6,0(sp)
+ 840:	6121                	addi	sp,sp,64
+ 842:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 844:	6398                	ld	a4,0(a5)
+ 846:	e118                	sd	a4,0(a0)
+ 848:	bff1                	j	824 <malloc+0x8c>
+  hp->s.size = nu;
+ 84a:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 84e:	0541                	addi	a0,a0,16
+ 850:	00000097          	auipc	ra,0x0
+ 854:	ec6080e7          	jalr	-314(ra) # 716 <free>
+  return freep;
+ 858:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 85c:	d971                	beqz	a0,830 <malloc+0x98>
+  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:	fa9775e3          	bgeu	a4,s1,80c <malloc+0x74>
+    if(p == freep)
+ 866:	00093703          	ld	a4,0(s2)
+ 86a:	853e                	mv	a0,a5
+ 86c:	fef719e3          	bne	a4,a5,85e <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 870:	854e                	mv	a0,s3
+ 872:	00000097          	auipc	ra,0x0
+ 876:	b30080e7          	jalr	-1232(ra) # 3a2 <sbrk>
+  if(p == (char*)-1)
+ 87a:	fd5518e3          	bne	a0,s5,84a <malloc+0xb2>
+        return 0;
+ 87e:	4501                	li	a0,0
+ 880:	bf45                	j	830 <malloc+0x98>
diff --git a/xv6-user/kill.c b/xv6-user/kill.c
new file mode 100644
index 0000000000000000000000000000000000000000..e5752444f3441baea1bac630874f641f8ad66f28
--- /dev/null
+++ b/xv6-user/kill.c
@@ -0,0 +1,17 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char **argv)
+{
+  int i;
+
+  if(argc < 2){
+    fprintf(2, "usage: kill pid...\n");
+    exit(1);
+  }
+  for(i=1; i<argc; i++)
+    kill(atoi(argv[i]));
+  exit(0);
+}
diff --git a/xv6-user/kill.d b/xv6-user/kill.d
new file mode 100644
index 0000000000000000000000000000000000000000..2800e5dab41306b06d115d987c802f9049f0737c
--- /dev/null
+++ b/xv6-user/kill.d
@@ -0,0 +1,2 @@
+xv6-user/kill.o: xv6-user/kill.c kernel/include/types.h \
+ kernel/include/stat.h xv6-user/user.h kernel/include/fcntl.h
diff --git a/xv6-user/kill.o b/xv6-user/kill.o
new file mode 100644
index 0000000000000000000000000000000000000000..f8a45372080b3a159b8b57510b34bd0bda31cc78
Binary files /dev/null and b/xv6-user/kill.o differ
diff --git a/xv6-user/kill.sym b/xv6-user/kill.sym
new file mode 100644
index 0000000000000000000000000000000000000000..de36443da912bb6607b7a6abe19933adfedd12b5
--- /dev/null
+++ b/xv6-user/kill.sym
@@ -0,0 +1,76 @@
+0000000000000000 .text
+0000000000000888 .rodata
+0000000000000918 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 kill.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+0000000000000408 putc
+000000000000042a printint
+0000000000000900 digits
+0000000000000000 umalloc.c
+0000000000000918 freep
+0000000000000920 base
+0000000000000064 strcpy
+00000000000006e0 printf
+0000000000001111 __global_pointer$
+00000000000003c2 dev
+000000000000026a memmove
+00000000000003e6 trace
+000000000000014a gets
+0000000000000911 __SDATA_BEGIN__
+0000000000000398 getpid
+00000000000002fc memcpy
+0000000000000798 malloc
+00000000000003dc remove
+00000000000003aa sleep
+00000000000003ee sysinfo
+00000000000003cc readdir
+000000000000032e pipe
+00000000000003f6 rename
+0000000000000342 write
+0000000000000372 fstat
+00000000000006b2 fprintf
+0000000000000356 kill
+0000000000000080 strcat
+00000000000004d4 vprintf
+0000000000000386 chdir
+000000000000035e exec
+0000000000000326 wait
+0000000000000338 read
+00000000000002c2 memcmp
+0000000000000314 fork
+0000000000000930 __BSS_END__
+00000000000003a2 sbrk
+00000000000003ba test_proc
+00000000000003b2 uptime
+0000000000000911 __bss_start
+0000000000000104 memset
+0000000000000000 main
+00000000000000ae strcmp
+00000000000003fe shutdown
+0000000000000390 dup
+00000000000003d4 getcwd
+0000000000000911 __DATA_BEGIN__
+00000000000001c4 stat
+0000000000000911 _edata
+0000000000000930 _end
+000000000000031c exit
+000000000000020a atoi
+00000000000000da strlen
+0000000000000368 open
+0000000000000126 strchr
+000000000000037c mkdir
+000000000000034c close
+0000000000000716 free
diff --git a/xv6-user/ln.c b/xv6-user/ln.c
new file mode 100644
index 0000000000000000000000000000000000000000..6173775857666a1d2927d98aac528a24f63e4be2
--- /dev/null
+++ b/xv6-user/ln.c
@@ -0,0 +1,15 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+  if(argc != 3){
+    fprintf(2, "Usage: ln old new\n");
+    exit(1);
+  }
+  if(link(argv[1], argv[2]) < 0)
+    fprintf(2, "link %s %s: failed\n", argv[1], argv[2]);
+  exit(0);
+}
diff --git a/xv6-user/ls.asm b/xv6-user/ls.asm
new file mode 100644
index 0000000000000000000000000000000000000000..cd690cc56ccf132f7121c4f302ac57388fb5deb3
--- /dev/null
+++ b/xv6-user/ls.asm
@@ -0,0 +1,1628 @@
+
+xv6-user/_ls:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <fmtname>:
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+char*
+fmtname(char *name)
+{
+   0:	7179                	addi	sp,sp,-48
+   2:	f406                	sd	ra,40(sp)
+   4:	f022                	sd	s0,32(sp)
+   6:	ec26                	sd	s1,24(sp)
+   8:	e84a                	sd	s2,16(sp)
+   a:	e44e                	sd	s3,8(sp)
+   c:	1800                	addi	s0,sp,48
+   e:	892a                	mv	s2,a0
+  static char buf[STAT_MAX_NAME+1];
+  int len = strlen(name);
+  10:	00000097          	auipc	ra,0x0
+  14:	24c080e7          	jalr	588(ra) # 25c <strlen>
+  18:	0005049b          	sext.w	s1,a0
+
+  // Return blank-padded name.
+  if(len >= STAT_MAX_NAME)
+  1c:	47fd                	li	a5,31
+  1e:	0097da63          	bge	a5,s1,32 <fmtname+0x32>
+    return name;
+  memmove(buf, name, len);
+  memset(buf + len, ' ', STAT_MAX_NAME - len);
+  buf[STAT_MAX_NAME] = '\0';
+  return buf;
+}
+  22:	854a                	mv	a0,s2
+  24:	70a2                	ld	ra,40(sp)
+  26:	7402                	ld	s0,32(sp)
+  28:	64e2                	ld	s1,24(sp)
+  2a:	6942                	ld	s2,16(sp)
+  2c:	69a2                	ld	s3,8(sp)
+  2e:	6145                	addi	sp,sp,48
+  30:	8082                	ret
+  memmove(buf, name, len);
+  32:	00001997          	auipc	s3,0x1
+  36:	ab698993          	addi	s3,s3,-1354 # ae8 <buf.0>
+  3a:	8626                	mv	a2,s1
+  3c:	85ca                	mv	a1,s2
+  3e:	854e                	mv	a0,s3
+  40:	00000097          	auipc	ra,0x0
+  44:	3ac080e7          	jalr	940(ra) # 3ec <memmove>
+  memset(buf + len, ' ', STAT_MAX_NAME - len);
+  48:	02000613          	li	a2,32
+  4c:	9e05                	subw	a2,a2,s1
+  4e:	02000593          	li	a1,32
+  52:	00998533          	add	a0,s3,s1
+  56:	00000097          	auipc	ra,0x0
+  5a:	230080e7          	jalr	560(ra) # 286 <memset>
+  buf[STAT_MAX_NAME] = '\0';
+  5e:	02098023          	sb	zero,32(s3)
+  return buf;
+  62:	894e                	mv	s2,s3
+  64:	bf7d                	j	22 <fmtname+0x22>
+
+0000000000000066 <ls>:
+
+void
+ls(char *path)
+{
+  66:	7119                	addi	sp,sp,-128
+  68:	fc86                	sd	ra,120(sp)
+  6a:	f8a2                	sd	s0,112(sp)
+  6c:	f4a6                	sd	s1,104(sp)
+  6e:	f0ca                	sd	s2,96(sp)
+  70:	ecce                	sd	s3,88(sp)
+  72:	e8d2                	sd	s4,80(sp)
+  74:	0100                	addi	s0,sp,128
+  76:	892a                	mv	s2,a0
+  int fd;
+  struct stat st;
+  char *types[] = {
+  78:	f8043023          	sd	zero,-128(s0)
+  7c:	00001797          	auipc	a5,0x1
+  80:	98c78793          	addi	a5,a5,-1652 # a08 <malloc+0xee>
+  84:	f8f43423          	sd	a5,-120(s0)
+  88:	00001797          	auipc	a5,0x1
+  8c:	98878793          	addi	a5,a5,-1656 # a10 <malloc+0xf6>
+  90:	f8f43823          	sd	a5,-112(s0)
+    [T_DIR]   "DIR ",
+    [T_FILE]  "FILE",
+  };
+
+  if((fd = open(path, 0)) < 0){
+  94:	4581                	li	a1,0
+  96:	00000097          	auipc	ra,0x0
+  9a:	454080e7          	jalr	1108(ra) # 4ea <open>
+  9e:	02054863          	bltz	a0,ce <ls+0x68>
+  a2:	84aa                	mv	s1,a0
+    fprintf(2, "ls: cannot open %s\n", path);
+    return;
+  }
+
+  if(fstat(fd, &st) < 0){
+  a4:	f9840593          	addi	a1,s0,-104
+  a8:	00000097          	auipc	ra,0x0
+  ac:	44c080e7          	jalr	1100(ra) # 4f4 <fstat>
+  b0:	02054a63          	bltz	a0,e4 <ls+0x7e>
+    fprintf(2, "ls: cannot stat %s\n", path);
+    close(fd);
+    return;
+  }
+
+  if (st.type == T_DIR){
+  b4:	fc041703          	lh	a4,-64(s0)
+  b8:	4785                	li	a5,1
+  ba:	08f71f63          	bne	a4,a5,158 <ls+0xf2>
+    while(readdir(fd, &st) == 1){
+  be:	f9840913          	addi	s2,s0,-104
+  c2:	4985                	li	s3,1
+      printf("%s %s\t%d\n", fmtname(st.name), types[st.type], st.size);
+  c4:	00001a17          	auipc	s4,0x1
+  c8:	984a0a13          	addi	s4,s4,-1660 # a48 <malloc+0x12e>
+  cc:	a08d                	j	12e <ls+0xc8>
+    fprintf(2, "ls: cannot open %s\n", path);
+  ce:	864a                	mv	a2,s2
+  d0:	00001597          	auipc	a1,0x1
+  d4:	94858593          	addi	a1,a1,-1720 # a18 <malloc+0xfe>
+  d8:	4509                	li	a0,2
+  da:	00000097          	auipc	ra,0x0
+  de:	75a080e7          	jalr	1882(ra) # 834 <fprintf>
+    return;
+  e2:	a09d                	j	148 <ls+0xe2>
+    fprintf(2, "ls: cannot stat %s\n", path);
+  e4:	864a                	mv	a2,s2
+  e6:	00001597          	auipc	a1,0x1
+  ea:	94a58593          	addi	a1,a1,-1718 # a30 <malloc+0x116>
+  ee:	4509                	li	a0,2
+  f0:	00000097          	auipc	ra,0x0
+  f4:	744080e7          	jalr	1860(ra) # 834 <fprintf>
+    close(fd);
+  f8:	8526                	mv	a0,s1
+  fa:	00000097          	auipc	ra,0x0
+  fe:	3d4080e7          	jalr	980(ra) # 4ce <close>
+    return;
+ 102:	a099                	j	148 <ls+0xe2>
+      printf("%s %s\t%d\n", fmtname(st.name), types[st.type], st.size);
+ 104:	854a                	mv	a0,s2
+ 106:	00000097          	auipc	ra,0x0
+ 10a:	efa080e7          	jalr	-262(ra) # 0 <fmtname>
+ 10e:	85aa                	mv	a1,a0
+ 110:	fc041783          	lh	a5,-64(s0)
+ 114:	078e                	slli	a5,a5,0x3
+ 116:	fd078793          	addi	a5,a5,-48
+ 11a:	97a2                	add	a5,a5,s0
+ 11c:	fc843683          	ld	a3,-56(s0)
+ 120:	fb07b603          	ld	a2,-80(a5)
+ 124:	8552                	mv	a0,s4
+ 126:	00000097          	auipc	ra,0x0
+ 12a:	73c080e7          	jalr	1852(ra) # 862 <printf>
+    while(readdir(fd, &st) == 1){
+ 12e:	85ca                	mv	a1,s2
+ 130:	8526                	mv	a0,s1
+ 132:	00000097          	auipc	ra,0x0
+ 136:	41c080e7          	jalr	1052(ra) # 54e <readdir>
+ 13a:	fd3505e3          	beq	a0,s3,104 <ls+0x9e>
+    }
+  } else {
+    printf("%s %s\t%l\n", fmtname(st.name), types[st.type], st.size);
+  }
+  close(fd);
+ 13e:	8526                	mv	a0,s1
+ 140:	00000097          	auipc	ra,0x0
+ 144:	38e080e7          	jalr	910(ra) # 4ce <close>
+}
+ 148:	70e6                	ld	ra,120(sp)
+ 14a:	7446                	ld	s0,112(sp)
+ 14c:	74a6                	ld	s1,104(sp)
+ 14e:	7906                	ld	s2,96(sp)
+ 150:	69e6                	ld	s3,88(sp)
+ 152:	6a46                	ld	s4,80(sp)
+ 154:	6109                	addi	sp,sp,128
+ 156:	8082                	ret
+    printf("%s %s\t%l\n", fmtname(st.name), types[st.type], st.size);
+ 158:	f9840513          	addi	a0,s0,-104
+ 15c:	00000097          	auipc	ra,0x0
+ 160:	ea4080e7          	jalr	-348(ra) # 0 <fmtname>
+ 164:	85aa                	mv	a1,a0
+ 166:	fc041783          	lh	a5,-64(s0)
+ 16a:	078e                	slli	a5,a5,0x3
+ 16c:	fd078793          	addi	a5,a5,-48
+ 170:	97a2                	add	a5,a5,s0
+ 172:	fc843683          	ld	a3,-56(s0)
+ 176:	fb07b603          	ld	a2,-80(a5)
+ 17a:	00001517          	auipc	a0,0x1
+ 17e:	8de50513          	addi	a0,a0,-1826 # a58 <malloc+0x13e>
+ 182:	00000097          	auipc	ra,0x0
+ 186:	6e0080e7          	jalr	1760(ra) # 862 <printf>
+ 18a:	bf55                	j	13e <ls+0xd8>
+
+000000000000018c <main>:
+
+int
+main(int argc, char *argv[])
+{
+ 18c:	1101                	addi	sp,sp,-32
+ 18e:	ec06                	sd	ra,24(sp)
+ 190:	e822                	sd	s0,16(sp)
+ 192:	e426                	sd	s1,8(sp)
+ 194:	e04a                	sd	s2,0(sp)
+ 196:	1000                	addi	s0,sp,32
+  int i;
+
+  if(argc < 2){
+ 198:	4785                	li	a5,1
+ 19a:	02a7d963          	bge	a5,a0,1cc <main+0x40>
+ 19e:	00858493          	addi	s1,a1,8
+ 1a2:	ffe5091b          	addiw	s2,a0,-2
+ 1a6:	02091793          	slli	a5,s2,0x20
+ 1aa:	01d7d913          	srli	s2,a5,0x1d
+ 1ae:	05c1                	addi	a1,a1,16
+ 1b0:	992e                	add	s2,s2,a1
+    ls(".");
+    exit(0);
+  }
+  for(i=1; i<argc; i++)
+    ls(argv[i]);
+ 1b2:	6088                	ld	a0,0(s1)
+ 1b4:	00000097          	auipc	ra,0x0
+ 1b8:	eb2080e7          	jalr	-334(ra) # 66 <ls>
+  for(i=1; i<argc; i++)
+ 1bc:	04a1                	addi	s1,s1,8
+ 1be:	ff249ae3          	bne	s1,s2,1b2 <main+0x26>
+  exit(0);
+ 1c2:	4501                	li	a0,0
+ 1c4:	00000097          	auipc	ra,0x0
+ 1c8:	2da080e7          	jalr	730(ra) # 49e <exit>
+    ls(".");
+ 1cc:	00001517          	auipc	a0,0x1
+ 1d0:	89c50513          	addi	a0,a0,-1892 # a68 <malloc+0x14e>
+ 1d4:	00000097          	auipc	ra,0x0
+ 1d8:	e92080e7          	jalr	-366(ra) # 66 <ls>
+    exit(0);
+ 1dc:	4501                	li	a0,0
+ 1de:	00000097          	auipc	ra,0x0
+ 1e2:	2c0080e7          	jalr	704(ra) # 49e <exit>
+
+00000000000001e6 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+ 1e6:	1141                	addi	sp,sp,-16
+ 1e8:	e422                	sd	s0,8(sp)
+ 1ea:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+ 1ec:	87aa                	mv	a5,a0
+ 1ee:	0585                	addi	a1,a1,1
+ 1f0:	0785                	addi	a5,a5,1
+ 1f2:	fff5c703          	lbu	a4,-1(a1)
+ 1f6:	fee78fa3          	sb	a4,-1(a5)
+ 1fa:	fb75                	bnez	a4,1ee <strcpy+0x8>
+    ;
+  return os;
+}
+ 1fc:	6422                	ld	s0,8(sp)
+ 1fe:	0141                	addi	sp,sp,16
+ 200:	8082                	ret
+
+0000000000000202 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+ 202:	1141                	addi	sp,sp,-16
+ 204:	e422                	sd	s0,8(sp)
+ 206:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+ 208:	00054783          	lbu	a5,0(a0)
+ 20c:	c385                	beqz	a5,22c <strcat+0x2a>
+ 20e:	87aa                	mv	a5,a0
+    s++;
+ 210:	0785                	addi	a5,a5,1
+  while(*s)
+ 212:	0007c703          	lbu	a4,0(a5)
+ 216:	ff6d                	bnez	a4,210 <strcat+0xe>
+  while((*s++ = *t++))
+ 218:	0585                	addi	a1,a1,1
+ 21a:	0785                	addi	a5,a5,1
+ 21c:	fff5c703          	lbu	a4,-1(a1)
+ 220:	fee78fa3          	sb	a4,-1(a5)
+ 224:	fb75                	bnez	a4,218 <strcat+0x16>
+    ;
+  return os;
+}
+ 226:	6422                	ld	s0,8(sp)
+ 228:	0141                	addi	sp,sp,16
+ 22a:	8082                	ret
+  while(*s)
+ 22c:	87aa                	mv	a5,a0
+ 22e:	b7ed                	j	218 <strcat+0x16>
+
+0000000000000230 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+ 230:	1141                	addi	sp,sp,-16
+ 232:	e422                	sd	s0,8(sp)
+ 234:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+ 236:	00054783          	lbu	a5,0(a0)
+ 23a:	cb91                	beqz	a5,24e <strcmp+0x1e>
+ 23c:	0005c703          	lbu	a4,0(a1)
+ 240:	00f71763          	bne	a4,a5,24e <strcmp+0x1e>
+    p++, q++;
+ 244:	0505                	addi	a0,a0,1
+ 246:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+ 248:	00054783          	lbu	a5,0(a0)
+ 24c:	fbe5                	bnez	a5,23c <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+ 24e:	0005c503          	lbu	a0,0(a1)
+}
+ 252:	40a7853b          	subw	a0,a5,a0
+ 256:	6422                	ld	s0,8(sp)
+ 258:	0141                	addi	sp,sp,16
+ 25a:	8082                	ret
+
+000000000000025c <strlen>:
+
+uint
+strlen(const char *s)
+{
+ 25c:	1141                	addi	sp,sp,-16
+ 25e:	e422                	sd	s0,8(sp)
+ 260:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 262:	00054783          	lbu	a5,0(a0)
+ 266:	cf91                	beqz	a5,282 <strlen+0x26>
+ 268:	0505                	addi	a0,a0,1
+ 26a:	87aa                	mv	a5,a0
+ 26c:	4685                	li	a3,1
+ 26e:	9e89                	subw	a3,a3,a0
+ 270:	00f6853b          	addw	a0,a3,a5
+ 274:	0785                	addi	a5,a5,1
+ 276:	fff7c703          	lbu	a4,-1(a5)
+ 27a:	fb7d                	bnez	a4,270 <strlen+0x14>
+    ;
+  return n;
+}
+ 27c:	6422                	ld	s0,8(sp)
+ 27e:	0141                	addi	sp,sp,16
+ 280:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 282:	4501                	li	a0,0
+ 284:	bfe5                	j	27c <strlen+0x20>
+
+0000000000000286 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 286:	1141                	addi	sp,sp,-16
+ 288:	e422                	sd	s0,8(sp)
+ 28a:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 28c:	ca19                	beqz	a2,2a2 <memset+0x1c>
+ 28e:	87aa                	mv	a5,a0
+ 290:	1602                	slli	a2,a2,0x20
+ 292:	9201                	srli	a2,a2,0x20
+ 294:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 298:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 29c:	0785                	addi	a5,a5,1
+ 29e:	fee79de3          	bne	a5,a4,298 <memset+0x12>
+  }
+  return dst;
+}
+ 2a2:	6422                	ld	s0,8(sp)
+ 2a4:	0141                	addi	sp,sp,16
+ 2a6:	8082                	ret
+
+00000000000002a8 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 2a8:	1141                	addi	sp,sp,-16
+ 2aa:	e422                	sd	s0,8(sp)
+ 2ac:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 2ae:	00054783          	lbu	a5,0(a0)
+ 2b2:	cb99                	beqz	a5,2c8 <strchr+0x20>
+    if(*s == c)
+ 2b4:	00f58763          	beq	a1,a5,2c2 <strchr+0x1a>
+  for(; *s; s++)
+ 2b8:	0505                	addi	a0,a0,1
+ 2ba:	00054783          	lbu	a5,0(a0)
+ 2be:	fbfd                	bnez	a5,2b4 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 2c0:	4501                	li	a0,0
+}
+ 2c2:	6422                	ld	s0,8(sp)
+ 2c4:	0141                	addi	sp,sp,16
+ 2c6:	8082                	ret
+  return 0;
+ 2c8:	4501                	li	a0,0
+ 2ca:	bfe5                	j	2c2 <strchr+0x1a>
+
+00000000000002cc <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 2cc:	711d                	addi	sp,sp,-96
+ 2ce:	ec86                	sd	ra,88(sp)
+ 2d0:	e8a2                	sd	s0,80(sp)
+ 2d2:	e4a6                	sd	s1,72(sp)
+ 2d4:	e0ca                	sd	s2,64(sp)
+ 2d6:	fc4e                	sd	s3,56(sp)
+ 2d8:	f852                	sd	s4,48(sp)
+ 2da:	f456                	sd	s5,40(sp)
+ 2dc:	f05a                	sd	s6,32(sp)
+ 2de:	ec5e                	sd	s7,24(sp)
+ 2e0:	e862                	sd	s8,16(sp)
+ 2e2:	1080                	addi	s0,sp,96
+ 2e4:	8baa                	mv	s7,a0
+ 2e6:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 2e8:	892a                	mv	s2,a0
+ 2ea:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 2ec:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 2f0:	4b29                	li	s6,10
+ 2f2:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 2f4:	89a6                	mv	s3,s1
+ 2f6:	2485                	addiw	s1,s1,1
+ 2f8:	0344d763          	bge	s1,s4,326 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 2fc:	4605                	li	a2,1
+ 2fe:	85d6                	mv	a1,s5
+ 300:	4501                	li	a0,0
+ 302:	00000097          	auipc	ra,0x0
+ 306:	1b8080e7          	jalr	440(ra) # 4ba <read>
+    if(cc < 1)
+ 30a:	00a05e63          	blez	a0,326 <gets+0x5a>
+    buf[i++] = c;
+ 30e:	faf44783          	lbu	a5,-81(s0)
+ 312:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 316:	01678763          	beq	a5,s6,324 <gets+0x58>
+ 31a:	0905                	addi	s2,s2,1
+ 31c:	fd879ce3          	bne	a5,s8,2f4 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 320:	89a6                	mv	s3,s1
+ 322:	a011                	j	326 <gets+0x5a>
+ 324:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 326:	99de                	add	s3,s3,s7
+ 328:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 32c:	855e                	mv	a0,s7
+ 32e:	60e6                	ld	ra,88(sp)
+ 330:	6446                	ld	s0,80(sp)
+ 332:	64a6                	ld	s1,72(sp)
+ 334:	6906                	ld	s2,64(sp)
+ 336:	79e2                	ld	s3,56(sp)
+ 338:	7a42                	ld	s4,48(sp)
+ 33a:	7aa2                	ld	s5,40(sp)
+ 33c:	7b02                	ld	s6,32(sp)
+ 33e:	6be2                	ld	s7,24(sp)
+ 340:	6c42                	ld	s8,16(sp)
+ 342:	6125                	addi	sp,sp,96
+ 344:	8082                	ret
+
+0000000000000346 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 346:	1101                	addi	sp,sp,-32
+ 348:	ec06                	sd	ra,24(sp)
+ 34a:	e822                	sd	s0,16(sp)
+ 34c:	e426                	sd	s1,8(sp)
+ 34e:	e04a                	sd	s2,0(sp)
+ 350:	1000                	addi	s0,sp,32
+ 352:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 354:	4581                	li	a1,0
+ 356:	00000097          	auipc	ra,0x0
+ 35a:	194080e7          	jalr	404(ra) # 4ea <open>
+  if(fd < 0)
+ 35e:	02054563          	bltz	a0,388 <stat+0x42>
+ 362:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 364:	85ca                	mv	a1,s2
+ 366:	00000097          	auipc	ra,0x0
+ 36a:	18e080e7          	jalr	398(ra) # 4f4 <fstat>
+ 36e:	892a                	mv	s2,a0
+  close(fd);
+ 370:	8526                	mv	a0,s1
+ 372:	00000097          	auipc	ra,0x0
+ 376:	15c080e7          	jalr	348(ra) # 4ce <close>
+  return r;
+}
+ 37a:	854a                	mv	a0,s2
+ 37c:	60e2                	ld	ra,24(sp)
+ 37e:	6442                	ld	s0,16(sp)
+ 380:	64a2                	ld	s1,8(sp)
+ 382:	6902                	ld	s2,0(sp)
+ 384:	6105                	addi	sp,sp,32
+ 386:	8082                	ret
+    return -1;
+ 388:	597d                	li	s2,-1
+ 38a:	bfc5                	j	37a <stat+0x34>
+
+000000000000038c <atoi>:
+
+int
+atoi(const char *s)
+{
+ 38c:	1141                	addi	sp,sp,-16
+ 38e:	e422                	sd	s0,8(sp)
+ 390:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 392:	00054703          	lbu	a4,0(a0)
+ 396:	02d00793          	li	a5,45
+  int neg = 1;
+ 39a:	4585                	li	a1,1
+  if (*s == '-') {
+ 39c:	04f70363          	beq	a4,a5,3e2 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 3a0:	00054703          	lbu	a4,0(a0)
+ 3a4:	fd07079b          	addiw	a5,a4,-48
+ 3a8:	0ff7f793          	zext.b	a5,a5
+ 3ac:	46a5                	li	a3,9
+ 3ae:	02f6ed63          	bltu	a3,a5,3e8 <atoi+0x5c>
+  n = 0;
+ 3b2:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 3b4:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 3b6:	0505                	addi	a0,a0,1
+ 3b8:	0026979b          	slliw	a5,a3,0x2
+ 3bc:	9fb5                	addw	a5,a5,a3
+ 3be:	0017979b          	slliw	a5,a5,0x1
+ 3c2:	9fb9                	addw	a5,a5,a4
+ 3c4:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 3c8:	00054703          	lbu	a4,0(a0)
+ 3cc:	fd07079b          	addiw	a5,a4,-48
+ 3d0:	0ff7f793          	zext.b	a5,a5
+ 3d4:	fef671e3          	bgeu	a2,a5,3b6 <atoi+0x2a>
+  return n * neg;
+}
+ 3d8:	02d5853b          	mulw	a0,a1,a3
+ 3dc:	6422                	ld	s0,8(sp)
+ 3de:	0141                	addi	sp,sp,16
+ 3e0:	8082                	ret
+    s++;
+ 3e2:	0505                	addi	a0,a0,1
+    neg = -1;
+ 3e4:	55fd                	li	a1,-1
+ 3e6:	bf6d                	j	3a0 <atoi+0x14>
+  n = 0;
+ 3e8:	4681                	li	a3,0
+ 3ea:	b7fd                	j	3d8 <atoi+0x4c>
+
+00000000000003ec <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 3ec:	1141                	addi	sp,sp,-16
+ 3ee:	e422                	sd	s0,8(sp)
+ 3f0:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 3f2:	02b57463          	bgeu	a0,a1,41a <memmove+0x2e>
+    while(n-- > 0)
+ 3f6:	00c05f63          	blez	a2,414 <memmove+0x28>
+ 3fa:	1602                	slli	a2,a2,0x20
+ 3fc:	9201                	srli	a2,a2,0x20
+ 3fe:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 402:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 404:	0585                	addi	a1,a1,1
+ 406:	0705                	addi	a4,a4,1
+ 408:	fff5c683          	lbu	a3,-1(a1)
+ 40c:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 410:	fee79ae3          	bne	a5,a4,404 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 414:	6422                	ld	s0,8(sp)
+ 416:	0141                	addi	sp,sp,16
+ 418:	8082                	ret
+    dst += n;
+ 41a:	00c50733          	add	a4,a0,a2
+    src += n;
+ 41e:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 420:	fec05ae3          	blez	a2,414 <memmove+0x28>
+ 424:	fff6079b          	addiw	a5,a2,-1
+ 428:	1782                	slli	a5,a5,0x20
+ 42a:	9381                	srli	a5,a5,0x20
+ 42c:	fff7c793          	not	a5,a5
+ 430:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 432:	15fd                	addi	a1,a1,-1
+ 434:	177d                	addi	a4,a4,-1
+ 436:	0005c683          	lbu	a3,0(a1)
+ 43a:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 43e:	fee79ae3          	bne	a5,a4,432 <memmove+0x46>
+ 442:	bfc9                	j	414 <memmove+0x28>
+
+0000000000000444 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 444:	1141                	addi	sp,sp,-16
+ 446:	e422                	sd	s0,8(sp)
+ 448:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 44a:	ca05                	beqz	a2,47a <memcmp+0x36>
+ 44c:	fff6069b          	addiw	a3,a2,-1
+ 450:	1682                	slli	a3,a3,0x20
+ 452:	9281                	srli	a3,a3,0x20
+ 454:	0685                	addi	a3,a3,1
+ 456:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 458:	00054783          	lbu	a5,0(a0)
+ 45c:	0005c703          	lbu	a4,0(a1)
+ 460:	00e79863          	bne	a5,a4,470 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 464:	0505                	addi	a0,a0,1
+    p2++;
+ 466:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 468:	fed518e3          	bne	a0,a3,458 <memcmp+0x14>
+  }
+  return 0;
+ 46c:	4501                	li	a0,0
+ 46e:	a019                	j	474 <memcmp+0x30>
+      return *p1 - *p2;
+ 470:	40e7853b          	subw	a0,a5,a4
+}
+ 474:	6422                	ld	s0,8(sp)
+ 476:	0141                	addi	sp,sp,16
+ 478:	8082                	ret
+  return 0;
+ 47a:	4501                	li	a0,0
+ 47c:	bfe5                	j	474 <memcmp+0x30>
+
+000000000000047e <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 47e:	1141                	addi	sp,sp,-16
+ 480:	e406                	sd	ra,8(sp)
+ 482:	e022                	sd	s0,0(sp)
+ 484:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 486:	00000097          	auipc	ra,0x0
+ 48a:	f66080e7          	jalr	-154(ra) # 3ec <memmove>
+}
+ 48e:	60a2                	ld	ra,8(sp)
+ 490:	6402                	ld	s0,0(sp)
+ 492:	0141                	addi	sp,sp,16
+ 494:	8082                	ret
+
+0000000000000496 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 496:	4885                	li	a7,1
+ ecall
+ 498:	00000073          	ecall
+ ret
+ 49c:	8082                	ret
+
+000000000000049e <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 49e:	05d00893          	li	a7,93
+ ecall
+ 4a2:	00000073          	ecall
+ ret
+ 4a6:	8082                	ret
+
+00000000000004a8 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 4a8:	488d                	li	a7,3
+ ecall
+ 4aa:	00000073          	ecall
+ ret
+ 4ae:	8082                	ret
+
+00000000000004b0 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 4b0:	03b00893          	li	a7,59
+ ecall
+ 4b4:	00000073          	ecall
+ ret
+ 4b8:	8082                	ret
+
+00000000000004ba <read>:
+.global read
+read:
+ li a7, SYS_read
+ 4ba:	03f00893          	li	a7,63
+ ecall
+ 4be:	00000073          	ecall
+ ret
+ 4c2:	8082                	ret
+
+00000000000004c4 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 4c4:	04000893          	li	a7,64
+ ecall
+ 4c8:	00000073          	ecall
+ ret
+ 4cc:	8082                	ret
+
+00000000000004ce <close>:
+.global close
+close:
+ li a7, SYS_close
+ 4ce:	03900893          	li	a7,57
+ ecall
+ 4d2:	00000073          	ecall
+ ret
+ 4d6:	8082                	ret
+
+00000000000004d8 <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 4d8:	4899                	li	a7,6
+ ecall
+ 4da:	00000073          	ecall
+ ret
+ 4de:	8082                	ret
+
+00000000000004e0 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 4e0:	0dd00893          	li	a7,221
+ ecall
+ 4e4:	00000073          	ecall
+ ret
+ 4e8:	8082                	ret
+
+00000000000004ea <open>:
+.global open
+open:
+ li a7, SYS_open
+ 4ea:	03800893          	li	a7,56
+ ecall
+ 4ee:	00000073          	ecall
+ ret
+ 4f2:	8082                	ret
+
+00000000000004f4 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 4f4:	05000893          	li	a7,80
+ ecall
+ 4f8:	00000073          	ecall
+ ret
+ 4fc:	8082                	ret
+
+00000000000004fe <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 4fe:	02200893          	li	a7,34
+ ecall
+ 502:	00000073          	ecall
+ ret
+ 506:	8082                	ret
+
+0000000000000508 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 508:	03100893          	li	a7,49
+ ecall
+ 50c:	00000073          	ecall
+ ret
+ 510:	8082                	ret
+
+0000000000000512 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 512:	48dd                	li	a7,23
+ ecall
+ 514:	00000073          	ecall
+ ret
+ 518:	8082                	ret
+
+000000000000051a <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 51a:	0ac00893          	li	a7,172
+ ecall
+ 51e:	00000073          	ecall
+ ret
+ 522:	8082                	ret
+
+0000000000000524 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 524:	48b1                	li	a7,12
+ ecall
+ 526:	00000073          	ecall
+ ret
+ 52a:	8082                	ret
+
+000000000000052c <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 52c:	48b5                	li	a7,13
+ ecall
+ 52e:	00000073          	ecall
+ ret
+ 532:	8082                	ret
+
+0000000000000534 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 534:	48b9                	li	a7,14
+ ecall
+ 536:	00000073          	ecall
+ ret
+ 53a:	8082                	ret
+
+000000000000053c <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 53c:	48d9                	li	a7,22
+ ecall
+ 53e:	00000073          	ecall
+ ret
+ 542:	8082                	ret
+
+0000000000000544 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 544:	03200893          	li	a7,50
+ ecall
+ 548:	00000073          	ecall
+ ret
+ 54c:	8082                	ret
+
+000000000000054e <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 54e:	48ed                	li	a7,27
+ ecall
+ 550:	00000073          	ecall
+ ret
+ 554:	8082                	ret
+
+0000000000000556 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 556:	48c5                	li	a7,17
+ ecall
+ 558:	00000073          	ecall
+ ret
+ 55c:	8082                	ret
+
+000000000000055e <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 55e:	07500893          	li	a7,117
+ ecall
+ 562:	00000073          	ecall
+ ret
+ 566:	8082                	ret
+
+0000000000000568 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 568:	48c9                	li	a7,18
+ ecall
+ 56a:	00000073          	ecall
+ ret
+ 56e:	8082                	ret
+
+0000000000000570 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 570:	48cd                	li	a7,19
+ ecall
+ 572:	00000073          	ecall
+ ret
+ 576:	8082                	ret
+
+0000000000000578 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 578:	48e9                	li	a7,26
+ ecall
+ 57a:	00000073          	ecall
+ ret
+ 57e:	8082                	ret
+
+0000000000000580 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 580:	0d200893          	li	a7,210
+ ecall
+ 584:	00000073          	ecall
+ ret
+ 588:	8082                	ret
+
+000000000000058a <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 58a:	1101                	addi	sp,sp,-32
+ 58c:	ec06                	sd	ra,24(sp)
+ 58e:	e822                	sd	s0,16(sp)
+ 590:	1000                	addi	s0,sp,32
+ 592:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 596:	4605                	li	a2,1
+ 598:	fef40593          	addi	a1,s0,-17
+ 59c:	00000097          	auipc	ra,0x0
+ 5a0:	f28080e7          	jalr	-216(ra) # 4c4 <write>
+}
+ 5a4:	60e2                	ld	ra,24(sp)
+ 5a6:	6442                	ld	s0,16(sp)
+ 5a8:	6105                	addi	sp,sp,32
+ 5aa:	8082                	ret
+
+00000000000005ac <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 5ac:	7139                	addi	sp,sp,-64
+ 5ae:	fc06                	sd	ra,56(sp)
+ 5b0:	f822                	sd	s0,48(sp)
+ 5b2:	f426                	sd	s1,40(sp)
+ 5b4:	f04a                	sd	s2,32(sp)
+ 5b6:	ec4e                	sd	s3,24(sp)
+ 5b8:	0080                	addi	s0,sp,64
+ 5ba:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 5bc:	c299                	beqz	a3,5c2 <printint+0x16>
+ 5be:	0805c863          	bltz	a1,64e <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 5c2:	2581                	sext.w	a1,a1
+  neg = 0;
+ 5c4:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 5c6:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 5ca:	86ce                	mv	a3,s3
+  i = 0;
+ 5cc:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 5ce:	2601                	sext.w	a2,a2
+ 5d0:	00000517          	auipc	a0,0x0
+ 5d4:	50050513          	addi	a0,a0,1280 # ad0 <digits>
+ 5d8:	883a                	mv	a6,a4
+ 5da:	2705                	addiw	a4,a4,1
+ 5dc:	02c5f7bb          	remuw	a5,a1,a2
+ 5e0:	1782                	slli	a5,a5,0x20
+ 5e2:	9381                	srli	a5,a5,0x20
+ 5e4:	97aa                	add	a5,a5,a0
+ 5e6:	0007c783          	lbu	a5,0(a5)
+ 5ea:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 5ee:	0005879b          	sext.w	a5,a1
+ 5f2:	02c5d5bb          	divuw	a1,a1,a2
+ 5f6:	0685                	addi	a3,a3,1
+ 5f8:	fec7f0e3          	bgeu	a5,a2,5d8 <printint+0x2c>
+  if(neg)
+ 5fc:	00088c63          	beqz	a7,614 <printint+0x68>
+    buf[i++] = '-';
+ 600:	fd070793          	addi	a5,a4,-48
+ 604:	00878733          	add	a4,a5,s0
+ 608:	02d00793          	li	a5,45
+ 60c:	fef70823          	sb	a5,-16(a4)
+ 610:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 614:	02e05663          	blez	a4,640 <printint+0x94>
+ 618:	fc040913          	addi	s2,s0,-64
+ 61c:	993a                	add	s2,s2,a4
+ 61e:	19fd                	addi	s3,s3,-1
+ 620:	99ba                	add	s3,s3,a4
+ 622:	377d                	addiw	a4,a4,-1
+ 624:	1702                	slli	a4,a4,0x20
+ 626:	9301                	srli	a4,a4,0x20
+ 628:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 62c:	fff94583          	lbu	a1,-1(s2)
+ 630:	8526                	mv	a0,s1
+ 632:	00000097          	auipc	ra,0x0
+ 636:	f58080e7          	jalr	-168(ra) # 58a <putc>
+  while(--i >= 0)
+ 63a:	197d                	addi	s2,s2,-1
+ 63c:	ff3918e3          	bne	s2,s3,62c <printint+0x80>
+}
+ 640:	70e2                	ld	ra,56(sp)
+ 642:	7442                	ld	s0,48(sp)
+ 644:	74a2                	ld	s1,40(sp)
+ 646:	7902                	ld	s2,32(sp)
+ 648:	69e2                	ld	s3,24(sp)
+ 64a:	6121                	addi	sp,sp,64
+ 64c:	8082                	ret
+    x = -xx;
+ 64e:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 652:	4885                	li	a7,1
+    x = -xx;
+ 654:	bf8d                	j	5c6 <printint+0x1a>
+
+0000000000000656 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 656:	7119                	addi	sp,sp,-128
+ 658:	fc86                	sd	ra,120(sp)
+ 65a:	f8a2                	sd	s0,112(sp)
+ 65c:	f4a6                	sd	s1,104(sp)
+ 65e:	f0ca                	sd	s2,96(sp)
+ 660:	ecce                	sd	s3,88(sp)
+ 662:	e8d2                	sd	s4,80(sp)
+ 664:	e4d6                	sd	s5,72(sp)
+ 666:	e0da                	sd	s6,64(sp)
+ 668:	fc5e                	sd	s7,56(sp)
+ 66a:	f862                	sd	s8,48(sp)
+ 66c:	f466                	sd	s9,40(sp)
+ 66e:	f06a                	sd	s10,32(sp)
+ 670:	ec6e                	sd	s11,24(sp)
+ 672:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 674:	0005c903          	lbu	s2,0(a1)
+ 678:	18090f63          	beqz	s2,816 <vprintf+0x1c0>
+ 67c:	8aaa                	mv	s5,a0
+ 67e:	8b32                	mv	s6,a2
+ 680:	00158493          	addi	s1,a1,1
+  state = 0;
+ 684:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 686:	02500a13          	li	s4,37
+ 68a:	4c55                	li	s8,21
+ 68c:	00000c97          	auipc	s9,0x0
+ 690:	3ecc8c93          	addi	s9,s9,1004 # a78 <malloc+0x15e>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 694:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 698:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 69a:	00000b97          	auipc	s7,0x0
+ 69e:	436b8b93          	addi	s7,s7,1078 # ad0 <digits>
+ 6a2:	a839                	j	6c0 <vprintf+0x6a>
+        putc(fd, c);
+ 6a4:	85ca                	mv	a1,s2
+ 6a6:	8556                	mv	a0,s5
+ 6a8:	00000097          	auipc	ra,0x0
+ 6ac:	ee2080e7          	jalr	-286(ra) # 58a <putc>
+ 6b0:	a019                	j	6b6 <vprintf+0x60>
+    } else if(state == '%'){
+ 6b2:	01498d63          	beq	s3,s4,6cc <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 6b6:	0485                	addi	s1,s1,1
+ 6b8:	fff4c903          	lbu	s2,-1(s1)
+ 6bc:	14090d63          	beqz	s2,816 <vprintf+0x1c0>
+    if(state == 0){
+ 6c0:	fe0999e3          	bnez	s3,6b2 <vprintf+0x5c>
+      if(c == '%'){
+ 6c4:	ff4910e3          	bne	s2,s4,6a4 <vprintf+0x4e>
+        state = '%';
+ 6c8:	89d2                	mv	s3,s4
+ 6ca:	b7f5                	j	6b6 <vprintf+0x60>
+      if(c == 'd'){
+ 6cc:	11490c63          	beq	s2,s4,7e4 <vprintf+0x18e>
+ 6d0:	f9d9079b          	addiw	a5,s2,-99
+ 6d4:	0ff7f793          	zext.b	a5,a5
+ 6d8:	10fc6e63          	bltu	s8,a5,7f4 <vprintf+0x19e>
+ 6dc:	f9d9079b          	addiw	a5,s2,-99
+ 6e0:	0ff7f713          	zext.b	a4,a5
+ 6e4:	10ec6863          	bltu	s8,a4,7f4 <vprintf+0x19e>
+ 6e8:	00271793          	slli	a5,a4,0x2
+ 6ec:	97e6                	add	a5,a5,s9
+ 6ee:	439c                	lw	a5,0(a5)
+ 6f0:	97e6                	add	a5,a5,s9
+ 6f2:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 6f4:	008b0913          	addi	s2,s6,8
+ 6f8:	4685                	li	a3,1
+ 6fa:	4629                	li	a2,10
+ 6fc:	000b2583          	lw	a1,0(s6)
+ 700:	8556                	mv	a0,s5
+ 702:	00000097          	auipc	ra,0x0
+ 706:	eaa080e7          	jalr	-342(ra) # 5ac <printint>
+ 70a:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 70c:	4981                	li	s3,0
+ 70e:	b765                	j	6b6 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 710:	008b0913          	addi	s2,s6,8
+ 714:	4681                	li	a3,0
+ 716:	4629                	li	a2,10
+ 718:	000b2583          	lw	a1,0(s6)
+ 71c:	8556                	mv	a0,s5
+ 71e:	00000097          	auipc	ra,0x0
+ 722:	e8e080e7          	jalr	-370(ra) # 5ac <printint>
+ 726:	8b4a                	mv	s6,s2
+      state = 0;
+ 728:	4981                	li	s3,0
+ 72a:	b771                	j	6b6 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 72c:	008b0913          	addi	s2,s6,8
+ 730:	4681                	li	a3,0
+ 732:	866a                	mv	a2,s10
+ 734:	000b2583          	lw	a1,0(s6)
+ 738:	8556                	mv	a0,s5
+ 73a:	00000097          	auipc	ra,0x0
+ 73e:	e72080e7          	jalr	-398(ra) # 5ac <printint>
+ 742:	8b4a                	mv	s6,s2
+      state = 0;
+ 744:	4981                	li	s3,0
+ 746:	bf85                	j	6b6 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 748:	008b0793          	addi	a5,s6,8
+ 74c:	f8f43423          	sd	a5,-120(s0)
+ 750:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 754:	03000593          	li	a1,48
+ 758:	8556                	mv	a0,s5
+ 75a:	00000097          	auipc	ra,0x0
+ 75e:	e30080e7          	jalr	-464(ra) # 58a <putc>
+  putc(fd, 'x');
+ 762:	07800593          	li	a1,120
+ 766:	8556                	mv	a0,s5
+ 768:	00000097          	auipc	ra,0x0
+ 76c:	e22080e7          	jalr	-478(ra) # 58a <putc>
+ 770:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 772:	03c9d793          	srli	a5,s3,0x3c
+ 776:	97de                	add	a5,a5,s7
+ 778:	0007c583          	lbu	a1,0(a5)
+ 77c:	8556                	mv	a0,s5
+ 77e:	00000097          	auipc	ra,0x0
+ 782:	e0c080e7          	jalr	-500(ra) # 58a <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 786:	0992                	slli	s3,s3,0x4
+ 788:	397d                	addiw	s2,s2,-1
+ 78a:	fe0914e3          	bnez	s2,772 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 78e:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 792:	4981                	li	s3,0
+ 794:	b70d                	j	6b6 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 796:	008b0913          	addi	s2,s6,8
+ 79a:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 79e:	02098163          	beqz	s3,7c0 <vprintf+0x16a>
+        while(*s != 0){
+ 7a2:	0009c583          	lbu	a1,0(s3)
+ 7a6:	c5ad                	beqz	a1,810 <vprintf+0x1ba>
+          putc(fd, *s);
+ 7a8:	8556                	mv	a0,s5
+ 7aa:	00000097          	auipc	ra,0x0
+ 7ae:	de0080e7          	jalr	-544(ra) # 58a <putc>
+          s++;
+ 7b2:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 7b4:	0009c583          	lbu	a1,0(s3)
+ 7b8:	f9e5                	bnez	a1,7a8 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 7ba:	8b4a                	mv	s6,s2
+      state = 0;
+ 7bc:	4981                	li	s3,0
+ 7be:	bde5                	j	6b6 <vprintf+0x60>
+          s = "(null)";
+ 7c0:	00000997          	auipc	s3,0x0
+ 7c4:	2b098993          	addi	s3,s3,688 # a70 <malloc+0x156>
+        while(*s != 0){
+ 7c8:	85ee                	mv	a1,s11
+ 7ca:	bff9                	j	7a8 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 7cc:	008b0913          	addi	s2,s6,8
+ 7d0:	000b4583          	lbu	a1,0(s6)
+ 7d4:	8556                	mv	a0,s5
+ 7d6:	00000097          	auipc	ra,0x0
+ 7da:	db4080e7          	jalr	-588(ra) # 58a <putc>
+ 7de:	8b4a                	mv	s6,s2
+      state = 0;
+ 7e0:	4981                	li	s3,0
+ 7e2:	bdd1                	j	6b6 <vprintf+0x60>
+        putc(fd, c);
+ 7e4:	85d2                	mv	a1,s4
+ 7e6:	8556                	mv	a0,s5
+ 7e8:	00000097          	auipc	ra,0x0
+ 7ec:	da2080e7          	jalr	-606(ra) # 58a <putc>
+      state = 0;
+ 7f0:	4981                	li	s3,0
+ 7f2:	b5d1                	j	6b6 <vprintf+0x60>
+        putc(fd, '%');
+ 7f4:	85d2                	mv	a1,s4
+ 7f6:	8556                	mv	a0,s5
+ 7f8:	00000097          	auipc	ra,0x0
+ 7fc:	d92080e7          	jalr	-622(ra) # 58a <putc>
+        putc(fd, c);
+ 800:	85ca                	mv	a1,s2
+ 802:	8556                	mv	a0,s5
+ 804:	00000097          	auipc	ra,0x0
+ 808:	d86080e7          	jalr	-634(ra) # 58a <putc>
+      state = 0;
+ 80c:	4981                	li	s3,0
+ 80e:	b565                	j	6b6 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 810:	8b4a                	mv	s6,s2
+      state = 0;
+ 812:	4981                	li	s3,0
+ 814:	b54d                	j	6b6 <vprintf+0x60>
+    }
+  }
+}
+ 816:	70e6                	ld	ra,120(sp)
+ 818:	7446                	ld	s0,112(sp)
+ 81a:	74a6                	ld	s1,104(sp)
+ 81c:	7906                	ld	s2,96(sp)
+ 81e:	69e6                	ld	s3,88(sp)
+ 820:	6a46                	ld	s4,80(sp)
+ 822:	6aa6                	ld	s5,72(sp)
+ 824:	6b06                	ld	s6,64(sp)
+ 826:	7be2                	ld	s7,56(sp)
+ 828:	7c42                	ld	s8,48(sp)
+ 82a:	7ca2                	ld	s9,40(sp)
+ 82c:	7d02                	ld	s10,32(sp)
+ 82e:	6de2                	ld	s11,24(sp)
+ 830:	6109                	addi	sp,sp,128
+ 832:	8082                	ret
+
+0000000000000834 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 834:	715d                	addi	sp,sp,-80
+ 836:	ec06                	sd	ra,24(sp)
+ 838:	e822                	sd	s0,16(sp)
+ 83a:	1000                	addi	s0,sp,32
+ 83c:	e010                	sd	a2,0(s0)
+ 83e:	e414                	sd	a3,8(s0)
+ 840:	e818                	sd	a4,16(s0)
+ 842:	ec1c                	sd	a5,24(s0)
+ 844:	03043023          	sd	a6,32(s0)
+ 848:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 84c:	8622                	mv	a2,s0
+ 84e:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 852:	00000097          	auipc	ra,0x0
+ 856:	e04080e7          	jalr	-508(ra) # 656 <vprintf>
+}
+ 85a:	60e2                	ld	ra,24(sp)
+ 85c:	6442                	ld	s0,16(sp)
+ 85e:	6161                	addi	sp,sp,80
+ 860:	8082                	ret
+
+0000000000000862 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 862:	711d                	addi	sp,sp,-96
+ 864:	ec06                	sd	ra,24(sp)
+ 866:	e822                	sd	s0,16(sp)
+ 868:	1000                	addi	s0,sp,32
+ 86a:	e40c                	sd	a1,8(s0)
+ 86c:	e810                	sd	a2,16(s0)
+ 86e:	ec14                	sd	a3,24(s0)
+ 870:	f018                	sd	a4,32(s0)
+ 872:	f41c                	sd	a5,40(s0)
+ 874:	03043823          	sd	a6,48(s0)
+ 878:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 87c:	00840613          	addi	a2,s0,8
+ 880:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 884:	85aa                	mv	a1,a0
+ 886:	4505                	li	a0,1
+ 888:	00000097          	auipc	ra,0x0
+ 88c:	dce080e7          	jalr	-562(ra) # 656 <vprintf>
+}
+ 890:	60e2                	ld	ra,24(sp)
+ 892:	6442                	ld	s0,16(sp)
+ 894:	6125                	addi	sp,sp,96
+ 896:	8082                	ret
+
+0000000000000898 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 898:	1141                	addi	sp,sp,-16
+ 89a:	e422                	sd	s0,8(sp)
+ 89c:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 89e:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 8a2:	00000797          	auipc	a5,0x0
+ 8a6:	26e7b783          	ld	a5,622(a5) # b10 <freep>
+ 8aa:	a02d                	j	8d4 <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;
+ 8ac:	4618                	lw	a4,8(a2)
+ 8ae:	9f2d                	addw	a4,a4,a1
+ 8b0:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 8b4:	6398                	ld	a4,0(a5)
+ 8b6:	6310                	ld	a2,0(a4)
+ 8b8:	a83d                	j	8f6 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 8ba:	ff852703          	lw	a4,-8(a0)
+ 8be:	9f31                	addw	a4,a4,a2
+ 8c0:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 8c2:	ff053683          	ld	a3,-16(a0)
+ 8c6:	a091                	j	90a <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 8c8:	6398                	ld	a4,0(a5)
+ 8ca:	00e7e463          	bltu	a5,a4,8d2 <free+0x3a>
+ 8ce:	00e6ea63          	bltu	a3,a4,8e2 <free+0x4a>
+{
+ 8d2:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 8d4:	fed7fae3          	bgeu	a5,a3,8c8 <free+0x30>
+ 8d8:	6398                	ld	a4,0(a5)
+ 8da:	00e6e463          	bltu	a3,a4,8e2 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 8de:	fee7eae3          	bltu	a5,a4,8d2 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 8e2:	ff852583          	lw	a1,-8(a0)
+ 8e6:	6390                	ld	a2,0(a5)
+ 8e8:	02059813          	slli	a6,a1,0x20
+ 8ec:	01c85713          	srli	a4,a6,0x1c
+ 8f0:	9736                	add	a4,a4,a3
+ 8f2:	fae60de3          	beq	a2,a4,8ac <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 8f6:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 8fa:	4790                	lw	a2,8(a5)
+ 8fc:	02061593          	slli	a1,a2,0x20
+ 900:	01c5d713          	srli	a4,a1,0x1c
+ 904:	973e                	add	a4,a4,a5
+ 906:	fae68ae3          	beq	a3,a4,8ba <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 90a:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 90c:	00000717          	auipc	a4,0x0
+ 910:	20f73223          	sd	a5,516(a4) # b10 <freep>
+}
+ 914:	6422                	ld	s0,8(sp)
+ 916:	0141                	addi	sp,sp,16
+ 918:	8082                	ret
+
+000000000000091a <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 91a:	7139                	addi	sp,sp,-64
+ 91c:	fc06                	sd	ra,56(sp)
+ 91e:	f822                	sd	s0,48(sp)
+ 920:	f426                	sd	s1,40(sp)
+ 922:	f04a                	sd	s2,32(sp)
+ 924:	ec4e                	sd	s3,24(sp)
+ 926:	e852                	sd	s4,16(sp)
+ 928:	e456                	sd	s5,8(sp)
+ 92a:	e05a                	sd	s6,0(sp)
+ 92c:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 92e:	02051493          	slli	s1,a0,0x20
+ 932:	9081                	srli	s1,s1,0x20
+ 934:	04bd                	addi	s1,s1,15
+ 936:	8091                	srli	s1,s1,0x4
+ 938:	00148a1b          	addiw	s4,s1,1
+ 93c:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 93e:	00000517          	auipc	a0,0x0
+ 942:	1d253503          	ld	a0,466(a0) # b10 <freep>
+ 946:	c515                	beqz	a0,972 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 948:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 94a:	4798                	lw	a4,8(a5)
+ 94c:	04977163          	bgeu	a4,s1,98e <malloc+0x74>
+ 950:	89d2                	mv	s3,s4
+ 952:	000a071b          	sext.w	a4,s4
+ 956:	6685                	lui	a3,0x1
+ 958:	00d77363          	bgeu	a4,a3,95e <malloc+0x44>
+ 95c:	6985                	lui	s3,0x1
+ 95e:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 962:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 966:	00000917          	auipc	s2,0x0
+ 96a:	1aa90913          	addi	s2,s2,426 # b10 <freep>
+  if(p == (char*)-1)
+ 96e:	5afd                	li	s5,-1
+ 970:	a8a5                	j	9e8 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 972:	00000797          	auipc	a5,0x0
+ 976:	19e78793          	addi	a5,a5,414 # b10 <freep>
+ 97a:	00000717          	auipc	a4,0x0
+ 97e:	19e70713          	addi	a4,a4,414 # b18 <base>
+ 982:	e398                	sd	a4,0(a5)
+ 984:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 986:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 98a:	87ba                	mv	a5,a4
+ 98c:	b7d1                	j	950 <malloc+0x36>
+      if(p->s.size == nunits)
+ 98e:	02e48c63          	beq	s1,a4,9c6 <malloc+0xac>
+        p->s.size -= nunits;
+ 992:	4147073b          	subw	a4,a4,s4
+ 996:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 998:	02071693          	slli	a3,a4,0x20
+ 99c:	01c6d713          	srli	a4,a3,0x1c
+ 9a0:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 9a2:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 9a6:	00000717          	auipc	a4,0x0
+ 9aa:	16a73523          	sd	a0,362(a4) # b10 <freep>
+      return (void*)(p + 1);
+ 9ae:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 9b2:	70e2                	ld	ra,56(sp)
+ 9b4:	7442                	ld	s0,48(sp)
+ 9b6:	74a2                	ld	s1,40(sp)
+ 9b8:	7902                	ld	s2,32(sp)
+ 9ba:	69e2                	ld	s3,24(sp)
+ 9bc:	6a42                	ld	s4,16(sp)
+ 9be:	6aa2                	ld	s5,8(sp)
+ 9c0:	6b02                	ld	s6,0(sp)
+ 9c2:	6121                	addi	sp,sp,64
+ 9c4:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 9c6:	6398                	ld	a4,0(a5)
+ 9c8:	e118                	sd	a4,0(a0)
+ 9ca:	bff1                	j	9a6 <malloc+0x8c>
+  hp->s.size = nu;
+ 9cc:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 9d0:	0541                	addi	a0,a0,16
+ 9d2:	00000097          	auipc	ra,0x0
+ 9d6:	ec6080e7          	jalr	-314(ra) # 898 <free>
+  return freep;
+ 9da:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 9de:	d971                	beqz	a0,9b2 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 9e0:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 9e2:	4798                	lw	a4,8(a5)
+ 9e4:	fa9775e3          	bgeu	a4,s1,98e <malloc+0x74>
+    if(p == freep)
+ 9e8:	00093703          	ld	a4,0(s2)
+ 9ec:	853e                	mv	a0,a5
+ 9ee:	fef719e3          	bne	a4,a5,9e0 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 9f2:	854e                	mv	a0,s3
+ 9f4:	00000097          	auipc	ra,0x0
+ 9f8:	b30080e7          	jalr	-1232(ra) # 524 <sbrk>
+  if(p == (char*)-1)
+ 9fc:	fd5518e3          	bne	a0,s5,9cc <malloc+0xb2>
+        return 0;
+ a00:	4501                	li	a0,0
+ a02:	bf45                	j	9b2 <malloc+0x98>
diff --git a/xv6-user/ls.c b/xv6-user/ls.c
new file mode 100644
index 0000000000000000000000000000000000000000..4e7385acc07616f09b3cf7e41f228fa960a3258a
--- /dev/null
+++ b/xv6-user/ls.c
@@ -0,0 +1,63 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+char*
+fmtname(char *name)
+{
+  static char buf[STAT_MAX_NAME+1];
+  int len = strlen(name);
+
+  // Return blank-padded name.
+  if(len >= STAT_MAX_NAME)
+    return name;
+  memmove(buf, name, len);
+  memset(buf + len, ' ', STAT_MAX_NAME - len);
+  buf[STAT_MAX_NAME] = '\0';
+  return buf;
+}
+
+void
+ls(char *path)
+{
+  int fd;
+  struct stat st;
+  char *types[] = {
+    [T_DIR]   "DIR ",
+    [T_FILE]  "FILE",
+  };
+
+  if((fd = open(path, 0)) < 0){
+    fprintf(2, "ls: cannot open %s\n", path);
+    return;
+  }
+
+  if(fstat(fd, &st) < 0){
+    fprintf(2, "ls: cannot stat %s\n", path);
+    close(fd);
+    return;
+  }
+
+  if (st.type == T_DIR){
+    while(readdir(fd, &st) == 1){
+      printf("%s %s\t%d\n", fmtname(st.name), types[st.type], st.size);
+    }
+  } else {
+    printf("%s %s\t%l\n", fmtname(st.name), types[st.type], st.size);
+  }
+  close(fd);
+}
+
+int
+main(int argc, char *argv[])
+{
+  int i;
+
+  if(argc < 2){
+    ls(".");
+    exit(0);
+  }
+  for(i=1; i<argc; i++)
+    ls(argv[i]);
+  exit(0);
+}
diff --git a/xv6-user/ls.d b/xv6-user/ls.d
new file mode 100644
index 0000000000000000000000000000000000000000..0df9d1ef2f370007e45d7fe511c2e5de43f678ff
--- /dev/null
+++ b/xv6-user/ls.d
@@ -0,0 +1,2 @@
+xv6-user/ls.o: xv6-user/ls.c kernel/include/types.h kernel/include/stat.h \
+ xv6-user/user.h kernel/include/fcntl.h
diff --git a/xv6-user/ls.o b/xv6-user/ls.o
new file mode 100644
index 0000000000000000000000000000000000000000..3dfff6d31f8c91c54186c08e2a3c29ced00ae340
Binary files /dev/null and b/xv6-user/ls.o differ
diff --git a/xv6-user/ls.sym b/xv6-user/ls.sym
new file mode 100644
index 0000000000000000000000000000000000000000..f887c2b174ce7efa4a014ac4826b2f03c337fe6c
--- /dev/null
+++ b/xv6-user/ls.sym
@@ -0,0 +1,79 @@
+0000000000000000 .text
+0000000000000a08 .rodata
+0000000000000ae8 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 ls.c
+0000000000000ae8 buf.0
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+000000000000058a putc
+00000000000005ac printint
+0000000000000ad0 digits
+0000000000000000 umalloc.c
+0000000000000b10 freep
+0000000000000b18 base
+00000000000001e6 strcpy
+0000000000000000 fmtname
+0000000000000862 printf
+00000000000012e1 __global_pointer$
+0000000000000544 dev
+00000000000003ec memmove
+0000000000000568 trace
+00000000000002cc gets
+0000000000000ae1 __SDATA_BEGIN__
+000000000000051a getpid
+000000000000047e memcpy
+000000000000091a malloc
+000000000000055e remove
+000000000000052c sleep
+0000000000000570 sysinfo
+000000000000054e readdir
+00000000000004b0 pipe
+0000000000000578 rename
+00000000000004c4 write
+00000000000004f4 fstat
+0000000000000834 fprintf
+00000000000004d8 kill
+0000000000000202 strcat
+0000000000000656 vprintf
+0000000000000508 chdir
+00000000000004e0 exec
+00000000000004a8 wait
+00000000000004ba read
+0000000000000444 memcmp
+0000000000000496 fork
+0000000000000b28 __BSS_END__
+0000000000000524 sbrk
+000000000000053c test_proc
+0000000000000534 uptime
+0000000000000ae1 __bss_start
+0000000000000286 memset
+000000000000018c main
+0000000000000230 strcmp
+0000000000000580 shutdown
+0000000000000512 dup
+0000000000000556 getcwd
+0000000000000ae1 __DATA_BEGIN__
+0000000000000346 stat
+0000000000000ae1 _edata
+0000000000000b28 _end
+0000000000000066 ls
+000000000000049e exit
+000000000000038c atoi
+000000000000025c strlen
+00000000000004ea open
+00000000000002a8 strchr
+00000000000004fe mkdir
+00000000000004ce close
+0000000000000898 free
diff --git a/xv6-user/mkdir.asm b/xv6-user/mkdir.asm
new file mode 100644
index 0000000000000000000000000000000000000000..5148a707bda5f28e903250c14ee17d47461c2bbf
--- /dev/null
+++ b/xv6-user/mkdir.asm
@@ -0,0 +1,1451 @@
+
+xv6-user/_mkdir:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+   0:	7179                	addi	sp,sp,-48
+   2:	f406                	sd	ra,40(sp)
+   4:	f022                	sd	s0,32(sp)
+   6:	ec26                	sd	s1,24(sp)
+   8:	e84a                	sd	s2,16(sp)
+   a:	e44e                	sd	s3,8(sp)
+   c:	1800                	addi	s0,sp,48
+  int i;
+
+  if(argc < 2){
+   e:	4785                	li	a5,1
+  10:	02a7d763          	bge	a5,a0,3e <main+0x3e>
+  14:	00858493          	addi	s1,a1,8
+  18:	ffe5091b          	addiw	s2,a0,-2
+  1c:	02091793          	slli	a5,s2,0x20
+  20:	01d7d913          	srli	s2,a5,0x1d
+  24:	05c1                	addi	a1,a1,16
+  26:	992e                	add	s2,s2,a1
+    fprintf(2, "Usage: mkdir files...\n");
+    exit(1);
+  }
+
+  for(i = 1; i < argc; i++){
+    if(mkdir(argv[i]) < 0){
+  28:	6088                	ld	a0,0(s1)
+  2a:	00000097          	auipc	ra,0x0
+  2e:	366080e7          	jalr	870(ra) # 390 <mkdir>
+  32:	02054463          	bltz	a0,5a <main+0x5a>
+  for(i = 1; i < argc; i++){
+  36:	04a1                	addi	s1,s1,8
+  38:	ff2498e3          	bne	s1,s2,28 <main+0x28>
+  3c:	a80d                	j	6e <main+0x6e>
+    fprintf(2, "Usage: mkdir files...\n");
+  3e:	00001597          	auipc	a1,0x1
+  42:	85a58593          	addi	a1,a1,-1958 # 898 <malloc+0xec>
+  46:	4509                	li	a0,2
+  48:	00000097          	auipc	ra,0x0
+  4c:	67e080e7          	jalr	1662(ra) # 6c6 <fprintf>
+    exit(1);
+  50:	4505                	li	a0,1
+  52:	00000097          	auipc	ra,0x0
+  56:	2de080e7          	jalr	734(ra) # 330 <exit>
+      fprintf(2, "mkdir: %s failed to create\n", argv[i]);
+  5a:	6090                	ld	a2,0(s1)
+  5c:	00001597          	auipc	a1,0x1
+  60:	85458593          	addi	a1,a1,-1964 # 8b0 <malloc+0x104>
+  64:	4509                	li	a0,2
+  66:	00000097          	auipc	ra,0x0
+  6a:	660080e7          	jalr	1632(ra) # 6c6 <fprintf>
+      break;
+    }
+  }
+
+  exit(0);
+  6e:	4501                	li	a0,0
+  70:	00000097          	auipc	ra,0x0
+  74:	2c0080e7          	jalr	704(ra) # 330 <exit>
+
+0000000000000078 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+  78:	1141                	addi	sp,sp,-16
+  7a:	e422                	sd	s0,8(sp)
+  7c:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+  7e:	87aa                	mv	a5,a0
+  80:	0585                	addi	a1,a1,1
+  82:	0785                	addi	a5,a5,1
+  84:	fff5c703          	lbu	a4,-1(a1)
+  88:	fee78fa3          	sb	a4,-1(a5)
+  8c:	fb75                	bnez	a4,80 <strcpy+0x8>
+    ;
+  return os;
+}
+  8e:	6422                	ld	s0,8(sp)
+  90:	0141                	addi	sp,sp,16
+  92:	8082                	ret
+
+0000000000000094 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+  94:	1141                	addi	sp,sp,-16
+  96:	e422                	sd	s0,8(sp)
+  98:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+  9a:	00054783          	lbu	a5,0(a0)
+  9e:	c385                	beqz	a5,be <strcat+0x2a>
+  a0:	87aa                	mv	a5,a0
+    s++;
+  a2:	0785                	addi	a5,a5,1
+  while(*s)
+  a4:	0007c703          	lbu	a4,0(a5)
+  a8:	ff6d                	bnez	a4,a2 <strcat+0xe>
+  while((*s++ = *t++))
+  aa:	0585                	addi	a1,a1,1
+  ac:	0785                	addi	a5,a5,1
+  ae:	fff5c703          	lbu	a4,-1(a1)
+  b2:	fee78fa3          	sb	a4,-1(a5)
+  b6:	fb75                	bnez	a4,aa <strcat+0x16>
+    ;
+  return os;
+}
+  b8:	6422                	ld	s0,8(sp)
+  ba:	0141                	addi	sp,sp,16
+  bc:	8082                	ret
+  while(*s)
+  be:	87aa                	mv	a5,a0
+  c0:	b7ed                	j	aa <strcat+0x16>
+
+00000000000000c2 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+  c2:	1141                	addi	sp,sp,-16
+  c4:	e422                	sd	s0,8(sp)
+  c6:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+  c8:	00054783          	lbu	a5,0(a0)
+  cc:	cb91                	beqz	a5,e0 <strcmp+0x1e>
+  ce:	0005c703          	lbu	a4,0(a1)
+  d2:	00f71763          	bne	a4,a5,e0 <strcmp+0x1e>
+    p++, q++;
+  d6:	0505                	addi	a0,a0,1
+  d8:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+  da:	00054783          	lbu	a5,0(a0)
+  de:	fbe5                	bnez	a5,ce <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+  e0:	0005c503          	lbu	a0,0(a1)
+}
+  e4:	40a7853b          	subw	a0,a5,a0
+  e8:	6422                	ld	s0,8(sp)
+  ea:	0141                	addi	sp,sp,16
+  ec:	8082                	ret
+
+00000000000000ee <strlen>:
+
+uint
+strlen(const char *s)
+{
+  ee:	1141                	addi	sp,sp,-16
+  f0:	e422                	sd	s0,8(sp)
+  f2:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+  f4:	00054783          	lbu	a5,0(a0)
+  f8:	cf91                	beqz	a5,114 <strlen+0x26>
+  fa:	0505                	addi	a0,a0,1
+  fc:	87aa                	mv	a5,a0
+  fe:	4685                	li	a3,1
+ 100:	9e89                	subw	a3,a3,a0
+ 102:	00f6853b          	addw	a0,a3,a5
+ 106:	0785                	addi	a5,a5,1
+ 108:	fff7c703          	lbu	a4,-1(a5)
+ 10c:	fb7d                	bnez	a4,102 <strlen+0x14>
+    ;
+  return n;
+}
+ 10e:	6422                	ld	s0,8(sp)
+ 110:	0141                	addi	sp,sp,16
+ 112:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 114:	4501                	li	a0,0
+ 116:	bfe5                	j	10e <strlen+0x20>
+
+0000000000000118 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 118:	1141                	addi	sp,sp,-16
+ 11a:	e422                	sd	s0,8(sp)
+ 11c:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 11e:	ca19                	beqz	a2,134 <memset+0x1c>
+ 120:	87aa                	mv	a5,a0
+ 122:	1602                	slli	a2,a2,0x20
+ 124:	9201                	srli	a2,a2,0x20
+ 126:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 12a:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 12e:	0785                	addi	a5,a5,1
+ 130:	fee79de3          	bne	a5,a4,12a <memset+0x12>
+  }
+  return dst;
+}
+ 134:	6422                	ld	s0,8(sp)
+ 136:	0141                	addi	sp,sp,16
+ 138:	8082                	ret
+
+000000000000013a <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 13a:	1141                	addi	sp,sp,-16
+ 13c:	e422                	sd	s0,8(sp)
+ 13e:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 140:	00054783          	lbu	a5,0(a0)
+ 144:	cb99                	beqz	a5,15a <strchr+0x20>
+    if(*s == c)
+ 146:	00f58763          	beq	a1,a5,154 <strchr+0x1a>
+  for(; *s; s++)
+ 14a:	0505                	addi	a0,a0,1
+ 14c:	00054783          	lbu	a5,0(a0)
+ 150:	fbfd                	bnez	a5,146 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 152:	4501                	li	a0,0
+}
+ 154:	6422                	ld	s0,8(sp)
+ 156:	0141                	addi	sp,sp,16
+ 158:	8082                	ret
+  return 0;
+ 15a:	4501                	li	a0,0
+ 15c:	bfe5                	j	154 <strchr+0x1a>
+
+000000000000015e <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 15e:	711d                	addi	sp,sp,-96
+ 160:	ec86                	sd	ra,88(sp)
+ 162:	e8a2                	sd	s0,80(sp)
+ 164:	e4a6                	sd	s1,72(sp)
+ 166:	e0ca                	sd	s2,64(sp)
+ 168:	fc4e                	sd	s3,56(sp)
+ 16a:	f852                	sd	s4,48(sp)
+ 16c:	f456                	sd	s5,40(sp)
+ 16e:	f05a                	sd	s6,32(sp)
+ 170:	ec5e                	sd	s7,24(sp)
+ 172:	e862                	sd	s8,16(sp)
+ 174:	1080                	addi	s0,sp,96
+ 176:	8baa                	mv	s7,a0
+ 178:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 17a:	892a                	mv	s2,a0
+ 17c:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 17e:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 182:	4b29                	li	s6,10
+ 184:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 186:	89a6                	mv	s3,s1
+ 188:	2485                	addiw	s1,s1,1
+ 18a:	0344d763          	bge	s1,s4,1b8 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 18e:	4605                	li	a2,1
+ 190:	85d6                	mv	a1,s5
+ 192:	4501                	li	a0,0
+ 194:	00000097          	auipc	ra,0x0
+ 198:	1b8080e7          	jalr	440(ra) # 34c <read>
+    if(cc < 1)
+ 19c:	00a05e63          	blez	a0,1b8 <gets+0x5a>
+    buf[i++] = c;
+ 1a0:	faf44783          	lbu	a5,-81(s0)
+ 1a4:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 1a8:	01678763          	beq	a5,s6,1b6 <gets+0x58>
+ 1ac:	0905                	addi	s2,s2,1
+ 1ae:	fd879ce3          	bne	a5,s8,186 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 1b2:	89a6                	mv	s3,s1
+ 1b4:	a011                	j	1b8 <gets+0x5a>
+ 1b6:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 1b8:	99de                	add	s3,s3,s7
+ 1ba:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 1be:	855e                	mv	a0,s7
+ 1c0:	60e6                	ld	ra,88(sp)
+ 1c2:	6446                	ld	s0,80(sp)
+ 1c4:	64a6                	ld	s1,72(sp)
+ 1c6:	6906                	ld	s2,64(sp)
+ 1c8:	79e2                	ld	s3,56(sp)
+ 1ca:	7a42                	ld	s4,48(sp)
+ 1cc:	7aa2                	ld	s5,40(sp)
+ 1ce:	7b02                	ld	s6,32(sp)
+ 1d0:	6be2                	ld	s7,24(sp)
+ 1d2:	6c42                	ld	s8,16(sp)
+ 1d4:	6125                	addi	sp,sp,96
+ 1d6:	8082                	ret
+
+00000000000001d8 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 1d8:	1101                	addi	sp,sp,-32
+ 1da:	ec06                	sd	ra,24(sp)
+ 1dc:	e822                	sd	s0,16(sp)
+ 1de:	e426                	sd	s1,8(sp)
+ 1e0:	e04a                	sd	s2,0(sp)
+ 1e2:	1000                	addi	s0,sp,32
+ 1e4:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 1e6:	4581                	li	a1,0
+ 1e8:	00000097          	auipc	ra,0x0
+ 1ec:	194080e7          	jalr	404(ra) # 37c <open>
+  if(fd < 0)
+ 1f0:	02054563          	bltz	a0,21a <stat+0x42>
+ 1f4:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 1f6:	85ca                	mv	a1,s2
+ 1f8:	00000097          	auipc	ra,0x0
+ 1fc:	18e080e7          	jalr	398(ra) # 386 <fstat>
+ 200:	892a                	mv	s2,a0
+  close(fd);
+ 202:	8526                	mv	a0,s1
+ 204:	00000097          	auipc	ra,0x0
+ 208:	15c080e7          	jalr	348(ra) # 360 <close>
+  return r;
+}
+ 20c:	854a                	mv	a0,s2
+ 20e:	60e2                	ld	ra,24(sp)
+ 210:	6442                	ld	s0,16(sp)
+ 212:	64a2                	ld	s1,8(sp)
+ 214:	6902                	ld	s2,0(sp)
+ 216:	6105                	addi	sp,sp,32
+ 218:	8082                	ret
+    return -1;
+ 21a:	597d                	li	s2,-1
+ 21c:	bfc5                	j	20c <stat+0x34>
+
+000000000000021e <atoi>:
+
+int
+atoi(const char *s)
+{
+ 21e:	1141                	addi	sp,sp,-16
+ 220:	e422                	sd	s0,8(sp)
+ 222:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 224:	00054703          	lbu	a4,0(a0)
+ 228:	02d00793          	li	a5,45
+  int neg = 1;
+ 22c:	4585                	li	a1,1
+  if (*s == '-') {
+ 22e:	04f70363          	beq	a4,a5,274 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 232:	00054703          	lbu	a4,0(a0)
+ 236:	fd07079b          	addiw	a5,a4,-48
+ 23a:	0ff7f793          	zext.b	a5,a5
+ 23e:	46a5                	li	a3,9
+ 240:	02f6ed63          	bltu	a3,a5,27a <atoi+0x5c>
+  n = 0;
+ 244:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 246:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 248:	0505                	addi	a0,a0,1
+ 24a:	0026979b          	slliw	a5,a3,0x2
+ 24e:	9fb5                	addw	a5,a5,a3
+ 250:	0017979b          	slliw	a5,a5,0x1
+ 254:	9fb9                	addw	a5,a5,a4
+ 256:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 25a:	00054703          	lbu	a4,0(a0)
+ 25e:	fd07079b          	addiw	a5,a4,-48
+ 262:	0ff7f793          	zext.b	a5,a5
+ 266:	fef671e3          	bgeu	a2,a5,248 <atoi+0x2a>
+  return n * neg;
+}
+ 26a:	02d5853b          	mulw	a0,a1,a3
+ 26e:	6422                	ld	s0,8(sp)
+ 270:	0141                	addi	sp,sp,16
+ 272:	8082                	ret
+    s++;
+ 274:	0505                	addi	a0,a0,1
+    neg = -1;
+ 276:	55fd                	li	a1,-1
+ 278:	bf6d                	j	232 <atoi+0x14>
+  n = 0;
+ 27a:	4681                	li	a3,0
+ 27c:	b7fd                	j	26a <atoi+0x4c>
+
+000000000000027e <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 27e:	1141                	addi	sp,sp,-16
+ 280:	e422                	sd	s0,8(sp)
+ 282:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 284:	02b57463          	bgeu	a0,a1,2ac <memmove+0x2e>
+    while(n-- > 0)
+ 288:	00c05f63          	blez	a2,2a6 <memmove+0x28>
+ 28c:	1602                	slli	a2,a2,0x20
+ 28e:	9201                	srli	a2,a2,0x20
+ 290:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 294:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 296:	0585                	addi	a1,a1,1
+ 298:	0705                	addi	a4,a4,1
+ 29a:	fff5c683          	lbu	a3,-1(a1)
+ 29e:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 2a2:	fee79ae3          	bne	a5,a4,296 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 2a6:	6422                	ld	s0,8(sp)
+ 2a8:	0141                	addi	sp,sp,16
+ 2aa:	8082                	ret
+    dst += n;
+ 2ac:	00c50733          	add	a4,a0,a2
+    src += n;
+ 2b0:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 2b2:	fec05ae3          	blez	a2,2a6 <memmove+0x28>
+ 2b6:	fff6079b          	addiw	a5,a2,-1
+ 2ba:	1782                	slli	a5,a5,0x20
+ 2bc:	9381                	srli	a5,a5,0x20
+ 2be:	fff7c793          	not	a5,a5
+ 2c2:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 2c4:	15fd                	addi	a1,a1,-1
+ 2c6:	177d                	addi	a4,a4,-1
+ 2c8:	0005c683          	lbu	a3,0(a1)
+ 2cc:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 2d0:	fee79ae3          	bne	a5,a4,2c4 <memmove+0x46>
+ 2d4:	bfc9                	j	2a6 <memmove+0x28>
+
+00000000000002d6 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 2d6:	1141                	addi	sp,sp,-16
+ 2d8:	e422                	sd	s0,8(sp)
+ 2da:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 2dc:	ca05                	beqz	a2,30c <memcmp+0x36>
+ 2de:	fff6069b          	addiw	a3,a2,-1
+ 2e2:	1682                	slli	a3,a3,0x20
+ 2e4:	9281                	srli	a3,a3,0x20
+ 2e6:	0685                	addi	a3,a3,1
+ 2e8:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 2ea:	00054783          	lbu	a5,0(a0)
+ 2ee:	0005c703          	lbu	a4,0(a1)
+ 2f2:	00e79863          	bne	a5,a4,302 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 2f6:	0505                	addi	a0,a0,1
+    p2++;
+ 2f8:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 2fa:	fed518e3          	bne	a0,a3,2ea <memcmp+0x14>
+  }
+  return 0;
+ 2fe:	4501                	li	a0,0
+ 300:	a019                	j	306 <memcmp+0x30>
+      return *p1 - *p2;
+ 302:	40e7853b          	subw	a0,a5,a4
+}
+ 306:	6422                	ld	s0,8(sp)
+ 308:	0141                	addi	sp,sp,16
+ 30a:	8082                	ret
+  return 0;
+ 30c:	4501                	li	a0,0
+ 30e:	bfe5                	j	306 <memcmp+0x30>
+
+0000000000000310 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 310:	1141                	addi	sp,sp,-16
+ 312:	e406                	sd	ra,8(sp)
+ 314:	e022                	sd	s0,0(sp)
+ 316:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 318:	00000097          	auipc	ra,0x0
+ 31c:	f66080e7          	jalr	-154(ra) # 27e <memmove>
+}
+ 320:	60a2                	ld	ra,8(sp)
+ 322:	6402                	ld	s0,0(sp)
+ 324:	0141                	addi	sp,sp,16
+ 326:	8082                	ret
+
+0000000000000328 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 328:	4885                	li	a7,1
+ ecall
+ 32a:	00000073          	ecall
+ ret
+ 32e:	8082                	ret
+
+0000000000000330 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 330:	05d00893          	li	a7,93
+ ecall
+ 334:	00000073          	ecall
+ ret
+ 338:	8082                	ret
+
+000000000000033a <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 33a:	488d                	li	a7,3
+ ecall
+ 33c:	00000073          	ecall
+ ret
+ 340:	8082                	ret
+
+0000000000000342 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 342:	03b00893          	li	a7,59
+ ecall
+ 346:	00000073          	ecall
+ ret
+ 34a:	8082                	ret
+
+000000000000034c <read>:
+.global read
+read:
+ li a7, SYS_read
+ 34c:	03f00893          	li	a7,63
+ ecall
+ 350:	00000073          	ecall
+ ret
+ 354:	8082                	ret
+
+0000000000000356 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 356:	04000893          	li	a7,64
+ ecall
+ 35a:	00000073          	ecall
+ ret
+ 35e:	8082                	ret
+
+0000000000000360 <close>:
+.global close
+close:
+ li a7, SYS_close
+ 360:	03900893          	li	a7,57
+ ecall
+ 364:	00000073          	ecall
+ ret
+ 368:	8082                	ret
+
+000000000000036a <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 36a:	4899                	li	a7,6
+ ecall
+ 36c:	00000073          	ecall
+ ret
+ 370:	8082                	ret
+
+0000000000000372 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 372:	0dd00893          	li	a7,221
+ ecall
+ 376:	00000073          	ecall
+ ret
+ 37a:	8082                	ret
+
+000000000000037c <open>:
+.global open
+open:
+ li a7, SYS_open
+ 37c:	03800893          	li	a7,56
+ ecall
+ 380:	00000073          	ecall
+ ret
+ 384:	8082                	ret
+
+0000000000000386 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 386:	05000893          	li	a7,80
+ ecall
+ 38a:	00000073          	ecall
+ ret
+ 38e:	8082                	ret
+
+0000000000000390 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 390:	02200893          	li	a7,34
+ ecall
+ 394:	00000073          	ecall
+ ret
+ 398:	8082                	ret
+
+000000000000039a <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 39a:	03100893          	li	a7,49
+ ecall
+ 39e:	00000073          	ecall
+ ret
+ 3a2:	8082                	ret
+
+00000000000003a4 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 3a4:	48dd                	li	a7,23
+ ecall
+ 3a6:	00000073          	ecall
+ ret
+ 3aa:	8082                	ret
+
+00000000000003ac <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 3ac:	0ac00893          	li	a7,172
+ ecall
+ 3b0:	00000073          	ecall
+ ret
+ 3b4:	8082                	ret
+
+00000000000003b6 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 3b6:	48b1                	li	a7,12
+ ecall
+ 3b8:	00000073          	ecall
+ ret
+ 3bc:	8082                	ret
+
+00000000000003be <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 3be:	48b5                	li	a7,13
+ ecall
+ 3c0:	00000073          	ecall
+ ret
+ 3c4:	8082                	ret
+
+00000000000003c6 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 3c6:	48b9                	li	a7,14
+ ecall
+ 3c8:	00000073          	ecall
+ ret
+ 3cc:	8082                	ret
+
+00000000000003ce <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 3ce:	48d9                	li	a7,22
+ ecall
+ 3d0:	00000073          	ecall
+ ret
+ 3d4:	8082                	ret
+
+00000000000003d6 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 3d6:	03200893          	li	a7,50
+ ecall
+ 3da:	00000073          	ecall
+ ret
+ 3de:	8082                	ret
+
+00000000000003e0 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 3e0:	48ed                	li	a7,27
+ ecall
+ 3e2:	00000073          	ecall
+ ret
+ 3e6:	8082                	ret
+
+00000000000003e8 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 3e8:	48c5                	li	a7,17
+ ecall
+ 3ea:	00000073          	ecall
+ ret
+ 3ee:	8082                	ret
+
+00000000000003f0 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 3f0:	07500893          	li	a7,117
+ ecall
+ 3f4:	00000073          	ecall
+ ret
+ 3f8:	8082                	ret
+
+00000000000003fa <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 3fa:	48c9                	li	a7,18
+ ecall
+ 3fc:	00000073          	ecall
+ ret
+ 400:	8082                	ret
+
+0000000000000402 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 402:	48cd                	li	a7,19
+ ecall
+ 404:	00000073          	ecall
+ ret
+ 408:	8082                	ret
+
+000000000000040a <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 40a:	48e9                	li	a7,26
+ ecall
+ 40c:	00000073          	ecall
+ ret
+ 410:	8082                	ret
+
+0000000000000412 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 412:	0d200893          	li	a7,210
+ ecall
+ 416:	00000073          	ecall
+ ret
+ 41a:	8082                	ret
+
+000000000000041c <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 41c:	1101                	addi	sp,sp,-32
+ 41e:	ec06                	sd	ra,24(sp)
+ 420:	e822                	sd	s0,16(sp)
+ 422:	1000                	addi	s0,sp,32
+ 424:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 428:	4605                	li	a2,1
+ 42a:	fef40593          	addi	a1,s0,-17
+ 42e:	00000097          	auipc	ra,0x0
+ 432:	f28080e7          	jalr	-216(ra) # 356 <write>
+}
+ 436:	60e2                	ld	ra,24(sp)
+ 438:	6442                	ld	s0,16(sp)
+ 43a:	6105                	addi	sp,sp,32
+ 43c:	8082                	ret
+
+000000000000043e <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 43e:	7139                	addi	sp,sp,-64
+ 440:	fc06                	sd	ra,56(sp)
+ 442:	f822                	sd	s0,48(sp)
+ 444:	f426                	sd	s1,40(sp)
+ 446:	f04a                	sd	s2,32(sp)
+ 448:	ec4e                	sd	s3,24(sp)
+ 44a:	0080                	addi	s0,sp,64
+ 44c:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 44e:	c299                	beqz	a3,454 <printint+0x16>
+ 450:	0805c863          	bltz	a1,4e0 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 454:	2581                	sext.w	a1,a1
+  neg = 0;
+ 456:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 458:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 45c:	86ce                	mv	a3,s3
+  i = 0;
+ 45e:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 460:	2601                	sext.w	a2,a2
+ 462:	00000517          	auipc	a0,0x0
+ 466:	4ce50513          	addi	a0,a0,1230 # 930 <digits>
+ 46a:	883a                	mv	a6,a4
+ 46c:	2705                	addiw	a4,a4,1
+ 46e:	02c5f7bb          	remuw	a5,a1,a2
+ 472:	1782                	slli	a5,a5,0x20
+ 474:	9381                	srli	a5,a5,0x20
+ 476:	97aa                	add	a5,a5,a0
+ 478:	0007c783          	lbu	a5,0(a5)
+ 47c:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 480:	0005879b          	sext.w	a5,a1
+ 484:	02c5d5bb          	divuw	a1,a1,a2
+ 488:	0685                	addi	a3,a3,1
+ 48a:	fec7f0e3          	bgeu	a5,a2,46a <printint+0x2c>
+  if(neg)
+ 48e:	00088c63          	beqz	a7,4a6 <printint+0x68>
+    buf[i++] = '-';
+ 492:	fd070793          	addi	a5,a4,-48
+ 496:	00878733          	add	a4,a5,s0
+ 49a:	02d00793          	li	a5,45
+ 49e:	fef70823          	sb	a5,-16(a4)
+ 4a2:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 4a6:	02e05663          	blez	a4,4d2 <printint+0x94>
+ 4aa:	fc040913          	addi	s2,s0,-64
+ 4ae:	993a                	add	s2,s2,a4
+ 4b0:	19fd                	addi	s3,s3,-1
+ 4b2:	99ba                	add	s3,s3,a4
+ 4b4:	377d                	addiw	a4,a4,-1
+ 4b6:	1702                	slli	a4,a4,0x20
+ 4b8:	9301                	srli	a4,a4,0x20
+ 4ba:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 4be:	fff94583          	lbu	a1,-1(s2)
+ 4c2:	8526                	mv	a0,s1
+ 4c4:	00000097          	auipc	ra,0x0
+ 4c8:	f58080e7          	jalr	-168(ra) # 41c <putc>
+  while(--i >= 0)
+ 4cc:	197d                	addi	s2,s2,-1
+ 4ce:	ff3918e3          	bne	s2,s3,4be <printint+0x80>
+}
+ 4d2:	70e2                	ld	ra,56(sp)
+ 4d4:	7442                	ld	s0,48(sp)
+ 4d6:	74a2                	ld	s1,40(sp)
+ 4d8:	7902                	ld	s2,32(sp)
+ 4da:	69e2                	ld	s3,24(sp)
+ 4dc:	6121                	addi	sp,sp,64
+ 4de:	8082                	ret
+    x = -xx;
+ 4e0:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 4e4:	4885                	li	a7,1
+    x = -xx;
+ 4e6:	bf8d                	j	458 <printint+0x1a>
+
+00000000000004e8 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 4e8:	7119                	addi	sp,sp,-128
+ 4ea:	fc86                	sd	ra,120(sp)
+ 4ec:	f8a2                	sd	s0,112(sp)
+ 4ee:	f4a6                	sd	s1,104(sp)
+ 4f0:	f0ca                	sd	s2,96(sp)
+ 4f2:	ecce                	sd	s3,88(sp)
+ 4f4:	e8d2                	sd	s4,80(sp)
+ 4f6:	e4d6                	sd	s5,72(sp)
+ 4f8:	e0da                	sd	s6,64(sp)
+ 4fa:	fc5e                	sd	s7,56(sp)
+ 4fc:	f862                	sd	s8,48(sp)
+ 4fe:	f466                	sd	s9,40(sp)
+ 500:	f06a                	sd	s10,32(sp)
+ 502:	ec6e                	sd	s11,24(sp)
+ 504:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 506:	0005c903          	lbu	s2,0(a1)
+ 50a:	18090f63          	beqz	s2,6a8 <vprintf+0x1c0>
+ 50e:	8aaa                	mv	s5,a0
+ 510:	8b32                	mv	s6,a2
+ 512:	00158493          	addi	s1,a1,1
+  state = 0;
+ 516:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 518:	02500a13          	li	s4,37
+ 51c:	4c55                	li	s8,21
+ 51e:	00000c97          	auipc	s9,0x0
+ 522:	3bac8c93          	addi	s9,s9,954 # 8d8 <malloc+0x12c>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 526:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 52a:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 52c:	00000b97          	auipc	s7,0x0
+ 530:	404b8b93          	addi	s7,s7,1028 # 930 <digits>
+ 534:	a839                	j	552 <vprintf+0x6a>
+        putc(fd, c);
+ 536:	85ca                	mv	a1,s2
+ 538:	8556                	mv	a0,s5
+ 53a:	00000097          	auipc	ra,0x0
+ 53e:	ee2080e7          	jalr	-286(ra) # 41c <putc>
+ 542:	a019                	j	548 <vprintf+0x60>
+    } else if(state == '%'){
+ 544:	01498d63          	beq	s3,s4,55e <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 548:	0485                	addi	s1,s1,1
+ 54a:	fff4c903          	lbu	s2,-1(s1)
+ 54e:	14090d63          	beqz	s2,6a8 <vprintf+0x1c0>
+    if(state == 0){
+ 552:	fe0999e3          	bnez	s3,544 <vprintf+0x5c>
+      if(c == '%'){
+ 556:	ff4910e3          	bne	s2,s4,536 <vprintf+0x4e>
+        state = '%';
+ 55a:	89d2                	mv	s3,s4
+ 55c:	b7f5                	j	548 <vprintf+0x60>
+      if(c == 'd'){
+ 55e:	11490c63          	beq	s2,s4,676 <vprintf+0x18e>
+ 562:	f9d9079b          	addiw	a5,s2,-99
+ 566:	0ff7f793          	zext.b	a5,a5
+ 56a:	10fc6e63          	bltu	s8,a5,686 <vprintf+0x19e>
+ 56e:	f9d9079b          	addiw	a5,s2,-99
+ 572:	0ff7f713          	zext.b	a4,a5
+ 576:	10ec6863          	bltu	s8,a4,686 <vprintf+0x19e>
+ 57a:	00271793          	slli	a5,a4,0x2
+ 57e:	97e6                	add	a5,a5,s9
+ 580:	439c                	lw	a5,0(a5)
+ 582:	97e6                	add	a5,a5,s9
+ 584:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 586:	008b0913          	addi	s2,s6,8
+ 58a:	4685                	li	a3,1
+ 58c:	4629                	li	a2,10
+ 58e:	000b2583          	lw	a1,0(s6)
+ 592:	8556                	mv	a0,s5
+ 594:	00000097          	auipc	ra,0x0
+ 598:	eaa080e7          	jalr	-342(ra) # 43e <printint>
+ 59c:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 59e:	4981                	li	s3,0
+ 5a0:	b765                	j	548 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 5a2:	008b0913          	addi	s2,s6,8
+ 5a6:	4681                	li	a3,0
+ 5a8:	4629                	li	a2,10
+ 5aa:	000b2583          	lw	a1,0(s6)
+ 5ae:	8556                	mv	a0,s5
+ 5b0:	00000097          	auipc	ra,0x0
+ 5b4:	e8e080e7          	jalr	-370(ra) # 43e <printint>
+ 5b8:	8b4a                	mv	s6,s2
+      state = 0;
+ 5ba:	4981                	li	s3,0
+ 5bc:	b771                	j	548 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 5be:	008b0913          	addi	s2,s6,8
+ 5c2:	4681                	li	a3,0
+ 5c4:	866a                	mv	a2,s10
+ 5c6:	000b2583          	lw	a1,0(s6)
+ 5ca:	8556                	mv	a0,s5
+ 5cc:	00000097          	auipc	ra,0x0
+ 5d0:	e72080e7          	jalr	-398(ra) # 43e <printint>
+ 5d4:	8b4a                	mv	s6,s2
+      state = 0;
+ 5d6:	4981                	li	s3,0
+ 5d8:	bf85                	j	548 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 5da:	008b0793          	addi	a5,s6,8
+ 5de:	f8f43423          	sd	a5,-120(s0)
+ 5e2:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 5e6:	03000593          	li	a1,48
+ 5ea:	8556                	mv	a0,s5
+ 5ec:	00000097          	auipc	ra,0x0
+ 5f0:	e30080e7          	jalr	-464(ra) # 41c <putc>
+  putc(fd, 'x');
+ 5f4:	07800593          	li	a1,120
+ 5f8:	8556                	mv	a0,s5
+ 5fa:	00000097          	auipc	ra,0x0
+ 5fe:	e22080e7          	jalr	-478(ra) # 41c <putc>
+ 602:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 604:	03c9d793          	srli	a5,s3,0x3c
+ 608:	97de                	add	a5,a5,s7
+ 60a:	0007c583          	lbu	a1,0(a5)
+ 60e:	8556                	mv	a0,s5
+ 610:	00000097          	auipc	ra,0x0
+ 614:	e0c080e7          	jalr	-500(ra) # 41c <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 618:	0992                	slli	s3,s3,0x4
+ 61a:	397d                	addiw	s2,s2,-1
+ 61c:	fe0914e3          	bnez	s2,604 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 620:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 624:	4981                	li	s3,0
+ 626:	b70d                	j	548 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 628:	008b0913          	addi	s2,s6,8
+ 62c:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 630:	02098163          	beqz	s3,652 <vprintf+0x16a>
+        while(*s != 0){
+ 634:	0009c583          	lbu	a1,0(s3)
+ 638:	c5ad                	beqz	a1,6a2 <vprintf+0x1ba>
+          putc(fd, *s);
+ 63a:	8556                	mv	a0,s5
+ 63c:	00000097          	auipc	ra,0x0
+ 640:	de0080e7          	jalr	-544(ra) # 41c <putc>
+          s++;
+ 644:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 646:	0009c583          	lbu	a1,0(s3)
+ 64a:	f9e5                	bnez	a1,63a <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 64c:	8b4a                	mv	s6,s2
+      state = 0;
+ 64e:	4981                	li	s3,0
+ 650:	bde5                	j	548 <vprintf+0x60>
+          s = "(null)";
+ 652:	00000997          	auipc	s3,0x0
+ 656:	27e98993          	addi	s3,s3,638 # 8d0 <malloc+0x124>
+        while(*s != 0){
+ 65a:	85ee                	mv	a1,s11
+ 65c:	bff9                	j	63a <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 65e:	008b0913          	addi	s2,s6,8
+ 662:	000b4583          	lbu	a1,0(s6)
+ 666:	8556                	mv	a0,s5
+ 668:	00000097          	auipc	ra,0x0
+ 66c:	db4080e7          	jalr	-588(ra) # 41c <putc>
+ 670:	8b4a                	mv	s6,s2
+      state = 0;
+ 672:	4981                	li	s3,0
+ 674:	bdd1                	j	548 <vprintf+0x60>
+        putc(fd, c);
+ 676:	85d2                	mv	a1,s4
+ 678:	8556                	mv	a0,s5
+ 67a:	00000097          	auipc	ra,0x0
+ 67e:	da2080e7          	jalr	-606(ra) # 41c <putc>
+      state = 0;
+ 682:	4981                	li	s3,0
+ 684:	b5d1                	j	548 <vprintf+0x60>
+        putc(fd, '%');
+ 686:	85d2                	mv	a1,s4
+ 688:	8556                	mv	a0,s5
+ 68a:	00000097          	auipc	ra,0x0
+ 68e:	d92080e7          	jalr	-622(ra) # 41c <putc>
+        putc(fd, c);
+ 692:	85ca                	mv	a1,s2
+ 694:	8556                	mv	a0,s5
+ 696:	00000097          	auipc	ra,0x0
+ 69a:	d86080e7          	jalr	-634(ra) # 41c <putc>
+      state = 0;
+ 69e:	4981                	li	s3,0
+ 6a0:	b565                	j	548 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 6a2:	8b4a                	mv	s6,s2
+      state = 0;
+ 6a4:	4981                	li	s3,0
+ 6a6:	b54d                	j	548 <vprintf+0x60>
+    }
+  }
+}
+ 6a8:	70e6                	ld	ra,120(sp)
+ 6aa:	7446                	ld	s0,112(sp)
+ 6ac:	74a6                	ld	s1,104(sp)
+ 6ae:	7906                	ld	s2,96(sp)
+ 6b0:	69e6                	ld	s3,88(sp)
+ 6b2:	6a46                	ld	s4,80(sp)
+ 6b4:	6aa6                	ld	s5,72(sp)
+ 6b6:	6b06                	ld	s6,64(sp)
+ 6b8:	7be2                	ld	s7,56(sp)
+ 6ba:	7c42                	ld	s8,48(sp)
+ 6bc:	7ca2                	ld	s9,40(sp)
+ 6be:	7d02                	ld	s10,32(sp)
+ 6c0:	6de2                	ld	s11,24(sp)
+ 6c2:	6109                	addi	sp,sp,128
+ 6c4:	8082                	ret
+
+00000000000006c6 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 6c6:	715d                	addi	sp,sp,-80
+ 6c8:	ec06                	sd	ra,24(sp)
+ 6ca:	e822                	sd	s0,16(sp)
+ 6cc:	1000                	addi	s0,sp,32
+ 6ce:	e010                	sd	a2,0(s0)
+ 6d0:	e414                	sd	a3,8(s0)
+ 6d2:	e818                	sd	a4,16(s0)
+ 6d4:	ec1c                	sd	a5,24(s0)
+ 6d6:	03043023          	sd	a6,32(s0)
+ 6da:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6de:	8622                	mv	a2,s0
+ 6e0:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 6e4:	00000097          	auipc	ra,0x0
+ 6e8:	e04080e7          	jalr	-508(ra) # 4e8 <vprintf>
+}
+ 6ec:	60e2                	ld	ra,24(sp)
+ 6ee:	6442                	ld	s0,16(sp)
+ 6f0:	6161                	addi	sp,sp,80
+ 6f2:	8082                	ret
+
+00000000000006f4 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 6f4:	711d                	addi	sp,sp,-96
+ 6f6:	ec06                	sd	ra,24(sp)
+ 6f8:	e822                	sd	s0,16(sp)
+ 6fa:	1000                	addi	s0,sp,32
+ 6fc:	e40c                	sd	a1,8(s0)
+ 6fe:	e810                	sd	a2,16(s0)
+ 700:	ec14                	sd	a3,24(s0)
+ 702:	f018                	sd	a4,32(s0)
+ 704:	f41c                	sd	a5,40(s0)
+ 706:	03043823          	sd	a6,48(s0)
+ 70a:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 70e:	00840613          	addi	a2,s0,8
+ 712:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 716:	85aa                	mv	a1,a0
+ 718:	4505                	li	a0,1
+ 71a:	00000097          	auipc	ra,0x0
+ 71e:	dce080e7          	jalr	-562(ra) # 4e8 <vprintf>
+}
+ 722:	60e2                	ld	ra,24(sp)
+ 724:	6442                	ld	s0,16(sp)
+ 726:	6125                	addi	sp,sp,96
+ 728:	8082                	ret
+
+000000000000072a <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 72a:	1141                	addi	sp,sp,-16
+ 72c:	e422                	sd	s0,8(sp)
+ 72e:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 730:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 734:	00000797          	auipc	a5,0x0
+ 738:	2147b783          	ld	a5,532(a5) # 948 <freep>
+ 73c:	a02d                	j	766 <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;
+ 73e:	4618                	lw	a4,8(a2)
+ 740:	9f2d                	addw	a4,a4,a1
+ 742:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 746:	6398                	ld	a4,0(a5)
+ 748:	6310                	ld	a2,0(a4)
+ 74a:	a83d                	j	788 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 74c:	ff852703          	lw	a4,-8(a0)
+ 750:	9f31                	addw	a4,a4,a2
+ 752:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 754:	ff053683          	ld	a3,-16(a0)
+ 758:	a091                	j	79c <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 75a:	6398                	ld	a4,0(a5)
+ 75c:	00e7e463          	bltu	a5,a4,764 <free+0x3a>
+ 760:	00e6ea63          	bltu	a3,a4,774 <free+0x4a>
+{
+ 764:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 766:	fed7fae3          	bgeu	a5,a3,75a <free+0x30>
+ 76a:	6398                	ld	a4,0(a5)
+ 76c:	00e6e463          	bltu	a3,a4,774 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 770:	fee7eae3          	bltu	a5,a4,764 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 774:	ff852583          	lw	a1,-8(a0)
+ 778:	6390                	ld	a2,0(a5)
+ 77a:	02059813          	slli	a6,a1,0x20
+ 77e:	01c85713          	srli	a4,a6,0x1c
+ 782:	9736                	add	a4,a4,a3
+ 784:	fae60de3          	beq	a2,a4,73e <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 788:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 78c:	4790                	lw	a2,8(a5)
+ 78e:	02061593          	slli	a1,a2,0x20
+ 792:	01c5d713          	srli	a4,a1,0x1c
+ 796:	973e                	add	a4,a4,a5
+ 798:	fae68ae3          	beq	a3,a4,74c <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 79c:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 79e:	00000717          	auipc	a4,0x0
+ 7a2:	1af73523          	sd	a5,426(a4) # 948 <freep>
+}
+ 7a6:	6422                	ld	s0,8(sp)
+ 7a8:	0141                	addi	sp,sp,16
+ 7aa:	8082                	ret
+
+00000000000007ac <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 7ac:	7139                	addi	sp,sp,-64
+ 7ae:	fc06                	sd	ra,56(sp)
+ 7b0:	f822                	sd	s0,48(sp)
+ 7b2:	f426                	sd	s1,40(sp)
+ 7b4:	f04a                	sd	s2,32(sp)
+ 7b6:	ec4e                	sd	s3,24(sp)
+ 7b8:	e852                	sd	s4,16(sp)
+ 7ba:	e456                	sd	s5,8(sp)
+ 7bc:	e05a                	sd	s6,0(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:	00148a1b          	addiw	s4,s1,1
+ 7ce:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 7d0:	00000517          	auipc	a0,0x0
+ 7d4:	17853503          	ld	a0,376(a0) # 948 <freep>
+ 7d8:	c515                	beqz	a0,804 <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:	04977163          	bgeu	a4,s1,820 <malloc+0x74>
+ 7e2:	89d2                	mv	s3,s4
+ 7e4:	000a071b          	sext.w	a4,s4
+ 7e8:	6685                	lui	a3,0x1
+ 7ea:	00d77363          	bgeu	a4,a3,7f0 <malloc+0x44>
+ 7ee:	6985                	lui	s3,0x1
+ 7f0:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 7f4:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 7f8:	00000917          	auipc	s2,0x0
+ 7fc:	15090913          	addi	s2,s2,336 # 948 <freep>
+  if(p == (char*)-1)
+ 800:	5afd                	li	s5,-1
+ 802:	a8a5                	j	87a <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 804:	00000797          	auipc	a5,0x0
+ 808:	14478793          	addi	a5,a5,324 # 948 <freep>
+ 80c:	00000717          	auipc	a4,0x0
+ 810:	14470713          	addi	a4,a4,324 # 950 <base>
+ 814:	e398                	sd	a4,0(a5)
+ 816:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 818:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 81c:	87ba                	mv	a5,a4
+ 81e:	b7d1                	j	7e2 <malloc+0x36>
+      if(p->s.size == nunits)
+ 820:	02e48c63          	beq	s1,a4,858 <malloc+0xac>
+        p->s.size -= nunits;
+ 824:	4147073b          	subw	a4,a4,s4
+ 828:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 82a:	02071693          	slli	a3,a4,0x20
+ 82e:	01c6d713          	srli	a4,a3,0x1c
+ 832:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 834:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 838:	00000717          	auipc	a4,0x0
+ 83c:	10a73823          	sd	a0,272(a4) # 948 <freep>
+      return (void*)(p + 1);
+ 840:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 844:	70e2                	ld	ra,56(sp)
+ 846:	7442                	ld	s0,48(sp)
+ 848:	74a2                	ld	s1,40(sp)
+ 84a:	7902                	ld	s2,32(sp)
+ 84c:	69e2                	ld	s3,24(sp)
+ 84e:	6a42                	ld	s4,16(sp)
+ 850:	6aa2                	ld	s5,8(sp)
+ 852:	6b02                	ld	s6,0(sp)
+ 854:	6121                	addi	sp,sp,64
+ 856:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 858:	6398                	ld	a4,0(a5)
+ 85a:	e118                	sd	a4,0(a0)
+ 85c:	bff1                	j	838 <malloc+0x8c>
+  hp->s.size = nu;
+ 85e:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 862:	0541                	addi	a0,a0,16
+ 864:	00000097          	auipc	ra,0x0
+ 868:	ec6080e7          	jalr	-314(ra) # 72a <free>
+  return freep;
+ 86c:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 870:	d971                	beqz	a0,844 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 872:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 874:	4798                	lw	a4,8(a5)
+ 876:	fa9775e3          	bgeu	a4,s1,820 <malloc+0x74>
+    if(p == freep)
+ 87a:	00093703          	ld	a4,0(s2)
+ 87e:	853e                	mv	a0,a5
+ 880:	fef719e3          	bne	a4,a5,872 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 884:	854e                	mv	a0,s3
+ 886:	00000097          	auipc	ra,0x0
+ 88a:	b30080e7          	jalr	-1232(ra) # 3b6 <sbrk>
+  if(p == (char*)-1)
+ 88e:	fd5518e3          	bne	a0,s5,85e <malloc+0xb2>
+        return 0;
+ 892:	4501                	li	a0,0
+ 894:	bf45                	j	844 <malloc+0x98>
diff --git a/xv6-user/mkdir.c b/xv6-user/mkdir.c
new file mode 100644
index 0000000000000000000000000000000000000000..86f7a094cd66e1895c15e5a0aac0c966cae3472a
--- /dev/null
+++ b/xv6-user/mkdir.c
@@ -0,0 +1,23 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+  int i;
+
+  if(argc < 2){
+    fprintf(2, "Usage: mkdir files...\n");
+    exit(1);
+  }
+
+  for(i = 1; i < argc; i++){
+    if(mkdir(argv[i]) < 0){
+      fprintf(2, "mkdir: %s failed to create\n", argv[i]);
+      break;
+    }
+  }
+
+  exit(0);
+}
diff --git a/xv6-user/mkdir.d b/xv6-user/mkdir.d
new file mode 100644
index 0000000000000000000000000000000000000000..0b5064af0e804f9410f848d4eb974b392bf7cdf3
--- /dev/null
+++ b/xv6-user/mkdir.d
@@ -0,0 +1,2 @@
+xv6-user/mkdir.o: xv6-user/mkdir.c kernel/include/types.h \
+ kernel/include/stat.h xv6-user/user.h kernel/include/fcntl.h
diff --git a/xv6-user/mkdir.o b/xv6-user/mkdir.o
new file mode 100644
index 0000000000000000000000000000000000000000..90ad3ecc02ddce9024c90f4b6c54b779db29ab27
Binary files /dev/null and b/xv6-user/mkdir.o differ
diff --git a/xv6-user/mkdir.sym b/xv6-user/mkdir.sym
new file mode 100644
index 0000000000000000000000000000000000000000..9b71bf6fbb28f7c2b74ca5b8f5ae33a58b6d7fe6
--- /dev/null
+++ b/xv6-user/mkdir.sym
@@ -0,0 +1,76 @@
+0000000000000000 .text
+0000000000000898 .rodata
+0000000000000948 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 mkdir.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+000000000000041c putc
+000000000000043e printint
+0000000000000930 digits
+0000000000000000 umalloc.c
+0000000000000948 freep
+0000000000000950 base
+0000000000000078 strcpy
+00000000000006f4 printf
+0000000000001141 __global_pointer$
+00000000000003d6 dev
+000000000000027e memmove
+00000000000003fa trace
+000000000000015e gets
+0000000000000941 __SDATA_BEGIN__
+00000000000003ac getpid
+0000000000000310 memcpy
+00000000000007ac malloc
+00000000000003f0 remove
+00000000000003be sleep
+0000000000000402 sysinfo
+00000000000003e0 readdir
+0000000000000342 pipe
+000000000000040a rename
+0000000000000356 write
+0000000000000386 fstat
+00000000000006c6 fprintf
+000000000000036a kill
+0000000000000094 strcat
+00000000000004e8 vprintf
+000000000000039a chdir
+0000000000000372 exec
+000000000000033a wait
+000000000000034c read
+00000000000002d6 memcmp
+0000000000000328 fork
+0000000000000960 __BSS_END__
+00000000000003b6 sbrk
+00000000000003ce test_proc
+00000000000003c6 uptime
+0000000000000941 __bss_start
+0000000000000118 memset
+0000000000000000 main
+00000000000000c2 strcmp
+0000000000000412 shutdown
+00000000000003a4 dup
+00000000000003e8 getcwd
+0000000000000941 __DATA_BEGIN__
+00000000000001d8 stat
+0000000000000941 _edata
+0000000000000960 _end
+0000000000000330 exit
+000000000000021e atoi
+00000000000000ee strlen
+000000000000037c open
+000000000000013a strchr
+0000000000000390 mkdir
+0000000000000360 close
+000000000000072a free
diff --git a/xv6-user/mv.asm b/xv6-user/mv.asm
new file mode 100644
index 0000000000000000000000000000000000000000..802866423db066174d833dd6fae6d0aab1fecb36
--- /dev/null
+++ b/xv6-user/mv.asm
@@ -0,0 +1,1569 @@
+
+xv6-user/_mv:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+#include "kernel/include/fcntl.h"
+#include "kernel/include/param.h"
+#include "xv6-user/user.h"
+
+int main(int argc, char *argv[])
+{
+   0:	d9010113          	addi	sp,sp,-624
+   4:	26113423          	sd	ra,616(sp)
+   8:	26813023          	sd	s0,608(sp)
+   c:	24913c23          	sd	s1,600(sp)
+  10:	25213823          	sd	s2,592(sp)
+  14:	1c80                	addi	s0,sp,624
+    if (argc < 3) {
+  16:	4789                	li	a5,2
+  18:	02a7c063          	blt	a5,a0,38 <main+0x38>
+        fprintf(2, "Usage: mv old_name new_name\n");
+  1c:	00001597          	auipc	a1,0x1
+  20:	9ac58593          	addi	a1,a1,-1620 # 9c8 <malloc+0xea>
+  24:	4509                	li	a0,2
+  26:	00000097          	auipc	ra,0x0
+  2a:	7d2080e7          	jalr	2002(ra) # 7f8 <fprintf>
+        exit(1);
+  2e:	4505                	li	a0,1
+  30:	00000097          	auipc	ra,0x0
+  34:	432080e7          	jalr	1074(ra) # 462 <exit>
+  38:	84ae                	mv	s1,a1
+    }
+
+    char src[MAXPATH];
+    char dst[MAXPATH];
+    strcpy(src, argv[1]);
+  3a:	658c                	ld	a1,8(a1)
+  3c:	ed840513          	addi	a0,s0,-296
+  40:	00000097          	auipc	ra,0x0
+  44:	16a080e7          	jalr	362(ra) # 1aa <strcpy>
+    strcpy(dst, argv[2]);
+  48:	688c                	ld	a1,16(s1)
+  4a:	dd040493          	addi	s1,s0,-560
+  4e:	8526                	mv	a0,s1
+  50:	00000097          	auipc	ra,0x0
+  54:	15a080e7          	jalr	346(ra) # 1aa <strcpy>
+    int fd = open(dst, O_RDONLY);
+  58:	4581                	li	a1,0
+  5a:	8526                	mv	a0,s1
+  5c:	00000097          	auipc	ra,0x0
+  60:	452080e7          	jalr	1106(ra) # 4ae <open>
+  64:	84aa                	mv	s1,a0
+    if (fd >= 0) {
+  66:	0e054763          	bltz	a0,154 <main+0x154>
+        struct stat st;
+        fstat(fd, &st);
+  6a:	d9840593          	addi	a1,s0,-616
+  6e:	00000097          	auipc	ra,0x0
+  72:	44a080e7          	jalr	1098(ra) # 4b8 <fstat>
+        close(fd);
+  76:	8526                	mv	a0,s1
+  78:	00000097          	auipc	ra,0x0
+  7c:	41a080e7          	jalr	1050(ra) # 492 <close>
+        if (st.type == T_DIR) {
+  80:	dc041703          	lh	a4,-576(s0)
+  84:	4785                	li	a5,1
+  86:	02f70263          	beq	a4,a5,aa <main+0xaa>
+                    fprintf(2, "mv: fail! final dst path too long (exceed MAX=%d)!\n", MAXPATH);
+                    exit(-1);
+                }
+            }
+        } else {
+            fprintf(2, "mv: fail! %s exists!\n", dst);
+  8a:	dd040613          	addi	a2,s0,-560
+  8e:	00001597          	auipc	a1,0x1
+  92:	99258593          	addi	a1,a1,-1646 # a20 <malloc+0x142>
+  96:	4509                	li	a0,2
+  98:	00000097          	auipc	ra,0x0
+  9c:	760080e7          	jalr	1888(ra) # 7f8 <fprintf>
+            exit(-1);
+  a0:	557d                	li	a0,-1
+  a2:	00000097          	auipc	ra,0x0
+  a6:	3c0080e7          	jalr	960(ra) # 462 <exit>
+            for (ps = src + strlen(src) - 1; ps >= src; ps--) { // trim '/' in tail
+  aa:	ed840493          	addi	s1,s0,-296
+  ae:	8526                	mv	a0,s1
+  b0:	00000097          	auipc	ra,0x0
+  b4:	170080e7          	jalr	368(ra) # 220 <strlen>
+  b8:	02051793          	slli	a5,a0,0x20
+  bc:	9381                	srli	a5,a5,0x20
+  be:	17fd                	addi	a5,a5,-1
+  c0:	97a6                	add	a5,a5,s1
+  c2:	0297ec63          	bltu	a5,s1,fa <main+0xfa>
+                if (*ps != '/') {
+  c6:	02f00693          	li	a3,47
+            for (ps = src + strlen(src) - 1; ps >= src; ps--) { // trim '/' in tail
+  ca:	8626                	mv	a2,s1
+                if (*ps != '/') {
+  cc:	0007c703          	lbu	a4,0(a5)
+  d0:	00d71663          	bne	a4,a3,dc <main+0xdc>
+            for (ps = src + strlen(src) - 1; ps >= src; ps--) { // trim '/' in tail
+  d4:	17fd                	addi	a5,a5,-1
+  d6:	fec7fbe3          	bgeu	a5,a2,cc <main+0xcc>
+  da:	a005                	j	fa <main+0xfa>
+                    *(ps + 1) = '\0';
+  dc:	000780a3          	sb	zero,1(a5)
+            for (; ps >= src && *ps != '/'; ps--);
+  e0:	02f00693          	li	a3,47
+  e4:	ed840613          	addi	a2,s0,-296
+  e8:	00c7e963          	bltu	a5,a2,fa <main+0xfa>
+  ec:	0007c703          	lbu	a4,0(a5)
+  f0:	00d70563          	beq	a4,a3,fa <main+0xfa>
+  f4:	17fd                	addi	a5,a5,-1
+  f6:	fec7fbe3          	bgeu	a5,a2,ec <main+0xec>
+            ps++;
+  fa:	00178493          	addi	s1,a5,1
+            pd = dst + strlen(dst);
+  fe:	dd040913          	addi	s2,s0,-560
+ 102:	854a                	mv	a0,s2
+ 104:	00000097          	auipc	ra,0x0
+ 108:	11c080e7          	jalr	284(ra) # 220 <strlen>
+ 10c:	1502                	slli	a0,a0,0x20
+ 10e:	9101                	srli	a0,a0,0x20
+ 110:	992a                	add	s2,s2,a0
+            *pd++ = '/';
+ 112:	00190793          	addi	a5,s2,1
+ 116:	02f00713          	li	a4,47
+ 11a:	00e90023          	sb	a4,0(s2)
+                if (pd >= dst + MAXPATH) {
+ 11e:	ed440693          	addi	a3,s0,-300
+            while (*ps) {
+ 122:	0004c703          	lbu	a4,0(s1)
+ 126:	c71d                	beqz	a4,154 <main+0x154>
+                *pd++ = *ps++;
+ 128:	0485                	addi	s1,s1,1
+ 12a:	0785                	addi	a5,a5,1
+ 12c:	fee78fa3          	sb	a4,-1(a5)
+                if (pd >= dst + MAXPATH) {
+ 130:	fed7e9e3          	bltu	a5,a3,122 <main+0x122>
+                    fprintf(2, "mv: fail! final dst path too long (exceed MAX=%d)!\n", MAXPATH);
+ 134:	10400613          	li	a2,260
+ 138:	00001597          	auipc	a1,0x1
+ 13c:	8b058593          	addi	a1,a1,-1872 # 9e8 <malloc+0x10a>
+ 140:	4509                	li	a0,2
+ 142:	00000097          	auipc	ra,0x0
+ 146:	6b6080e7          	jalr	1718(ra) # 7f8 <fprintf>
+                    exit(-1);
+ 14a:	557d                	li	a0,-1
+ 14c:	00000097          	auipc	ra,0x0
+ 150:	316080e7          	jalr	790(ra) # 462 <exit>
+        }
+    }
+    printf("moving [%s] to [%s]\n", src, dst);
+ 154:	dd040913          	addi	s2,s0,-560
+ 158:	864a                	mv	a2,s2
+ 15a:	ed840493          	addi	s1,s0,-296
+ 15e:	85a6                	mv	a1,s1
+ 160:	00001517          	auipc	a0,0x1
+ 164:	8d850513          	addi	a0,a0,-1832 # a38 <malloc+0x15a>
+ 168:	00000097          	auipc	ra,0x0
+ 16c:	6be080e7          	jalr	1726(ra) # 826 <printf>
+    if (rename(src, dst) < 0) {
+ 170:	85ca                	mv	a1,s2
+ 172:	8526                	mv	a0,s1
+ 174:	00000097          	auipc	ra,0x0
+ 178:	3c8080e7          	jalr	968(ra) # 53c <rename>
+ 17c:	00054763          	bltz	a0,18a <main+0x18a>
+        fprintf(2, "mv: fail to rename %s to %s!\n", src, dst);
+        exit(-1);
+    }
+    exit(0);
+ 180:	4501                	li	a0,0
+ 182:	00000097          	auipc	ra,0x0
+ 186:	2e0080e7          	jalr	736(ra) # 462 <exit>
+        fprintf(2, "mv: fail to rename %s to %s!\n", src, dst);
+ 18a:	86ca                	mv	a3,s2
+ 18c:	8626                	mv	a2,s1
+ 18e:	00001597          	auipc	a1,0x1
+ 192:	8c258593          	addi	a1,a1,-1854 # a50 <malloc+0x172>
+ 196:	4509                	li	a0,2
+ 198:	00000097          	auipc	ra,0x0
+ 19c:	660080e7          	jalr	1632(ra) # 7f8 <fprintf>
+        exit(-1);
+ 1a0:	557d                	li	a0,-1
+ 1a2:	00000097          	auipc	ra,0x0
+ 1a6:	2c0080e7          	jalr	704(ra) # 462 <exit>
+
+00000000000001aa <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+ 1aa:	1141                	addi	sp,sp,-16
+ 1ac:	e422                	sd	s0,8(sp)
+ 1ae:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+ 1b0:	87aa                	mv	a5,a0
+ 1b2:	0585                	addi	a1,a1,1
+ 1b4:	0785                	addi	a5,a5,1
+ 1b6:	fff5c703          	lbu	a4,-1(a1)
+ 1ba:	fee78fa3          	sb	a4,-1(a5)
+ 1be:	fb75                	bnez	a4,1b2 <strcpy+0x8>
+    ;
+  return os;
+}
+ 1c0:	6422                	ld	s0,8(sp)
+ 1c2:	0141                	addi	sp,sp,16
+ 1c4:	8082                	ret
+
+00000000000001c6 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+ 1c6:	1141                	addi	sp,sp,-16
+ 1c8:	e422                	sd	s0,8(sp)
+ 1ca:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+ 1cc:	00054783          	lbu	a5,0(a0)
+ 1d0:	c385                	beqz	a5,1f0 <strcat+0x2a>
+ 1d2:	87aa                	mv	a5,a0
+    s++;
+ 1d4:	0785                	addi	a5,a5,1
+  while(*s)
+ 1d6:	0007c703          	lbu	a4,0(a5)
+ 1da:	ff6d                	bnez	a4,1d4 <strcat+0xe>
+  while((*s++ = *t++))
+ 1dc:	0585                	addi	a1,a1,1
+ 1de:	0785                	addi	a5,a5,1
+ 1e0:	fff5c703          	lbu	a4,-1(a1)
+ 1e4:	fee78fa3          	sb	a4,-1(a5)
+ 1e8:	fb75                	bnez	a4,1dc <strcat+0x16>
+    ;
+  return os;
+}
+ 1ea:	6422                	ld	s0,8(sp)
+ 1ec:	0141                	addi	sp,sp,16
+ 1ee:	8082                	ret
+  while(*s)
+ 1f0:	87aa                	mv	a5,a0
+ 1f2:	b7ed                	j	1dc <strcat+0x16>
+
+00000000000001f4 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+ 1f4:	1141                	addi	sp,sp,-16
+ 1f6:	e422                	sd	s0,8(sp)
+ 1f8:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+ 1fa:	00054783          	lbu	a5,0(a0)
+ 1fe:	cb91                	beqz	a5,212 <strcmp+0x1e>
+ 200:	0005c703          	lbu	a4,0(a1)
+ 204:	00f71763          	bne	a4,a5,212 <strcmp+0x1e>
+    p++, q++;
+ 208:	0505                	addi	a0,a0,1
+ 20a:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+ 20c:	00054783          	lbu	a5,0(a0)
+ 210:	fbe5                	bnez	a5,200 <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+ 212:	0005c503          	lbu	a0,0(a1)
+}
+ 216:	40a7853b          	subw	a0,a5,a0
+ 21a:	6422                	ld	s0,8(sp)
+ 21c:	0141                	addi	sp,sp,16
+ 21e:	8082                	ret
+
+0000000000000220 <strlen>:
+
+uint
+strlen(const char *s)
+{
+ 220:	1141                	addi	sp,sp,-16
+ 222:	e422                	sd	s0,8(sp)
+ 224:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 226:	00054783          	lbu	a5,0(a0)
+ 22a:	cf91                	beqz	a5,246 <strlen+0x26>
+ 22c:	0505                	addi	a0,a0,1
+ 22e:	87aa                	mv	a5,a0
+ 230:	4685                	li	a3,1
+ 232:	9e89                	subw	a3,a3,a0
+ 234:	00f6853b          	addw	a0,a3,a5
+ 238:	0785                	addi	a5,a5,1
+ 23a:	fff7c703          	lbu	a4,-1(a5)
+ 23e:	fb7d                	bnez	a4,234 <strlen+0x14>
+    ;
+  return n;
+}
+ 240:	6422                	ld	s0,8(sp)
+ 242:	0141                	addi	sp,sp,16
+ 244:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 246:	4501                	li	a0,0
+ 248:	bfe5                	j	240 <strlen+0x20>
+
+000000000000024a <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 24a:	1141                	addi	sp,sp,-16
+ 24c:	e422                	sd	s0,8(sp)
+ 24e:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 250:	ca19                	beqz	a2,266 <memset+0x1c>
+ 252:	87aa                	mv	a5,a0
+ 254:	1602                	slli	a2,a2,0x20
+ 256:	9201                	srli	a2,a2,0x20
+ 258:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 25c:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 260:	0785                	addi	a5,a5,1
+ 262:	fee79de3          	bne	a5,a4,25c <memset+0x12>
+  }
+  return dst;
+}
+ 266:	6422                	ld	s0,8(sp)
+ 268:	0141                	addi	sp,sp,16
+ 26a:	8082                	ret
+
+000000000000026c <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 26c:	1141                	addi	sp,sp,-16
+ 26e:	e422                	sd	s0,8(sp)
+ 270:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 272:	00054783          	lbu	a5,0(a0)
+ 276:	cb99                	beqz	a5,28c <strchr+0x20>
+    if(*s == c)
+ 278:	00f58763          	beq	a1,a5,286 <strchr+0x1a>
+  for(; *s; s++)
+ 27c:	0505                	addi	a0,a0,1
+ 27e:	00054783          	lbu	a5,0(a0)
+ 282:	fbfd                	bnez	a5,278 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 284:	4501                	li	a0,0
+}
+ 286:	6422                	ld	s0,8(sp)
+ 288:	0141                	addi	sp,sp,16
+ 28a:	8082                	ret
+  return 0;
+ 28c:	4501                	li	a0,0
+ 28e:	bfe5                	j	286 <strchr+0x1a>
+
+0000000000000290 <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 290:	711d                	addi	sp,sp,-96
+ 292:	ec86                	sd	ra,88(sp)
+ 294:	e8a2                	sd	s0,80(sp)
+ 296:	e4a6                	sd	s1,72(sp)
+ 298:	e0ca                	sd	s2,64(sp)
+ 29a:	fc4e                	sd	s3,56(sp)
+ 29c:	f852                	sd	s4,48(sp)
+ 29e:	f456                	sd	s5,40(sp)
+ 2a0:	f05a                	sd	s6,32(sp)
+ 2a2:	ec5e                	sd	s7,24(sp)
+ 2a4:	e862                	sd	s8,16(sp)
+ 2a6:	1080                	addi	s0,sp,96
+ 2a8:	8baa                	mv	s7,a0
+ 2aa:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 2ac:	892a                	mv	s2,a0
+ 2ae:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 2b0:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 2b4:	4b29                	li	s6,10
+ 2b6:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 2b8:	89a6                	mv	s3,s1
+ 2ba:	2485                	addiw	s1,s1,1
+ 2bc:	0344d763          	bge	s1,s4,2ea <gets+0x5a>
+    cc = read(0, &c, 1);
+ 2c0:	4605                	li	a2,1
+ 2c2:	85d6                	mv	a1,s5
+ 2c4:	4501                	li	a0,0
+ 2c6:	00000097          	auipc	ra,0x0
+ 2ca:	1b8080e7          	jalr	440(ra) # 47e <read>
+    if(cc < 1)
+ 2ce:	00a05e63          	blez	a0,2ea <gets+0x5a>
+    buf[i++] = c;
+ 2d2:	faf44783          	lbu	a5,-81(s0)
+ 2d6:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 2da:	01678763          	beq	a5,s6,2e8 <gets+0x58>
+ 2de:	0905                	addi	s2,s2,1
+ 2e0:	fd879ce3          	bne	a5,s8,2b8 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 2e4:	89a6                	mv	s3,s1
+ 2e6:	a011                	j	2ea <gets+0x5a>
+ 2e8:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 2ea:	99de                	add	s3,s3,s7
+ 2ec:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 2f0:	855e                	mv	a0,s7
+ 2f2:	60e6                	ld	ra,88(sp)
+ 2f4:	6446                	ld	s0,80(sp)
+ 2f6:	64a6                	ld	s1,72(sp)
+ 2f8:	6906                	ld	s2,64(sp)
+ 2fa:	79e2                	ld	s3,56(sp)
+ 2fc:	7a42                	ld	s4,48(sp)
+ 2fe:	7aa2                	ld	s5,40(sp)
+ 300:	7b02                	ld	s6,32(sp)
+ 302:	6be2                	ld	s7,24(sp)
+ 304:	6c42                	ld	s8,16(sp)
+ 306:	6125                	addi	sp,sp,96
+ 308:	8082                	ret
+
+000000000000030a <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 30a:	1101                	addi	sp,sp,-32
+ 30c:	ec06                	sd	ra,24(sp)
+ 30e:	e822                	sd	s0,16(sp)
+ 310:	e426                	sd	s1,8(sp)
+ 312:	e04a                	sd	s2,0(sp)
+ 314:	1000                	addi	s0,sp,32
+ 316:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 318:	4581                	li	a1,0
+ 31a:	00000097          	auipc	ra,0x0
+ 31e:	194080e7          	jalr	404(ra) # 4ae <open>
+  if(fd < 0)
+ 322:	02054563          	bltz	a0,34c <stat+0x42>
+ 326:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 328:	85ca                	mv	a1,s2
+ 32a:	00000097          	auipc	ra,0x0
+ 32e:	18e080e7          	jalr	398(ra) # 4b8 <fstat>
+ 332:	892a                	mv	s2,a0
+  close(fd);
+ 334:	8526                	mv	a0,s1
+ 336:	00000097          	auipc	ra,0x0
+ 33a:	15c080e7          	jalr	348(ra) # 492 <close>
+  return r;
+}
+ 33e:	854a                	mv	a0,s2
+ 340:	60e2                	ld	ra,24(sp)
+ 342:	6442                	ld	s0,16(sp)
+ 344:	64a2                	ld	s1,8(sp)
+ 346:	6902                	ld	s2,0(sp)
+ 348:	6105                	addi	sp,sp,32
+ 34a:	8082                	ret
+    return -1;
+ 34c:	597d                	li	s2,-1
+ 34e:	bfc5                	j	33e <stat+0x34>
+
+0000000000000350 <atoi>:
+
+int
+atoi(const char *s)
+{
+ 350:	1141                	addi	sp,sp,-16
+ 352:	e422                	sd	s0,8(sp)
+ 354:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 356:	00054703          	lbu	a4,0(a0)
+ 35a:	02d00793          	li	a5,45
+  int neg = 1;
+ 35e:	4585                	li	a1,1
+  if (*s == '-') {
+ 360:	04f70363          	beq	a4,a5,3a6 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 364:	00054703          	lbu	a4,0(a0)
+ 368:	fd07079b          	addiw	a5,a4,-48
+ 36c:	0ff7f793          	zext.b	a5,a5
+ 370:	46a5                	li	a3,9
+ 372:	02f6ed63          	bltu	a3,a5,3ac <atoi+0x5c>
+  n = 0;
+ 376:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 378:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 37a:	0505                	addi	a0,a0,1
+ 37c:	0026979b          	slliw	a5,a3,0x2
+ 380:	9fb5                	addw	a5,a5,a3
+ 382:	0017979b          	slliw	a5,a5,0x1
+ 386:	9fb9                	addw	a5,a5,a4
+ 388:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 38c:	00054703          	lbu	a4,0(a0)
+ 390:	fd07079b          	addiw	a5,a4,-48
+ 394:	0ff7f793          	zext.b	a5,a5
+ 398:	fef671e3          	bgeu	a2,a5,37a <atoi+0x2a>
+  return n * neg;
+}
+ 39c:	02d5853b          	mulw	a0,a1,a3
+ 3a0:	6422                	ld	s0,8(sp)
+ 3a2:	0141                	addi	sp,sp,16
+ 3a4:	8082                	ret
+    s++;
+ 3a6:	0505                	addi	a0,a0,1
+    neg = -1;
+ 3a8:	55fd                	li	a1,-1
+ 3aa:	bf6d                	j	364 <atoi+0x14>
+  n = 0;
+ 3ac:	4681                	li	a3,0
+ 3ae:	b7fd                	j	39c <atoi+0x4c>
+
+00000000000003b0 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 3b0:	1141                	addi	sp,sp,-16
+ 3b2:	e422                	sd	s0,8(sp)
+ 3b4:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 3b6:	02b57463          	bgeu	a0,a1,3de <memmove+0x2e>
+    while(n-- > 0)
+ 3ba:	00c05f63          	blez	a2,3d8 <memmove+0x28>
+ 3be:	1602                	slli	a2,a2,0x20
+ 3c0:	9201                	srli	a2,a2,0x20
+ 3c2:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 3c6:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 3c8:	0585                	addi	a1,a1,1
+ 3ca:	0705                	addi	a4,a4,1
+ 3cc:	fff5c683          	lbu	a3,-1(a1)
+ 3d0:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 3d4:	fee79ae3          	bne	a5,a4,3c8 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 3d8:	6422                	ld	s0,8(sp)
+ 3da:	0141                	addi	sp,sp,16
+ 3dc:	8082                	ret
+    dst += n;
+ 3de:	00c50733          	add	a4,a0,a2
+    src += n;
+ 3e2:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 3e4:	fec05ae3          	blez	a2,3d8 <memmove+0x28>
+ 3e8:	fff6079b          	addiw	a5,a2,-1
+ 3ec:	1782                	slli	a5,a5,0x20
+ 3ee:	9381                	srli	a5,a5,0x20
+ 3f0:	fff7c793          	not	a5,a5
+ 3f4:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 3f6:	15fd                	addi	a1,a1,-1
+ 3f8:	177d                	addi	a4,a4,-1
+ 3fa:	0005c683          	lbu	a3,0(a1)
+ 3fe:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 402:	fee79ae3          	bne	a5,a4,3f6 <memmove+0x46>
+ 406:	bfc9                	j	3d8 <memmove+0x28>
+
+0000000000000408 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 408:	1141                	addi	sp,sp,-16
+ 40a:	e422                	sd	s0,8(sp)
+ 40c:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 40e:	ca05                	beqz	a2,43e <memcmp+0x36>
+ 410:	fff6069b          	addiw	a3,a2,-1
+ 414:	1682                	slli	a3,a3,0x20
+ 416:	9281                	srli	a3,a3,0x20
+ 418:	0685                	addi	a3,a3,1
+ 41a:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 41c:	00054783          	lbu	a5,0(a0)
+ 420:	0005c703          	lbu	a4,0(a1)
+ 424:	00e79863          	bne	a5,a4,434 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 428:	0505                	addi	a0,a0,1
+    p2++;
+ 42a:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 42c:	fed518e3          	bne	a0,a3,41c <memcmp+0x14>
+  }
+  return 0;
+ 430:	4501                	li	a0,0
+ 432:	a019                	j	438 <memcmp+0x30>
+      return *p1 - *p2;
+ 434:	40e7853b          	subw	a0,a5,a4
+}
+ 438:	6422                	ld	s0,8(sp)
+ 43a:	0141                	addi	sp,sp,16
+ 43c:	8082                	ret
+  return 0;
+ 43e:	4501                	li	a0,0
+ 440:	bfe5                	j	438 <memcmp+0x30>
+
+0000000000000442 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 442:	1141                	addi	sp,sp,-16
+ 444:	e406                	sd	ra,8(sp)
+ 446:	e022                	sd	s0,0(sp)
+ 448:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 44a:	00000097          	auipc	ra,0x0
+ 44e:	f66080e7          	jalr	-154(ra) # 3b0 <memmove>
+}
+ 452:	60a2                	ld	ra,8(sp)
+ 454:	6402                	ld	s0,0(sp)
+ 456:	0141                	addi	sp,sp,16
+ 458:	8082                	ret
+
+000000000000045a <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 45a:	4885                	li	a7,1
+ ecall
+ 45c:	00000073          	ecall
+ ret
+ 460:	8082                	ret
+
+0000000000000462 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 462:	05d00893          	li	a7,93
+ ecall
+ 466:	00000073          	ecall
+ ret
+ 46a:	8082                	ret
+
+000000000000046c <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 46c:	488d                	li	a7,3
+ ecall
+ 46e:	00000073          	ecall
+ ret
+ 472:	8082                	ret
+
+0000000000000474 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 474:	03b00893          	li	a7,59
+ ecall
+ 478:	00000073          	ecall
+ ret
+ 47c:	8082                	ret
+
+000000000000047e <read>:
+.global read
+read:
+ li a7, SYS_read
+ 47e:	03f00893          	li	a7,63
+ ecall
+ 482:	00000073          	ecall
+ ret
+ 486:	8082                	ret
+
+0000000000000488 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 488:	04000893          	li	a7,64
+ ecall
+ 48c:	00000073          	ecall
+ ret
+ 490:	8082                	ret
+
+0000000000000492 <close>:
+.global close
+close:
+ li a7, SYS_close
+ 492:	03900893          	li	a7,57
+ ecall
+ 496:	00000073          	ecall
+ ret
+ 49a:	8082                	ret
+
+000000000000049c <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 49c:	4899                	li	a7,6
+ ecall
+ 49e:	00000073          	ecall
+ ret
+ 4a2:	8082                	ret
+
+00000000000004a4 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 4a4:	0dd00893          	li	a7,221
+ ecall
+ 4a8:	00000073          	ecall
+ ret
+ 4ac:	8082                	ret
+
+00000000000004ae <open>:
+.global open
+open:
+ li a7, SYS_open
+ 4ae:	03800893          	li	a7,56
+ ecall
+ 4b2:	00000073          	ecall
+ ret
+ 4b6:	8082                	ret
+
+00000000000004b8 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 4b8:	05000893          	li	a7,80
+ ecall
+ 4bc:	00000073          	ecall
+ ret
+ 4c0:	8082                	ret
+
+00000000000004c2 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 4c2:	02200893          	li	a7,34
+ ecall
+ 4c6:	00000073          	ecall
+ ret
+ 4ca:	8082                	ret
+
+00000000000004cc <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 4cc:	03100893          	li	a7,49
+ ecall
+ 4d0:	00000073          	ecall
+ ret
+ 4d4:	8082                	ret
+
+00000000000004d6 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 4d6:	48dd                	li	a7,23
+ ecall
+ 4d8:	00000073          	ecall
+ ret
+ 4dc:	8082                	ret
+
+00000000000004de <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 4de:	0ac00893          	li	a7,172
+ ecall
+ 4e2:	00000073          	ecall
+ ret
+ 4e6:	8082                	ret
+
+00000000000004e8 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 4e8:	48b1                	li	a7,12
+ ecall
+ 4ea:	00000073          	ecall
+ ret
+ 4ee:	8082                	ret
+
+00000000000004f0 <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 4f0:	48b5                	li	a7,13
+ ecall
+ 4f2:	00000073          	ecall
+ ret
+ 4f6:	8082                	ret
+
+00000000000004f8 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 4f8:	48b9                	li	a7,14
+ ecall
+ 4fa:	00000073          	ecall
+ ret
+ 4fe:	8082                	ret
+
+0000000000000500 <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 500:	48d9                	li	a7,22
+ ecall
+ 502:	00000073          	ecall
+ ret
+ 506:	8082                	ret
+
+0000000000000508 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 508:	03200893          	li	a7,50
+ ecall
+ 50c:	00000073          	ecall
+ ret
+ 510:	8082                	ret
+
+0000000000000512 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 512:	48ed                	li	a7,27
+ ecall
+ 514:	00000073          	ecall
+ ret
+ 518:	8082                	ret
+
+000000000000051a <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 51a:	48c5                	li	a7,17
+ ecall
+ 51c:	00000073          	ecall
+ ret
+ 520:	8082                	ret
+
+0000000000000522 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 522:	07500893          	li	a7,117
+ ecall
+ 526:	00000073          	ecall
+ ret
+ 52a:	8082                	ret
+
+000000000000052c <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 52c:	48c9                	li	a7,18
+ ecall
+ 52e:	00000073          	ecall
+ ret
+ 532:	8082                	ret
+
+0000000000000534 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 534:	48cd                	li	a7,19
+ ecall
+ 536:	00000073          	ecall
+ ret
+ 53a:	8082                	ret
+
+000000000000053c <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 53c:	48e9                	li	a7,26
+ ecall
+ 53e:	00000073          	ecall
+ ret
+ 542:	8082                	ret
+
+0000000000000544 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 544:	0d200893          	li	a7,210
+ ecall
+ 548:	00000073          	ecall
+ ret
+ 54c:	8082                	ret
+
+000000000000054e <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 54e:	1101                	addi	sp,sp,-32
+ 550:	ec06                	sd	ra,24(sp)
+ 552:	e822                	sd	s0,16(sp)
+ 554:	1000                	addi	s0,sp,32
+ 556:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 55a:	4605                	li	a2,1
+ 55c:	fef40593          	addi	a1,s0,-17
+ 560:	00000097          	auipc	ra,0x0
+ 564:	f28080e7          	jalr	-216(ra) # 488 <write>
+}
+ 568:	60e2                	ld	ra,24(sp)
+ 56a:	6442                	ld	s0,16(sp)
+ 56c:	6105                	addi	sp,sp,32
+ 56e:	8082                	ret
+
+0000000000000570 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 570:	7139                	addi	sp,sp,-64
+ 572:	fc06                	sd	ra,56(sp)
+ 574:	f822                	sd	s0,48(sp)
+ 576:	f426                	sd	s1,40(sp)
+ 578:	f04a                	sd	s2,32(sp)
+ 57a:	ec4e                	sd	s3,24(sp)
+ 57c:	0080                	addi	s0,sp,64
+ 57e:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 580:	c299                	beqz	a3,586 <printint+0x16>
+ 582:	0805c863          	bltz	a1,612 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 586:	2581                	sext.w	a1,a1
+  neg = 0;
+ 588:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 58a:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 58e:	86ce                	mv	a3,s3
+  i = 0;
+ 590:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 592:	2601                	sext.w	a2,a2
+ 594:	00000517          	auipc	a0,0x0
+ 598:	53c50513          	addi	a0,a0,1340 # ad0 <digits>
+ 59c:	883a                	mv	a6,a4
+ 59e:	2705                	addiw	a4,a4,1
+ 5a0:	02c5f7bb          	remuw	a5,a1,a2
+ 5a4:	1782                	slli	a5,a5,0x20
+ 5a6:	9381                	srli	a5,a5,0x20
+ 5a8:	97aa                	add	a5,a5,a0
+ 5aa:	0007c783          	lbu	a5,0(a5)
+ 5ae:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 5b2:	0005879b          	sext.w	a5,a1
+ 5b6:	02c5d5bb          	divuw	a1,a1,a2
+ 5ba:	0685                	addi	a3,a3,1
+ 5bc:	fec7f0e3          	bgeu	a5,a2,59c <printint+0x2c>
+  if(neg)
+ 5c0:	00088c63          	beqz	a7,5d8 <printint+0x68>
+    buf[i++] = '-';
+ 5c4:	fd070793          	addi	a5,a4,-48
+ 5c8:	00878733          	add	a4,a5,s0
+ 5cc:	02d00793          	li	a5,45
+ 5d0:	fef70823          	sb	a5,-16(a4)
+ 5d4:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 5d8:	02e05663          	blez	a4,604 <printint+0x94>
+ 5dc:	fc040913          	addi	s2,s0,-64
+ 5e0:	993a                	add	s2,s2,a4
+ 5e2:	19fd                	addi	s3,s3,-1
+ 5e4:	99ba                	add	s3,s3,a4
+ 5e6:	377d                	addiw	a4,a4,-1
+ 5e8:	1702                	slli	a4,a4,0x20
+ 5ea:	9301                	srli	a4,a4,0x20
+ 5ec:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 5f0:	fff94583          	lbu	a1,-1(s2)
+ 5f4:	8526                	mv	a0,s1
+ 5f6:	00000097          	auipc	ra,0x0
+ 5fa:	f58080e7          	jalr	-168(ra) # 54e <putc>
+  while(--i >= 0)
+ 5fe:	197d                	addi	s2,s2,-1
+ 600:	ff3918e3          	bne	s2,s3,5f0 <printint+0x80>
+}
+ 604:	70e2                	ld	ra,56(sp)
+ 606:	7442                	ld	s0,48(sp)
+ 608:	74a2                	ld	s1,40(sp)
+ 60a:	7902                	ld	s2,32(sp)
+ 60c:	69e2                	ld	s3,24(sp)
+ 60e:	6121                	addi	sp,sp,64
+ 610:	8082                	ret
+    x = -xx;
+ 612:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 616:	4885                	li	a7,1
+    x = -xx;
+ 618:	bf8d                	j	58a <printint+0x1a>
+
+000000000000061a <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 61a:	7119                	addi	sp,sp,-128
+ 61c:	fc86                	sd	ra,120(sp)
+ 61e:	f8a2                	sd	s0,112(sp)
+ 620:	f4a6                	sd	s1,104(sp)
+ 622:	f0ca                	sd	s2,96(sp)
+ 624:	ecce                	sd	s3,88(sp)
+ 626:	e8d2                	sd	s4,80(sp)
+ 628:	e4d6                	sd	s5,72(sp)
+ 62a:	e0da                	sd	s6,64(sp)
+ 62c:	fc5e                	sd	s7,56(sp)
+ 62e:	f862                	sd	s8,48(sp)
+ 630:	f466                	sd	s9,40(sp)
+ 632:	f06a                	sd	s10,32(sp)
+ 634:	ec6e                	sd	s11,24(sp)
+ 636:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 638:	0005c903          	lbu	s2,0(a1)
+ 63c:	18090f63          	beqz	s2,7da <vprintf+0x1c0>
+ 640:	8aaa                	mv	s5,a0
+ 642:	8b32                	mv	s6,a2
+ 644:	00158493          	addi	s1,a1,1
+  state = 0;
+ 648:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 64a:	02500a13          	li	s4,37
+ 64e:	4c55                	li	s8,21
+ 650:	00000c97          	auipc	s9,0x0
+ 654:	428c8c93          	addi	s9,s9,1064 # a78 <malloc+0x19a>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 658:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 65c:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 65e:	00000b97          	auipc	s7,0x0
+ 662:	472b8b93          	addi	s7,s7,1138 # ad0 <digits>
+ 666:	a839                	j	684 <vprintf+0x6a>
+        putc(fd, c);
+ 668:	85ca                	mv	a1,s2
+ 66a:	8556                	mv	a0,s5
+ 66c:	00000097          	auipc	ra,0x0
+ 670:	ee2080e7          	jalr	-286(ra) # 54e <putc>
+ 674:	a019                	j	67a <vprintf+0x60>
+    } else if(state == '%'){
+ 676:	01498d63          	beq	s3,s4,690 <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 67a:	0485                	addi	s1,s1,1
+ 67c:	fff4c903          	lbu	s2,-1(s1)
+ 680:	14090d63          	beqz	s2,7da <vprintf+0x1c0>
+    if(state == 0){
+ 684:	fe0999e3          	bnez	s3,676 <vprintf+0x5c>
+      if(c == '%'){
+ 688:	ff4910e3          	bne	s2,s4,668 <vprintf+0x4e>
+        state = '%';
+ 68c:	89d2                	mv	s3,s4
+ 68e:	b7f5                	j	67a <vprintf+0x60>
+      if(c == 'd'){
+ 690:	11490c63          	beq	s2,s4,7a8 <vprintf+0x18e>
+ 694:	f9d9079b          	addiw	a5,s2,-99
+ 698:	0ff7f793          	zext.b	a5,a5
+ 69c:	10fc6e63          	bltu	s8,a5,7b8 <vprintf+0x19e>
+ 6a0:	f9d9079b          	addiw	a5,s2,-99
+ 6a4:	0ff7f713          	zext.b	a4,a5
+ 6a8:	10ec6863          	bltu	s8,a4,7b8 <vprintf+0x19e>
+ 6ac:	00271793          	slli	a5,a4,0x2
+ 6b0:	97e6                	add	a5,a5,s9
+ 6b2:	439c                	lw	a5,0(a5)
+ 6b4:	97e6                	add	a5,a5,s9
+ 6b6:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 6b8:	008b0913          	addi	s2,s6,8
+ 6bc:	4685                	li	a3,1
+ 6be:	4629                	li	a2,10
+ 6c0:	000b2583          	lw	a1,0(s6)
+ 6c4:	8556                	mv	a0,s5
+ 6c6:	00000097          	auipc	ra,0x0
+ 6ca:	eaa080e7          	jalr	-342(ra) # 570 <printint>
+ 6ce:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 6d0:	4981                	li	s3,0
+ 6d2:	b765                	j	67a <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 6d4:	008b0913          	addi	s2,s6,8
+ 6d8:	4681                	li	a3,0
+ 6da:	4629                	li	a2,10
+ 6dc:	000b2583          	lw	a1,0(s6)
+ 6e0:	8556                	mv	a0,s5
+ 6e2:	00000097          	auipc	ra,0x0
+ 6e6:	e8e080e7          	jalr	-370(ra) # 570 <printint>
+ 6ea:	8b4a                	mv	s6,s2
+      state = 0;
+ 6ec:	4981                	li	s3,0
+ 6ee:	b771                	j	67a <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 6f0:	008b0913          	addi	s2,s6,8
+ 6f4:	4681                	li	a3,0
+ 6f6:	866a                	mv	a2,s10
+ 6f8:	000b2583          	lw	a1,0(s6)
+ 6fc:	8556                	mv	a0,s5
+ 6fe:	00000097          	auipc	ra,0x0
+ 702:	e72080e7          	jalr	-398(ra) # 570 <printint>
+ 706:	8b4a                	mv	s6,s2
+      state = 0;
+ 708:	4981                	li	s3,0
+ 70a:	bf85                	j	67a <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 70c:	008b0793          	addi	a5,s6,8
+ 710:	f8f43423          	sd	a5,-120(s0)
+ 714:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 718:	03000593          	li	a1,48
+ 71c:	8556                	mv	a0,s5
+ 71e:	00000097          	auipc	ra,0x0
+ 722:	e30080e7          	jalr	-464(ra) # 54e <putc>
+  putc(fd, 'x');
+ 726:	07800593          	li	a1,120
+ 72a:	8556                	mv	a0,s5
+ 72c:	00000097          	auipc	ra,0x0
+ 730:	e22080e7          	jalr	-478(ra) # 54e <putc>
+ 734:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 736:	03c9d793          	srli	a5,s3,0x3c
+ 73a:	97de                	add	a5,a5,s7
+ 73c:	0007c583          	lbu	a1,0(a5)
+ 740:	8556                	mv	a0,s5
+ 742:	00000097          	auipc	ra,0x0
+ 746:	e0c080e7          	jalr	-500(ra) # 54e <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 74a:	0992                	slli	s3,s3,0x4
+ 74c:	397d                	addiw	s2,s2,-1
+ 74e:	fe0914e3          	bnez	s2,736 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 752:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 756:	4981                	li	s3,0
+ 758:	b70d                	j	67a <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 75a:	008b0913          	addi	s2,s6,8
+ 75e:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 762:	02098163          	beqz	s3,784 <vprintf+0x16a>
+        while(*s != 0){
+ 766:	0009c583          	lbu	a1,0(s3)
+ 76a:	c5ad                	beqz	a1,7d4 <vprintf+0x1ba>
+          putc(fd, *s);
+ 76c:	8556                	mv	a0,s5
+ 76e:	00000097          	auipc	ra,0x0
+ 772:	de0080e7          	jalr	-544(ra) # 54e <putc>
+          s++;
+ 776:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 778:	0009c583          	lbu	a1,0(s3)
+ 77c:	f9e5                	bnez	a1,76c <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 77e:	8b4a                	mv	s6,s2
+      state = 0;
+ 780:	4981                	li	s3,0
+ 782:	bde5                	j	67a <vprintf+0x60>
+          s = "(null)";
+ 784:	00000997          	auipc	s3,0x0
+ 788:	2ec98993          	addi	s3,s3,748 # a70 <malloc+0x192>
+        while(*s != 0){
+ 78c:	85ee                	mv	a1,s11
+ 78e:	bff9                	j	76c <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 790:	008b0913          	addi	s2,s6,8
+ 794:	000b4583          	lbu	a1,0(s6)
+ 798:	8556                	mv	a0,s5
+ 79a:	00000097          	auipc	ra,0x0
+ 79e:	db4080e7          	jalr	-588(ra) # 54e <putc>
+ 7a2:	8b4a                	mv	s6,s2
+      state = 0;
+ 7a4:	4981                	li	s3,0
+ 7a6:	bdd1                	j	67a <vprintf+0x60>
+        putc(fd, c);
+ 7a8:	85d2                	mv	a1,s4
+ 7aa:	8556                	mv	a0,s5
+ 7ac:	00000097          	auipc	ra,0x0
+ 7b0:	da2080e7          	jalr	-606(ra) # 54e <putc>
+      state = 0;
+ 7b4:	4981                	li	s3,0
+ 7b6:	b5d1                	j	67a <vprintf+0x60>
+        putc(fd, '%');
+ 7b8:	85d2                	mv	a1,s4
+ 7ba:	8556                	mv	a0,s5
+ 7bc:	00000097          	auipc	ra,0x0
+ 7c0:	d92080e7          	jalr	-622(ra) # 54e <putc>
+        putc(fd, c);
+ 7c4:	85ca                	mv	a1,s2
+ 7c6:	8556                	mv	a0,s5
+ 7c8:	00000097          	auipc	ra,0x0
+ 7cc:	d86080e7          	jalr	-634(ra) # 54e <putc>
+      state = 0;
+ 7d0:	4981                	li	s3,0
+ 7d2:	b565                	j	67a <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 7d4:	8b4a                	mv	s6,s2
+      state = 0;
+ 7d6:	4981                	li	s3,0
+ 7d8:	b54d                	j	67a <vprintf+0x60>
+    }
+  }
+}
+ 7da:	70e6                	ld	ra,120(sp)
+ 7dc:	7446                	ld	s0,112(sp)
+ 7de:	74a6                	ld	s1,104(sp)
+ 7e0:	7906                	ld	s2,96(sp)
+ 7e2:	69e6                	ld	s3,88(sp)
+ 7e4:	6a46                	ld	s4,80(sp)
+ 7e6:	6aa6                	ld	s5,72(sp)
+ 7e8:	6b06                	ld	s6,64(sp)
+ 7ea:	7be2                	ld	s7,56(sp)
+ 7ec:	7c42                	ld	s8,48(sp)
+ 7ee:	7ca2                	ld	s9,40(sp)
+ 7f0:	7d02                	ld	s10,32(sp)
+ 7f2:	6de2                	ld	s11,24(sp)
+ 7f4:	6109                	addi	sp,sp,128
+ 7f6:	8082                	ret
+
+00000000000007f8 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 7f8:	715d                	addi	sp,sp,-80
+ 7fa:	ec06                	sd	ra,24(sp)
+ 7fc:	e822                	sd	s0,16(sp)
+ 7fe:	1000                	addi	s0,sp,32
+ 800:	e010                	sd	a2,0(s0)
+ 802:	e414                	sd	a3,8(s0)
+ 804:	e818                	sd	a4,16(s0)
+ 806:	ec1c                	sd	a5,24(s0)
+ 808:	03043023          	sd	a6,32(s0)
+ 80c:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 810:	8622                	mv	a2,s0
+ 812:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 816:	00000097          	auipc	ra,0x0
+ 81a:	e04080e7          	jalr	-508(ra) # 61a <vprintf>
+}
+ 81e:	60e2                	ld	ra,24(sp)
+ 820:	6442                	ld	s0,16(sp)
+ 822:	6161                	addi	sp,sp,80
+ 824:	8082                	ret
+
+0000000000000826 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 826:	711d                	addi	sp,sp,-96
+ 828:	ec06                	sd	ra,24(sp)
+ 82a:	e822                	sd	s0,16(sp)
+ 82c:	1000                	addi	s0,sp,32
+ 82e:	e40c                	sd	a1,8(s0)
+ 830:	e810                	sd	a2,16(s0)
+ 832:	ec14                	sd	a3,24(s0)
+ 834:	f018                	sd	a4,32(s0)
+ 836:	f41c                	sd	a5,40(s0)
+ 838:	03043823          	sd	a6,48(s0)
+ 83c:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 840:	00840613          	addi	a2,s0,8
+ 844:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 848:	85aa                	mv	a1,a0
+ 84a:	4505                	li	a0,1
+ 84c:	00000097          	auipc	ra,0x0
+ 850:	dce080e7          	jalr	-562(ra) # 61a <vprintf>
+}
+ 854:	60e2                	ld	ra,24(sp)
+ 856:	6442                	ld	s0,16(sp)
+ 858:	6125                	addi	sp,sp,96
+ 85a:	8082                	ret
+
+000000000000085c <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 85c:	1141                	addi	sp,sp,-16
+ 85e:	e422                	sd	s0,8(sp)
+ 860:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 862:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 866:	00000797          	auipc	a5,0x0
+ 86a:	2827b783          	ld	a5,642(a5) # ae8 <freep>
+ 86e:	a02d                	j	898 <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;
+ 870:	4618                	lw	a4,8(a2)
+ 872:	9f2d                	addw	a4,a4,a1
+ 874:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 878:	6398                	ld	a4,0(a5)
+ 87a:	6310                	ld	a2,0(a4)
+ 87c:	a83d                	j	8ba <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 87e:	ff852703          	lw	a4,-8(a0)
+ 882:	9f31                	addw	a4,a4,a2
+ 884:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 886:	ff053683          	ld	a3,-16(a0)
+ 88a:	a091                	j	8ce <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 88c:	6398                	ld	a4,0(a5)
+ 88e:	00e7e463          	bltu	a5,a4,896 <free+0x3a>
+ 892:	00e6ea63          	bltu	a3,a4,8a6 <free+0x4a>
+{
+ 896:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 898:	fed7fae3          	bgeu	a5,a3,88c <free+0x30>
+ 89c:	6398                	ld	a4,0(a5)
+ 89e:	00e6e463          	bltu	a3,a4,8a6 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 8a2:	fee7eae3          	bltu	a5,a4,896 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 8a6:	ff852583          	lw	a1,-8(a0)
+ 8aa:	6390                	ld	a2,0(a5)
+ 8ac:	02059813          	slli	a6,a1,0x20
+ 8b0:	01c85713          	srli	a4,a6,0x1c
+ 8b4:	9736                	add	a4,a4,a3
+ 8b6:	fae60de3          	beq	a2,a4,870 <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 8ba:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 8be:	4790                	lw	a2,8(a5)
+ 8c0:	02061593          	slli	a1,a2,0x20
+ 8c4:	01c5d713          	srli	a4,a1,0x1c
+ 8c8:	973e                	add	a4,a4,a5
+ 8ca:	fae68ae3          	beq	a3,a4,87e <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 8ce:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 8d0:	00000717          	auipc	a4,0x0
+ 8d4:	20f73c23          	sd	a5,536(a4) # ae8 <freep>
+}
+ 8d8:	6422                	ld	s0,8(sp)
+ 8da:	0141                	addi	sp,sp,16
+ 8dc:	8082                	ret
+
+00000000000008de <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 8de:	7139                	addi	sp,sp,-64
+ 8e0:	fc06                	sd	ra,56(sp)
+ 8e2:	f822                	sd	s0,48(sp)
+ 8e4:	f426                	sd	s1,40(sp)
+ 8e6:	f04a                	sd	s2,32(sp)
+ 8e8:	ec4e                	sd	s3,24(sp)
+ 8ea:	e852                	sd	s4,16(sp)
+ 8ec:	e456                	sd	s5,8(sp)
+ 8ee:	e05a                	sd	s6,0(sp)
+ 8f0:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 8f2:	02051493          	slli	s1,a0,0x20
+ 8f6:	9081                	srli	s1,s1,0x20
+ 8f8:	04bd                	addi	s1,s1,15
+ 8fa:	8091                	srli	s1,s1,0x4
+ 8fc:	00148a1b          	addiw	s4,s1,1
+ 900:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 902:	00000517          	auipc	a0,0x0
+ 906:	1e653503          	ld	a0,486(a0) # ae8 <freep>
+ 90a:	c515                	beqz	a0,936 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 90c:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 90e:	4798                	lw	a4,8(a5)
+ 910:	04977163          	bgeu	a4,s1,952 <malloc+0x74>
+ 914:	89d2                	mv	s3,s4
+ 916:	000a071b          	sext.w	a4,s4
+ 91a:	6685                	lui	a3,0x1
+ 91c:	00d77363          	bgeu	a4,a3,922 <malloc+0x44>
+ 920:	6985                	lui	s3,0x1
+ 922:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 926:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 92a:	00000917          	auipc	s2,0x0
+ 92e:	1be90913          	addi	s2,s2,446 # ae8 <freep>
+  if(p == (char*)-1)
+ 932:	5afd                	li	s5,-1
+ 934:	a8a5                	j	9ac <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 936:	00000797          	auipc	a5,0x0
+ 93a:	1b278793          	addi	a5,a5,434 # ae8 <freep>
+ 93e:	00000717          	auipc	a4,0x0
+ 942:	1b270713          	addi	a4,a4,434 # af0 <base>
+ 946:	e398                	sd	a4,0(a5)
+ 948:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 94a:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 94e:	87ba                	mv	a5,a4
+ 950:	b7d1                	j	914 <malloc+0x36>
+      if(p->s.size == nunits)
+ 952:	02e48c63          	beq	s1,a4,98a <malloc+0xac>
+        p->s.size -= nunits;
+ 956:	4147073b          	subw	a4,a4,s4
+ 95a:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 95c:	02071693          	slli	a3,a4,0x20
+ 960:	01c6d713          	srli	a4,a3,0x1c
+ 964:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 966:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 96a:	00000717          	auipc	a4,0x0
+ 96e:	16a73f23          	sd	a0,382(a4) # ae8 <freep>
+      return (void*)(p + 1);
+ 972:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 976:	70e2                	ld	ra,56(sp)
+ 978:	7442                	ld	s0,48(sp)
+ 97a:	74a2                	ld	s1,40(sp)
+ 97c:	7902                	ld	s2,32(sp)
+ 97e:	69e2                	ld	s3,24(sp)
+ 980:	6a42                	ld	s4,16(sp)
+ 982:	6aa2                	ld	s5,8(sp)
+ 984:	6b02                	ld	s6,0(sp)
+ 986:	6121                	addi	sp,sp,64
+ 988:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 98a:	6398                	ld	a4,0(a5)
+ 98c:	e118                	sd	a4,0(a0)
+ 98e:	bff1                	j	96a <malloc+0x8c>
+  hp->s.size = nu;
+ 990:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 994:	0541                	addi	a0,a0,16
+ 996:	00000097          	auipc	ra,0x0
+ 99a:	ec6080e7          	jalr	-314(ra) # 85c <free>
+  return freep;
+ 99e:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 9a2:	d971                	beqz	a0,976 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 9a4:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 9a6:	4798                	lw	a4,8(a5)
+ 9a8:	fa9775e3          	bgeu	a4,s1,952 <malloc+0x74>
+    if(p == freep)
+ 9ac:	00093703          	ld	a4,0(s2)
+ 9b0:	853e                	mv	a0,a5
+ 9b2:	fef719e3          	bne	a4,a5,9a4 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 9b6:	854e                	mv	a0,s3
+ 9b8:	00000097          	auipc	ra,0x0
+ 9bc:	b30080e7          	jalr	-1232(ra) # 4e8 <sbrk>
+  if(p == (char*)-1)
+ 9c0:	fd5518e3          	bne	a0,s5,990 <malloc+0xb2>
+        return 0;
+ 9c4:	4501                	li	a0,0
+ 9c6:	bf45                	j	976 <malloc+0x98>
diff --git a/xv6-user/mv.c b/xv6-user/mv.c
new file mode 100644
index 0000000000000000000000000000000000000000..6dc2aa9d15f06e375844876410b15a2011b82a80
--- /dev/null
+++ b/xv6-user/mv.c
@@ -0,0 +1,53 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "kernel/include/fcntl.h"
+#include "kernel/include/param.h"
+#include "xv6-user/user.h"
+
+int main(int argc, char *argv[])
+{
+    if (argc < 3) {
+        fprintf(2, "Usage: mv old_name new_name\n");
+        exit(1);
+    }
+
+    char src[MAXPATH];
+    char dst[MAXPATH];
+    strcpy(src, argv[1]);
+    strcpy(dst, argv[2]);
+    int fd = open(dst, O_RDONLY);
+    if (fd >= 0) {
+        struct stat st;
+        fstat(fd, &st);
+        close(fd);
+        if (st.type == T_DIR) {
+            char *ps, *pd;
+            for (ps = src + strlen(src) - 1; ps >= src; ps--) { // trim '/' in tail
+                if (*ps != '/') {
+                    *(ps + 1) = '\0';
+                    break;
+                }
+            }
+            for (; ps >= src && *ps != '/'; ps--);
+            ps++;
+            pd = dst + strlen(dst);
+            *pd++ = '/';
+            while (*ps) {
+                *pd++ = *ps++;
+                if (pd >= dst + MAXPATH) {
+                    fprintf(2, "mv: fail! final dst path too long (exceed MAX=%d)!\n", MAXPATH);
+                    exit(-1);
+                }
+            }
+        } else {
+            fprintf(2, "mv: fail! %s exists!\n", dst);
+            exit(-1);
+        }
+    }
+    printf("moving [%s] to [%s]\n", src, dst);
+    if (rename(src, dst) < 0) {
+        fprintf(2, "mv: fail to rename %s to %s!\n", src, dst);
+        exit(-1);
+    }
+    exit(0);
+}
\ No newline at end of file
diff --git a/xv6-user/mv.d b/xv6-user/mv.d
new file mode 100644
index 0000000000000000000000000000000000000000..db02e40cd154b9d20958974804db9ca3036ea9f1
--- /dev/null
+++ b/xv6-user/mv.d
@@ -0,0 +1,2 @@
+xv6-user/mv.o: xv6-user/mv.c kernel/include/types.h kernel/include/stat.h \
+ kernel/include/fcntl.h kernel/include/param.h xv6-user/user.h
diff --git a/xv6-user/mv.o b/xv6-user/mv.o
new file mode 100644
index 0000000000000000000000000000000000000000..5d7d6f6d7bd63c332432d426e2ad0e3c5f1e2f94
Binary files /dev/null and b/xv6-user/mv.o differ
diff --git a/xv6-user/mv.sym b/xv6-user/mv.sym
new file mode 100644
index 0000000000000000000000000000000000000000..4a197c1d9798b9968c2f3400fec37f4d3de1ed83
--- /dev/null
+++ b/xv6-user/mv.sym
@@ -0,0 +1,76 @@
+0000000000000000 .text
+00000000000009c8 .rodata
+0000000000000ae8 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 mv.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+000000000000054e putc
+0000000000000570 printint
+0000000000000ad0 digits
+0000000000000000 umalloc.c
+0000000000000ae8 freep
+0000000000000af0 base
+00000000000001aa strcpy
+0000000000000826 printf
+00000000000012e1 __global_pointer$
+0000000000000508 dev
+00000000000003b0 memmove
+000000000000052c trace
+0000000000000290 gets
+0000000000000ae1 __SDATA_BEGIN__
+00000000000004de getpid
+0000000000000442 memcpy
+00000000000008de malloc
+0000000000000522 remove
+00000000000004f0 sleep
+0000000000000534 sysinfo
+0000000000000512 readdir
+0000000000000474 pipe
+000000000000053c rename
+0000000000000488 write
+00000000000004b8 fstat
+00000000000007f8 fprintf
+000000000000049c kill
+00000000000001c6 strcat
+000000000000061a vprintf
+00000000000004cc chdir
+00000000000004a4 exec
+000000000000046c wait
+000000000000047e read
+0000000000000408 memcmp
+000000000000045a fork
+0000000000000b00 __BSS_END__
+00000000000004e8 sbrk
+0000000000000500 test_proc
+00000000000004f8 uptime
+0000000000000ae1 __bss_start
+000000000000024a memset
+0000000000000000 main
+00000000000001f4 strcmp
+0000000000000544 shutdown
+00000000000004d6 dup
+000000000000051a getcwd
+0000000000000ae1 __DATA_BEGIN__
+000000000000030a stat
+0000000000000ae1 _edata
+0000000000000b00 _end
+0000000000000462 exit
+0000000000000350 atoi
+0000000000000220 strlen
+00000000000004ae open
+000000000000026c strchr
+00000000000004c2 mkdir
+0000000000000492 close
+000000000000085c free
diff --git a/xv6-user/printf.c b/xv6-user/printf.c
new file mode 100644
index 0000000000000000000000000000000000000000..1704ce08202ca168b0579edf3ef9ddfc6a0c2586
--- /dev/null
+++ b/xv6-user/printf.c
@@ -0,0 +1,113 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+#include <stdarg.h>
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+  write(fd, &c, 1);
+}
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+  }
+
+  i = 0;
+  do{
+    buf[i++] = digits[x % base];
+  }while((x /= base) != 0);
+  if(neg)
+    buf[i++] = '-';
+
+  while(--i >= 0)
+    putc(fd, buf[i]);
+}
+
+static void
+printptr(int fd, uint64 x) {
+  int i;
+  putc(fd, '0');
+  putc(fd, 'x');
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+    c = fmt[i] & 0xff;
+    if(state == 0){
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+      if(c == 'd'){
+        printint(fd, va_arg(ap, int), 10, 1);
+      } else if(c == 'l') {
+        printint(fd, va_arg(ap, uint64), 10, 0);
+      } else if(c == 'x') {
+        printint(fd, va_arg(ap, int), 16, 0);
+      } else if(c == 'p') {
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+          putc(fd, *s);
+          s++;
+        }
+      } else if(c == 'c'){
+        putc(fd, va_arg(ap, uint));
+      } else if(c == '%'){
+        putc(fd, c);
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+    }
+  }
+}
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+  va_list ap;
+
+  va_start(ap, fmt);
+  vprintf(fd, fmt, ap);
+}
+
+void
+printf(const char *fmt, ...)
+{
+  va_list ap;
+
+  va_start(ap, fmt);
+  vprintf(1, fmt, ap);
+}
diff --git a/xv6-user/printf.d b/xv6-user/printf.d
new file mode 100644
index 0000000000000000000000000000000000000000..c7f4f8d9ce8c34e38fae9c58bde3b53f5fb81abc
--- /dev/null
+++ b/xv6-user/printf.d
@@ -0,0 +1,3 @@
+xv6-user/printf.o: xv6-user/printf.c kernel/include/types.h \
+ kernel/include/stat.h xv6-user/user.h kernel/include/fcntl.h \
+ /usr/lib/gcc-cross/riscv64-linux-gnu/11/include/stdarg.h
diff --git a/xv6-user/printf.o b/xv6-user/printf.o
new file mode 100644
index 0000000000000000000000000000000000000000..ce2c3c55938fc37e5b3fdfeab7d2240a3c70ca6f
Binary files /dev/null and b/xv6-user/printf.o differ
diff --git a/xv6-user/rm.asm b/xv6-user/rm.asm
new file mode 100644
index 0000000000000000000000000000000000000000..7d421ef4ab01cc9468d760b09a25c49edfaaf110
--- /dev/null
+++ b/xv6-user/rm.asm
@@ -0,0 +1,1453 @@
+
+xv6-user/_rm:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+   0:	7179                	addi	sp,sp,-48
+   2:	f406                	sd	ra,40(sp)
+   4:	f022                	sd	s0,32(sp)
+   6:	ec26                	sd	s1,24(sp)
+   8:	e84a                	sd	s2,16(sp)
+   a:	e44e                	sd	s3,8(sp)
+   c:	1800                	addi	s0,sp,48
+  int i;
+
+  if(argc < 2){
+   e:	4785                	li	a5,1
+  10:	02a7d163          	bge	a5,a0,32 <main+0x32>
+  14:	00858493          	addi	s1,a1,8
+  18:	ffe5091b          	addiw	s2,a0,-2
+  1c:	02091793          	slli	a5,s2,0x20
+  20:	01d7d913          	srli	s2,a5,0x1d
+  24:	05c1                	addi	a1,a1,16
+  26:	992e                	add	s2,s2,a1
+    exit(1);
+  }
+
+  for(i = 1; i < argc; i++){
+    if(remove(argv[i]) < 0){
+      fprintf(2, "rm: %s failed to delete\n", argv[i]);
+  28:	00001997          	auipc	s3,0x1
+  2c:	89098993          	addi	s3,s3,-1904 # 8b8 <malloc+0x108>
+  30:	a015                	j	54 <main+0x54>
+    fprintf(2, "Usage: rm files...\n");
+  32:	00001597          	auipc	a1,0x1
+  36:	86e58593          	addi	a1,a1,-1938 # 8a0 <malloc+0xf0>
+  3a:	4509                	li	a0,2
+  3c:	00000097          	auipc	ra,0x0
+  40:	68e080e7          	jalr	1678(ra) # 6ca <fprintf>
+    exit(1);
+  44:	4505                	li	a0,1
+  46:	00000097          	auipc	ra,0x0
+  4a:	2ee080e7          	jalr	750(ra) # 334 <exit>
+  for(i = 1; i < argc; i++){
+  4e:	04a1                	addi	s1,s1,8
+  50:	03248163          	beq	s1,s2,72 <main+0x72>
+    if(remove(argv[i]) < 0){
+  54:	6088                	ld	a0,0(s1)
+  56:	00000097          	auipc	ra,0x0
+  5a:	39e080e7          	jalr	926(ra) # 3f4 <remove>
+  5e:	fe0558e3          	bgez	a0,4e <main+0x4e>
+      fprintf(2, "rm: %s failed to delete\n", argv[i]);
+  62:	6090                	ld	a2,0(s1)
+  64:	85ce                	mv	a1,s3
+  66:	4509                	li	a0,2
+  68:	00000097          	auipc	ra,0x0
+  6c:	662080e7          	jalr	1634(ra) # 6ca <fprintf>
+  70:	bff9                	j	4e <main+0x4e>
+    }
+  }
+
+  exit(0);
+  72:	4501                	li	a0,0
+  74:	00000097          	auipc	ra,0x0
+  78:	2c0080e7          	jalr	704(ra) # 334 <exit>
+
+000000000000007c <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+  7c:	1141                	addi	sp,sp,-16
+  7e:	e422                	sd	s0,8(sp)
+  80:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+  82:	87aa                	mv	a5,a0
+  84:	0585                	addi	a1,a1,1
+  86:	0785                	addi	a5,a5,1
+  88:	fff5c703          	lbu	a4,-1(a1)
+  8c:	fee78fa3          	sb	a4,-1(a5)
+  90:	fb75                	bnez	a4,84 <strcpy+0x8>
+    ;
+  return os;
+}
+  92:	6422                	ld	s0,8(sp)
+  94:	0141                	addi	sp,sp,16
+  96:	8082                	ret
+
+0000000000000098 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+  98:	1141                	addi	sp,sp,-16
+  9a:	e422                	sd	s0,8(sp)
+  9c:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+  9e:	00054783          	lbu	a5,0(a0)
+  a2:	c385                	beqz	a5,c2 <strcat+0x2a>
+  a4:	87aa                	mv	a5,a0
+    s++;
+  a6:	0785                	addi	a5,a5,1
+  while(*s)
+  a8:	0007c703          	lbu	a4,0(a5)
+  ac:	ff6d                	bnez	a4,a6 <strcat+0xe>
+  while((*s++ = *t++))
+  ae:	0585                	addi	a1,a1,1
+  b0:	0785                	addi	a5,a5,1
+  b2:	fff5c703          	lbu	a4,-1(a1)
+  b6:	fee78fa3          	sb	a4,-1(a5)
+  ba:	fb75                	bnez	a4,ae <strcat+0x16>
+    ;
+  return os;
+}
+  bc:	6422                	ld	s0,8(sp)
+  be:	0141                	addi	sp,sp,16
+  c0:	8082                	ret
+  while(*s)
+  c2:	87aa                	mv	a5,a0
+  c4:	b7ed                	j	ae <strcat+0x16>
+
+00000000000000c6 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+  c6:	1141                	addi	sp,sp,-16
+  c8:	e422                	sd	s0,8(sp)
+  ca:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+  cc:	00054783          	lbu	a5,0(a0)
+  d0:	cb91                	beqz	a5,e4 <strcmp+0x1e>
+  d2:	0005c703          	lbu	a4,0(a1)
+  d6:	00f71763          	bne	a4,a5,e4 <strcmp+0x1e>
+    p++, q++;
+  da:	0505                	addi	a0,a0,1
+  dc:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+  de:	00054783          	lbu	a5,0(a0)
+  e2:	fbe5                	bnez	a5,d2 <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+  e4:	0005c503          	lbu	a0,0(a1)
+}
+  e8:	40a7853b          	subw	a0,a5,a0
+  ec:	6422                	ld	s0,8(sp)
+  ee:	0141                	addi	sp,sp,16
+  f0:	8082                	ret
+
+00000000000000f2 <strlen>:
+
+uint
+strlen(const char *s)
+{
+  f2:	1141                	addi	sp,sp,-16
+  f4:	e422                	sd	s0,8(sp)
+  f6:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+  f8:	00054783          	lbu	a5,0(a0)
+  fc:	cf91                	beqz	a5,118 <strlen+0x26>
+  fe:	0505                	addi	a0,a0,1
+ 100:	87aa                	mv	a5,a0
+ 102:	4685                	li	a3,1
+ 104:	9e89                	subw	a3,a3,a0
+ 106:	00f6853b          	addw	a0,a3,a5
+ 10a:	0785                	addi	a5,a5,1
+ 10c:	fff7c703          	lbu	a4,-1(a5)
+ 110:	fb7d                	bnez	a4,106 <strlen+0x14>
+    ;
+  return n;
+}
+ 112:	6422                	ld	s0,8(sp)
+ 114:	0141                	addi	sp,sp,16
+ 116:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 118:	4501                	li	a0,0
+ 11a:	bfe5                	j	112 <strlen+0x20>
+
+000000000000011c <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 11c:	1141                	addi	sp,sp,-16
+ 11e:	e422                	sd	s0,8(sp)
+ 120:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 122:	ca19                	beqz	a2,138 <memset+0x1c>
+ 124:	87aa                	mv	a5,a0
+ 126:	1602                	slli	a2,a2,0x20
+ 128:	9201                	srli	a2,a2,0x20
+ 12a:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 12e:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 132:	0785                	addi	a5,a5,1
+ 134:	fee79de3          	bne	a5,a4,12e <memset+0x12>
+  }
+  return dst;
+}
+ 138:	6422                	ld	s0,8(sp)
+ 13a:	0141                	addi	sp,sp,16
+ 13c:	8082                	ret
+
+000000000000013e <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 13e:	1141                	addi	sp,sp,-16
+ 140:	e422                	sd	s0,8(sp)
+ 142:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 144:	00054783          	lbu	a5,0(a0)
+ 148:	cb99                	beqz	a5,15e <strchr+0x20>
+    if(*s == c)
+ 14a:	00f58763          	beq	a1,a5,158 <strchr+0x1a>
+  for(; *s; s++)
+ 14e:	0505                	addi	a0,a0,1
+ 150:	00054783          	lbu	a5,0(a0)
+ 154:	fbfd                	bnez	a5,14a <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 156:	4501                	li	a0,0
+}
+ 158:	6422                	ld	s0,8(sp)
+ 15a:	0141                	addi	sp,sp,16
+ 15c:	8082                	ret
+  return 0;
+ 15e:	4501                	li	a0,0
+ 160:	bfe5                	j	158 <strchr+0x1a>
+
+0000000000000162 <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 162:	711d                	addi	sp,sp,-96
+ 164:	ec86                	sd	ra,88(sp)
+ 166:	e8a2                	sd	s0,80(sp)
+ 168:	e4a6                	sd	s1,72(sp)
+ 16a:	e0ca                	sd	s2,64(sp)
+ 16c:	fc4e                	sd	s3,56(sp)
+ 16e:	f852                	sd	s4,48(sp)
+ 170:	f456                	sd	s5,40(sp)
+ 172:	f05a                	sd	s6,32(sp)
+ 174:	ec5e                	sd	s7,24(sp)
+ 176:	e862                	sd	s8,16(sp)
+ 178:	1080                	addi	s0,sp,96
+ 17a:	8baa                	mv	s7,a0
+ 17c:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 17e:	892a                	mv	s2,a0
+ 180:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 182:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 186:	4b29                	li	s6,10
+ 188:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 18a:	89a6                	mv	s3,s1
+ 18c:	2485                	addiw	s1,s1,1
+ 18e:	0344d763          	bge	s1,s4,1bc <gets+0x5a>
+    cc = read(0, &c, 1);
+ 192:	4605                	li	a2,1
+ 194:	85d6                	mv	a1,s5
+ 196:	4501                	li	a0,0
+ 198:	00000097          	auipc	ra,0x0
+ 19c:	1b8080e7          	jalr	440(ra) # 350 <read>
+    if(cc < 1)
+ 1a0:	00a05e63          	blez	a0,1bc <gets+0x5a>
+    buf[i++] = c;
+ 1a4:	faf44783          	lbu	a5,-81(s0)
+ 1a8:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 1ac:	01678763          	beq	a5,s6,1ba <gets+0x58>
+ 1b0:	0905                	addi	s2,s2,1
+ 1b2:	fd879ce3          	bne	a5,s8,18a <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 1b6:	89a6                	mv	s3,s1
+ 1b8:	a011                	j	1bc <gets+0x5a>
+ 1ba:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 1bc:	99de                	add	s3,s3,s7
+ 1be:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 1c2:	855e                	mv	a0,s7
+ 1c4:	60e6                	ld	ra,88(sp)
+ 1c6:	6446                	ld	s0,80(sp)
+ 1c8:	64a6                	ld	s1,72(sp)
+ 1ca:	6906                	ld	s2,64(sp)
+ 1cc:	79e2                	ld	s3,56(sp)
+ 1ce:	7a42                	ld	s4,48(sp)
+ 1d0:	7aa2                	ld	s5,40(sp)
+ 1d2:	7b02                	ld	s6,32(sp)
+ 1d4:	6be2                	ld	s7,24(sp)
+ 1d6:	6c42                	ld	s8,16(sp)
+ 1d8:	6125                	addi	sp,sp,96
+ 1da:	8082                	ret
+
+00000000000001dc <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 1dc:	1101                	addi	sp,sp,-32
+ 1de:	ec06                	sd	ra,24(sp)
+ 1e0:	e822                	sd	s0,16(sp)
+ 1e2:	e426                	sd	s1,8(sp)
+ 1e4:	e04a                	sd	s2,0(sp)
+ 1e6:	1000                	addi	s0,sp,32
+ 1e8:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 1ea:	4581                	li	a1,0
+ 1ec:	00000097          	auipc	ra,0x0
+ 1f0:	194080e7          	jalr	404(ra) # 380 <open>
+  if(fd < 0)
+ 1f4:	02054563          	bltz	a0,21e <stat+0x42>
+ 1f8:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 1fa:	85ca                	mv	a1,s2
+ 1fc:	00000097          	auipc	ra,0x0
+ 200:	18e080e7          	jalr	398(ra) # 38a <fstat>
+ 204:	892a                	mv	s2,a0
+  close(fd);
+ 206:	8526                	mv	a0,s1
+ 208:	00000097          	auipc	ra,0x0
+ 20c:	15c080e7          	jalr	348(ra) # 364 <close>
+  return r;
+}
+ 210:	854a                	mv	a0,s2
+ 212:	60e2                	ld	ra,24(sp)
+ 214:	6442                	ld	s0,16(sp)
+ 216:	64a2                	ld	s1,8(sp)
+ 218:	6902                	ld	s2,0(sp)
+ 21a:	6105                	addi	sp,sp,32
+ 21c:	8082                	ret
+    return -1;
+ 21e:	597d                	li	s2,-1
+ 220:	bfc5                	j	210 <stat+0x34>
+
+0000000000000222 <atoi>:
+
+int
+atoi(const char *s)
+{
+ 222:	1141                	addi	sp,sp,-16
+ 224:	e422                	sd	s0,8(sp)
+ 226:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 228:	00054703          	lbu	a4,0(a0)
+ 22c:	02d00793          	li	a5,45
+  int neg = 1;
+ 230:	4585                	li	a1,1
+  if (*s == '-') {
+ 232:	04f70363          	beq	a4,a5,278 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 236:	00054703          	lbu	a4,0(a0)
+ 23a:	fd07079b          	addiw	a5,a4,-48
+ 23e:	0ff7f793          	zext.b	a5,a5
+ 242:	46a5                	li	a3,9
+ 244:	02f6ed63          	bltu	a3,a5,27e <atoi+0x5c>
+  n = 0;
+ 248:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 24a:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 24c:	0505                	addi	a0,a0,1
+ 24e:	0026979b          	slliw	a5,a3,0x2
+ 252:	9fb5                	addw	a5,a5,a3
+ 254:	0017979b          	slliw	a5,a5,0x1
+ 258:	9fb9                	addw	a5,a5,a4
+ 25a:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 25e:	00054703          	lbu	a4,0(a0)
+ 262:	fd07079b          	addiw	a5,a4,-48
+ 266:	0ff7f793          	zext.b	a5,a5
+ 26a:	fef671e3          	bgeu	a2,a5,24c <atoi+0x2a>
+  return n * neg;
+}
+ 26e:	02d5853b          	mulw	a0,a1,a3
+ 272:	6422                	ld	s0,8(sp)
+ 274:	0141                	addi	sp,sp,16
+ 276:	8082                	ret
+    s++;
+ 278:	0505                	addi	a0,a0,1
+    neg = -1;
+ 27a:	55fd                	li	a1,-1
+ 27c:	bf6d                	j	236 <atoi+0x14>
+  n = 0;
+ 27e:	4681                	li	a3,0
+ 280:	b7fd                	j	26e <atoi+0x4c>
+
+0000000000000282 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 282:	1141                	addi	sp,sp,-16
+ 284:	e422                	sd	s0,8(sp)
+ 286:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 288:	02b57463          	bgeu	a0,a1,2b0 <memmove+0x2e>
+    while(n-- > 0)
+ 28c:	00c05f63          	blez	a2,2aa <memmove+0x28>
+ 290:	1602                	slli	a2,a2,0x20
+ 292:	9201                	srli	a2,a2,0x20
+ 294:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 298:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 29a:	0585                	addi	a1,a1,1
+ 29c:	0705                	addi	a4,a4,1
+ 29e:	fff5c683          	lbu	a3,-1(a1)
+ 2a2:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 2a6:	fee79ae3          	bne	a5,a4,29a <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 2aa:	6422                	ld	s0,8(sp)
+ 2ac:	0141                	addi	sp,sp,16
+ 2ae:	8082                	ret
+    dst += n;
+ 2b0:	00c50733          	add	a4,a0,a2
+    src += n;
+ 2b4:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 2b6:	fec05ae3          	blez	a2,2aa <memmove+0x28>
+ 2ba:	fff6079b          	addiw	a5,a2,-1
+ 2be:	1782                	slli	a5,a5,0x20
+ 2c0:	9381                	srli	a5,a5,0x20
+ 2c2:	fff7c793          	not	a5,a5
+ 2c6:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 2c8:	15fd                	addi	a1,a1,-1
+ 2ca:	177d                	addi	a4,a4,-1
+ 2cc:	0005c683          	lbu	a3,0(a1)
+ 2d0:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 2d4:	fee79ae3          	bne	a5,a4,2c8 <memmove+0x46>
+ 2d8:	bfc9                	j	2aa <memmove+0x28>
+
+00000000000002da <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 2da:	1141                	addi	sp,sp,-16
+ 2dc:	e422                	sd	s0,8(sp)
+ 2de:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 2e0:	ca05                	beqz	a2,310 <memcmp+0x36>
+ 2e2:	fff6069b          	addiw	a3,a2,-1
+ 2e6:	1682                	slli	a3,a3,0x20
+ 2e8:	9281                	srli	a3,a3,0x20
+ 2ea:	0685                	addi	a3,a3,1
+ 2ec:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 2ee:	00054783          	lbu	a5,0(a0)
+ 2f2:	0005c703          	lbu	a4,0(a1)
+ 2f6:	00e79863          	bne	a5,a4,306 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 2fa:	0505                	addi	a0,a0,1
+    p2++;
+ 2fc:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 2fe:	fed518e3          	bne	a0,a3,2ee <memcmp+0x14>
+  }
+  return 0;
+ 302:	4501                	li	a0,0
+ 304:	a019                	j	30a <memcmp+0x30>
+      return *p1 - *p2;
+ 306:	40e7853b          	subw	a0,a5,a4
+}
+ 30a:	6422                	ld	s0,8(sp)
+ 30c:	0141                	addi	sp,sp,16
+ 30e:	8082                	ret
+  return 0;
+ 310:	4501                	li	a0,0
+ 312:	bfe5                	j	30a <memcmp+0x30>
+
+0000000000000314 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 314:	1141                	addi	sp,sp,-16
+ 316:	e406                	sd	ra,8(sp)
+ 318:	e022                	sd	s0,0(sp)
+ 31a:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 31c:	00000097          	auipc	ra,0x0
+ 320:	f66080e7          	jalr	-154(ra) # 282 <memmove>
+}
+ 324:	60a2                	ld	ra,8(sp)
+ 326:	6402                	ld	s0,0(sp)
+ 328:	0141                	addi	sp,sp,16
+ 32a:	8082                	ret
+
+000000000000032c <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 32c:	4885                	li	a7,1
+ ecall
+ 32e:	00000073          	ecall
+ ret
+ 332:	8082                	ret
+
+0000000000000334 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 334:	05d00893          	li	a7,93
+ ecall
+ 338:	00000073          	ecall
+ ret
+ 33c:	8082                	ret
+
+000000000000033e <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 33e:	488d                	li	a7,3
+ ecall
+ 340:	00000073          	ecall
+ ret
+ 344:	8082                	ret
+
+0000000000000346 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 346:	03b00893          	li	a7,59
+ ecall
+ 34a:	00000073          	ecall
+ ret
+ 34e:	8082                	ret
+
+0000000000000350 <read>:
+.global read
+read:
+ li a7, SYS_read
+ 350:	03f00893          	li	a7,63
+ ecall
+ 354:	00000073          	ecall
+ ret
+ 358:	8082                	ret
+
+000000000000035a <write>:
+.global write
+write:
+ li a7, SYS_write
+ 35a:	04000893          	li	a7,64
+ ecall
+ 35e:	00000073          	ecall
+ ret
+ 362:	8082                	ret
+
+0000000000000364 <close>:
+.global close
+close:
+ li a7, SYS_close
+ 364:	03900893          	li	a7,57
+ ecall
+ 368:	00000073          	ecall
+ ret
+ 36c:	8082                	ret
+
+000000000000036e <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 36e:	4899                	li	a7,6
+ ecall
+ 370:	00000073          	ecall
+ ret
+ 374:	8082                	ret
+
+0000000000000376 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 376:	0dd00893          	li	a7,221
+ ecall
+ 37a:	00000073          	ecall
+ ret
+ 37e:	8082                	ret
+
+0000000000000380 <open>:
+.global open
+open:
+ li a7, SYS_open
+ 380:	03800893          	li	a7,56
+ ecall
+ 384:	00000073          	ecall
+ ret
+ 388:	8082                	ret
+
+000000000000038a <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 38a:	05000893          	li	a7,80
+ ecall
+ 38e:	00000073          	ecall
+ ret
+ 392:	8082                	ret
+
+0000000000000394 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 394:	02200893          	li	a7,34
+ ecall
+ 398:	00000073          	ecall
+ ret
+ 39c:	8082                	ret
+
+000000000000039e <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 39e:	03100893          	li	a7,49
+ ecall
+ 3a2:	00000073          	ecall
+ ret
+ 3a6:	8082                	ret
+
+00000000000003a8 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 3a8:	48dd                	li	a7,23
+ ecall
+ 3aa:	00000073          	ecall
+ ret
+ 3ae:	8082                	ret
+
+00000000000003b0 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 3b0:	0ac00893          	li	a7,172
+ ecall
+ 3b4:	00000073          	ecall
+ ret
+ 3b8:	8082                	ret
+
+00000000000003ba <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 3ba:	48b1                	li	a7,12
+ ecall
+ 3bc:	00000073          	ecall
+ ret
+ 3c0:	8082                	ret
+
+00000000000003c2 <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 3c2:	48b5                	li	a7,13
+ ecall
+ 3c4:	00000073          	ecall
+ ret
+ 3c8:	8082                	ret
+
+00000000000003ca <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 3ca:	48b9                	li	a7,14
+ ecall
+ 3cc:	00000073          	ecall
+ ret
+ 3d0:	8082                	ret
+
+00000000000003d2 <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 3d2:	48d9                	li	a7,22
+ ecall
+ 3d4:	00000073          	ecall
+ ret
+ 3d8:	8082                	ret
+
+00000000000003da <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 3da:	03200893          	li	a7,50
+ ecall
+ 3de:	00000073          	ecall
+ ret
+ 3e2:	8082                	ret
+
+00000000000003e4 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 3e4:	48ed                	li	a7,27
+ ecall
+ 3e6:	00000073          	ecall
+ ret
+ 3ea:	8082                	ret
+
+00000000000003ec <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 3ec:	48c5                	li	a7,17
+ ecall
+ 3ee:	00000073          	ecall
+ ret
+ 3f2:	8082                	ret
+
+00000000000003f4 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 3f4:	07500893          	li	a7,117
+ ecall
+ 3f8:	00000073          	ecall
+ ret
+ 3fc:	8082                	ret
+
+00000000000003fe <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 3fe:	48c9                	li	a7,18
+ ecall
+ 400:	00000073          	ecall
+ ret
+ 404:	8082                	ret
+
+0000000000000406 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 406:	48cd                	li	a7,19
+ ecall
+ 408:	00000073          	ecall
+ ret
+ 40c:	8082                	ret
+
+000000000000040e <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 40e:	48e9                	li	a7,26
+ ecall
+ 410:	00000073          	ecall
+ ret
+ 414:	8082                	ret
+
+0000000000000416 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 416:	0d200893          	li	a7,210
+ ecall
+ 41a:	00000073          	ecall
+ ret
+ 41e:	8082                	ret
+
+0000000000000420 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 420:	1101                	addi	sp,sp,-32
+ 422:	ec06                	sd	ra,24(sp)
+ 424:	e822                	sd	s0,16(sp)
+ 426:	1000                	addi	s0,sp,32
+ 428:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 42c:	4605                	li	a2,1
+ 42e:	fef40593          	addi	a1,s0,-17
+ 432:	00000097          	auipc	ra,0x0
+ 436:	f28080e7          	jalr	-216(ra) # 35a <write>
+}
+ 43a:	60e2                	ld	ra,24(sp)
+ 43c:	6442                	ld	s0,16(sp)
+ 43e:	6105                	addi	sp,sp,32
+ 440:	8082                	ret
+
+0000000000000442 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 442:	7139                	addi	sp,sp,-64
+ 444:	fc06                	sd	ra,56(sp)
+ 446:	f822                	sd	s0,48(sp)
+ 448:	f426                	sd	s1,40(sp)
+ 44a:	f04a                	sd	s2,32(sp)
+ 44c:	ec4e                	sd	s3,24(sp)
+ 44e:	0080                	addi	s0,sp,64
+ 450:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 452:	c299                	beqz	a3,458 <printint+0x16>
+ 454:	0805c863          	bltz	a1,4e4 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 458:	2581                	sext.w	a1,a1
+  neg = 0;
+ 45a:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 45c:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 460:	86ce                	mv	a3,s3
+  i = 0;
+ 462:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 464:	2601                	sext.w	a2,a2
+ 466:	00000517          	auipc	a0,0x0
+ 46a:	4d250513          	addi	a0,a0,1234 # 938 <digits>
+ 46e:	883a                	mv	a6,a4
+ 470:	2705                	addiw	a4,a4,1
+ 472:	02c5f7bb          	remuw	a5,a1,a2
+ 476:	1782                	slli	a5,a5,0x20
+ 478:	9381                	srli	a5,a5,0x20
+ 47a:	97aa                	add	a5,a5,a0
+ 47c:	0007c783          	lbu	a5,0(a5)
+ 480:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 484:	0005879b          	sext.w	a5,a1
+ 488:	02c5d5bb          	divuw	a1,a1,a2
+ 48c:	0685                	addi	a3,a3,1
+ 48e:	fec7f0e3          	bgeu	a5,a2,46e <printint+0x2c>
+  if(neg)
+ 492:	00088c63          	beqz	a7,4aa <printint+0x68>
+    buf[i++] = '-';
+ 496:	fd070793          	addi	a5,a4,-48
+ 49a:	00878733          	add	a4,a5,s0
+ 49e:	02d00793          	li	a5,45
+ 4a2:	fef70823          	sb	a5,-16(a4)
+ 4a6:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 4aa:	02e05663          	blez	a4,4d6 <printint+0x94>
+ 4ae:	fc040913          	addi	s2,s0,-64
+ 4b2:	993a                	add	s2,s2,a4
+ 4b4:	19fd                	addi	s3,s3,-1
+ 4b6:	99ba                	add	s3,s3,a4
+ 4b8:	377d                	addiw	a4,a4,-1
+ 4ba:	1702                	slli	a4,a4,0x20
+ 4bc:	9301                	srli	a4,a4,0x20
+ 4be:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 4c2:	fff94583          	lbu	a1,-1(s2)
+ 4c6:	8526                	mv	a0,s1
+ 4c8:	00000097          	auipc	ra,0x0
+ 4cc:	f58080e7          	jalr	-168(ra) # 420 <putc>
+  while(--i >= 0)
+ 4d0:	197d                	addi	s2,s2,-1
+ 4d2:	ff3918e3          	bne	s2,s3,4c2 <printint+0x80>
+}
+ 4d6:	70e2                	ld	ra,56(sp)
+ 4d8:	7442                	ld	s0,48(sp)
+ 4da:	74a2                	ld	s1,40(sp)
+ 4dc:	7902                	ld	s2,32(sp)
+ 4de:	69e2                	ld	s3,24(sp)
+ 4e0:	6121                	addi	sp,sp,64
+ 4e2:	8082                	ret
+    x = -xx;
+ 4e4:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 4e8:	4885                	li	a7,1
+    x = -xx;
+ 4ea:	bf8d                	j	45c <printint+0x1a>
+
+00000000000004ec <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 4ec:	7119                	addi	sp,sp,-128
+ 4ee:	fc86                	sd	ra,120(sp)
+ 4f0:	f8a2                	sd	s0,112(sp)
+ 4f2:	f4a6                	sd	s1,104(sp)
+ 4f4:	f0ca                	sd	s2,96(sp)
+ 4f6:	ecce                	sd	s3,88(sp)
+ 4f8:	e8d2                	sd	s4,80(sp)
+ 4fa:	e4d6                	sd	s5,72(sp)
+ 4fc:	e0da                	sd	s6,64(sp)
+ 4fe:	fc5e                	sd	s7,56(sp)
+ 500:	f862                	sd	s8,48(sp)
+ 502:	f466                	sd	s9,40(sp)
+ 504:	f06a                	sd	s10,32(sp)
+ 506:	ec6e                	sd	s11,24(sp)
+ 508:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 50a:	0005c903          	lbu	s2,0(a1)
+ 50e:	18090f63          	beqz	s2,6ac <vprintf+0x1c0>
+ 512:	8aaa                	mv	s5,a0
+ 514:	8b32                	mv	s6,a2
+ 516:	00158493          	addi	s1,a1,1
+  state = 0;
+ 51a:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 51c:	02500a13          	li	s4,37
+ 520:	4c55                	li	s8,21
+ 522:	00000c97          	auipc	s9,0x0
+ 526:	3bec8c93          	addi	s9,s9,958 # 8e0 <malloc+0x130>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 52a:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 52e:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 530:	00000b97          	auipc	s7,0x0
+ 534:	408b8b93          	addi	s7,s7,1032 # 938 <digits>
+ 538:	a839                	j	556 <vprintf+0x6a>
+        putc(fd, c);
+ 53a:	85ca                	mv	a1,s2
+ 53c:	8556                	mv	a0,s5
+ 53e:	00000097          	auipc	ra,0x0
+ 542:	ee2080e7          	jalr	-286(ra) # 420 <putc>
+ 546:	a019                	j	54c <vprintf+0x60>
+    } else if(state == '%'){
+ 548:	01498d63          	beq	s3,s4,562 <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 54c:	0485                	addi	s1,s1,1
+ 54e:	fff4c903          	lbu	s2,-1(s1)
+ 552:	14090d63          	beqz	s2,6ac <vprintf+0x1c0>
+    if(state == 0){
+ 556:	fe0999e3          	bnez	s3,548 <vprintf+0x5c>
+      if(c == '%'){
+ 55a:	ff4910e3          	bne	s2,s4,53a <vprintf+0x4e>
+        state = '%';
+ 55e:	89d2                	mv	s3,s4
+ 560:	b7f5                	j	54c <vprintf+0x60>
+      if(c == 'd'){
+ 562:	11490c63          	beq	s2,s4,67a <vprintf+0x18e>
+ 566:	f9d9079b          	addiw	a5,s2,-99
+ 56a:	0ff7f793          	zext.b	a5,a5
+ 56e:	10fc6e63          	bltu	s8,a5,68a <vprintf+0x19e>
+ 572:	f9d9079b          	addiw	a5,s2,-99
+ 576:	0ff7f713          	zext.b	a4,a5
+ 57a:	10ec6863          	bltu	s8,a4,68a <vprintf+0x19e>
+ 57e:	00271793          	slli	a5,a4,0x2
+ 582:	97e6                	add	a5,a5,s9
+ 584:	439c                	lw	a5,0(a5)
+ 586:	97e6                	add	a5,a5,s9
+ 588:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 58a:	008b0913          	addi	s2,s6,8
+ 58e:	4685                	li	a3,1
+ 590:	4629                	li	a2,10
+ 592:	000b2583          	lw	a1,0(s6)
+ 596:	8556                	mv	a0,s5
+ 598:	00000097          	auipc	ra,0x0
+ 59c:	eaa080e7          	jalr	-342(ra) # 442 <printint>
+ 5a0:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 5a2:	4981                	li	s3,0
+ 5a4:	b765                	j	54c <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 5a6:	008b0913          	addi	s2,s6,8
+ 5aa:	4681                	li	a3,0
+ 5ac:	4629                	li	a2,10
+ 5ae:	000b2583          	lw	a1,0(s6)
+ 5b2:	8556                	mv	a0,s5
+ 5b4:	00000097          	auipc	ra,0x0
+ 5b8:	e8e080e7          	jalr	-370(ra) # 442 <printint>
+ 5bc:	8b4a                	mv	s6,s2
+      state = 0;
+ 5be:	4981                	li	s3,0
+ 5c0:	b771                	j	54c <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 5c2:	008b0913          	addi	s2,s6,8
+ 5c6:	4681                	li	a3,0
+ 5c8:	866a                	mv	a2,s10
+ 5ca:	000b2583          	lw	a1,0(s6)
+ 5ce:	8556                	mv	a0,s5
+ 5d0:	00000097          	auipc	ra,0x0
+ 5d4:	e72080e7          	jalr	-398(ra) # 442 <printint>
+ 5d8:	8b4a                	mv	s6,s2
+      state = 0;
+ 5da:	4981                	li	s3,0
+ 5dc:	bf85                	j	54c <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 5de:	008b0793          	addi	a5,s6,8
+ 5e2:	f8f43423          	sd	a5,-120(s0)
+ 5e6:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 5ea:	03000593          	li	a1,48
+ 5ee:	8556                	mv	a0,s5
+ 5f0:	00000097          	auipc	ra,0x0
+ 5f4:	e30080e7          	jalr	-464(ra) # 420 <putc>
+  putc(fd, 'x');
+ 5f8:	07800593          	li	a1,120
+ 5fc:	8556                	mv	a0,s5
+ 5fe:	00000097          	auipc	ra,0x0
+ 602:	e22080e7          	jalr	-478(ra) # 420 <putc>
+ 606:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 608:	03c9d793          	srli	a5,s3,0x3c
+ 60c:	97de                	add	a5,a5,s7
+ 60e:	0007c583          	lbu	a1,0(a5)
+ 612:	8556                	mv	a0,s5
+ 614:	00000097          	auipc	ra,0x0
+ 618:	e0c080e7          	jalr	-500(ra) # 420 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 61c:	0992                	slli	s3,s3,0x4
+ 61e:	397d                	addiw	s2,s2,-1
+ 620:	fe0914e3          	bnez	s2,608 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 624:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 628:	4981                	li	s3,0
+ 62a:	b70d                	j	54c <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 62c:	008b0913          	addi	s2,s6,8
+ 630:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 634:	02098163          	beqz	s3,656 <vprintf+0x16a>
+        while(*s != 0){
+ 638:	0009c583          	lbu	a1,0(s3)
+ 63c:	c5ad                	beqz	a1,6a6 <vprintf+0x1ba>
+          putc(fd, *s);
+ 63e:	8556                	mv	a0,s5
+ 640:	00000097          	auipc	ra,0x0
+ 644:	de0080e7          	jalr	-544(ra) # 420 <putc>
+          s++;
+ 648:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 64a:	0009c583          	lbu	a1,0(s3)
+ 64e:	f9e5                	bnez	a1,63e <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 650:	8b4a                	mv	s6,s2
+      state = 0;
+ 652:	4981                	li	s3,0
+ 654:	bde5                	j	54c <vprintf+0x60>
+          s = "(null)";
+ 656:	00000997          	auipc	s3,0x0
+ 65a:	28298993          	addi	s3,s3,642 # 8d8 <malloc+0x128>
+        while(*s != 0){
+ 65e:	85ee                	mv	a1,s11
+ 660:	bff9                	j	63e <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 662:	008b0913          	addi	s2,s6,8
+ 666:	000b4583          	lbu	a1,0(s6)
+ 66a:	8556                	mv	a0,s5
+ 66c:	00000097          	auipc	ra,0x0
+ 670:	db4080e7          	jalr	-588(ra) # 420 <putc>
+ 674:	8b4a                	mv	s6,s2
+      state = 0;
+ 676:	4981                	li	s3,0
+ 678:	bdd1                	j	54c <vprintf+0x60>
+        putc(fd, c);
+ 67a:	85d2                	mv	a1,s4
+ 67c:	8556                	mv	a0,s5
+ 67e:	00000097          	auipc	ra,0x0
+ 682:	da2080e7          	jalr	-606(ra) # 420 <putc>
+      state = 0;
+ 686:	4981                	li	s3,0
+ 688:	b5d1                	j	54c <vprintf+0x60>
+        putc(fd, '%');
+ 68a:	85d2                	mv	a1,s4
+ 68c:	8556                	mv	a0,s5
+ 68e:	00000097          	auipc	ra,0x0
+ 692:	d92080e7          	jalr	-622(ra) # 420 <putc>
+        putc(fd, c);
+ 696:	85ca                	mv	a1,s2
+ 698:	8556                	mv	a0,s5
+ 69a:	00000097          	auipc	ra,0x0
+ 69e:	d86080e7          	jalr	-634(ra) # 420 <putc>
+      state = 0;
+ 6a2:	4981                	li	s3,0
+ 6a4:	b565                	j	54c <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 6a6:	8b4a                	mv	s6,s2
+      state = 0;
+ 6a8:	4981                	li	s3,0
+ 6aa:	b54d                	j	54c <vprintf+0x60>
+    }
+  }
+}
+ 6ac:	70e6                	ld	ra,120(sp)
+ 6ae:	7446                	ld	s0,112(sp)
+ 6b0:	74a6                	ld	s1,104(sp)
+ 6b2:	7906                	ld	s2,96(sp)
+ 6b4:	69e6                	ld	s3,88(sp)
+ 6b6:	6a46                	ld	s4,80(sp)
+ 6b8:	6aa6                	ld	s5,72(sp)
+ 6ba:	6b06                	ld	s6,64(sp)
+ 6bc:	7be2                	ld	s7,56(sp)
+ 6be:	7c42                	ld	s8,48(sp)
+ 6c0:	7ca2                	ld	s9,40(sp)
+ 6c2:	7d02                	ld	s10,32(sp)
+ 6c4:	6de2                	ld	s11,24(sp)
+ 6c6:	6109                	addi	sp,sp,128
+ 6c8:	8082                	ret
+
+00000000000006ca <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 6ca:	715d                	addi	sp,sp,-80
+ 6cc:	ec06                	sd	ra,24(sp)
+ 6ce:	e822                	sd	s0,16(sp)
+ 6d0:	1000                	addi	s0,sp,32
+ 6d2:	e010                	sd	a2,0(s0)
+ 6d4:	e414                	sd	a3,8(s0)
+ 6d6:	e818                	sd	a4,16(s0)
+ 6d8:	ec1c                	sd	a5,24(s0)
+ 6da:	03043023          	sd	a6,32(s0)
+ 6de:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6e2:	8622                	mv	a2,s0
+ 6e4:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 6e8:	00000097          	auipc	ra,0x0
+ 6ec:	e04080e7          	jalr	-508(ra) # 4ec <vprintf>
+}
+ 6f0:	60e2                	ld	ra,24(sp)
+ 6f2:	6442                	ld	s0,16(sp)
+ 6f4:	6161                	addi	sp,sp,80
+ 6f6:	8082                	ret
+
+00000000000006f8 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 6f8:	711d                	addi	sp,sp,-96
+ 6fa:	ec06                	sd	ra,24(sp)
+ 6fc:	e822                	sd	s0,16(sp)
+ 6fe:	1000                	addi	s0,sp,32
+ 700:	e40c                	sd	a1,8(s0)
+ 702:	e810                	sd	a2,16(s0)
+ 704:	ec14                	sd	a3,24(s0)
+ 706:	f018                	sd	a4,32(s0)
+ 708:	f41c                	sd	a5,40(s0)
+ 70a:	03043823          	sd	a6,48(s0)
+ 70e:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 712:	00840613          	addi	a2,s0,8
+ 716:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 71a:	85aa                	mv	a1,a0
+ 71c:	4505                	li	a0,1
+ 71e:	00000097          	auipc	ra,0x0
+ 722:	dce080e7          	jalr	-562(ra) # 4ec <vprintf>
+}
+ 726:	60e2                	ld	ra,24(sp)
+ 728:	6442                	ld	s0,16(sp)
+ 72a:	6125                	addi	sp,sp,96
+ 72c:	8082                	ret
+
+000000000000072e <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 72e:	1141                	addi	sp,sp,-16
+ 730:	e422                	sd	s0,8(sp)
+ 732:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 734:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 738:	00000797          	auipc	a5,0x0
+ 73c:	2187b783          	ld	a5,536(a5) # 950 <freep>
+ 740:	a02d                	j	76a <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;
+ 742:	4618                	lw	a4,8(a2)
+ 744:	9f2d                	addw	a4,a4,a1
+ 746:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 74a:	6398                	ld	a4,0(a5)
+ 74c:	6310                	ld	a2,0(a4)
+ 74e:	a83d                	j	78c <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 750:	ff852703          	lw	a4,-8(a0)
+ 754:	9f31                	addw	a4,a4,a2
+ 756:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 758:	ff053683          	ld	a3,-16(a0)
+ 75c:	a091                	j	7a0 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 75e:	6398                	ld	a4,0(a5)
+ 760:	00e7e463          	bltu	a5,a4,768 <free+0x3a>
+ 764:	00e6ea63          	bltu	a3,a4,778 <free+0x4a>
+{
+ 768:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 76a:	fed7fae3          	bgeu	a5,a3,75e <free+0x30>
+ 76e:	6398                	ld	a4,0(a5)
+ 770:	00e6e463          	bltu	a3,a4,778 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 774:	fee7eae3          	bltu	a5,a4,768 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 778:	ff852583          	lw	a1,-8(a0)
+ 77c:	6390                	ld	a2,0(a5)
+ 77e:	02059813          	slli	a6,a1,0x20
+ 782:	01c85713          	srli	a4,a6,0x1c
+ 786:	9736                	add	a4,a4,a3
+ 788:	fae60de3          	beq	a2,a4,742 <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 78c:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 790:	4790                	lw	a2,8(a5)
+ 792:	02061593          	slli	a1,a2,0x20
+ 796:	01c5d713          	srli	a4,a1,0x1c
+ 79a:	973e                	add	a4,a4,a5
+ 79c:	fae68ae3          	beq	a3,a4,750 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 7a0:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 7a2:	00000717          	auipc	a4,0x0
+ 7a6:	1af73723          	sd	a5,430(a4) # 950 <freep>
+}
+ 7aa:	6422                	ld	s0,8(sp)
+ 7ac:	0141                	addi	sp,sp,16
+ 7ae:	8082                	ret
+
+00000000000007b0 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 7b0:	7139                	addi	sp,sp,-64
+ 7b2:	fc06                	sd	ra,56(sp)
+ 7b4:	f822                	sd	s0,48(sp)
+ 7b6:	f426                	sd	s1,40(sp)
+ 7b8:	f04a                	sd	s2,32(sp)
+ 7ba:	ec4e                	sd	s3,24(sp)
+ 7bc:	e852                	sd	s4,16(sp)
+ 7be:	e456                	sd	s5,8(sp)
+ 7c0:	e05a                	sd	s6,0(sp)
+ 7c2:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 7c4:	02051493          	slli	s1,a0,0x20
+ 7c8:	9081                	srli	s1,s1,0x20
+ 7ca:	04bd                	addi	s1,s1,15
+ 7cc:	8091                	srli	s1,s1,0x4
+ 7ce:	00148a1b          	addiw	s4,s1,1
+ 7d2:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 7d4:	00000517          	auipc	a0,0x0
+ 7d8:	17c53503          	ld	a0,380(a0) # 950 <freep>
+ 7dc:	c515                	beqz	a0,808 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 7de:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 7e0:	4798                	lw	a4,8(a5)
+ 7e2:	04977163          	bgeu	a4,s1,824 <malloc+0x74>
+ 7e6:	89d2                	mv	s3,s4
+ 7e8:	000a071b          	sext.w	a4,s4
+ 7ec:	6685                	lui	a3,0x1
+ 7ee:	00d77363          	bgeu	a4,a3,7f4 <malloc+0x44>
+ 7f2:	6985                	lui	s3,0x1
+ 7f4:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 7f8:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 7fc:	00000917          	auipc	s2,0x0
+ 800:	15490913          	addi	s2,s2,340 # 950 <freep>
+  if(p == (char*)-1)
+ 804:	5afd                	li	s5,-1
+ 806:	a8a5                	j	87e <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 808:	00000797          	auipc	a5,0x0
+ 80c:	14878793          	addi	a5,a5,328 # 950 <freep>
+ 810:	00000717          	auipc	a4,0x0
+ 814:	14870713          	addi	a4,a4,328 # 958 <base>
+ 818:	e398                	sd	a4,0(a5)
+ 81a:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 81c:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 820:	87ba                	mv	a5,a4
+ 822:	b7d1                	j	7e6 <malloc+0x36>
+      if(p->s.size == nunits)
+ 824:	02e48c63          	beq	s1,a4,85c <malloc+0xac>
+        p->s.size -= nunits;
+ 828:	4147073b          	subw	a4,a4,s4
+ 82c:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 82e:	02071693          	slli	a3,a4,0x20
+ 832:	01c6d713          	srli	a4,a3,0x1c
+ 836:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 838:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 83c:	00000717          	auipc	a4,0x0
+ 840:	10a73a23          	sd	a0,276(a4) # 950 <freep>
+      return (void*)(p + 1);
+ 844:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 848:	70e2                	ld	ra,56(sp)
+ 84a:	7442                	ld	s0,48(sp)
+ 84c:	74a2                	ld	s1,40(sp)
+ 84e:	7902                	ld	s2,32(sp)
+ 850:	69e2                	ld	s3,24(sp)
+ 852:	6a42                	ld	s4,16(sp)
+ 854:	6aa2                	ld	s5,8(sp)
+ 856:	6b02                	ld	s6,0(sp)
+ 858:	6121                	addi	sp,sp,64
+ 85a:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 85c:	6398                	ld	a4,0(a5)
+ 85e:	e118                	sd	a4,0(a0)
+ 860:	bff1                	j	83c <malloc+0x8c>
+  hp->s.size = nu;
+ 862:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 866:	0541                	addi	a0,a0,16
+ 868:	00000097          	auipc	ra,0x0
+ 86c:	ec6080e7          	jalr	-314(ra) # 72e <free>
+  return freep;
+ 870:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 874:	d971                	beqz	a0,848 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 876:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 878:	4798                	lw	a4,8(a5)
+ 87a:	fa9775e3          	bgeu	a4,s1,824 <malloc+0x74>
+    if(p == freep)
+ 87e:	00093703          	ld	a4,0(s2)
+ 882:	853e                	mv	a0,a5
+ 884:	fef719e3          	bne	a4,a5,876 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 888:	854e                	mv	a0,s3
+ 88a:	00000097          	auipc	ra,0x0
+ 88e:	b30080e7          	jalr	-1232(ra) # 3ba <sbrk>
+  if(p == (char*)-1)
+ 892:	fd5518e3          	bne	a0,s5,862 <malloc+0xb2>
+        return 0;
+ 896:	4501                	li	a0,0
+ 898:	bf45                	j	848 <malloc+0x98>
diff --git a/xv6-user/rm.c b/xv6-user/rm.c
new file mode 100644
index 0000000000000000000000000000000000000000..170b20096681aa8c6584ecab5e86ab62b6cc2ebd
--- /dev/null
+++ b/xv6-user/rm.c
@@ -0,0 +1,23 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+  int i;
+
+  if(argc < 2){
+    fprintf(2, "Usage: rm files...\n");
+    exit(1);
+  }
+
+  for(i = 1; i < argc; i++){
+    if(remove(argv[i]) < 0){
+      fprintf(2, "rm: %s failed to delete\n", argv[i]);
+    }
+  }
+
+  exit(0);
+}
diff --git a/xv6-user/rm.d b/xv6-user/rm.d
new file mode 100644
index 0000000000000000000000000000000000000000..38a71085b4c273a22ad0347575bb404264f98c64
--- /dev/null
+++ b/xv6-user/rm.d
@@ -0,0 +1,2 @@
+xv6-user/rm.o: xv6-user/rm.c kernel/include/types.h kernel/include/stat.h \
+ kernel/include/fcntl.h xv6-user/user.h
diff --git a/xv6-user/rm.o b/xv6-user/rm.o
new file mode 100644
index 0000000000000000000000000000000000000000..95a492affec725edf5de65fc226fe7471de939aa
Binary files /dev/null and b/xv6-user/rm.o differ
diff --git a/xv6-user/rm.sym b/xv6-user/rm.sym
new file mode 100644
index 0000000000000000000000000000000000000000..659a8ba9b4c46701ba72999dc6b04557804d1387
--- /dev/null
+++ b/xv6-user/rm.sym
@@ -0,0 +1,76 @@
+0000000000000000 .text
+00000000000008a0 .rodata
+0000000000000950 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 rm.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+0000000000000420 putc
+0000000000000442 printint
+0000000000000938 digits
+0000000000000000 umalloc.c
+0000000000000950 freep
+0000000000000958 base
+000000000000007c strcpy
+00000000000006f8 printf
+0000000000001149 __global_pointer$
+00000000000003da dev
+0000000000000282 memmove
+00000000000003fe trace
+0000000000000162 gets
+0000000000000949 __SDATA_BEGIN__
+00000000000003b0 getpid
+0000000000000314 memcpy
+00000000000007b0 malloc
+00000000000003f4 remove
+00000000000003c2 sleep
+0000000000000406 sysinfo
+00000000000003e4 readdir
+0000000000000346 pipe
+000000000000040e rename
+000000000000035a write
+000000000000038a fstat
+00000000000006ca fprintf
+000000000000036e kill
+0000000000000098 strcat
+00000000000004ec vprintf
+000000000000039e chdir
+0000000000000376 exec
+000000000000033e wait
+0000000000000350 read
+00000000000002da memcmp
+000000000000032c fork
+0000000000000968 __BSS_END__
+00000000000003ba sbrk
+00000000000003d2 test_proc
+00000000000003ca uptime
+0000000000000949 __bss_start
+000000000000011c memset
+0000000000000000 main
+00000000000000c6 strcmp
+0000000000000416 shutdown
+00000000000003a8 dup
+00000000000003ec getcwd
+0000000000000949 __DATA_BEGIN__
+00000000000001dc stat
+0000000000000949 _edata
+0000000000000968 _end
+0000000000000334 exit
+0000000000000222 atoi
+00000000000000f2 strlen
+0000000000000380 open
+000000000000013e strchr
+0000000000000394 mkdir
+0000000000000364 close
+000000000000072e free
diff --git a/xv6-user/sh.asm b/xv6-user/sh.asm
new file mode 100644
index 0000000000000000000000000000000000000000..53dc7abc564b6b2cb7ae2df0f3f6cd0f4e2a18da
--- /dev/null
+++ b/xv6-user/sh.asm
@@ -0,0 +1,3403 @@
+
+xv6-user/_sh:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <checkenvname>:
+
+char mycwd[128];
+
+int
+checkenvname(char* s)
+{
+       0:	1141                	addi	sp,sp,-16
+       2:	e422                	sd	s0,8(sp)
+       4:	0800                	addi	s0,sp,16
+       6:	88aa                	mv	a7,a0
+  if((*s >= 'A' && *s <= 'Z') ||
+       8:	00054703          	lbu	a4,0(a0)
+       c:	fdf77793          	andi	a5,a4,-33
+      10:	fbf7879b          	addiw	a5,a5,-65
+      14:	0ff7f793          	zext.b	a5,a5
+      18:	46e5                	li	a3,25
+      1a:	00f6f763          	bgeu	a3,a5,28 <checkenvname+0x28>
+     (*s >= 'a' && *s <= 'z') ||
+      1e:	05f00793          	li	a5,95
+      *s == '_')
+    ;
+  else
+    return 0;
+      22:	4501                	li	a0,0
+     (*s >= 'a' && *s <= 'z') ||
+      24:	02f71e63          	bne	a4,a5,60 <checkenvname+0x60>
+  char *tmp = s + 1;
+      28:	00188713          	addi	a4,a7,1
+  while((*tmp >= 'A' && *tmp <= 'Z') ||
+        (*tmp >= 'a' && *tmp <= 'z') ||
+        (*tmp >= '0' && *tmp <= '9') ||
+      2c:	4665                	li	a2,25
+        (*tmp >= 'a' && *tmp <= 'z') ||
+      2e:	45a5                	li	a1,9
+        (*tmp >= '0' && *tmp <= '9') ||
+      30:	05f00813          	li	a6,95
+  while((*tmp >= 'A' && *tmp <= 'Z') ||
+      34:	a011                	j	38 <checkenvname+0x38>
+         *tmp == '_')
+    tmp++;
+      36:	0705                	addi	a4,a4,1
+  while((*tmp >= 'A' && *tmp <= 'Z') ||
+      38:	00074683          	lbu	a3,0(a4)
+        (*tmp >= '0' && *tmp <= '9') ||
+      3c:	fdf6f793          	andi	a5,a3,-33
+      40:	fbf7879b          	addiw	a5,a5,-65
+      44:	0ff7f793          	zext.b	a5,a5
+      48:	fef677e3          	bgeu	a2,a5,36 <checkenvname+0x36>
+      4c:	fd06879b          	addiw	a5,a3,-48
+        (*tmp >= 'a' && *tmp <= 'z') ||
+      50:	0ff7f793          	zext.b	a5,a5
+      54:	fef5f1e3          	bgeu	a1,a5,36 <checkenvname+0x36>
+        (*tmp >= '0' && *tmp <= '9') ||
+      58:	fd068fe3          	beq	a3,a6,36 <checkenvname+0x36>
+  return (int)(tmp - s);
+      5c:	4117053b          	subw	a0,a4,a7
+}
+      60:	6422                	ld	s0,8(sp)
+      62:	0141                	addi	sp,sp,16
+      64:	8082                	ret
+
+0000000000000066 <export>:
+
+int
+export(char *argv[])
+{
+      66:	7131                	addi	sp,sp,-192
+      68:	fd06                	sd	ra,184(sp)
+      6a:	f922                	sd	s0,176(sp)
+      6c:	f526                	sd	s1,168(sp)
+      6e:	f14a                	sd	s2,160(sp)
+      70:	ed4e                	sd	s3,152(sp)
+      72:	e952                	sd	s4,144(sp)
+      74:	e556                	sd	s5,136(sp)
+      76:	e15a                	sd	s6,128(sp)
+      78:	0180                	addi	s0,sp,192
+      7a:	84aa                	mv	s1,a0
+  if(!strcmp(argv[1], "-p"))
+      7c:	00001597          	auipc	a1,0x1
+      80:	7dc58593          	addi	a1,a1,2012 # 1858 <malloc+0xec>
+      84:	6508                	ld	a0,8(a0)
+      86:	00001097          	auipc	ra,0x1
+      8a:	ffc080e7          	jalr	-4(ra) # 1082 <strcmp>
+      8e:	e12d                	bnez	a0,f0 <export+0x8a>
+      90:	89aa                	mv	s3,a0
+  { // print all the env vars
+    if(!nenv)
+      92:	00002b17          	auipc	s6,0x2
+      96:	a2eb2b03          	lw	s6,-1490(s6) # 1ac0 <nenv>
+      9a:	040b0163          	beqz	s6,dc <export+0x76>
+    {
+      printf("NO env var exported\n");
+      return 0;
+    }
+    for(int i=0; i<nenv; i++)
+      9e:	00002497          	auipc	s1,0x2
+      a2:	b1248493          	addi	s1,s1,-1262 # 1bb0 <envs>
+      a6:	892a                	mv	s2,a0
+      printf("export %s=%s\n", envs[i].name, envs[i].value);
+      a8:	00001a97          	auipc	s5,0x1
+      ac:	7d0a8a93          	addi	s5,s5,2000 # 1878 <malloc+0x10c>
+    for(int i=0; i<nenv; i++)
+      b0:	00002a17          	auipc	s4,0x2
+      b4:	a10a0a13          	addi	s4,s4,-1520 # 1ac0 <nenv>
+      b8:	0f605c63          	blez	s6,1b0 <export+0x14a>
+      printf("export %s=%s\n", envs[i].name, envs[i].value);
+      bc:	02048613          	addi	a2,s1,32
+      c0:	85a6                	mv	a1,s1
+      c2:	8556                	mv	a0,s5
+      c4:	00001097          	auipc	ra,0x1
+      c8:	5f0080e7          	jalr	1520(ra) # 16b4 <printf>
+    for(int i=0; i<nenv; i++)
+      cc:	2905                	addiw	s2,s2,1
+      ce:	08048493          	addi	s1,s1,128
+      d2:	000a2783          	lw	a5,0(s4)
+      d6:	fef943e3          	blt	s2,a5,bc <export+0x56>
+      da:	a8d9                	j	1b0 <export+0x14a>
+      printf("NO env var exported\n");
+      dc:	00001517          	auipc	a0,0x1
+      e0:	78450513          	addi	a0,a0,1924 # 1860 <malloc+0xf4>
+      e4:	00001097          	auipc	ra,0x1
+      e8:	5d0080e7          	jalr	1488(ra) # 16b4 <printf>
+      return 0;
+      ec:	89da                	mv	s3,s6
+      ee:	a0c9                	j	1b0 <export+0x14a>
+    return 0;
+  }
+  else if(nenv == NENVS)
+      f0:	00002997          	auipc	s3,0x2
+      f4:	9d09a983          	lw	s3,-1584(s3) # 1ac0 <nenv>
+      f8:	47c1                	li	a5,16
+      fa:	0cf98663          	beq	s3,a5,1c6 <export+0x160>
+  {
+    fprintf(2, "too many env vars\n");
+    return -1;
+  }
+  char name[32], value[96];
+  char *s = argv[1], *t = name;
+      fe:	0084b903          	ld	s2,8(s1)
+
+  for(s=argv[1], t=name; (*t=*s++)!='='; t++)
+     102:	00190493          	addi	s1,s2,1
+     106:	00094783          	lbu	a5,0(s2)
+     10a:	faf40023          	sb	a5,-96(s0)
+     10e:	03d00713          	li	a4,61
+     112:	0ce78563          	beq	a5,a4,1dc <export+0x176>
+     116:	fa040793          	addi	a5,s0,-96
+     11a:	03d00693          	li	a3,61
+     11e:	0785                	addi	a5,a5,1
+     120:	0485                	addi	s1,s1,1
+     122:	fff4c703          	lbu	a4,-1(s1)
+     126:	00e78023          	sb	a4,0(a5)
+     12a:	fed71ae3          	bne	a4,a3,11e <export+0xb8>
+    ;
+  *t = 0;
+     12e:	00078023          	sb	zero,0(a5)
+
+  if(checkenvname(name) != ((s - argv[1]) - 1))
+     132:	fa040513          	addi	a0,s0,-96
+     136:	00000097          	auipc	ra,0x0
+     13a:	eca080e7          	jalr	-310(ra) # 0 <checkenvname>
+     13e:	41248933          	sub	s2,s1,s2
+     142:	197d                	addi	s2,s2,-1
+     144:	09251f63          	bne	a0,s2,1e2 <export+0x17c>
+  {
+    fprintf(2, "Invalid NAME!\n");
+    return -1;
+  }
+  for(t=value; (*t=*s); s++, t++)
+     148:	0004c703          	lbu	a4,0(s1)
+     14c:	f4e40023          	sb	a4,-192(s0)
+     150:	f4040793          	addi	a5,s0,-192
+     154:	cb01                	beqz	a4,164 <export+0xfe>
+     156:	0485                	addi	s1,s1,1
+     158:	0785                	addi	a5,a5,1
+     15a:	0004c703          	lbu	a4,0(s1)
+     15e:	00e78023          	sb	a4,0(a5)
+     162:	fb75                	bnez	a4,156 <export+0xf0>
+    ;
+  if(*--t == '/')
+     164:	fff7c683          	lbu	a3,-1(a5)
+     168:	02f00713          	li	a4,47
+     16c:	08e68663          	beq	a3,a4,1f8 <export+0x192>
+    *t = 0;
+  
+  strcpy(envs[nenv].name, name);
+     170:	00799513          	slli	a0,s3,0x7
+     174:	00002917          	auipc	s2,0x2
+     178:	a3c90913          	addi	s2,s2,-1476 # 1bb0 <envs>
+     17c:	fa040593          	addi	a1,s0,-96
+     180:	954a                	add	a0,a0,s2
+     182:	00001097          	auipc	ra,0x1
+     186:	eb6080e7          	jalr	-330(ra) # 1038 <strcpy>
+  strcpy(envs[nenv].value, value);
+     18a:	00002497          	auipc	s1,0x2
+     18e:	93648493          	addi	s1,s1,-1738 # 1ac0 <nenv>
+     192:	4088                	lw	a0,0(s1)
+     194:	051e                	slli	a0,a0,0x7
+     196:	02050513          	addi	a0,a0,32
+     19a:	f4040593          	addi	a1,s0,-192
+     19e:	954a                	add	a0,a0,s2
+     1a0:	00001097          	auipc	ra,0x1
+     1a4:	e98080e7          	jalr	-360(ra) # 1038 <strcpy>
+  nenv++;
+     1a8:	409c                	lw	a5,0(s1)
+     1aa:	2785                	addiw	a5,a5,1
+     1ac:	c09c                	sw	a5,0(s1)
+  return 0;
+     1ae:	4981                	li	s3,0
+}
+     1b0:	854e                	mv	a0,s3
+     1b2:	70ea                	ld	ra,184(sp)
+     1b4:	744a                	ld	s0,176(sp)
+     1b6:	74aa                	ld	s1,168(sp)
+     1b8:	790a                	ld	s2,160(sp)
+     1ba:	69ea                	ld	s3,152(sp)
+     1bc:	6a4a                	ld	s4,144(sp)
+     1be:	6aaa                	ld	s5,136(sp)
+     1c0:	6b0a                	ld	s6,128(sp)
+     1c2:	6129                	addi	sp,sp,192
+     1c4:	8082                	ret
+    fprintf(2, "too many env vars\n");
+     1c6:	00001597          	auipc	a1,0x1
+     1ca:	6c258593          	addi	a1,a1,1730 # 1888 <malloc+0x11c>
+     1ce:	4509                	li	a0,2
+     1d0:	00001097          	auipc	ra,0x1
+     1d4:	4b6080e7          	jalr	1206(ra) # 1686 <fprintf>
+    return -1;
+     1d8:	59fd                	li	s3,-1
+     1da:	bfd9                	j	1b0 <export+0x14a>
+  for(s=argv[1], t=name; (*t=*s++)!='='; t++)
+     1dc:	fa040793          	addi	a5,s0,-96
+     1e0:	b7b9                	j	12e <export+0xc8>
+    fprintf(2, "Invalid NAME!\n");
+     1e2:	00001597          	auipc	a1,0x1
+     1e6:	6be58593          	addi	a1,a1,1726 # 18a0 <malloc+0x134>
+     1ea:	4509                	li	a0,2
+     1ec:	00001097          	auipc	ra,0x1
+     1f0:	49a080e7          	jalr	1178(ra) # 1686 <fprintf>
+    return -1;
+     1f4:	59fd                	li	s3,-1
+     1f6:	bf6d                	j	1b0 <export+0x14a>
+    *t = 0;
+     1f8:	fe078fa3          	sb	zero,-1(a5)
+     1fc:	bf95                	j	170 <export+0x10a>
+
+00000000000001fe <replace>:
+
+int
+replace(char *buf)
+{
+     1fe:	7111                	addi	sp,sp,-256
+     200:	fd86                	sd	ra,248(sp)
+     202:	f9a2                	sd	s0,240(sp)
+     204:	f5a6                	sd	s1,232(sp)
+     206:	f1ca                	sd	s2,224(sp)
+     208:	edce                	sd	s3,216(sp)
+     20a:	e9d2                	sd	s4,208(sp)
+     20c:	e5d6                	sd	s5,200(sp)
+     20e:	e1da                	sd	s6,192(sp)
+     210:	fd5e                	sd	s7,184(sp)
+     212:	f962                	sd	s8,176(sp)
+     214:	f566                	sd	s9,168(sp)
+     216:	f16a                	sd	s10,160(sp)
+     218:	ed6e                	sd	s11,152(sp)
+     21a:	0200                	addi	s0,sp,256
+     21c:	89aa                	mv	s3,a0
+  char raw[100], name[32], *s, *t, *tmp;
+  int n = 0;
+  strcpy(raw, buf);
+     21e:	85aa                	mv	a1,a0
+     220:	f2840513          	addi	a0,s0,-216
+     224:	00001097          	auipc	ra,0x1
+     228:	e14080e7          	jalr	-492(ra) # 1038 <strcpy>
+  for(s=raw, t=buf; (*t=*s); t++)
+     22c:	f2844783          	lbu	a5,-216(s0)
+     230:	00f98023          	sb	a5,0(s3)
+     234:	c7f5                	beqz	a5,320 <replace+0x122>
+  int n = 0;
+     236:	4c81                	li	s9,0
+  for(s=raw, t=buf; (*t=*s); t++)
+     238:	f2840713          	addi	a4,s0,-216
+  {
+    if(*s++ == '$'){
+     23c:	02400c13          	li	s8,36
+      tmp = name;
+      if((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z') || *s == '_')
+     240:	4965                	li	s2,25
+      {
+        *tmp++ = *s++;
+        while((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z') || (*s >= '0' && *s <= '9') || *s == '_')
+     242:	4a25                	li	s4,9
+     244:	05f00a93          	li	s5,95
+          *tmp++ = *s++;
+        *tmp = 0;
+        for(int i=0; i<nenv; i++)
+     248:	00002b17          	auipc	s6,0x2
+     24c:	878b0b13          	addi	s6,s6,-1928 # 1ac0 <nenv>
+          if(!strcmp(name, envs[i].name))
+     250:	f0840b93          	addi	s7,s0,-248
+     254:	a03d                	j	282 <replace+0x84>
+      if((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z') || *s == '_')
+     256:	00174683          	lbu	a3,1(a4)
+     25a:	fdf6f793          	andi	a5,a3,-33
+     25e:	fbf7879b          	addiw	a5,a5,-65
+     262:	0ff7f793          	zext.b	a5,a5
+     266:	02f97563          	bgeu	s2,a5,290 <replace+0x92>
+     26a:	03568363          	beq	a3,s5,290 <replace+0x92>
+            for(tmp=envs[i].value; (*t=*tmp); t++, tmp++)
+              ;
+        t--;
+      }
+      n++;
+     26e:	2c85                	addiw	s9,s9,1
+     270:	86ce                	mv	a3,s3
+     272:	8726                	mv	a4,s1
+  for(s=raw, t=buf; (*t=*s); t++)
+     274:	00168993          	addi	s3,a3,1
+     278:	00074783          	lbu	a5,0(a4)
+     27c:	00f680a3          	sb	a5,1(a3)
+     280:	c3cd                	beqz	a5,322 <replace+0x124>
+    if(*s++ == '$'){
+     282:	00170493          	addi	s1,a4,1
+     286:	fd8788e3          	beq	a5,s8,256 <replace+0x58>
+     28a:	86ce                	mv	a3,s3
+     28c:	8726                	mv	a4,s1
+     28e:	b7dd                	j	274 <replace+0x76>
+        *tmp++ = *s++;
+     290:	00270493          	addi	s1,a4,2
+     294:	f0d40423          	sb	a3,-248(s0)
+     298:	f0940693          	addi	a3,s0,-247
+        while((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z') || (*s >= '0' && *s <= '9') || *s == '_')
+     29c:	a029                	j	2a6 <replace+0xa8>
+          *tmp++ = *s++;
+     29e:	0485                	addi	s1,s1,1
+     2a0:	0685                	addi	a3,a3,1
+     2a2:	fee68fa3          	sb	a4,-1(a3)
+        while((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z') || (*s >= '0' && *s <= '9') || *s == '_')
+     2a6:	0004c703          	lbu	a4,0(s1)
+     2aa:	fdf77793          	andi	a5,a4,-33
+     2ae:	fbf7879b          	addiw	a5,a5,-65
+     2b2:	0ff7f793          	zext.b	a5,a5
+     2b6:	fef974e3          	bgeu	s2,a5,29e <replace+0xa0>
+     2ba:	fd07079b          	addiw	a5,a4,-48
+     2be:	0ff7f793          	zext.b	a5,a5
+     2c2:	fcfa7ee3          	bgeu	s4,a5,29e <replace+0xa0>
+     2c6:	fd570ce3          	beq	a4,s5,29e <replace+0xa0>
+        *tmp = 0;
+     2ca:	00068023          	sb	zero,0(a3)
+        for(int i=0; i<nenv; i++)
+     2ce:	000b2783          	lw	a5,0(s6)
+     2d2:	04f05563          	blez	a5,31c <replace+0x11e>
+     2d6:	00002d17          	auipc	s10,0x2
+     2da:	8fad0d13          	addi	s10,s10,-1798 # 1bd0 <envs+0x20>
+     2de:	4d81                	li	s11,0
+     2e0:	a801                	j	2f0 <replace+0xf2>
+     2e2:	2d85                	addiw	s11,s11,1
+     2e4:	080d0d13          	addi	s10,s10,128
+     2e8:	000b2783          	lw	a5,0(s6)
+     2ec:	02fdd863          	bge	s11,a5,31c <replace+0x11e>
+          if(!strcmp(name, envs[i].name))
+     2f0:	fe0d0593          	addi	a1,s10,-32
+     2f4:	855e                	mv	a0,s7
+     2f6:	00001097          	auipc	ra,0x1
+     2fa:	d8c080e7          	jalr	-628(ra) # 1082 <strcmp>
+     2fe:	f175                	bnez	a0,2e2 <replace+0xe4>
+            for(tmp=envs[i].value; (*t=*tmp); t++, tmp++)
+     300:	87ea                	mv	a5,s10
+     302:	000d4703          	lbu	a4,0(s10)
+     306:	00e98023          	sb	a4,0(s3)
+     30a:	df61                	beqz	a4,2e2 <replace+0xe4>
+     30c:	0985                	addi	s3,s3,1
+     30e:	0785                	addi	a5,a5,1
+     310:	0007c703          	lbu	a4,0(a5)
+     314:	00e98023          	sb	a4,0(s3)
+     318:	fb75                	bnez	a4,30c <replace+0x10e>
+     31a:	b7e1                	j	2e2 <replace+0xe4>
+        t--;
+     31c:	19fd                	addi	s3,s3,-1
+     31e:	bf81                	j	26e <replace+0x70>
+  int n = 0;
+     320:	4c81                	li	s9,0
+    }
+  }
+  return n;
+}
+     322:	8566                	mv	a0,s9
+     324:	70ee                	ld	ra,248(sp)
+     326:	744e                	ld	s0,240(sp)
+     328:	74ae                	ld	s1,232(sp)
+     32a:	790e                	ld	s2,224(sp)
+     32c:	69ee                	ld	s3,216(sp)
+     32e:	6a4e                	ld	s4,208(sp)
+     330:	6aae                	ld	s5,200(sp)
+     332:	6b0e                	ld	s6,192(sp)
+     334:	7bea                	ld	s7,184(sp)
+     336:	7c4a                	ld	s8,176(sp)
+     338:	7caa                	ld	s9,168(sp)
+     33a:	7d0a                	ld	s10,160(sp)
+     33c:	6dea                	ld	s11,152(sp)
+     33e:	6111                	addi	sp,sp,256
+     340:	8082                	ret
+
+0000000000000342 <getcmd>:
+  exit(0);
+}
+
+int
+getcmd(char *buf, int nbuf)
+{
+     342:	1101                	addi	sp,sp,-32
+     344:	ec06                	sd	ra,24(sp)
+     346:	e822                	sd	s0,16(sp)
+     348:	e426                	sd	s1,8(sp)
+     34a:	e04a                	sd	s2,0(sp)
+     34c:	1000                	addi	s0,sp,32
+     34e:	84aa                	mv	s1,a0
+     350:	892e                	mv	s2,a1
+  fprintf(2, "-> %s $ ", mycwd);
+     352:	00001617          	auipc	a2,0x1
+     356:	77660613          	addi	a2,a2,1910 # 1ac8 <mycwd>
+     35a:	00001597          	auipc	a1,0x1
+     35e:	55658593          	addi	a1,a1,1366 # 18b0 <malloc+0x144>
+     362:	4509                	li	a0,2
+     364:	00001097          	auipc	ra,0x1
+     368:	322080e7          	jalr	802(ra) # 1686 <fprintf>
+  memset(buf, 0, nbuf);
+     36c:	864a                	mv	a2,s2
+     36e:	4581                	li	a1,0
+     370:	8526                	mv	a0,s1
+     372:	00001097          	auipc	ra,0x1
+     376:	d66080e7          	jalr	-666(ra) # 10d8 <memset>
+  gets(buf, nbuf);
+     37a:	85ca                	mv	a1,s2
+     37c:	8526                	mv	a0,s1
+     37e:	00001097          	auipc	ra,0x1
+     382:	da0080e7          	jalr	-608(ra) # 111e <gets>
+  if(buf[0] == 0) // EOF
+     386:	0004c503          	lbu	a0,0(s1)
+     38a:	00153513          	seqz	a0,a0
+    return -1;
+  return 0;
+}
+     38e:	40a00533          	neg	a0,a0
+     392:	60e2                	ld	ra,24(sp)
+     394:	6442                	ld	s0,16(sp)
+     396:	64a2                	ld	s1,8(sp)
+     398:	6902                	ld	s2,0(sp)
+     39a:	6105                	addi	sp,sp,32
+     39c:	8082                	ret
+
+000000000000039e <panic>:
+  exit(0);
+}
+
+void
+panic(char *s)
+{
+     39e:	1141                	addi	sp,sp,-16
+     3a0:	e406                	sd	ra,8(sp)
+     3a2:	e022                	sd	s0,0(sp)
+     3a4:	0800                	addi	s0,sp,16
+     3a6:	862a                	mv	a2,a0
+  fprintf(2, "%s\n", s);
+     3a8:	00001597          	auipc	a1,0x1
+     3ac:	51858593          	addi	a1,a1,1304 # 18c0 <malloc+0x154>
+     3b0:	4509                	li	a0,2
+     3b2:	00001097          	auipc	ra,0x1
+     3b6:	2d4080e7          	jalr	724(ra) # 1686 <fprintf>
+  exit(1);
+     3ba:	4505                	li	a0,1
+     3bc:	00001097          	auipc	ra,0x1
+     3c0:	f34080e7          	jalr	-204(ra) # 12f0 <exit>
+
+00000000000003c4 <fork1>:
+}
+
+int
+fork1(void)
+{
+     3c4:	1141                	addi	sp,sp,-16
+     3c6:	e406                	sd	ra,8(sp)
+     3c8:	e022                	sd	s0,0(sp)
+     3ca:	0800                	addi	s0,sp,16
+  int pid;
+
+  pid = fork();
+     3cc:	00001097          	auipc	ra,0x1
+     3d0:	f1c080e7          	jalr	-228(ra) # 12e8 <fork>
+  if(pid == -1)
+     3d4:	57fd                	li	a5,-1
+     3d6:	00f50663          	beq	a0,a5,3e2 <fork1+0x1e>
+    panic("fork");
+  return pid;
+}
+     3da:	60a2                	ld	ra,8(sp)
+     3dc:	6402                	ld	s0,0(sp)
+     3de:	0141                	addi	sp,sp,16
+     3e0:	8082                	ret
+    panic("fork");
+     3e2:	00001517          	auipc	a0,0x1
+     3e6:	4e650513          	addi	a0,a0,1254 # 18c8 <malloc+0x15c>
+     3ea:	00000097          	auipc	ra,0x0
+     3ee:	fb4080e7          	jalr	-76(ra) # 39e <panic>
+
+00000000000003f2 <runcmd>:
+{
+     3f2:	7135                	addi	sp,sp,-160
+     3f4:	ed06                	sd	ra,152(sp)
+     3f6:	e922                	sd	s0,144(sp)
+     3f8:	e526                	sd	s1,136(sp)
+     3fa:	e14a                	sd	s2,128(sp)
+     3fc:	fcce                	sd	s3,120(sp)
+     3fe:	f8d2                	sd	s4,112(sp)
+     400:	f4d6                	sd	s5,104(sp)
+     402:	f0da                	sd	s6,96(sp)
+     404:	ecde                	sd	s7,88(sp)
+     406:	1100                	addi	s0,sp,160
+  if(cmd == 0)
+     408:	c10d                	beqz	a0,42a <runcmd+0x38>
+     40a:	84aa                	mv	s1,a0
+  switch(cmd->type){
+     40c:	4118                	lw	a4,0(a0)
+     40e:	4795                	li	a5,5
+     410:	02e7e263          	bltu	a5,a4,434 <runcmd+0x42>
+     414:	00056783          	lwu	a5,0(a0)
+     418:	078a                	slli	a5,a5,0x2
+     41a:	00001717          	auipc	a4,0x1
+     41e:	5ee70713          	addi	a4,a4,1518 # 1a08 <malloc+0x29c>
+     422:	97ba                	add	a5,a5,a4
+     424:	439c                	lw	a5,0(a5)
+     426:	97ba                	add	a5,a5,a4
+     428:	8782                	jr	a5
+    exit(1);
+     42a:	4505                	li	a0,1
+     42c:	00001097          	auipc	ra,0x1
+     430:	ec4080e7          	jalr	-316(ra) # 12f0 <exit>
+    panic("runcmd");
+     434:	00001517          	auipc	a0,0x1
+     438:	49c50513          	addi	a0,a0,1180 # 18d0 <malloc+0x164>
+     43c:	00000097          	auipc	ra,0x0
+     440:	f62080e7          	jalr	-158(ra) # 39e <panic>
+    if(ecmd->argv[0] == 0)
+     444:	6508                	ld	a0,8(a0)
+     446:	c155                	beqz	a0,4ea <runcmd+0xf8>
+    exec(ecmd->argv[0], ecmd->argv);
+     448:	00848a13          	addi	s4,s1,8
+     44c:	85d2                	mv	a1,s4
+     44e:	00001097          	auipc	ra,0x1
+     452:	ee4080e7          	jalr	-284(ra) # 1332 <exec>
+    for(i=0; i<nenv; i++)
+     456:	00001797          	auipc	a5,0x1
+     45a:	66a7a783          	lw	a5,1642(a5) # 1ac0 <nenv>
+     45e:	06f05763          	blez	a5,4cc <runcmd+0xda>
+     462:	00001917          	auipc	s2,0x1
+     466:	76f90913          	addi	s2,s2,1903 # 1bd1 <envs+0x21>
+     46a:	4981                	li	s3,0
+      *s_tmp++ = '/';
+     46c:	02f00b93          	li	s7,47
+      exec(env_cmd, ecmd->argv);
+     470:	f6840b13          	addi	s6,s0,-152
+    for(i=0; i<nenv; i++)
+     474:	00001a97          	auipc	s5,0x1
+     478:	64ca8a93          	addi	s5,s5,1612 # 1ac0 <nenv>
+      while((*s_tmp = *d_tmp++))
+     47c:	874a                	mv	a4,s2
+     47e:	fff94783          	lbu	a5,-1(s2)
+     482:	f6f40423          	sb	a5,-152(s0)
+     486:	c7bd                	beqz	a5,4f4 <runcmd+0x102>
+      char *s_tmp = env_cmd;
+     488:	f6840793          	addi	a5,s0,-152
+        s_tmp++;
+     48c:	0785                	addi	a5,a5,1
+      while((*s_tmp = *d_tmp++))
+     48e:	0705                	addi	a4,a4,1
+     490:	fff74683          	lbu	a3,-1(a4)
+     494:	00d78023          	sb	a3,0(a5)
+     498:	faf5                	bnez	a3,48c <runcmd+0x9a>
+      *s_tmp++ = '/';
+     49a:	00178713          	addi	a4,a5,1
+     49e:	01778023          	sb	s7,0(a5)
+      d_tmp = ecmd->argv[0];
+     4a2:	649c                	ld	a5,8(s1)
+      while((*s_tmp++ = *d_tmp++))
+     4a4:	0785                	addi	a5,a5,1
+     4a6:	0705                	addi	a4,a4,1
+     4a8:	fff7c683          	lbu	a3,-1(a5)
+     4ac:	fed70fa3          	sb	a3,-1(a4)
+     4b0:	faf5                	bnez	a3,4a4 <runcmd+0xb2>
+      exec(env_cmd, ecmd->argv);
+     4b2:	85d2                	mv	a1,s4
+     4b4:	855a                	mv	a0,s6
+     4b6:	00001097          	auipc	ra,0x1
+     4ba:	e7c080e7          	jalr	-388(ra) # 1332 <exec>
+    for(i=0; i<nenv; i++)
+     4be:	2985                	addiw	s3,s3,1
+     4c0:	08090913          	addi	s2,s2,128
+     4c4:	000aa783          	lw	a5,0(s5)
+     4c8:	faf9cae3          	blt	s3,a5,47c <runcmd+0x8a>
+    fprintf(2, "exec %s failed\n", ecmd->argv[0]);
+     4cc:	6490                	ld	a2,8(s1)
+     4ce:	00001597          	auipc	a1,0x1
+     4d2:	40a58593          	addi	a1,a1,1034 # 18d8 <malloc+0x16c>
+     4d6:	4509                	li	a0,2
+     4d8:	00001097          	auipc	ra,0x1
+     4dc:	1ae080e7          	jalr	430(ra) # 1686 <fprintf>
+  exit(0);
+     4e0:	4501                	li	a0,0
+     4e2:	00001097          	auipc	ra,0x1
+     4e6:	e0e080e7          	jalr	-498(ra) # 12f0 <exit>
+      exit(1);
+     4ea:	4505                	li	a0,1
+     4ec:	00001097          	auipc	ra,0x1
+     4f0:	e04080e7          	jalr	-508(ra) # 12f0 <exit>
+      char *s_tmp = env_cmd;
+     4f4:	f6840793          	addi	a5,s0,-152
+     4f8:	b74d                	j	49a <runcmd+0xa8>
+    close(rcmd->fd);
+     4fa:	5148                	lw	a0,36(a0)
+     4fc:	00001097          	auipc	ra,0x1
+     500:	e24080e7          	jalr	-476(ra) # 1320 <close>
+    if(open(rcmd->file, rcmd->mode) < 0){
+     504:	508c                	lw	a1,32(s1)
+     506:	6888                	ld	a0,16(s1)
+     508:	00001097          	auipc	ra,0x1
+     50c:	e34080e7          	jalr	-460(ra) # 133c <open>
+     510:	00054763          	bltz	a0,51e <runcmd+0x12c>
+    runcmd(rcmd->cmd);
+     514:	6488                	ld	a0,8(s1)
+     516:	00000097          	auipc	ra,0x0
+     51a:	edc080e7          	jalr	-292(ra) # 3f2 <runcmd>
+      fprintf(2, "open %s failed\n", rcmd->file);
+     51e:	6890                	ld	a2,16(s1)
+     520:	00001597          	auipc	a1,0x1
+     524:	3c858593          	addi	a1,a1,968 # 18e8 <malloc+0x17c>
+     528:	4509                	li	a0,2
+     52a:	00001097          	auipc	ra,0x1
+     52e:	15c080e7          	jalr	348(ra) # 1686 <fprintf>
+      exit(1);
+     532:	4505                	li	a0,1
+     534:	00001097          	auipc	ra,0x1
+     538:	dbc080e7          	jalr	-580(ra) # 12f0 <exit>
+    if(fork1() == 0)
+     53c:	00000097          	auipc	ra,0x0
+     540:	e88080e7          	jalr	-376(ra) # 3c4 <fork1>
+     544:	c919                	beqz	a0,55a <runcmd+0x168>
+    wait(0);
+     546:	4501                	li	a0,0
+     548:	00001097          	auipc	ra,0x1
+     54c:	db2080e7          	jalr	-590(ra) # 12fa <wait>
+    runcmd(lcmd->right);
+     550:	6888                	ld	a0,16(s1)
+     552:	00000097          	auipc	ra,0x0
+     556:	ea0080e7          	jalr	-352(ra) # 3f2 <runcmd>
+      runcmd(lcmd->left);
+     55a:	6488                	ld	a0,8(s1)
+     55c:	00000097          	auipc	ra,0x0
+     560:	e96080e7          	jalr	-362(ra) # 3f2 <runcmd>
+    if(pipe(p) < 0)
+     564:	fa840513          	addi	a0,s0,-88
+     568:	00001097          	auipc	ra,0x1
+     56c:	d9a080e7          	jalr	-614(ra) # 1302 <pipe>
+     570:	04054363          	bltz	a0,5b6 <runcmd+0x1c4>
+    if(fork1() == 0){
+     574:	00000097          	auipc	ra,0x0
+     578:	e50080e7          	jalr	-432(ra) # 3c4 <fork1>
+     57c:	c529                	beqz	a0,5c6 <runcmd+0x1d4>
+    if(fork1() == 0){
+     57e:	00000097          	auipc	ra,0x0
+     582:	e46080e7          	jalr	-442(ra) # 3c4 <fork1>
+     586:	cd25                	beqz	a0,5fe <runcmd+0x20c>
+    close(p[0]);
+     588:	fa842503          	lw	a0,-88(s0)
+     58c:	00001097          	auipc	ra,0x1
+     590:	d94080e7          	jalr	-620(ra) # 1320 <close>
+    close(p[1]);
+     594:	fac42503          	lw	a0,-84(s0)
+     598:	00001097          	auipc	ra,0x1
+     59c:	d88080e7          	jalr	-632(ra) # 1320 <close>
+    wait(0);
+     5a0:	4501                	li	a0,0
+     5a2:	00001097          	auipc	ra,0x1
+     5a6:	d58080e7          	jalr	-680(ra) # 12fa <wait>
+    wait(0);
+     5aa:	4501                	li	a0,0
+     5ac:	00001097          	auipc	ra,0x1
+     5b0:	d4e080e7          	jalr	-690(ra) # 12fa <wait>
+    break;
+     5b4:	b735                	j	4e0 <runcmd+0xee>
+      panic("pipe");
+     5b6:	00001517          	auipc	a0,0x1
+     5ba:	34250513          	addi	a0,a0,834 # 18f8 <malloc+0x18c>
+     5be:	00000097          	auipc	ra,0x0
+     5c2:	de0080e7          	jalr	-544(ra) # 39e <panic>
+      close(1);
+     5c6:	4505                	li	a0,1
+     5c8:	00001097          	auipc	ra,0x1
+     5cc:	d58080e7          	jalr	-680(ra) # 1320 <close>
+      dup(p[1]);
+     5d0:	fac42503          	lw	a0,-84(s0)
+     5d4:	00001097          	auipc	ra,0x1
+     5d8:	d90080e7          	jalr	-624(ra) # 1364 <dup>
+      close(p[0]);
+     5dc:	fa842503          	lw	a0,-88(s0)
+     5e0:	00001097          	auipc	ra,0x1
+     5e4:	d40080e7          	jalr	-704(ra) # 1320 <close>
+      close(p[1]);
+     5e8:	fac42503          	lw	a0,-84(s0)
+     5ec:	00001097          	auipc	ra,0x1
+     5f0:	d34080e7          	jalr	-716(ra) # 1320 <close>
+      runcmd(pcmd->left);
+     5f4:	6488                	ld	a0,8(s1)
+     5f6:	00000097          	auipc	ra,0x0
+     5fa:	dfc080e7          	jalr	-516(ra) # 3f2 <runcmd>
+      close(0);
+     5fe:	00001097          	auipc	ra,0x1
+     602:	d22080e7          	jalr	-734(ra) # 1320 <close>
+      dup(p[0]);
+     606:	fa842503          	lw	a0,-88(s0)
+     60a:	00001097          	auipc	ra,0x1
+     60e:	d5a080e7          	jalr	-678(ra) # 1364 <dup>
+      close(p[0]);
+     612:	fa842503          	lw	a0,-88(s0)
+     616:	00001097          	auipc	ra,0x1
+     61a:	d0a080e7          	jalr	-758(ra) # 1320 <close>
+      close(p[1]);
+     61e:	fac42503          	lw	a0,-84(s0)
+     622:	00001097          	auipc	ra,0x1
+     626:	cfe080e7          	jalr	-770(ra) # 1320 <close>
+      runcmd(pcmd->right);
+     62a:	6888                	ld	a0,16(s1)
+     62c:	00000097          	auipc	ra,0x0
+     630:	dc6080e7          	jalr	-570(ra) # 3f2 <runcmd>
+    if(fork1() == 0)
+     634:	00000097          	auipc	ra,0x0
+     638:	d90080e7          	jalr	-624(ra) # 3c4 <fork1>
+     63c:	ea0512e3          	bnez	a0,4e0 <runcmd+0xee>
+      runcmd(bcmd->cmd);
+     640:	6488                	ld	a0,8(s1)
+     642:	00000097          	auipc	ra,0x0
+     646:	db0080e7          	jalr	-592(ra) # 3f2 <runcmd>
+
+000000000000064a <execcmd>:
+//PAGEBREAK!
+// Constructors
+
+struct cmd*
+execcmd(void)
+{
+     64a:	1101                	addi	sp,sp,-32
+     64c:	ec06                	sd	ra,24(sp)
+     64e:	e822                	sd	s0,16(sp)
+     650:	e426                	sd	s1,8(sp)
+     652:	1000                	addi	s0,sp,32
+  struct execcmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+     654:	0a800513          	li	a0,168
+     658:	00001097          	auipc	ra,0x1
+     65c:	114080e7          	jalr	276(ra) # 176c <malloc>
+     660:	84aa                	mv	s1,a0
+  memset(cmd, 0, sizeof(*cmd));
+     662:	0a800613          	li	a2,168
+     666:	4581                	li	a1,0
+     668:	00001097          	auipc	ra,0x1
+     66c:	a70080e7          	jalr	-1424(ra) # 10d8 <memset>
+  cmd->type = EXEC;
+     670:	4785                	li	a5,1
+     672:	c09c                	sw	a5,0(s1)
+  return (struct cmd*)cmd;
+}
+     674:	8526                	mv	a0,s1
+     676:	60e2                	ld	ra,24(sp)
+     678:	6442                	ld	s0,16(sp)
+     67a:	64a2                	ld	s1,8(sp)
+     67c:	6105                	addi	sp,sp,32
+     67e:	8082                	ret
+
+0000000000000680 <redircmd>:
+
+struct cmd*
+redircmd(struct cmd *subcmd, char *file, char *efile, int mode, int fd)
+{
+     680:	7139                	addi	sp,sp,-64
+     682:	fc06                	sd	ra,56(sp)
+     684:	f822                	sd	s0,48(sp)
+     686:	f426                	sd	s1,40(sp)
+     688:	f04a                	sd	s2,32(sp)
+     68a:	ec4e                	sd	s3,24(sp)
+     68c:	e852                	sd	s4,16(sp)
+     68e:	e456                	sd	s5,8(sp)
+     690:	e05a                	sd	s6,0(sp)
+     692:	0080                	addi	s0,sp,64
+     694:	8b2a                	mv	s6,a0
+     696:	8aae                	mv	s5,a1
+     698:	8a32                	mv	s4,a2
+     69a:	89b6                	mv	s3,a3
+     69c:	893a                	mv	s2,a4
+  struct redircmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+     69e:	02800513          	li	a0,40
+     6a2:	00001097          	auipc	ra,0x1
+     6a6:	0ca080e7          	jalr	202(ra) # 176c <malloc>
+     6aa:	84aa                	mv	s1,a0
+  memset(cmd, 0, sizeof(*cmd));
+     6ac:	02800613          	li	a2,40
+     6b0:	4581                	li	a1,0
+     6b2:	00001097          	auipc	ra,0x1
+     6b6:	a26080e7          	jalr	-1498(ra) # 10d8 <memset>
+  cmd->type = REDIR;
+     6ba:	4789                	li	a5,2
+     6bc:	c09c                	sw	a5,0(s1)
+  cmd->cmd = subcmd;
+     6be:	0164b423          	sd	s6,8(s1)
+  cmd->file = file;
+     6c2:	0154b823          	sd	s5,16(s1)
+  cmd->efile = efile;
+     6c6:	0144bc23          	sd	s4,24(s1)
+  cmd->mode = mode;
+     6ca:	0334a023          	sw	s3,32(s1)
+  cmd->fd = fd;
+     6ce:	0324a223          	sw	s2,36(s1)
+  return (struct cmd*)cmd;
+}
+     6d2:	8526                	mv	a0,s1
+     6d4:	70e2                	ld	ra,56(sp)
+     6d6:	7442                	ld	s0,48(sp)
+     6d8:	74a2                	ld	s1,40(sp)
+     6da:	7902                	ld	s2,32(sp)
+     6dc:	69e2                	ld	s3,24(sp)
+     6de:	6a42                	ld	s4,16(sp)
+     6e0:	6aa2                	ld	s5,8(sp)
+     6e2:	6b02                	ld	s6,0(sp)
+     6e4:	6121                	addi	sp,sp,64
+     6e6:	8082                	ret
+
+00000000000006e8 <pipecmd>:
+
+struct cmd*
+pipecmd(struct cmd *left, struct cmd *right)
+{
+     6e8:	7179                	addi	sp,sp,-48
+     6ea:	f406                	sd	ra,40(sp)
+     6ec:	f022                	sd	s0,32(sp)
+     6ee:	ec26                	sd	s1,24(sp)
+     6f0:	e84a                	sd	s2,16(sp)
+     6f2:	e44e                	sd	s3,8(sp)
+     6f4:	1800                	addi	s0,sp,48
+     6f6:	89aa                	mv	s3,a0
+     6f8:	892e                	mv	s2,a1
+  struct pipecmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+     6fa:	4561                	li	a0,24
+     6fc:	00001097          	auipc	ra,0x1
+     700:	070080e7          	jalr	112(ra) # 176c <malloc>
+     704:	84aa                	mv	s1,a0
+  memset(cmd, 0, sizeof(*cmd));
+     706:	4661                	li	a2,24
+     708:	4581                	li	a1,0
+     70a:	00001097          	auipc	ra,0x1
+     70e:	9ce080e7          	jalr	-1586(ra) # 10d8 <memset>
+  cmd->type = PIPE;
+     712:	478d                	li	a5,3
+     714:	c09c                	sw	a5,0(s1)
+  cmd->left = left;
+     716:	0134b423          	sd	s3,8(s1)
+  cmd->right = right;
+     71a:	0124b823          	sd	s2,16(s1)
+  return (struct cmd*)cmd;
+}
+     71e:	8526                	mv	a0,s1
+     720:	70a2                	ld	ra,40(sp)
+     722:	7402                	ld	s0,32(sp)
+     724:	64e2                	ld	s1,24(sp)
+     726:	6942                	ld	s2,16(sp)
+     728:	69a2                	ld	s3,8(sp)
+     72a:	6145                	addi	sp,sp,48
+     72c:	8082                	ret
+
+000000000000072e <listcmd>:
+
+struct cmd*
+listcmd(struct cmd *left, struct cmd *right)
+{
+     72e:	7179                	addi	sp,sp,-48
+     730:	f406                	sd	ra,40(sp)
+     732:	f022                	sd	s0,32(sp)
+     734:	ec26                	sd	s1,24(sp)
+     736:	e84a                	sd	s2,16(sp)
+     738:	e44e                	sd	s3,8(sp)
+     73a:	1800                	addi	s0,sp,48
+     73c:	89aa                	mv	s3,a0
+     73e:	892e                	mv	s2,a1
+  struct listcmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+     740:	4561                	li	a0,24
+     742:	00001097          	auipc	ra,0x1
+     746:	02a080e7          	jalr	42(ra) # 176c <malloc>
+     74a:	84aa                	mv	s1,a0
+  memset(cmd, 0, sizeof(*cmd));
+     74c:	4661                	li	a2,24
+     74e:	4581                	li	a1,0
+     750:	00001097          	auipc	ra,0x1
+     754:	988080e7          	jalr	-1656(ra) # 10d8 <memset>
+  cmd->type = LIST;
+     758:	4791                	li	a5,4
+     75a:	c09c                	sw	a5,0(s1)
+  cmd->left = left;
+     75c:	0134b423          	sd	s3,8(s1)
+  cmd->right = right;
+     760:	0124b823          	sd	s2,16(s1)
+  return (struct cmd*)cmd;
+}
+     764:	8526                	mv	a0,s1
+     766:	70a2                	ld	ra,40(sp)
+     768:	7402                	ld	s0,32(sp)
+     76a:	64e2                	ld	s1,24(sp)
+     76c:	6942                	ld	s2,16(sp)
+     76e:	69a2                	ld	s3,8(sp)
+     770:	6145                	addi	sp,sp,48
+     772:	8082                	ret
+
+0000000000000774 <backcmd>:
+
+struct cmd*
+backcmd(struct cmd *subcmd)
+{
+     774:	1101                	addi	sp,sp,-32
+     776:	ec06                	sd	ra,24(sp)
+     778:	e822                	sd	s0,16(sp)
+     77a:	e426                	sd	s1,8(sp)
+     77c:	e04a                	sd	s2,0(sp)
+     77e:	1000                	addi	s0,sp,32
+     780:	892a                	mv	s2,a0
+  struct backcmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+     782:	4541                	li	a0,16
+     784:	00001097          	auipc	ra,0x1
+     788:	fe8080e7          	jalr	-24(ra) # 176c <malloc>
+     78c:	84aa                	mv	s1,a0
+  memset(cmd, 0, sizeof(*cmd));
+     78e:	4641                	li	a2,16
+     790:	4581                	li	a1,0
+     792:	00001097          	auipc	ra,0x1
+     796:	946080e7          	jalr	-1722(ra) # 10d8 <memset>
+  cmd->type = BACK;
+     79a:	4795                	li	a5,5
+     79c:	c09c                	sw	a5,0(s1)
+  cmd->cmd = subcmd;
+     79e:	0124b423          	sd	s2,8(s1)
+  return (struct cmd*)cmd;
+}
+     7a2:	8526                	mv	a0,s1
+     7a4:	60e2                	ld	ra,24(sp)
+     7a6:	6442                	ld	s0,16(sp)
+     7a8:	64a2                	ld	s1,8(sp)
+     7aa:	6902                	ld	s2,0(sp)
+     7ac:	6105                	addi	sp,sp,32
+     7ae:	8082                	ret
+
+00000000000007b0 <gettoken>:
+char whitespace[] = " \t\r\n\v";
+char symbols[] = "<|>&;()";
+
+int
+gettoken(char **ps, char *es, char **q, char **eq)
+{
+     7b0:	7139                	addi	sp,sp,-64
+     7b2:	fc06                	sd	ra,56(sp)
+     7b4:	f822                	sd	s0,48(sp)
+     7b6:	f426                	sd	s1,40(sp)
+     7b8:	f04a                	sd	s2,32(sp)
+     7ba:	ec4e                	sd	s3,24(sp)
+     7bc:	e852                	sd	s4,16(sp)
+     7be:	e456                	sd	s5,8(sp)
+     7c0:	e05a                	sd	s6,0(sp)
+     7c2:	0080                	addi	s0,sp,64
+     7c4:	8a2a                	mv	s4,a0
+     7c6:	892e                	mv	s2,a1
+     7c8:	8ab2                	mv	s5,a2
+     7ca:	8b36                	mv	s6,a3
+  char *s;
+  int ret;
+
+  s = *ps;
+     7cc:	6104                	ld	s1,0(a0)
+  while(s < es && strchr(whitespace, *s))
+     7ce:	00001997          	auipc	s3,0x1
+     7d2:	2e298993          	addi	s3,s3,738 # 1ab0 <whitespace>
+     7d6:	00b4fe63          	bgeu	s1,a1,7f2 <gettoken+0x42>
+     7da:	0004c583          	lbu	a1,0(s1)
+     7de:	854e                	mv	a0,s3
+     7e0:	00001097          	auipc	ra,0x1
+     7e4:	91a080e7          	jalr	-1766(ra) # 10fa <strchr>
+     7e8:	c509                	beqz	a0,7f2 <gettoken+0x42>
+    s++;
+     7ea:	0485                	addi	s1,s1,1
+  while(s < es && strchr(whitespace, *s))
+     7ec:	fe9917e3          	bne	s2,s1,7da <gettoken+0x2a>
+    s++;
+     7f0:	84ca                	mv	s1,s2
+  if(q)
+     7f2:	000a8463          	beqz	s5,7fa <gettoken+0x4a>
+    *q = s;
+     7f6:	009ab023          	sd	s1,0(s5)
+  ret = *s;
+     7fa:	0004c783          	lbu	a5,0(s1)
+     7fe:	00078a9b          	sext.w	s5,a5
+  switch(*s){
+     802:	03c00713          	li	a4,60
+     806:	06f76663          	bltu	a4,a5,872 <gettoken+0xc2>
+     80a:	03a00713          	li	a4,58
+     80e:	00f76e63          	bltu	a4,a5,82a <gettoken+0x7a>
+     812:	cf89                	beqz	a5,82c <gettoken+0x7c>
+     814:	02600713          	li	a4,38
+     818:	00e78963          	beq	a5,a4,82a <gettoken+0x7a>
+     81c:	fd87879b          	addiw	a5,a5,-40
+     820:	0ff7f793          	zext.b	a5,a5
+     824:	4705                	li	a4,1
+     826:	06f76d63          	bltu	a4,a5,8a0 <gettoken+0xf0>
+  case '(':
+  case ')':
+  case ';':
+  case '&':
+  case '<':
+    s++;
+     82a:	0485                	addi	s1,s1,1
+    ret = 'a';
+    while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s))
+      s++;
+    break;
+  }
+  if(eq)
+     82c:	000b0463          	beqz	s6,834 <gettoken+0x84>
+    *eq = s;
+     830:	009b3023          	sd	s1,0(s6)
+
+  while(s < es && strchr(whitespace, *s))
+     834:	00001997          	auipc	s3,0x1
+     838:	27c98993          	addi	s3,s3,636 # 1ab0 <whitespace>
+     83c:	0124fe63          	bgeu	s1,s2,858 <gettoken+0xa8>
+     840:	0004c583          	lbu	a1,0(s1)
+     844:	854e                	mv	a0,s3
+     846:	00001097          	auipc	ra,0x1
+     84a:	8b4080e7          	jalr	-1868(ra) # 10fa <strchr>
+     84e:	c509                	beqz	a0,858 <gettoken+0xa8>
+    s++;
+     850:	0485                	addi	s1,s1,1
+  while(s < es && strchr(whitespace, *s))
+     852:	fe9917e3          	bne	s2,s1,840 <gettoken+0x90>
+    s++;
+     856:	84ca                	mv	s1,s2
+  *ps = s;
+     858:	009a3023          	sd	s1,0(s4)
+  return ret;
+}
+     85c:	8556                	mv	a0,s5
+     85e:	70e2                	ld	ra,56(sp)
+     860:	7442                	ld	s0,48(sp)
+     862:	74a2                	ld	s1,40(sp)
+     864:	7902                	ld	s2,32(sp)
+     866:	69e2                	ld	s3,24(sp)
+     868:	6a42                	ld	s4,16(sp)
+     86a:	6aa2                	ld	s5,8(sp)
+     86c:	6b02                	ld	s6,0(sp)
+     86e:	6121                	addi	sp,sp,64
+     870:	8082                	ret
+  switch(*s){
+     872:	03e00713          	li	a4,62
+     876:	02e79163          	bne	a5,a4,898 <gettoken+0xe8>
+    s++;
+     87a:	00148693          	addi	a3,s1,1
+    if(*s == '>'){
+     87e:	0014c703          	lbu	a4,1(s1)
+     882:	03e00793          	li	a5,62
+      s++;
+     886:	0489                	addi	s1,s1,2
+      ret = '+';
+     888:	02b00a93          	li	s5,43
+    if(*s == '>'){
+     88c:	faf700e3          	beq	a4,a5,82c <gettoken+0x7c>
+    s++;
+     890:	84b6                	mv	s1,a3
+  ret = *s;
+     892:	03e00a93          	li	s5,62
+     896:	bf59                	j	82c <gettoken+0x7c>
+  switch(*s){
+     898:	07c00713          	li	a4,124
+     89c:	f8e787e3          	beq	a5,a4,82a <gettoken+0x7a>
+    while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s))
+     8a0:	00001997          	auipc	s3,0x1
+     8a4:	21098993          	addi	s3,s3,528 # 1ab0 <whitespace>
+     8a8:	00001a97          	auipc	s5,0x1
+     8ac:	210a8a93          	addi	s5,s5,528 # 1ab8 <symbols>
+     8b0:	0324f663          	bgeu	s1,s2,8dc <gettoken+0x12c>
+     8b4:	0004c583          	lbu	a1,0(s1)
+     8b8:	854e                	mv	a0,s3
+     8ba:	00001097          	auipc	ra,0x1
+     8be:	840080e7          	jalr	-1984(ra) # 10fa <strchr>
+     8c2:	e50d                	bnez	a0,8ec <gettoken+0x13c>
+     8c4:	0004c583          	lbu	a1,0(s1)
+     8c8:	8556                	mv	a0,s5
+     8ca:	00001097          	auipc	ra,0x1
+     8ce:	830080e7          	jalr	-2000(ra) # 10fa <strchr>
+     8d2:	e911                	bnez	a0,8e6 <gettoken+0x136>
+      s++;
+     8d4:	0485                	addi	s1,s1,1
+    while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s))
+     8d6:	fc991fe3          	bne	s2,s1,8b4 <gettoken+0x104>
+      s++;
+     8da:	84ca                	mv	s1,s2
+  if(eq)
+     8dc:	06100a93          	li	s5,97
+     8e0:	f40b18e3          	bnez	s6,830 <gettoken+0x80>
+     8e4:	bf95                	j	858 <gettoken+0xa8>
+    ret = 'a';
+     8e6:	06100a93          	li	s5,97
+     8ea:	b789                	j	82c <gettoken+0x7c>
+     8ec:	06100a93          	li	s5,97
+     8f0:	bf35                	j	82c <gettoken+0x7c>
+
+00000000000008f2 <peek>:
+
+int
+peek(char **ps, char *es, char *toks)
+{
+     8f2:	7139                	addi	sp,sp,-64
+     8f4:	fc06                	sd	ra,56(sp)
+     8f6:	f822                	sd	s0,48(sp)
+     8f8:	f426                	sd	s1,40(sp)
+     8fa:	f04a                	sd	s2,32(sp)
+     8fc:	ec4e                	sd	s3,24(sp)
+     8fe:	e852                	sd	s4,16(sp)
+     900:	e456                	sd	s5,8(sp)
+     902:	0080                	addi	s0,sp,64
+     904:	8a2a                	mv	s4,a0
+     906:	892e                	mv	s2,a1
+     908:	8ab2                	mv	s5,a2
+  char *s;
+
+  s = *ps;
+     90a:	6104                	ld	s1,0(a0)
+  while(s < es && strchr(whitespace, *s))
+     90c:	00001997          	auipc	s3,0x1
+     910:	1a498993          	addi	s3,s3,420 # 1ab0 <whitespace>
+     914:	00b4fe63          	bgeu	s1,a1,930 <peek+0x3e>
+     918:	0004c583          	lbu	a1,0(s1)
+     91c:	854e                	mv	a0,s3
+     91e:	00000097          	auipc	ra,0x0
+     922:	7dc080e7          	jalr	2012(ra) # 10fa <strchr>
+     926:	c509                	beqz	a0,930 <peek+0x3e>
+    s++;
+     928:	0485                	addi	s1,s1,1
+  while(s < es && strchr(whitespace, *s))
+     92a:	fe9917e3          	bne	s2,s1,918 <peek+0x26>
+    s++;
+     92e:	84ca                	mv	s1,s2
+  *ps = s;
+     930:	009a3023          	sd	s1,0(s4)
+  return *s && strchr(toks, *s);
+     934:	0004c583          	lbu	a1,0(s1)
+     938:	4501                	li	a0,0
+     93a:	e991                	bnez	a1,94e <peek+0x5c>
+}
+     93c:	70e2                	ld	ra,56(sp)
+     93e:	7442                	ld	s0,48(sp)
+     940:	74a2                	ld	s1,40(sp)
+     942:	7902                	ld	s2,32(sp)
+     944:	69e2                	ld	s3,24(sp)
+     946:	6a42                	ld	s4,16(sp)
+     948:	6aa2                	ld	s5,8(sp)
+     94a:	6121                	addi	sp,sp,64
+     94c:	8082                	ret
+  return *s && strchr(toks, *s);
+     94e:	8556                	mv	a0,s5
+     950:	00000097          	auipc	ra,0x0
+     954:	7aa080e7          	jalr	1962(ra) # 10fa <strchr>
+     958:	00a03533          	snez	a0,a0
+     95c:	b7c5                	j	93c <peek+0x4a>
+
+000000000000095e <parseredirs>:
+  return cmd;
+}
+
+struct cmd*
+parseredirs(struct cmd *cmd, char **ps, char *es)
+{
+     95e:	7119                	addi	sp,sp,-128
+     960:	fc86                	sd	ra,120(sp)
+     962:	f8a2                	sd	s0,112(sp)
+     964:	f4a6                	sd	s1,104(sp)
+     966:	f0ca                	sd	s2,96(sp)
+     968:	ecce                	sd	s3,88(sp)
+     96a:	e8d2                	sd	s4,80(sp)
+     96c:	e4d6                	sd	s5,72(sp)
+     96e:	e0da                	sd	s6,64(sp)
+     970:	fc5e                	sd	s7,56(sp)
+     972:	f862                	sd	s8,48(sp)
+     974:	f466                	sd	s9,40(sp)
+     976:	f06a                	sd	s10,32(sp)
+     978:	ec6e                	sd	s11,24(sp)
+     97a:	0100                	addi	s0,sp,128
+     97c:	8a2a                	mv	s4,a0
+     97e:	89ae                	mv	s3,a1
+     980:	8932                	mv	s2,a2
+  int tok;
+  char *q, *eq;
+
+  while(peek(ps, es, "<>")){
+     982:	00001b97          	auipc	s7,0x1
+     986:	f9eb8b93          	addi	s7,s7,-98 # 1920 <malloc+0x1b4>
+    tok = gettoken(ps, es, 0, 0);
+    if(gettoken(ps, es, &q, &eq) != 'a')
+     98a:	f8040d13          	addi	s10,s0,-128
+     98e:	f8840c93          	addi	s9,s0,-120
+     992:	06100c13          	li	s8,97
+      panic("missing file for redirection");
+    switch(tok){
+     996:	03c00d93          	li	s11,60
+  while(peek(ps, es, "<>")){
+     99a:	a02d                	j	9c4 <parseredirs+0x66>
+      panic("missing file for redirection");
+     99c:	00001517          	auipc	a0,0x1
+     9a0:	f6450513          	addi	a0,a0,-156 # 1900 <malloc+0x194>
+     9a4:	00000097          	auipc	ra,0x0
+     9a8:	9fa080e7          	jalr	-1542(ra) # 39e <panic>
+    case '<':
+      cmd = redircmd(cmd, q, eq, O_RDONLY, 0);
+     9ac:	4701                	li	a4,0
+     9ae:	4681                	li	a3,0
+     9b0:	f8043603          	ld	a2,-128(s0)
+     9b4:	f8843583          	ld	a1,-120(s0)
+     9b8:	8552                	mv	a0,s4
+     9ba:	00000097          	auipc	ra,0x0
+     9be:	cc6080e7          	jalr	-826(ra) # 680 <redircmd>
+     9c2:	8a2a                	mv	s4,a0
+    switch(tok){
+     9c4:	03e00b13          	li	s6,62
+     9c8:	02b00a93          	li	s5,43
+  while(peek(ps, es, "<>")){
+     9cc:	865e                	mv	a2,s7
+     9ce:	85ca                	mv	a1,s2
+     9d0:	854e                	mv	a0,s3
+     9d2:	00000097          	auipc	ra,0x0
+     9d6:	f20080e7          	jalr	-224(ra) # 8f2 <peek>
+     9da:	c535                	beqz	a0,a46 <parseredirs+0xe8>
+    tok = gettoken(ps, es, 0, 0);
+     9dc:	4681                	li	a3,0
+     9de:	4601                	li	a2,0
+     9e0:	85ca                	mv	a1,s2
+     9e2:	854e                	mv	a0,s3
+     9e4:	00000097          	auipc	ra,0x0
+     9e8:	dcc080e7          	jalr	-564(ra) # 7b0 <gettoken>
+     9ec:	84aa                	mv	s1,a0
+    if(gettoken(ps, es, &q, &eq) != 'a')
+     9ee:	86ea                	mv	a3,s10
+     9f0:	8666                	mv	a2,s9
+     9f2:	85ca                	mv	a1,s2
+     9f4:	854e                	mv	a0,s3
+     9f6:	00000097          	auipc	ra,0x0
+     9fa:	dba080e7          	jalr	-582(ra) # 7b0 <gettoken>
+     9fe:	f9851fe3          	bne	a0,s8,99c <parseredirs+0x3e>
+    switch(tok){
+     a02:	fbb485e3          	beq	s1,s11,9ac <parseredirs+0x4e>
+     a06:	03648263          	beq	s1,s6,a2a <parseredirs+0xcc>
+     a0a:	fd5491e3          	bne	s1,s5,9cc <parseredirs+0x6e>
+      break;
+    case '>':
+      cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE|O_TRUNC, 1);
+      break;
+    case '+':  // >>
+      cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE|O_APPEND, 1);
+     a0e:	4705                	li	a4,1
+     a10:	20500693          	li	a3,517
+     a14:	f8043603          	ld	a2,-128(s0)
+     a18:	f8843583          	ld	a1,-120(s0)
+     a1c:	8552                	mv	a0,s4
+     a1e:	00000097          	auipc	ra,0x0
+     a22:	c62080e7          	jalr	-926(ra) # 680 <redircmd>
+     a26:	8a2a                	mv	s4,a0
+      break;
+     a28:	bf71                	j	9c4 <parseredirs+0x66>
+      cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE|O_TRUNC, 1);
+     a2a:	4705                	li	a4,1
+     a2c:	60100693          	li	a3,1537
+     a30:	f8043603          	ld	a2,-128(s0)
+     a34:	f8843583          	ld	a1,-120(s0)
+     a38:	8552                	mv	a0,s4
+     a3a:	00000097          	auipc	ra,0x0
+     a3e:	c46080e7          	jalr	-954(ra) # 680 <redircmd>
+     a42:	8a2a                	mv	s4,a0
+      break;
+     a44:	b741                	j	9c4 <parseredirs+0x66>
+    }
+  }
+  return cmd;
+}
+     a46:	8552                	mv	a0,s4
+     a48:	70e6                	ld	ra,120(sp)
+     a4a:	7446                	ld	s0,112(sp)
+     a4c:	74a6                	ld	s1,104(sp)
+     a4e:	7906                	ld	s2,96(sp)
+     a50:	69e6                	ld	s3,88(sp)
+     a52:	6a46                	ld	s4,80(sp)
+     a54:	6aa6                	ld	s5,72(sp)
+     a56:	6b06                	ld	s6,64(sp)
+     a58:	7be2                	ld	s7,56(sp)
+     a5a:	7c42                	ld	s8,48(sp)
+     a5c:	7ca2                	ld	s9,40(sp)
+     a5e:	7d02                	ld	s10,32(sp)
+     a60:	6de2                	ld	s11,24(sp)
+     a62:	6109                	addi	sp,sp,128
+     a64:	8082                	ret
+
+0000000000000a66 <parseexec>:
+  return cmd;
+}
+
+struct cmd*
+parseexec(char **ps, char *es)
+{
+     a66:	7119                	addi	sp,sp,-128
+     a68:	fc86                	sd	ra,120(sp)
+     a6a:	f8a2                	sd	s0,112(sp)
+     a6c:	f4a6                	sd	s1,104(sp)
+     a6e:	f0ca                	sd	s2,96(sp)
+     a70:	ecce                	sd	s3,88(sp)
+     a72:	e8d2                	sd	s4,80(sp)
+     a74:	e4d6                	sd	s5,72(sp)
+     a76:	e0da                	sd	s6,64(sp)
+     a78:	fc5e                	sd	s7,56(sp)
+     a7a:	f862                	sd	s8,48(sp)
+     a7c:	f466                	sd	s9,40(sp)
+     a7e:	f06a                	sd	s10,32(sp)
+     a80:	ec6e                	sd	s11,24(sp)
+     a82:	0100                	addi	s0,sp,128
+     a84:	8a2a                	mv	s4,a0
+     a86:	8aae                	mv	s5,a1
+  char *q, *eq;
+  int tok, argc;
+  struct execcmd *cmd;
+  struct cmd *ret;
+
+  if(peek(ps, es, "("))
+     a88:	00001617          	auipc	a2,0x1
+     a8c:	ea060613          	addi	a2,a2,-352 # 1928 <malloc+0x1bc>
+     a90:	00000097          	auipc	ra,0x0
+     a94:	e62080e7          	jalr	-414(ra) # 8f2 <peek>
+     a98:	ed05                	bnez	a0,ad0 <parseexec+0x6a>
+     a9a:	89aa                	mv	s3,a0
+    return parseblock(ps, es);
+
+  ret = execcmd();
+     a9c:	00000097          	auipc	ra,0x0
+     aa0:	bae080e7          	jalr	-1106(ra) # 64a <execcmd>
+     aa4:	8daa                	mv	s11,a0
+  cmd = (struct execcmd*)ret;
+
+  argc = 0;
+  ret = parseredirs(ret, ps, es);
+     aa6:	8656                	mv	a2,s5
+     aa8:	85d2                	mv	a1,s4
+     aaa:	00000097          	auipc	ra,0x0
+     aae:	eb4080e7          	jalr	-332(ra) # 95e <parseredirs>
+     ab2:	84aa                	mv	s1,a0
+  while(!peek(ps, es, "|)&;")){
+     ab4:	008d8913          	addi	s2,s11,8
+     ab8:	00001b17          	auipc	s6,0x1
+     abc:	e90b0b13          	addi	s6,s6,-368 # 1948 <malloc+0x1dc>
+    if((tok=gettoken(ps, es, &q, &eq)) == 0)
+     ac0:	f8040c13          	addi	s8,s0,-128
+     ac4:	f8840b93          	addi	s7,s0,-120
+      break;
+    if(tok != 'a')
+     ac8:	06100d13          	li	s10,97
+      panic("syntax");
+    cmd->argv[argc] = q;
+    cmd->eargv[argc] = eq;
+    argc++;
+    if(argc >= MAXARGS)
+     acc:	4ca9                	li	s9,10
+  while(!peek(ps, es, "|)&;")){
+     ace:	a881                	j	b1e <parseexec+0xb8>
+    return parseblock(ps, es);
+     ad0:	85d6                	mv	a1,s5
+     ad2:	8552                	mv	a0,s4
+     ad4:	00000097          	auipc	ra,0x0
+     ad8:	1bc080e7          	jalr	444(ra) # c90 <parseblock>
+     adc:	84aa                	mv	s1,a0
+    ret = parseredirs(ret, ps, es);
+  }
+  cmd->argv[argc] = 0;
+  cmd->eargv[argc] = 0;
+  return ret;
+}
+     ade:	8526                	mv	a0,s1
+     ae0:	70e6                	ld	ra,120(sp)
+     ae2:	7446                	ld	s0,112(sp)
+     ae4:	74a6                	ld	s1,104(sp)
+     ae6:	7906                	ld	s2,96(sp)
+     ae8:	69e6                	ld	s3,88(sp)
+     aea:	6a46                	ld	s4,80(sp)
+     aec:	6aa6                	ld	s5,72(sp)
+     aee:	6b06                	ld	s6,64(sp)
+     af0:	7be2                	ld	s7,56(sp)
+     af2:	7c42                	ld	s8,48(sp)
+     af4:	7ca2                	ld	s9,40(sp)
+     af6:	7d02                	ld	s10,32(sp)
+     af8:	6de2                	ld	s11,24(sp)
+     afa:	6109                	addi	sp,sp,128
+     afc:	8082                	ret
+      panic("syntax");
+     afe:	00001517          	auipc	a0,0x1
+     b02:	e3250513          	addi	a0,a0,-462 # 1930 <malloc+0x1c4>
+     b06:	00000097          	auipc	ra,0x0
+     b0a:	898080e7          	jalr	-1896(ra) # 39e <panic>
+    ret = parseredirs(ret, ps, es);
+     b0e:	8656                	mv	a2,s5
+     b10:	85d2                	mv	a1,s4
+     b12:	8526                	mv	a0,s1
+     b14:	00000097          	auipc	ra,0x0
+     b18:	e4a080e7          	jalr	-438(ra) # 95e <parseredirs>
+     b1c:	84aa                	mv	s1,a0
+  while(!peek(ps, es, "|)&;")){
+     b1e:	865a                	mv	a2,s6
+     b20:	85d6                	mv	a1,s5
+     b22:	8552                	mv	a0,s4
+     b24:	00000097          	auipc	ra,0x0
+     b28:	dce080e7          	jalr	-562(ra) # 8f2 <peek>
+     b2c:	e121                	bnez	a0,b6c <parseexec+0x106>
+    if((tok=gettoken(ps, es, &q, &eq)) == 0)
+     b2e:	86e2                	mv	a3,s8
+     b30:	865e                	mv	a2,s7
+     b32:	85d6                	mv	a1,s5
+     b34:	8552                	mv	a0,s4
+     b36:	00000097          	auipc	ra,0x0
+     b3a:	c7a080e7          	jalr	-902(ra) # 7b0 <gettoken>
+     b3e:	c51d                	beqz	a0,b6c <parseexec+0x106>
+    if(tok != 'a')
+     b40:	fba51fe3          	bne	a0,s10,afe <parseexec+0x98>
+    cmd->argv[argc] = q;
+     b44:	f8843783          	ld	a5,-120(s0)
+     b48:	00f93023          	sd	a5,0(s2)
+    cmd->eargv[argc] = eq;
+     b4c:	f8043783          	ld	a5,-128(s0)
+     b50:	04f93823          	sd	a5,80(s2)
+    argc++;
+     b54:	2985                	addiw	s3,s3,1
+    if(argc >= MAXARGS)
+     b56:	0921                	addi	s2,s2,8
+     b58:	fb999be3          	bne	s3,s9,b0e <parseexec+0xa8>
+      panic("too many args");
+     b5c:	00001517          	auipc	a0,0x1
+     b60:	ddc50513          	addi	a0,a0,-548 # 1938 <malloc+0x1cc>
+     b64:	00000097          	auipc	ra,0x0
+     b68:	83a080e7          	jalr	-1990(ra) # 39e <panic>
+  cmd->argv[argc] = 0;
+     b6c:	098e                	slli	s3,s3,0x3
+     b6e:	9dce                	add	s11,s11,s3
+     b70:	000db423          	sd	zero,8(s11)
+  cmd->eargv[argc] = 0;
+     b74:	040dbc23          	sd	zero,88(s11)
+  return ret;
+     b78:	b79d                	j	ade <parseexec+0x78>
+
+0000000000000b7a <parsepipe>:
+{
+     b7a:	7179                	addi	sp,sp,-48
+     b7c:	f406                	sd	ra,40(sp)
+     b7e:	f022                	sd	s0,32(sp)
+     b80:	ec26                	sd	s1,24(sp)
+     b82:	e84a                	sd	s2,16(sp)
+     b84:	e44e                	sd	s3,8(sp)
+     b86:	1800                	addi	s0,sp,48
+     b88:	892a                	mv	s2,a0
+     b8a:	89ae                	mv	s3,a1
+  cmd = parseexec(ps, es);
+     b8c:	00000097          	auipc	ra,0x0
+     b90:	eda080e7          	jalr	-294(ra) # a66 <parseexec>
+     b94:	84aa                	mv	s1,a0
+  if(peek(ps, es, "|")){
+     b96:	00001617          	auipc	a2,0x1
+     b9a:	dba60613          	addi	a2,a2,-582 # 1950 <malloc+0x1e4>
+     b9e:	85ce                	mv	a1,s3
+     ba0:	854a                	mv	a0,s2
+     ba2:	00000097          	auipc	ra,0x0
+     ba6:	d50080e7          	jalr	-688(ra) # 8f2 <peek>
+     baa:	e909                	bnez	a0,bbc <parsepipe+0x42>
+}
+     bac:	8526                	mv	a0,s1
+     bae:	70a2                	ld	ra,40(sp)
+     bb0:	7402                	ld	s0,32(sp)
+     bb2:	64e2                	ld	s1,24(sp)
+     bb4:	6942                	ld	s2,16(sp)
+     bb6:	69a2                	ld	s3,8(sp)
+     bb8:	6145                	addi	sp,sp,48
+     bba:	8082                	ret
+    gettoken(ps, es, 0, 0);
+     bbc:	4681                	li	a3,0
+     bbe:	4601                	li	a2,0
+     bc0:	85ce                	mv	a1,s3
+     bc2:	854a                	mv	a0,s2
+     bc4:	00000097          	auipc	ra,0x0
+     bc8:	bec080e7          	jalr	-1044(ra) # 7b0 <gettoken>
+    cmd = pipecmd(cmd, parsepipe(ps, es));
+     bcc:	85ce                	mv	a1,s3
+     bce:	854a                	mv	a0,s2
+     bd0:	00000097          	auipc	ra,0x0
+     bd4:	faa080e7          	jalr	-86(ra) # b7a <parsepipe>
+     bd8:	85aa                	mv	a1,a0
+     bda:	8526                	mv	a0,s1
+     bdc:	00000097          	auipc	ra,0x0
+     be0:	b0c080e7          	jalr	-1268(ra) # 6e8 <pipecmd>
+     be4:	84aa                	mv	s1,a0
+  return cmd;
+     be6:	b7d9                	j	bac <parsepipe+0x32>
+
+0000000000000be8 <parseline>:
+{
+     be8:	7179                	addi	sp,sp,-48
+     bea:	f406                	sd	ra,40(sp)
+     bec:	f022                	sd	s0,32(sp)
+     bee:	ec26                	sd	s1,24(sp)
+     bf0:	e84a                	sd	s2,16(sp)
+     bf2:	e44e                	sd	s3,8(sp)
+     bf4:	e052                	sd	s4,0(sp)
+     bf6:	1800                	addi	s0,sp,48
+     bf8:	892a                	mv	s2,a0
+     bfa:	89ae                	mv	s3,a1
+  cmd = parsepipe(ps, es);
+     bfc:	00000097          	auipc	ra,0x0
+     c00:	f7e080e7          	jalr	-130(ra) # b7a <parsepipe>
+     c04:	84aa                	mv	s1,a0
+  while(peek(ps, es, "&")){
+     c06:	00001a17          	auipc	s4,0x1
+     c0a:	d52a0a13          	addi	s4,s4,-686 # 1958 <malloc+0x1ec>
+     c0e:	a839                	j	c2c <parseline+0x44>
+    gettoken(ps, es, 0, 0);
+     c10:	4681                	li	a3,0
+     c12:	4601                	li	a2,0
+     c14:	85ce                	mv	a1,s3
+     c16:	854a                	mv	a0,s2
+     c18:	00000097          	auipc	ra,0x0
+     c1c:	b98080e7          	jalr	-1128(ra) # 7b0 <gettoken>
+    cmd = backcmd(cmd);
+     c20:	8526                	mv	a0,s1
+     c22:	00000097          	auipc	ra,0x0
+     c26:	b52080e7          	jalr	-1198(ra) # 774 <backcmd>
+     c2a:	84aa                	mv	s1,a0
+  while(peek(ps, es, "&")){
+     c2c:	8652                	mv	a2,s4
+     c2e:	85ce                	mv	a1,s3
+     c30:	854a                	mv	a0,s2
+     c32:	00000097          	auipc	ra,0x0
+     c36:	cc0080e7          	jalr	-832(ra) # 8f2 <peek>
+     c3a:	f979                	bnez	a0,c10 <parseline+0x28>
+  if(peek(ps, es, ";")){
+     c3c:	00001617          	auipc	a2,0x1
+     c40:	d2460613          	addi	a2,a2,-732 # 1960 <malloc+0x1f4>
+     c44:	85ce                	mv	a1,s3
+     c46:	854a                	mv	a0,s2
+     c48:	00000097          	auipc	ra,0x0
+     c4c:	caa080e7          	jalr	-854(ra) # 8f2 <peek>
+     c50:	e911                	bnez	a0,c64 <parseline+0x7c>
+}
+     c52:	8526                	mv	a0,s1
+     c54:	70a2                	ld	ra,40(sp)
+     c56:	7402                	ld	s0,32(sp)
+     c58:	64e2                	ld	s1,24(sp)
+     c5a:	6942                	ld	s2,16(sp)
+     c5c:	69a2                	ld	s3,8(sp)
+     c5e:	6a02                	ld	s4,0(sp)
+     c60:	6145                	addi	sp,sp,48
+     c62:	8082                	ret
+    gettoken(ps, es, 0, 0);
+     c64:	4681                	li	a3,0
+     c66:	4601                	li	a2,0
+     c68:	85ce                	mv	a1,s3
+     c6a:	854a                	mv	a0,s2
+     c6c:	00000097          	auipc	ra,0x0
+     c70:	b44080e7          	jalr	-1212(ra) # 7b0 <gettoken>
+    cmd = listcmd(cmd, parseline(ps, es));
+     c74:	85ce                	mv	a1,s3
+     c76:	854a                	mv	a0,s2
+     c78:	00000097          	auipc	ra,0x0
+     c7c:	f70080e7          	jalr	-144(ra) # be8 <parseline>
+     c80:	85aa                	mv	a1,a0
+     c82:	8526                	mv	a0,s1
+     c84:	00000097          	auipc	ra,0x0
+     c88:	aaa080e7          	jalr	-1366(ra) # 72e <listcmd>
+     c8c:	84aa                	mv	s1,a0
+  return cmd;
+     c8e:	b7d1                	j	c52 <parseline+0x6a>
+
+0000000000000c90 <parseblock>:
+{
+     c90:	7179                	addi	sp,sp,-48
+     c92:	f406                	sd	ra,40(sp)
+     c94:	f022                	sd	s0,32(sp)
+     c96:	ec26                	sd	s1,24(sp)
+     c98:	e84a                	sd	s2,16(sp)
+     c9a:	e44e                	sd	s3,8(sp)
+     c9c:	1800                	addi	s0,sp,48
+     c9e:	84aa                	mv	s1,a0
+     ca0:	892e                	mv	s2,a1
+  if(!peek(ps, es, "("))
+     ca2:	00001617          	auipc	a2,0x1
+     ca6:	c8660613          	addi	a2,a2,-890 # 1928 <malloc+0x1bc>
+     caa:	00000097          	auipc	ra,0x0
+     cae:	c48080e7          	jalr	-952(ra) # 8f2 <peek>
+     cb2:	c12d                	beqz	a0,d14 <parseblock+0x84>
+  gettoken(ps, es, 0, 0);
+     cb4:	4681                	li	a3,0
+     cb6:	4601                	li	a2,0
+     cb8:	85ca                	mv	a1,s2
+     cba:	8526                	mv	a0,s1
+     cbc:	00000097          	auipc	ra,0x0
+     cc0:	af4080e7          	jalr	-1292(ra) # 7b0 <gettoken>
+  cmd = parseline(ps, es);
+     cc4:	85ca                	mv	a1,s2
+     cc6:	8526                	mv	a0,s1
+     cc8:	00000097          	auipc	ra,0x0
+     ccc:	f20080e7          	jalr	-224(ra) # be8 <parseline>
+     cd0:	89aa                	mv	s3,a0
+  if(!peek(ps, es, ")"))
+     cd2:	00001617          	auipc	a2,0x1
+     cd6:	ca660613          	addi	a2,a2,-858 # 1978 <malloc+0x20c>
+     cda:	85ca                	mv	a1,s2
+     cdc:	8526                	mv	a0,s1
+     cde:	00000097          	auipc	ra,0x0
+     ce2:	c14080e7          	jalr	-1004(ra) # 8f2 <peek>
+     ce6:	cd1d                	beqz	a0,d24 <parseblock+0x94>
+  gettoken(ps, es, 0, 0);
+     ce8:	4681                	li	a3,0
+     cea:	4601                	li	a2,0
+     cec:	85ca                	mv	a1,s2
+     cee:	8526                	mv	a0,s1
+     cf0:	00000097          	auipc	ra,0x0
+     cf4:	ac0080e7          	jalr	-1344(ra) # 7b0 <gettoken>
+  cmd = parseredirs(cmd, ps, es);
+     cf8:	864a                	mv	a2,s2
+     cfa:	85a6                	mv	a1,s1
+     cfc:	854e                	mv	a0,s3
+     cfe:	00000097          	auipc	ra,0x0
+     d02:	c60080e7          	jalr	-928(ra) # 95e <parseredirs>
+}
+     d06:	70a2                	ld	ra,40(sp)
+     d08:	7402                	ld	s0,32(sp)
+     d0a:	64e2                	ld	s1,24(sp)
+     d0c:	6942                	ld	s2,16(sp)
+     d0e:	69a2                	ld	s3,8(sp)
+     d10:	6145                	addi	sp,sp,48
+     d12:	8082                	ret
+    panic("parseblock");
+     d14:	00001517          	auipc	a0,0x1
+     d18:	c5450513          	addi	a0,a0,-940 # 1968 <malloc+0x1fc>
+     d1c:	fffff097          	auipc	ra,0xfffff
+     d20:	682080e7          	jalr	1666(ra) # 39e <panic>
+    panic("syntax - missing )");
+     d24:	00001517          	auipc	a0,0x1
+     d28:	c5c50513          	addi	a0,a0,-932 # 1980 <malloc+0x214>
+     d2c:	fffff097          	auipc	ra,0xfffff
+     d30:	672080e7          	jalr	1650(ra) # 39e <panic>
+
+0000000000000d34 <nulterminate>:
+
+// NUL-terminate all the counted strings.
+struct cmd*
+nulterminate(struct cmd *cmd)
+{
+     d34:	1101                	addi	sp,sp,-32
+     d36:	ec06                	sd	ra,24(sp)
+     d38:	e822                	sd	s0,16(sp)
+     d3a:	e426                	sd	s1,8(sp)
+     d3c:	1000                	addi	s0,sp,32
+     d3e:	84aa                	mv	s1,a0
+  struct execcmd *ecmd;
+  struct listcmd *lcmd;
+  struct pipecmd *pcmd;
+  struct redircmd *rcmd;
+
+  if(cmd == 0)
+     d40:	c521                	beqz	a0,d88 <nulterminate+0x54>
+    return 0;
+
+  switch(cmd->type){
+     d42:	4118                	lw	a4,0(a0)
+     d44:	4795                	li	a5,5
+     d46:	04e7e163          	bltu	a5,a4,d88 <nulterminate+0x54>
+     d4a:	00056783          	lwu	a5,0(a0)
+     d4e:	078a                	slli	a5,a5,0x2
+     d50:	00001717          	auipc	a4,0x1
+     d54:	cd070713          	addi	a4,a4,-816 # 1a20 <malloc+0x2b4>
+     d58:	97ba                	add	a5,a5,a4
+     d5a:	439c                	lw	a5,0(a5)
+     d5c:	97ba                	add	a5,a5,a4
+     d5e:	8782                	jr	a5
+  case EXEC:
+    ecmd = (struct execcmd*)cmd;
+    for(i=0; ecmd->argv[i]; i++)
+     d60:	651c                	ld	a5,8(a0)
+     d62:	c39d                	beqz	a5,d88 <nulterminate+0x54>
+     d64:	01050793          	addi	a5,a0,16
+      *ecmd->eargv[i] = 0;
+     d68:	67b8                	ld	a4,72(a5)
+     d6a:	00070023          	sb	zero,0(a4)
+    for(i=0; ecmd->argv[i]; i++)
+     d6e:	07a1                	addi	a5,a5,8
+     d70:	ff87b703          	ld	a4,-8(a5)
+     d74:	fb75                	bnez	a4,d68 <nulterminate+0x34>
+     d76:	a809                	j	d88 <nulterminate+0x54>
+    break;
+
+  case REDIR:
+    rcmd = (struct redircmd*)cmd;
+    nulterminate(rcmd->cmd);
+     d78:	6508                	ld	a0,8(a0)
+     d7a:	00000097          	auipc	ra,0x0
+     d7e:	fba080e7          	jalr	-70(ra) # d34 <nulterminate>
+    *rcmd->efile = 0;
+     d82:	6c9c                	ld	a5,24(s1)
+     d84:	00078023          	sb	zero,0(a5)
+    bcmd = (struct backcmd*)cmd;
+    nulterminate(bcmd->cmd);
+    break;
+  }
+  return cmd;
+     d88:	8526                	mv	a0,s1
+     d8a:	60e2                	ld	ra,24(sp)
+     d8c:	6442                	ld	s0,16(sp)
+     d8e:	64a2                	ld	s1,8(sp)
+     d90:	6105                	addi	sp,sp,32
+     d92:	8082                	ret
+    nulterminate(pcmd->left);
+     d94:	6508                	ld	a0,8(a0)
+     d96:	00000097          	auipc	ra,0x0
+     d9a:	f9e080e7          	jalr	-98(ra) # d34 <nulterminate>
+    nulterminate(pcmd->right);
+     d9e:	6888                	ld	a0,16(s1)
+     da0:	00000097          	auipc	ra,0x0
+     da4:	f94080e7          	jalr	-108(ra) # d34 <nulterminate>
+    break;
+     da8:	b7c5                	j	d88 <nulterminate+0x54>
+    nulterminate(lcmd->left);
+     daa:	6508                	ld	a0,8(a0)
+     dac:	00000097          	auipc	ra,0x0
+     db0:	f88080e7          	jalr	-120(ra) # d34 <nulterminate>
+    nulterminate(lcmd->right);
+     db4:	6888                	ld	a0,16(s1)
+     db6:	00000097          	auipc	ra,0x0
+     dba:	f7e080e7          	jalr	-130(ra) # d34 <nulterminate>
+    break;
+     dbe:	b7e9                	j	d88 <nulterminate+0x54>
+    nulterminate(bcmd->cmd);
+     dc0:	6508                	ld	a0,8(a0)
+     dc2:	00000097          	auipc	ra,0x0
+     dc6:	f72080e7          	jalr	-142(ra) # d34 <nulterminate>
+    break;
+     dca:	bf7d                	j	d88 <nulterminate+0x54>
+
+0000000000000dcc <parsecmd>:
+{
+     dcc:	7139                	addi	sp,sp,-64
+     dce:	fc06                	sd	ra,56(sp)
+     dd0:	f822                	sd	s0,48(sp)
+     dd2:	f426                	sd	s1,40(sp)
+     dd4:	f04a                	sd	s2,32(sp)
+     dd6:	ec4e                	sd	s3,24(sp)
+     dd8:	0080                	addi	s0,sp,64
+     dda:	fca43423          	sd	a0,-56(s0)
+  es = s + strlen(s);
+     dde:	84aa                	mv	s1,a0
+     de0:	00000097          	auipc	ra,0x0
+     de4:	2ce080e7          	jalr	718(ra) # 10ae <strlen>
+     de8:	1502                	slli	a0,a0,0x20
+     dea:	9101                	srli	a0,a0,0x20
+     dec:	94aa                	add	s1,s1,a0
+  cmd = parseline(&s, es);
+     dee:	85a6                	mv	a1,s1
+     df0:	fc840913          	addi	s2,s0,-56
+     df4:	854a                	mv	a0,s2
+     df6:	00000097          	auipc	ra,0x0
+     dfa:	df2080e7          	jalr	-526(ra) # be8 <parseline>
+     dfe:	89aa                	mv	s3,a0
+  peek(&s, es, "");
+     e00:	00001617          	auipc	a2,0x1
+     e04:	bf060613          	addi	a2,a2,-1040 # 19f0 <malloc+0x284>
+     e08:	85a6                	mv	a1,s1
+     e0a:	854a                	mv	a0,s2
+     e0c:	00000097          	auipc	ra,0x0
+     e10:	ae6080e7          	jalr	-1306(ra) # 8f2 <peek>
+  if(s != es){
+     e14:	fc843603          	ld	a2,-56(s0)
+     e18:	00961f63          	bne	a2,s1,e36 <parsecmd+0x6a>
+  nulterminate(cmd);
+     e1c:	854e                	mv	a0,s3
+     e1e:	00000097          	auipc	ra,0x0
+     e22:	f16080e7          	jalr	-234(ra) # d34 <nulterminate>
+}
+     e26:	854e                	mv	a0,s3
+     e28:	70e2                	ld	ra,56(sp)
+     e2a:	7442                	ld	s0,48(sp)
+     e2c:	74a2                	ld	s1,40(sp)
+     e2e:	7902                	ld	s2,32(sp)
+     e30:	69e2                	ld	s3,24(sp)
+     e32:	6121                	addi	sp,sp,64
+     e34:	8082                	ret
+    fprintf(2, "leftovers: %s\n", s);
+     e36:	00001597          	auipc	a1,0x1
+     e3a:	b6258593          	addi	a1,a1,-1182 # 1998 <malloc+0x22c>
+     e3e:	4509                	li	a0,2
+     e40:	00001097          	auipc	ra,0x1
+     e44:	846080e7          	jalr	-1978(ra) # 1686 <fprintf>
+    panic("syntax");
+     e48:	00001517          	auipc	a0,0x1
+     e4c:	ae850513          	addi	a0,a0,-1304 # 1930 <malloc+0x1c4>
+     e50:	fffff097          	auipc	ra,0xfffff
+     e54:	54e080e7          	jalr	1358(ra) # 39e <panic>
+
+0000000000000e58 <main>:
+{
+     e58:	711d                	addi	sp,sp,-96
+     e5a:	ec86                	sd	ra,88(sp)
+     e5c:	e8a2                	sd	s0,80(sp)
+     e5e:	e4a6                	sd	s1,72(sp)
+     e60:	e0ca                	sd	s2,64(sp)
+     e62:	fc4e                	sd	s3,56(sp)
+     e64:	f852                	sd	s4,48(sp)
+     e66:	f456                	sd	s5,40(sp)
+     e68:	f05a                	sd	s6,32(sp)
+     e6a:	ec5e                	sd	s7,24(sp)
+     e6c:	e862                	sd	s8,16(sp)
+     e6e:	e466                	sd	s9,8(sp)
+     e70:	1080                	addi	s0,sp,96
+  while((fd = dev(O_RDWR, 1, 0)) >= 0){
+     e72:	4601                	li	a2,0
+     e74:	4585                	li	a1,1
+     e76:	4509                	li	a0,2
+     e78:	00000097          	auipc	ra,0x0
+     e7c:	51e080e7          	jalr	1310(ra) # 1396 <dev>
+     e80:	00054963          	bltz	a0,e92 <main+0x3a>
+    if(fd >= 3){
+     e84:	4789                	li	a5,2
+     e86:	fea7d6e3          	bge	a5,a0,e72 <main+0x1a>
+      close(fd);
+     e8a:	00000097          	auipc	ra,0x0
+     e8e:	496080e7          	jalr	1174(ra) # 1320 <close>
+  strcpy(envs[nenv].name, "SHELL");
+     e92:	00001497          	auipc	s1,0x1
+     e96:	c2e48493          	addi	s1,s1,-978 # 1ac0 <nenv>
+     e9a:	4088                	lw	a0,0(s1)
+     e9c:	051e                	slli	a0,a0,0x7
+     e9e:	00001917          	auipc	s2,0x1
+     ea2:	d1290913          	addi	s2,s2,-750 # 1bb0 <envs>
+     ea6:	00001597          	auipc	a1,0x1
+     eaa:	b0258593          	addi	a1,a1,-1278 # 19a8 <malloc+0x23c>
+     eae:	954a                	add	a0,a0,s2
+     eb0:	00000097          	auipc	ra,0x0
+     eb4:	188080e7          	jalr	392(ra) # 1038 <strcpy>
+  strcpy(envs[nenv].value, "/bin");
+     eb8:	4088                	lw	a0,0(s1)
+     eba:	051e                	slli	a0,a0,0x7
+     ebc:	02050513          	addi	a0,a0,32
+     ec0:	00001597          	auipc	a1,0x1
+     ec4:	af058593          	addi	a1,a1,-1296 # 19b0 <malloc+0x244>
+     ec8:	954a                	add	a0,a0,s2
+     eca:	00000097          	auipc	ra,0x0
+     ece:	16e080e7          	jalr	366(ra) # 1038 <strcpy>
+  nenv++;
+     ed2:	409c                	lw	a5,0(s1)
+     ed4:	2785                	addiw	a5,a5,1
+     ed6:	c09c                	sw	a5,0(s1)
+  getcwd(mycwd);
+     ed8:	00001517          	auipc	a0,0x1
+     edc:	bf050513          	addi	a0,a0,-1040 # 1ac8 <mycwd>
+     ee0:	00000097          	auipc	ra,0x0
+     ee4:	4c8080e7          	jalr	1224(ra) # 13a8 <getcwd>
+  while(getcmd(buf, sizeof(buf)) >= 0){
+     ee8:	00001917          	auipc	s2,0x1
+     eec:	c6090913          	addi	s2,s2,-928 # 1b48 <buf.0>
+    replace(buf);
+     ef0:	89a6                	mv	s3,s1
+    if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){
+     ef2:	06300a13          	li	s4,99
+      else if(!strcmp(ecmd->argv[0], "export"))
+     ef6:	00001a97          	auipc	s5,0x1
+     efa:	ad2a8a93          	addi	s5,s5,-1326 # 19c8 <malloc+0x25c>
+          fprintf(2, "export failed\n");
+     efe:	00001b97          	auipc	s7,0x1
+     f02:	afab8b93          	addi	s7,s7,-1286 # 19f8 <malloc+0x28c>
+          fprintf(2, "Usage: export [-p] [NAME=VALUE]\n");
+     f06:	00001b17          	auipc	s6,0x1
+     f0a:	acab0b13          	addi	s6,s6,-1334 # 19d0 <malloc+0x264>
+      if(chdir(buf+3) < 0)
+     f0e:	00001c17          	auipc	s8,0x1
+     f12:	c3dc0c13          	addi	s8,s8,-963 # 1b4b <buf.0+0x3>
+      getcwd(mycwd);
+     f16:	00001c97          	auipc	s9,0x1
+     f1a:	bb2c8c93          	addi	s9,s9,-1102 # 1ac8 <mycwd>
+  while(getcmd(buf, sizeof(buf)) >= 0){
+     f1e:	a8a5                	j	f96 <main+0x13e>
+    if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){
+     f20:	08a9c703          	lbu	a4,138(s3)
+     f24:	02000793          	li	a5,32
+     f28:	08f71f63          	bne	a4,a5,fc6 <main+0x16e>
+      buf[strlen(buf)-1] = 0;  // chop \n
+     f2c:	854a                	mv	a0,s2
+     f2e:	00000097          	auipc	ra,0x0
+     f32:	180080e7          	jalr	384(ra) # 10ae <strlen>
+     f36:	fff5079b          	addiw	a5,a0,-1
+     f3a:	1782                	slli	a5,a5,0x20
+     f3c:	9381                	srli	a5,a5,0x20
+     f3e:	97ce                	add	a5,a5,s3
+     f40:	08078423          	sb	zero,136(a5)
+      if(chdir(buf+3) < 0)
+     f44:	8562                	mv	a0,s8
+     f46:	00000097          	auipc	ra,0x0
+     f4a:	414080e7          	jalr	1044(ra) # 135a <chdir>
+     f4e:	00054863          	bltz	a0,f5e <main+0x106>
+      getcwd(mycwd);
+     f52:	8566                	mv	a0,s9
+     f54:	00000097          	auipc	ra,0x0
+     f58:	454080e7          	jalr	1108(ra) # 13a8 <getcwd>
+     f5c:	a82d                	j	f96 <main+0x13e>
+        fprintf(2, "cannot cd %s\n", buf+3);
+     f5e:	8662                	mv	a2,s8
+     f60:	00001597          	auipc	a1,0x1
+     f64:	a5858593          	addi	a1,a1,-1448 # 19b8 <malloc+0x24c>
+     f68:	4509                	li	a0,2
+     f6a:	00000097          	auipc	ra,0x0
+     f6e:	71c080e7          	jalr	1820(ra) # 1686 <fprintf>
+     f72:	b7c5                	j	f52 <main+0xfa>
+        free(cmd);
+     f74:	8526                	mv	a0,s1
+     f76:	00000097          	auipc	ra,0x0
+     f7a:	774080e7          	jalr	1908(ra) # 16ea <free>
+        continue;
+     f7e:	a821                	j	f96 <main+0x13e>
+          fprintf(2, "Usage: export [-p] [NAME=VALUE]\n");
+     f80:	85da                	mv	a1,s6
+     f82:	4509                	li	a0,2
+     f84:	00000097          	auipc	ra,0x0
+     f88:	702080e7          	jalr	1794(ra) # 1686 <fprintf>
+        free(cmd);
+     f8c:	8526                	mv	a0,s1
+     f8e:	00000097          	auipc	ra,0x0
+     f92:	75c080e7          	jalr	1884(ra) # 16ea <free>
+  while(getcmd(buf, sizeof(buf)) >= 0){
+     f96:	06400593          	li	a1,100
+     f9a:	854a                	mv	a0,s2
+     f9c:	fffff097          	auipc	ra,0xfffff
+     fa0:	3a6080e7          	jalr	934(ra) # 342 <getcmd>
+     fa4:	08054563          	bltz	a0,102e <main+0x1d6>
+    replace(buf);
+     fa8:	854a                	mv	a0,s2
+     faa:	fffff097          	auipc	ra,0xfffff
+     fae:	254080e7          	jalr	596(ra) # 1fe <replace>
+    if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){
+     fb2:	0889c783          	lbu	a5,136(s3)
+     fb6:	01479863          	bne	a5,s4,fc6 <main+0x16e>
+     fba:	0899c703          	lbu	a4,137(s3)
+     fbe:	06400793          	li	a5,100
+     fc2:	f4f70fe3          	beq	a4,a5,f20 <main+0xc8>
+      struct cmd *cmd = parsecmd(buf);
+     fc6:	854a                	mv	a0,s2
+     fc8:	00000097          	auipc	ra,0x0
+     fcc:	e04080e7          	jalr	-508(ra) # dcc <parsecmd>
+     fd0:	84aa                	mv	s1,a0
+      if(ecmd->argv[0] == 0) {
+     fd2:	6508                	ld	a0,8(a0)
+     fd4:	d145                	beqz	a0,f74 <main+0x11c>
+      else if(!strcmp(ecmd->argv[0], "export"))
+     fd6:	85d6                	mv	a1,s5
+     fd8:	00000097          	auipc	ra,0x0
+     fdc:	0aa080e7          	jalr	170(ra) # 1082 <strcmp>
+     fe0:	e115                	bnez	a0,1004 <main+0x1ac>
+        if(ecmd->argv[1] == NULL)
+     fe2:	689c                	ld	a5,16(s1)
+     fe4:	dfd1                	beqz	a5,f80 <main+0x128>
+        else if(export(ecmd->argv) < 0)
+     fe6:	00848513          	addi	a0,s1,8
+     fea:	fffff097          	auipc	ra,0xfffff
+     fee:	07c080e7          	jalr	124(ra) # 66 <export>
+     ff2:	f8055de3          	bgez	a0,f8c <main+0x134>
+          fprintf(2, "export failed\n");
+     ff6:	85de                	mv	a1,s7
+     ff8:	4509                	li	a0,2
+     ffa:	00000097          	auipc	ra,0x0
+     ffe:	68c080e7          	jalr	1676(ra) # 1686 <fprintf>
+    1002:	b769                	j	f8c <main+0x134>
+      else if(fork1() == 0) 
+    1004:	fffff097          	auipc	ra,0xfffff
+    1008:	3c0080e7          	jalr	960(ra) # 3c4 <fork1>
+    100c:	cd01                	beqz	a0,1024 <main+0x1cc>
+      wait(0);
+    100e:	4501                	li	a0,0
+    1010:	00000097          	auipc	ra,0x0
+    1014:	2ea080e7          	jalr	746(ra) # 12fa <wait>
+      free(cmd);
+    1018:	8526                	mv	a0,s1
+    101a:	00000097          	auipc	ra,0x0
+    101e:	6d0080e7          	jalr	1744(ra) # 16ea <free>
+    1022:	bf95                	j	f96 <main+0x13e>
+        runcmd(cmd);
+    1024:	8526                	mv	a0,s1
+    1026:	fffff097          	auipc	ra,0xfffff
+    102a:	3cc080e7          	jalr	972(ra) # 3f2 <runcmd>
+  exit(0);
+    102e:	4501                	li	a0,0
+    1030:	00000097          	auipc	ra,0x0
+    1034:	2c0080e7          	jalr	704(ra) # 12f0 <exit>
+
+0000000000001038 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+    1038:	1141                	addi	sp,sp,-16
+    103a:	e422                	sd	s0,8(sp)
+    103c:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+    103e:	87aa                	mv	a5,a0
+    1040:	0585                	addi	a1,a1,1
+    1042:	0785                	addi	a5,a5,1
+    1044:	fff5c703          	lbu	a4,-1(a1)
+    1048:	fee78fa3          	sb	a4,-1(a5)
+    104c:	fb75                	bnez	a4,1040 <strcpy+0x8>
+    ;
+  return os;
+}
+    104e:	6422                	ld	s0,8(sp)
+    1050:	0141                	addi	sp,sp,16
+    1052:	8082                	ret
+
+0000000000001054 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+    1054:	1141                	addi	sp,sp,-16
+    1056:	e422                	sd	s0,8(sp)
+    1058:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+    105a:	00054783          	lbu	a5,0(a0)
+    105e:	c385                	beqz	a5,107e <strcat+0x2a>
+    1060:	87aa                	mv	a5,a0
+    s++;
+    1062:	0785                	addi	a5,a5,1
+  while(*s)
+    1064:	0007c703          	lbu	a4,0(a5)
+    1068:	ff6d                	bnez	a4,1062 <strcat+0xe>
+  while((*s++ = *t++))
+    106a:	0585                	addi	a1,a1,1
+    106c:	0785                	addi	a5,a5,1
+    106e:	fff5c703          	lbu	a4,-1(a1)
+    1072:	fee78fa3          	sb	a4,-1(a5)
+    1076:	fb75                	bnez	a4,106a <strcat+0x16>
+    ;
+  return os;
+}
+    1078:	6422                	ld	s0,8(sp)
+    107a:	0141                	addi	sp,sp,16
+    107c:	8082                	ret
+  while(*s)
+    107e:	87aa                	mv	a5,a0
+    1080:	b7ed                	j	106a <strcat+0x16>
+
+0000000000001082 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+    1082:	1141                	addi	sp,sp,-16
+    1084:	e422                	sd	s0,8(sp)
+    1086:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+    1088:	00054783          	lbu	a5,0(a0)
+    108c:	cb91                	beqz	a5,10a0 <strcmp+0x1e>
+    108e:	0005c703          	lbu	a4,0(a1)
+    1092:	00f71763          	bne	a4,a5,10a0 <strcmp+0x1e>
+    p++, q++;
+    1096:	0505                	addi	a0,a0,1
+    1098:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+    109a:	00054783          	lbu	a5,0(a0)
+    109e:	fbe5                	bnez	a5,108e <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+    10a0:	0005c503          	lbu	a0,0(a1)
+}
+    10a4:	40a7853b          	subw	a0,a5,a0
+    10a8:	6422                	ld	s0,8(sp)
+    10aa:	0141                	addi	sp,sp,16
+    10ac:	8082                	ret
+
+00000000000010ae <strlen>:
+
+uint
+strlen(const char *s)
+{
+    10ae:	1141                	addi	sp,sp,-16
+    10b0:	e422                	sd	s0,8(sp)
+    10b2:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+    10b4:	00054783          	lbu	a5,0(a0)
+    10b8:	cf91                	beqz	a5,10d4 <strlen+0x26>
+    10ba:	0505                	addi	a0,a0,1
+    10bc:	87aa                	mv	a5,a0
+    10be:	4685                	li	a3,1
+    10c0:	9e89                	subw	a3,a3,a0
+    10c2:	00f6853b          	addw	a0,a3,a5
+    10c6:	0785                	addi	a5,a5,1
+    10c8:	fff7c703          	lbu	a4,-1(a5)
+    10cc:	fb7d                	bnez	a4,10c2 <strlen+0x14>
+    ;
+  return n;
+}
+    10ce:	6422                	ld	s0,8(sp)
+    10d0:	0141                	addi	sp,sp,16
+    10d2:	8082                	ret
+  for(n = 0; s[n]; n++)
+    10d4:	4501                	li	a0,0
+    10d6:	bfe5                	j	10ce <strlen+0x20>
+
+00000000000010d8 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+    10d8:	1141                	addi	sp,sp,-16
+    10da:	e422                	sd	s0,8(sp)
+    10dc:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+    10de:	ca19                	beqz	a2,10f4 <memset+0x1c>
+    10e0:	87aa                	mv	a5,a0
+    10e2:	1602                	slli	a2,a2,0x20
+    10e4:	9201                	srli	a2,a2,0x20
+    10e6:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+    10ea:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+    10ee:	0785                	addi	a5,a5,1
+    10f0:	fee79de3          	bne	a5,a4,10ea <memset+0x12>
+  }
+  return dst;
+}
+    10f4:	6422                	ld	s0,8(sp)
+    10f6:	0141                	addi	sp,sp,16
+    10f8:	8082                	ret
+
+00000000000010fa <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+    10fa:	1141                	addi	sp,sp,-16
+    10fc:	e422                	sd	s0,8(sp)
+    10fe:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+    1100:	00054783          	lbu	a5,0(a0)
+    1104:	cb99                	beqz	a5,111a <strchr+0x20>
+    if(*s == c)
+    1106:	00f58763          	beq	a1,a5,1114 <strchr+0x1a>
+  for(; *s; s++)
+    110a:	0505                	addi	a0,a0,1
+    110c:	00054783          	lbu	a5,0(a0)
+    1110:	fbfd                	bnez	a5,1106 <strchr+0xc>
+      return (char*)s;
+  return 0;
+    1112:	4501                	li	a0,0
+}
+    1114:	6422                	ld	s0,8(sp)
+    1116:	0141                	addi	sp,sp,16
+    1118:	8082                	ret
+  return 0;
+    111a:	4501                	li	a0,0
+    111c:	bfe5                	j	1114 <strchr+0x1a>
+
+000000000000111e <gets>:
+
+char*
+gets(char *buf, int max)
+{
+    111e:	711d                	addi	sp,sp,-96
+    1120:	ec86                	sd	ra,88(sp)
+    1122:	e8a2                	sd	s0,80(sp)
+    1124:	e4a6                	sd	s1,72(sp)
+    1126:	e0ca                	sd	s2,64(sp)
+    1128:	fc4e                	sd	s3,56(sp)
+    112a:	f852                	sd	s4,48(sp)
+    112c:	f456                	sd	s5,40(sp)
+    112e:	f05a                	sd	s6,32(sp)
+    1130:	ec5e                	sd	s7,24(sp)
+    1132:	e862                	sd	s8,16(sp)
+    1134:	1080                	addi	s0,sp,96
+    1136:	8baa                	mv	s7,a0
+    1138:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+    113a:	892a                	mv	s2,a0
+    113c:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+    113e:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+    1142:	4b29                	li	s6,10
+    1144:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+    1146:	89a6                	mv	s3,s1
+    1148:	2485                	addiw	s1,s1,1
+    114a:	0344d763          	bge	s1,s4,1178 <gets+0x5a>
+    cc = read(0, &c, 1);
+    114e:	4605                	li	a2,1
+    1150:	85d6                	mv	a1,s5
+    1152:	4501                	li	a0,0
+    1154:	00000097          	auipc	ra,0x0
+    1158:	1b8080e7          	jalr	440(ra) # 130c <read>
+    if(cc < 1)
+    115c:	00a05e63          	blez	a0,1178 <gets+0x5a>
+    buf[i++] = c;
+    1160:	faf44783          	lbu	a5,-81(s0)
+    1164:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+    1168:	01678763          	beq	a5,s6,1176 <gets+0x58>
+    116c:	0905                	addi	s2,s2,1
+    116e:	fd879ce3          	bne	a5,s8,1146 <gets+0x28>
+  for(i=0; i+1 < max; ){
+    1172:	89a6                	mv	s3,s1
+    1174:	a011                	j	1178 <gets+0x5a>
+    1176:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+    1178:	99de                	add	s3,s3,s7
+    117a:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+    117e:	855e                	mv	a0,s7
+    1180:	60e6                	ld	ra,88(sp)
+    1182:	6446                	ld	s0,80(sp)
+    1184:	64a6                	ld	s1,72(sp)
+    1186:	6906                	ld	s2,64(sp)
+    1188:	79e2                	ld	s3,56(sp)
+    118a:	7a42                	ld	s4,48(sp)
+    118c:	7aa2                	ld	s5,40(sp)
+    118e:	7b02                	ld	s6,32(sp)
+    1190:	6be2                	ld	s7,24(sp)
+    1192:	6c42                	ld	s8,16(sp)
+    1194:	6125                	addi	sp,sp,96
+    1196:	8082                	ret
+
+0000000000001198 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+    1198:	1101                	addi	sp,sp,-32
+    119a:	ec06                	sd	ra,24(sp)
+    119c:	e822                	sd	s0,16(sp)
+    119e:	e426                	sd	s1,8(sp)
+    11a0:	e04a                	sd	s2,0(sp)
+    11a2:	1000                	addi	s0,sp,32
+    11a4:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+    11a6:	4581                	li	a1,0
+    11a8:	00000097          	auipc	ra,0x0
+    11ac:	194080e7          	jalr	404(ra) # 133c <open>
+  if(fd < 0)
+    11b0:	02054563          	bltz	a0,11da <stat+0x42>
+    11b4:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+    11b6:	85ca                	mv	a1,s2
+    11b8:	00000097          	auipc	ra,0x0
+    11bc:	18e080e7          	jalr	398(ra) # 1346 <fstat>
+    11c0:	892a                	mv	s2,a0
+  close(fd);
+    11c2:	8526                	mv	a0,s1
+    11c4:	00000097          	auipc	ra,0x0
+    11c8:	15c080e7          	jalr	348(ra) # 1320 <close>
+  return r;
+}
+    11cc:	854a                	mv	a0,s2
+    11ce:	60e2                	ld	ra,24(sp)
+    11d0:	6442                	ld	s0,16(sp)
+    11d2:	64a2                	ld	s1,8(sp)
+    11d4:	6902                	ld	s2,0(sp)
+    11d6:	6105                	addi	sp,sp,32
+    11d8:	8082                	ret
+    return -1;
+    11da:	597d                	li	s2,-1
+    11dc:	bfc5                	j	11cc <stat+0x34>
+
+00000000000011de <atoi>:
+
+int
+atoi(const char *s)
+{
+    11de:	1141                	addi	sp,sp,-16
+    11e0:	e422                	sd	s0,8(sp)
+    11e2:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+    11e4:	00054703          	lbu	a4,0(a0)
+    11e8:	02d00793          	li	a5,45
+  int neg = 1;
+    11ec:	4585                	li	a1,1
+  if (*s == '-') {
+    11ee:	04f70363          	beq	a4,a5,1234 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+    11f2:	00054703          	lbu	a4,0(a0)
+    11f6:	fd07079b          	addiw	a5,a4,-48
+    11fa:	0ff7f793          	zext.b	a5,a5
+    11fe:	46a5                	li	a3,9
+    1200:	02f6ed63          	bltu	a3,a5,123a <atoi+0x5c>
+  n = 0;
+    1204:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+    1206:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+    1208:	0505                	addi	a0,a0,1
+    120a:	0026979b          	slliw	a5,a3,0x2
+    120e:	9fb5                	addw	a5,a5,a3
+    1210:	0017979b          	slliw	a5,a5,0x1
+    1214:	9fb9                	addw	a5,a5,a4
+    1216:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+    121a:	00054703          	lbu	a4,0(a0)
+    121e:	fd07079b          	addiw	a5,a4,-48
+    1222:	0ff7f793          	zext.b	a5,a5
+    1226:	fef671e3          	bgeu	a2,a5,1208 <atoi+0x2a>
+  return n * neg;
+}
+    122a:	02d5853b          	mulw	a0,a1,a3
+    122e:	6422                	ld	s0,8(sp)
+    1230:	0141                	addi	sp,sp,16
+    1232:	8082                	ret
+    s++;
+    1234:	0505                	addi	a0,a0,1
+    neg = -1;
+    1236:	55fd                	li	a1,-1
+    1238:	bf6d                	j	11f2 <atoi+0x14>
+  n = 0;
+    123a:	4681                	li	a3,0
+    123c:	b7fd                	j	122a <atoi+0x4c>
+
+000000000000123e <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+    123e:	1141                	addi	sp,sp,-16
+    1240:	e422                	sd	s0,8(sp)
+    1242:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+    1244:	02b57463          	bgeu	a0,a1,126c <memmove+0x2e>
+    while(n-- > 0)
+    1248:	00c05f63          	blez	a2,1266 <memmove+0x28>
+    124c:	1602                	slli	a2,a2,0x20
+    124e:	9201                	srli	a2,a2,0x20
+    1250:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+    1254:	872a                	mv	a4,a0
+      *dst++ = *src++;
+    1256:	0585                	addi	a1,a1,1
+    1258:	0705                	addi	a4,a4,1
+    125a:	fff5c683          	lbu	a3,-1(a1)
+    125e:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+    1262:	fee79ae3          	bne	a5,a4,1256 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+    1266:	6422                	ld	s0,8(sp)
+    1268:	0141                	addi	sp,sp,16
+    126a:	8082                	ret
+    dst += n;
+    126c:	00c50733          	add	a4,a0,a2
+    src += n;
+    1270:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+    1272:	fec05ae3          	blez	a2,1266 <memmove+0x28>
+    1276:	fff6079b          	addiw	a5,a2,-1
+    127a:	1782                	slli	a5,a5,0x20
+    127c:	9381                	srli	a5,a5,0x20
+    127e:	fff7c793          	not	a5,a5
+    1282:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+    1284:	15fd                	addi	a1,a1,-1
+    1286:	177d                	addi	a4,a4,-1
+    1288:	0005c683          	lbu	a3,0(a1)
+    128c:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+    1290:	fee79ae3          	bne	a5,a4,1284 <memmove+0x46>
+    1294:	bfc9                	j	1266 <memmove+0x28>
+
+0000000000001296 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+    1296:	1141                	addi	sp,sp,-16
+    1298:	e422                	sd	s0,8(sp)
+    129a:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+    129c:	ca05                	beqz	a2,12cc <memcmp+0x36>
+    129e:	fff6069b          	addiw	a3,a2,-1
+    12a2:	1682                	slli	a3,a3,0x20
+    12a4:	9281                	srli	a3,a3,0x20
+    12a6:	0685                	addi	a3,a3,1
+    12a8:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+    12aa:	00054783          	lbu	a5,0(a0)
+    12ae:	0005c703          	lbu	a4,0(a1)
+    12b2:	00e79863          	bne	a5,a4,12c2 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+    12b6:	0505                	addi	a0,a0,1
+    p2++;
+    12b8:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+    12ba:	fed518e3          	bne	a0,a3,12aa <memcmp+0x14>
+  }
+  return 0;
+    12be:	4501                	li	a0,0
+    12c0:	a019                	j	12c6 <memcmp+0x30>
+      return *p1 - *p2;
+    12c2:	40e7853b          	subw	a0,a5,a4
+}
+    12c6:	6422                	ld	s0,8(sp)
+    12c8:	0141                	addi	sp,sp,16
+    12ca:	8082                	ret
+  return 0;
+    12cc:	4501                	li	a0,0
+    12ce:	bfe5                	j	12c6 <memcmp+0x30>
+
+00000000000012d0 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+    12d0:	1141                	addi	sp,sp,-16
+    12d2:	e406                	sd	ra,8(sp)
+    12d4:	e022                	sd	s0,0(sp)
+    12d6:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+    12d8:	00000097          	auipc	ra,0x0
+    12dc:	f66080e7          	jalr	-154(ra) # 123e <memmove>
+}
+    12e0:	60a2                	ld	ra,8(sp)
+    12e2:	6402                	ld	s0,0(sp)
+    12e4:	0141                	addi	sp,sp,16
+    12e6:	8082                	ret
+
+00000000000012e8 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+    12e8:	4885                	li	a7,1
+ ecall
+    12ea:	00000073          	ecall
+ ret
+    12ee:	8082                	ret
+
+00000000000012f0 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+    12f0:	05d00893          	li	a7,93
+ ecall
+    12f4:	00000073          	ecall
+ ret
+    12f8:	8082                	ret
+
+00000000000012fa <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+    12fa:	488d                	li	a7,3
+ ecall
+    12fc:	00000073          	ecall
+ ret
+    1300:	8082                	ret
+
+0000000000001302 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+    1302:	03b00893          	li	a7,59
+ ecall
+    1306:	00000073          	ecall
+ ret
+    130a:	8082                	ret
+
+000000000000130c <read>:
+.global read
+read:
+ li a7, SYS_read
+    130c:	03f00893          	li	a7,63
+ ecall
+    1310:	00000073          	ecall
+ ret
+    1314:	8082                	ret
+
+0000000000001316 <write>:
+.global write
+write:
+ li a7, SYS_write
+    1316:	04000893          	li	a7,64
+ ecall
+    131a:	00000073          	ecall
+ ret
+    131e:	8082                	ret
+
+0000000000001320 <close>:
+.global close
+close:
+ li a7, SYS_close
+    1320:	03900893          	li	a7,57
+ ecall
+    1324:	00000073          	ecall
+ ret
+    1328:	8082                	ret
+
+000000000000132a <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+    132a:	4899                	li	a7,6
+ ecall
+    132c:	00000073          	ecall
+ ret
+    1330:	8082                	ret
+
+0000000000001332 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+    1332:	0dd00893          	li	a7,221
+ ecall
+    1336:	00000073          	ecall
+ ret
+    133a:	8082                	ret
+
+000000000000133c <open>:
+.global open
+open:
+ li a7, SYS_open
+    133c:	03800893          	li	a7,56
+ ecall
+    1340:	00000073          	ecall
+ ret
+    1344:	8082                	ret
+
+0000000000001346 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+    1346:	05000893          	li	a7,80
+ ecall
+    134a:	00000073          	ecall
+ ret
+    134e:	8082                	ret
+
+0000000000001350 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+    1350:	02200893          	li	a7,34
+ ecall
+    1354:	00000073          	ecall
+ ret
+    1358:	8082                	ret
+
+000000000000135a <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+    135a:	03100893          	li	a7,49
+ ecall
+    135e:	00000073          	ecall
+ ret
+    1362:	8082                	ret
+
+0000000000001364 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+    1364:	48dd                	li	a7,23
+ ecall
+    1366:	00000073          	ecall
+ ret
+    136a:	8082                	ret
+
+000000000000136c <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+    136c:	0ac00893          	li	a7,172
+ ecall
+    1370:	00000073          	ecall
+ ret
+    1374:	8082                	ret
+
+0000000000001376 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+    1376:	48b1                	li	a7,12
+ ecall
+    1378:	00000073          	ecall
+ ret
+    137c:	8082                	ret
+
+000000000000137e <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+    137e:	48b5                	li	a7,13
+ ecall
+    1380:	00000073          	ecall
+ ret
+    1384:	8082                	ret
+
+0000000000001386 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+    1386:	48b9                	li	a7,14
+ ecall
+    1388:	00000073          	ecall
+ ret
+    138c:	8082                	ret
+
+000000000000138e <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+    138e:	48d9                	li	a7,22
+ ecall
+    1390:	00000073          	ecall
+ ret
+    1394:	8082                	ret
+
+0000000000001396 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+    1396:	03200893          	li	a7,50
+ ecall
+    139a:	00000073          	ecall
+ ret
+    139e:	8082                	ret
+
+00000000000013a0 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+    13a0:	48ed                	li	a7,27
+ ecall
+    13a2:	00000073          	ecall
+ ret
+    13a6:	8082                	ret
+
+00000000000013a8 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+    13a8:	48c5                	li	a7,17
+ ecall
+    13aa:	00000073          	ecall
+ ret
+    13ae:	8082                	ret
+
+00000000000013b0 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+    13b0:	07500893          	li	a7,117
+ ecall
+    13b4:	00000073          	ecall
+ ret
+    13b8:	8082                	ret
+
+00000000000013ba <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+    13ba:	48c9                	li	a7,18
+ ecall
+    13bc:	00000073          	ecall
+ ret
+    13c0:	8082                	ret
+
+00000000000013c2 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+    13c2:	48cd                	li	a7,19
+ ecall
+    13c4:	00000073          	ecall
+ ret
+    13c8:	8082                	ret
+
+00000000000013ca <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+    13ca:	48e9                	li	a7,26
+ ecall
+    13cc:	00000073          	ecall
+ ret
+    13d0:	8082                	ret
+
+00000000000013d2 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+    13d2:	0d200893          	li	a7,210
+ ecall
+    13d6:	00000073          	ecall
+ ret
+    13da:	8082                	ret
+
+00000000000013dc <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+    13dc:	1101                	addi	sp,sp,-32
+    13de:	ec06                	sd	ra,24(sp)
+    13e0:	e822                	sd	s0,16(sp)
+    13e2:	1000                	addi	s0,sp,32
+    13e4:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+    13e8:	4605                	li	a2,1
+    13ea:	fef40593          	addi	a1,s0,-17
+    13ee:	00000097          	auipc	ra,0x0
+    13f2:	f28080e7          	jalr	-216(ra) # 1316 <write>
+}
+    13f6:	60e2                	ld	ra,24(sp)
+    13f8:	6442                	ld	s0,16(sp)
+    13fa:	6105                	addi	sp,sp,32
+    13fc:	8082                	ret
+
+00000000000013fe <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+    13fe:	7139                	addi	sp,sp,-64
+    1400:	fc06                	sd	ra,56(sp)
+    1402:	f822                	sd	s0,48(sp)
+    1404:	f426                	sd	s1,40(sp)
+    1406:	f04a                	sd	s2,32(sp)
+    1408:	ec4e                	sd	s3,24(sp)
+    140a:	0080                	addi	s0,sp,64
+    140c:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+    140e:	c299                	beqz	a3,1414 <printint+0x16>
+    1410:	0805c863          	bltz	a1,14a0 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+    1414:	2581                	sext.w	a1,a1
+  neg = 0;
+    1416:	4881                	li	a7,0
+  }
+
+  i = 0;
+    1418:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+    141c:	86ce                	mv	a3,s3
+  i = 0;
+    141e:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+    1420:	2601                	sext.w	a2,a2
+    1422:	00000517          	auipc	a0,0x0
+    1426:	67650513          	addi	a0,a0,1654 # 1a98 <digits>
+    142a:	883a                	mv	a6,a4
+    142c:	2705                	addiw	a4,a4,1
+    142e:	02c5f7bb          	remuw	a5,a1,a2
+    1432:	1782                	slli	a5,a5,0x20
+    1434:	9381                	srli	a5,a5,0x20
+    1436:	97aa                	add	a5,a5,a0
+    1438:	0007c783          	lbu	a5,0(a5)
+    143c:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+    1440:	0005879b          	sext.w	a5,a1
+    1444:	02c5d5bb          	divuw	a1,a1,a2
+    1448:	0685                	addi	a3,a3,1
+    144a:	fec7f0e3          	bgeu	a5,a2,142a <printint+0x2c>
+  if(neg)
+    144e:	00088c63          	beqz	a7,1466 <printint+0x68>
+    buf[i++] = '-';
+    1452:	fd070793          	addi	a5,a4,-48
+    1456:	00878733          	add	a4,a5,s0
+    145a:	02d00793          	li	a5,45
+    145e:	fef70823          	sb	a5,-16(a4)
+    1462:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+    1466:	02e05663          	blez	a4,1492 <printint+0x94>
+    146a:	fc040913          	addi	s2,s0,-64
+    146e:	993a                	add	s2,s2,a4
+    1470:	19fd                	addi	s3,s3,-1
+    1472:	99ba                	add	s3,s3,a4
+    1474:	377d                	addiw	a4,a4,-1
+    1476:	1702                	slli	a4,a4,0x20
+    1478:	9301                	srli	a4,a4,0x20
+    147a:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+    147e:	fff94583          	lbu	a1,-1(s2)
+    1482:	8526                	mv	a0,s1
+    1484:	00000097          	auipc	ra,0x0
+    1488:	f58080e7          	jalr	-168(ra) # 13dc <putc>
+  while(--i >= 0)
+    148c:	197d                	addi	s2,s2,-1
+    148e:	ff3918e3          	bne	s2,s3,147e <printint+0x80>
+}
+    1492:	70e2                	ld	ra,56(sp)
+    1494:	7442                	ld	s0,48(sp)
+    1496:	74a2                	ld	s1,40(sp)
+    1498:	7902                	ld	s2,32(sp)
+    149a:	69e2                	ld	s3,24(sp)
+    149c:	6121                	addi	sp,sp,64
+    149e:	8082                	ret
+    x = -xx;
+    14a0:	40b005bb          	negw	a1,a1
+    neg = 1;
+    14a4:	4885                	li	a7,1
+    x = -xx;
+    14a6:	bf8d                	j	1418 <printint+0x1a>
+
+00000000000014a8 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+    14a8:	7119                	addi	sp,sp,-128
+    14aa:	fc86                	sd	ra,120(sp)
+    14ac:	f8a2                	sd	s0,112(sp)
+    14ae:	f4a6                	sd	s1,104(sp)
+    14b0:	f0ca                	sd	s2,96(sp)
+    14b2:	ecce                	sd	s3,88(sp)
+    14b4:	e8d2                	sd	s4,80(sp)
+    14b6:	e4d6                	sd	s5,72(sp)
+    14b8:	e0da                	sd	s6,64(sp)
+    14ba:	fc5e                	sd	s7,56(sp)
+    14bc:	f862                	sd	s8,48(sp)
+    14be:	f466                	sd	s9,40(sp)
+    14c0:	f06a                	sd	s10,32(sp)
+    14c2:	ec6e                	sd	s11,24(sp)
+    14c4:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+    14c6:	0005c903          	lbu	s2,0(a1)
+    14ca:	18090f63          	beqz	s2,1668 <vprintf+0x1c0>
+    14ce:	8aaa                	mv	s5,a0
+    14d0:	8b32                	mv	s6,a2
+    14d2:	00158493          	addi	s1,a1,1
+  state = 0;
+    14d6:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+    14d8:	02500a13          	li	s4,37
+    14dc:	4c55                	li	s8,21
+    14de:	00000c97          	auipc	s9,0x0
+    14e2:	562c8c93          	addi	s9,s9,1378 # 1a40 <malloc+0x2d4>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+    14e6:	02800d93          	li	s11,40
+  putc(fd, 'x');
+    14ea:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+    14ec:	00000b97          	auipc	s7,0x0
+    14f0:	5acb8b93          	addi	s7,s7,1452 # 1a98 <digits>
+    14f4:	a839                	j	1512 <vprintf+0x6a>
+        putc(fd, c);
+    14f6:	85ca                	mv	a1,s2
+    14f8:	8556                	mv	a0,s5
+    14fa:	00000097          	auipc	ra,0x0
+    14fe:	ee2080e7          	jalr	-286(ra) # 13dc <putc>
+    1502:	a019                	j	1508 <vprintf+0x60>
+    } else if(state == '%'){
+    1504:	01498d63          	beq	s3,s4,151e <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+    1508:	0485                	addi	s1,s1,1
+    150a:	fff4c903          	lbu	s2,-1(s1)
+    150e:	14090d63          	beqz	s2,1668 <vprintf+0x1c0>
+    if(state == 0){
+    1512:	fe0999e3          	bnez	s3,1504 <vprintf+0x5c>
+      if(c == '%'){
+    1516:	ff4910e3          	bne	s2,s4,14f6 <vprintf+0x4e>
+        state = '%';
+    151a:	89d2                	mv	s3,s4
+    151c:	b7f5                	j	1508 <vprintf+0x60>
+      if(c == 'd'){
+    151e:	11490c63          	beq	s2,s4,1636 <vprintf+0x18e>
+    1522:	f9d9079b          	addiw	a5,s2,-99
+    1526:	0ff7f793          	zext.b	a5,a5
+    152a:	10fc6e63          	bltu	s8,a5,1646 <vprintf+0x19e>
+    152e:	f9d9079b          	addiw	a5,s2,-99
+    1532:	0ff7f713          	zext.b	a4,a5
+    1536:	10ec6863          	bltu	s8,a4,1646 <vprintf+0x19e>
+    153a:	00271793          	slli	a5,a4,0x2
+    153e:	97e6                	add	a5,a5,s9
+    1540:	439c                	lw	a5,0(a5)
+    1542:	97e6                	add	a5,a5,s9
+    1544:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+    1546:	008b0913          	addi	s2,s6,8
+    154a:	4685                	li	a3,1
+    154c:	4629                	li	a2,10
+    154e:	000b2583          	lw	a1,0(s6)
+    1552:	8556                	mv	a0,s5
+    1554:	00000097          	auipc	ra,0x0
+    1558:	eaa080e7          	jalr	-342(ra) # 13fe <printint>
+    155c:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+    155e:	4981                	li	s3,0
+    1560:	b765                	j	1508 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+    1562:	008b0913          	addi	s2,s6,8
+    1566:	4681                	li	a3,0
+    1568:	4629                	li	a2,10
+    156a:	000b2583          	lw	a1,0(s6)
+    156e:	8556                	mv	a0,s5
+    1570:	00000097          	auipc	ra,0x0
+    1574:	e8e080e7          	jalr	-370(ra) # 13fe <printint>
+    1578:	8b4a                	mv	s6,s2
+      state = 0;
+    157a:	4981                	li	s3,0
+    157c:	b771                	j	1508 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+    157e:	008b0913          	addi	s2,s6,8
+    1582:	4681                	li	a3,0
+    1584:	866a                	mv	a2,s10
+    1586:	000b2583          	lw	a1,0(s6)
+    158a:	8556                	mv	a0,s5
+    158c:	00000097          	auipc	ra,0x0
+    1590:	e72080e7          	jalr	-398(ra) # 13fe <printint>
+    1594:	8b4a                	mv	s6,s2
+      state = 0;
+    1596:	4981                	li	s3,0
+    1598:	bf85                	j	1508 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+    159a:	008b0793          	addi	a5,s6,8
+    159e:	f8f43423          	sd	a5,-120(s0)
+    15a2:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+    15a6:	03000593          	li	a1,48
+    15aa:	8556                	mv	a0,s5
+    15ac:	00000097          	auipc	ra,0x0
+    15b0:	e30080e7          	jalr	-464(ra) # 13dc <putc>
+  putc(fd, 'x');
+    15b4:	07800593          	li	a1,120
+    15b8:	8556                	mv	a0,s5
+    15ba:	00000097          	auipc	ra,0x0
+    15be:	e22080e7          	jalr	-478(ra) # 13dc <putc>
+    15c2:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+    15c4:	03c9d793          	srli	a5,s3,0x3c
+    15c8:	97de                	add	a5,a5,s7
+    15ca:	0007c583          	lbu	a1,0(a5)
+    15ce:	8556                	mv	a0,s5
+    15d0:	00000097          	auipc	ra,0x0
+    15d4:	e0c080e7          	jalr	-500(ra) # 13dc <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+    15d8:	0992                	slli	s3,s3,0x4
+    15da:	397d                	addiw	s2,s2,-1
+    15dc:	fe0914e3          	bnez	s2,15c4 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+    15e0:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+    15e4:	4981                	li	s3,0
+    15e6:	b70d                	j	1508 <vprintf+0x60>
+        s = va_arg(ap, char*);
+    15e8:	008b0913          	addi	s2,s6,8
+    15ec:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+    15f0:	02098163          	beqz	s3,1612 <vprintf+0x16a>
+        while(*s != 0){
+    15f4:	0009c583          	lbu	a1,0(s3)
+    15f8:	c5ad                	beqz	a1,1662 <vprintf+0x1ba>
+          putc(fd, *s);
+    15fa:	8556                	mv	a0,s5
+    15fc:	00000097          	auipc	ra,0x0
+    1600:	de0080e7          	jalr	-544(ra) # 13dc <putc>
+          s++;
+    1604:	0985                	addi	s3,s3,1
+        while(*s != 0){
+    1606:	0009c583          	lbu	a1,0(s3)
+    160a:	f9e5                	bnez	a1,15fa <vprintf+0x152>
+        s = va_arg(ap, char*);
+    160c:	8b4a                	mv	s6,s2
+      state = 0;
+    160e:	4981                	li	s3,0
+    1610:	bde5                	j	1508 <vprintf+0x60>
+          s = "(null)";
+    1612:	00000997          	auipc	s3,0x0
+    1616:	42698993          	addi	s3,s3,1062 # 1a38 <malloc+0x2cc>
+        while(*s != 0){
+    161a:	85ee                	mv	a1,s11
+    161c:	bff9                	j	15fa <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+    161e:	008b0913          	addi	s2,s6,8
+    1622:	000b4583          	lbu	a1,0(s6)
+    1626:	8556                	mv	a0,s5
+    1628:	00000097          	auipc	ra,0x0
+    162c:	db4080e7          	jalr	-588(ra) # 13dc <putc>
+    1630:	8b4a                	mv	s6,s2
+      state = 0;
+    1632:	4981                	li	s3,0
+    1634:	bdd1                	j	1508 <vprintf+0x60>
+        putc(fd, c);
+    1636:	85d2                	mv	a1,s4
+    1638:	8556                	mv	a0,s5
+    163a:	00000097          	auipc	ra,0x0
+    163e:	da2080e7          	jalr	-606(ra) # 13dc <putc>
+      state = 0;
+    1642:	4981                	li	s3,0
+    1644:	b5d1                	j	1508 <vprintf+0x60>
+        putc(fd, '%');
+    1646:	85d2                	mv	a1,s4
+    1648:	8556                	mv	a0,s5
+    164a:	00000097          	auipc	ra,0x0
+    164e:	d92080e7          	jalr	-622(ra) # 13dc <putc>
+        putc(fd, c);
+    1652:	85ca                	mv	a1,s2
+    1654:	8556                	mv	a0,s5
+    1656:	00000097          	auipc	ra,0x0
+    165a:	d86080e7          	jalr	-634(ra) # 13dc <putc>
+      state = 0;
+    165e:	4981                	li	s3,0
+    1660:	b565                	j	1508 <vprintf+0x60>
+        s = va_arg(ap, char*);
+    1662:	8b4a                	mv	s6,s2
+      state = 0;
+    1664:	4981                	li	s3,0
+    1666:	b54d                	j	1508 <vprintf+0x60>
+    }
+  }
+}
+    1668:	70e6                	ld	ra,120(sp)
+    166a:	7446                	ld	s0,112(sp)
+    166c:	74a6                	ld	s1,104(sp)
+    166e:	7906                	ld	s2,96(sp)
+    1670:	69e6                	ld	s3,88(sp)
+    1672:	6a46                	ld	s4,80(sp)
+    1674:	6aa6                	ld	s5,72(sp)
+    1676:	6b06                	ld	s6,64(sp)
+    1678:	7be2                	ld	s7,56(sp)
+    167a:	7c42                	ld	s8,48(sp)
+    167c:	7ca2                	ld	s9,40(sp)
+    167e:	7d02                	ld	s10,32(sp)
+    1680:	6de2                	ld	s11,24(sp)
+    1682:	6109                	addi	sp,sp,128
+    1684:	8082                	ret
+
+0000000000001686 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+    1686:	715d                	addi	sp,sp,-80
+    1688:	ec06                	sd	ra,24(sp)
+    168a:	e822                	sd	s0,16(sp)
+    168c:	1000                	addi	s0,sp,32
+    168e:	e010                	sd	a2,0(s0)
+    1690:	e414                	sd	a3,8(s0)
+    1692:	e818                	sd	a4,16(s0)
+    1694:	ec1c                	sd	a5,24(s0)
+    1696:	03043023          	sd	a6,32(s0)
+    169a:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+    169e:	8622                	mv	a2,s0
+    16a0:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+    16a4:	00000097          	auipc	ra,0x0
+    16a8:	e04080e7          	jalr	-508(ra) # 14a8 <vprintf>
+}
+    16ac:	60e2                	ld	ra,24(sp)
+    16ae:	6442                	ld	s0,16(sp)
+    16b0:	6161                	addi	sp,sp,80
+    16b2:	8082                	ret
+
+00000000000016b4 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+    16b4:	711d                	addi	sp,sp,-96
+    16b6:	ec06                	sd	ra,24(sp)
+    16b8:	e822                	sd	s0,16(sp)
+    16ba:	1000                	addi	s0,sp,32
+    16bc:	e40c                	sd	a1,8(s0)
+    16be:	e810                	sd	a2,16(s0)
+    16c0:	ec14                	sd	a3,24(s0)
+    16c2:	f018                	sd	a4,32(s0)
+    16c4:	f41c                	sd	a5,40(s0)
+    16c6:	03043823          	sd	a6,48(s0)
+    16ca:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+    16ce:	00840613          	addi	a2,s0,8
+    16d2:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+    16d6:	85aa                	mv	a1,a0
+    16d8:	4505                	li	a0,1
+    16da:	00000097          	auipc	ra,0x0
+    16de:	dce080e7          	jalr	-562(ra) # 14a8 <vprintf>
+}
+    16e2:	60e2                	ld	ra,24(sp)
+    16e4:	6442                	ld	s0,16(sp)
+    16e6:	6125                	addi	sp,sp,96
+    16e8:	8082                	ret
+
+00000000000016ea <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+    16ea:	1141                	addi	sp,sp,-16
+    16ec:	e422                	sd	s0,8(sp)
+    16ee:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+    16f0:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+    16f4:	00001797          	auipc	a5,0x1
+    16f8:	cbc7b783          	ld	a5,-836(a5) # 23b0 <freep>
+    16fc:	a02d                	j	1726 <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;
+    16fe:	4618                	lw	a4,8(a2)
+    1700:	9f2d                	addw	a4,a4,a1
+    1702:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+    1706:	6398                	ld	a4,0(a5)
+    1708:	6310                	ld	a2,0(a4)
+    170a:	a83d                	j	1748 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+    170c:	ff852703          	lw	a4,-8(a0)
+    1710:	9f31                	addw	a4,a4,a2
+    1712:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+    1714:	ff053683          	ld	a3,-16(a0)
+    1718:	a091                	j	175c <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+    171a:	6398                	ld	a4,0(a5)
+    171c:	00e7e463          	bltu	a5,a4,1724 <free+0x3a>
+    1720:	00e6ea63          	bltu	a3,a4,1734 <free+0x4a>
+{
+    1724:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+    1726:	fed7fae3          	bgeu	a5,a3,171a <free+0x30>
+    172a:	6398                	ld	a4,0(a5)
+    172c:	00e6e463          	bltu	a3,a4,1734 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+    1730:	fee7eae3          	bltu	a5,a4,1724 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+    1734:	ff852583          	lw	a1,-8(a0)
+    1738:	6390                	ld	a2,0(a5)
+    173a:	02059813          	slli	a6,a1,0x20
+    173e:	01c85713          	srli	a4,a6,0x1c
+    1742:	9736                	add	a4,a4,a3
+    1744:	fae60de3          	beq	a2,a4,16fe <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+    1748:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+    174c:	4790                	lw	a2,8(a5)
+    174e:	02061593          	slli	a1,a2,0x20
+    1752:	01c5d713          	srli	a4,a1,0x1c
+    1756:	973e                	add	a4,a4,a5
+    1758:	fae68ae3          	beq	a3,a4,170c <free+0x22>
+    p->s.ptr = bp->s.ptr;
+    175c:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+    175e:	00001717          	auipc	a4,0x1
+    1762:	c4f73923          	sd	a5,-942(a4) # 23b0 <freep>
+}
+    1766:	6422                	ld	s0,8(sp)
+    1768:	0141                	addi	sp,sp,16
+    176a:	8082                	ret
+
+000000000000176c <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+    176c:	7139                	addi	sp,sp,-64
+    176e:	fc06                	sd	ra,56(sp)
+    1770:	f822                	sd	s0,48(sp)
+    1772:	f426                	sd	s1,40(sp)
+    1774:	f04a                	sd	s2,32(sp)
+    1776:	ec4e                	sd	s3,24(sp)
+    1778:	e852                	sd	s4,16(sp)
+    177a:	e456                	sd	s5,8(sp)
+    177c:	e05a                	sd	s6,0(sp)
+    177e:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+    1780:	02051493          	slli	s1,a0,0x20
+    1784:	9081                	srli	s1,s1,0x20
+    1786:	04bd                	addi	s1,s1,15
+    1788:	8091                	srli	s1,s1,0x4
+    178a:	00148a1b          	addiw	s4,s1,1
+    178e:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+    1790:	00001517          	auipc	a0,0x1
+    1794:	c2053503          	ld	a0,-992(a0) # 23b0 <freep>
+    1798:	c515                	beqz	a0,17c4 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+    179a:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+    179c:	4798                	lw	a4,8(a5)
+    179e:	04977163          	bgeu	a4,s1,17e0 <malloc+0x74>
+    17a2:	89d2                	mv	s3,s4
+    17a4:	000a071b          	sext.w	a4,s4
+    17a8:	6685                	lui	a3,0x1
+    17aa:	00d77363          	bgeu	a4,a3,17b0 <malloc+0x44>
+    17ae:	6985                	lui	s3,0x1
+    17b0:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+    17b4:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+    17b8:	00001917          	auipc	s2,0x1
+    17bc:	bf890913          	addi	s2,s2,-1032 # 23b0 <freep>
+  if(p == (char*)-1)
+    17c0:	5afd                	li	s5,-1
+    17c2:	a8a5                	j	183a <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+    17c4:	00001797          	auipc	a5,0x1
+    17c8:	bec78793          	addi	a5,a5,-1044 # 23b0 <freep>
+    17cc:	00001717          	auipc	a4,0x1
+    17d0:	bec70713          	addi	a4,a4,-1044 # 23b8 <base>
+    17d4:	e398                	sd	a4,0(a5)
+    17d6:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+    17d8:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+    17dc:	87ba                	mv	a5,a4
+    17de:	b7d1                	j	17a2 <malloc+0x36>
+      if(p->s.size == nunits)
+    17e0:	02e48c63          	beq	s1,a4,1818 <malloc+0xac>
+        p->s.size -= nunits;
+    17e4:	4147073b          	subw	a4,a4,s4
+    17e8:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+    17ea:	02071693          	slli	a3,a4,0x20
+    17ee:	01c6d713          	srli	a4,a3,0x1c
+    17f2:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+    17f4:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+    17f8:	00001717          	auipc	a4,0x1
+    17fc:	baa73c23          	sd	a0,-1096(a4) # 23b0 <freep>
+      return (void*)(p + 1);
+    1800:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+    1804:	70e2                	ld	ra,56(sp)
+    1806:	7442                	ld	s0,48(sp)
+    1808:	74a2                	ld	s1,40(sp)
+    180a:	7902                	ld	s2,32(sp)
+    180c:	69e2                	ld	s3,24(sp)
+    180e:	6a42                	ld	s4,16(sp)
+    1810:	6aa2                	ld	s5,8(sp)
+    1812:	6b02                	ld	s6,0(sp)
+    1814:	6121                	addi	sp,sp,64
+    1816:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+    1818:	6398                	ld	a4,0(a5)
+    181a:	e118                	sd	a4,0(a0)
+    181c:	bff1                	j	17f8 <malloc+0x8c>
+  hp->s.size = nu;
+    181e:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+    1822:	0541                	addi	a0,a0,16
+    1824:	00000097          	auipc	ra,0x0
+    1828:	ec6080e7          	jalr	-314(ra) # 16ea <free>
+  return freep;
+    182c:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+    1830:	d971                	beqz	a0,1804 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+    1832:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+    1834:	4798                	lw	a4,8(a5)
+    1836:	fa9775e3          	bgeu	a4,s1,17e0 <malloc+0x74>
+    if(p == freep)
+    183a:	00093703          	ld	a4,0(s2)
+    183e:	853e                	mv	a0,a5
+    1840:	fef719e3          	bne	a4,a5,1832 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+    1844:	854e                	mv	a0,s3
+    1846:	00000097          	auipc	ra,0x0
+    184a:	b30080e7          	jalr	-1232(ra) # 1376 <sbrk>
+  if(p == (char*)-1)
+    184e:	fd5518e3          	bne	a0,s5,181e <malloc+0xb2>
+        return 0;
+    1852:	4501                	li	a0,0
+    1854:	bf45                	j	1804 <malloc+0x98>
diff --git a/xv6-user/sh.c b/xv6-user/sh.c
new file mode 100644
index 0000000000000000000000000000000000000000..3ad3a621c01829c1b6cf40de9986486ab7f47cb4
--- /dev/null
+++ b/xv6-user/sh.c
@@ -0,0 +1,637 @@
+// Shell.
+
+#include "kernel/include/types.h"
+#include "xv6-user/user.h"
+#include "kernel/include/fcntl.h"
+
+// Parsed command representation
+#define EXEC  1
+#define REDIR 2
+#define PIPE  3
+#define LIST  4
+#define BACK  5
+
+#define NENVS 16
+#define MAXARGS 10
+
+struct env{
+  char name[32];
+  char value[96];
+};
+
+struct env envs[NENVS];
+int nenv = 0;
+
+struct cmd {
+  int type;
+};
+
+struct execcmd {
+  int type;
+  char *argv[MAXARGS];
+  char *eargv[MAXARGS];
+};
+
+struct redircmd {
+  int type;
+  struct cmd *cmd;
+  char *file;
+  char *efile;
+  int mode;
+  int fd;
+};
+
+struct pipecmd {
+  int type;
+  struct cmd *left;
+  struct cmd *right;
+};
+
+struct listcmd {
+  int type;
+  struct cmd *left;
+  struct cmd *right;
+};
+
+struct backcmd {
+  int type;
+  struct cmd *cmd;
+};
+
+int fork1(void);  // Fork but panics on failure.
+void panic(char*);
+struct cmd *parsecmd(char*);
+
+char mycwd[128];
+
+int
+checkenvname(char* s)
+{
+  if((*s >= 'A' && *s <= 'Z') ||
+     (*s >= 'a' && *s <= 'z') ||
+      *s == '_')
+    ;
+  else
+    return 0;
+  char *tmp = s + 1;
+  while((*tmp >= 'A' && *tmp <= 'Z') ||
+        (*tmp >= 'a' && *tmp <= 'z') ||
+        (*tmp >= '0' && *tmp <= '9') ||
+         *tmp == '_')
+    tmp++;
+  return (int)(tmp - s);
+}
+
+int
+export(char *argv[])
+{
+  if(!strcmp(argv[1], "-p"))
+  { // print all the env vars
+    if(!nenv)
+    {
+      printf("NO env var exported\n");
+      return 0;
+    }
+    for(int i=0; i<nenv; i++)
+      printf("export %s=%s\n", envs[i].name, envs[i].value);
+    return 0;
+  }
+  else if(nenv == NENVS)
+  {
+    fprintf(2, "too many env vars\n");
+    return -1;
+  }
+  char name[32], value[96];
+  char *s = argv[1], *t = name;
+
+  for(s=argv[1], t=name; (*t=*s++)!='='; t++)
+    ;
+  *t = 0;
+
+  if(checkenvname(name) != ((s - argv[1]) - 1))
+  {
+    fprintf(2, "Invalid NAME!\n");
+    return -1;
+  }
+  for(t=value; (*t=*s); s++, t++)
+    ;
+  if(*--t == '/')
+    *t = 0;
+  
+  strcpy(envs[nenv].name, name);
+  strcpy(envs[nenv].value, value);
+  nenv++;
+  return 0;
+}
+
+int
+replace(char *buf)
+{
+  char raw[100], name[32], *s, *t, *tmp;
+  int n = 0;
+  strcpy(raw, buf);
+  for(s=raw, t=buf; (*t=*s); t++)
+  {
+    if(*s++ == '$'){
+      tmp = name;
+      if((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z') || *s == '_')
+      {
+        *tmp++ = *s++;
+        while((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z') || (*s >= '0' && *s <= '9') || *s == '_')
+          *tmp++ = *s++;
+        *tmp = 0;
+        for(int i=0; i<nenv; i++)
+          if(!strcmp(name, envs[i].name))
+            for(tmp=envs[i].value; (*t=*tmp); t++, tmp++)
+              ;
+        t--;
+      }
+      n++;
+    }
+  }
+  return n;
+}
+
+// Execute cmd.  Never returns.
+void
+runcmd(struct cmd *cmd)
+{
+  int p[2];
+  struct backcmd *bcmd;
+  struct execcmd *ecmd;
+  struct listcmd *lcmd;
+  struct pipecmd *pcmd;
+  struct redircmd *rcmd;
+
+  if(cmd == 0)
+    exit(1);
+
+  switch(cmd->type){
+  default:
+    panic("runcmd");
+
+  case EXEC:
+    ecmd = (struct execcmd*)cmd;
+    if(ecmd->argv[0] == 0)
+      exit(1);
+    
+    exec(ecmd->argv[0], ecmd->argv);
+
+    int i;
+    char env_cmd[64];
+    for(i=0; i<nenv; i++)
+    {
+      char *s_tmp = env_cmd;
+      char *d_tmp = envs[i].value;
+      while((*s_tmp = *d_tmp++))
+        s_tmp++;
+      *s_tmp++ = '/';
+      d_tmp = ecmd->argv[0];
+      while((*s_tmp++ = *d_tmp++))
+        ;
+
+      exec(env_cmd, ecmd->argv);
+    }
+    fprintf(2, "exec %s failed\n", ecmd->argv[0]);
+    break;
+
+  case REDIR:
+    rcmd = (struct redircmd*)cmd;
+    close(rcmd->fd);
+    if(open(rcmd->file, rcmd->mode) < 0){
+      fprintf(2, "open %s failed\n", rcmd->file);
+      exit(1);
+    }
+    runcmd(rcmd->cmd);
+    break;
+
+  case LIST:
+    lcmd = (struct listcmd*)cmd;
+    if(fork1() == 0)
+      runcmd(lcmd->left);
+    wait(0);
+    runcmd(lcmd->right);
+    break;
+
+  case PIPE:
+    pcmd = (struct pipecmd*)cmd;
+    if(pipe(p) < 0)
+      panic("pipe");
+    if(fork1() == 0){
+      close(1);
+      dup(p[1]);
+      close(p[0]);
+      close(p[1]);
+      runcmd(pcmd->left);
+    }
+    if(fork1() == 0){
+      close(0);
+      dup(p[0]);
+      close(p[0]);
+      close(p[1]);
+      runcmd(pcmd->right);
+    }
+    close(p[0]);
+    close(p[1]);
+    wait(0);
+    wait(0);
+    break;
+
+  case BACK:
+    bcmd = (struct backcmd*)cmd;
+    if(fork1() == 0)
+      runcmd(bcmd->cmd);
+    break;
+  }
+  exit(0);
+}
+
+int
+getcmd(char *buf, int nbuf)
+{
+  fprintf(2, "-> %s $ ", mycwd);
+  memset(buf, 0, nbuf);
+  gets(buf, nbuf);
+  if(buf[0] == 0) // EOF
+    return -1;
+  return 0;
+}
+
+int
+main(void)
+{
+  static char buf[100];
+  int fd;
+
+  // Ensure that three file descriptors are open.
+  while((fd = dev(O_RDWR, 1, 0)) >= 0){
+    if(fd >= 3){
+      close(fd);
+      break;
+    }
+  }
+
+  // Add an embedded env var(for basic commands in shell)
+  strcpy(envs[nenv].name, "SHELL");
+  strcpy(envs[nenv].value, "/bin");
+  nenv++;
+
+  getcwd(mycwd);
+  // Read and run input commands.
+  while(getcmd(buf, sizeof(buf)) >= 0){
+    replace(buf);
+    if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){
+      // Chdir must be called by the parent, not the child.
+      buf[strlen(buf)-1] = 0;  // chop \n
+      if(chdir(buf+3) < 0)
+        fprintf(2, "cannot cd %s\n", buf+3);
+      getcwd(mycwd);
+    }
+    else{
+      struct cmd *cmd = parsecmd(buf);
+      struct execcmd *ecmd;
+
+      ecmd = (struct execcmd*)cmd;
+      if(ecmd->argv[0] == 0) {
+        free(cmd);
+        continue;
+      }
+      else if(!strcmp(ecmd->argv[0], "export"))
+      {
+        // Export must be called by the parent, not the child.
+        if(ecmd->argv[1] == NULL)
+          fprintf(2, "Usage: export [-p] [NAME=VALUE]\n");
+        else if(export(ecmd->argv) < 0)
+          fprintf(2, "export failed\n");
+        free(cmd);
+        continue;
+      }
+      else if(fork1() == 0) 
+        runcmd(cmd);
+      wait(0);
+      free(cmd);
+    }
+  }
+  exit(0);
+}
+
+void
+panic(char *s)
+{
+  fprintf(2, "%s\n", s);
+  exit(1);
+}
+
+int
+fork1(void)
+{
+  int pid;
+
+  pid = fork();
+  if(pid == -1)
+    panic("fork");
+  return pid;
+}
+
+//PAGEBREAK!
+// Constructors
+
+struct cmd*
+execcmd(void)
+{
+  struct execcmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+  memset(cmd, 0, sizeof(*cmd));
+  cmd->type = EXEC;
+  return (struct cmd*)cmd;
+}
+
+struct cmd*
+redircmd(struct cmd *subcmd, char *file, char *efile, int mode, int fd)
+{
+  struct redircmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+  memset(cmd, 0, sizeof(*cmd));
+  cmd->type = REDIR;
+  cmd->cmd = subcmd;
+  cmd->file = file;
+  cmd->efile = efile;
+  cmd->mode = mode;
+  cmd->fd = fd;
+  return (struct cmd*)cmd;
+}
+
+struct cmd*
+pipecmd(struct cmd *left, struct cmd *right)
+{
+  struct pipecmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+  memset(cmd, 0, sizeof(*cmd));
+  cmd->type = PIPE;
+  cmd->left = left;
+  cmd->right = right;
+  return (struct cmd*)cmd;
+}
+
+struct cmd*
+listcmd(struct cmd *left, struct cmd *right)
+{
+  struct listcmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+  memset(cmd, 0, sizeof(*cmd));
+  cmd->type = LIST;
+  cmd->left = left;
+  cmd->right = right;
+  return (struct cmd*)cmd;
+}
+
+struct cmd*
+backcmd(struct cmd *subcmd)
+{
+  struct backcmd *cmd;
+
+  cmd = malloc(sizeof(*cmd));
+  memset(cmd, 0, sizeof(*cmd));
+  cmd->type = BACK;
+  cmd->cmd = subcmd;
+  return (struct cmd*)cmd;
+}
+//PAGEBREAK!
+// Parsing
+
+char whitespace[] = " \t\r\n\v";
+char symbols[] = "<|>&;()";
+
+int
+gettoken(char **ps, char *es, char **q, char **eq)
+{
+  char *s;
+  int ret;
+
+  s = *ps;
+  while(s < es && strchr(whitespace, *s))
+    s++;
+  if(q)
+    *q = s;
+  ret = *s;
+  switch(*s){
+  case 0:
+    break;
+  case '|':
+  case '(':
+  case ')':
+  case ';':
+  case '&':
+  case '<':
+    s++;
+    break;
+  case '>':
+    s++;
+    if(*s == '>'){
+      ret = '+';
+      s++;
+    }
+    break;
+  default:
+    ret = 'a';
+    while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s))
+      s++;
+    break;
+  }
+  if(eq)
+    *eq = s;
+
+  while(s < es && strchr(whitespace, *s))
+    s++;
+  *ps = s;
+  return ret;
+}
+
+int
+peek(char **ps, char *es, char *toks)
+{
+  char *s;
+
+  s = *ps;
+  while(s < es && strchr(whitespace, *s))
+    s++;
+  *ps = s;
+  return *s && strchr(toks, *s);
+}
+
+struct cmd *parseline(char**, char*);
+struct cmd *parsepipe(char**, char*);
+struct cmd *parseexec(char**, char*);
+struct cmd *nulterminate(struct cmd*);
+
+struct cmd*
+parsecmd(char *s)
+{
+  char *es;
+  struct cmd *cmd;
+
+  es = s + strlen(s);
+  cmd = parseline(&s, es);
+  peek(&s, es, "");
+  if(s != es){
+    fprintf(2, "leftovers: %s\n", s);
+    panic("syntax");
+  }
+  nulterminate(cmd);
+  return cmd;
+}
+
+struct cmd*
+parseline(char **ps, char *es)
+{
+  struct cmd *cmd;
+
+  cmd = parsepipe(ps, es);
+  while(peek(ps, es, "&")){
+    gettoken(ps, es, 0, 0);
+    cmd = backcmd(cmd);
+  }
+  if(peek(ps, es, ";")){
+    gettoken(ps, es, 0, 0);
+    cmd = listcmd(cmd, parseline(ps, es));
+  }
+  return cmd;
+}
+
+struct cmd*
+parsepipe(char **ps, char *es)
+{
+  struct cmd *cmd;
+
+  cmd = parseexec(ps, es);
+  if(peek(ps, es, "|")){
+    gettoken(ps, es, 0, 0);
+    cmd = pipecmd(cmd, parsepipe(ps, es));
+  }
+  return cmd;
+}
+
+struct cmd*
+parseredirs(struct cmd *cmd, char **ps, char *es)
+{
+  int tok;
+  char *q, *eq;
+
+  while(peek(ps, es, "<>")){
+    tok = gettoken(ps, es, 0, 0);
+    if(gettoken(ps, es, &q, &eq) != 'a')
+      panic("missing file for redirection");
+    switch(tok){
+    case '<':
+      cmd = redircmd(cmd, q, eq, O_RDONLY, 0);
+      break;
+    case '>':
+      cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE|O_TRUNC, 1);
+      break;
+    case '+':  // >>
+      cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE|O_APPEND, 1);
+      break;
+    }
+  }
+  return cmd;
+}
+
+struct cmd*
+parseblock(char **ps, char *es)
+{
+  struct cmd *cmd;
+
+  if(!peek(ps, es, "("))
+    panic("parseblock");
+  gettoken(ps, es, 0, 0);
+  cmd = parseline(ps, es);
+  if(!peek(ps, es, ")"))
+    panic("syntax - missing )");
+  gettoken(ps, es, 0, 0);
+  cmd = parseredirs(cmd, ps, es);
+  return cmd;
+}
+
+struct cmd*
+parseexec(char **ps, char *es)
+{
+  char *q, *eq;
+  int tok, argc;
+  struct execcmd *cmd;
+  struct cmd *ret;
+
+  if(peek(ps, es, "("))
+    return parseblock(ps, es);
+
+  ret = execcmd();
+  cmd = (struct execcmd*)ret;
+
+  argc = 0;
+  ret = parseredirs(ret, ps, es);
+  while(!peek(ps, es, "|)&;")){
+    if((tok=gettoken(ps, es, &q, &eq)) == 0)
+      break;
+    if(tok != 'a')
+      panic("syntax");
+    cmd->argv[argc] = q;
+    cmd->eargv[argc] = eq;
+    argc++;
+    if(argc >= MAXARGS)
+      panic("too many args");
+    ret = parseredirs(ret, ps, es);
+  }
+  cmd->argv[argc] = 0;
+  cmd->eargv[argc] = 0;
+  return ret;
+}
+
+// NUL-terminate all the counted strings.
+struct cmd*
+nulterminate(struct cmd *cmd)
+{
+  int i;
+  struct backcmd *bcmd;
+  struct execcmd *ecmd;
+  struct listcmd *lcmd;
+  struct pipecmd *pcmd;
+  struct redircmd *rcmd;
+
+  if(cmd == 0)
+    return 0;
+
+  switch(cmd->type){
+  case EXEC:
+    ecmd = (struct execcmd*)cmd;
+    for(i=0; ecmd->argv[i]; i++)
+      *ecmd->eargv[i] = 0;
+    break;
+
+  case REDIR:
+    rcmd = (struct redircmd*)cmd;
+    nulterminate(rcmd->cmd);
+    *rcmd->efile = 0;
+    break;
+
+  case PIPE:
+    pcmd = (struct pipecmd*)cmd;
+    nulterminate(pcmd->left);
+    nulterminate(pcmd->right);
+    break;
+
+  case LIST:
+    lcmd = (struct listcmd*)cmd;
+    nulterminate(lcmd->left);
+    nulterminate(lcmd->right);
+    break;
+
+  case BACK:
+    bcmd = (struct backcmd*)cmd;
+    nulterminate(bcmd->cmd);
+    break;
+  }
+  return cmd;
+}
\ No newline at end of file
diff --git a/xv6-user/sh.d b/xv6-user/sh.d
new file mode 100644
index 0000000000000000000000000000000000000000..2c29b2b13b91e3c5d620de0612e8eb102670f419
--- /dev/null
+++ b/xv6-user/sh.d
@@ -0,0 +1,2 @@
+xv6-user/sh.o: xv6-user/sh.c kernel/include/types.h xv6-user/user.h \
+ kernel/include/stat.h kernel/include/fcntl.h
diff --git a/xv6-user/sh.o b/xv6-user/sh.o
new file mode 100644
index 0000000000000000000000000000000000000000..e8085435744ca4716231aaf2d8f2de2011bd9bb2
Binary files /dev/null and b/xv6-user/sh.o differ
diff --git a/xv6-user/sh.sym b/xv6-user/sh.sym
new file mode 100644
index 0000000000000000000000000000000000000000..bef600d0ecfba2ee362a0887766f309e4ae71a17
--- /dev/null
+++ b/xv6-user/sh.sym
@@ -0,0 +1,104 @@
+0000000000000000 .text
+0000000000001858 .rodata
+0000000000001ab0 .data
+0000000000001ac0 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 sh.c
+0000000000001b48 buf.0
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+00000000000013dc putc
+00000000000013fe printint
+0000000000001a98 digits
+0000000000000000 umalloc.c
+00000000000023b0 freep
+00000000000023b8 base
+0000000000001038 strcpy
+00000000000016b4 printf
+00000000000022b0 __global_pointer$
+0000000000001396 dev
+000000000000123e memmove
+000000000000064a execcmd
+00000000000013ba trace
+000000000000111e gets
+0000000000001ac0 __SDATA_BEGIN__
+000000000000136c getpid
+0000000000000b7a parsepipe
+0000000000000dcc parsecmd
+00000000000012d0 memcpy
+0000000000000774 backcmd
+00000000000008f2 peek
+0000000000001ac8 mycwd
+000000000000095e parseredirs
+00000000000007b0 gettoken
+000000000000176c malloc
+00000000000013b0 remove
+000000000000137e sleep
+00000000000013c2 sysinfo
+0000000000001ab0 whitespace
+0000000000001bb0 envs
+00000000000013a0 readdir
+00000000000003c4 fork1
+0000000000000d34 nulterminate
+0000000000001302 pipe
+00000000000013ca rename
+0000000000000342 getcmd
+0000000000001316 write
+00000000000001fe replace
+0000000000001346 fstat
+0000000000001686 fprintf
+000000000000132a kill
+0000000000001054 strcat
+00000000000014a8 vprintf
+000000000000135a chdir
+0000000000000be8 parseline
+00000000000003f2 runcmd
+0000000000000c90 parseblock
+0000000000001332 exec
+00000000000012fa wait
+0000000000001ab8 symbols
+000000000000130c read
+0000000000000a66 parseexec
+000000000000039e panic
+0000000000001296 memcmp
+00000000000012e8 fork
+00000000000023c8 __BSS_END__
+0000000000001376 sbrk
+000000000000138e test_proc
+0000000000001386 uptime
+0000000000001ac0 __bss_start
+00000000000010d8 memset
+0000000000000e58 main
+0000000000000000 checkenvname
+0000000000001082 strcmp
+00000000000013d2 shutdown
+0000000000001364 dup
+00000000000013a8 getcwd
+00000000000006e8 pipecmd
+0000000000000066 export
+0000000000000680 redircmd
+0000000000001ab0 __DATA_BEGIN__
+0000000000001198 stat
+0000000000001ac0 _edata
+00000000000023c8 _end
+00000000000012f0 exit
+00000000000011de atoi
+00000000000010ae strlen
+000000000000133c open
+00000000000010fa strchr
+0000000000001350 mkdir
+0000000000001320 close
+0000000000001ac0 nenv
+000000000000072e listcmd
+00000000000016ea free
diff --git a/xv6-user/sleep.asm b/xv6-user/sleep.asm
new file mode 100644
index 0000000000000000000000000000000000000000..a4f62c4885751f2b1318d4dbd2b9b07c5c6ff631
--- /dev/null
+++ b/xv6-user/sleep.asm
@@ -0,0 +1,1438 @@
+
+xv6-user/_sleep:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+   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 (argc <= 1) {
+   8:	4785                	li	a5,1
+   a:	02a7d663          	bge	a5,a0,36 <main+0x36>
+        fprintf(2, "Usage: sleep TIME\n");
+        exit(1);
+    }
+    int time = atoi(argv[1]);
+   e:	6588                	ld	a0,8(a1)
+  10:	00000097          	auipc	ra,0x0
+  14:	1fa080e7          	jalr	506(ra) # 20a <atoi>
+    if (time == 0) {
+  18:	ed0d                	bnez	a0,52 <main+0x52>
+        fprintf(2, "Usage: sleep TIME\nTIME should be an integer larger than 0.\n");
+  1a:	00001597          	auipc	a1,0x1
+  1e:	88658593          	addi	a1,a1,-1914 # 8a0 <malloc+0x108>
+  22:	4509                	li	a0,2
+  24:	00000097          	auipc	ra,0x0
+  28:	68e080e7          	jalr	1678(ra) # 6b2 <fprintf>
+        exit(1);
+  2c:	4505                	li	a0,1
+  2e:	00000097          	auipc	ra,0x0
+  32:	2ee080e7          	jalr	750(ra) # 31c <exit>
+        fprintf(2, "Usage: sleep TIME\n");
+  36:	00001597          	auipc	a1,0x1
+  3a:	85258593          	addi	a1,a1,-1966 # 888 <malloc+0xf0>
+  3e:	4509                	li	a0,2
+  40:	00000097          	auipc	ra,0x0
+  44:	672080e7          	jalr	1650(ra) # 6b2 <fprintf>
+        exit(1);
+  48:	4505                	li	a0,1
+  4a:	00000097          	auipc	ra,0x0
+  4e:	2d2080e7          	jalr	722(ra) # 31c <exit>
+    }
+    sleep(time);
+  52:	00000097          	auipc	ra,0x0
+  56:	358080e7          	jalr	856(ra) # 3aa <sleep>
+    exit(0);
+  5a:	4501                	li	a0,0
+  5c:	00000097          	auipc	ra,0x0
+  60:	2c0080e7          	jalr	704(ra) # 31c <exit>
+
+0000000000000064 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+  64:	1141                	addi	sp,sp,-16
+  66:	e422                	sd	s0,8(sp)
+  68:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+  6a:	87aa                	mv	a5,a0
+  6c:	0585                	addi	a1,a1,1
+  6e:	0785                	addi	a5,a5,1
+  70:	fff5c703          	lbu	a4,-1(a1)
+  74:	fee78fa3          	sb	a4,-1(a5)
+  78:	fb75                	bnez	a4,6c <strcpy+0x8>
+    ;
+  return os;
+}
+  7a:	6422                	ld	s0,8(sp)
+  7c:	0141                	addi	sp,sp,16
+  7e:	8082                	ret
+
+0000000000000080 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+  80:	1141                	addi	sp,sp,-16
+  82:	e422                	sd	s0,8(sp)
+  84:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+  86:	00054783          	lbu	a5,0(a0)
+  8a:	c385                	beqz	a5,aa <strcat+0x2a>
+  8c:	87aa                	mv	a5,a0
+    s++;
+  8e:	0785                	addi	a5,a5,1
+  while(*s)
+  90:	0007c703          	lbu	a4,0(a5)
+  94:	ff6d                	bnez	a4,8e <strcat+0xe>
+  while((*s++ = *t++))
+  96:	0585                	addi	a1,a1,1
+  98:	0785                	addi	a5,a5,1
+  9a:	fff5c703          	lbu	a4,-1(a1)
+  9e:	fee78fa3          	sb	a4,-1(a5)
+  a2:	fb75                	bnez	a4,96 <strcat+0x16>
+    ;
+  return os;
+}
+  a4:	6422                	ld	s0,8(sp)
+  a6:	0141                	addi	sp,sp,16
+  a8:	8082                	ret
+  while(*s)
+  aa:	87aa                	mv	a5,a0
+  ac:	b7ed                	j	96 <strcat+0x16>
+
+00000000000000ae <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+  ae:	1141                	addi	sp,sp,-16
+  b0:	e422                	sd	s0,8(sp)
+  b2:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+  b4:	00054783          	lbu	a5,0(a0)
+  b8:	cb91                	beqz	a5,cc <strcmp+0x1e>
+  ba:	0005c703          	lbu	a4,0(a1)
+  be:	00f71763          	bne	a4,a5,cc <strcmp+0x1e>
+    p++, q++;
+  c2:	0505                	addi	a0,a0,1
+  c4:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+  c6:	00054783          	lbu	a5,0(a0)
+  ca:	fbe5                	bnez	a5,ba <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+  cc:	0005c503          	lbu	a0,0(a1)
+}
+  d0:	40a7853b          	subw	a0,a5,a0
+  d4:	6422                	ld	s0,8(sp)
+  d6:	0141                	addi	sp,sp,16
+  d8:	8082                	ret
+
+00000000000000da <strlen>:
+
+uint
+strlen(const char *s)
+{
+  da:	1141                	addi	sp,sp,-16
+  dc:	e422                	sd	s0,8(sp)
+  de:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+  e0:	00054783          	lbu	a5,0(a0)
+  e4:	cf91                	beqz	a5,100 <strlen+0x26>
+  e6:	0505                	addi	a0,a0,1
+  e8:	87aa                	mv	a5,a0
+  ea:	4685                	li	a3,1
+  ec:	9e89                	subw	a3,a3,a0
+  ee:	00f6853b          	addw	a0,a3,a5
+  f2:	0785                	addi	a5,a5,1
+  f4:	fff7c703          	lbu	a4,-1(a5)
+  f8:	fb7d                	bnez	a4,ee <strlen+0x14>
+    ;
+  return n;
+}
+  fa:	6422                	ld	s0,8(sp)
+  fc:	0141                	addi	sp,sp,16
+  fe:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 100:	4501                	li	a0,0
+ 102:	bfe5                	j	fa <strlen+0x20>
+
+0000000000000104 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 104:	1141                	addi	sp,sp,-16
+ 106:	e422                	sd	s0,8(sp)
+ 108:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 10a:	ca19                	beqz	a2,120 <memset+0x1c>
+ 10c:	87aa                	mv	a5,a0
+ 10e:	1602                	slli	a2,a2,0x20
+ 110:	9201                	srli	a2,a2,0x20
+ 112:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 116:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 11a:	0785                	addi	a5,a5,1
+ 11c:	fee79de3          	bne	a5,a4,116 <memset+0x12>
+  }
+  return dst;
+}
+ 120:	6422                	ld	s0,8(sp)
+ 122:	0141                	addi	sp,sp,16
+ 124:	8082                	ret
+
+0000000000000126 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 126:	1141                	addi	sp,sp,-16
+ 128:	e422                	sd	s0,8(sp)
+ 12a:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 12c:	00054783          	lbu	a5,0(a0)
+ 130:	cb99                	beqz	a5,146 <strchr+0x20>
+    if(*s == c)
+ 132:	00f58763          	beq	a1,a5,140 <strchr+0x1a>
+  for(; *s; s++)
+ 136:	0505                	addi	a0,a0,1
+ 138:	00054783          	lbu	a5,0(a0)
+ 13c:	fbfd                	bnez	a5,132 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 13e:	4501                	li	a0,0
+}
+ 140:	6422                	ld	s0,8(sp)
+ 142:	0141                	addi	sp,sp,16
+ 144:	8082                	ret
+  return 0;
+ 146:	4501                	li	a0,0
+ 148:	bfe5                	j	140 <strchr+0x1a>
+
+000000000000014a <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 14a:	711d                	addi	sp,sp,-96
+ 14c:	ec86                	sd	ra,88(sp)
+ 14e:	e8a2                	sd	s0,80(sp)
+ 150:	e4a6                	sd	s1,72(sp)
+ 152:	e0ca                	sd	s2,64(sp)
+ 154:	fc4e                	sd	s3,56(sp)
+ 156:	f852                	sd	s4,48(sp)
+ 158:	f456                	sd	s5,40(sp)
+ 15a:	f05a                	sd	s6,32(sp)
+ 15c:	ec5e                	sd	s7,24(sp)
+ 15e:	e862                	sd	s8,16(sp)
+ 160:	1080                	addi	s0,sp,96
+ 162:	8baa                	mv	s7,a0
+ 164:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 166:	892a                	mv	s2,a0
+ 168:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 16a:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 16e:	4b29                	li	s6,10
+ 170:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 172:	89a6                	mv	s3,s1
+ 174:	2485                	addiw	s1,s1,1
+ 176:	0344d763          	bge	s1,s4,1a4 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 17a:	4605                	li	a2,1
+ 17c:	85d6                	mv	a1,s5
+ 17e:	4501                	li	a0,0
+ 180:	00000097          	auipc	ra,0x0
+ 184:	1b8080e7          	jalr	440(ra) # 338 <read>
+    if(cc < 1)
+ 188:	00a05e63          	blez	a0,1a4 <gets+0x5a>
+    buf[i++] = c;
+ 18c:	faf44783          	lbu	a5,-81(s0)
+ 190:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 194:	01678763          	beq	a5,s6,1a2 <gets+0x58>
+ 198:	0905                	addi	s2,s2,1
+ 19a:	fd879ce3          	bne	a5,s8,172 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 19e:	89a6                	mv	s3,s1
+ 1a0:	a011                	j	1a4 <gets+0x5a>
+ 1a2:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 1a4:	99de                	add	s3,s3,s7
+ 1a6:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 1aa:	855e                	mv	a0,s7
+ 1ac:	60e6                	ld	ra,88(sp)
+ 1ae:	6446                	ld	s0,80(sp)
+ 1b0:	64a6                	ld	s1,72(sp)
+ 1b2:	6906                	ld	s2,64(sp)
+ 1b4:	79e2                	ld	s3,56(sp)
+ 1b6:	7a42                	ld	s4,48(sp)
+ 1b8:	7aa2                	ld	s5,40(sp)
+ 1ba:	7b02                	ld	s6,32(sp)
+ 1bc:	6be2                	ld	s7,24(sp)
+ 1be:	6c42                	ld	s8,16(sp)
+ 1c0:	6125                	addi	sp,sp,96
+ 1c2:	8082                	ret
+
+00000000000001c4 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 1c4:	1101                	addi	sp,sp,-32
+ 1c6:	ec06                	sd	ra,24(sp)
+ 1c8:	e822                	sd	s0,16(sp)
+ 1ca:	e426                	sd	s1,8(sp)
+ 1cc:	e04a                	sd	s2,0(sp)
+ 1ce:	1000                	addi	s0,sp,32
+ 1d0:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 1d2:	4581                	li	a1,0
+ 1d4:	00000097          	auipc	ra,0x0
+ 1d8:	194080e7          	jalr	404(ra) # 368 <open>
+  if(fd < 0)
+ 1dc:	02054563          	bltz	a0,206 <stat+0x42>
+ 1e0:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 1e2:	85ca                	mv	a1,s2
+ 1e4:	00000097          	auipc	ra,0x0
+ 1e8:	18e080e7          	jalr	398(ra) # 372 <fstat>
+ 1ec:	892a                	mv	s2,a0
+  close(fd);
+ 1ee:	8526                	mv	a0,s1
+ 1f0:	00000097          	auipc	ra,0x0
+ 1f4:	15c080e7          	jalr	348(ra) # 34c <close>
+  return r;
+}
+ 1f8:	854a                	mv	a0,s2
+ 1fa:	60e2                	ld	ra,24(sp)
+ 1fc:	6442                	ld	s0,16(sp)
+ 1fe:	64a2                	ld	s1,8(sp)
+ 200:	6902                	ld	s2,0(sp)
+ 202:	6105                	addi	sp,sp,32
+ 204:	8082                	ret
+    return -1;
+ 206:	597d                	li	s2,-1
+ 208:	bfc5                	j	1f8 <stat+0x34>
+
+000000000000020a <atoi>:
+
+int
+atoi(const char *s)
+{
+ 20a:	1141                	addi	sp,sp,-16
+ 20c:	e422                	sd	s0,8(sp)
+ 20e:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 210:	00054703          	lbu	a4,0(a0)
+ 214:	02d00793          	li	a5,45
+  int neg = 1;
+ 218:	4585                	li	a1,1
+  if (*s == '-') {
+ 21a:	04f70363          	beq	a4,a5,260 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 21e:	00054703          	lbu	a4,0(a0)
+ 222:	fd07079b          	addiw	a5,a4,-48
+ 226:	0ff7f793          	zext.b	a5,a5
+ 22a:	46a5                	li	a3,9
+ 22c:	02f6ed63          	bltu	a3,a5,266 <atoi+0x5c>
+  n = 0;
+ 230:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 232:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 234:	0505                	addi	a0,a0,1
+ 236:	0026979b          	slliw	a5,a3,0x2
+ 23a:	9fb5                	addw	a5,a5,a3
+ 23c:	0017979b          	slliw	a5,a5,0x1
+ 240:	9fb9                	addw	a5,a5,a4
+ 242:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 246:	00054703          	lbu	a4,0(a0)
+ 24a:	fd07079b          	addiw	a5,a4,-48
+ 24e:	0ff7f793          	zext.b	a5,a5
+ 252:	fef671e3          	bgeu	a2,a5,234 <atoi+0x2a>
+  return n * neg;
+}
+ 256:	02d5853b          	mulw	a0,a1,a3
+ 25a:	6422                	ld	s0,8(sp)
+ 25c:	0141                	addi	sp,sp,16
+ 25e:	8082                	ret
+    s++;
+ 260:	0505                	addi	a0,a0,1
+    neg = -1;
+ 262:	55fd                	li	a1,-1
+ 264:	bf6d                	j	21e <atoi+0x14>
+  n = 0;
+ 266:	4681                	li	a3,0
+ 268:	b7fd                	j	256 <atoi+0x4c>
+
+000000000000026a <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 26a:	1141                	addi	sp,sp,-16
+ 26c:	e422                	sd	s0,8(sp)
+ 26e:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 270:	02b57463          	bgeu	a0,a1,298 <memmove+0x2e>
+    while(n-- > 0)
+ 274:	00c05f63          	blez	a2,292 <memmove+0x28>
+ 278:	1602                	slli	a2,a2,0x20
+ 27a:	9201                	srli	a2,a2,0x20
+ 27c:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 280:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 282:	0585                	addi	a1,a1,1
+ 284:	0705                	addi	a4,a4,1
+ 286:	fff5c683          	lbu	a3,-1(a1)
+ 28a:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 28e:	fee79ae3          	bne	a5,a4,282 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 292:	6422                	ld	s0,8(sp)
+ 294:	0141                	addi	sp,sp,16
+ 296:	8082                	ret
+    dst += n;
+ 298:	00c50733          	add	a4,a0,a2
+    src += n;
+ 29c:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 29e:	fec05ae3          	blez	a2,292 <memmove+0x28>
+ 2a2:	fff6079b          	addiw	a5,a2,-1
+ 2a6:	1782                	slli	a5,a5,0x20
+ 2a8:	9381                	srli	a5,a5,0x20
+ 2aa:	fff7c793          	not	a5,a5
+ 2ae:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 2b0:	15fd                	addi	a1,a1,-1
+ 2b2:	177d                	addi	a4,a4,-1
+ 2b4:	0005c683          	lbu	a3,0(a1)
+ 2b8:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 2bc:	fee79ae3          	bne	a5,a4,2b0 <memmove+0x46>
+ 2c0:	bfc9                	j	292 <memmove+0x28>
+
+00000000000002c2 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 2c2:	1141                	addi	sp,sp,-16
+ 2c4:	e422                	sd	s0,8(sp)
+ 2c6:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 2c8:	ca05                	beqz	a2,2f8 <memcmp+0x36>
+ 2ca:	fff6069b          	addiw	a3,a2,-1
+ 2ce:	1682                	slli	a3,a3,0x20
+ 2d0:	9281                	srli	a3,a3,0x20
+ 2d2:	0685                	addi	a3,a3,1
+ 2d4:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 2d6:	00054783          	lbu	a5,0(a0)
+ 2da:	0005c703          	lbu	a4,0(a1)
+ 2de:	00e79863          	bne	a5,a4,2ee <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 2e2:	0505                	addi	a0,a0,1
+    p2++;
+ 2e4:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 2e6:	fed518e3          	bne	a0,a3,2d6 <memcmp+0x14>
+  }
+  return 0;
+ 2ea:	4501                	li	a0,0
+ 2ec:	a019                	j	2f2 <memcmp+0x30>
+      return *p1 - *p2;
+ 2ee:	40e7853b          	subw	a0,a5,a4
+}
+ 2f2:	6422                	ld	s0,8(sp)
+ 2f4:	0141                	addi	sp,sp,16
+ 2f6:	8082                	ret
+  return 0;
+ 2f8:	4501                	li	a0,0
+ 2fa:	bfe5                	j	2f2 <memcmp+0x30>
+
+00000000000002fc <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 2fc:	1141                	addi	sp,sp,-16
+ 2fe:	e406                	sd	ra,8(sp)
+ 300:	e022                	sd	s0,0(sp)
+ 302:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 304:	00000097          	auipc	ra,0x0
+ 308:	f66080e7          	jalr	-154(ra) # 26a <memmove>
+}
+ 30c:	60a2                	ld	ra,8(sp)
+ 30e:	6402                	ld	s0,0(sp)
+ 310:	0141                	addi	sp,sp,16
+ 312:	8082                	ret
+
+0000000000000314 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 314:	4885                	li	a7,1
+ ecall
+ 316:	00000073          	ecall
+ ret
+ 31a:	8082                	ret
+
+000000000000031c <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 31c:	05d00893          	li	a7,93
+ ecall
+ 320:	00000073          	ecall
+ ret
+ 324:	8082                	ret
+
+0000000000000326 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 326:	488d                	li	a7,3
+ ecall
+ 328:	00000073          	ecall
+ ret
+ 32c:	8082                	ret
+
+000000000000032e <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 32e:	03b00893          	li	a7,59
+ ecall
+ 332:	00000073          	ecall
+ ret
+ 336:	8082                	ret
+
+0000000000000338 <read>:
+.global read
+read:
+ li a7, SYS_read
+ 338:	03f00893          	li	a7,63
+ ecall
+ 33c:	00000073          	ecall
+ ret
+ 340:	8082                	ret
+
+0000000000000342 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 342:	04000893          	li	a7,64
+ ecall
+ 346:	00000073          	ecall
+ ret
+ 34a:	8082                	ret
+
+000000000000034c <close>:
+.global close
+close:
+ li a7, SYS_close
+ 34c:	03900893          	li	a7,57
+ 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:	0dd00893          	li	a7,221
+ ecall
+ 362:	00000073          	ecall
+ ret
+ 366:	8082                	ret
+
+0000000000000368 <open>:
+.global open
+open:
+ li a7, SYS_open
+ 368:	03800893          	li	a7,56
+ ecall
+ 36c:	00000073          	ecall
+ ret
+ 370:	8082                	ret
+
+0000000000000372 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 372:	05000893          	li	a7,80
+ ecall
+ 376:	00000073          	ecall
+ ret
+ 37a:	8082                	ret
+
+000000000000037c <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 37c:	02200893          	li	a7,34
+ ecall
+ 380:	00000073          	ecall
+ ret
+ 384:	8082                	ret
+
+0000000000000386 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 386:	03100893          	li	a7,49
+ ecall
+ 38a:	00000073          	ecall
+ ret
+ 38e:	8082                	ret
+
+0000000000000390 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 390:	48dd                	li	a7,23
+ ecall
+ 392:	00000073          	ecall
+ ret
+ 396:	8082                	ret
+
+0000000000000398 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 398:	0ac00893          	li	a7,172
+ ecall
+ 39c:	00000073          	ecall
+ ret
+ 3a0:	8082                	ret
+
+00000000000003a2 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 3a2:	48b1                	li	a7,12
+ ecall
+ 3a4:	00000073          	ecall
+ ret
+ 3a8:	8082                	ret
+
+00000000000003aa <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 3aa:	48b5                	li	a7,13
+ ecall
+ 3ac:	00000073          	ecall
+ ret
+ 3b0:	8082                	ret
+
+00000000000003b2 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 3b2:	48b9                	li	a7,14
+ ecall
+ 3b4:	00000073          	ecall
+ ret
+ 3b8:	8082                	ret
+
+00000000000003ba <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 3ba:	48d9                	li	a7,22
+ ecall
+ 3bc:	00000073          	ecall
+ ret
+ 3c0:	8082                	ret
+
+00000000000003c2 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 3c2:	03200893          	li	a7,50
+ ecall
+ 3c6:	00000073          	ecall
+ ret
+ 3ca:	8082                	ret
+
+00000000000003cc <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 3cc:	48ed                	li	a7,27
+ ecall
+ 3ce:	00000073          	ecall
+ ret
+ 3d2:	8082                	ret
+
+00000000000003d4 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 3d4:	48c5                	li	a7,17
+ ecall
+ 3d6:	00000073          	ecall
+ ret
+ 3da:	8082                	ret
+
+00000000000003dc <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 3dc:	07500893          	li	a7,117
+ ecall
+ 3e0:	00000073          	ecall
+ ret
+ 3e4:	8082                	ret
+
+00000000000003e6 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 3e6:	48c9                	li	a7,18
+ ecall
+ 3e8:	00000073          	ecall
+ ret
+ 3ec:	8082                	ret
+
+00000000000003ee <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 3ee:	48cd                	li	a7,19
+ ecall
+ 3f0:	00000073          	ecall
+ ret
+ 3f4:	8082                	ret
+
+00000000000003f6 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 3f6:	48e9                	li	a7,26
+ ecall
+ 3f8:	00000073          	ecall
+ ret
+ 3fc:	8082                	ret
+
+00000000000003fe <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 3fe:	0d200893          	li	a7,210
+ ecall
+ 402:	00000073          	ecall
+ ret
+ 406:	8082                	ret
+
+0000000000000408 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 408:	1101                	addi	sp,sp,-32
+ 40a:	ec06                	sd	ra,24(sp)
+ 40c:	e822                	sd	s0,16(sp)
+ 40e:	1000                	addi	s0,sp,32
+ 410:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 414:	4605                	li	a2,1
+ 416:	fef40593          	addi	a1,s0,-17
+ 41a:	00000097          	auipc	ra,0x0
+ 41e:	f28080e7          	jalr	-216(ra) # 342 <write>
+}
+ 422:	60e2                	ld	ra,24(sp)
+ 424:	6442                	ld	s0,16(sp)
+ 426:	6105                	addi	sp,sp,32
+ 428:	8082                	ret
+
+000000000000042a <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 42a:	7139                	addi	sp,sp,-64
+ 42c:	fc06                	sd	ra,56(sp)
+ 42e:	f822                	sd	s0,48(sp)
+ 430:	f426                	sd	s1,40(sp)
+ 432:	f04a                	sd	s2,32(sp)
+ 434:	ec4e                	sd	s3,24(sp)
+ 436:	0080                	addi	s0,sp,64
+ 438:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 43a:	c299                	beqz	a3,440 <printint+0x16>
+ 43c:	0805c863          	bltz	a1,4cc <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 440:	2581                	sext.w	a1,a1
+  neg = 0;
+ 442:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 444:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 448:	86ce                	mv	a3,s3
+  i = 0;
+ 44a:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 44c:	2601                	sext.w	a2,a2
+ 44e:	00000517          	auipc	a0,0x0
+ 452:	4f250513          	addi	a0,a0,1266 # 940 <digits>
+ 456:	883a                	mv	a6,a4
+ 458:	2705                	addiw	a4,a4,1
+ 45a:	02c5f7bb          	remuw	a5,a1,a2
+ 45e:	1782                	slli	a5,a5,0x20
+ 460:	9381                	srli	a5,a5,0x20
+ 462:	97aa                	add	a5,a5,a0
+ 464:	0007c783          	lbu	a5,0(a5)
+ 468:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 46c:	0005879b          	sext.w	a5,a1
+ 470:	02c5d5bb          	divuw	a1,a1,a2
+ 474:	0685                	addi	a3,a3,1
+ 476:	fec7f0e3          	bgeu	a5,a2,456 <printint+0x2c>
+  if(neg)
+ 47a:	00088c63          	beqz	a7,492 <printint+0x68>
+    buf[i++] = '-';
+ 47e:	fd070793          	addi	a5,a4,-48
+ 482:	00878733          	add	a4,a5,s0
+ 486:	02d00793          	li	a5,45
+ 48a:	fef70823          	sb	a5,-16(a4)
+ 48e:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 492:	02e05663          	blez	a4,4be <printint+0x94>
+ 496:	fc040913          	addi	s2,s0,-64
+ 49a:	993a                	add	s2,s2,a4
+ 49c:	19fd                	addi	s3,s3,-1
+ 49e:	99ba                	add	s3,s3,a4
+ 4a0:	377d                	addiw	a4,a4,-1
+ 4a2:	1702                	slli	a4,a4,0x20
+ 4a4:	9301                	srli	a4,a4,0x20
+ 4a6:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 4aa:	fff94583          	lbu	a1,-1(s2)
+ 4ae:	8526                	mv	a0,s1
+ 4b0:	00000097          	auipc	ra,0x0
+ 4b4:	f58080e7          	jalr	-168(ra) # 408 <putc>
+  while(--i >= 0)
+ 4b8:	197d                	addi	s2,s2,-1
+ 4ba:	ff3918e3          	bne	s2,s3,4aa <printint+0x80>
+}
+ 4be:	70e2                	ld	ra,56(sp)
+ 4c0:	7442                	ld	s0,48(sp)
+ 4c2:	74a2                	ld	s1,40(sp)
+ 4c4:	7902                	ld	s2,32(sp)
+ 4c6:	69e2                	ld	s3,24(sp)
+ 4c8:	6121                	addi	sp,sp,64
+ 4ca:	8082                	ret
+    x = -xx;
+ 4cc:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 4d0:	4885                	li	a7,1
+    x = -xx;
+ 4d2:	bf8d                	j	444 <printint+0x1a>
+
+00000000000004d4 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 4d4:	7119                	addi	sp,sp,-128
+ 4d6:	fc86                	sd	ra,120(sp)
+ 4d8:	f8a2                	sd	s0,112(sp)
+ 4da:	f4a6                	sd	s1,104(sp)
+ 4dc:	f0ca                	sd	s2,96(sp)
+ 4de:	ecce                	sd	s3,88(sp)
+ 4e0:	e8d2                	sd	s4,80(sp)
+ 4e2:	e4d6                	sd	s5,72(sp)
+ 4e4:	e0da                	sd	s6,64(sp)
+ 4e6:	fc5e                	sd	s7,56(sp)
+ 4e8:	f862                	sd	s8,48(sp)
+ 4ea:	f466                	sd	s9,40(sp)
+ 4ec:	f06a                	sd	s10,32(sp)
+ 4ee:	ec6e                	sd	s11,24(sp)
+ 4f0:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 4f2:	0005c903          	lbu	s2,0(a1)
+ 4f6:	18090f63          	beqz	s2,694 <vprintf+0x1c0>
+ 4fa:	8aaa                	mv	s5,a0
+ 4fc:	8b32                	mv	s6,a2
+ 4fe:	00158493          	addi	s1,a1,1
+  state = 0;
+ 502:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 504:	02500a13          	li	s4,37
+ 508:	4c55                	li	s8,21
+ 50a:	00000c97          	auipc	s9,0x0
+ 50e:	3dec8c93          	addi	s9,s9,990 # 8e8 <malloc+0x150>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 512:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 516:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 518:	00000b97          	auipc	s7,0x0
+ 51c:	428b8b93          	addi	s7,s7,1064 # 940 <digits>
+ 520:	a839                	j	53e <vprintf+0x6a>
+        putc(fd, c);
+ 522:	85ca                	mv	a1,s2
+ 524:	8556                	mv	a0,s5
+ 526:	00000097          	auipc	ra,0x0
+ 52a:	ee2080e7          	jalr	-286(ra) # 408 <putc>
+ 52e:	a019                	j	534 <vprintf+0x60>
+    } else if(state == '%'){
+ 530:	01498d63          	beq	s3,s4,54a <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 534:	0485                	addi	s1,s1,1
+ 536:	fff4c903          	lbu	s2,-1(s1)
+ 53a:	14090d63          	beqz	s2,694 <vprintf+0x1c0>
+    if(state == 0){
+ 53e:	fe0999e3          	bnez	s3,530 <vprintf+0x5c>
+      if(c == '%'){
+ 542:	ff4910e3          	bne	s2,s4,522 <vprintf+0x4e>
+        state = '%';
+ 546:	89d2                	mv	s3,s4
+ 548:	b7f5                	j	534 <vprintf+0x60>
+      if(c == 'd'){
+ 54a:	11490c63          	beq	s2,s4,662 <vprintf+0x18e>
+ 54e:	f9d9079b          	addiw	a5,s2,-99
+ 552:	0ff7f793          	zext.b	a5,a5
+ 556:	10fc6e63          	bltu	s8,a5,672 <vprintf+0x19e>
+ 55a:	f9d9079b          	addiw	a5,s2,-99
+ 55e:	0ff7f713          	zext.b	a4,a5
+ 562:	10ec6863          	bltu	s8,a4,672 <vprintf+0x19e>
+ 566:	00271793          	slli	a5,a4,0x2
+ 56a:	97e6                	add	a5,a5,s9
+ 56c:	439c                	lw	a5,0(a5)
+ 56e:	97e6                	add	a5,a5,s9
+ 570:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 572:	008b0913          	addi	s2,s6,8
+ 576:	4685                	li	a3,1
+ 578:	4629                	li	a2,10
+ 57a:	000b2583          	lw	a1,0(s6)
+ 57e:	8556                	mv	a0,s5
+ 580:	00000097          	auipc	ra,0x0
+ 584:	eaa080e7          	jalr	-342(ra) # 42a <printint>
+ 588:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 58a:	4981                	li	s3,0
+ 58c:	b765                	j	534 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 58e:	008b0913          	addi	s2,s6,8
+ 592:	4681                	li	a3,0
+ 594:	4629                	li	a2,10
+ 596:	000b2583          	lw	a1,0(s6)
+ 59a:	8556                	mv	a0,s5
+ 59c:	00000097          	auipc	ra,0x0
+ 5a0:	e8e080e7          	jalr	-370(ra) # 42a <printint>
+ 5a4:	8b4a                	mv	s6,s2
+      state = 0;
+ 5a6:	4981                	li	s3,0
+ 5a8:	b771                	j	534 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 5aa:	008b0913          	addi	s2,s6,8
+ 5ae:	4681                	li	a3,0
+ 5b0:	866a                	mv	a2,s10
+ 5b2:	000b2583          	lw	a1,0(s6)
+ 5b6:	8556                	mv	a0,s5
+ 5b8:	00000097          	auipc	ra,0x0
+ 5bc:	e72080e7          	jalr	-398(ra) # 42a <printint>
+ 5c0:	8b4a                	mv	s6,s2
+      state = 0;
+ 5c2:	4981                	li	s3,0
+ 5c4:	bf85                	j	534 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 5c6:	008b0793          	addi	a5,s6,8
+ 5ca:	f8f43423          	sd	a5,-120(s0)
+ 5ce:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 5d2:	03000593          	li	a1,48
+ 5d6:	8556                	mv	a0,s5
+ 5d8:	00000097          	auipc	ra,0x0
+ 5dc:	e30080e7          	jalr	-464(ra) # 408 <putc>
+  putc(fd, 'x');
+ 5e0:	07800593          	li	a1,120
+ 5e4:	8556                	mv	a0,s5
+ 5e6:	00000097          	auipc	ra,0x0
+ 5ea:	e22080e7          	jalr	-478(ra) # 408 <putc>
+ 5ee:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 5f0:	03c9d793          	srli	a5,s3,0x3c
+ 5f4:	97de                	add	a5,a5,s7
+ 5f6:	0007c583          	lbu	a1,0(a5)
+ 5fa:	8556                	mv	a0,s5
+ 5fc:	00000097          	auipc	ra,0x0
+ 600:	e0c080e7          	jalr	-500(ra) # 408 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 604:	0992                	slli	s3,s3,0x4
+ 606:	397d                	addiw	s2,s2,-1
+ 608:	fe0914e3          	bnez	s2,5f0 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 60c:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 610:	4981                	li	s3,0
+ 612:	b70d                	j	534 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 614:	008b0913          	addi	s2,s6,8
+ 618:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 61c:	02098163          	beqz	s3,63e <vprintf+0x16a>
+        while(*s != 0){
+ 620:	0009c583          	lbu	a1,0(s3)
+ 624:	c5ad                	beqz	a1,68e <vprintf+0x1ba>
+          putc(fd, *s);
+ 626:	8556                	mv	a0,s5
+ 628:	00000097          	auipc	ra,0x0
+ 62c:	de0080e7          	jalr	-544(ra) # 408 <putc>
+          s++;
+ 630:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 632:	0009c583          	lbu	a1,0(s3)
+ 636:	f9e5                	bnez	a1,626 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 638:	8b4a                	mv	s6,s2
+      state = 0;
+ 63a:	4981                	li	s3,0
+ 63c:	bde5                	j	534 <vprintf+0x60>
+          s = "(null)";
+ 63e:	00000997          	auipc	s3,0x0
+ 642:	2a298993          	addi	s3,s3,674 # 8e0 <malloc+0x148>
+        while(*s != 0){
+ 646:	85ee                	mv	a1,s11
+ 648:	bff9                	j	626 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 64a:	008b0913          	addi	s2,s6,8
+ 64e:	000b4583          	lbu	a1,0(s6)
+ 652:	8556                	mv	a0,s5
+ 654:	00000097          	auipc	ra,0x0
+ 658:	db4080e7          	jalr	-588(ra) # 408 <putc>
+ 65c:	8b4a                	mv	s6,s2
+      state = 0;
+ 65e:	4981                	li	s3,0
+ 660:	bdd1                	j	534 <vprintf+0x60>
+        putc(fd, c);
+ 662:	85d2                	mv	a1,s4
+ 664:	8556                	mv	a0,s5
+ 666:	00000097          	auipc	ra,0x0
+ 66a:	da2080e7          	jalr	-606(ra) # 408 <putc>
+      state = 0;
+ 66e:	4981                	li	s3,0
+ 670:	b5d1                	j	534 <vprintf+0x60>
+        putc(fd, '%');
+ 672:	85d2                	mv	a1,s4
+ 674:	8556                	mv	a0,s5
+ 676:	00000097          	auipc	ra,0x0
+ 67a:	d92080e7          	jalr	-622(ra) # 408 <putc>
+        putc(fd, c);
+ 67e:	85ca                	mv	a1,s2
+ 680:	8556                	mv	a0,s5
+ 682:	00000097          	auipc	ra,0x0
+ 686:	d86080e7          	jalr	-634(ra) # 408 <putc>
+      state = 0;
+ 68a:	4981                	li	s3,0
+ 68c:	b565                	j	534 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 68e:	8b4a                	mv	s6,s2
+      state = 0;
+ 690:	4981                	li	s3,0
+ 692:	b54d                	j	534 <vprintf+0x60>
+    }
+  }
+}
+ 694:	70e6                	ld	ra,120(sp)
+ 696:	7446                	ld	s0,112(sp)
+ 698:	74a6                	ld	s1,104(sp)
+ 69a:	7906                	ld	s2,96(sp)
+ 69c:	69e6                	ld	s3,88(sp)
+ 69e:	6a46                	ld	s4,80(sp)
+ 6a0:	6aa6                	ld	s5,72(sp)
+ 6a2:	6b06                	ld	s6,64(sp)
+ 6a4:	7be2                	ld	s7,56(sp)
+ 6a6:	7c42                	ld	s8,48(sp)
+ 6a8:	7ca2                	ld	s9,40(sp)
+ 6aa:	7d02                	ld	s10,32(sp)
+ 6ac:	6de2                	ld	s11,24(sp)
+ 6ae:	6109                	addi	sp,sp,128
+ 6b0:	8082                	ret
+
+00000000000006b2 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 6b2:	715d                	addi	sp,sp,-80
+ 6b4:	ec06                	sd	ra,24(sp)
+ 6b6:	e822                	sd	s0,16(sp)
+ 6b8:	1000                	addi	s0,sp,32
+ 6ba:	e010                	sd	a2,0(s0)
+ 6bc:	e414                	sd	a3,8(s0)
+ 6be:	e818                	sd	a4,16(s0)
+ 6c0:	ec1c                	sd	a5,24(s0)
+ 6c2:	03043023          	sd	a6,32(s0)
+ 6c6:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6ca:	8622                	mv	a2,s0
+ 6cc:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 6d0:	00000097          	auipc	ra,0x0
+ 6d4:	e04080e7          	jalr	-508(ra) # 4d4 <vprintf>
+}
+ 6d8:	60e2                	ld	ra,24(sp)
+ 6da:	6442                	ld	s0,16(sp)
+ 6dc:	6161                	addi	sp,sp,80
+ 6de:	8082                	ret
+
+00000000000006e0 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 6e0:	711d                	addi	sp,sp,-96
+ 6e2:	ec06                	sd	ra,24(sp)
+ 6e4:	e822                	sd	s0,16(sp)
+ 6e6:	1000                	addi	s0,sp,32
+ 6e8:	e40c                	sd	a1,8(s0)
+ 6ea:	e810                	sd	a2,16(s0)
+ 6ec:	ec14                	sd	a3,24(s0)
+ 6ee:	f018                	sd	a4,32(s0)
+ 6f0:	f41c                	sd	a5,40(s0)
+ 6f2:	03043823          	sd	a6,48(s0)
+ 6f6:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6fa:	00840613          	addi	a2,s0,8
+ 6fe:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 702:	85aa                	mv	a1,a0
+ 704:	4505                	li	a0,1
+ 706:	00000097          	auipc	ra,0x0
+ 70a:	dce080e7          	jalr	-562(ra) # 4d4 <vprintf>
+}
+ 70e:	60e2                	ld	ra,24(sp)
+ 710:	6442                	ld	s0,16(sp)
+ 712:	6125                	addi	sp,sp,96
+ 714:	8082                	ret
+
+0000000000000716 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 716:	1141                	addi	sp,sp,-16
+ 718:	e422                	sd	s0,8(sp)
+ 71a:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 71c:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 720:	00000797          	auipc	a5,0x0
+ 724:	2387b783          	ld	a5,568(a5) # 958 <freep>
+ 728:	a02d                	j	752 <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;
+ 72a:	4618                	lw	a4,8(a2)
+ 72c:	9f2d                	addw	a4,a4,a1
+ 72e:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 732:	6398                	ld	a4,0(a5)
+ 734:	6310                	ld	a2,0(a4)
+ 736:	a83d                	j	774 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 738:	ff852703          	lw	a4,-8(a0)
+ 73c:	9f31                	addw	a4,a4,a2
+ 73e:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 740:	ff053683          	ld	a3,-16(a0)
+ 744:	a091                	j	788 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 746:	6398                	ld	a4,0(a5)
+ 748:	00e7e463          	bltu	a5,a4,750 <free+0x3a>
+ 74c:	00e6ea63          	bltu	a3,a4,760 <free+0x4a>
+{
+ 750:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 752:	fed7fae3          	bgeu	a5,a3,746 <free+0x30>
+ 756:	6398                	ld	a4,0(a5)
+ 758:	00e6e463          	bltu	a3,a4,760 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 75c:	fee7eae3          	bltu	a5,a4,750 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 760:	ff852583          	lw	a1,-8(a0)
+ 764:	6390                	ld	a2,0(a5)
+ 766:	02059813          	slli	a6,a1,0x20
+ 76a:	01c85713          	srli	a4,a6,0x1c
+ 76e:	9736                	add	a4,a4,a3
+ 770:	fae60de3          	beq	a2,a4,72a <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 774:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 778:	4790                	lw	a2,8(a5)
+ 77a:	02061593          	slli	a1,a2,0x20
+ 77e:	01c5d713          	srli	a4,a1,0x1c
+ 782:	973e                	add	a4,a4,a5
+ 784:	fae68ae3          	beq	a3,a4,738 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 788:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 78a:	00000717          	auipc	a4,0x0
+ 78e:	1cf73723          	sd	a5,462(a4) # 958 <freep>
+}
+ 792:	6422                	ld	s0,8(sp)
+ 794:	0141                	addi	sp,sp,16
+ 796:	8082                	ret
+
+0000000000000798 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 798:	7139                	addi	sp,sp,-64
+ 79a:	fc06                	sd	ra,56(sp)
+ 79c:	f822                	sd	s0,48(sp)
+ 79e:	f426                	sd	s1,40(sp)
+ 7a0:	f04a                	sd	s2,32(sp)
+ 7a2:	ec4e                	sd	s3,24(sp)
+ 7a4:	e852                	sd	s4,16(sp)
+ 7a6:	e456                	sd	s5,8(sp)
+ 7a8:	e05a                	sd	s6,0(sp)
+ 7aa:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 7ac:	02051493          	slli	s1,a0,0x20
+ 7b0:	9081                	srli	s1,s1,0x20
+ 7b2:	04bd                	addi	s1,s1,15
+ 7b4:	8091                	srli	s1,s1,0x4
+ 7b6:	00148a1b          	addiw	s4,s1,1
+ 7ba:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 7bc:	00000517          	auipc	a0,0x0
+ 7c0:	19c53503          	ld	a0,412(a0) # 958 <freep>
+ 7c4:	c515                	beqz	a0,7f0 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 7c6:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 7c8:	4798                	lw	a4,8(a5)
+ 7ca:	04977163          	bgeu	a4,s1,80c <malloc+0x74>
+ 7ce:	89d2                	mv	s3,s4
+ 7d0:	000a071b          	sext.w	a4,s4
+ 7d4:	6685                	lui	a3,0x1
+ 7d6:	00d77363          	bgeu	a4,a3,7dc <malloc+0x44>
+ 7da:	6985                	lui	s3,0x1
+ 7dc:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 7e0:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 7e4:	00000917          	auipc	s2,0x0
+ 7e8:	17490913          	addi	s2,s2,372 # 958 <freep>
+  if(p == (char*)-1)
+ 7ec:	5afd                	li	s5,-1
+ 7ee:	a8a5                	j	866 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 7f0:	00000797          	auipc	a5,0x0
+ 7f4:	16878793          	addi	a5,a5,360 # 958 <freep>
+ 7f8:	00000717          	auipc	a4,0x0
+ 7fc:	16870713          	addi	a4,a4,360 # 960 <base>
+ 800:	e398                	sd	a4,0(a5)
+ 802:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 804:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 808:	87ba                	mv	a5,a4
+ 80a:	b7d1                	j	7ce <malloc+0x36>
+      if(p->s.size == nunits)
+ 80c:	02e48c63          	beq	s1,a4,844 <malloc+0xac>
+        p->s.size -= nunits;
+ 810:	4147073b          	subw	a4,a4,s4
+ 814:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 816:	02071693          	slli	a3,a4,0x20
+ 81a:	01c6d713          	srli	a4,a3,0x1c
+ 81e:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 820:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 824:	00000717          	auipc	a4,0x0
+ 828:	12a73a23          	sd	a0,308(a4) # 958 <freep>
+      return (void*)(p + 1);
+ 82c:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 830:	70e2                	ld	ra,56(sp)
+ 832:	7442                	ld	s0,48(sp)
+ 834:	74a2                	ld	s1,40(sp)
+ 836:	7902                	ld	s2,32(sp)
+ 838:	69e2                	ld	s3,24(sp)
+ 83a:	6a42                	ld	s4,16(sp)
+ 83c:	6aa2                	ld	s5,8(sp)
+ 83e:	6b02                	ld	s6,0(sp)
+ 840:	6121                	addi	sp,sp,64
+ 842:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 844:	6398                	ld	a4,0(a5)
+ 846:	e118                	sd	a4,0(a0)
+ 848:	bff1                	j	824 <malloc+0x8c>
+  hp->s.size = nu;
+ 84a:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 84e:	0541                	addi	a0,a0,16
+ 850:	00000097          	auipc	ra,0x0
+ 854:	ec6080e7          	jalr	-314(ra) # 716 <free>
+  return freep;
+ 858:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 85c:	d971                	beqz	a0,830 <malloc+0x98>
+  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:	fa9775e3          	bgeu	a4,s1,80c <malloc+0x74>
+    if(p == freep)
+ 866:	00093703          	ld	a4,0(s2)
+ 86a:	853e                	mv	a0,a5
+ 86c:	fef719e3          	bne	a4,a5,85e <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 870:	854e                	mv	a0,s3
+ 872:	00000097          	auipc	ra,0x0
+ 876:	b30080e7          	jalr	-1232(ra) # 3a2 <sbrk>
+  if(p == (char*)-1)
+ 87a:	fd5518e3          	bne	a0,s5,84a <malloc+0xb2>
+        return 0;
+ 87e:	4501                	li	a0,0
+ 880:	bf45                	j	830 <malloc+0x98>
diff --git a/xv6-user/sleep.c b/xv6-user/sleep.c
new file mode 100644
index 0000000000000000000000000000000000000000..b36de5b9bc7fa634e79738085d647909071f47e1
--- /dev/null
+++ b/xv6-user/sleep.c
@@ -0,0 +1,19 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+    if (argc <= 1) {
+        fprintf(2, "Usage: sleep TIME\n");
+        exit(1);
+    }
+    int time = atoi(argv[1]);
+    if (time == 0) {
+        fprintf(2, "Usage: sleep TIME\nTIME should be an integer larger than 0.\n");
+        exit(1);
+    }
+    sleep(time);
+    exit(0);
+}
diff --git a/xv6-user/sleep.d b/xv6-user/sleep.d
new file mode 100644
index 0000000000000000000000000000000000000000..1a0cab5f6b0d67dc4ae6077c347b3e9fca786524
--- /dev/null
+++ b/xv6-user/sleep.d
@@ -0,0 +1,2 @@
+xv6-user/sleep.o: xv6-user/sleep.c kernel/include/types.h \
+ kernel/include/stat.h xv6-user/user.h kernel/include/fcntl.h
diff --git a/xv6-user/sleep.o b/xv6-user/sleep.o
new file mode 100644
index 0000000000000000000000000000000000000000..7bd27cec5254e36517c13741c378cedb13c82090
Binary files /dev/null and b/xv6-user/sleep.o differ
diff --git a/xv6-user/sleep.sym b/xv6-user/sleep.sym
new file mode 100644
index 0000000000000000000000000000000000000000..c5aaa58974bc17bebd171d7eb7f407bb8f44626c
--- /dev/null
+++ b/xv6-user/sleep.sym
@@ -0,0 +1,76 @@
+0000000000000000 .text
+0000000000000888 .rodata
+0000000000000958 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 sleep.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+0000000000000408 putc
+000000000000042a printint
+0000000000000940 digits
+0000000000000000 umalloc.c
+0000000000000958 freep
+0000000000000960 base
+0000000000000064 strcpy
+00000000000006e0 printf
+0000000000001151 __global_pointer$
+00000000000003c2 dev
+000000000000026a memmove
+00000000000003e6 trace
+000000000000014a gets
+0000000000000951 __SDATA_BEGIN__
+0000000000000398 getpid
+00000000000002fc memcpy
+0000000000000798 malloc
+00000000000003dc remove
+00000000000003aa sleep
+00000000000003ee sysinfo
+00000000000003cc readdir
+000000000000032e pipe
+00000000000003f6 rename
+0000000000000342 write
+0000000000000372 fstat
+00000000000006b2 fprintf
+0000000000000356 kill
+0000000000000080 strcat
+00000000000004d4 vprintf
+0000000000000386 chdir
+000000000000035e exec
+0000000000000326 wait
+0000000000000338 read
+00000000000002c2 memcmp
+0000000000000314 fork
+0000000000000970 __BSS_END__
+00000000000003a2 sbrk
+00000000000003ba test_proc
+00000000000003b2 uptime
+0000000000000951 __bss_start
+0000000000000104 memset
+0000000000000000 main
+00000000000000ae strcmp
+00000000000003fe shutdown
+0000000000000390 dup
+00000000000003d4 getcwd
+0000000000000951 __DATA_BEGIN__
+00000000000001c4 stat
+0000000000000951 _edata
+0000000000000970 _end
+000000000000031c exit
+000000000000020a atoi
+00000000000000da strlen
+0000000000000368 open
+0000000000000126 strchr
+000000000000037c mkdir
+000000000000034c close
+0000000000000716 free
diff --git a/xv6-user/strace.asm b/xv6-user/strace.asm
new file mode 100644
index 0000000000000000000000000000000000000000..4b4006b420cd7af2da3ac52f5eea40aba68f705f
--- /dev/null
+++ b/xv6-user/strace.asm
@@ -0,0 +1,1475 @@
+
+xv6-user/_strace:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+   0:	712d                	addi	sp,sp,-288
+   2:	ee06                	sd	ra,280(sp)
+   4:	ea22                	sd	s0,272(sp)
+   6:	e626                	sd	s1,264(sp)
+   8:	e24a                	sd	s2,256(sp)
+   a:	1200                	addi	s0,sp,288
+   c:	892e                	mv	s2,a1
+  int i;
+  char *nargv[MAXARG];
+
+  if(argc < 3 /*|| (argv[1][0] < '0' || argv[1][0] > '9')*/){
+   e:	4789                	li	a5,2
+  10:	02a7c163          	blt	a5,a0,32 <main+0x32>
+    fprintf(2, "usage: %s MASK COMMAND\n", argv[0]);
+  14:	6190                	ld	a2,0(a1)
+  16:	00001597          	auipc	a1,0x1
+  1a:	8ca58593          	addi	a1,a1,-1846 # 8e0 <malloc+0xea>
+  1e:	4509                	li	a0,2
+  20:	00000097          	auipc	ra,0x0
+  24:	6f0080e7          	jalr	1776(ra) # 710 <fprintf>
+    exit(1);
+  28:	4505                	li	a0,1
+  2a:	00000097          	auipc	ra,0x0
+  2e:	350080e7          	jalr	848(ra) # 37a <exit>
+  32:	84aa                	mv	s1,a0
+  }
+
+  if (trace(atoi(argv[1])) < 0) {
+  34:	6588                	ld	a0,8(a1)
+  36:	00000097          	auipc	ra,0x0
+  3a:	232080e7          	jalr	562(ra) # 268 <atoi>
+  3e:	00000097          	auipc	ra,0x0
+  42:	406080e7          	jalr	1030(ra) # 444 <trace>
+  46:	04054e63          	bltz	a0,a2 <main+0xa2>
+  4a:	01090793          	addi	a5,s2,16
+  4e:	ee040713          	addi	a4,s0,-288
+  52:	ffd4869b          	addiw	a3,s1,-3
+  56:	02069613          	slli	a2,a3,0x20
+  5a:	01d65693          	srli	a3,a2,0x1d
+  5e:	96be                	add	a3,a3,a5
+  60:	10090593          	addi	a1,s2,256
+    fprintf(2, "%s: strace failed\n", argv[0]);
+    exit(1);
+  }
+  
+  for(i = 2; i < argc && i < MAXARG; i++){
+    nargv[i-2] = argv[i];
+  64:	6390                	ld	a2,0(a5)
+  66:	e310                	sd	a2,0(a4)
+  for(i = 2; i < argc && i < MAXARG; i++){
+  68:	00d78663          	beq	a5,a3,74 <main+0x74>
+  6c:	07a1                	addi	a5,a5,8
+  6e:	0721                	addi	a4,a4,8
+  70:	feb79ae3          	bne	a5,a1,64 <main+0x64>
+  }
+  exec(nargv[0], nargv);  
+  74:	ee040593          	addi	a1,s0,-288
+  78:	ee043503          	ld	a0,-288(s0)
+  7c:	00000097          	auipc	ra,0x0
+  80:	340080e7          	jalr	832(ra) # 3bc <exec>
+  printf("strace: exec %s fail\n", nargv[0]);
+  84:	ee043583          	ld	a1,-288(s0)
+  88:	00001517          	auipc	a0,0x1
+  8c:	88850513          	addi	a0,a0,-1912 # 910 <malloc+0x11a>
+  90:	00000097          	auipc	ra,0x0
+  94:	6ae080e7          	jalr	1710(ra) # 73e <printf>
+  exit(0);
+  98:	4501                	li	a0,0
+  9a:	00000097          	auipc	ra,0x0
+  9e:	2e0080e7          	jalr	736(ra) # 37a <exit>
+    fprintf(2, "%s: strace failed\n", argv[0]);
+  a2:	00093603          	ld	a2,0(s2)
+  a6:	00001597          	auipc	a1,0x1
+  aa:	85258593          	addi	a1,a1,-1966 # 8f8 <malloc+0x102>
+  ae:	4509                	li	a0,2
+  b0:	00000097          	auipc	ra,0x0
+  b4:	660080e7          	jalr	1632(ra) # 710 <fprintf>
+    exit(1);
+  b8:	4505                	li	a0,1
+  ba:	00000097          	auipc	ra,0x0
+  be:	2c0080e7          	jalr	704(ra) # 37a <exit>
+
+00000000000000c2 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+  c2:	1141                	addi	sp,sp,-16
+  c4:	e422                	sd	s0,8(sp)
+  c6:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+  c8:	87aa                	mv	a5,a0
+  ca:	0585                	addi	a1,a1,1
+  cc:	0785                	addi	a5,a5,1
+  ce:	fff5c703          	lbu	a4,-1(a1)
+  d2:	fee78fa3          	sb	a4,-1(a5)
+  d6:	fb75                	bnez	a4,ca <strcpy+0x8>
+    ;
+  return os;
+}
+  d8:	6422                	ld	s0,8(sp)
+  da:	0141                	addi	sp,sp,16
+  dc:	8082                	ret
+
+00000000000000de <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+  de:	1141                	addi	sp,sp,-16
+  e0:	e422                	sd	s0,8(sp)
+  e2:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+  e4:	00054783          	lbu	a5,0(a0)
+  e8:	c385                	beqz	a5,108 <strcat+0x2a>
+  ea:	87aa                	mv	a5,a0
+    s++;
+  ec:	0785                	addi	a5,a5,1
+  while(*s)
+  ee:	0007c703          	lbu	a4,0(a5)
+  f2:	ff6d                	bnez	a4,ec <strcat+0xe>
+  while((*s++ = *t++))
+  f4:	0585                	addi	a1,a1,1
+  f6:	0785                	addi	a5,a5,1
+  f8:	fff5c703          	lbu	a4,-1(a1)
+  fc:	fee78fa3          	sb	a4,-1(a5)
+ 100:	fb75                	bnez	a4,f4 <strcat+0x16>
+    ;
+  return os;
+}
+ 102:	6422                	ld	s0,8(sp)
+ 104:	0141                	addi	sp,sp,16
+ 106:	8082                	ret
+  while(*s)
+ 108:	87aa                	mv	a5,a0
+ 10a:	b7ed                	j	f4 <strcat+0x16>
+
+000000000000010c <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+ 10c:	1141                	addi	sp,sp,-16
+ 10e:	e422                	sd	s0,8(sp)
+ 110:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+ 112:	00054783          	lbu	a5,0(a0)
+ 116:	cb91                	beqz	a5,12a <strcmp+0x1e>
+ 118:	0005c703          	lbu	a4,0(a1)
+ 11c:	00f71763          	bne	a4,a5,12a <strcmp+0x1e>
+    p++, q++;
+ 120:	0505                	addi	a0,a0,1
+ 122:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+ 124:	00054783          	lbu	a5,0(a0)
+ 128:	fbe5                	bnez	a5,118 <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+ 12a:	0005c503          	lbu	a0,0(a1)
+}
+ 12e:	40a7853b          	subw	a0,a5,a0
+ 132:	6422                	ld	s0,8(sp)
+ 134:	0141                	addi	sp,sp,16
+ 136:	8082                	ret
+
+0000000000000138 <strlen>:
+
+uint
+strlen(const char *s)
+{
+ 138:	1141                	addi	sp,sp,-16
+ 13a:	e422                	sd	s0,8(sp)
+ 13c:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 13e:	00054783          	lbu	a5,0(a0)
+ 142:	cf91                	beqz	a5,15e <strlen+0x26>
+ 144:	0505                	addi	a0,a0,1
+ 146:	87aa                	mv	a5,a0
+ 148:	4685                	li	a3,1
+ 14a:	9e89                	subw	a3,a3,a0
+ 14c:	00f6853b          	addw	a0,a3,a5
+ 150:	0785                	addi	a5,a5,1
+ 152:	fff7c703          	lbu	a4,-1(a5)
+ 156:	fb7d                	bnez	a4,14c <strlen+0x14>
+    ;
+  return n;
+}
+ 158:	6422                	ld	s0,8(sp)
+ 15a:	0141                	addi	sp,sp,16
+ 15c:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 15e:	4501                	li	a0,0
+ 160:	bfe5                	j	158 <strlen+0x20>
+
+0000000000000162 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 162:	1141                	addi	sp,sp,-16
+ 164:	e422                	sd	s0,8(sp)
+ 166:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 168:	ca19                	beqz	a2,17e <memset+0x1c>
+ 16a:	87aa                	mv	a5,a0
+ 16c:	1602                	slli	a2,a2,0x20
+ 16e:	9201                	srli	a2,a2,0x20
+ 170:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 174:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 178:	0785                	addi	a5,a5,1
+ 17a:	fee79de3          	bne	a5,a4,174 <memset+0x12>
+  }
+  return dst;
+}
+ 17e:	6422                	ld	s0,8(sp)
+ 180:	0141                	addi	sp,sp,16
+ 182:	8082                	ret
+
+0000000000000184 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 184:	1141                	addi	sp,sp,-16
+ 186:	e422                	sd	s0,8(sp)
+ 188:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 18a:	00054783          	lbu	a5,0(a0)
+ 18e:	cb99                	beqz	a5,1a4 <strchr+0x20>
+    if(*s == c)
+ 190:	00f58763          	beq	a1,a5,19e <strchr+0x1a>
+  for(; *s; s++)
+ 194:	0505                	addi	a0,a0,1
+ 196:	00054783          	lbu	a5,0(a0)
+ 19a:	fbfd                	bnez	a5,190 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 19c:	4501                	li	a0,0
+}
+ 19e:	6422                	ld	s0,8(sp)
+ 1a0:	0141                	addi	sp,sp,16
+ 1a2:	8082                	ret
+  return 0;
+ 1a4:	4501                	li	a0,0
+ 1a6:	bfe5                	j	19e <strchr+0x1a>
+
+00000000000001a8 <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 1a8:	711d                	addi	sp,sp,-96
+ 1aa:	ec86                	sd	ra,88(sp)
+ 1ac:	e8a2                	sd	s0,80(sp)
+ 1ae:	e4a6                	sd	s1,72(sp)
+ 1b0:	e0ca                	sd	s2,64(sp)
+ 1b2:	fc4e                	sd	s3,56(sp)
+ 1b4:	f852                	sd	s4,48(sp)
+ 1b6:	f456                	sd	s5,40(sp)
+ 1b8:	f05a                	sd	s6,32(sp)
+ 1ba:	ec5e                	sd	s7,24(sp)
+ 1bc:	e862                	sd	s8,16(sp)
+ 1be:	1080                	addi	s0,sp,96
+ 1c0:	8baa                	mv	s7,a0
+ 1c2:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 1c4:	892a                	mv	s2,a0
+ 1c6:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 1c8:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 1cc:	4b29                	li	s6,10
+ 1ce:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 1d0:	89a6                	mv	s3,s1
+ 1d2:	2485                	addiw	s1,s1,1
+ 1d4:	0344d763          	bge	s1,s4,202 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 1d8:	4605                	li	a2,1
+ 1da:	85d6                	mv	a1,s5
+ 1dc:	4501                	li	a0,0
+ 1de:	00000097          	auipc	ra,0x0
+ 1e2:	1b8080e7          	jalr	440(ra) # 396 <read>
+    if(cc < 1)
+ 1e6:	00a05e63          	blez	a0,202 <gets+0x5a>
+    buf[i++] = c;
+ 1ea:	faf44783          	lbu	a5,-81(s0)
+ 1ee:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 1f2:	01678763          	beq	a5,s6,200 <gets+0x58>
+ 1f6:	0905                	addi	s2,s2,1
+ 1f8:	fd879ce3          	bne	a5,s8,1d0 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 1fc:	89a6                	mv	s3,s1
+ 1fe:	a011                	j	202 <gets+0x5a>
+ 200:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 202:	99de                	add	s3,s3,s7
+ 204:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 208:	855e                	mv	a0,s7
+ 20a:	60e6                	ld	ra,88(sp)
+ 20c:	6446                	ld	s0,80(sp)
+ 20e:	64a6                	ld	s1,72(sp)
+ 210:	6906                	ld	s2,64(sp)
+ 212:	79e2                	ld	s3,56(sp)
+ 214:	7a42                	ld	s4,48(sp)
+ 216:	7aa2                	ld	s5,40(sp)
+ 218:	7b02                	ld	s6,32(sp)
+ 21a:	6be2                	ld	s7,24(sp)
+ 21c:	6c42                	ld	s8,16(sp)
+ 21e:	6125                	addi	sp,sp,96
+ 220:	8082                	ret
+
+0000000000000222 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 222:	1101                	addi	sp,sp,-32
+ 224:	ec06                	sd	ra,24(sp)
+ 226:	e822                	sd	s0,16(sp)
+ 228:	e426                	sd	s1,8(sp)
+ 22a:	e04a                	sd	s2,0(sp)
+ 22c:	1000                	addi	s0,sp,32
+ 22e:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 230:	4581                	li	a1,0
+ 232:	00000097          	auipc	ra,0x0
+ 236:	194080e7          	jalr	404(ra) # 3c6 <open>
+  if(fd < 0)
+ 23a:	02054563          	bltz	a0,264 <stat+0x42>
+ 23e:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 240:	85ca                	mv	a1,s2
+ 242:	00000097          	auipc	ra,0x0
+ 246:	18e080e7          	jalr	398(ra) # 3d0 <fstat>
+ 24a:	892a                	mv	s2,a0
+  close(fd);
+ 24c:	8526                	mv	a0,s1
+ 24e:	00000097          	auipc	ra,0x0
+ 252:	15c080e7          	jalr	348(ra) # 3aa <close>
+  return r;
+}
+ 256:	854a                	mv	a0,s2
+ 258:	60e2                	ld	ra,24(sp)
+ 25a:	6442                	ld	s0,16(sp)
+ 25c:	64a2                	ld	s1,8(sp)
+ 25e:	6902                	ld	s2,0(sp)
+ 260:	6105                	addi	sp,sp,32
+ 262:	8082                	ret
+    return -1;
+ 264:	597d                	li	s2,-1
+ 266:	bfc5                	j	256 <stat+0x34>
+
+0000000000000268 <atoi>:
+
+int
+atoi(const char *s)
+{
+ 268:	1141                	addi	sp,sp,-16
+ 26a:	e422                	sd	s0,8(sp)
+ 26c:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 26e:	00054703          	lbu	a4,0(a0)
+ 272:	02d00793          	li	a5,45
+  int neg = 1;
+ 276:	4585                	li	a1,1
+  if (*s == '-') {
+ 278:	04f70363          	beq	a4,a5,2be <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 27c:	00054703          	lbu	a4,0(a0)
+ 280:	fd07079b          	addiw	a5,a4,-48
+ 284:	0ff7f793          	zext.b	a5,a5
+ 288:	46a5                	li	a3,9
+ 28a:	02f6ed63          	bltu	a3,a5,2c4 <atoi+0x5c>
+  n = 0;
+ 28e:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 290:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 292:	0505                	addi	a0,a0,1
+ 294:	0026979b          	slliw	a5,a3,0x2
+ 298:	9fb5                	addw	a5,a5,a3
+ 29a:	0017979b          	slliw	a5,a5,0x1
+ 29e:	9fb9                	addw	a5,a5,a4
+ 2a0:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 2a4:	00054703          	lbu	a4,0(a0)
+ 2a8:	fd07079b          	addiw	a5,a4,-48
+ 2ac:	0ff7f793          	zext.b	a5,a5
+ 2b0:	fef671e3          	bgeu	a2,a5,292 <atoi+0x2a>
+  return n * neg;
+}
+ 2b4:	02d5853b          	mulw	a0,a1,a3
+ 2b8:	6422                	ld	s0,8(sp)
+ 2ba:	0141                	addi	sp,sp,16
+ 2bc:	8082                	ret
+    s++;
+ 2be:	0505                	addi	a0,a0,1
+    neg = -1;
+ 2c0:	55fd                	li	a1,-1
+ 2c2:	bf6d                	j	27c <atoi+0x14>
+  n = 0;
+ 2c4:	4681                	li	a3,0
+ 2c6:	b7fd                	j	2b4 <atoi+0x4c>
+
+00000000000002c8 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 2c8:	1141                	addi	sp,sp,-16
+ 2ca:	e422                	sd	s0,8(sp)
+ 2cc:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 2ce:	02b57463          	bgeu	a0,a1,2f6 <memmove+0x2e>
+    while(n-- > 0)
+ 2d2:	00c05f63          	blez	a2,2f0 <memmove+0x28>
+ 2d6:	1602                	slli	a2,a2,0x20
+ 2d8:	9201                	srli	a2,a2,0x20
+ 2da:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 2de:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 2e0:	0585                	addi	a1,a1,1
+ 2e2:	0705                	addi	a4,a4,1
+ 2e4:	fff5c683          	lbu	a3,-1(a1)
+ 2e8:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 2ec:	fee79ae3          	bne	a5,a4,2e0 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 2f0:	6422                	ld	s0,8(sp)
+ 2f2:	0141                	addi	sp,sp,16
+ 2f4:	8082                	ret
+    dst += n;
+ 2f6:	00c50733          	add	a4,a0,a2
+    src += n;
+ 2fa:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 2fc:	fec05ae3          	blez	a2,2f0 <memmove+0x28>
+ 300:	fff6079b          	addiw	a5,a2,-1
+ 304:	1782                	slli	a5,a5,0x20
+ 306:	9381                	srli	a5,a5,0x20
+ 308:	fff7c793          	not	a5,a5
+ 30c:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 30e:	15fd                	addi	a1,a1,-1
+ 310:	177d                	addi	a4,a4,-1
+ 312:	0005c683          	lbu	a3,0(a1)
+ 316:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 31a:	fee79ae3          	bne	a5,a4,30e <memmove+0x46>
+ 31e:	bfc9                	j	2f0 <memmove+0x28>
+
+0000000000000320 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 320:	1141                	addi	sp,sp,-16
+ 322:	e422                	sd	s0,8(sp)
+ 324:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 326:	ca05                	beqz	a2,356 <memcmp+0x36>
+ 328:	fff6069b          	addiw	a3,a2,-1
+ 32c:	1682                	slli	a3,a3,0x20
+ 32e:	9281                	srli	a3,a3,0x20
+ 330:	0685                	addi	a3,a3,1
+ 332:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 334:	00054783          	lbu	a5,0(a0)
+ 338:	0005c703          	lbu	a4,0(a1)
+ 33c:	00e79863          	bne	a5,a4,34c <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 340:	0505                	addi	a0,a0,1
+    p2++;
+ 342:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 344:	fed518e3          	bne	a0,a3,334 <memcmp+0x14>
+  }
+  return 0;
+ 348:	4501                	li	a0,0
+ 34a:	a019                	j	350 <memcmp+0x30>
+      return *p1 - *p2;
+ 34c:	40e7853b          	subw	a0,a5,a4
+}
+ 350:	6422                	ld	s0,8(sp)
+ 352:	0141                	addi	sp,sp,16
+ 354:	8082                	ret
+  return 0;
+ 356:	4501                	li	a0,0
+ 358:	bfe5                	j	350 <memcmp+0x30>
+
+000000000000035a <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 35a:	1141                	addi	sp,sp,-16
+ 35c:	e406                	sd	ra,8(sp)
+ 35e:	e022                	sd	s0,0(sp)
+ 360:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 362:	00000097          	auipc	ra,0x0
+ 366:	f66080e7          	jalr	-154(ra) # 2c8 <memmove>
+}
+ 36a:	60a2                	ld	ra,8(sp)
+ 36c:	6402                	ld	s0,0(sp)
+ 36e:	0141                	addi	sp,sp,16
+ 370:	8082                	ret
+
+0000000000000372 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 372:	4885                	li	a7,1
+ ecall
+ 374:	00000073          	ecall
+ ret
+ 378:	8082                	ret
+
+000000000000037a <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 37a:	05d00893          	li	a7,93
+ ecall
+ 37e:	00000073          	ecall
+ ret
+ 382:	8082                	ret
+
+0000000000000384 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 384:	488d                	li	a7,3
+ ecall
+ 386:	00000073          	ecall
+ ret
+ 38a:	8082                	ret
+
+000000000000038c <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 38c:	03b00893          	li	a7,59
+ ecall
+ 390:	00000073          	ecall
+ ret
+ 394:	8082                	ret
+
+0000000000000396 <read>:
+.global read
+read:
+ li a7, SYS_read
+ 396:	03f00893          	li	a7,63
+ ecall
+ 39a:	00000073          	ecall
+ ret
+ 39e:	8082                	ret
+
+00000000000003a0 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 3a0:	04000893          	li	a7,64
+ ecall
+ 3a4:	00000073          	ecall
+ ret
+ 3a8:	8082                	ret
+
+00000000000003aa <close>:
+.global close
+close:
+ li a7, SYS_close
+ 3aa:	03900893          	li	a7,57
+ ecall
+ 3ae:	00000073          	ecall
+ ret
+ 3b2:	8082                	ret
+
+00000000000003b4 <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 3b4:	4899                	li	a7,6
+ ecall
+ 3b6:	00000073          	ecall
+ ret
+ 3ba:	8082                	ret
+
+00000000000003bc <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 3bc:	0dd00893          	li	a7,221
+ ecall
+ 3c0:	00000073          	ecall
+ ret
+ 3c4:	8082                	ret
+
+00000000000003c6 <open>:
+.global open
+open:
+ li a7, SYS_open
+ 3c6:	03800893          	li	a7,56
+ ecall
+ 3ca:	00000073          	ecall
+ ret
+ 3ce:	8082                	ret
+
+00000000000003d0 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 3d0:	05000893          	li	a7,80
+ ecall
+ 3d4:	00000073          	ecall
+ ret
+ 3d8:	8082                	ret
+
+00000000000003da <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 3da:	02200893          	li	a7,34
+ ecall
+ 3de:	00000073          	ecall
+ ret
+ 3e2:	8082                	ret
+
+00000000000003e4 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 3e4:	03100893          	li	a7,49
+ ecall
+ 3e8:	00000073          	ecall
+ ret
+ 3ec:	8082                	ret
+
+00000000000003ee <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 3ee:	48dd                	li	a7,23
+ ecall
+ 3f0:	00000073          	ecall
+ ret
+ 3f4:	8082                	ret
+
+00000000000003f6 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 3f6:	0ac00893          	li	a7,172
+ ecall
+ 3fa:	00000073          	ecall
+ ret
+ 3fe:	8082                	ret
+
+0000000000000400 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 400:	48b1                	li	a7,12
+ ecall
+ 402:	00000073          	ecall
+ ret
+ 406:	8082                	ret
+
+0000000000000408 <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 408:	48b5                	li	a7,13
+ ecall
+ 40a:	00000073          	ecall
+ ret
+ 40e:	8082                	ret
+
+0000000000000410 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 410:	48b9                	li	a7,14
+ ecall
+ 412:	00000073          	ecall
+ ret
+ 416:	8082                	ret
+
+0000000000000418 <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 418:	48d9                	li	a7,22
+ ecall
+ 41a:	00000073          	ecall
+ ret
+ 41e:	8082                	ret
+
+0000000000000420 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 420:	03200893          	li	a7,50
+ ecall
+ 424:	00000073          	ecall
+ ret
+ 428:	8082                	ret
+
+000000000000042a <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 42a:	48ed                	li	a7,27
+ ecall
+ 42c:	00000073          	ecall
+ ret
+ 430:	8082                	ret
+
+0000000000000432 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 432:	48c5                	li	a7,17
+ ecall
+ 434:	00000073          	ecall
+ ret
+ 438:	8082                	ret
+
+000000000000043a <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 43a:	07500893          	li	a7,117
+ ecall
+ 43e:	00000073          	ecall
+ ret
+ 442:	8082                	ret
+
+0000000000000444 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 444:	48c9                	li	a7,18
+ ecall
+ 446:	00000073          	ecall
+ ret
+ 44a:	8082                	ret
+
+000000000000044c <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 44c:	48cd                	li	a7,19
+ ecall
+ 44e:	00000073          	ecall
+ ret
+ 452:	8082                	ret
+
+0000000000000454 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 454:	48e9                	li	a7,26
+ ecall
+ 456:	00000073          	ecall
+ ret
+ 45a:	8082                	ret
+
+000000000000045c <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 45c:	0d200893          	li	a7,210
+ ecall
+ 460:	00000073          	ecall
+ ret
+ 464:	8082                	ret
+
+0000000000000466 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 466:	1101                	addi	sp,sp,-32
+ 468:	ec06                	sd	ra,24(sp)
+ 46a:	e822                	sd	s0,16(sp)
+ 46c:	1000                	addi	s0,sp,32
+ 46e:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 472:	4605                	li	a2,1
+ 474:	fef40593          	addi	a1,s0,-17
+ 478:	00000097          	auipc	ra,0x0
+ 47c:	f28080e7          	jalr	-216(ra) # 3a0 <write>
+}
+ 480:	60e2                	ld	ra,24(sp)
+ 482:	6442                	ld	s0,16(sp)
+ 484:	6105                	addi	sp,sp,32
+ 486:	8082                	ret
+
+0000000000000488 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 488:	7139                	addi	sp,sp,-64
+ 48a:	fc06                	sd	ra,56(sp)
+ 48c:	f822                	sd	s0,48(sp)
+ 48e:	f426                	sd	s1,40(sp)
+ 490:	f04a                	sd	s2,32(sp)
+ 492:	ec4e                	sd	s3,24(sp)
+ 494:	0080                	addi	s0,sp,64
+ 496:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 498:	c299                	beqz	a3,49e <printint+0x16>
+ 49a:	0805c863          	bltz	a1,52a <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 49e:	2581                	sext.w	a1,a1
+  neg = 0;
+ 4a0:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 4a2:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 4a6:	86ce                	mv	a3,s3
+  i = 0;
+ 4a8:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 4aa:	2601                	sext.w	a2,a2
+ 4ac:	00000517          	auipc	a0,0x0
+ 4b0:	4dc50513          	addi	a0,a0,1244 # 988 <digits>
+ 4b4:	883a                	mv	a6,a4
+ 4b6:	2705                	addiw	a4,a4,1
+ 4b8:	02c5f7bb          	remuw	a5,a1,a2
+ 4bc:	1782                	slli	a5,a5,0x20
+ 4be:	9381                	srli	a5,a5,0x20
+ 4c0:	97aa                	add	a5,a5,a0
+ 4c2:	0007c783          	lbu	a5,0(a5)
+ 4c6:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 4ca:	0005879b          	sext.w	a5,a1
+ 4ce:	02c5d5bb          	divuw	a1,a1,a2
+ 4d2:	0685                	addi	a3,a3,1
+ 4d4:	fec7f0e3          	bgeu	a5,a2,4b4 <printint+0x2c>
+  if(neg)
+ 4d8:	00088c63          	beqz	a7,4f0 <printint+0x68>
+    buf[i++] = '-';
+ 4dc:	fd070793          	addi	a5,a4,-48
+ 4e0:	00878733          	add	a4,a5,s0
+ 4e4:	02d00793          	li	a5,45
+ 4e8:	fef70823          	sb	a5,-16(a4)
+ 4ec:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 4f0:	02e05663          	blez	a4,51c <printint+0x94>
+ 4f4:	fc040913          	addi	s2,s0,-64
+ 4f8:	993a                	add	s2,s2,a4
+ 4fa:	19fd                	addi	s3,s3,-1
+ 4fc:	99ba                	add	s3,s3,a4
+ 4fe:	377d                	addiw	a4,a4,-1
+ 500:	1702                	slli	a4,a4,0x20
+ 502:	9301                	srli	a4,a4,0x20
+ 504:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 508:	fff94583          	lbu	a1,-1(s2)
+ 50c:	8526                	mv	a0,s1
+ 50e:	00000097          	auipc	ra,0x0
+ 512:	f58080e7          	jalr	-168(ra) # 466 <putc>
+  while(--i >= 0)
+ 516:	197d                	addi	s2,s2,-1
+ 518:	ff3918e3          	bne	s2,s3,508 <printint+0x80>
+}
+ 51c:	70e2                	ld	ra,56(sp)
+ 51e:	7442                	ld	s0,48(sp)
+ 520:	74a2                	ld	s1,40(sp)
+ 522:	7902                	ld	s2,32(sp)
+ 524:	69e2                	ld	s3,24(sp)
+ 526:	6121                	addi	sp,sp,64
+ 528:	8082                	ret
+    x = -xx;
+ 52a:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 52e:	4885                	li	a7,1
+    x = -xx;
+ 530:	bf8d                	j	4a2 <printint+0x1a>
+
+0000000000000532 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 532:	7119                	addi	sp,sp,-128
+ 534:	fc86                	sd	ra,120(sp)
+ 536:	f8a2                	sd	s0,112(sp)
+ 538:	f4a6                	sd	s1,104(sp)
+ 53a:	f0ca                	sd	s2,96(sp)
+ 53c:	ecce                	sd	s3,88(sp)
+ 53e:	e8d2                	sd	s4,80(sp)
+ 540:	e4d6                	sd	s5,72(sp)
+ 542:	e0da                	sd	s6,64(sp)
+ 544:	fc5e                	sd	s7,56(sp)
+ 546:	f862                	sd	s8,48(sp)
+ 548:	f466                	sd	s9,40(sp)
+ 54a:	f06a                	sd	s10,32(sp)
+ 54c:	ec6e                	sd	s11,24(sp)
+ 54e:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 550:	0005c903          	lbu	s2,0(a1)
+ 554:	18090f63          	beqz	s2,6f2 <vprintf+0x1c0>
+ 558:	8aaa                	mv	s5,a0
+ 55a:	8b32                	mv	s6,a2
+ 55c:	00158493          	addi	s1,a1,1
+  state = 0;
+ 560:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 562:	02500a13          	li	s4,37
+ 566:	4c55                	li	s8,21
+ 568:	00000c97          	auipc	s9,0x0
+ 56c:	3c8c8c93          	addi	s9,s9,968 # 930 <malloc+0x13a>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 570:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 574:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 576:	00000b97          	auipc	s7,0x0
+ 57a:	412b8b93          	addi	s7,s7,1042 # 988 <digits>
+ 57e:	a839                	j	59c <vprintf+0x6a>
+        putc(fd, c);
+ 580:	85ca                	mv	a1,s2
+ 582:	8556                	mv	a0,s5
+ 584:	00000097          	auipc	ra,0x0
+ 588:	ee2080e7          	jalr	-286(ra) # 466 <putc>
+ 58c:	a019                	j	592 <vprintf+0x60>
+    } else if(state == '%'){
+ 58e:	01498d63          	beq	s3,s4,5a8 <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 592:	0485                	addi	s1,s1,1
+ 594:	fff4c903          	lbu	s2,-1(s1)
+ 598:	14090d63          	beqz	s2,6f2 <vprintf+0x1c0>
+    if(state == 0){
+ 59c:	fe0999e3          	bnez	s3,58e <vprintf+0x5c>
+      if(c == '%'){
+ 5a0:	ff4910e3          	bne	s2,s4,580 <vprintf+0x4e>
+        state = '%';
+ 5a4:	89d2                	mv	s3,s4
+ 5a6:	b7f5                	j	592 <vprintf+0x60>
+      if(c == 'd'){
+ 5a8:	11490c63          	beq	s2,s4,6c0 <vprintf+0x18e>
+ 5ac:	f9d9079b          	addiw	a5,s2,-99
+ 5b0:	0ff7f793          	zext.b	a5,a5
+ 5b4:	10fc6e63          	bltu	s8,a5,6d0 <vprintf+0x19e>
+ 5b8:	f9d9079b          	addiw	a5,s2,-99
+ 5bc:	0ff7f713          	zext.b	a4,a5
+ 5c0:	10ec6863          	bltu	s8,a4,6d0 <vprintf+0x19e>
+ 5c4:	00271793          	slli	a5,a4,0x2
+ 5c8:	97e6                	add	a5,a5,s9
+ 5ca:	439c                	lw	a5,0(a5)
+ 5cc:	97e6                	add	a5,a5,s9
+ 5ce:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 5d0:	008b0913          	addi	s2,s6,8
+ 5d4:	4685                	li	a3,1
+ 5d6:	4629                	li	a2,10
+ 5d8:	000b2583          	lw	a1,0(s6)
+ 5dc:	8556                	mv	a0,s5
+ 5de:	00000097          	auipc	ra,0x0
+ 5e2:	eaa080e7          	jalr	-342(ra) # 488 <printint>
+ 5e6:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 5e8:	4981                	li	s3,0
+ 5ea:	b765                	j	592 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 5ec:	008b0913          	addi	s2,s6,8
+ 5f0:	4681                	li	a3,0
+ 5f2:	4629                	li	a2,10
+ 5f4:	000b2583          	lw	a1,0(s6)
+ 5f8:	8556                	mv	a0,s5
+ 5fa:	00000097          	auipc	ra,0x0
+ 5fe:	e8e080e7          	jalr	-370(ra) # 488 <printint>
+ 602:	8b4a                	mv	s6,s2
+      state = 0;
+ 604:	4981                	li	s3,0
+ 606:	b771                	j	592 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 608:	008b0913          	addi	s2,s6,8
+ 60c:	4681                	li	a3,0
+ 60e:	866a                	mv	a2,s10
+ 610:	000b2583          	lw	a1,0(s6)
+ 614:	8556                	mv	a0,s5
+ 616:	00000097          	auipc	ra,0x0
+ 61a:	e72080e7          	jalr	-398(ra) # 488 <printint>
+ 61e:	8b4a                	mv	s6,s2
+      state = 0;
+ 620:	4981                	li	s3,0
+ 622:	bf85                	j	592 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 624:	008b0793          	addi	a5,s6,8
+ 628:	f8f43423          	sd	a5,-120(s0)
+ 62c:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 630:	03000593          	li	a1,48
+ 634:	8556                	mv	a0,s5
+ 636:	00000097          	auipc	ra,0x0
+ 63a:	e30080e7          	jalr	-464(ra) # 466 <putc>
+  putc(fd, 'x');
+ 63e:	07800593          	li	a1,120
+ 642:	8556                	mv	a0,s5
+ 644:	00000097          	auipc	ra,0x0
+ 648:	e22080e7          	jalr	-478(ra) # 466 <putc>
+ 64c:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 64e:	03c9d793          	srli	a5,s3,0x3c
+ 652:	97de                	add	a5,a5,s7
+ 654:	0007c583          	lbu	a1,0(a5)
+ 658:	8556                	mv	a0,s5
+ 65a:	00000097          	auipc	ra,0x0
+ 65e:	e0c080e7          	jalr	-500(ra) # 466 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 662:	0992                	slli	s3,s3,0x4
+ 664:	397d                	addiw	s2,s2,-1
+ 666:	fe0914e3          	bnez	s2,64e <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 66a:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 66e:	4981                	li	s3,0
+ 670:	b70d                	j	592 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 672:	008b0913          	addi	s2,s6,8
+ 676:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 67a:	02098163          	beqz	s3,69c <vprintf+0x16a>
+        while(*s != 0){
+ 67e:	0009c583          	lbu	a1,0(s3)
+ 682:	c5ad                	beqz	a1,6ec <vprintf+0x1ba>
+          putc(fd, *s);
+ 684:	8556                	mv	a0,s5
+ 686:	00000097          	auipc	ra,0x0
+ 68a:	de0080e7          	jalr	-544(ra) # 466 <putc>
+          s++;
+ 68e:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 690:	0009c583          	lbu	a1,0(s3)
+ 694:	f9e5                	bnez	a1,684 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 696:	8b4a                	mv	s6,s2
+      state = 0;
+ 698:	4981                	li	s3,0
+ 69a:	bde5                	j	592 <vprintf+0x60>
+          s = "(null)";
+ 69c:	00000997          	auipc	s3,0x0
+ 6a0:	28c98993          	addi	s3,s3,652 # 928 <malloc+0x132>
+        while(*s != 0){
+ 6a4:	85ee                	mv	a1,s11
+ 6a6:	bff9                	j	684 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 6a8:	008b0913          	addi	s2,s6,8
+ 6ac:	000b4583          	lbu	a1,0(s6)
+ 6b0:	8556                	mv	a0,s5
+ 6b2:	00000097          	auipc	ra,0x0
+ 6b6:	db4080e7          	jalr	-588(ra) # 466 <putc>
+ 6ba:	8b4a                	mv	s6,s2
+      state = 0;
+ 6bc:	4981                	li	s3,0
+ 6be:	bdd1                	j	592 <vprintf+0x60>
+        putc(fd, c);
+ 6c0:	85d2                	mv	a1,s4
+ 6c2:	8556                	mv	a0,s5
+ 6c4:	00000097          	auipc	ra,0x0
+ 6c8:	da2080e7          	jalr	-606(ra) # 466 <putc>
+      state = 0;
+ 6cc:	4981                	li	s3,0
+ 6ce:	b5d1                	j	592 <vprintf+0x60>
+        putc(fd, '%');
+ 6d0:	85d2                	mv	a1,s4
+ 6d2:	8556                	mv	a0,s5
+ 6d4:	00000097          	auipc	ra,0x0
+ 6d8:	d92080e7          	jalr	-622(ra) # 466 <putc>
+        putc(fd, c);
+ 6dc:	85ca                	mv	a1,s2
+ 6de:	8556                	mv	a0,s5
+ 6e0:	00000097          	auipc	ra,0x0
+ 6e4:	d86080e7          	jalr	-634(ra) # 466 <putc>
+      state = 0;
+ 6e8:	4981                	li	s3,0
+ 6ea:	b565                	j	592 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 6ec:	8b4a                	mv	s6,s2
+      state = 0;
+ 6ee:	4981                	li	s3,0
+ 6f0:	b54d                	j	592 <vprintf+0x60>
+    }
+  }
+}
+ 6f2:	70e6                	ld	ra,120(sp)
+ 6f4:	7446                	ld	s0,112(sp)
+ 6f6:	74a6                	ld	s1,104(sp)
+ 6f8:	7906                	ld	s2,96(sp)
+ 6fa:	69e6                	ld	s3,88(sp)
+ 6fc:	6a46                	ld	s4,80(sp)
+ 6fe:	6aa6                	ld	s5,72(sp)
+ 700:	6b06                	ld	s6,64(sp)
+ 702:	7be2                	ld	s7,56(sp)
+ 704:	7c42                	ld	s8,48(sp)
+ 706:	7ca2                	ld	s9,40(sp)
+ 708:	7d02                	ld	s10,32(sp)
+ 70a:	6de2                	ld	s11,24(sp)
+ 70c:	6109                	addi	sp,sp,128
+ 70e:	8082                	ret
+
+0000000000000710 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 710:	715d                	addi	sp,sp,-80
+ 712:	ec06                	sd	ra,24(sp)
+ 714:	e822                	sd	s0,16(sp)
+ 716:	1000                	addi	s0,sp,32
+ 718:	e010                	sd	a2,0(s0)
+ 71a:	e414                	sd	a3,8(s0)
+ 71c:	e818                	sd	a4,16(s0)
+ 71e:	ec1c                	sd	a5,24(s0)
+ 720:	03043023          	sd	a6,32(s0)
+ 724:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 728:	8622                	mv	a2,s0
+ 72a:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 72e:	00000097          	auipc	ra,0x0
+ 732:	e04080e7          	jalr	-508(ra) # 532 <vprintf>
+}
+ 736:	60e2                	ld	ra,24(sp)
+ 738:	6442                	ld	s0,16(sp)
+ 73a:	6161                	addi	sp,sp,80
+ 73c:	8082                	ret
+
+000000000000073e <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 73e:	711d                	addi	sp,sp,-96
+ 740:	ec06                	sd	ra,24(sp)
+ 742:	e822                	sd	s0,16(sp)
+ 744:	1000                	addi	s0,sp,32
+ 746:	e40c                	sd	a1,8(s0)
+ 748:	e810                	sd	a2,16(s0)
+ 74a:	ec14                	sd	a3,24(s0)
+ 74c:	f018                	sd	a4,32(s0)
+ 74e:	f41c                	sd	a5,40(s0)
+ 750:	03043823          	sd	a6,48(s0)
+ 754:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 758:	00840613          	addi	a2,s0,8
+ 75c:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 760:	85aa                	mv	a1,a0
+ 762:	4505                	li	a0,1
+ 764:	00000097          	auipc	ra,0x0
+ 768:	dce080e7          	jalr	-562(ra) # 532 <vprintf>
+}
+ 76c:	60e2                	ld	ra,24(sp)
+ 76e:	6442                	ld	s0,16(sp)
+ 770:	6125                	addi	sp,sp,96
+ 772:	8082                	ret
+
+0000000000000774 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 774:	1141                	addi	sp,sp,-16
+ 776:	e422                	sd	s0,8(sp)
+ 778:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 77a:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 77e:	00000797          	auipc	a5,0x0
+ 782:	2227b783          	ld	a5,546(a5) # 9a0 <freep>
+ 786:	a02d                	j	7b0 <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;
+ 788:	4618                	lw	a4,8(a2)
+ 78a:	9f2d                	addw	a4,a4,a1
+ 78c:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 790:	6398                	ld	a4,0(a5)
+ 792:	6310                	ld	a2,0(a4)
+ 794:	a83d                	j	7d2 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 796:	ff852703          	lw	a4,-8(a0)
+ 79a:	9f31                	addw	a4,a4,a2
+ 79c:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 79e:	ff053683          	ld	a3,-16(a0)
+ 7a2:	a091                	j	7e6 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 7a4:	6398                	ld	a4,0(a5)
+ 7a6:	00e7e463          	bltu	a5,a4,7ae <free+0x3a>
+ 7aa:	00e6ea63          	bltu	a3,a4,7be <free+0x4a>
+{
+ 7ae:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 7b0:	fed7fae3          	bgeu	a5,a3,7a4 <free+0x30>
+ 7b4:	6398                	ld	a4,0(a5)
+ 7b6:	00e6e463          	bltu	a3,a4,7be <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 7ba:	fee7eae3          	bltu	a5,a4,7ae <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 7be:	ff852583          	lw	a1,-8(a0)
+ 7c2:	6390                	ld	a2,0(a5)
+ 7c4:	02059813          	slli	a6,a1,0x20
+ 7c8:	01c85713          	srli	a4,a6,0x1c
+ 7cc:	9736                	add	a4,a4,a3
+ 7ce:	fae60de3          	beq	a2,a4,788 <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 7d2:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 7d6:	4790                	lw	a2,8(a5)
+ 7d8:	02061593          	slli	a1,a2,0x20
+ 7dc:	01c5d713          	srli	a4,a1,0x1c
+ 7e0:	973e                	add	a4,a4,a5
+ 7e2:	fae68ae3          	beq	a3,a4,796 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 7e6:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 7e8:	00000717          	auipc	a4,0x0
+ 7ec:	1af73c23          	sd	a5,440(a4) # 9a0 <freep>
+}
+ 7f0:	6422                	ld	s0,8(sp)
+ 7f2:	0141                	addi	sp,sp,16
+ 7f4:	8082                	ret
+
+00000000000007f6 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 7f6:	7139                	addi	sp,sp,-64
+ 7f8:	fc06                	sd	ra,56(sp)
+ 7fa:	f822                	sd	s0,48(sp)
+ 7fc:	f426                	sd	s1,40(sp)
+ 7fe:	f04a                	sd	s2,32(sp)
+ 800:	ec4e                	sd	s3,24(sp)
+ 802:	e852                	sd	s4,16(sp)
+ 804:	e456                	sd	s5,8(sp)
+ 806:	e05a                	sd	s6,0(sp)
+ 808:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 80a:	02051493          	slli	s1,a0,0x20
+ 80e:	9081                	srli	s1,s1,0x20
+ 810:	04bd                	addi	s1,s1,15
+ 812:	8091                	srli	s1,s1,0x4
+ 814:	00148a1b          	addiw	s4,s1,1
+ 818:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 81a:	00000517          	auipc	a0,0x0
+ 81e:	18653503          	ld	a0,390(a0) # 9a0 <freep>
+ 822:	c515                	beqz	a0,84e <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 824:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 826:	4798                	lw	a4,8(a5)
+ 828:	04977163          	bgeu	a4,s1,86a <malloc+0x74>
+ 82c:	89d2                	mv	s3,s4
+ 82e:	000a071b          	sext.w	a4,s4
+ 832:	6685                	lui	a3,0x1
+ 834:	00d77363          	bgeu	a4,a3,83a <malloc+0x44>
+ 838:	6985                	lui	s3,0x1
+ 83a:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 83e:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 842:	00000917          	auipc	s2,0x0
+ 846:	15e90913          	addi	s2,s2,350 # 9a0 <freep>
+  if(p == (char*)-1)
+ 84a:	5afd                	li	s5,-1
+ 84c:	a8a5                	j	8c4 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 84e:	00000797          	auipc	a5,0x0
+ 852:	15278793          	addi	a5,a5,338 # 9a0 <freep>
+ 856:	00000717          	auipc	a4,0x0
+ 85a:	15270713          	addi	a4,a4,338 # 9a8 <base>
+ 85e:	e398                	sd	a4,0(a5)
+ 860:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 862:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 866:	87ba                	mv	a5,a4
+ 868:	b7d1                	j	82c <malloc+0x36>
+      if(p->s.size == nunits)
+ 86a:	02e48c63          	beq	s1,a4,8a2 <malloc+0xac>
+        p->s.size -= nunits;
+ 86e:	4147073b          	subw	a4,a4,s4
+ 872:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 874:	02071693          	slli	a3,a4,0x20
+ 878:	01c6d713          	srli	a4,a3,0x1c
+ 87c:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 87e:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 882:	00000717          	auipc	a4,0x0
+ 886:	10a73f23          	sd	a0,286(a4) # 9a0 <freep>
+      return (void*)(p + 1);
+ 88a:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 88e:	70e2                	ld	ra,56(sp)
+ 890:	7442                	ld	s0,48(sp)
+ 892:	74a2                	ld	s1,40(sp)
+ 894:	7902                	ld	s2,32(sp)
+ 896:	69e2                	ld	s3,24(sp)
+ 898:	6a42                	ld	s4,16(sp)
+ 89a:	6aa2                	ld	s5,8(sp)
+ 89c:	6b02                	ld	s6,0(sp)
+ 89e:	6121                	addi	sp,sp,64
+ 8a0:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 8a2:	6398                	ld	a4,0(a5)
+ 8a4:	e118                	sd	a4,0(a0)
+ 8a6:	bff1                	j	882 <malloc+0x8c>
+  hp->s.size = nu;
+ 8a8:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 8ac:	0541                	addi	a0,a0,16
+ 8ae:	00000097          	auipc	ra,0x0
+ 8b2:	ec6080e7          	jalr	-314(ra) # 774 <free>
+  return freep;
+ 8b6:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 8ba:	d971                	beqz	a0,88e <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 8bc:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 8be:	4798                	lw	a4,8(a5)
+ 8c0:	fa9775e3          	bgeu	a4,s1,86a <malloc+0x74>
+    if(p == freep)
+ 8c4:	00093703          	ld	a4,0(s2)
+ 8c8:	853e                	mv	a0,a5
+ 8ca:	fef719e3          	bne	a4,a5,8bc <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 8ce:	854e                	mv	a0,s3
+ 8d0:	00000097          	auipc	ra,0x0
+ 8d4:	b30080e7          	jalr	-1232(ra) # 400 <sbrk>
+  if(p == (char*)-1)
+ 8d8:	fd5518e3          	bne	a0,s5,8a8 <malloc+0xb2>
+        return 0;
+ 8dc:	4501                	li	a0,0
+ 8de:	bf45                	j	88e <malloc+0x98>
diff --git a/xv6-user/strace.c b/xv6-user/strace.c
new file mode 100644
index 0000000000000000000000000000000000000000..95db9b7f23c94e013c6b6b43068c2f80fc0ec705
--- /dev/null
+++ b/xv6-user/strace.c
@@ -0,0 +1,28 @@
+#include "kernel/include/param.h"
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(int argc, char *argv[])
+{
+  int i;
+  char *nargv[MAXARG];
+
+  if(argc < 3 /*|| (argv[1][0] < '0' || argv[1][0] > '9')*/){
+    fprintf(2, "usage: %s MASK COMMAND\n", argv[0]);
+    exit(1);
+  }
+
+  if (trace(atoi(argv[1])) < 0) {
+    fprintf(2, "%s: strace failed\n", argv[0]);
+    exit(1);
+  }
+  
+  for(i = 2; i < argc && i < MAXARG; i++){
+    nargv[i-2] = argv[i];
+  }
+  exec(nargv[0], nargv);  
+  printf("strace: exec %s fail\n", nargv[0]);
+  exit(0);
+}
diff --git a/xv6-user/strace.d b/xv6-user/strace.d
new file mode 100644
index 0000000000000000000000000000000000000000..45b4ee751d0d69a9c4948160bc4ddf6405daab92
--- /dev/null
+++ b/xv6-user/strace.d
@@ -0,0 +1,3 @@
+xv6-user/strace.o: xv6-user/strace.c kernel/include/param.h \
+ kernel/include/types.h kernel/include/stat.h xv6-user/user.h \
+ kernel/include/fcntl.h
diff --git a/xv6-user/strace.o b/xv6-user/strace.o
new file mode 100644
index 0000000000000000000000000000000000000000..a4a69b2504f0110d7678d77ebb8753248bd033a2
Binary files /dev/null and b/xv6-user/strace.o differ
diff --git a/xv6-user/strace.sym b/xv6-user/strace.sym
new file mode 100644
index 0000000000000000000000000000000000000000..83ec1cc8a1e3125025f0c4eb665e214f71ad46c4
--- /dev/null
+++ b/xv6-user/strace.sym
@@ -0,0 +1,76 @@
+0000000000000000 .text
+00000000000008e0 .rodata
+00000000000009a0 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 strace.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+0000000000000466 putc
+0000000000000488 printint
+0000000000000988 digits
+0000000000000000 umalloc.c
+00000000000009a0 freep
+00000000000009a8 base
+00000000000000c2 strcpy
+000000000000073e printf
+0000000000001199 __global_pointer$
+0000000000000420 dev
+00000000000002c8 memmove
+0000000000000444 trace
+00000000000001a8 gets
+0000000000000999 __SDATA_BEGIN__
+00000000000003f6 getpid
+000000000000035a memcpy
+00000000000007f6 malloc
+000000000000043a remove
+0000000000000408 sleep
+000000000000044c sysinfo
+000000000000042a readdir
+000000000000038c pipe
+0000000000000454 rename
+00000000000003a0 write
+00000000000003d0 fstat
+0000000000000710 fprintf
+00000000000003b4 kill
+00000000000000de strcat
+0000000000000532 vprintf
+00000000000003e4 chdir
+00000000000003bc exec
+0000000000000384 wait
+0000000000000396 read
+0000000000000320 memcmp
+0000000000000372 fork
+00000000000009b8 __BSS_END__
+0000000000000400 sbrk
+0000000000000418 test_proc
+0000000000000410 uptime
+0000000000000999 __bss_start
+0000000000000162 memset
+0000000000000000 main
+000000000000010c strcmp
+000000000000045c shutdown
+00000000000003ee dup
+0000000000000432 getcwd
+0000000000000999 __DATA_BEGIN__
+0000000000000222 stat
+0000000000000999 _edata
+00000000000009b8 _end
+000000000000037a exit
+0000000000000268 atoi
+0000000000000138 strlen
+00000000000003c6 open
+0000000000000184 strchr
+00000000000003da mkdir
+00000000000003aa close
+0000000000000774 free
diff --git a/xv6-user/stressfs.c b/xv6-user/stressfs.c
new file mode 100644
index 0000000000000000000000000000000000000000..f2c7d99e4b28c3ccd80cf07d9f73ad3f64745301
--- /dev/null
+++ b/xv6-user/stressfs.c
@@ -0,0 +1,49 @@
+// Demonstrate that moving the "acquire" in iderw after the loop that
+// appends to the idequeue results in a race.
+
+// For this to work, you should also add a spin within iderw's
+// idequeue traversal loop.  Adding the following demonstrated a panic
+// after about 5 runs of stressfs in QEMU on a 2.1GHz CPU:
+//    for (i = 0; i < 40000; i++)
+//      asm volatile("");
+
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+#include "kernel/include/fs.h"
+#include "kernel/include/fcntl.h"
+
+int
+main(int argc, char *argv[])
+{
+  int fd, i;
+  char path[] = "stressfs0";
+  char data[512];
+
+  printf("stressfs starting\n");
+  memset(data, 'a', sizeof(data));
+
+  for(i = 0; i < 4; i++)
+    if(fork() > 0)
+      break;
+
+  printf("write %d\n", i);
+
+  path[8] += i;
+  fd = open(path, O_CREATE | O_RDWR);
+  for(i = 0; i < 20; i++)
+//    printf(fd, "%d\n", i);
+    write(fd, data, sizeof(data));
+  close(fd);
+
+  printf("read\n");
+
+  fd = open(path, O_RDONLY);
+  for (i = 0; i < 20; i++)
+    read(fd, data, sizeof(data));
+  close(fd);
+
+  wait(0);
+
+  exit(0);
+}
diff --git a/xv6-user/sysinfo.asm b/xv6-user/sysinfo.asm
new file mode 100644
index 0000000000000000000000000000000000000000..641ab432f14938a3b946019edae97f6173008deb
--- /dev/null
+++ b/xv6-user/sysinfo.asm
@@ -0,0 +1,1427 @@
+
+xv6-user/_sysinfo:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+#include "kernel/include/fcntl.h"
+#include "kernel/include/types.h"
+#include "kernel/include/sysinfo.h"
+#include "xv6-user/user.h"
+
+int main() {
+   0:	1101                	addi	sp,sp,-32
+   2:	ec06                	sd	ra,24(sp)
+   4:	e822                	sd	s0,16(sp)
+   6:	1000                	addi	s0,sp,32
+  struct sysinfo info;
+  int a = sysinfo(&info);
+   8:	fe040513          	addi	a0,s0,-32
+   c:	00000097          	auipc	ra,0x0
+  10:	3d6080e7          	jalr	982(ra) # 3e2 <sysinfo>
+  14:	85aa                	mv	a1,a0
+  printf("sysinfo ret code: %d\n", a);
+  16:	00001517          	auipc	a0,0x1
+  1a:	86250513          	addi	a0,a0,-1950 # 878 <malloc+0xec>
+  1e:	00000097          	auipc	ra,0x0
+  22:	6b6080e7          	jalr	1718(ra) # 6d4 <printf>
+  printf("info.freemem: %d\n", info.freemem);
+  26:	fe043583          	ld	a1,-32(s0)
+  2a:	00001517          	auipc	a0,0x1
+  2e:	86650513          	addi	a0,a0,-1946 # 890 <malloc+0x104>
+  32:	00000097          	auipc	ra,0x0
+  36:	6a2080e7          	jalr	1698(ra) # 6d4 <printf>
+  printf("info.nproc: %d\n", info.nproc);
+  3a:	fe843583          	ld	a1,-24(s0)
+  3e:	00001517          	auipc	a0,0x1
+  42:	86a50513          	addi	a0,a0,-1942 # 8a8 <malloc+0x11c>
+  46:	00000097          	auipc	ra,0x0
+  4a:	68e080e7          	jalr	1678(ra) # 6d4 <printf>
+  return 0;
+  4e:	4501                	li	a0,0
+  50:	60e2                	ld	ra,24(sp)
+  52:	6442                	ld	s0,16(sp)
+  54:	6105                	addi	sp,sp,32
+  56:	8082                	ret
+
+0000000000000058 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+  58:	1141                	addi	sp,sp,-16
+  5a:	e422                	sd	s0,8(sp)
+  5c:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+  5e:	87aa                	mv	a5,a0
+  60:	0585                	addi	a1,a1,1
+  62:	0785                	addi	a5,a5,1
+  64:	fff5c703          	lbu	a4,-1(a1)
+  68:	fee78fa3          	sb	a4,-1(a5)
+  6c:	fb75                	bnez	a4,60 <strcpy+0x8>
+    ;
+  return os;
+}
+  6e:	6422                	ld	s0,8(sp)
+  70:	0141                	addi	sp,sp,16
+  72:	8082                	ret
+
+0000000000000074 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+  74:	1141                	addi	sp,sp,-16
+  76:	e422                	sd	s0,8(sp)
+  78:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+  7a:	00054783          	lbu	a5,0(a0)
+  7e:	c385                	beqz	a5,9e <strcat+0x2a>
+  80:	87aa                	mv	a5,a0
+    s++;
+  82:	0785                	addi	a5,a5,1
+  while(*s)
+  84:	0007c703          	lbu	a4,0(a5)
+  88:	ff6d                	bnez	a4,82 <strcat+0xe>
+  while((*s++ = *t++))
+  8a:	0585                	addi	a1,a1,1
+  8c:	0785                	addi	a5,a5,1
+  8e:	fff5c703          	lbu	a4,-1(a1)
+  92:	fee78fa3          	sb	a4,-1(a5)
+  96:	fb75                	bnez	a4,8a <strcat+0x16>
+    ;
+  return os;
+}
+  98:	6422                	ld	s0,8(sp)
+  9a:	0141                	addi	sp,sp,16
+  9c:	8082                	ret
+  while(*s)
+  9e:	87aa                	mv	a5,a0
+  a0:	b7ed                	j	8a <strcat+0x16>
+
+00000000000000a2 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+  a2:	1141                	addi	sp,sp,-16
+  a4:	e422                	sd	s0,8(sp)
+  a6:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+  a8:	00054783          	lbu	a5,0(a0)
+  ac:	cb91                	beqz	a5,c0 <strcmp+0x1e>
+  ae:	0005c703          	lbu	a4,0(a1)
+  b2:	00f71763          	bne	a4,a5,c0 <strcmp+0x1e>
+    p++, q++;
+  b6:	0505                	addi	a0,a0,1
+  b8:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+  ba:	00054783          	lbu	a5,0(a0)
+  be:	fbe5                	bnez	a5,ae <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+  c0:	0005c503          	lbu	a0,0(a1)
+}
+  c4:	40a7853b          	subw	a0,a5,a0
+  c8:	6422                	ld	s0,8(sp)
+  ca:	0141                	addi	sp,sp,16
+  cc:	8082                	ret
+
+00000000000000ce <strlen>:
+
+uint
+strlen(const char *s)
+{
+  ce:	1141                	addi	sp,sp,-16
+  d0:	e422                	sd	s0,8(sp)
+  d2:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+  d4:	00054783          	lbu	a5,0(a0)
+  d8:	cf91                	beqz	a5,f4 <strlen+0x26>
+  da:	0505                	addi	a0,a0,1
+  dc:	87aa                	mv	a5,a0
+  de:	4685                	li	a3,1
+  e0:	9e89                	subw	a3,a3,a0
+  e2:	00f6853b          	addw	a0,a3,a5
+  e6:	0785                	addi	a5,a5,1
+  e8:	fff7c703          	lbu	a4,-1(a5)
+  ec:	fb7d                	bnez	a4,e2 <strlen+0x14>
+    ;
+  return n;
+}
+  ee:	6422                	ld	s0,8(sp)
+  f0:	0141                	addi	sp,sp,16
+  f2:	8082                	ret
+  for(n = 0; s[n]; n++)
+  f4:	4501                	li	a0,0
+  f6:	bfe5                	j	ee <strlen+0x20>
+
+00000000000000f8 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+  f8:	1141                	addi	sp,sp,-16
+  fa:	e422                	sd	s0,8(sp)
+  fc:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+  fe:	ca19                	beqz	a2,114 <memset+0x1c>
+ 100:	87aa                	mv	a5,a0
+ 102:	1602                	slli	a2,a2,0x20
+ 104:	9201                	srli	a2,a2,0x20
+ 106:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 10a:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 10e:	0785                	addi	a5,a5,1
+ 110:	fee79de3          	bne	a5,a4,10a <memset+0x12>
+  }
+  return dst;
+}
+ 114:	6422                	ld	s0,8(sp)
+ 116:	0141                	addi	sp,sp,16
+ 118:	8082                	ret
+
+000000000000011a <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 11a:	1141                	addi	sp,sp,-16
+ 11c:	e422                	sd	s0,8(sp)
+ 11e:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 120:	00054783          	lbu	a5,0(a0)
+ 124:	cb99                	beqz	a5,13a <strchr+0x20>
+    if(*s == c)
+ 126:	00f58763          	beq	a1,a5,134 <strchr+0x1a>
+  for(; *s; s++)
+ 12a:	0505                	addi	a0,a0,1
+ 12c:	00054783          	lbu	a5,0(a0)
+ 130:	fbfd                	bnez	a5,126 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 132:	4501                	li	a0,0
+}
+ 134:	6422                	ld	s0,8(sp)
+ 136:	0141                	addi	sp,sp,16
+ 138:	8082                	ret
+  return 0;
+ 13a:	4501                	li	a0,0
+ 13c:	bfe5                	j	134 <strchr+0x1a>
+
+000000000000013e <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 13e:	711d                	addi	sp,sp,-96
+ 140:	ec86                	sd	ra,88(sp)
+ 142:	e8a2                	sd	s0,80(sp)
+ 144:	e4a6                	sd	s1,72(sp)
+ 146:	e0ca                	sd	s2,64(sp)
+ 148:	fc4e                	sd	s3,56(sp)
+ 14a:	f852                	sd	s4,48(sp)
+ 14c:	f456                	sd	s5,40(sp)
+ 14e:	f05a                	sd	s6,32(sp)
+ 150:	ec5e                	sd	s7,24(sp)
+ 152:	e862                	sd	s8,16(sp)
+ 154:	1080                	addi	s0,sp,96
+ 156:	8baa                	mv	s7,a0
+ 158:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 15a:	892a                	mv	s2,a0
+ 15c:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 15e:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 162:	4b29                	li	s6,10
+ 164:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 166:	89a6                	mv	s3,s1
+ 168:	2485                	addiw	s1,s1,1
+ 16a:	0344d763          	bge	s1,s4,198 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 16e:	4605                	li	a2,1
+ 170:	85d6                	mv	a1,s5
+ 172:	4501                	li	a0,0
+ 174:	00000097          	auipc	ra,0x0
+ 178:	1b8080e7          	jalr	440(ra) # 32c <read>
+    if(cc < 1)
+ 17c:	00a05e63          	blez	a0,198 <gets+0x5a>
+    buf[i++] = c;
+ 180:	faf44783          	lbu	a5,-81(s0)
+ 184:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 188:	01678763          	beq	a5,s6,196 <gets+0x58>
+ 18c:	0905                	addi	s2,s2,1
+ 18e:	fd879ce3          	bne	a5,s8,166 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 192:	89a6                	mv	s3,s1
+ 194:	a011                	j	198 <gets+0x5a>
+ 196:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 198:	99de                	add	s3,s3,s7
+ 19a:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 19e:	855e                	mv	a0,s7
+ 1a0:	60e6                	ld	ra,88(sp)
+ 1a2:	6446                	ld	s0,80(sp)
+ 1a4:	64a6                	ld	s1,72(sp)
+ 1a6:	6906                	ld	s2,64(sp)
+ 1a8:	79e2                	ld	s3,56(sp)
+ 1aa:	7a42                	ld	s4,48(sp)
+ 1ac:	7aa2                	ld	s5,40(sp)
+ 1ae:	7b02                	ld	s6,32(sp)
+ 1b0:	6be2                	ld	s7,24(sp)
+ 1b2:	6c42                	ld	s8,16(sp)
+ 1b4:	6125                	addi	sp,sp,96
+ 1b6:	8082                	ret
+
+00000000000001b8 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 1b8:	1101                	addi	sp,sp,-32
+ 1ba:	ec06                	sd	ra,24(sp)
+ 1bc:	e822                	sd	s0,16(sp)
+ 1be:	e426                	sd	s1,8(sp)
+ 1c0:	e04a                	sd	s2,0(sp)
+ 1c2:	1000                	addi	s0,sp,32
+ 1c4:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 1c6:	4581                	li	a1,0
+ 1c8:	00000097          	auipc	ra,0x0
+ 1cc:	194080e7          	jalr	404(ra) # 35c <open>
+  if(fd < 0)
+ 1d0:	02054563          	bltz	a0,1fa <stat+0x42>
+ 1d4:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 1d6:	85ca                	mv	a1,s2
+ 1d8:	00000097          	auipc	ra,0x0
+ 1dc:	18e080e7          	jalr	398(ra) # 366 <fstat>
+ 1e0:	892a                	mv	s2,a0
+  close(fd);
+ 1e2:	8526                	mv	a0,s1
+ 1e4:	00000097          	auipc	ra,0x0
+ 1e8:	15c080e7          	jalr	348(ra) # 340 <close>
+  return r;
+}
+ 1ec:	854a                	mv	a0,s2
+ 1ee:	60e2                	ld	ra,24(sp)
+ 1f0:	6442                	ld	s0,16(sp)
+ 1f2:	64a2                	ld	s1,8(sp)
+ 1f4:	6902                	ld	s2,0(sp)
+ 1f6:	6105                	addi	sp,sp,32
+ 1f8:	8082                	ret
+    return -1;
+ 1fa:	597d                	li	s2,-1
+ 1fc:	bfc5                	j	1ec <stat+0x34>
+
+00000000000001fe <atoi>:
+
+int
+atoi(const char *s)
+{
+ 1fe:	1141                	addi	sp,sp,-16
+ 200:	e422                	sd	s0,8(sp)
+ 202:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 204:	00054703          	lbu	a4,0(a0)
+ 208:	02d00793          	li	a5,45
+  int neg = 1;
+ 20c:	4585                	li	a1,1
+  if (*s == '-') {
+ 20e:	04f70363          	beq	a4,a5,254 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 212:	00054703          	lbu	a4,0(a0)
+ 216:	fd07079b          	addiw	a5,a4,-48
+ 21a:	0ff7f793          	zext.b	a5,a5
+ 21e:	46a5                	li	a3,9
+ 220:	02f6ed63          	bltu	a3,a5,25a <atoi+0x5c>
+  n = 0;
+ 224:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 226:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 228:	0505                	addi	a0,a0,1
+ 22a:	0026979b          	slliw	a5,a3,0x2
+ 22e:	9fb5                	addw	a5,a5,a3
+ 230:	0017979b          	slliw	a5,a5,0x1
+ 234:	9fb9                	addw	a5,a5,a4
+ 236:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 23a:	00054703          	lbu	a4,0(a0)
+ 23e:	fd07079b          	addiw	a5,a4,-48
+ 242:	0ff7f793          	zext.b	a5,a5
+ 246:	fef671e3          	bgeu	a2,a5,228 <atoi+0x2a>
+  return n * neg;
+}
+ 24a:	02d5853b          	mulw	a0,a1,a3
+ 24e:	6422                	ld	s0,8(sp)
+ 250:	0141                	addi	sp,sp,16
+ 252:	8082                	ret
+    s++;
+ 254:	0505                	addi	a0,a0,1
+    neg = -1;
+ 256:	55fd                	li	a1,-1
+ 258:	bf6d                	j	212 <atoi+0x14>
+  n = 0;
+ 25a:	4681                	li	a3,0
+ 25c:	b7fd                	j	24a <atoi+0x4c>
+
+000000000000025e <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 25e:	1141                	addi	sp,sp,-16
+ 260:	e422                	sd	s0,8(sp)
+ 262:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 264:	02b57463          	bgeu	a0,a1,28c <memmove+0x2e>
+    while(n-- > 0)
+ 268:	00c05f63          	blez	a2,286 <memmove+0x28>
+ 26c:	1602                	slli	a2,a2,0x20
+ 26e:	9201                	srli	a2,a2,0x20
+ 270:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 274:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 276:	0585                	addi	a1,a1,1
+ 278:	0705                	addi	a4,a4,1
+ 27a:	fff5c683          	lbu	a3,-1(a1)
+ 27e:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 282:	fee79ae3          	bne	a5,a4,276 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 286:	6422                	ld	s0,8(sp)
+ 288:	0141                	addi	sp,sp,16
+ 28a:	8082                	ret
+    dst += n;
+ 28c:	00c50733          	add	a4,a0,a2
+    src += n;
+ 290:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 292:	fec05ae3          	blez	a2,286 <memmove+0x28>
+ 296:	fff6079b          	addiw	a5,a2,-1
+ 29a:	1782                	slli	a5,a5,0x20
+ 29c:	9381                	srli	a5,a5,0x20
+ 29e:	fff7c793          	not	a5,a5
+ 2a2:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 2a4:	15fd                	addi	a1,a1,-1
+ 2a6:	177d                	addi	a4,a4,-1
+ 2a8:	0005c683          	lbu	a3,0(a1)
+ 2ac:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 2b0:	fee79ae3          	bne	a5,a4,2a4 <memmove+0x46>
+ 2b4:	bfc9                	j	286 <memmove+0x28>
+
+00000000000002b6 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 2b6:	1141                	addi	sp,sp,-16
+ 2b8:	e422                	sd	s0,8(sp)
+ 2ba:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 2bc:	ca05                	beqz	a2,2ec <memcmp+0x36>
+ 2be:	fff6069b          	addiw	a3,a2,-1
+ 2c2:	1682                	slli	a3,a3,0x20
+ 2c4:	9281                	srli	a3,a3,0x20
+ 2c6:	0685                	addi	a3,a3,1
+ 2c8:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 2ca:	00054783          	lbu	a5,0(a0)
+ 2ce:	0005c703          	lbu	a4,0(a1)
+ 2d2:	00e79863          	bne	a5,a4,2e2 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 2d6:	0505                	addi	a0,a0,1
+    p2++;
+ 2d8:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 2da:	fed518e3          	bne	a0,a3,2ca <memcmp+0x14>
+  }
+  return 0;
+ 2de:	4501                	li	a0,0
+ 2e0:	a019                	j	2e6 <memcmp+0x30>
+      return *p1 - *p2;
+ 2e2:	40e7853b          	subw	a0,a5,a4
+}
+ 2e6:	6422                	ld	s0,8(sp)
+ 2e8:	0141                	addi	sp,sp,16
+ 2ea:	8082                	ret
+  return 0;
+ 2ec:	4501                	li	a0,0
+ 2ee:	bfe5                	j	2e6 <memcmp+0x30>
+
+00000000000002f0 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 2f0:	1141                	addi	sp,sp,-16
+ 2f2:	e406                	sd	ra,8(sp)
+ 2f4:	e022                	sd	s0,0(sp)
+ 2f6:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 2f8:	00000097          	auipc	ra,0x0
+ 2fc:	f66080e7          	jalr	-154(ra) # 25e <memmove>
+}
+ 300:	60a2                	ld	ra,8(sp)
+ 302:	6402                	ld	s0,0(sp)
+ 304:	0141                	addi	sp,sp,16
+ 306:	8082                	ret
+
+0000000000000308 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 308:	4885                	li	a7,1
+ ecall
+ 30a:	00000073          	ecall
+ ret
+ 30e:	8082                	ret
+
+0000000000000310 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 310:	05d00893          	li	a7,93
+ ecall
+ 314:	00000073          	ecall
+ ret
+ 318:	8082                	ret
+
+000000000000031a <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 31a:	488d                	li	a7,3
+ ecall
+ 31c:	00000073          	ecall
+ ret
+ 320:	8082                	ret
+
+0000000000000322 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 322:	03b00893          	li	a7,59
+ ecall
+ 326:	00000073          	ecall
+ ret
+ 32a:	8082                	ret
+
+000000000000032c <read>:
+.global read
+read:
+ li a7, SYS_read
+ 32c:	03f00893          	li	a7,63
+ ecall
+ 330:	00000073          	ecall
+ ret
+ 334:	8082                	ret
+
+0000000000000336 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 336:	04000893          	li	a7,64
+ ecall
+ 33a:	00000073          	ecall
+ ret
+ 33e:	8082                	ret
+
+0000000000000340 <close>:
+.global close
+close:
+ li a7, SYS_close
+ 340:	03900893          	li	a7,57
+ ecall
+ 344:	00000073          	ecall
+ ret
+ 348:	8082                	ret
+
+000000000000034a <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 34a:	4899                	li	a7,6
+ ecall
+ 34c:	00000073          	ecall
+ ret
+ 350:	8082                	ret
+
+0000000000000352 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 352:	0dd00893          	li	a7,221
+ ecall
+ 356:	00000073          	ecall
+ ret
+ 35a:	8082                	ret
+
+000000000000035c <open>:
+.global open
+open:
+ li a7, SYS_open
+ 35c:	03800893          	li	a7,56
+ ecall
+ 360:	00000073          	ecall
+ ret
+ 364:	8082                	ret
+
+0000000000000366 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 366:	05000893          	li	a7,80
+ ecall
+ 36a:	00000073          	ecall
+ ret
+ 36e:	8082                	ret
+
+0000000000000370 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 370:	02200893          	li	a7,34
+ ecall
+ 374:	00000073          	ecall
+ ret
+ 378:	8082                	ret
+
+000000000000037a <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 37a:	03100893          	li	a7,49
+ ecall
+ 37e:	00000073          	ecall
+ ret
+ 382:	8082                	ret
+
+0000000000000384 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 384:	48dd                	li	a7,23
+ ecall
+ 386:	00000073          	ecall
+ ret
+ 38a:	8082                	ret
+
+000000000000038c <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 38c:	0ac00893          	li	a7,172
+ 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 <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 3ae:	48d9                	li	a7,22
+ ecall
+ 3b0:	00000073          	ecall
+ ret
+ 3b4:	8082                	ret
+
+00000000000003b6 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 3b6:	03200893          	li	a7,50
+ ecall
+ 3ba:	00000073          	ecall
+ ret
+ 3be:	8082                	ret
+
+00000000000003c0 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 3c0:	48ed                	li	a7,27
+ ecall
+ 3c2:	00000073          	ecall
+ ret
+ 3c6:	8082                	ret
+
+00000000000003c8 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 3c8:	48c5                	li	a7,17
+ ecall
+ 3ca:	00000073          	ecall
+ ret
+ 3ce:	8082                	ret
+
+00000000000003d0 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 3d0:	07500893          	li	a7,117
+ ecall
+ 3d4:	00000073          	ecall
+ ret
+ 3d8:	8082                	ret
+
+00000000000003da <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 3da:	48c9                	li	a7,18
+ ecall
+ 3dc:	00000073          	ecall
+ ret
+ 3e0:	8082                	ret
+
+00000000000003e2 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 3e2:	48cd                	li	a7,19
+ ecall
+ 3e4:	00000073          	ecall
+ ret
+ 3e8:	8082                	ret
+
+00000000000003ea <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 3ea:	48e9                	li	a7,26
+ ecall
+ 3ec:	00000073          	ecall
+ ret
+ 3f0:	8082                	ret
+
+00000000000003f2 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 3f2:	0d200893          	li	a7,210
+ ecall
+ 3f6:	00000073          	ecall
+ ret
+ 3fa:	8082                	ret
+
+00000000000003fc <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 3fc:	1101                	addi	sp,sp,-32
+ 3fe:	ec06                	sd	ra,24(sp)
+ 400:	e822                	sd	s0,16(sp)
+ 402:	1000                	addi	s0,sp,32
+ 404:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 408:	4605                	li	a2,1
+ 40a:	fef40593          	addi	a1,s0,-17
+ 40e:	00000097          	auipc	ra,0x0
+ 412:	f28080e7          	jalr	-216(ra) # 336 <write>
+}
+ 416:	60e2                	ld	ra,24(sp)
+ 418:	6442                	ld	s0,16(sp)
+ 41a:	6105                	addi	sp,sp,32
+ 41c:	8082                	ret
+
+000000000000041e <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 41e:	7139                	addi	sp,sp,-64
+ 420:	fc06                	sd	ra,56(sp)
+ 422:	f822                	sd	s0,48(sp)
+ 424:	f426                	sd	s1,40(sp)
+ 426:	f04a                	sd	s2,32(sp)
+ 428:	ec4e                	sd	s3,24(sp)
+ 42a:	0080                	addi	s0,sp,64
+ 42c:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 42e:	c299                	beqz	a3,434 <printint+0x16>
+ 430:	0805c863          	bltz	a1,4c0 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 434:	2581                	sext.w	a1,a1
+  neg = 0;
+ 436:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 438:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 43c:	86ce                	mv	a3,s3
+  i = 0;
+ 43e:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 440:	2601                	sext.w	a2,a2
+ 442:	00000517          	auipc	a0,0x0
+ 446:	4d650513          	addi	a0,a0,1238 # 918 <digits>
+ 44a:	883a                	mv	a6,a4
+ 44c:	2705                	addiw	a4,a4,1
+ 44e:	02c5f7bb          	remuw	a5,a1,a2
+ 452:	1782                	slli	a5,a5,0x20
+ 454:	9381                	srli	a5,a5,0x20
+ 456:	97aa                	add	a5,a5,a0
+ 458:	0007c783          	lbu	a5,0(a5)
+ 45c:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 460:	0005879b          	sext.w	a5,a1
+ 464:	02c5d5bb          	divuw	a1,a1,a2
+ 468:	0685                	addi	a3,a3,1
+ 46a:	fec7f0e3          	bgeu	a5,a2,44a <printint+0x2c>
+  if(neg)
+ 46e:	00088c63          	beqz	a7,486 <printint+0x68>
+    buf[i++] = '-';
+ 472:	fd070793          	addi	a5,a4,-48
+ 476:	00878733          	add	a4,a5,s0
+ 47a:	02d00793          	li	a5,45
+ 47e:	fef70823          	sb	a5,-16(a4)
+ 482:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 486:	02e05663          	blez	a4,4b2 <printint+0x94>
+ 48a:	fc040913          	addi	s2,s0,-64
+ 48e:	993a                	add	s2,s2,a4
+ 490:	19fd                	addi	s3,s3,-1
+ 492:	99ba                	add	s3,s3,a4
+ 494:	377d                	addiw	a4,a4,-1
+ 496:	1702                	slli	a4,a4,0x20
+ 498:	9301                	srli	a4,a4,0x20
+ 49a:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 49e:	fff94583          	lbu	a1,-1(s2)
+ 4a2:	8526                	mv	a0,s1
+ 4a4:	00000097          	auipc	ra,0x0
+ 4a8:	f58080e7          	jalr	-168(ra) # 3fc <putc>
+  while(--i >= 0)
+ 4ac:	197d                	addi	s2,s2,-1
+ 4ae:	ff3918e3          	bne	s2,s3,49e <printint+0x80>
+}
+ 4b2:	70e2                	ld	ra,56(sp)
+ 4b4:	7442                	ld	s0,48(sp)
+ 4b6:	74a2                	ld	s1,40(sp)
+ 4b8:	7902                	ld	s2,32(sp)
+ 4ba:	69e2                	ld	s3,24(sp)
+ 4bc:	6121                	addi	sp,sp,64
+ 4be:	8082                	ret
+    x = -xx;
+ 4c0:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 4c4:	4885                	li	a7,1
+    x = -xx;
+ 4c6:	bf8d                	j	438 <printint+0x1a>
+
+00000000000004c8 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 4c8:	7119                	addi	sp,sp,-128
+ 4ca:	fc86                	sd	ra,120(sp)
+ 4cc:	f8a2                	sd	s0,112(sp)
+ 4ce:	f4a6                	sd	s1,104(sp)
+ 4d0:	f0ca                	sd	s2,96(sp)
+ 4d2:	ecce                	sd	s3,88(sp)
+ 4d4:	e8d2                	sd	s4,80(sp)
+ 4d6:	e4d6                	sd	s5,72(sp)
+ 4d8:	e0da                	sd	s6,64(sp)
+ 4da:	fc5e                	sd	s7,56(sp)
+ 4dc:	f862                	sd	s8,48(sp)
+ 4de:	f466                	sd	s9,40(sp)
+ 4e0:	f06a                	sd	s10,32(sp)
+ 4e2:	ec6e                	sd	s11,24(sp)
+ 4e4:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 4e6:	0005c903          	lbu	s2,0(a1)
+ 4ea:	18090f63          	beqz	s2,688 <vprintf+0x1c0>
+ 4ee:	8aaa                	mv	s5,a0
+ 4f0:	8b32                	mv	s6,a2
+ 4f2:	00158493          	addi	s1,a1,1
+  state = 0;
+ 4f6:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 4f8:	02500a13          	li	s4,37
+ 4fc:	4c55                	li	s8,21
+ 4fe:	00000c97          	auipc	s9,0x0
+ 502:	3c2c8c93          	addi	s9,s9,962 # 8c0 <malloc+0x134>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 506:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 50a:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 50c:	00000b97          	auipc	s7,0x0
+ 510:	40cb8b93          	addi	s7,s7,1036 # 918 <digits>
+ 514:	a839                	j	532 <vprintf+0x6a>
+        putc(fd, c);
+ 516:	85ca                	mv	a1,s2
+ 518:	8556                	mv	a0,s5
+ 51a:	00000097          	auipc	ra,0x0
+ 51e:	ee2080e7          	jalr	-286(ra) # 3fc <putc>
+ 522:	a019                	j	528 <vprintf+0x60>
+    } else if(state == '%'){
+ 524:	01498d63          	beq	s3,s4,53e <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 528:	0485                	addi	s1,s1,1
+ 52a:	fff4c903          	lbu	s2,-1(s1)
+ 52e:	14090d63          	beqz	s2,688 <vprintf+0x1c0>
+    if(state == 0){
+ 532:	fe0999e3          	bnez	s3,524 <vprintf+0x5c>
+      if(c == '%'){
+ 536:	ff4910e3          	bne	s2,s4,516 <vprintf+0x4e>
+        state = '%';
+ 53a:	89d2                	mv	s3,s4
+ 53c:	b7f5                	j	528 <vprintf+0x60>
+      if(c == 'd'){
+ 53e:	11490c63          	beq	s2,s4,656 <vprintf+0x18e>
+ 542:	f9d9079b          	addiw	a5,s2,-99
+ 546:	0ff7f793          	zext.b	a5,a5
+ 54a:	10fc6e63          	bltu	s8,a5,666 <vprintf+0x19e>
+ 54e:	f9d9079b          	addiw	a5,s2,-99
+ 552:	0ff7f713          	zext.b	a4,a5
+ 556:	10ec6863          	bltu	s8,a4,666 <vprintf+0x19e>
+ 55a:	00271793          	slli	a5,a4,0x2
+ 55e:	97e6                	add	a5,a5,s9
+ 560:	439c                	lw	a5,0(a5)
+ 562:	97e6                	add	a5,a5,s9
+ 564:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 566:	008b0913          	addi	s2,s6,8
+ 56a:	4685                	li	a3,1
+ 56c:	4629                	li	a2,10
+ 56e:	000b2583          	lw	a1,0(s6)
+ 572:	8556                	mv	a0,s5
+ 574:	00000097          	auipc	ra,0x0
+ 578:	eaa080e7          	jalr	-342(ra) # 41e <printint>
+ 57c:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 57e:	4981                	li	s3,0
+ 580:	b765                	j	528 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 582:	008b0913          	addi	s2,s6,8
+ 586:	4681                	li	a3,0
+ 588:	4629                	li	a2,10
+ 58a:	000b2583          	lw	a1,0(s6)
+ 58e:	8556                	mv	a0,s5
+ 590:	00000097          	auipc	ra,0x0
+ 594:	e8e080e7          	jalr	-370(ra) # 41e <printint>
+ 598:	8b4a                	mv	s6,s2
+      state = 0;
+ 59a:	4981                	li	s3,0
+ 59c:	b771                	j	528 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 59e:	008b0913          	addi	s2,s6,8
+ 5a2:	4681                	li	a3,0
+ 5a4:	866a                	mv	a2,s10
+ 5a6:	000b2583          	lw	a1,0(s6)
+ 5aa:	8556                	mv	a0,s5
+ 5ac:	00000097          	auipc	ra,0x0
+ 5b0:	e72080e7          	jalr	-398(ra) # 41e <printint>
+ 5b4:	8b4a                	mv	s6,s2
+      state = 0;
+ 5b6:	4981                	li	s3,0
+ 5b8:	bf85                	j	528 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 5ba:	008b0793          	addi	a5,s6,8
+ 5be:	f8f43423          	sd	a5,-120(s0)
+ 5c2:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 5c6:	03000593          	li	a1,48
+ 5ca:	8556                	mv	a0,s5
+ 5cc:	00000097          	auipc	ra,0x0
+ 5d0:	e30080e7          	jalr	-464(ra) # 3fc <putc>
+  putc(fd, 'x');
+ 5d4:	07800593          	li	a1,120
+ 5d8:	8556                	mv	a0,s5
+ 5da:	00000097          	auipc	ra,0x0
+ 5de:	e22080e7          	jalr	-478(ra) # 3fc <putc>
+ 5e2:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 5e4:	03c9d793          	srli	a5,s3,0x3c
+ 5e8:	97de                	add	a5,a5,s7
+ 5ea:	0007c583          	lbu	a1,0(a5)
+ 5ee:	8556                	mv	a0,s5
+ 5f0:	00000097          	auipc	ra,0x0
+ 5f4:	e0c080e7          	jalr	-500(ra) # 3fc <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 5f8:	0992                	slli	s3,s3,0x4
+ 5fa:	397d                	addiw	s2,s2,-1
+ 5fc:	fe0914e3          	bnez	s2,5e4 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 600:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 604:	4981                	li	s3,0
+ 606:	b70d                	j	528 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 608:	008b0913          	addi	s2,s6,8
+ 60c:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 610:	02098163          	beqz	s3,632 <vprintf+0x16a>
+        while(*s != 0){
+ 614:	0009c583          	lbu	a1,0(s3)
+ 618:	c5ad                	beqz	a1,682 <vprintf+0x1ba>
+          putc(fd, *s);
+ 61a:	8556                	mv	a0,s5
+ 61c:	00000097          	auipc	ra,0x0
+ 620:	de0080e7          	jalr	-544(ra) # 3fc <putc>
+          s++;
+ 624:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 626:	0009c583          	lbu	a1,0(s3)
+ 62a:	f9e5                	bnez	a1,61a <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 62c:	8b4a                	mv	s6,s2
+      state = 0;
+ 62e:	4981                	li	s3,0
+ 630:	bde5                	j	528 <vprintf+0x60>
+          s = "(null)";
+ 632:	00000997          	auipc	s3,0x0
+ 636:	28698993          	addi	s3,s3,646 # 8b8 <malloc+0x12c>
+        while(*s != 0){
+ 63a:	85ee                	mv	a1,s11
+ 63c:	bff9                	j	61a <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 63e:	008b0913          	addi	s2,s6,8
+ 642:	000b4583          	lbu	a1,0(s6)
+ 646:	8556                	mv	a0,s5
+ 648:	00000097          	auipc	ra,0x0
+ 64c:	db4080e7          	jalr	-588(ra) # 3fc <putc>
+ 650:	8b4a                	mv	s6,s2
+      state = 0;
+ 652:	4981                	li	s3,0
+ 654:	bdd1                	j	528 <vprintf+0x60>
+        putc(fd, c);
+ 656:	85d2                	mv	a1,s4
+ 658:	8556                	mv	a0,s5
+ 65a:	00000097          	auipc	ra,0x0
+ 65e:	da2080e7          	jalr	-606(ra) # 3fc <putc>
+      state = 0;
+ 662:	4981                	li	s3,0
+ 664:	b5d1                	j	528 <vprintf+0x60>
+        putc(fd, '%');
+ 666:	85d2                	mv	a1,s4
+ 668:	8556                	mv	a0,s5
+ 66a:	00000097          	auipc	ra,0x0
+ 66e:	d92080e7          	jalr	-622(ra) # 3fc <putc>
+        putc(fd, c);
+ 672:	85ca                	mv	a1,s2
+ 674:	8556                	mv	a0,s5
+ 676:	00000097          	auipc	ra,0x0
+ 67a:	d86080e7          	jalr	-634(ra) # 3fc <putc>
+      state = 0;
+ 67e:	4981                	li	s3,0
+ 680:	b565                	j	528 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 682:	8b4a                	mv	s6,s2
+      state = 0;
+ 684:	4981                	li	s3,0
+ 686:	b54d                	j	528 <vprintf+0x60>
+    }
+  }
+}
+ 688:	70e6                	ld	ra,120(sp)
+ 68a:	7446                	ld	s0,112(sp)
+ 68c:	74a6                	ld	s1,104(sp)
+ 68e:	7906                	ld	s2,96(sp)
+ 690:	69e6                	ld	s3,88(sp)
+ 692:	6a46                	ld	s4,80(sp)
+ 694:	6aa6                	ld	s5,72(sp)
+ 696:	6b06                	ld	s6,64(sp)
+ 698:	7be2                	ld	s7,56(sp)
+ 69a:	7c42                	ld	s8,48(sp)
+ 69c:	7ca2                	ld	s9,40(sp)
+ 69e:	7d02                	ld	s10,32(sp)
+ 6a0:	6de2                	ld	s11,24(sp)
+ 6a2:	6109                	addi	sp,sp,128
+ 6a4:	8082                	ret
+
+00000000000006a6 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 6a6:	715d                	addi	sp,sp,-80
+ 6a8:	ec06                	sd	ra,24(sp)
+ 6aa:	e822                	sd	s0,16(sp)
+ 6ac:	1000                	addi	s0,sp,32
+ 6ae:	e010                	sd	a2,0(s0)
+ 6b0:	e414                	sd	a3,8(s0)
+ 6b2:	e818                	sd	a4,16(s0)
+ 6b4:	ec1c                	sd	a5,24(s0)
+ 6b6:	03043023          	sd	a6,32(s0)
+ 6ba:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6be:	8622                	mv	a2,s0
+ 6c0:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 6c4:	00000097          	auipc	ra,0x0
+ 6c8:	e04080e7          	jalr	-508(ra) # 4c8 <vprintf>
+}
+ 6cc:	60e2                	ld	ra,24(sp)
+ 6ce:	6442                	ld	s0,16(sp)
+ 6d0:	6161                	addi	sp,sp,80
+ 6d2:	8082                	ret
+
+00000000000006d4 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 6d4:	711d                	addi	sp,sp,-96
+ 6d6:	ec06                	sd	ra,24(sp)
+ 6d8:	e822                	sd	s0,16(sp)
+ 6da:	1000                	addi	s0,sp,32
+ 6dc:	e40c                	sd	a1,8(s0)
+ 6de:	e810                	sd	a2,16(s0)
+ 6e0:	ec14                	sd	a3,24(s0)
+ 6e2:	f018                	sd	a4,32(s0)
+ 6e4:	f41c                	sd	a5,40(s0)
+ 6e6:	03043823          	sd	a6,48(s0)
+ 6ea:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6ee:	00840613          	addi	a2,s0,8
+ 6f2:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 6f6:	85aa                	mv	a1,a0
+ 6f8:	4505                	li	a0,1
+ 6fa:	00000097          	auipc	ra,0x0
+ 6fe:	dce080e7          	jalr	-562(ra) # 4c8 <vprintf>
+}
+ 702:	60e2                	ld	ra,24(sp)
+ 704:	6442                	ld	s0,16(sp)
+ 706:	6125                	addi	sp,sp,96
+ 708:	8082                	ret
+
+000000000000070a <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 70a:	1141                	addi	sp,sp,-16
+ 70c:	e422                	sd	s0,8(sp)
+ 70e:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 710:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 714:	00000797          	auipc	a5,0x0
+ 718:	21c7b783          	ld	a5,540(a5) # 930 <freep>
+ 71c:	a02d                	j	746 <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;
+ 71e:	4618                	lw	a4,8(a2)
+ 720:	9f2d                	addw	a4,a4,a1
+ 722:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 726:	6398                	ld	a4,0(a5)
+ 728:	6310                	ld	a2,0(a4)
+ 72a:	a83d                	j	768 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 72c:	ff852703          	lw	a4,-8(a0)
+ 730:	9f31                	addw	a4,a4,a2
+ 732:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 734:	ff053683          	ld	a3,-16(a0)
+ 738:	a091                	j	77c <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 73a:	6398                	ld	a4,0(a5)
+ 73c:	00e7e463          	bltu	a5,a4,744 <free+0x3a>
+ 740:	00e6ea63          	bltu	a3,a4,754 <free+0x4a>
+{
+ 744:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 746:	fed7fae3          	bgeu	a5,a3,73a <free+0x30>
+ 74a:	6398                	ld	a4,0(a5)
+ 74c:	00e6e463          	bltu	a3,a4,754 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 750:	fee7eae3          	bltu	a5,a4,744 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 754:	ff852583          	lw	a1,-8(a0)
+ 758:	6390                	ld	a2,0(a5)
+ 75a:	02059813          	slli	a6,a1,0x20
+ 75e:	01c85713          	srli	a4,a6,0x1c
+ 762:	9736                	add	a4,a4,a3
+ 764:	fae60de3          	beq	a2,a4,71e <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 768:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 76c:	4790                	lw	a2,8(a5)
+ 76e:	02061593          	slli	a1,a2,0x20
+ 772:	01c5d713          	srli	a4,a1,0x1c
+ 776:	973e                	add	a4,a4,a5
+ 778:	fae68ae3          	beq	a3,a4,72c <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 77c:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 77e:	00000717          	auipc	a4,0x0
+ 782:	1af73923          	sd	a5,434(a4) # 930 <freep>
+}
+ 786:	6422                	ld	s0,8(sp)
+ 788:	0141                	addi	sp,sp,16
+ 78a:	8082                	ret
+
+000000000000078c <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 78c:	7139                	addi	sp,sp,-64
+ 78e:	fc06                	sd	ra,56(sp)
+ 790:	f822                	sd	s0,48(sp)
+ 792:	f426                	sd	s1,40(sp)
+ 794:	f04a                	sd	s2,32(sp)
+ 796:	ec4e                	sd	s3,24(sp)
+ 798:	e852                	sd	s4,16(sp)
+ 79a:	e456                	sd	s5,8(sp)
+ 79c:	e05a                	sd	s6,0(sp)
+ 79e:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 7a0:	02051493          	slli	s1,a0,0x20
+ 7a4:	9081                	srli	s1,s1,0x20
+ 7a6:	04bd                	addi	s1,s1,15
+ 7a8:	8091                	srli	s1,s1,0x4
+ 7aa:	00148a1b          	addiw	s4,s1,1
+ 7ae:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 7b0:	00000517          	auipc	a0,0x0
+ 7b4:	18053503          	ld	a0,384(a0) # 930 <freep>
+ 7b8:	c515                	beqz	a0,7e4 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 7ba:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 7bc:	4798                	lw	a4,8(a5)
+ 7be:	04977163          	bgeu	a4,s1,800 <malloc+0x74>
+ 7c2:	89d2                	mv	s3,s4
+ 7c4:	000a071b          	sext.w	a4,s4
+ 7c8:	6685                	lui	a3,0x1
+ 7ca:	00d77363          	bgeu	a4,a3,7d0 <malloc+0x44>
+ 7ce:	6985                	lui	s3,0x1
+ 7d0:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 7d4:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 7d8:	00000917          	auipc	s2,0x0
+ 7dc:	15890913          	addi	s2,s2,344 # 930 <freep>
+  if(p == (char*)-1)
+ 7e0:	5afd                	li	s5,-1
+ 7e2:	a8a5                	j	85a <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 7e4:	00000797          	auipc	a5,0x0
+ 7e8:	14c78793          	addi	a5,a5,332 # 930 <freep>
+ 7ec:	00000717          	auipc	a4,0x0
+ 7f0:	14c70713          	addi	a4,a4,332 # 938 <base>
+ 7f4:	e398                	sd	a4,0(a5)
+ 7f6:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 7f8:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 7fc:	87ba                	mv	a5,a4
+ 7fe:	b7d1                	j	7c2 <malloc+0x36>
+      if(p->s.size == nunits)
+ 800:	02e48c63          	beq	s1,a4,838 <malloc+0xac>
+        p->s.size -= nunits;
+ 804:	4147073b          	subw	a4,a4,s4
+ 808:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 80a:	02071693          	slli	a3,a4,0x20
+ 80e:	01c6d713          	srli	a4,a3,0x1c
+ 812:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 814:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 818:	00000717          	auipc	a4,0x0
+ 81c:	10a73c23          	sd	a0,280(a4) # 930 <freep>
+      return (void*)(p + 1);
+ 820:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 824:	70e2                	ld	ra,56(sp)
+ 826:	7442                	ld	s0,48(sp)
+ 828:	74a2                	ld	s1,40(sp)
+ 82a:	7902                	ld	s2,32(sp)
+ 82c:	69e2                	ld	s3,24(sp)
+ 82e:	6a42                	ld	s4,16(sp)
+ 830:	6aa2                	ld	s5,8(sp)
+ 832:	6b02                	ld	s6,0(sp)
+ 834:	6121                	addi	sp,sp,64
+ 836:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 838:	6398                	ld	a4,0(a5)
+ 83a:	e118                	sd	a4,0(a0)
+ 83c:	bff1                	j	818 <malloc+0x8c>
+  hp->s.size = nu;
+ 83e:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 842:	0541                	addi	a0,a0,16
+ 844:	00000097          	auipc	ra,0x0
+ 848:	ec6080e7          	jalr	-314(ra) # 70a <free>
+  return freep;
+ 84c:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 850:	d971                	beqz	a0,824 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 852:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 854:	4798                	lw	a4,8(a5)
+ 856:	fa9775e3          	bgeu	a4,s1,800 <malloc+0x74>
+    if(p == freep)
+ 85a:	00093703          	ld	a4,0(s2)
+ 85e:	853e                	mv	a0,a5
+ 860:	fef719e3          	bne	a4,a5,852 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 864:	854e                	mv	a0,s3
+ 866:	00000097          	auipc	ra,0x0
+ 86a:	b30080e7          	jalr	-1232(ra) # 396 <sbrk>
+  if(p == (char*)-1)
+ 86e:	fd5518e3          	bne	a0,s5,83e <malloc+0xb2>
+        return 0;
+ 872:	4501                	li	a0,0
+ 874:	bf45                	j	824 <malloc+0x98>
diff --git a/xv6-user/sysinfo.c b/xv6-user/sysinfo.c
new file mode 100644
index 0000000000000000000000000000000000000000..920f7251ccc816a580130beed2c705e67afa9364
--- /dev/null
+++ b/xv6-user/sysinfo.c
@@ -0,0 +1,13 @@
+#include "kernel/include/fcntl.h"
+#include "kernel/include/types.h"
+#include "kernel/include/sysinfo.h"
+#include "xv6-user/user.h"
+
+int main() {
+  struct sysinfo info;
+  int a = sysinfo(&info);
+  printf("sysinfo ret code: %d\n", a);
+  printf("info.freemem: %d\n", info.freemem);
+  printf("info.nproc: %d\n", info.nproc);
+  return 0;
+}
\ No newline at end of file
diff --git a/xv6-user/sysinfo.d b/xv6-user/sysinfo.d
new file mode 100644
index 0000000000000000000000000000000000000000..e8e1d66c2b6419f6f1aac93554d4e310a274d8e9
--- /dev/null
+++ b/xv6-user/sysinfo.d
@@ -0,0 +1,3 @@
+xv6-user/sysinfo.o: xv6-user/sysinfo.c kernel/include/fcntl.h \
+ kernel/include/types.h kernel/include/sysinfo.h kernel/include/types.h \
+ xv6-user/user.h kernel/include/stat.h
diff --git a/xv6-user/sysinfo.o b/xv6-user/sysinfo.o
new file mode 100644
index 0000000000000000000000000000000000000000..cfaaad3a47c2a224f9e280cf7f0ba8760cd09069
Binary files /dev/null and b/xv6-user/sysinfo.o differ
diff --git a/xv6-user/sysinfo.sym b/xv6-user/sysinfo.sym
new file mode 100644
index 0000000000000000000000000000000000000000..de729b0a286c333166b9b9078ec2c1fb8a384a5f
--- /dev/null
+++ b/xv6-user/sysinfo.sym
@@ -0,0 +1,76 @@
+0000000000000000 .text
+0000000000000878 .rodata
+0000000000000930 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 sysinfo.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+00000000000003fc putc
+000000000000041e printint
+0000000000000918 digits
+0000000000000000 umalloc.c
+0000000000000930 freep
+0000000000000938 base
+0000000000000058 strcpy
+00000000000006d4 printf
+0000000000001129 __global_pointer$
+00000000000003b6 dev
+000000000000025e memmove
+00000000000003da trace
+000000000000013e gets
+0000000000000929 __SDATA_BEGIN__
+000000000000038c getpid
+00000000000002f0 memcpy
+000000000000078c malloc
+00000000000003d0 remove
+000000000000039e sleep
+00000000000003e2 sysinfo
+00000000000003c0 readdir
+0000000000000322 pipe
+00000000000003ea rename
+0000000000000336 write
+0000000000000366 fstat
+00000000000006a6 fprintf
+000000000000034a kill
+0000000000000074 strcat
+00000000000004c8 vprintf
+000000000000037a chdir
+0000000000000352 exec
+000000000000031a wait
+000000000000032c read
+00000000000002b6 memcmp
+0000000000000308 fork
+0000000000000948 __BSS_END__
+0000000000000396 sbrk
+00000000000003ae test_proc
+00000000000003a6 uptime
+0000000000000929 __bss_start
+00000000000000f8 memset
+0000000000000000 main
+00000000000000a2 strcmp
+00000000000003f2 shutdown
+0000000000000384 dup
+00000000000003c8 getcwd
+0000000000000929 __DATA_BEGIN__
+00000000000001b8 stat
+0000000000000929 _edata
+0000000000000948 _end
+0000000000000310 exit
+00000000000001fe atoi
+00000000000000ce strlen
+000000000000035c open
+000000000000011a strchr
+0000000000000370 mkdir
+0000000000000340 close
+000000000000070a free
diff --git a/xv6-user/test.asm b/xv6-user/test.asm
new file mode 100644
index 0000000000000000000000000000000000000000..4f2dd1857aa78791af4fe503b094f22c8be663a8
--- /dev/null
+++ b/xv6-user/test.asm
@@ -0,0 +1,1430 @@
+
+xv6-user/_test:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <main>:
+#include "kernel/include/stat.h"
+#include "kernel/include/sysinfo.h"
+#include "xv6-user/user.h"
+
+int main()
+{
+   0:	1101                	addi	sp,sp,-32
+   2:	ec06                	sd	ra,24(sp)
+   4:	e822                	sd	s0,16(sp)
+   6:	1000                	addi	s0,sp,32
+    struct sysinfo info;
+    if (sysinfo(&info) < 0) {
+   8:	fe040513          	addi	a0,s0,-32
+   c:	00000097          	auipc	ra,0x0
+  10:	3dc080e7          	jalr	988(ra) # 3e8 <sysinfo>
+  14:	02054c63          	bltz	a0,4c <main+0x4c>
+        printf("sysinfo fail!\n");
+    } else {
+        printf("memory left: %d KB\n", info.freemem >> 10);
+  18:	fe043583          	ld	a1,-32(s0)
+  1c:	81a9                	srli	a1,a1,0xa
+  1e:	00001517          	auipc	a0,0x1
+  22:	87250513          	addi	a0,a0,-1934 # 890 <malloc+0xfe>
+  26:	00000097          	auipc	ra,0x0
+  2a:	6b4080e7          	jalr	1716(ra) # 6da <printf>
+        printf("process amount: %d\n", info.nproc);
+  2e:	fe843583          	ld	a1,-24(s0)
+  32:	00001517          	auipc	a0,0x1
+  36:	87650513          	addi	a0,a0,-1930 # 8a8 <malloc+0x116>
+  3a:	00000097          	auipc	ra,0x0
+  3e:	6a0080e7          	jalr	1696(ra) # 6da <printf>
+    }
+    exit(0);
+  42:	4501                	li	a0,0
+  44:	00000097          	auipc	ra,0x0
+  48:	2d2080e7          	jalr	722(ra) # 316 <exit>
+        printf("sysinfo fail!\n");
+  4c:	00001517          	auipc	a0,0x1
+  50:	83450513          	addi	a0,a0,-1996 # 880 <malloc+0xee>
+  54:	00000097          	auipc	ra,0x0
+  58:	686080e7          	jalr	1670(ra) # 6da <printf>
+  5c:	b7dd                	j	42 <main+0x42>
+
+000000000000005e <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+  5e:	1141                	addi	sp,sp,-16
+  60:	e422                	sd	s0,8(sp)
+  62:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+  64:	87aa                	mv	a5,a0
+  66:	0585                	addi	a1,a1,1
+  68:	0785                	addi	a5,a5,1
+  6a:	fff5c703          	lbu	a4,-1(a1)
+  6e:	fee78fa3          	sb	a4,-1(a5)
+  72:	fb75                	bnez	a4,66 <strcpy+0x8>
+    ;
+  return os;
+}
+  74:	6422                	ld	s0,8(sp)
+  76:	0141                	addi	sp,sp,16
+  78:	8082                	ret
+
+000000000000007a <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+  7a:	1141                	addi	sp,sp,-16
+  7c:	e422                	sd	s0,8(sp)
+  7e:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+  80:	00054783          	lbu	a5,0(a0)
+  84:	c385                	beqz	a5,a4 <strcat+0x2a>
+  86:	87aa                	mv	a5,a0
+    s++;
+  88:	0785                	addi	a5,a5,1
+  while(*s)
+  8a:	0007c703          	lbu	a4,0(a5)
+  8e:	ff6d                	bnez	a4,88 <strcat+0xe>
+  while((*s++ = *t++))
+  90:	0585                	addi	a1,a1,1
+  92:	0785                	addi	a5,a5,1
+  94:	fff5c703          	lbu	a4,-1(a1)
+  98:	fee78fa3          	sb	a4,-1(a5)
+  9c:	fb75                	bnez	a4,90 <strcat+0x16>
+    ;
+  return os;
+}
+  9e:	6422                	ld	s0,8(sp)
+  a0:	0141                	addi	sp,sp,16
+  a2:	8082                	ret
+  while(*s)
+  a4:	87aa                	mv	a5,a0
+  a6:	b7ed                	j	90 <strcat+0x16>
+
+00000000000000a8 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+  a8:	1141                	addi	sp,sp,-16
+  aa:	e422                	sd	s0,8(sp)
+  ac:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+  ae:	00054783          	lbu	a5,0(a0)
+  b2:	cb91                	beqz	a5,c6 <strcmp+0x1e>
+  b4:	0005c703          	lbu	a4,0(a1)
+  b8:	00f71763          	bne	a4,a5,c6 <strcmp+0x1e>
+    p++, q++;
+  bc:	0505                	addi	a0,a0,1
+  be:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+  c0:	00054783          	lbu	a5,0(a0)
+  c4:	fbe5                	bnez	a5,b4 <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+  c6:	0005c503          	lbu	a0,0(a1)
+}
+  ca:	40a7853b          	subw	a0,a5,a0
+  ce:	6422                	ld	s0,8(sp)
+  d0:	0141                	addi	sp,sp,16
+  d2:	8082                	ret
+
+00000000000000d4 <strlen>:
+
+uint
+strlen(const char *s)
+{
+  d4:	1141                	addi	sp,sp,-16
+  d6:	e422                	sd	s0,8(sp)
+  d8:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+  da:	00054783          	lbu	a5,0(a0)
+  de:	cf91                	beqz	a5,fa <strlen+0x26>
+  e0:	0505                	addi	a0,a0,1
+  e2:	87aa                	mv	a5,a0
+  e4:	4685                	li	a3,1
+  e6:	9e89                	subw	a3,a3,a0
+  e8:	00f6853b          	addw	a0,a3,a5
+  ec:	0785                	addi	a5,a5,1
+  ee:	fff7c703          	lbu	a4,-1(a5)
+  f2:	fb7d                	bnez	a4,e8 <strlen+0x14>
+    ;
+  return n;
+}
+  f4:	6422                	ld	s0,8(sp)
+  f6:	0141                	addi	sp,sp,16
+  f8:	8082                	ret
+  for(n = 0; s[n]; n++)
+  fa:	4501                	li	a0,0
+  fc:	bfe5                	j	f4 <strlen+0x20>
+
+00000000000000fe <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+  fe:	1141                	addi	sp,sp,-16
+ 100:	e422                	sd	s0,8(sp)
+ 102:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 104:	ca19                	beqz	a2,11a <memset+0x1c>
+ 106:	87aa                	mv	a5,a0
+ 108:	1602                	slli	a2,a2,0x20
+ 10a:	9201                	srli	a2,a2,0x20
+ 10c:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 110:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 114:	0785                	addi	a5,a5,1
+ 116:	fee79de3          	bne	a5,a4,110 <memset+0x12>
+  }
+  return dst;
+}
+ 11a:	6422                	ld	s0,8(sp)
+ 11c:	0141                	addi	sp,sp,16
+ 11e:	8082                	ret
+
+0000000000000120 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 120:	1141                	addi	sp,sp,-16
+ 122:	e422                	sd	s0,8(sp)
+ 124:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 126:	00054783          	lbu	a5,0(a0)
+ 12a:	cb99                	beqz	a5,140 <strchr+0x20>
+    if(*s == c)
+ 12c:	00f58763          	beq	a1,a5,13a <strchr+0x1a>
+  for(; *s; s++)
+ 130:	0505                	addi	a0,a0,1
+ 132:	00054783          	lbu	a5,0(a0)
+ 136:	fbfd                	bnez	a5,12c <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 138:	4501                	li	a0,0
+}
+ 13a:	6422                	ld	s0,8(sp)
+ 13c:	0141                	addi	sp,sp,16
+ 13e:	8082                	ret
+  return 0;
+ 140:	4501                	li	a0,0
+ 142:	bfe5                	j	13a <strchr+0x1a>
+
+0000000000000144 <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 144:	711d                	addi	sp,sp,-96
+ 146:	ec86                	sd	ra,88(sp)
+ 148:	e8a2                	sd	s0,80(sp)
+ 14a:	e4a6                	sd	s1,72(sp)
+ 14c:	e0ca                	sd	s2,64(sp)
+ 14e:	fc4e                	sd	s3,56(sp)
+ 150:	f852                	sd	s4,48(sp)
+ 152:	f456                	sd	s5,40(sp)
+ 154:	f05a                	sd	s6,32(sp)
+ 156:	ec5e                	sd	s7,24(sp)
+ 158:	e862                	sd	s8,16(sp)
+ 15a:	1080                	addi	s0,sp,96
+ 15c:	8baa                	mv	s7,a0
+ 15e:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 160:	892a                	mv	s2,a0
+ 162:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 164:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 168:	4b29                	li	s6,10
+ 16a:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 16c:	89a6                	mv	s3,s1
+ 16e:	2485                	addiw	s1,s1,1
+ 170:	0344d763          	bge	s1,s4,19e <gets+0x5a>
+    cc = read(0, &c, 1);
+ 174:	4605                	li	a2,1
+ 176:	85d6                	mv	a1,s5
+ 178:	4501                	li	a0,0
+ 17a:	00000097          	auipc	ra,0x0
+ 17e:	1b8080e7          	jalr	440(ra) # 332 <read>
+    if(cc < 1)
+ 182:	00a05e63          	blez	a0,19e <gets+0x5a>
+    buf[i++] = c;
+ 186:	faf44783          	lbu	a5,-81(s0)
+ 18a:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 18e:	01678763          	beq	a5,s6,19c <gets+0x58>
+ 192:	0905                	addi	s2,s2,1
+ 194:	fd879ce3          	bne	a5,s8,16c <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 198:	89a6                	mv	s3,s1
+ 19a:	a011                	j	19e <gets+0x5a>
+ 19c:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 19e:	99de                	add	s3,s3,s7
+ 1a0:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 1a4:	855e                	mv	a0,s7
+ 1a6:	60e6                	ld	ra,88(sp)
+ 1a8:	6446                	ld	s0,80(sp)
+ 1aa:	64a6                	ld	s1,72(sp)
+ 1ac:	6906                	ld	s2,64(sp)
+ 1ae:	79e2                	ld	s3,56(sp)
+ 1b0:	7a42                	ld	s4,48(sp)
+ 1b2:	7aa2                	ld	s5,40(sp)
+ 1b4:	7b02                	ld	s6,32(sp)
+ 1b6:	6be2                	ld	s7,24(sp)
+ 1b8:	6c42                	ld	s8,16(sp)
+ 1ba:	6125                	addi	sp,sp,96
+ 1bc:	8082                	ret
+
+00000000000001be <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 1be:	1101                	addi	sp,sp,-32
+ 1c0:	ec06                	sd	ra,24(sp)
+ 1c2:	e822                	sd	s0,16(sp)
+ 1c4:	e426                	sd	s1,8(sp)
+ 1c6:	e04a                	sd	s2,0(sp)
+ 1c8:	1000                	addi	s0,sp,32
+ 1ca:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 1cc:	4581                	li	a1,0
+ 1ce:	00000097          	auipc	ra,0x0
+ 1d2:	194080e7          	jalr	404(ra) # 362 <open>
+  if(fd < 0)
+ 1d6:	02054563          	bltz	a0,200 <stat+0x42>
+ 1da:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 1dc:	85ca                	mv	a1,s2
+ 1de:	00000097          	auipc	ra,0x0
+ 1e2:	18e080e7          	jalr	398(ra) # 36c <fstat>
+ 1e6:	892a                	mv	s2,a0
+  close(fd);
+ 1e8:	8526                	mv	a0,s1
+ 1ea:	00000097          	auipc	ra,0x0
+ 1ee:	15c080e7          	jalr	348(ra) # 346 <close>
+  return r;
+}
+ 1f2:	854a                	mv	a0,s2
+ 1f4:	60e2                	ld	ra,24(sp)
+ 1f6:	6442                	ld	s0,16(sp)
+ 1f8:	64a2                	ld	s1,8(sp)
+ 1fa:	6902                	ld	s2,0(sp)
+ 1fc:	6105                	addi	sp,sp,32
+ 1fe:	8082                	ret
+    return -1;
+ 200:	597d                	li	s2,-1
+ 202:	bfc5                	j	1f2 <stat+0x34>
+
+0000000000000204 <atoi>:
+
+int
+atoi(const char *s)
+{
+ 204:	1141                	addi	sp,sp,-16
+ 206:	e422                	sd	s0,8(sp)
+ 208:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 20a:	00054703          	lbu	a4,0(a0)
+ 20e:	02d00793          	li	a5,45
+  int neg = 1;
+ 212:	4585                	li	a1,1
+  if (*s == '-') {
+ 214:	04f70363          	beq	a4,a5,25a <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 218:	00054703          	lbu	a4,0(a0)
+ 21c:	fd07079b          	addiw	a5,a4,-48
+ 220:	0ff7f793          	zext.b	a5,a5
+ 224:	46a5                	li	a3,9
+ 226:	02f6ed63          	bltu	a3,a5,260 <atoi+0x5c>
+  n = 0;
+ 22a:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 22c:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 22e:	0505                	addi	a0,a0,1
+ 230:	0026979b          	slliw	a5,a3,0x2
+ 234:	9fb5                	addw	a5,a5,a3
+ 236:	0017979b          	slliw	a5,a5,0x1
+ 23a:	9fb9                	addw	a5,a5,a4
+ 23c:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 240:	00054703          	lbu	a4,0(a0)
+ 244:	fd07079b          	addiw	a5,a4,-48
+ 248:	0ff7f793          	zext.b	a5,a5
+ 24c:	fef671e3          	bgeu	a2,a5,22e <atoi+0x2a>
+  return n * neg;
+}
+ 250:	02d5853b          	mulw	a0,a1,a3
+ 254:	6422                	ld	s0,8(sp)
+ 256:	0141                	addi	sp,sp,16
+ 258:	8082                	ret
+    s++;
+ 25a:	0505                	addi	a0,a0,1
+    neg = -1;
+ 25c:	55fd                	li	a1,-1
+ 25e:	bf6d                	j	218 <atoi+0x14>
+  n = 0;
+ 260:	4681                	li	a3,0
+ 262:	b7fd                	j	250 <atoi+0x4c>
+
+0000000000000264 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 264:	1141                	addi	sp,sp,-16
+ 266:	e422                	sd	s0,8(sp)
+ 268:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 26a:	02b57463          	bgeu	a0,a1,292 <memmove+0x2e>
+    while(n-- > 0)
+ 26e:	00c05f63          	blez	a2,28c <memmove+0x28>
+ 272:	1602                	slli	a2,a2,0x20
+ 274:	9201                	srli	a2,a2,0x20
+ 276:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 27a:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 27c:	0585                	addi	a1,a1,1
+ 27e:	0705                	addi	a4,a4,1
+ 280:	fff5c683          	lbu	a3,-1(a1)
+ 284:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 288:	fee79ae3          	bne	a5,a4,27c <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 28c:	6422                	ld	s0,8(sp)
+ 28e:	0141                	addi	sp,sp,16
+ 290:	8082                	ret
+    dst += n;
+ 292:	00c50733          	add	a4,a0,a2
+    src += n;
+ 296:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 298:	fec05ae3          	blez	a2,28c <memmove+0x28>
+ 29c:	fff6079b          	addiw	a5,a2,-1
+ 2a0:	1782                	slli	a5,a5,0x20
+ 2a2:	9381                	srli	a5,a5,0x20
+ 2a4:	fff7c793          	not	a5,a5
+ 2a8:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 2aa:	15fd                	addi	a1,a1,-1
+ 2ac:	177d                	addi	a4,a4,-1
+ 2ae:	0005c683          	lbu	a3,0(a1)
+ 2b2:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 2b6:	fee79ae3          	bne	a5,a4,2aa <memmove+0x46>
+ 2ba:	bfc9                	j	28c <memmove+0x28>
+
+00000000000002bc <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 2bc:	1141                	addi	sp,sp,-16
+ 2be:	e422                	sd	s0,8(sp)
+ 2c0:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 2c2:	ca05                	beqz	a2,2f2 <memcmp+0x36>
+ 2c4:	fff6069b          	addiw	a3,a2,-1
+ 2c8:	1682                	slli	a3,a3,0x20
+ 2ca:	9281                	srli	a3,a3,0x20
+ 2cc:	0685                	addi	a3,a3,1
+ 2ce:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 2d0:	00054783          	lbu	a5,0(a0)
+ 2d4:	0005c703          	lbu	a4,0(a1)
+ 2d8:	00e79863          	bne	a5,a4,2e8 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 2dc:	0505                	addi	a0,a0,1
+    p2++;
+ 2de:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 2e0:	fed518e3          	bne	a0,a3,2d0 <memcmp+0x14>
+  }
+  return 0;
+ 2e4:	4501                	li	a0,0
+ 2e6:	a019                	j	2ec <memcmp+0x30>
+      return *p1 - *p2;
+ 2e8:	40e7853b          	subw	a0,a5,a4
+}
+ 2ec:	6422                	ld	s0,8(sp)
+ 2ee:	0141                	addi	sp,sp,16
+ 2f0:	8082                	ret
+  return 0;
+ 2f2:	4501                	li	a0,0
+ 2f4:	bfe5                	j	2ec <memcmp+0x30>
+
+00000000000002f6 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 2f6:	1141                	addi	sp,sp,-16
+ 2f8:	e406                	sd	ra,8(sp)
+ 2fa:	e022                	sd	s0,0(sp)
+ 2fc:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 2fe:	00000097          	auipc	ra,0x0
+ 302:	f66080e7          	jalr	-154(ra) # 264 <memmove>
+}
+ 306:	60a2                	ld	ra,8(sp)
+ 308:	6402                	ld	s0,0(sp)
+ 30a:	0141                	addi	sp,sp,16
+ 30c:	8082                	ret
+
+000000000000030e <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 30e:	4885                	li	a7,1
+ ecall
+ 310:	00000073          	ecall
+ ret
+ 314:	8082                	ret
+
+0000000000000316 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 316:	05d00893          	li	a7,93
+ ecall
+ 31a:	00000073          	ecall
+ ret
+ 31e:	8082                	ret
+
+0000000000000320 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 320:	488d                	li	a7,3
+ ecall
+ 322:	00000073          	ecall
+ ret
+ 326:	8082                	ret
+
+0000000000000328 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 328:	03b00893          	li	a7,59
+ ecall
+ 32c:	00000073          	ecall
+ ret
+ 330:	8082                	ret
+
+0000000000000332 <read>:
+.global read
+read:
+ li a7, SYS_read
+ 332:	03f00893          	li	a7,63
+ ecall
+ 336:	00000073          	ecall
+ ret
+ 33a:	8082                	ret
+
+000000000000033c <write>:
+.global write
+write:
+ li a7, SYS_write
+ 33c:	04000893          	li	a7,64
+ ecall
+ 340:	00000073          	ecall
+ ret
+ 344:	8082                	ret
+
+0000000000000346 <close>:
+.global close
+close:
+ li a7, SYS_close
+ 346:	03900893          	li	a7,57
+ ecall
+ 34a:	00000073          	ecall
+ ret
+ 34e:	8082                	ret
+
+0000000000000350 <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 350:	4899                	li	a7,6
+ ecall
+ 352:	00000073          	ecall
+ ret
+ 356:	8082                	ret
+
+0000000000000358 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 358:	0dd00893          	li	a7,221
+ ecall
+ 35c:	00000073          	ecall
+ ret
+ 360:	8082                	ret
+
+0000000000000362 <open>:
+.global open
+open:
+ li a7, SYS_open
+ 362:	03800893          	li	a7,56
+ ecall
+ 366:	00000073          	ecall
+ ret
+ 36a:	8082                	ret
+
+000000000000036c <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 36c:	05000893          	li	a7,80
+ ecall
+ 370:	00000073          	ecall
+ ret
+ 374:	8082                	ret
+
+0000000000000376 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 376:	02200893          	li	a7,34
+ ecall
+ 37a:	00000073          	ecall
+ ret
+ 37e:	8082                	ret
+
+0000000000000380 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 380:	03100893          	li	a7,49
+ ecall
+ 384:	00000073          	ecall
+ ret
+ 388:	8082                	ret
+
+000000000000038a <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 38a:	48dd                	li	a7,23
+ ecall
+ 38c:	00000073          	ecall
+ ret
+ 390:	8082                	ret
+
+0000000000000392 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 392:	0ac00893          	li	a7,172
+ ecall
+ 396:	00000073          	ecall
+ ret
+ 39a:	8082                	ret
+
+000000000000039c <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 39c:	48b1                	li	a7,12
+ ecall
+ 39e:	00000073          	ecall
+ ret
+ 3a2:	8082                	ret
+
+00000000000003a4 <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 3a4:	48b5                	li	a7,13
+ ecall
+ 3a6:	00000073          	ecall
+ ret
+ 3aa:	8082                	ret
+
+00000000000003ac <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 3ac:	48b9                	li	a7,14
+ ecall
+ 3ae:	00000073          	ecall
+ ret
+ 3b2:	8082                	ret
+
+00000000000003b4 <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 3b4:	48d9                	li	a7,22
+ ecall
+ 3b6:	00000073          	ecall
+ ret
+ 3ba:	8082                	ret
+
+00000000000003bc <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 3bc:	03200893          	li	a7,50
+ ecall
+ 3c0:	00000073          	ecall
+ ret
+ 3c4:	8082                	ret
+
+00000000000003c6 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 3c6:	48ed                	li	a7,27
+ ecall
+ 3c8:	00000073          	ecall
+ ret
+ 3cc:	8082                	ret
+
+00000000000003ce <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 3ce:	48c5                	li	a7,17
+ ecall
+ 3d0:	00000073          	ecall
+ ret
+ 3d4:	8082                	ret
+
+00000000000003d6 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 3d6:	07500893          	li	a7,117
+ ecall
+ 3da:	00000073          	ecall
+ ret
+ 3de:	8082                	ret
+
+00000000000003e0 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 3e0:	48c9                	li	a7,18
+ ecall
+ 3e2:	00000073          	ecall
+ ret
+ 3e6:	8082                	ret
+
+00000000000003e8 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 3e8:	48cd                	li	a7,19
+ ecall
+ 3ea:	00000073          	ecall
+ ret
+ 3ee:	8082                	ret
+
+00000000000003f0 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 3f0:	48e9                	li	a7,26
+ ecall
+ 3f2:	00000073          	ecall
+ ret
+ 3f6:	8082                	ret
+
+00000000000003f8 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 3f8:	0d200893          	li	a7,210
+ ecall
+ 3fc:	00000073          	ecall
+ ret
+ 400:	8082                	ret
+
+0000000000000402 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 402:	1101                	addi	sp,sp,-32
+ 404:	ec06                	sd	ra,24(sp)
+ 406:	e822                	sd	s0,16(sp)
+ 408:	1000                	addi	s0,sp,32
+ 40a:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 40e:	4605                	li	a2,1
+ 410:	fef40593          	addi	a1,s0,-17
+ 414:	00000097          	auipc	ra,0x0
+ 418:	f28080e7          	jalr	-216(ra) # 33c <write>
+}
+ 41c:	60e2                	ld	ra,24(sp)
+ 41e:	6442                	ld	s0,16(sp)
+ 420:	6105                	addi	sp,sp,32
+ 422:	8082                	ret
+
+0000000000000424 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 424:	7139                	addi	sp,sp,-64
+ 426:	fc06                	sd	ra,56(sp)
+ 428:	f822                	sd	s0,48(sp)
+ 42a:	f426                	sd	s1,40(sp)
+ 42c:	f04a                	sd	s2,32(sp)
+ 42e:	ec4e                	sd	s3,24(sp)
+ 430:	0080                	addi	s0,sp,64
+ 432:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 434:	c299                	beqz	a3,43a <printint+0x16>
+ 436:	0805c863          	bltz	a1,4c6 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 43a:	2581                	sext.w	a1,a1
+  neg = 0;
+ 43c:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 43e:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 442:	86ce                	mv	a3,s3
+  i = 0;
+ 444:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 446:	2601                	sext.w	a2,a2
+ 448:	00000517          	auipc	a0,0x0
+ 44c:	4d850513          	addi	a0,a0,1240 # 920 <digits>
+ 450:	883a                	mv	a6,a4
+ 452:	2705                	addiw	a4,a4,1
+ 454:	02c5f7bb          	remuw	a5,a1,a2
+ 458:	1782                	slli	a5,a5,0x20
+ 45a:	9381                	srli	a5,a5,0x20
+ 45c:	97aa                	add	a5,a5,a0
+ 45e:	0007c783          	lbu	a5,0(a5)
+ 462:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 466:	0005879b          	sext.w	a5,a1
+ 46a:	02c5d5bb          	divuw	a1,a1,a2
+ 46e:	0685                	addi	a3,a3,1
+ 470:	fec7f0e3          	bgeu	a5,a2,450 <printint+0x2c>
+  if(neg)
+ 474:	00088c63          	beqz	a7,48c <printint+0x68>
+    buf[i++] = '-';
+ 478:	fd070793          	addi	a5,a4,-48
+ 47c:	00878733          	add	a4,a5,s0
+ 480:	02d00793          	li	a5,45
+ 484:	fef70823          	sb	a5,-16(a4)
+ 488:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 48c:	02e05663          	blez	a4,4b8 <printint+0x94>
+ 490:	fc040913          	addi	s2,s0,-64
+ 494:	993a                	add	s2,s2,a4
+ 496:	19fd                	addi	s3,s3,-1
+ 498:	99ba                	add	s3,s3,a4
+ 49a:	377d                	addiw	a4,a4,-1
+ 49c:	1702                	slli	a4,a4,0x20
+ 49e:	9301                	srli	a4,a4,0x20
+ 4a0:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 4a4:	fff94583          	lbu	a1,-1(s2)
+ 4a8:	8526                	mv	a0,s1
+ 4aa:	00000097          	auipc	ra,0x0
+ 4ae:	f58080e7          	jalr	-168(ra) # 402 <putc>
+  while(--i >= 0)
+ 4b2:	197d                	addi	s2,s2,-1
+ 4b4:	ff3918e3          	bne	s2,s3,4a4 <printint+0x80>
+}
+ 4b8:	70e2                	ld	ra,56(sp)
+ 4ba:	7442                	ld	s0,48(sp)
+ 4bc:	74a2                	ld	s1,40(sp)
+ 4be:	7902                	ld	s2,32(sp)
+ 4c0:	69e2                	ld	s3,24(sp)
+ 4c2:	6121                	addi	sp,sp,64
+ 4c4:	8082                	ret
+    x = -xx;
+ 4c6:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 4ca:	4885                	li	a7,1
+    x = -xx;
+ 4cc:	bf8d                	j	43e <printint+0x1a>
+
+00000000000004ce <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 4ce:	7119                	addi	sp,sp,-128
+ 4d0:	fc86                	sd	ra,120(sp)
+ 4d2:	f8a2                	sd	s0,112(sp)
+ 4d4:	f4a6                	sd	s1,104(sp)
+ 4d6:	f0ca                	sd	s2,96(sp)
+ 4d8:	ecce                	sd	s3,88(sp)
+ 4da:	e8d2                	sd	s4,80(sp)
+ 4dc:	e4d6                	sd	s5,72(sp)
+ 4de:	e0da                	sd	s6,64(sp)
+ 4e0:	fc5e                	sd	s7,56(sp)
+ 4e2:	f862                	sd	s8,48(sp)
+ 4e4:	f466                	sd	s9,40(sp)
+ 4e6:	f06a                	sd	s10,32(sp)
+ 4e8:	ec6e                	sd	s11,24(sp)
+ 4ea:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 4ec:	0005c903          	lbu	s2,0(a1)
+ 4f0:	18090f63          	beqz	s2,68e <vprintf+0x1c0>
+ 4f4:	8aaa                	mv	s5,a0
+ 4f6:	8b32                	mv	s6,a2
+ 4f8:	00158493          	addi	s1,a1,1
+  state = 0;
+ 4fc:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 4fe:	02500a13          	li	s4,37
+ 502:	4c55                	li	s8,21
+ 504:	00000c97          	auipc	s9,0x0
+ 508:	3c4c8c93          	addi	s9,s9,964 # 8c8 <malloc+0x136>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 50c:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 510:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 512:	00000b97          	auipc	s7,0x0
+ 516:	40eb8b93          	addi	s7,s7,1038 # 920 <digits>
+ 51a:	a839                	j	538 <vprintf+0x6a>
+        putc(fd, c);
+ 51c:	85ca                	mv	a1,s2
+ 51e:	8556                	mv	a0,s5
+ 520:	00000097          	auipc	ra,0x0
+ 524:	ee2080e7          	jalr	-286(ra) # 402 <putc>
+ 528:	a019                	j	52e <vprintf+0x60>
+    } else if(state == '%'){
+ 52a:	01498d63          	beq	s3,s4,544 <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 52e:	0485                	addi	s1,s1,1
+ 530:	fff4c903          	lbu	s2,-1(s1)
+ 534:	14090d63          	beqz	s2,68e <vprintf+0x1c0>
+    if(state == 0){
+ 538:	fe0999e3          	bnez	s3,52a <vprintf+0x5c>
+      if(c == '%'){
+ 53c:	ff4910e3          	bne	s2,s4,51c <vprintf+0x4e>
+        state = '%';
+ 540:	89d2                	mv	s3,s4
+ 542:	b7f5                	j	52e <vprintf+0x60>
+      if(c == 'd'){
+ 544:	11490c63          	beq	s2,s4,65c <vprintf+0x18e>
+ 548:	f9d9079b          	addiw	a5,s2,-99
+ 54c:	0ff7f793          	zext.b	a5,a5
+ 550:	10fc6e63          	bltu	s8,a5,66c <vprintf+0x19e>
+ 554:	f9d9079b          	addiw	a5,s2,-99
+ 558:	0ff7f713          	zext.b	a4,a5
+ 55c:	10ec6863          	bltu	s8,a4,66c <vprintf+0x19e>
+ 560:	00271793          	slli	a5,a4,0x2
+ 564:	97e6                	add	a5,a5,s9
+ 566:	439c                	lw	a5,0(a5)
+ 568:	97e6                	add	a5,a5,s9
+ 56a:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 56c:	008b0913          	addi	s2,s6,8
+ 570:	4685                	li	a3,1
+ 572:	4629                	li	a2,10
+ 574:	000b2583          	lw	a1,0(s6)
+ 578:	8556                	mv	a0,s5
+ 57a:	00000097          	auipc	ra,0x0
+ 57e:	eaa080e7          	jalr	-342(ra) # 424 <printint>
+ 582:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 584:	4981                	li	s3,0
+ 586:	b765                	j	52e <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 588:	008b0913          	addi	s2,s6,8
+ 58c:	4681                	li	a3,0
+ 58e:	4629                	li	a2,10
+ 590:	000b2583          	lw	a1,0(s6)
+ 594:	8556                	mv	a0,s5
+ 596:	00000097          	auipc	ra,0x0
+ 59a:	e8e080e7          	jalr	-370(ra) # 424 <printint>
+ 59e:	8b4a                	mv	s6,s2
+      state = 0;
+ 5a0:	4981                	li	s3,0
+ 5a2:	b771                	j	52e <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 5a4:	008b0913          	addi	s2,s6,8
+ 5a8:	4681                	li	a3,0
+ 5aa:	866a                	mv	a2,s10
+ 5ac:	000b2583          	lw	a1,0(s6)
+ 5b0:	8556                	mv	a0,s5
+ 5b2:	00000097          	auipc	ra,0x0
+ 5b6:	e72080e7          	jalr	-398(ra) # 424 <printint>
+ 5ba:	8b4a                	mv	s6,s2
+      state = 0;
+ 5bc:	4981                	li	s3,0
+ 5be:	bf85                	j	52e <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 5c0:	008b0793          	addi	a5,s6,8
+ 5c4:	f8f43423          	sd	a5,-120(s0)
+ 5c8:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 5cc:	03000593          	li	a1,48
+ 5d0:	8556                	mv	a0,s5
+ 5d2:	00000097          	auipc	ra,0x0
+ 5d6:	e30080e7          	jalr	-464(ra) # 402 <putc>
+  putc(fd, 'x');
+ 5da:	07800593          	li	a1,120
+ 5de:	8556                	mv	a0,s5
+ 5e0:	00000097          	auipc	ra,0x0
+ 5e4:	e22080e7          	jalr	-478(ra) # 402 <putc>
+ 5e8:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 5ea:	03c9d793          	srli	a5,s3,0x3c
+ 5ee:	97de                	add	a5,a5,s7
+ 5f0:	0007c583          	lbu	a1,0(a5)
+ 5f4:	8556                	mv	a0,s5
+ 5f6:	00000097          	auipc	ra,0x0
+ 5fa:	e0c080e7          	jalr	-500(ra) # 402 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 5fe:	0992                	slli	s3,s3,0x4
+ 600:	397d                	addiw	s2,s2,-1
+ 602:	fe0914e3          	bnez	s2,5ea <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 606:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 60a:	4981                	li	s3,0
+ 60c:	b70d                	j	52e <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 60e:	008b0913          	addi	s2,s6,8
+ 612:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 616:	02098163          	beqz	s3,638 <vprintf+0x16a>
+        while(*s != 0){
+ 61a:	0009c583          	lbu	a1,0(s3)
+ 61e:	c5ad                	beqz	a1,688 <vprintf+0x1ba>
+          putc(fd, *s);
+ 620:	8556                	mv	a0,s5
+ 622:	00000097          	auipc	ra,0x0
+ 626:	de0080e7          	jalr	-544(ra) # 402 <putc>
+          s++;
+ 62a:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 62c:	0009c583          	lbu	a1,0(s3)
+ 630:	f9e5                	bnez	a1,620 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 632:	8b4a                	mv	s6,s2
+      state = 0;
+ 634:	4981                	li	s3,0
+ 636:	bde5                	j	52e <vprintf+0x60>
+          s = "(null)";
+ 638:	00000997          	auipc	s3,0x0
+ 63c:	28898993          	addi	s3,s3,648 # 8c0 <malloc+0x12e>
+        while(*s != 0){
+ 640:	85ee                	mv	a1,s11
+ 642:	bff9                	j	620 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 644:	008b0913          	addi	s2,s6,8
+ 648:	000b4583          	lbu	a1,0(s6)
+ 64c:	8556                	mv	a0,s5
+ 64e:	00000097          	auipc	ra,0x0
+ 652:	db4080e7          	jalr	-588(ra) # 402 <putc>
+ 656:	8b4a                	mv	s6,s2
+      state = 0;
+ 658:	4981                	li	s3,0
+ 65a:	bdd1                	j	52e <vprintf+0x60>
+        putc(fd, c);
+ 65c:	85d2                	mv	a1,s4
+ 65e:	8556                	mv	a0,s5
+ 660:	00000097          	auipc	ra,0x0
+ 664:	da2080e7          	jalr	-606(ra) # 402 <putc>
+      state = 0;
+ 668:	4981                	li	s3,0
+ 66a:	b5d1                	j	52e <vprintf+0x60>
+        putc(fd, '%');
+ 66c:	85d2                	mv	a1,s4
+ 66e:	8556                	mv	a0,s5
+ 670:	00000097          	auipc	ra,0x0
+ 674:	d92080e7          	jalr	-622(ra) # 402 <putc>
+        putc(fd, c);
+ 678:	85ca                	mv	a1,s2
+ 67a:	8556                	mv	a0,s5
+ 67c:	00000097          	auipc	ra,0x0
+ 680:	d86080e7          	jalr	-634(ra) # 402 <putc>
+      state = 0;
+ 684:	4981                	li	s3,0
+ 686:	b565                	j	52e <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 688:	8b4a                	mv	s6,s2
+      state = 0;
+ 68a:	4981                	li	s3,0
+ 68c:	b54d                	j	52e <vprintf+0x60>
+    }
+  }
+}
+ 68e:	70e6                	ld	ra,120(sp)
+ 690:	7446                	ld	s0,112(sp)
+ 692:	74a6                	ld	s1,104(sp)
+ 694:	7906                	ld	s2,96(sp)
+ 696:	69e6                	ld	s3,88(sp)
+ 698:	6a46                	ld	s4,80(sp)
+ 69a:	6aa6                	ld	s5,72(sp)
+ 69c:	6b06                	ld	s6,64(sp)
+ 69e:	7be2                	ld	s7,56(sp)
+ 6a0:	7c42                	ld	s8,48(sp)
+ 6a2:	7ca2                	ld	s9,40(sp)
+ 6a4:	7d02                	ld	s10,32(sp)
+ 6a6:	6de2                	ld	s11,24(sp)
+ 6a8:	6109                	addi	sp,sp,128
+ 6aa:	8082                	ret
+
+00000000000006ac <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 6ac:	715d                	addi	sp,sp,-80
+ 6ae:	ec06                	sd	ra,24(sp)
+ 6b0:	e822                	sd	s0,16(sp)
+ 6b2:	1000                	addi	s0,sp,32
+ 6b4:	e010                	sd	a2,0(s0)
+ 6b6:	e414                	sd	a3,8(s0)
+ 6b8:	e818                	sd	a4,16(s0)
+ 6ba:	ec1c                	sd	a5,24(s0)
+ 6bc:	03043023          	sd	a6,32(s0)
+ 6c0:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6c4:	8622                	mv	a2,s0
+ 6c6:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 6ca:	00000097          	auipc	ra,0x0
+ 6ce:	e04080e7          	jalr	-508(ra) # 4ce <vprintf>
+}
+ 6d2:	60e2                	ld	ra,24(sp)
+ 6d4:	6442                	ld	s0,16(sp)
+ 6d6:	6161                	addi	sp,sp,80
+ 6d8:	8082                	ret
+
+00000000000006da <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 6da:	711d                	addi	sp,sp,-96
+ 6dc:	ec06                	sd	ra,24(sp)
+ 6de:	e822                	sd	s0,16(sp)
+ 6e0:	1000                	addi	s0,sp,32
+ 6e2:	e40c                	sd	a1,8(s0)
+ 6e4:	e810                	sd	a2,16(s0)
+ 6e6:	ec14                	sd	a3,24(s0)
+ 6e8:	f018                	sd	a4,32(s0)
+ 6ea:	f41c                	sd	a5,40(s0)
+ 6ec:	03043823          	sd	a6,48(s0)
+ 6f0:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 6f4:	00840613          	addi	a2,s0,8
+ 6f8:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 6fc:	85aa                	mv	a1,a0
+ 6fe:	4505                	li	a0,1
+ 700:	00000097          	auipc	ra,0x0
+ 704:	dce080e7          	jalr	-562(ra) # 4ce <vprintf>
+}
+ 708:	60e2                	ld	ra,24(sp)
+ 70a:	6442                	ld	s0,16(sp)
+ 70c:	6125                	addi	sp,sp,96
+ 70e:	8082                	ret
+
+0000000000000710 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 710:	1141                	addi	sp,sp,-16
+ 712:	e422                	sd	s0,8(sp)
+ 714:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 716:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 71a:	00000797          	auipc	a5,0x0
+ 71e:	21e7b783          	ld	a5,542(a5) # 938 <freep>
+ 722:	a02d                	j	74c <free+0x3c>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+      break;
+  if(bp + bp->s.size == p->s.ptr){
+    bp->s.size += p->s.ptr->s.size;
+ 724:	4618                	lw	a4,8(a2)
+ 726:	9f2d                	addw	a4,a4,a1
+ 728:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 72c:	6398                	ld	a4,0(a5)
+ 72e:	6310                	ld	a2,0(a4)
+ 730:	a83d                	j	76e <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 732:	ff852703          	lw	a4,-8(a0)
+ 736:	9f31                	addw	a4,a4,a2
+ 738:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 73a:	ff053683          	ld	a3,-16(a0)
+ 73e:	a091                	j	782 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 740:	6398                	ld	a4,0(a5)
+ 742:	00e7e463          	bltu	a5,a4,74a <free+0x3a>
+ 746:	00e6ea63          	bltu	a3,a4,75a <free+0x4a>
+{
+ 74a:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 74c:	fed7fae3          	bgeu	a5,a3,740 <free+0x30>
+ 750:	6398                	ld	a4,0(a5)
+ 752:	00e6e463          	bltu	a3,a4,75a <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 756:	fee7eae3          	bltu	a5,a4,74a <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 75a:	ff852583          	lw	a1,-8(a0)
+ 75e:	6390                	ld	a2,0(a5)
+ 760:	02059813          	slli	a6,a1,0x20
+ 764:	01c85713          	srli	a4,a6,0x1c
+ 768:	9736                	add	a4,a4,a3
+ 76a:	fae60de3          	beq	a2,a4,724 <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 76e:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 772:	4790                	lw	a2,8(a5)
+ 774:	02061593          	slli	a1,a2,0x20
+ 778:	01c5d713          	srli	a4,a1,0x1c
+ 77c:	973e                	add	a4,a4,a5
+ 77e:	fae68ae3          	beq	a3,a4,732 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 782:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 784:	00000717          	auipc	a4,0x0
+ 788:	1af73a23          	sd	a5,436(a4) # 938 <freep>
+}
+ 78c:	6422                	ld	s0,8(sp)
+ 78e:	0141                	addi	sp,sp,16
+ 790:	8082                	ret
+
+0000000000000792 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 792:	7139                	addi	sp,sp,-64
+ 794:	fc06                	sd	ra,56(sp)
+ 796:	f822                	sd	s0,48(sp)
+ 798:	f426                	sd	s1,40(sp)
+ 79a:	f04a                	sd	s2,32(sp)
+ 79c:	ec4e                	sd	s3,24(sp)
+ 79e:	e852                	sd	s4,16(sp)
+ 7a0:	e456                	sd	s5,8(sp)
+ 7a2:	e05a                	sd	s6,0(sp)
+ 7a4:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 7a6:	02051493          	slli	s1,a0,0x20
+ 7aa:	9081                	srli	s1,s1,0x20
+ 7ac:	04bd                	addi	s1,s1,15
+ 7ae:	8091                	srli	s1,s1,0x4
+ 7b0:	00148a1b          	addiw	s4,s1,1
+ 7b4:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 7b6:	00000517          	auipc	a0,0x0
+ 7ba:	18253503          	ld	a0,386(a0) # 938 <freep>
+ 7be:	c515                	beqz	a0,7ea <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 7c0:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 7c2:	4798                	lw	a4,8(a5)
+ 7c4:	04977163          	bgeu	a4,s1,806 <malloc+0x74>
+ 7c8:	89d2                	mv	s3,s4
+ 7ca:	000a071b          	sext.w	a4,s4
+ 7ce:	6685                	lui	a3,0x1
+ 7d0:	00d77363          	bgeu	a4,a3,7d6 <malloc+0x44>
+ 7d4:	6985                	lui	s3,0x1
+ 7d6:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 7da:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 7de:	00000917          	auipc	s2,0x0
+ 7e2:	15a90913          	addi	s2,s2,346 # 938 <freep>
+  if(p == (char*)-1)
+ 7e6:	5afd                	li	s5,-1
+ 7e8:	a8a5                	j	860 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 7ea:	00000797          	auipc	a5,0x0
+ 7ee:	14e78793          	addi	a5,a5,334 # 938 <freep>
+ 7f2:	00000717          	auipc	a4,0x0
+ 7f6:	14e70713          	addi	a4,a4,334 # 940 <base>
+ 7fa:	e398                	sd	a4,0(a5)
+ 7fc:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 7fe:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 802:	87ba                	mv	a5,a4
+ 804:	b7d1                	j	7c8 <malloc+0x36>
+      if(p->s.size == nunits)
+ 806:	02e48c63          	beq	s1,a4,83e <malloc+0xac>
+        p->s.size -= nunits;
+ 80a:	4147073b          	subw	a4,a4,s4
+ 80e:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 810:	02071693          	slli	a3,a4,0x20
+ 814:	01c6d713          	srli	a4,a3,0x1c
+ 818:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 81a:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 81e:	00000717          	auipc	a4,0x0
+ 822:	10a73d23          	sd	a0,282(a4) # 938 <freep>
+      return (void*)(p + 1);
+ 826:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 82a:	70e2                	ld	ra,56(sp)
+ 82c:	7442                	ld	s0,48(sp)
+ 82e:	74a2                	ld	s1,40(sp)
+ 830:	7902                	ld	s2,32(sp)
+ 832:	69e2                	ld	s3,24(sp)
+ 834:	6a42                	ld	s4,16(sp)
+ 836:	6aa2                	ld	s5,8(sp)
+ 838:	6b02                	ld	s6,0(sp)
+ 83a:	6121                	addi	sp,sp,64
+ 83c:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 83e:	6398                	ld	a4,0(a5)
+ 840:	e118                	sd	a4,0(a0)
+ 842:	bff1                	j	81e <malloc+0x8c>
+  hp->s.size = nu;
+ 844:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 848:	0541                	addi	a0,a0,16
+ 84a:	00000097          	auipc	ra,0x0
+ 84e:	ec6080e7          	jalr	-314(ra) # 710 <free>
+  return freep;
+ 852:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 856:	d971                	beqz	a0,82a <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 858:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 85a:	4798                	lw	a4,8(a5)
+ 85c:	fa9775e3          	bgeu	a4,s1,806 <malloc+0x74>
+    if(p == freep)
+ 860:	00093703          	ld	a4,0(s2)
+ 864:	853e                	mv	a0,a5
+ 866:	fef719e3          	bne	a4,a5,858 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 86a:	854e                	mv	a0,s3
+ 86c:	00000097          	auipc	ra,0x0
+ 870:	b30080e7          	jalr	-1232(ra) # 39c <sbrk>
+  if(p == (char*)-1)
+ 874:	fd5518e3          	bne	a0,s5,844 <malloc+0xb2>
+        return 0;
+ 878:	4501                	li	a0,0
+ 87a:	bf45                	j	82a <malloc+0x98>
diff --git a/xv6-user/test.c b/xv6-user/test.c
new file mode 100644
index 0000000000000000000000000000000000000000..7e2c0d5265e27229043078e3d187148d553fdf0f
--- /dev/null
+++ b/xv6-user/test.c
@@ -0,0 +1,16 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "kernel/include/sysinfo.h"
+#include "xv6-user/user.h"
+
+int main()
+{
+    struct sysinfo info;
+    if (sysinfo(&info) < 0) {
+        printf("sysinfo fail!\n");
+    } else {
+        printf("memory left: %d KB\n", info.freemem >> 10);
+        printf("process amount: %d\n", info.nproc);
+    }
+    exit(0);
+}
diff --git a/xv6-user/test.d b/xv6-user/test.d
new file mode 100644
index 0000000000000000000000000000000000000000..3f9cdadb35f1002eb019f0a0a08d8dd518f0efee
--- /dev/null
+++ b/xv6-user/test.d
@@ -0,0 +1,3 @@
+xv6-user/test.o: xv6-user/test.c kernel/include/types.h \
+ kernel/include/stat.h kernel/include/sysinfo.h kernel/include/types.h \
+ xv6-user/user.h kernel/include/fcntl.h
diff --git a/xv6-user/test.o b/xv6-user/test.o
new file mode 100644
index 0000000000000000000000000000000000000000..5412c1a156554cd05106dea51781fa86b5b093f8
Binary files /dev/null and b/xv6-user/test.o differ
diff --git a/xv6-user/test.sym b/xv6-user/test.sym
new file mode 100644
index 0000000000000000000000000000000000000000..81409ef305f9593fc4d806421ecd2e95759ef7a8
--- /dev/null
+++ b/xv6-user/test.sym
@@ -0,0 +1,76 @@
+0000000000000000 .text
+0000000000000880 .rodata
+0000000000000938 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 test.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+0000000000000402 putc
+0000000000000424 printint
+0000000000000920 digits
+0000000000000000 umalloc.c
+0000000000000938 freep
+0000000000000940 base
+000000000000005e strcpy
+00000000000006da printf
+0000000000001131 __global_pointer$
+00000000000003bc dev
+0000000000000264 memmove
+00000000000003e0 trace
+0000000000000144 gets
+0000000000000931 __SDATA_BEGIN__
+0000000000000392 getpid
+00000000000002f6 memcpy
+0000000000000792 malloc
+00000000000003d6 remove
+00000000000003a4 sleep
+00000000000003e8 sysinfo
+00000000000003c6 readdir
+0000000000000328 pipe
+00000000000003f0 rename
+000000000000033c write
+000000000000036c fstat
+00000000000006ac fprintf
+0000000000000350 kill
+000000000000007a strcat
+00000000000004ce vprintf
+0000000000000380 chdir
+0000000000000358 exec
+0000000000000320 wait
+0000000000000332 read
+00000000000002bc memcmp
+000000000000030e fork
+0000000000000950 __BSS_END__
+000000000000039c sbrk
+00000000000003b4 test_proc
+00000000000003ac uptime
+0000000000000931 __bss_start
+00000000000000fe memset
+0000000000000000 main
+00000000000000a8 strcmp
+00000000000003f8 shutdown
+000000000000038a dup
+00000000000003ce getcwd
+0000000000000931 __DATA_BEGIN__
+00000000000001be stat
+0000000000000931 _edata
+0000000000000950 _end
+0000000000000316 exit
+0000000000000204 atoi
+00000000000000d4 strlen
+0000000000000362 open
+0000000000000120 strchr
+0000000000000376 mkdir
+0000000000000346 close
+0000000000000710 free
diff --git a/xv6-user/ulib.c b/xv6-user/ulib.c
new file mode 100644
index 0000000000000000000000000000000000000000..b1b246936f7cd953614f5f9a3f007d46f41d78bb
--- /dev/null
+++ b/xv6-user/ulib.c
@@ -0,0 +1,152 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+    ;
+  return os;
+}
+
+char*
+strcat(char *s, const char *t)
+{
+  char *os = s;
+  while(*s)
+    s++;
+  while((*s++ = *t++))
+    ;
+  return os;
+}
+
+
+int
+strcmp(const char *p, const char *q)
+{
+  while(*p && *p == *q)
+    p++, q++;
+  return (uchar)*p - (uchar)*q;
+}
+
+uint
+strlen(const char *s)
+{
+  int n;
+
+  for(n = 0; s[n]; n++)
+    ;
+  return n;
+}
+
+void*
+memset(void *dst, int c, uint n)
+{
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+    cdst[i] = c;
+  }
+  return dst;
+}
+
+char*
+strchr(const char *s, char c)
+{
+  for(; *s; s++)
+    if(*s == c)
+      return (char*)s;
+  return 0;
+}
+
+char*
+gets(char *buf, int max)
+{
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+    cc = read(0, &c, 1);
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+      break;
+  }
+  buf[i] = '\0';
+  return buf;
+}
+
+int
+stat(const char *n, struct stat *st)
+{
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+  if(fd < 0)
+    return -1;
+  r = fstat(fd, st);
+  close(fd);
+  return r;
+}
+
+int
+atoi(const char *s)
+{
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+    n = n*10 + *s++ - '0';
+  return n * neg;
+}
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+    while(n-- > 0)
+      *dst++ = *src++;
+  } else {
+    dst += n;
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+    if (*p1 != *p2) {
+      return *p1 - *p2;
+    }
+    p1++;
+    p2++;
+  }
+  return 0;
+}
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+  return memmove(dst, src, n);
+}
diff --git a/xv6-user/ulib.d b/xv6-user/ulib.d
new file mode 100644
index 0000000000000000000000000000000000000000..0f2ffee2af1e115762614b1dbf11a24b1c243b6f
--- /dev/null
+++ b/xv6-user/ulib.d
@@ -0,0 +1,2 @@
+xv6-user/ulib.o: xv6-user/ulib.c kernel/include/types.h \
+ kernel/include/stat.h kernel/include/fcntl.h xv6-user/user.h
diff --git a/xv6-user/ulib.o b/xv6-user/ulib.o
new file mode 100644
index 0000000000000000000000000000000000000000..7bc9baa6c8c63010f1baa331d437cde2013cc1db
Binary files /dev/null and b/xv6-user/ulib.o differ
diff --git a/xv6-user/umalloc.c b/xv6-user/umalloc.c
new file mode 100644
index 0000000000000000000000000000000000000000..66fe86d47be7058a88b4cca3a3d0f2b1890496a0
--- /dev/null
+++ b/xv6-user/umalloc.c
@@ -0,0 +1,90 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+#include "kernel/include/param.h"
+
+// Memory allocator by Kernighan and Ritchie,
+// The C programming Language, 2nd ed.  Section 8.7.
+
+typedef long Align;
+
+union header {
+  struct {
+    union header *ptr;
+    uint size;
+  } s;
+  Align x;
+};
+
+typedef union header Header;
+
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+    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;
+    bp->s.ptr = p->s.ptr->s.ptr;
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+    p->s.ptr = bp->s.ptr;
+  } else
+    p->s.ptr = bp;
+  freep = p;
+}
+
+static Header*
+morecore(uint nu)
+{
+  char *p;
+  Header *hp;
+
+  if(nu < 4096)
+    nu = 4096;
+  p = sbrk(nu * sizeof(Header));
+  if(p == (char*)-1)
+    return 0;
+  hp = (Header*)p;
+  hp->s.size = nu;
+  free((void*)(hp + 1));
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+  if((prevp = freep) == 0){
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+    if(p->s.size >= nunits){
+      if(p->s.size == nunits)
+        prevp->s.ptr = p->s.ptr;
+      else {
+        p->s.size -= nunits;
+        p += p->s.size;
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
diff --git a/xv6-user/umalloc.d b/xv6-user/umalloc.d
new file mode 100644
index 0000000000000000000000000000000000000000..c5589c46171c628569cf54f5bf3de0698fb0d25e
--- /dev/null
+++ b/xv6-user/umalloc.d
@@ -0,0 +1,3 @@
+xv6-user/umalloc.o: xv6-user/umalloc.c kernel/include/types.h \
+ kernel/include/stat.h xv6-user/user.h kernel/include/fcntl.h \
+ kernel/include/param.h
diff --git a/xv6-user/umalloc.o b/xv6-user/umalloc.o
new file mode 100644
index 0000000000000000000000000000000000000000..64bbe030d8693b809419ed30bc3c4848a980becd
Binary files /dev/null and b/xv6-user/umalloc.o differ
diff --git a/xv6-user/user.h b/xv6-user/user.h
new file mode 100644
index 0000000000000000000000000000000000000000..71b20c5daad040cc7f3906aa0a8a6436a9c2ee4e
--- /dev/null
+++ b/xv6-user/user.h
@@ -0,0 +1,54 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "kernel/include/fcntl.h"
+
+struct stat;
+struct rtcdate;
+struct sysinfo;
+
+// system calls
+int fork(void);
+int exit(int) __attribute__((noreturn));
+int wait(int*);
+int pipe(int*);
+int write(int fd, const void *buf, int len);
+int read(int fd, void *buf, int len);
+int close(int fd);
+int kill(int pid);
+int exec(char*, char**);
+int open(const char *filename, int mode);
+int fstat(int fd, struct stat*);
+int mkdir(const char *dirname);
+int chdir(const char *dirname);
+int dup(int fd);
+int getpid(void);
+char* sbrk(int size);
+int sleep(int ticks);
+int uptime(void);
+int test_proc(int);
+int dev(int, short, short);
+int readdir(int fd, struct stat*);
+int getcwd(char *buf);
+int remove(char *filename);
+int trace(int mask);
+int sysinfo(struct sysinfo *);
+int rename(char *old, char *new);
+int shutdown(void);
+
+// ulib.c
+int stat(const char*, struct stat*);
+char* strcpy(char*, const char*);
+char* strcat(char*, const char*);
+void *memmove(void*, const void*, int);
+char* strchr(const char*, char c);
+int strcmp(const char*, const char*);
+void fprintf(int, const char*, ...);
+void printf(const char*, ...);
+char* gets(char*, int max);
+uint strlen(const char*);
+void* memset(void*, int, uint);
+void* malloc(uint);
+void free(void*);
+int atoi(const char*);
+int memcmp(const void *, const void *, uint);
+void *memcpy(void *, const void *, uint);
diff --git a/xv6-user/usertests.asm b/xv6-user/usertests.asm
new file mode 100644
index 0000000000000000000000000000000000000000..b7aa1e656bcbd04cc04603212a922bce42bd0ac5
--- /dev/null
+++ b/xv6-user/usertests.asm
@@ -0,0 +1,8696 @@
+
+xv6-user/_usertests:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <copyinstr1>:
+}
+
+// what if you pass ridiculous string pointers to system calls?
+void
+copyinstr1(char *s)
+{
+       0:	1141                	addi	sp,sp,-16
+       2:	e406                	sd	ra,8(sp)
+       4:	e022                	sd	s0,0(sp)
+       6:	0800                	addi	s0,sp,16
+  uint64 addrs[] = { 0x80000000LL, 0xffffffffffffffff };
+
+  for(int ai = 0; ai < 2; ai++){
+    uint64 addr = addrs[ai];
+
+    int fd = open((char *)addr, O_CREATE|O_WRONLY);
+       8:	20100593          	li	a1,513
+       c:	4505                	li	a0,1
+       e:	057e                	slli	a0,a0,0x1f
+      10:	00005097          	auipc	ra,0x5
+      14:	940080e7          	jalr	-1728(ra) # 4950 <open>
+    if(fd >= 0){
+      18:	02055063          	bgez	a0,38 <copyinstr1+0x38>
+    int fd = open((char *)addr, O_CREATE|O_WRONLY);
+      1c:	20100593          	li	a1,513
+      20:	557d                	li	a0,-1
+      22:	00005097          	auipc	ra,0x5
+      26:	92e080e7          	jalr	-1746(ra) # 4950 <open>
+    uint64 addr = addrs[ai];
+      2a:	55fd                	li	a1,-1
+    if(fd >= 0){
+      2c:	00055863          	bgez	a0,3c <copyinstr1+0x3c>
+      printf("open(%p) returned %d, not -1\n", addr, fd);
+      exit(1);
+    }
+  }
+}
+      30:	60a2                	ld	ra,8(sp)
+      32:	6402                	ld	s0,0(sp)
+      34:	0141                	addi	sp,sp,16
+      36:	8082                	ret
+    uint64 addr = addrs[ai];
+      38:	4585                	li	a1,1
+      3a:	05fe                	slli	a1,a1,0x1f
+      printf("open(%p) returned %d, not -1\n", addr, fd);
+      3c:	862a                	mv	a2,a0
+      3e:	00005517          	auipc	a0,0x5
+      42:	e3250513          	addi	a0,a0,-462 # 4e70 <malloc+0xf0>
+      46:	00005097          	auipc	ra,0x5
+      4a:	c82080e7          	jalr	-894(ra) # 4cc8 <printf>
+      exit(1);
+      4e:	4505                	li	a0,1
+      50:	00005097          	auipc	ra,0x5
+      54:	8b4080e7          	jalr	-1868(ra) # 4904 <exit>
+
+0000000000000058 <validatetest>:
+  } 
+}
+
+void
+validatetest(char *s)
+{
+      58:	7139                	addi	sp,sp,-64
+      5a:	fc06                	sd	ra,56(sp)
+      5c:	f822                	sd	s0,48(sp)
+      5e:	f426                	sd	s1,40(sp)
+      60:	f04a                	sd	s2,32(sp)
+      62:	ec4e                	sd	s3,24(sp)
+      64:	e852                	sd	s4,16(sp)
+      66:	e456                	sd	s5,8(sp)
+      68:	e05a                	sd	s6,0(sp)
+      6a:	0080                	addi	s0,sp,64
+      6c:	8b2a                	mv	s6,a0
+  int hi;
+  uint64 p;
+
+  hi = 1100*1024;
+  for(p = 0; p <= (uint)hi; p += PGSIZE){
+      6e:	4481                	li	s1,0
+    // try to crash the kernel by passing in a bad string pointer
+    if(open((char*)p, O_RDONLY) != -1){
+      70:	597d                	li	s2,-1
+  for(p = 0; p <= (uint)hi; p += PGSIZE){
+      72:	6a05                	lui	s4,0x1
+      74:	001149b7          	lui	s3,0x114
+    if(open((char*)p, O_RDONLY) != -1){
+      78:	4581                	li	a1,0
+      7a:	8526                	mv	a0,s1
+      7c:	00005097          	auipc	ra,0x5
+      80:	8d4080e7          	jalr	-1836(ra) # 4950 <open>
+      84:	01251f63          	bne	a0,s2,a2 <validatetest+0x4a>
+  for(p = 0; p <= (uint)hi; p += PGSIZE){
+      88:	94d2                	add	s1,s1,s4
+      8a:	ff3497e3          	bne	s1,s3,78 <validatetest+0x20>
+      printf("%s: link should not succeed\n", s);
+      printf("bad string:[%s]\n", (char*)p);
+      exit(1);
+    }
+  }
+}
+      8e:	70e2                	ld	ra,56(sp)
+      90:	7442                	ld	s0,48(sp)
+      92:	74a2                	ld	s1,40(sp)
+      94:	7902                	ld	s2,32(sp)
+      96:	69e2                	ld	s3,24(sp)
+      98:	6a42                	ld	s4,16(sp)
+      9a:	6aa2                	ld	s5,8(sp)
+      9c:	6b02                	ld	s6,0(sp)
+      9e:	6121                	addi	sp,sp,64
+      a0:	8082                	ret
+      printf("%s: link should not succeed\n", s);
+      a2:	85da                	mv	a1,s6
+      a4:	00005517          	auipc	a0,0x5
+      a8:	dec50513          	addi	a0,a0,-532 # 4e90 <malloc+0x110>
+      ac:	00005097          	auipc	ra,0x5
+      b0:	c1c080e7          	jalr	-996(ra) # 4cc8 <printf>
+      printf("bad string:[%s]\n", (char*)p);
+      b4:	85a6                	mv	a1,s1
+      b6:	00005517          	auipc	a0,0x5
+      ba:	dfa50513          	addi	a0,a0,-518 # 4eb0 <malloc+0x130>
+      be:	00005097          	auipc	ra,0x5
+      c2:	c0a080e7          	jalr	-1014(ra) # 4cc8 <printf>
+      exit(1);
+      c6:	4505                	li	a0,1
+      c8:	00005097          	auipc	ra,0x5
+      cc:	83c080e7          	jalr	-1988(ra) # 4904 <exit>
+
+00000000000000d0 <bsstest>:
+void
+bsstest(char *s)
+{
+  int i;
+
+  for(i = 0; i < sizeof(uninit); i++){
+      d0:	00008797          	auipc	a5,0x8
+      d4:	0b878793          	addi	a5,a5,184 # 8188 <uninit>
+      d8:	0000a697          	auipc	a3,0xa
+      dc:	7c068693          	addi	a3,a3,1984 # a898 <buf>
+    if(uninit[i] != '\0'){
+      e0:	0007c703          	lbu	a4,0(a5)
+      e4:	e709                	bnez	a4,ee <bsstest+0x1e>
+  for(i = 0; i < sizeof(uninit); i++){
+      e6:	0785                	addi	a5,a5,1
+      e8:	fed79ce3          	bne	a5,a3,e0 <bsstest+0x10>
+      ec:	8082                	ret
+{
+      ee:	1141                	addi	sp,sp,-16
+      f0:	e406                	sd	ra,8(sp)
+      f2:	e022                	sd	s0,0(sp)
+      f4:	0800                	addi	s0,sp,16
+      printf("%s: bss test failed\n", s);
+      f6:	85aa                	mv	a1,a0
+      f8:	00005517          	auipc	a0,0x5
+      fc:	dd050513          	addi	a0,a0,-560 # 4ec8 <malloc+0x148>
+     100:	00005097          	auipc	ra,0x5
+     104:	bc8080e7          	jalr	-1080(ra) # 4cc8 <printf>
+      exit(1);
+     108:	4505                	li	a0,1
+     10a:	00004097          	auipc	ra,0x4
+     10e:	7fa080e7          	jalr	2042(ra) # 4904 <exit>
+
+0000000000000112 <opentest>:
+{
+     112:	1101                	addi	sp,sp,-32
+     114:	ec06                	sd	ra,24(sp)
+     116:	e822                	sd	s0,16(sp)
+     118:	e426                	sd	s1,8(sp)
+     11a:	1000                	addi	s0,sp,32
+     11c:	84aa                	mv	s1,a0
+  fd = open("echo", 0);
+     11e:	4581                	li	a1,0
+     120:	00005517          	auipc	a0,0x5
+     124:	dc050513          	addi	a0,a0,-576 # 4ee0 <malloc+0x160>
+     128:	00005097          	auipc	ra,0x5
+     12c:	828080e7          	jalr	-2008(ra) # 4950 <open>
+  if(fd < 0){
+     130:	02054663          	bltz	a0,15c <opentest+0x4a>
+  close(fd);
+     134:	00005097          	auipc	ra,0x5
+     138:	800080e7          	jalr	-2048(ra) # 4934 <close>
+  fd = open("doesnotexist", 0);
+     13c:	4581                	li	a1,0
+     13e:	00005517          	auipc	a0,0x5
+     142:	dc250513          	addi	a0,a0,-574 # 4f00 <malloc+0x180>
+     146:	00005097          	auipc	ra,0x5
+     14a:	80a080e7          	jalr	-2038(ra) # 4950 <open>
+  if(fd >= 0){
+     14e:	02055563          	bgez	a0,178 <opentest+0x66>
+}
+     152:	60e2                	ld	ra,24(sp)
+     154:	6442                	ld	s0,16(sp)
+     156:	64a2                	ld	s1,8(sp)
+     158:	6105                	addi	sp,sp,32
+     15a:	8082                	ret
+    printf("%s: open echo failed!\n", s);
+     15c:	85a6                	mv	a1,s1
+     15e:	00005517          	auipc	a0,0x5
+     162:	d8a50513          	addi	a0,a0,-630 # 4ee8 <malloc+0x168>
+     166:	00005097          	auipc	ra,0x5
+     16a:	b62080e7          	jalr	-1182(ra) # 4cc8 <printf>
+    exit(1);
+     16e:	4505                	li	a0,1
+     170:	00004097          	auipc	ra,0x4
+     174:	794080e7          	jalr	1940(ra) # 4904 <exit>
+    printf("%s: open doesnotexist succeeded!\n", s);
+     178:	85a6                	mv	a1,s1
+     17a:	00005517          	auipc	a0,0x5
+     17e:	d9650513          	addi	a0,a0,-618 # 4f10 <malloc+0x190>
+     182:	00005097          	auipc	ra,0x5
+     186:	b46080e7          	jalr	-1210(ra) # 4cc8 <printf>
+    exit(1);
+     18a:	4505                	li	a0,1
+     18c:	00004097          	auipc	ra,0x4
+     190:	778080e7          	jalr	1912(ra) # 4904 <exit>
+
+0000000000000194 <truncate2>:
+{
+     194:	7179                	addi	sp,sp,-48
+     196:	f406                	sd	ra,40(sp)
+     198:	f022                	sd	s0,32(sp)
+     19a:	ec26                	sd	s1,24(sp)
+     19c:	e84a                	sd	s2,16(sp)
+     19e:	e44e                	sd	s3,8(sp)
+     1a0:	1800                	addi	s0,sp,48
+     1a2:	89aa                	mv	s3,a0
+  remove("truncfile");
+     1a4:	00005517          	auipc	a0,0x5
+     1a8:	d9450513          	addi	a0,a0,-620 # 4f38 <malloc+0x1b8>
+     1ac:	00005097          	auipc	ra,0x5
+     1b0:	818080e7          	jalr	-2024(ra) # 49c4 <remove>
+  int fd1 = open("truncfile", O_CREATE|O_TRUNC|O_WRONLY);
+     1b4:	60100593          	li	a1,1537
+     1b8:	00005517          	auipc	a0,0x5
+     1bc:	d8050513          	addi	a0,a0,-640 # 4f38 <malloc+0x1b8>
+     1c0:	00004097          	auipc	ra,0x4
+     1c4:	790080e7          	jalr	1936(ra) # 4950 <open>
+     1c8:	84aa                	mv	s1,a0
+  write(fd1, "abcd", 4);
+     1ca:	4611                	li	a2,4
+     1cc:	00005597          	auipc	a1,0x5
+     1d0:	d7c58593          	addi	a1,a1,-644 # 4f48 <malloc+0x1c8>
+     1d4:	00004097          	auipc	ra,0x4
+     1d8:	756080e7          	jalr	1878(ra) # 492a <write>
+  int fd2 = open("truncfile", O_TRUNC|O_WRONLY);
+     1dc:	40100593          	li	a1,1025
+     1e0:	00005517          	auipc	a0,0x5
+     1e4:	d5850513          	addi	a0,a0,-680 # 4f38 <malloc+0x1b8>
+     1e8:	00004097          	auipc	ra,0x4
+     1ec:	768080e7          	jalr	1896(ra) # 4950 <open>
+     1f0:	892a                	mv	s2,a0
+  int n = write(fd1, "x", 1);
+     1f2:	4605                	li	a2,1
+     1f4:	00005597          	auipc	a1,0x5
+     1f8:	d5c58593          	addi	a1,a1,-676 # 4f50 <malloc+0x1d0>
+     1fc:	8526                	mv	a0,s1
+     1fe:	00004097          	auipc	ra,0x4
+     202:	72c080e7          	jalr	1836(ra) # 492a <write>
+  if(n != -1){
+     206:	57fd                	li	a5,-1
+     208:	02f51b63          	bne	a0,a5,23e <truncate2+0xaa>
+  remove("truncfile");
+     20c:	00005517          	auipc	a0,0x5
+     210:	d2c50513          	addi	a0,a0,-724 # 4f38 <malloc+0x1b8>
+     214:	00004097          	auipc	ra,0x4
+     218:	7b0080e7          	jalr	1968(ra) # 49c4 <remove>
+  close(fd1);
+     21c:	8526                	mv	a0,s1
+     21e:	00004097          	auipc	ra,0x4
+     222:	716080e7          	jalr	1814(ra) # 4934 <close>
+  close(fd2);
+     226:	854a                	mv	a0,s2
+     228:	00004097          	auipc	ra,0x4
+     22c:	70c080e7          	jalr	1804(ra) # 4934 <close>
+}
+     230:	70a2                	ld	ra,40(sp)
+     232:	7402                	ld	s0,32(sp)
+     234:	64e2                	ld	s1,24(sp)
+     236:	6942                	ld	s2,16(sp)
+     238:	69a2                	ld	s3,8(sp)
+     23a:	6145                	addi	sp,sp,48
+     23c:	8082                	ret
+    printf("%s: write returned %d, expected -1\n", s, n);
+     23e:	862a                	mv	a2,a0
+     240:	85ce                	mv	a1,s3
+     242:	00005517          	auipc	a0,0x5
+     246:	d1650513          	addi	a0,a0,-746 # 4f58 <malloc+0x1d8>
+     24a:	00005097          	auipc	ra,0x5
+     24e:	a7e080e7          	jalr	-1410(ra) # 4cc8 <printf>
+    exit(1);
+     252:	4505                	li	a0,1
+     254:	00004097          	auipc	ra,0x4
+     258:	6b0080e7          	jalr	1712(ra) # 4904 <exit>
+
+000000000000025c <createtest>:
+{
+     25c:	7179                	addi	sp,sp,-48
+     25e:	f406                	sd	ra,40(sp)
+     260:	f022                	sd	s0,32(sp)
+     262:	ec26                	sd	s1,24(sp)
+     264:	e84a                	sd	s2,16(sp)
+     266:	e44e                	sd	s3,8(sp)
+     268:	1800                	addi	s0,sp,48
+  name[0] = 'a';
+     26a:	00007797          	auipc	a5,0x7
+     26e:	e0e78793          	addi	a5,a5,-498 # 7078 <name>
+     272:	06100713          	li	a4,97
+     276:	00e78023          	sb	a4,0(a5)
+  name[2] = '\0';
+     27a:	00078123          	sb	zero,2(a5)
+     27e:	03000493          	li	s1,48
+    name[1] = '0' + i;
+     282:	893e                	mv	s2,a5
+  for(i = 0; i < N; i++){
+     284:	06400993          	li	s3,100
+    name[1] = '0' + i;
+     288:	009900a3          	sb	s1,1(s2)
+    fd = open(name, O_CREATE|O_RDWR);
+     28c:	20200593          	li	a1,514
+     290:	854a                	mv	a0,s2
+     292:	00004097          	auipc	ra,0x4
+     296:	6be080e7          	jalr	1726(ra) # 4950 <open>
+    close(fd);
+     29a:	00004097          	auipc	ra,0x4
+     29e:	69a080e7          	jalr	1690(ra) # 4934 <close>
+  for(i = 0; i < N; i++){
+     2a2:	2485                	addiw	s1,s1,1
+     2a4:	0ff4f493          	zext.b	s1,s1
+     2a8:	ff3490e3          	bne	s1,s3,288 <createtest+0x2c>
+  name[0] = 'a';
+     2ac:	00007797          	auipc	a5,0x7
+     2b0:	dcc78793          	addi	a5,a5,-564 # 7078 <name>
+     2b4:	06100713          	li	a4,97
+     2b8:	00e78023          	sb	a4,0(a5)
+  name[2] = '\0';
+     2bc:	00078123          	sb	zero,2(a5)
+     2c0:	03000493          	li	s1,48
+    name[1] = '0' + i;
+     2c4:	893e                	mv	s2,a5
+  for(i = 0; i < N; i++){
+     2c6:	06400993          	li	s3,100
+    name[1] = '0' + i;
+     2ca:	009900a3          	sb	s1,1(s2)
+    remove(name);
+     2ce:	854a                	mv	a0,s2
+     2d0:	00004097          	auipc	ra,0x4
+     2d4:	6f4080e7          	jalr	1780(ra) # 49c4 <remove>
+  for(i = 0; i < N; i++){
+     2d8:	2485                	addiw	s1,s1,1
+     2da:	0ff4f493          	zext.b	s1,s1
+     2de:	ff3496e3          	bne	s1,s3,2ca <createtest+0x6e>
+}
+     2e2:	70a2                	ld	ra,40(sp)
+     2e4:	7402                	ld	s0,32(sp)
+     2e6:	64e2                	ld	s1,24(sp)
+     2e8:	6942                	ld	s2,16(sp)
+     2ea:	69a2                	ld	s3,8(sp)
+     2ec:	6145                	addi	sp,sp,48
+     2ee:	8082                	ret
+
+00000000000002f0 <bigwrite>:
+{
+     2f0:	715d                	addi	sp,sp,-80
+     2f2:	e486                	sd	ra,72(sp)
+     2f4:	e0a2                	sd	s0,64(sp)
+     2f6:	fc26                	sd	s1,56(sp)
+     2f8:	f84a                	sd	s2,48(sp)
+     2fa:	f44e                	sd	s3,40(sp)
+     2fc:	f052                	sd	s4,32(sp)
+     2fe:	ec56                	sd	s5,24(sp)
+     300:	e85a                	sd	s6,16(sp)
+     302:	e45e                	sd	s7,8(sp)
+     304:	0880                	addi	s0,sp,80
+     306:	8baa                	mv	s7,a0
+  remove("bigwrite");
+     308:	00005517          	auipc	a0,0x5
+     30c:	c7850513          	addi	a0,a0,-904 # 4f80 <malloc+0x200>
+     310:	00004097          	auipc	ra,0x4
+     314:	6b4080e7          	jalr	1716(ra) # 49c4 <remove>
+  for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){
+     318:	1f300493          	li	s1,499
+    fd = open("bigwrite", O_CREATE | O_RDWR);
+     31c:	00005a97          	auipc	s5,0x5
+     320:	c64a8a93          	addi	s5,s5,-924 # 4f80 <malloc+0x200>
+      int cc = write(fd, buf, sz);
+     324:	0000aa17          	auipc	s4,0xa
+     328:	574a0a13          	addi	s4,s4,1396 # a898 <buf>
+  for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){
+     32c:	6b09                	lui	s6,0x2
+     32e:	807b0b13          	addi	s6,s6,-2041 # 1807 <forkfork+0x49>
+    fd = open("bigwrite", O_CREATE | O_RDWR);
+     332:	20200593          	li	a1,514
+     336:	8556                	mv	a0,s5
+     338:	00004097          	auipc	ra,0x4
+     33c:	618080e7          	jalr	1560(ra) # 4950 <open>
+     340:	892a                	mv	s2,a0
+    if(fd < 0){
+     342:	04054d63          	bltz	a0,39c <bigwrite+0xac>
+      int cc = write(fd, buf, sz);
+     346:	8626                	mv	a2,s1
+     348:	85d2                	mv	a1,s4
+     34a:	00004097          	auipc	ra,0x4
+     34e:	5e0080e7          	jalr	1504(ra) # 492a <write>
+     352:	89aa                	mv	s3,a0
+      if(cc != sz){
+     354:	06a49263          	bne	s1,a0,3b8 <bigwrite+0xc8>
+      int cc = write(fd, buf, sz);
+     358:	8626                	mv	a2,s1
+     35a:	85d2                	mv	a1,s4
+     35c:	854a                	mv	a0,s2
+     35e:	00004097          	auipc	ra,0x4
+     362:	5cc080e7          	jalr	1484(ra) # 492a <write>
+      if(cc != sz){
+     366:	04951a63          	bne	a0,s1,3ba <bigwrite+0xca>
+    close(fd);
+     36a:	854a                	mv	a0,s2
+     36c:	00004097          	auipc	ra,0x4
+     370:	5c8080e7          	jalr	1480(ra) # 4934 <close>
+    remove("bigwrite");
+     374:	8556                	mv	a0,s5
+     376:	00004097          	auipc	ra,0x4
+     37a:	64e080e7          	jalr	1614(ra) # 49c4 <remove>
+  for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){
+     37e:	1d74849b          	addiw	s1,s1,471
+     382:	fb6498e3          	bne	s1,s6,332 <bigwrite+0x42>
+}
+     386:	60a6                	ld	ra,72(sp)
+     388:	6406                	ld	s0,64(sp)
+     38a:	74e2                	ld	s1,56(sp)
+     38c:	7942                	ld	s2,48(sp)
+     38e:	79a2                	ld	s3,40(sp)
+     390:	7a02                	ld	s4,32(sp)
+     392:	6ae2                	ld	s5,24(sp)
+     394:	6b42                	ld	s6,16(sp)
+     396:	6ba2                	ld	s7,8(sp)
+     398:	6161                	addi	sp,sp,80
+     39a:	8082                	ret
+      printf("%s: cannot create bigwrite\n", s);
+     39c:	85de                	mv	a1,s7
+     39e:	00005517          	auipc	a0,0x5
+     3a2:	bf250513          	addi	a0,a0,-1038 # 4f90 <malloc+0x210>
+     3a6:	00005097          	auipc	ra,0x5
+     3aa:	922080e7          	jalr	-1758(ra) # 4cc8 <printf>
+      exit(1);
+     3ae:	4505                	li	a0,1
+     3b0:	00004097          	auipc	ra,0x4
+     3b4:	554080e7          	jalr	1364(ra) # 4904 <exit>
+      if(cc != sz){
+     3b8:	89a6                	mv	s3,s1
+        printf("%s: write(%d) ret %d\n", s, sz, cc);
+     3ba:	86aa                	mv	a3,a0
+     3bc:	864e                	mv	a2,s3
+     3be:	85de                	mv	a1,s7
+     3c0:	00005517          	auipc	a0,0x5
+     3c4:	bf050513          	addi	a0,a0,-1040 # 4fb0 <malloc+0x230>
+     3c8:	00005097          	auipc	ra,0x5
+     3cc:	900080e7          	jalr	-1792(ra) # 4cc8 <printf>
+        exit(1);
+     3d0:	4505                	li	a0,1
+     3d2:	00004097          	auipc	ra,0x4
+     3d6:	532080e7          	jalr	1330(ra) # 4904 <exit>
+
+00000000000003da <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)
+{
+     3da:	7179                	addi	sp,sp,-48
+     3dc:	f406                	sd	ra,40(sp)
+     3de:	f022                	sd	s0,32(sp)
+     3e0:	ec26                	sd	s1,24(sp)
+     3e2:	e84a                	sd	s2,16(sp)
+     3e4:	e44e                	sd	s3,8(sp)
+     3e6:	e052                	sd	s4,0(sp)
+     3e8:	1800                	addi	s0,sp,48
+  int assumed_free = 600;
+  
+  remove("junk");
+     3ea:	00005517          	auipc	a0,0x5
+     3ee:	bde50513          	addi	a0,a0,-1058 # 4fc8 <malloc+0x248>
+     3f2:	00004097          	auipc	ra,0x4
+     3f6:	5d2080e7          	jalr	1490(ra) # 49c4 <remove>
+     3fa:	25800913          	li	s2,600
+  for(int i = 0; i < assumed_free; i++){
+    int fd = open("junk", O_CREATE|O_WRONLY);
+     3fe:	00005997          	auipc	s3,0x5
+     402:	bca98993          	addi	s3,s3,-1078 # 4fc8 <malloc+0x248>
+    if(fd < 0){
+      printf("open junk failed\n");
+      exit(1);
+    }
+    write(fd, (char*)0xffffffffffL, 1);
+     406:	5a7d                	li	s4,-1
+     408:	018a5a13          	srli	s4,s4,0x18
+    int fd = open("junk", O_CREATE|O_WRONLY);
+     40c:	20100593          	li	a1,513
+     410:	854e                	mv	a0,s3
+     412:	00004097          	auipc	ra,0x4
+     416:	53e080e7          	jalr	1342(ra) # 4950 <open>
+     41a:	84aa                	mv	s1,a0
+    if(fd < 0){
+     41c:	06054b63          	bltz	a0,492 <badwrite+0xb8>
+    write(fd, (char*)0xffffffffffL, 1);
+     420:	4605                	li	a2,1
+     422:	85d2                	mv	a1,s4
+     424:	00004097          	auipc	ra,0x4
+     428:	506080e7          	jalr	1286(ra) # 492a <write>
+    close(fd);
+     42c:	8526                	mv	a0,s1
+     42e:	00004097          	auipc	ra,0x4
+     432:	506080e7          	jalr	1286(ra) # 4934 <close>
+    remove("junk");
+     436:	854e                	mv	a0,s3
+     438:	00004097          	auipc	ra,0x4
+     43c:	58c080e7          	jalr	1420(ra) # 49c4 <remove>
+  for(int i = 0; i < assumed_free; i++){
+     440:	397d                	addiw	s2,s2,-1
+     442:	fc0915e3          	bnez	s2,40c <badwrite+0x32>
+  }
+
+  int fd = open("junk", O_CREATE|O_WRONLY);
+     446:	20100593          	li	a1,513
+     44a:	00005517          	auipc	a0,0x5
+     44e:	b7e50513          	addi	a0,a0,-1154 # 4fc8 <malloc+0x248>
+     452:	00004097          	auipc	ra,0x4
+     456:	4fe080e7          	jalr	1278(ra) # 4950 <open>
+     45a:	84aa                	mv	s1,a0
+  if(fd < 0){
+     45c:	04054863          	bltz	a0,4ac <badwrite+0xd2>
+    printf("open junk failed\n");
+    exit(1);
+  }
+  if(write(fd, "x", 1) != 1){
+     460:	4605                	li	a2,1
+     462:	00005597          	auipc	a1,0x5
+     466:	aee58593          	addi	a1,a1,-1298 # 4f50 <malloc+0x1d0>
+     46a:	00004097          	auipc	ra,0x4
+     46e:	4c0080e7          	jalr	1216(ra) # 492a <write>
+     472:	4785                	li	a5,1
+     474:	04f50963          	beq	a0,a5,4c6 <badwrite+0xec>
+    printf("write failed\n");
+     478:	00005517          	auipc	a0,0x5
+     47c:	b7050513          	addi	a0,a0,-1168 # 4fe8 <malloc+0x268>
+     480:	00005097          	auipc	ra,0x5
+     484:	848080e7          	jalr	-1976(ra) # 4cc8 <printf>
+    exit(1);
+     488:	4505                	li	a0,1
+     48a:	00004097          	auipc	ra,0x4
+     48e:	47a080e7          	jalr	1146(ra) # 4904 <exit>
+      printf("open junk failed\n");
+     492:	00005517          	auipc	a0,0x5
+     496:	b3e50513          	addi	a0,a0,-1218 # 4fd0 <malloc+0x250>
+     49a:	00005097          	auipc	ra,0x5
+     49e:	82e080e7          	jalr	-2002(ra) # 4cc8 <printf>
+      exit(1);
+     4a2:	4505                	li	a0,1
+     4a4:	00004097          	auipc	ra,0x4
+     4a8:	460080e7          	jalr	1120(ra) # 4904 <exit>
+    printf("open junk failed\n");
+     4ac:	00005517          	auipc	a0,0x5
+     4b0:	b2450513          	addi	a0,a0,-1244 # 4fd0 <malloc+0x250>
+     4b4:	00005097          	auipc	ra,0x5
+     4b8:	814080e7          	jalr	-2028(ra) # 4cc8 <printf>
+    exit(1);
+     4bc:	4505                	li	a0,1
+     4be:	00004097          	auipc	ra,0x4
+     4c2:	446080e7          	jalr	1094(ra) # 4904 <exit>
+  }
+  close(fd);
+     4c6:	8526                	mv	a0,s1
+     4c8:	00004097          	auipc	ra,0x4
+     4cc:	46c080e7          	jalr	1132(ra) # 4934 <close>
+  remove("junk");
+     4d0:	00005517          	auipc	a0,0x5
+     4d4:	af850513          	addi	a0,a0,-1288 # 4fc8 <malloc+0x248>
+     4d8:	00004097          	auipc	ra,0x4
+     4dc:	4ec080e7          	jalr	1260(ra) # 49c4 <remove>
+
+  exit(0);
+     4e0:	4501                	li	a0,0
+     4e2:	00004097          	auipc	ra,0x4
+     4e6:	422080e7          	jalr	1058(ra) # 4904 <exit>
+
+00000000000004ea <copyin>:
+{
+     4ea:	7159                	addi	sp,sp,-112
+     4ec:	f486                	sd	ra,104(sp)
+     4ee:	f0a2                	sd	s0,96(sp)
+     4f0:	eca6                	sd	s1,88(sp)
+     4f2:	e8ca                	sd	s2,80(sp)
+     4f4:	e4ce                	sd	s3,72(sp)
+     4f6:	e0d2                	sd	s4,64(sp)
+     4f8:	fc56                	sd	s5,56(sp)
+     4fa:	1880                	addi	s0,sp,112
+  uint64 addrs[] = { 0x80000000LL, 0xffffffffffffffff };
+     4fc:	4785                	li	a5,1
+     4fe:	07fe                	slli	a5,a5,0x1f
+     500:	faf43823          	sd	a5,-80(s0)
+     504:	57fd                	li	a5,-1
+     506:	faf43c23          	sd	a5,-72(s0)
+  for(int ai = 0; ai < 2; ai++){
+     50a:	fb040913          	addi	s2,s0,-80
+     50e:	fc040793          	addi	a5,s0,-64
+     512:	f8f43c23          	sd	a5,-104(s0)
+    int fd = open("copyin1", O_CREATE|O_WRONLY);
+     516:	00005a17          	auipc	s4,0x5
+     51a:	ae2a0a13          	addi	s4,s4,-1310 # 4ff8 <malloc+0x278>
+    if(pipe(fds) < 0){
+     51e:	fa840a93          	addi	s5,s0,-88
+    uint64 addr = addrs[ai];
+     522:	00093983          	ld	s3,0(s2)
+    int fd = open("copyin1", O_CREATE|O_WRONLY);
+     526:	20100593          	li	a1,513
+     52a:	8552                	mv	a0,s4
+     52c:	00004097          	auipc	ra,0x4
+     530:	424080e7          	jalr	1060(ra) # 4950 <open>
+     534:	84aa                	mv	s1,a0
+    if(fd < 0){
+     536:	08054863          	bltz	a0,5c6 <copyin+0xdc>
+    int n = write(fd, (void*)addr, 8192);
+     53a:	6609                	lui	a2,0x2
+     53c:	85ce                	mv	a1,s3
+     53e:	00004097          	auipc	ra,0x4
+     542:	3ec080e7          	jalr	1004(ra) # 492a <write>
+    if(n >= 0){
+     546:	08055d63          	bgez	a0,5e0 <copyin+0xf6>
+    close(fd);
+     54a:	8526                	mv	a0,s1
+     54c:	00004097          	auipc	ra,0x4
+     550:	3e8080e7          	jalr	1000(ra) # 4934 <close>
+    remove("copyin1");
+     554:	8552                	mv	a0,s4
+     556:	00004097          	auipc	ra,0x4
+     55a:	46e080e7          	jalr	1134(ra) # 49c4 <remove>
+    n = write(1, (char*)addr, 8192);
+     55e:	6609                	lui	a2,0x2
+     560:	85ce                	mv	a1,s3
+     562:	4505                	li	a0,1
+     564:	00004097          	auipc	ra,0x4
+     568:	3c6080e7          	jalr	966(ra) # 492a <write>
+    if(n > 0){
+     56c:	08a04963          	bgtz	a0,5fe <copyin+0x114>
+    if(pipe(fds) < 0){
+     570:	8556                	mv	a0,s5
+     572:	00004097          	auipc	ra,0x4
+     576:	3a4080e7          	jalr	932(ra) # 4916 <pipe>
+     57a:	0a054163          	bltz	a0,61c <copyin+0x132>
+    n = write(fds[1], (char*)addr, 8192);
+     57e:	6609                	lui	a2,0x2
+     580:	85ce                	mv	a1,s3
+     582:	fac42503          	lw	a0,-84(s0)
+     586:	00004097          	auipc	ra,0x4
+     58a:	3a4080e7          	jalr	932(ra) # 492a <write>
+    if(n > 0){
+     58e:	0aa04463          	bgtz	a0,636 <copyin+0x14c>
+    close(fds[0]);
+     592:	fa842503          	lw	a0,-88(s0)
+     596:	00004097          	auipc	ra,0x4
+     59a:	39e080e7          	jalr	926(ra) # 4934 <close>
+    close(fds[1]);
+     59e:	fac42503          	lw	a0,-84(s0)
+     5a2:	00004097          	auipc	ra,0x4
+     5a6:	392080e7          	jalr	914(ra) # 4934 <close>
+  for(int ai = 0; ai < 2; ai++){
+     5aa:	0921                	addi	s2,s2,8
+     5ac:	f9843783          	ld	a5,-104(s0)
+     5b0:	f6f919e3          	bne	s2,a5,522 <copyin+0x38>
+}
+     5b4:	70a6                	ld	ra,104(sp)
+     5b6:	7406                	ld	s0,96(sp)
+     5b8:	64e6                	ld	s1,88(sp)
+     5ba:	6946                	ld	s2,80(sp)
+     5bc:	69a6                	ld	s3,72(sp)
+     5be:	6a06                	ld	s4,64(sp)
+     5c0:	7ae2                	ld	s5,56(sp)
+     5c2:	6165                	addi	sp,sp,112
+     5c4:	8082                	ret
+      printf("open(copyin1) failed\n");
+     5c6:	00005517          	auipc	a0,0x5
+     5ca:	a3a50513          	addi	a0,a0,-1478 # 5000 <malloc+0x280>
+     5ce:	00004097          	auipc	ra,0x4
+     5d2:	6fa080e7          	jalr	1786(ra) # 4cc8 <printf>
+      exit(1);
+     5d6:	4505                	li	a0,1
+     5d8:	00004097          	auipc	ra,0x4
+     5dc:	32c080e7          	jalr	812(ra) # 4904 <exit>
+      printf("write(fd, %p, 8192) returned %d, not -1\n", addr, n);
+     5e0:	862a                	mv	a2,a0
+     5e2:	85ce                	mv	a1,s3
+     5e4:	00005517          	auipc	a0,0x5
+     5e8:	a3450513          	addi	a0,a0,-1484 # 5018 <malloc+0x298>
+     5ec:	00004097          	auipc	ra,0x4
+     5f0:	6dc080e7          	jalr	1756(ra) # 4cc8 <printf>
+      exit(1);
+     5f4:	4505                	li	a0,1
+     5f6:	00004097          	auipc	ra,0x4
+     5fa:	30e080e7          	jalr	782(ra) # 4904 <exit>
+      printf("write(1, %p, 8192) returned %d, not -1 or 0\n", addr, n);
+     5fe:	862a                	mv	a2,a0
+     600:	85ce                	mv	a1,s3
+     602:	00005517          	auipc	a0,0x5
+     606:	a4650513          	addi	a0,a0,-1466 # 5048 <malloc+0x2c8>
+     60a:	00004097          	auipc	ra,0x4
+     60e:	6be080e7          	jalr	1726(ra) # 4cc8 <printf>
+      exit(1);
+     612:	4505                	li	a0,1
+     614:	00004097          	auipc	ra,0x4
+     618:	2f0080e7          	jalr	752(ra) # 4904 <exit>
+      printf("pipe() failed\n");
+     61c:	00005517          	auipc	a0,0x5
+     620:	a5c50513          	addi	a0,a0,-1444 # 5078 <malloc+0x2f8>
+     624:	00004097          	auipc	ra,0x4
+     628:	6a4080e7          	jalr	1700(ra) # 4cc8 <printf>
+      exit(1);
+     62c:	4505                	li	a0,1
+     62e:	00004097          	auipc	ra,0x4
+     632:	2d6080e7          	jalr	726(ra) # 4904 <exit>
+      printf("write(pipe, %p, 8192) returned %d, not -1 or 0\n", addr, n);
+     636:	862a                	mv	a2,a0
+     638:	85ce                	mv	a1,s3
+     63a:	00005517          	auipc	a0,0x5
+     63e:	a4e50513          	addi	a0,a0,-1458 # 5088 <malloc+0x308>
+     642:	00004097          	auipc	ra,0x4
+     646:	686080e7          	jalr	1670(ra) # 4cc8 <printf>
+      exit(1);
+     64a:	4505                	li	a0,1
+     64c:	00004097          	auipc	ra,0x4
+     650:	2b8080e7          	jalr	696(ra) # 4904 <exit>
+
+0000000000000654 <copyout>:
+{
+     654:	7159                	addi	sp,sp,-112
+     656:	f486                	sd	ra,104(sp)
+     658:	f0a2                	sd	s0,96(sp)
+     65a:	eca6                	sd	s1,88(sp)
+     65c:	e8ca                	sd	s2,80(sp)
+     65e:	e4ce                	sd	s3,72(sp)
+     660:	e0d2                	sd	s4,64(sp)
+     662:	fc56                	sd	s5,56(sp)
+     664:	f85a                	sd	s6,48(sp)
+     666:	1880                	addi	s0,sp,112
+  uint64 addrs[] = { 0x80000000LL, 0xffffffffffffffff };
+     668:	4785                	li	a5,1
+     66a:	07fe                	slli	a5,a5,0x1f
+     66c:	faf43823          	sd	a5,-80(s0)
+     670:	57fd                	li	a5,-1
+     672:	faf43c23          	sd	a5,-72(s0)
+  for(int ai = 0; ai < 2; ai++){
+     676:	fb040913          	addi	s2,s0,-80
+     67a:	fc040793          	addi	a5,s0,-64
+     67e:	f8f43c23          	sd	a5,-104(s0)
+    int fd = open("README", 0);
+     682:	00005a97          	auipc	s5,0x5
+     686:	a36a8a93          	addi	s5,s5,-1482 # 50b8 <malloc+0x338>
+    if(pipe(fds) < 0){
+     68a:	fa840a13          	addi	s4,s0,-88
+    n = write(fds[1], "x", 1);
+     68e:	00005b17          	auipc	s6,0x5
+     692:	8c2b0b13          	addi	s6,s6,-1854 # 4f50 <malloc+0x1d0>
+    uint64 addr = addrs[ai];
+     696:	00093983          	ld	s3,0(s2)
+    int fd = open("README", 0);
+     69a:	4581                	li	a1,0
+     69c:	8556                	mv	a0,s5
+     69e:	00004097          	auipc	ra,0x4
+     6a2:	2b2080e7          	jalr	690(ra) # 4950 <open>
+     6a6:	84aa                	mv	s1,a0
+    if(fd < 0){
+     6a8:	08054663          	bltz	a0,734 <copyout+0xe0>
+    int n = read(fd, (void*)addr, 8192);
+     6ac:	6609                	lui	a2,0x2
+     6ae:	85ce                	mv	a1,s3
+     6b0:	00004097          	auipc	ra,0x4
+     6b4:	270080e7          	jalr	624(ra) # 4920 <read>
+    if(n > 0){
+     6b8:	08a04b63          	bgtz	a0,74e <copyout+0xfa>
+    close(fd);
+     6bc:	8526                	mv	a0,s1
+     6be:	00004097          	auipc	ra,0x4
+     6c2:	276080e7          	jalr	630(ra) # 4934 <close>
+    if(pipe(fds) < 0){
+     6c6:	8552                	mv	a0,s4
+     6c8:	00004097          	auipc	ra,0x4
+     6cc:	24e080e7          	jalr	590(ra) # 4916 <pipe>
+     6d0:	08054e63          	bltz	a0,76c <copyout+0x118>
+    n = write(fds[1], "x", 1);
+     6d4:	4605                	li	a2,1
+     6d6:	85da                	mv	a1,s6
+     6d8:	fac42503          	lw	a0,-84(s0)
+     6dc:	00004097          	auipc	ra,0x4
+     6e0:	24e080e7          	jalr	590(ra) # 492a <write>
+    if(n != 1){
+     6e4:	4785                	li	a5,1
+     6e6:	0af51063          	bne	a0,a5,786 <copyout+0x132>
+    n = read(fds[0], (void*)addr, 8192);
+     6ea:	6609                	lui	a2,0x2
+     6ec:	85ce                	mv	a1,s3
+     6ee:	fa842503          	lw	a0,-88(s0)
+     6f2:	00004097          	auipc	ra,0x4
+     6f6:	22e080e7          	jalr	558(ra) # 4920 <read>
+    if(n > 0){
+     6fa:	0aa04363          	bgtz	a0,7a0 <copyout+0x14c>
+    close(fds[0]);
+     6fe:	fa842503          	lw	a0,-88(s0)
+     702:	00004097          	auipc	ra,0x4
+     706:	232080e7          	jalr	562(ra) # 4934 <close>
+    close(fds[1]);
+     70a:	fac42503          	lw	a0,-84(s0)
+     70e:	00004097          	auipc	ra,0x4
+     712:	226080e7          	jalr	550(ra) # 4934 <close>
+  for(int ai = 0; ai < 2; ai++){
+     716:	0921                	addi	s2,s2,8
+     718:	f9843783          	ld	a5,-104(s0)
+     71c:	f6f91de3          	bne	s2,a5,696 <copyout+0x42>
+}
+     720:	70a6                	ld	ra,104(sp)
+     722:	7406                	ld	s0,96(sp)
+     724:	64e6                	ld	s1,88(sp)
+     726:	6946                	ld	s2,80(sp)
+     728:	69a6                	ld	s3,72(sp)
+     72a:	6a06                	ld	s4,64(sp)
+     72c:	7ae2                	ld	s5,56(sp)
+     72e:	7b42                	ld	s6,48(sp)
+     730:	6165                	addi	sp,sp,112
+     732:	8082                	ret
+      printf("open(README) failed\n");
+     734:	00005517          	auipc	a0,0x5
+     738:	98c50513          	addi	a0,a0,-1652 # 50c0 <malloc+0x340>
+     73c:	00004097          	auipc	ra,0x4
+     740:	58c080e7          	jalr	1420(ra) # 4cc8 <printf>
+      exit(1);
+     744:	4505                	li	a0,1
+     746:	00004097          	auipc	ra,0x4
+     74a:	1be080e7          	jalr	446(ra) # 4904 <exit>
+      printf("read(fd, %p, 8192) returned %d, not -1 or 0\n", addr, n);
+     74e:	862a                	mv	a2,a0
+     750:	85ce                	mv	a1,s3
+     752:	00005517          	auipc	a0,0x5
+     756:	98650513          	addi	a0,a0,-1658 # 50d8 <malloc+0x358>
+     75a:	00004097          	auipc	ra,0x4
+     75e:	56e080e7          	jalr	1390(ra) # 4cc8 <printf>
+      exit(1);
+     762:	4505                	li	a0,1
+     764:	00004097          	auipc	ra,0x4
+     768:	1a0080e7          	jalr	416(ra) # 4904 <exit>
+      printf("pipe() failed\n");
+     76c:	00005517          	auipc	a0,0x5
+     770:	90c50513          	addi	a0,a0,-1780 # 5078 <malloc+0x2f8>
+     774:	00004097          	auipc	ra,0x4
+     778:	554080e7          	jalr	1364(ra) # 4cc8 <printf>
+      exit(1);
+     77c:	4505                	li	a0,1
+     77e:	00004097          	auipc	ra,0x4
+     782:	186080e7          	jalr	390(ra) # 4904 <exit>
+      printf("pipe write failed\n");
+     786:	00005517          	auipc	a0,0x5
+     78a:	98250513          	addi	a0,a0,-1662 # 5108 <malloc+0x388>
+     78e:	00004097          	auipc	ra,0x4
+     792:	53a080e7          	jalr	1338(ra) # 4cc8 <printf>
+      exit(1);
+     796:	4505                	li	a0,1
+     798:	00004097          	auipc	ra,0x4
+     79c:	16c080e7          	jalr	364(ra) # 4904 <exit>
+      printf("read(pipe, %p, 8192) returned %d, not -1 or 0\n", addr, n);
+     7a0:	862a                	mv	a2,a0
+     7a2:	85ce                	mv	a1,s3
+     7a4:	00005517          	auipc	a0,0x5
+     7a8:	97c50513          	addi	a0,a0,-1668 # 5120 <malloc+0x3a0>
+     7ac:	00004097          	auipc	ra,0x4
+     7b0:	51c080e7          	jalr	1308(ra) # 4cc8 <printf>
+      exit(1);
+     7b4:	4505                	li	a0,1
+     7b6:	00004097          	auipc	ra,0x4
+     7ba:	14e080e7          	jalr	334(ra) # 4904 <exit>
+
+00000000000007be <truncate1>:
+{
+     7be:	711d                	addi	sp,sp,-96
+     7c0:	ec86                	sd	ra,88(sp)
+     7c2:	e8a2                	sd	s0,80(sp)
+     7c4:	e4a6                	sd	s1,72(sp)
+     7c6:	e0ca                	sd	s2,64(sp)
+     7c8:	fc4e                	sd	s3,56(sp)
+     7ca:	f852                	sd	s4,48(sp)
+     7cc:	f456                	sd	s5,40(sp)
+     7ce:	1080                	addi	s0,sp,96
+     7d0:	8aaa                	mv	s5,a0
+  remove("truncfile");
+     7d2:	00004517          	auipc	a0,0x4
+     7d6:	76650513          	addi	a0,a0,1894 # 4f38 <malloc+0x1b8>
+     7da:	00004097          	auipc	ra,0x4
+     7de:	1ea080e7          	jalr	490(ra) # 49c4 <remove>
+  int fd1 = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC);
+     7e2:	60100593          	li	a1,1537
+     7e6:	00004517          	auipc	a0,0x4
+     7ea:	75250513          	addi	a0,a0,1874 # 4f38 <malloc+0x1b8>
+     7ee:	00004097          	auipc	ra,0x4
+     7f2:	162080e7          	jalr	354(ra) # 4950 <open>
+     7f6:	84aa                	mv	s1,a0
+  write(fd1, "abcd", 4);
+     7f8:	4611                	li	a2,4
+     7fa:	00004597          	auipc	a1,0x4
+     7fe:	74e58593          	addi	a1,a1,1870 # 4f48 <malloc+0x1c8>
+     802:	00004097          	auipc	ra,0x4
+     806:	128080e7          	jalr	296(ra) # 492a <write>
+  close(fd1);
+     80a:	8526                	mv	a0,s1
+     80c:	00004097          	auipc	ra,0x4
+     810:	128080e7          	jalr	296(ra) # 4934 <close>
+  int fd2 = open("truncfile", O_RDONLY);
+     814:	4581                	li	a1,0
+     816:	00004517          	auipc	a0,0x4
+     81a:	72250513          	addi	a0,a0,1826 # 4f38 <malloc+0x1b8>
+     81e:	00004097          	auipc	ra,0x4
+     822:	132080e7          	jalr	306(ra) # 4950 <open>
+     826:	84aa                	mv	s1,a0
+  int n = read(fd2, buf, sizeof(buf));
+     828:	02000613          	li	a2,32
+     82c:	fa040593          	addi	a1,s0,-96
+     830:	00004097          	auipc	ra,0x4
+     834:	0f0080e7          	jalr	240(ra) # 4920 <read>
+  if(n != 4){
+     838:	4791                	li	a5,4
+     83a:	0cf51e63          	bne	a0,a5,916 <truncate1+0x158>
+  fd1 = open("truncfile", O_WRONLY|O_TRUNC);
+     83e:	40100593          	li	a1,1025
+     842:	00004517          	auipc	a0,0x4
+     846:	6f650513          	addi	a0,a0,1782 # 4f38 <malloc+0x1b8>
+     84a:	00004097          	auipc	ra,0x4
+     84e:	106080e7          	jalr	262(ra) # 4950 <open>
+     852:	89aa                	mv	s3,a0
+  int fd3 = open("truncfile", O_RDONLY);
+     854:	4581                	li	a1,0
+     856:	00004517          	auipc	a0,0x4
+     85a:	6e250513          	addi	a0,a0,1762 # 4f38 <malloc+0x1b8>
+     85e:	00004097          	auipc	ra,0x4
+     862:	0f2080e7          	jalr	242(ra) # 4950 <open>
+     866:	892a                	mv	s2,a0
+  n = read(fd3, buf, sizeof(buf));
+     868:	02000613          	li	a2,32
+     86c:	fa040593          	addi	a1,s0,-96
+     870:	00004097          	auipc	ra,0x4
+     874:	0b0080e7          	jalr	176(ra) # 4920 <read>
+     878:	8a2a                	mv	s4,a0
+  if(n != 0){
+     87a:	ed4d                	bnez	a0,934 <truncate1+0x176>
+  n = read(fd2, buf, sizeof(buf));
+     87c:	02000613          	li	a2,32
+     880:	fa040593          	addi	a1,s0,-96
+     884:	8526                	mv	a0,s1
+     886:	00004097          	auipc	ra,0x4
+     88a:	09a080e7          	jalr	154(ra) # 4920 <read>
+     88e:	8a2a                	mv	s4,a0
+  if(n != 0){
+     890:	e971                	bnez	a0,964 <truncate1+0x1a6>
+  write(fd1, "abcdef", 6);
+     892:	4619                	li	a2,6
+     894:	00005597          	auipc	a1,0x5
+     898:	91c58593          	addi	a1,a1,-1764 # 51b0 <malloc+0x430>
+     89c:	854e                	mv	a0,s3
+     89e:	00004097          	auipc	ra,0x4
+     8a2:	08c080e7          	jalr	140(ra) # 492a <write>
+  n = read(fd3, buf, sizeof(buf));
+     8a6:	02000613          	li	a2,32
+     8aa:	fa040593          	addi	a1,s0,-96
+     8ae:	854a                	mv	a0,s2
+     8b0:	00004097          	auipc	ra,0x4
+     8b4:	070080e7          	jalr	112(ra) # 4920 <read>
+  if(n != 6){
+     8b8:	4799                	li	a5,6
+     8ba:	0cf51d63          	bne	a0,a5,994 <truncate1+0x1d6>
+  n = read(fd2, buf, sizeof(buf));
+     8be:	02000613          	li	a2,32
+     8c2:	fa040593          	addi	a1,s0,-96
+     8c6:	8526                	mv	a0,s1
+     8c8:	00004097          	auipc	ra,0x4
+     8cc:	058080e7          	jalr	88(ra) # 4920 <read>
+  if(n != 2){
+     8d0:	4789                	li	a5,2
+     8d2:	0ef51063          	bne	a0,a5,9b2 <truncate1+0x1f4>
+  remove("truncfile");
+     8d6:	00004517          	auipc	a0,0x4
+     8da:	66250513          	addi	a0,a0,1634 # 4f38 <malloc+0x1b8>
+     8de:	00004097          	auipc	ra,0x4
+     8e2:	0e6080e7          	jalr	230(ra) # 49c4 <remove>
+  close(fd1);
+     8e6:	854e                	mv	a0,s3
+     8e8:	00004097          	auipc	ra,0x4
+     8ec:	04c080e7          	jalr	76(ra) # 4934 <close>
+  close(fd2);
+     8f0:	8526                	mv	a0,s1
+     8f2:	00004097          	auipc	ra,0x4
+     8f6:	042080e7          	jalr	66(ra) # 4934 <close>
+  close(fd3);
+     8fa:	854a                	mv	a0,s2
+     8fc:	00004097          	auipc	ra,0x4
+     900:	038080e7          	jalr	56(ra) # 4934 <close>
+}
+     904:	60e6                	ld	ra,88(sp)
+     906:	6446                	ld	s0,80(sp)
+     908:	64a6                	ld	s1,72(sp)
+     90a:	6906                	ld	s2,64(sp)
+     90c:	79e2                	ld	s3,56(sp)
+     90e:	7a42                	ld	s4,48(sp)
+     910:	7aa2                	ld	s5,40(sp)
+     912:	6125                	addi	sp,sp,96
+     914:	8082                	ret
+    printf("%s: read %d bytes, wanted 4\n", s, n);
+     916:	862a                	mv	a2,a0
+     918:	85d6                	mv	a1,s5
+     91a:	00005517          	auipc	a0,0x5
+     91e:	83650513          	addi	a0,a0,-1994 # 5150 <malloc+0x3d0>
+     922:	00004097          	auipc	ra,0x4
+     926:	3a6080e7          	jalr	934(ra) # 4cc8 <printf>
+    exit(1);
+     92a:	4505                	li	a0,1
+     92c:	00004097          	auipc	ra,0x4
+     930:	fd8080e7          	jalr	-40(ra) # 4904 <exit>
+    printf("aaa fd3=%d\n", fd3);
+     934:	85ca                	mv	a1,s2
+     936:	00005517          	auipc	a0,0x5
+     93a:	83a50513          	addi	a0,a0,-1990 # 5170 <malloc+0x3f0>
+     93e:	00004097          	auipc	ra,0x4
+     942:	38a080e7          	jalr	906(ra) # 4cc8 <printf>
+    printf("%s: read %d bytes, wanted 0\n", s, n);
+     946:	8652                	mv	a2,s4
+     948:	85d6                	mv	a1,s5
+     94a:	00005517          	auipc	a0,0x5
+     94e:	83650513          	addi	a0,a0,-1994 # 5180 <malloc+0x400>
+     952:	00004097          	auipc	ra,0x4
+     956:	376080e7          	jalr	886(ra) # 4cc8 <printf>
+    exit(1);
+     95a:	4505                	li	a0,1
+     95c:	00004097          	auipc	ra,0x4
+     960:	fa8080e7          	jalr	-88(ra) # 4904 <exit>
+    printf("bbb fd2=%d\n", fd2);
+     964:	85a6                	mv	a1,s1
+     966:	00005517          	auipc	a0,0x5
+     96a:	83a50513          	addi	a0,a0,-1990 # 51a0 <malloc+0x420>
+     96e:	00004097          	auipc	ra,0x4
+     972:	35a080e7          	jalr	858(ra) # 4cc8 <printf>
+    printf("%s: read %d bytes, wanted 0\n", s, n);
+     976:	8652                	mv	a2,s4
+     978:	85d6                	mv	a1,s5
+     97a:	00005517          	auipc	a0,0x5
+     97e:	80650513          	addi	a0,a0,-2042 # 5180 <malloc+0x400>
+     982:	00004097          	auipc	ra,0x4
+     986:	346080e7          	jalr	838(ra) # 4cc8 <printf>
+    exit(1);
+     98a:	4505                	li	a0,1
+     98c:	00004097          	auipc	ra,0x4
+     990:	f78080e7          	jalr	-136(ra) # 4904 <exit>
+    printf("%s: read %d bytes, wanted 6\n", s, n);
+     994:	862a                	mv	a2,a0
+     996:	85d6                	mv	a1,s5
+     998:	00005517          	auipc	a0,0x5
+     99c:	82050513          	addi	a0,a0,-2016 # 51b8 <malloc+0x438>
+     9a0:	00004097          	auipc	ra,0x4
+     9a4:	328080e7          	jalr	808(ra) # 4cc8 <printf>
+    exit(1);
+     9a8:	4505                	li	a0,1
+     9aa:	00004097          	auipc	ra,0x4
+     9ae:	f5a080e7          	jalr	-166(ra) # 4904 <exit>
+    printf("%s: read %d bytes, wanted 2\n", s, n);
+     9b2:	862a                	mv	a2,a0
+     9b4:	85d6                	mv	a1,s5
+     9b6:	00005517          	auipc	a0,0x5
+     9ba:	82250513          	addi	a0,a0,-2014 # 51d8 <malloc+0x458>
+     9be:	00004097          	auipc	ra,0x4
+     9c2:	30a080e7          	jalr	778(ra) # 4cc8 <printf>
+    exit(1);
+     9c6:	4505                	li	a0,1
+     9c8:	00004097          	auipc	ra,0x4
+     9cc:	f3c080e7          	jalr	-196(ra) # 4904 <exit>
+
+00000000000009d0 <writetest>:
+{
+     9d0:	7139                	addi	sp,sp,-64
+     9d2:	fc06                	sd	ra,56(sp)
+     9d4:	f822                	sd	s0,48(sp)
+     9d6:	f426                	sd	s1,40(sp)
+     9d8:	f04a                	sd	s2,32(sp)
+     9da:	ec4e                	sd	s3,24(sp)
+     9dc:	e852                	sd	s4,16(sp)
+     9de:	e456                	sd	s5,8(sp)
+     9e0:	e05a                	sd	s6,0(sp)
+     9e2:	0080                	addi	s0,sp,64
+     9e4:	8b2a                	mv	s6,a0
+  fd = open("small", O_CREATE|O_RDWR);
+     9e6:	20200593          	li	a1,514
+     9ea:	00005517          	auipc	a0,0x5
+     9ee:	80e50513          	addi	a0,a0,-2034 # 51f8 <malloc+0x478>
+     9f2:	00004097          	auipc	ra,0x4
+     9f6:	f5e080e7          	jalr	-162(ra) # 4950 <open>
+  if(fd < 0){
+     9fa:	0a054d63          	bltz	a0,ab4 <writetest+0xe4>
+     9fe:	892a                	mv	s2,a0
+     a00:	4481                	li	s1,0
+    if(write(fd, "aaaaaaaaaa", SZ) != SZ){
+     a02:	00005997          	auipc	s3,0x5
+     a06:	81e98993          	addi	s3,s3,-2018 # 5220 <malloc+0x4a0>
+    if(write(fd, "bbbbbbbbbb", SZ) != SZ){
+     a0a:	00005a97          	auipc	s5,0x5
+     a0e:	84ea8a93          	addi	s5,s5,-1970 # 5258 <malloc+0x4d8>
+  for(i = 0; i < N; i++){
+     a12:	06400a13          	li	s4,100
+    if(write(fd, "aaaaaaaaaa", SZ) != SZ){
+     a16:	4629                	li	a2,10
+     a18:	85ce                	mv	a1,s3
+     a1a:	854a                	mv	a0,s2
+     a1c:	00004097          	auipc	ra,0x4
+     a20:	f0e080e7          	jalr	-242(ra) # 492a <write>
+     a24:	47a9                	li	a5,10
+     a26:	0af51563          	bne	a0,a5,ad0 <writetest+0x100>
+    if(write(fd, "bbbbbbbbbb", SZ) != SZ){
+     a2a:	4629                	li	a2,10
+     a2c:	85d6                	mv	a1,s5
+     a2e:	854a                	mv	a0,s2
+     a30:	00004097          	auipc	ra,0x4
+     a34:	efa080e7          	jalr	-262(ra) # 492a <write>
+     a38:	47a9                	li	a5,10
+     a3a:	0af51963          	bne	a0,a5,aec <writetest+0x11c>
+  for(i = 0; i < N; i++){
+     a3e:	2485                	addiw	s1,s1,1
+     a40:	fd449be3          	bne	s1,s4,a16 <writetest+0x46>
+  close(fd);
+     a44:	854a                	mv	a0,s2
+     a46:	00004097          	auipc	ra,0x4
+     a4a:	eee080e7          	jalr	-274(ra) # 4934 <close>
+  fd = open("small", O_RDONLY);
+     a4e:	4581                	li	a1,0
+     a50:	00004517          	auipc	a0,0x4
+     a54:	7a850513          	addi	a0,a0,1960 # 51f8 <malloc+0x478>
+     a58:	00004097          	auipc	ra,0x4
+     a5c:	ef8080e7          	jalr	-264(ra) # 4950 <open>
+     a60:	84aa                	mv	s1,a0
+  if(fd < 0){
+     a62:	0a054363          	bltz	a0,b08 <writetest+0x138>
+  i = read(fd, buf, N*SZ*2);
+     a66:	7d000613          	li	a2,2000
+     a6a:	0000a597          	auipc	a1,0xa
+     a6e:	e2e58593          	addi	a1,a1,-466 # a898 <buf>
+     a72:	00004097          	auipc	ra,0x4
+     a76:	eae080e7          	jalr	-338(ra) # 4920 <read>
+  if(i != N*SZ*2){
+     a7a:	7d000793          	li	a5,2000
+     a7e:	0af51363          	bne	a0,a5,b24 <writetest+0x154>
+  close(fd);
+     a82:	8526                	mv	a0,s1
+     a84:	00004097          	auipc	ra,0x4
+     a88:	eb0080e7          	jalr	-336(ra) # 4934 <close>
+  if(remove("small") < 0){
+     a8c:	00004517          	auipc	a0,0x4
+     a90:	76c50513          	addi	a0,a0,1900 # 51f8 <malloc+0x478>
+     a94:	00004097          	auipc	ra,0x4
+     a98:	f30080e7          	jalr	-208(ra) # 49c4 <remove>
+     a9c:	0a054263          	bltz	a0,b40 <writetest+0x170>
+}
+     aa0:	70e2                	ld	ra,56(sp)
+     aa2:	7442                	ld	s0,48(sp)
+     aa4:	74a2                	ld	s1,40(sp)
+     aa6:	7902                	ld	s2,32(sp)
+     aa8:	69e2                	ld	s3,24(sp)
+     aaa:	6a42                	ld	s4,16(sp)
+     aac:	6aa2                	ld	s5,8(sp)
+     aae:	6b02                	ld	s6,0(sp)
+     ab0:	6121                	addi	sp,sp,64
+     ab2:	8082                	ret
+    printf("%s: error: creat small failed!\n", s);
+     ab4:	85da                	mv	a1,s6
+     ab6:	00004517          	auipc	a0,0x4
+     aba:	74a50513          	addi	a0,a0,1866 # 5200 <malloc+0x480>
+     abe:	00004097          	auipc	ra,0x4
+     ac2:	20a080e7          	jalr	522(ra) # 4cc8 <printf>
+    exit(1);
+     ac6:	4505                	li	a0,1
+     ac8:	00004097          	auipc	ra,0x4
+     acc:	e3c080e7          	jalr	-452(ra) # 4904 <exit>
+      printf("%s: error: write aa %d new file failed\n", i);
+     ad0:	85a6                	mv	a1,s1
+     ad2:	00004517          	auipc	a0,0x4
+     ad6:	75e50513          	addi	a0,a0,1886 # 5230 <malloc+0x4b0>
+     ada:	00004097          	auipc	ra,0x4
+     ade:	1ee080e7          	jalr	494(ra) # 4cc8 <printf>
+      exit(1);
+     ae2:	4505                	li	a0,1
+     ae4:	00004097          	auipc	ra,0x4
+     ae8:	e20080e7          	jalr	-480(ra) # 4904 <exit>
+      printf("%s: error: write bb %d new file failed\n", i);
+     aec:	85a6                	mv	a1,s1
+     aee:	00004517          	auipc	a0,0x4
+     af2:	77a50513          	addi	a0,a0,1914 # 5268 <malloc+0x4e8>
+     af6:	00004097          	auipc	ra,0x4
+     afa:	1d2080e7          	jalr	466(ra) # 4cc8 <printf>
+      exit(1);
+     afe:	4505                	li	a0,1
+     b00:	00004097          	auipc	ra,0x4
+     b04:	e04080e7          	jalr	-508(ra) # 4904 <exit>
+    printf("%s: error: open small failed!\n", s);
+     b08:	85da                	mv	a1,s6
+     b0a:	00004517          	auipc	a0,0x4
+     b0e:	78650513          	addi	a0,a0,1926 # 5290 <malloc+0x510>
+     b12:	00004097          	auipc	ra,0x4
+     b16:	1b6080e7          	jalr	438(ra) # 4cc8 <printf>
+    exit(1);
+     b1a:	4505                	li	a0,1
+     b1c:	00004097          	auipc	ra,0x4
+     b20:	de8080e7          	jalr	-536(ra) # 4904 <exit>
+    printf("%s: read failed\n", s);
+     b24:	85da                	mv	a1,s6
+     b26:	00004517          	auipc	a0,0x4
+     b2a:	78a50513          	addi	a0,a0,1930 # 52b0 <malloc+0x530>
+     b2e:	00004097          	auipc	ra,0x4
+     b32:	19a080e7          	jalr	410(ra) # 4cc8 <printf>
+    exit(1);
+     b36:	4505                	li	a0,1
+     b38:	00004097          	auipc	ra,0x4
+     b3c:	dcc080e7          	jalr	-564(ra) # 4904 <exit>
+    printf("%s: remove small failed\n", s);
+     b40:	85da                	mv	a1,s6
+     b42:	00004517          	auipc	a0,0x4
+     b46:	78650513          	addi	a0,a0,1926 # 52c8 <malloc+0x548>
+     b4a:	00004097          	auipc	ra,0x4
+     b4e:	17e080e7          	jalr	382(ra) # 4cc8 <printf>
+    exit(1);
+     b52:	4505                	li	a0,1
+     b54:	00004097          	auipc	ra,0x4
+     b58:	db0080e7          	jalr	-592(ra) # 4904 <exit>
+
+0000000000000b5c <writebig>:
+{
+     b5c:	7179                	addi	sp,sp,-48
+     b5e:	f406                	sd	ra,40(sp)
+     b60:	f022                	sd	s0,32(sp)
+     b62:	ec26                	sd	s1,24(sp)
+     b64:	e84a                	sd	s2,16(sp)
+     b66:	e44e                	sd	s3,8(sp)
+     b68:	e052                	sd	s4,0(sp)
+     b6a:	1800                	addi	s0,sp,48
+     b6c:	8a2a                	mv	s4,a0
+  fd = open("big", O_CREATE|O_RDWR);
+     b6e:	20200593          	li	a1,514
+     b72:	00004517          	auipc	a0,0x4
+     b76:	77650513          	addi	a0,a0,1910 # 52e8 <malloc+0x568>
+     b7a:	00004097          	auipc	ra,0x4
+     b7e:	dd6080e7          	jalr	-554(ra) # 4950 <open>
+     b82:	89aa                	mv	s3,a0
+  for(i = 0; i < MAXFILE; i++){
+     b84:	4481                	li	s1,0
+    ((int*)buf)[0] = i;
+     b86:	0000a917          	auipc	s2,0xa
+     b8a:	d1290913          	addi	s2,s2,-750 # a898 <buf>
+  if(fd < 0){
+     b8e:	06054e63          	bltz	a0,c0a <writebig+0xae>
+    ((int*)buf)[0] = i;
+     b92:	00992023          	sw	s1,0(s2)
+    if(write(fd, buf, BSIZE) != BSIZE){
+     b96:	20000613          	li	a2,512
+     b9a:	85ca                	mv	a1,s2
+     b9c:	854e                	mv	a0,s3
+     b9e:	00004097          	auipc	ra,0x4
+     ba2:	d8c080e7          	jalr	-628(ra) # 492a <write>
+     ba6:	20000793          	li	a5,512
+     baa:	06f51e63          	bne	a0,a5,c26 <writebig+0xca>
+  for(i = 0; i < MAXFILE; i++){
+     bae:	2485                	addiw	s1,s1,1
+     bb0:	20000793          	li	a5,512
+     bb4:	fcf49fe3          	bne	s1,a5,b92 <writebig+0x36>
+  close(fd);
+     bb8:	854e                	mv	a0,s3
+     bba:	00004097          	auipc	ra,0x4
+     bbe:	d7a080e7          	jalr	-646(ra) # 4934 <close>
+  fd = open("big", O_RDONLY);
+     bc2:	4581                	li	a1,0
+     bc4:	00004517          	auipc	a0,0x4
+     bc8:	72450513          	addi	a0,a0,1828 # 52e8 <malloc+0x568>
+     bcc:	00004097          	auipc	ra,0x4
+     bd0:	d84080e7          	jalr	-636(ra) # 4950 <open>
+     bd4:	89aa                	mv	s3,a0
+  n = 0;
+     bd6:	4481                	li	s1,0
+    i = read(fd, buf, BSIZE);
+     bd8:	0000a917          	auipc	s2,0xa
+     bdc:	cc090913          	addi	s2,s2,-832 # a898 <buf>
+  if(fd < 0){
+     be0:	06054163          	bltz	a0,c42 <writebig+0xe6>
+    i = read(fd, buf, BSIZE);
+     be4:	20000613          	li	a2,512
+     be8:	85ca                	mv	a1,s2
+     bea:	854e                	mv	a0,s3
+     bec:	00004097          	auipc	ra,0x4
+     bf0:	d34080e7          	jalr	-716(ra) # 4920 <read>
+    if(i == 0){
+     bf4:	c52d                	beqz	a0,c5e <writebig+0x102>
+    } else if(i != BSIZE){
+     bf6:	20000793          	li	a5,512
+     bfa:	0af51c63          	bne	a0,a5,cb2 <writebig+0x156>
+    if(((int*)buf)[0] != n){
+     bfe:	00092603          	lw	a2,0(s2)
+     c02:	0c961663          	bne	a2,s1,cce <writebig+0x172>
+    n++;
+     c06:	2485                	addiw	s1,s1,1
+    i = read(fd, buf, BSIZE);
+     c08:	bff1                	j	be4 <writebig+0x88>
+    printf("%s: error: creat big failed!\n", s);
+     c0a:	85d2                	mv	a1,s4
+     c0c:	00004517          	auipc	a0,0x4
+     c10:	6e450513          	addi	a0,a0,1764 # 52f0 <malloc+0x570>
+     c14:	00004097          	auipc	ra,0x4
+     c18:	0b4080e7          	jalr	180(ra) # 4cc8 <printf>
+    exit(1);
+     c1c:	4505                	li	a0,1
+     c1e:	00004097          	auipc	ra,0x4
+     c22:	ce6080e7          	jalr	-794(ra) # 4904 <exit>
+      printf("%s: error: write big file failed\n", i);
+     c26:	85a6                	mv	a1,s1
+     c28:	00004517          	auipc	a0,0x4
+     c2c:	6e850513          	addi	a0,a0,1768 # 5310 <malloc+0x590>
+     c30:	00004097          	auipc	ra,0x4
+     c34:	098080e7          	jalr	152(ra) # 4cc8 <printf>
+      exit(1);
+     c38:	4505                	li	a0,1
+     c3a:	00004097          	auipc	ra,0x4
+     c3e:	cca080e7          	jalr	-822(ra) # 4904 <exit>
+    printf("%s: error: open big failed!\n", s);
+     c42:	85d2                	mv	a1,s4
+     c44:	00004517          	auipc	a0,0x4
+     c48:	6f450513          	addi	a0,a0,1780 # 5338 <malloc+0x5b8>
+     c4c:	00004097          	auipc	ra,0x4
+     c50:	07c080e7          	jalr	124(ra) # 4cc8 <printf>
+    exit(1);
+     c54:	4505                	li	a0,1
+     c56:	00004097          	auipc	ra,0x4
+     c5a:	cae080e7          	jalr	-850(ra) # 4904 <exit>
+      if(n == MAXFILE - 1){
+     c5e:	1ff00793          	li	a5,511
+     c62:	02f48963          	beq	s1,a5,c94 <writebig+0x138>
+  close(fd);
+     c66:	854e                	mv	a0,s3
+     c68:	00004097          	auipc	ra,0x4
+     c6c:	ccc080e7          	jalr	-820(ra) # 4934 <close>
+  if(remove("big") < 0){
+     c70:	00004517          	auipc	a0,0x4
+     c74:	67850513          	addi	a0,a0,1656 # 52e8 <malloc+0x568>
+     c78:	00004097          	auipc	ra,0x4
+     c7c:	d4c080e7          	jalr	-692(ra) # 49c4 <remove>
+     c80:	06054563          	bltz	a0,cea <writebig+0x18e>
+}
+     c84:	70a2                	ld	ra,40(sp)
+     c86:	7402                	ld	s0,32(sp)
+     c88:	64e2                	ld	s1,24(sp)
+     c8a:	6942                	ld	s2,16(sp)
+     c8c:	69a2                	ld	s3,8(sp)
+     c8e:	6a02                	ld	s4,0(sp)
+     c90:	6145                	addi	sp,sp,48
+     c92:	8082                	ret
+        printf("%s: read only %d blocks from big", n);
+     c94:	1ff00593          	li	a1,511
+     c98:	00004517          	auipc	a0,0x4
+     c9c:	6c050513          	addi	a0,a0,1728 # 5358 <malloc+0x5d8>
+     ca0:	00004097          	auipc	ra,0x4
+     ca4:	028080e7          	jalr	40(ra) # 4cc8 <printf>
+        exit(1);
+     ca8:	4505                	li	a0,1
+     caa:	00004097          	auipc	ra,0x4
+     cae:	c5a080e7          	jalr	-934(ra) # 4904 <exit>
+      printf("%s: read failed %d\n", i);
+     cb2:	85aa                	mv	a1,a0
+     cb4:	00004517          	auipc	a0,0x4
+     cb8:	6cc50513          	addi	a0,a0,1740 # 5380 <malloc+0x600>
+     cbc:	00004097          	auipc	ra,0x4
+     cc0:	00c080e7          	jalr	12(ra) # 4cc8 <printf>
+      exit(1);
+     cc4:	4505                	li	a0,1
+     cc6:	00004097          	auipc	ra,0x4
+     cca:	c3e080e7          	jalr	-962(ra) # 4904 <exit>
+      printf("%s: read content of block %d is %d\n",
+     cce:	85a6                	mv	a1,s1
+     cd0:	00004517          	auipc	a0,0x4
+     cd4:	6c850513          	addi	a0,a0,1736 # 5398 <malloc+0x618>
+     cd8:	00004097          	auipc	ra,0x4
+     cdc:	ff0080e7          	jalr	-16(ra) # 4cc8 <printf>
+      exit(1);
+     ce0:	4505                	li	a0,1
+     ce2:	00004097          	auipc	ra,0x4
+     ce6:	c22080e7          	jalr	-990(ra) # 4904 <exit>
+    printf("%s: remove big failed\n", s);
+     cea:	85d2                	mv	a1,s4
+     cec:	00004517          	auipc	a0,0x4
+     cf0:	6d450513          	addi	a0,a0,1748 # 53c0 <malloc+0x640>
+     cf4:	00004097          	auipc	ra,0x4
+     cf8:	fd4080e7          	jalr	-44(ra) # 4cc8 <printf>
+    exit(1);
+     cfc:	4505                	li	a0,1
+     cfe:	00004097          	auipc	ra,0x4
+     d02:	c06080e7          	jalr	-1018(ra) # 4904 <exit>
+
+0000000000000d06 <removeread>:
+{
+     d06:	7179                	addi	sp,sp,-48
+     d08:	f406                	sd	ra,40(sp)
+     d0a:	f022                	sd	s0,32(sp)
+     d0c:	ec26                	sd	s1,24(sp)
+     d0e:	e84a                	sd	s2,16(sp)
+     d10:	e44e                	sd	s3,8(sp)
+     d12:	1800                	addi	s0,sp,48
+     d14:	89aa                	mv	s3,a0
+  fd = open("removeread", O_CREATE | O_RDWR);
+     d16:	20200593          	li	a1,514
+     d1a:	00004517          	auipc	a0,0x4
+     d1e:	6be50513          	addi	a0,a0,1726 # 53d8 <malloc+0x658>
+     d22:	00004097          	auipc	ra,0x4
+     d26:	c2e080e7          	jalr	-978(ra) # 4950 <open>
+  if(fd < 0){
+     d2a:	0e054763          	bltz	a0,e18 <removeread+0x112>
+     d2e:	84aa                	mv	s1,a0
+  write(fd, "hello", SZ);
+     d30:	4615                	li	a2,5
+     d32:	00004597          	auipc	a1,0x4
+     d36:	6d658593          	addi	a1,a1,1750 # 5408 <malloc+0x688>
+     d3a:	00004097          	auipc	ra,0x4
+     d3e:	bf0080e7          	jalr	-1040(ra) # 492a <write>
+  close(fd);
+     d42:	8526                	mv	a0,s1
+     d44:	00004097          	auipc	ra,0x4
+     d48:	bf0080e7          	jalr	-1040(ra) # 4934 <close>
+  fd = open("removeread", O_RDWR);
+     d4c:	4589                	li	a1,2
+     d4e:	00004517          	auipc	a0,0x4
+     d52:	68a50513          	addi	a0,a0,1674 # 53d8 <malloc+0x658>
+     d56:	00004097          	auipc	ra,0x4
+     d5a:	bfa080e7          	jalr	-1030(ra) # 4950 <open>
+     d5e:	84aa                	mv	s1,a0
+  if(fd < 0){
+     d60:	0c054a63          	bltz	a0,e34 <removeread+0x12e>
+  if(remove("removeread") != 0){
+     d64:	00004517          	auipc	a0,0x4
+     d68:	67450513          	addi	a0,a0,1652 # 53d8 <malloc+0x658>
+     d6c:	00004097          	auipc	ra,0x4
+     d70:	c58080e7          	jalr	-936(ra) # 49c4 <remove>
+     d74:	ed71                	bnez	a0,e50 <removeread+0x14a>
+  fd1 = open("removeread", O_CREATE | O_RDWR);
+     d76:	20200593          	li	a1,514
+     d7a:	00004517          	auipc	a0,0x4
+     d7e:	65e50513          	addi	a0,a0,1630 # 53d8 <malloc+0x658>
+     d82:	00004097          	auipc	ra,0x4
+     d86:	bce080e7          	jalr	-1074(ra) # 4950 <open>
+     d8a:	892a                	mv	s2,a0
+  write(fd1, "yyy", 3);
+     d8c:	460d                	li	a2,3
+     d8e:	00004597          	auipc	a1,0x4
+     d92:	6c258593          	addi	a1,a1,1730 # 5450 <malloc+0x6d0>
+     d96:	00004097          	auipc	ra,0x4
+     d9a:	b94080e7          	jalr	-1132(ra) # 492a <write>
+  close(fd1);
+     d9e:	854a                	mv	a0,s2
+     da0:	00004097          	auipc	ra,0x4
+     da4:	b94080e7          	jalr	-1132(ra) # 4934 <close>
+  if(read(fd, buf, sizeof(buf)) != SZ){
+     da8:	6609                	lui	a2,0x2
+     daa:	80060613          	addi	a2,a2,-2048 # 1800 <forkfork+0x42>
+     dae:	0000a597          	auipc	a1,0xa
+     db2:	aea58593          	addi	a1,a1,-1302 # a898 <buf>
+     db6:	8526                	mv	a0,s1
+     db8:	00004097          	auipc	ra,0x4
+     dbc:	b68080e7          	jalr	-1176(ra) # 4920 <read>
+     dc0:	4795                	li	a5,5
+     dc2:	0af51563          	bne	a0,a5,e6c <removeread+0x166>
+  if(buf[0] != 'h'){
+     dc6:	0000a717          	auipc	a4,0xa
+     dca:	ad274703          	lbu	a4,-1326(a4) # a898 <buf>
+     dce:	06800793          	li	a5,104
+     dd2:	0af71b63          	bne	a4,a5,e88 <removeread+0x182>
+  if(write(fd, buf, 10) != 10){
+     dd6:	4629                	li	a2,10
+     dd8:	0000a597          	auipc	a1,0xa
+     ddc:	ac058593          	addi	a1,a1,-1344 # a898 <buf>
+     de0:	8526                	mv	a0,s1
+     de2:	00004097          	auipc	ra,0x4
+     de6:	b48080e7          	jalr	-1208(ra) # 492a <write>
+     dea:	47a9                	li	a5,10
+     dec:	0af51c63          	bne	a0,a5,ea4 <removeread+0x19e>
+  close(fd);
+     df0:	8526                	mv	a0,s1
+     df2:	00004097          	auipc	ra,0x4
+     df6:	b42080e7          	jalr	-1214(ra) # 4934 <close>
+  remove("removeread");
+     dfa:	00004517          	auipc	a0,0x4
+     dfe:	5de50513          	addi	a0,a0,1502 # 53d8 <malloc+0x658>
+     e02:	00004097          	auipc	ra,0x4
+     e06:	bc2080e7          	jalr	-1086(ra) # 49c4 <remove>
+}
+     e0a:	70a2                	ld	ra,40(sp)
+     e0c:	7402                	ld	s0,32(sp)
+     e0e:	64e2                	ld	s1,24(sp)
+     e10:	6942                	ld	s2,16(sp)
+     e12:	69a2                	ld	s3,8(sp)
+     e14:	6145                	addi	sp,sp,48
+     e16:	8082                	ret
+    printf("%s: create removeread failed\n", s);
+     e18:	85ce                	mv	a1,s3
+     e1a:	00004517          	auipc	a0,0x4
+     e1e:	5ce50513          	addi	a0,a0,1486 # 53e8 <malloc+0x668>
+     e22:	00004097          	auipc	ra,0x4
+     e26:	ea6080e7          	jalr	-346(ra) # 4cc8 <printf>
+    exit(1);
+     e2a:	4505                	li	a0,1
+     e2c:	00004097          	auipc	ra,0x4
+     e30:	ad8080e7          	jalr	-1320(ra) # 4904 <exit>
+    printf("%s: open removeread failed\n", s);
+     e34:	85ce                	mv	a1,s3
+     e36:	00004517          	auipc	a0,0x4
+     e3a:	5da50513          	addi	a0,a0,1498 # 5410 <malloc+0x690>
+     e3e:	00004097          	auipc	ra,0x4
+     e42:	e8a080e7          	jalr	-374(ra) # 4cc8 <printf>
+    exit(1);
+     e46:	4505                	li	a0,1
+     e48:	00004097          	auipc	ra,0x4
+     e4c:	abc080e7          	jalr	-1348(ra) # 4904 <exit>
+    printf("%s: remove removeread failed\n", s);
+     e50:	85ce                	mv	a1,s3
+     e52:	00004517          	auipc	a0,0x4
+     e56:	5de50513          	addi	a0,a0,1502 # 5430 <malloc+0x6b0>
+     e5a:	00004097          	auipc	ra,0x4
+     e5e:	e6e080e7          	jalr	-402(ra) # 4cc8 <printf>
+    exit(1);
+     e62:	4505                	li	a0,1
+     e64:	00004097          	auipc	ra,0x4
+     e68:	aa0080e7          	jalr	-1376(ra) # 4904 <exit>
+    printf("%s: removeread read failed", s);
+     e6c:	85ce                	mv	a1,s3
+     e6e:	00004517          	auipc	a0,0x4
+     e72:	5ea50513          	addi	a0,a0,1514 # 5458 <malloc+0x6d8>
+     e76:	00004097          	auipc	ra,0x4
+     e7a:	e52080e7          	jalr	-430(ra) # 4cc8 <printf>
+    exit(1);
+     e7e:	4505                	li	a0,1
+     e80:	00004097          	auipc	ra,0x4
+     e84:	a84080e7          	jalr	-1404(ra) # 4904 <exit>
+    printf("%s: removeread wrong data\n", s);
+     e88:	85ce                	mv	a1,s3
+     e8a:	00004517          	auipc	a0,0x4
+     e8e:	5ee50513          	addi	a0,a0,1518 # 5478 <malloc+0x6f8>
+     e92:	00004097          	auipc	ra,0x4
+     e96:	e36080e7          	jalr	-458(ra) # 4cc8 <printf>
+    exit(1);
+     e9a:	4505                	li	a0,1
+     e9c:	00004097          	auipc	ra,0x4
+     ea0:	a68080e7          	jalr	-1432(ra) # 4904 <exit>
+    printf("%s: removeread write failed\n", s);
+     ea4:	85ce                	mv	a1,s3
+     ea6:	00004517          	auipc	a0,0x4
+     eaa:	5f250513          	addi	a0,a0,1522 # 5498 <malloc+0x718>
+     eae:	00004097          	auipc	ra,0x4
+     eb2:	e1a080e7          	jalr	-486(ra) # 4cc8 <printf>
+    exit(1);
+     eb6:	4505                	li	a0,1
+     eb8:	00004097          	auipc	ra,0x4
+     ebc:	a4c080e7          	jalr	-1460(ra) # 4904 <exit>
+
+0000000000000ec0 <pgbug>:
+{
+     ec0:	7179                	addi	sp,sp,-48
+     ec2:	f406                	sd	ra,40(sp)
+     ec4:	f022                	sd	s0,32(sp)
+     ec6:	ec26                	sd	s1,24(sp)
+     ec8:	1800                	addi	s0,sp,48
+  argv[0] = 0;
+     eca:	fc043c23          	sd	zero,-40(s0)
+  exec((char*)0xeaeb0b5b00002f5e, argv);
+     ece:	00006497          	auipc	s1,0x6
+     ed2:	dc24b483          	ld	s1,-574(s1) # 6c90 <malloc+0x1f10>
+     ed6:	fd840593          	addi	a1,s0,-40
+     eda:	8526                	mv	a0,s1
+     edc:	00004097          	auipc	ra,0x4
+     ee0:	a6a080e7          	jalr	-1430(ra) # 4946 <exec>
+  pipe((int*)0xeaeb0b5b00002f5e);
+     ee4:	8526                	mv	a0,s1
+     ee6:	00004097          	auipc	ra,0x4
+     eea:	a30080e7          	jalr	-1488(ra) # 4916 <pipe>
+  exit(0);
+     eee:	4501                	li	a0,0
+     ef0:	00004097          	auipc	ra,0x4
+     ef4:	a14080e7          	jalr	-1516(ra) # 4904 <exit>
+
+0000000000000ef8 <badarg>:
+
+// regression test. test whether exec() leaks memory if one of the
+// arguments is invalid. the test passes if the kernel doesn't panic.
+void
+badarg(char *s)
+{
+     ef8:	7139                	addi	sp,sp,-64
+     efa:	fc06                	sd	ra,56(sp)
+     efc:	f822                	sd	s0,48(sp)
+     efe:	f426                	sd	s1,40(sp)
+     f00:	f04a                	sd	s2,32(sp)
+     f02:	ec4e                	sd	s3,24(sp)
+     f04:	e852                	sd	s4,16(sp)
+     f06:	0080                	addi	s0,sp,64
+     f08:	64b1                	lui	s1,0xc
+     f0a:	35048493          	addi	s1,s1,848 # c350 <__BSS_END__+0x2a0>
+  for(int i = 0; i < 50000; i++){
+    char *argv[2];
+    argv[0] = (char*)0xffffffff;
+     f0e:	597d                	li	s2,-1
+     f10:	02095913          	srli	s2,s2,0x20
+    argv[1] = 0;
+    exec("echo", argv);
+     f14:	fc040a13          	addi	s4,s0,-64
+     f18:	00004997          	auipc	s3,0x4
+     f1c:	fc898993          	addi	s3,s3,-56 # 4ee0 <malloc+0x160>
+    argv[0] = (char*)0xffffffff;
+     f20:	fd243023          	sd	s2,-64(s0)
+    argv[1] = 0;
+     f24:	fc043423          	sd	zero,-56(s0)
+    exec("echo", argv);
+     f28:	85d2                	mv	a1,s4
+     f2a:	854e                	mv	a0,s3
+     f2c:	00004097          	auipc	ra,0x4
+     f30:	a1a080e7          	jalr	-1510(ra) # 4946 <exec>
+  for(int i = 0; i < 50000; i++){
+     f34:	34fd                	addiw	s1,s1,-1
+     f36:	f4ed                	bnez	s1,f20 <badarg+0x28>
+  }
+  
+  exit(0);
+     f38:	4501                	li	a0,0
+     f3a:	00004097          	auipc	ra,0x4
+     f3e:	9ca080e7          	jalr	-1590(ra) # 4904 <exit>
+
+0000000000000f42 <copyinstr2>:
+{
+     f42:	714d                	addi	sp,sp,-336
+     f44:	e686                	sd	ra,328(sp)
+     f46:	e2a2                	sd	s0,320(sp)
+     f48:	0a80                	addi	s0,sp,336
+  for(int i = 0; i < MAXPATH; i++)
+     f4a:	ee840793          	addi	a5,s0,-280
+     f4e:	fec40693          	addi	a3,s0,-20
+    b[i] = 'x';
+     f52:	07800713          	li	a4,120
+     f56:	00e78023          	sb	a4,0(a5)
+  for(int i = 0; i < MAXPATH; i++)
+     f5a:	0785                	addi	a5,a5,1
+     f5c:	fed79de3          	bne	a5,a3,f56 <copyinstr2+0x14>
+  b[MAXPATH] = '\0';
+     f60:	fe040623          	sb	zero,-20(s0)
+  int ret = remove(b);
+     f64:	ee840513          	addi	a0,s0,-280
+     f68:	00004097          	auipc	ra,0x4
+     f6c:	a5c080e7          	jalr	-1444(ra) # 49c4 <remove>
+  if(ret != -1){
+     f70:	57fd                	li	a5,-1
+     f72:	0cf51663          	bne	a0,a5,103e <copyinstr2+0xfc>
+  int fd = open(b, O_CREATE | O_WRONLY);
+     f76:	20100593          	li	a1,513
+     f7a:	ee840513          	addi	a0,s0,-280
+     f7e:	00004097          	auipc	ra,0x4
+     f82:	9d2080e7          	jalr	-1582(ra) # 4950 <open>
+  if(fd != -1){
+     f86:	57fd                	li	a5,-1
+     f88:	0cf51b63          	bne	a0,a5,105e <copyinstr2+0x11c>
+  char *args[] = { "xx", 0 };
+     f8c:	00005797          	auipc	a5,0x5
+     f90:	14478793          	addi	a5,a5,324 # 60d0 <malloc+0x1350>
+     f94:	ecf43c23          	sd	a5,-296(s0)
+     f98:	ee043023          	sd	zero,-288(s0)
+  ret = exec(b, args);
+     f9c:	ed840593          	addi	a1,s0,-296
+     fa0:	ee840513          	addi	a0,s0,-280
+     fa4:	00004097          	auipc	ra,0x4
+     fa8:	9a2080e7          	jalr	-1630(ra) # 4946 <exec>
+  if(ret != -1){
+     fac:	57fd                	li	a5,-1
+     fae:	0cf51863          	bne	a0,a5,107e <copyinstr2+0x13c>
+  int pid = fork();
+     fb2:	00004097          	auipc	ra,0x4
+     fb6:	94a080e7          	jalr	-1718(ra) # 48fc <fork>
+  if(pid < 0){
+     fba:	0e054263          	bltz	a0,109e <copyinstr2+0x15c>
+  if(pid == 0){
+     fbe:	10051363          	bnez	a0,10c4 <copyinstr2+0x182>
+     fc2:	00006797          	auipc	a5,0x6
+     fc6:	1be78793          	addi	a5,a5,446 # 7180 <big.0>
+     fca:	00007697          	auipc	a3,0x7
+     fce:	1b668693          	addi	a3,a3,438 # 8180 <__global_pointer$+0x908>
+      big[i] = 'x';
+     fd2:	07800713          	li	a4,120
+     fd6:	00e78023          	sb	a4,0(a5)
+    for(int i = 0; i < PGSIZE; i++)
+     fda:	0785                	addi	a5,a5,1
+     fdc:	fed79de3          	bne	a5,a3,fd6 <copyinstr2+0x94>
+    big[PGSIZE] = '\0';
+     fe0:	00007797          	auipc	a5,0x7
+     fe4:	1a078023          	sb	zero,416(a5) # 8180 <__global_pointer$+0x908>
+    char *args2[] = { big, big, big, 0 };
+     fe8:	00006797          	auipc	a5,0x6
+     fec:	d2878793          	addi	a5,a5,-728 # 6d10 <__DATA_BEGIN__>
+     ff0:	6390                	ld	a2,0(a5)
+     ff2:	6794                	ld	a3,8(a5)
+     ff4:	6b98                	ld	a4,16(a5)
+     ff6:	6f9c                	ld	a5,24(a5)
+     ff8:	eac43823          	sd	a2,-336(s0)
+     ffc:	ead43c23          	sd	a3,-328(s0)
+    1000:	ece43023          	sd	a4,-320(s0)
+    1004:	ecf43423          	sd	a5,-312(s0)
+    ret = exec("echo", args2);
+    1008:	eb040593          	addi	a1,s0,-336
+    100c:	00004517          	auipc	a0,0x4
+    1010:	ed450513          	addi	a0,a0,-300 # 4ee0 <malloc+0x160>
+    1014:	00004097          	auipc	ra,0x4
+    1018:	932080e7          	jalr	-1742(ra) # 4946 <exec>
+    if(ret != -1){
+    101c:	57fd                	li	a5,-1
+    101e:	08f50d63          	beq	a0,a5,10b8 <copyinstr2+0x176>
+      printf("exec(echo, BIG) returned %d, not -1\n", fd);
+    1022:	55fd                	li	a1,-1
+    1024:	00004517          	auipc	a0,0x4
+    1028:	4f450513          	addi	a0,a0,1268 # 5518 <malloc+0x798>
+    102c:	00004097          	auipc	ra,0x4
+    1030:	c9c080e7          	jalr	-868(ra) # 4cc8 <printf>
+      exit(1);
+    1034:	4505                	li	a0,1
+    1036:	00004097          	auipc	ra,0x4
+    103a:	8ce080e7          	jalr	-1842(ra) # 4904 <exit>
+    printf("remove(%s) returned %d, not -1\n", b, ret);
+    103e:	862a                	mv	a2,a0
+    1040:	ee840593          	addi	a1,s0,-280
+    1044:	00004517          	auipc	a0,0x4
+    1048:	47450513          	addi	a0,a0,1140 # 54b8 <malloc+0x738>
+    104c:	00004097          	auipc	ra,0x4
+    1050:	c7c080e7          	jalr	-900(ra) # 4cc8 <printf>
+    exit(1);
+    1054:	4505                	li	a0,1
+    1056:	00004097          	auipc	ra,0x4
+    105a:	8ae080e7          	jalr	-1874(ra) # 4904 <exit>
+    printf("open(%s) returned %d, not -1\n", b, fd);
+    105e:	862a                	mv	a2,a0
+    1060:	ee840593          	addi	a1,s0,-280
+    1064:	00004517          	auipc	a0,0x4
+    1068:	47450513          	addi	a0,a0,1140 # 54d8 <malloc+0x758>
+    106c:	00004097          	auipc	ra,0x4
+    1070:	c5c080e7          	jalr	-932(ra) # 4cc8 <printf>
+    exit(1);
+    1074:	4505                	li	a0,1
+    1076:	00004097          	auipc	ra,0x4
+    107a:	88e080e7          	jalr	-1906(ra) # 4904 <exit>
+    printf("exec(%s) returned %d, not -1\n", b, fd);
+    107e:	567d                	li	a2,-1
+    1080:	ee840593          	addi	a1,s0,-280
+    1084:	00004517          	auipc	a0,0x4
+    1088:	47450513          	addi	a0,a0,1140 # 54f8 <malloc+0x778>
+    108c:	00004097          	auipc	ra,0x4
+    1090:	c3c080e7          	jalr	-964(ra) # 4cc8 <printf>
+    exit(1);
+    1094:	4505                	li	a0,1
+    1096:	00004097          	auipc	ra,0x4
+    109a:	86e080e7          	jalr	-1938(ra) # 4904 <exit>
+    printf("fork failed\n");
+    109e:	00005517          	auipc	a0,0x5
+    10a2:	85250513          	addi	a0,a0,-1966 # 58f0 <malloc+0xb70>
+    10a6:	00004097          	auipc	ra,0x4
+    10aa:	c22080e7          	jalr	-990(ra) # 4cc8 <printf>
+    exit(1);
+    10ae:	4505                	li	a0,1
+    10b0:	00004097          	auipc	ra,0x4
+    10b4:	854080e7          	jalr	-1964(ra) # 4904 <exit>
+    exit(747); // OK
+    10b8:	2eb00513          	li	a0,747
+    10bc:	00004097          	auipc	ra,0x4
+    10c0:	848080e7          	jalr	-1976(ra) # 4904 <exit>
+  int st = 0;
+    10c4:	ec042a23          	sw	zero,-300(s0)
+  wait(&st);
+    10c8:	ed440513          	addi	a0,s0,-300
+    10cc:	00004097          	auipc	ra,0x4
+    10d0:	842080e7          	jalr	-1982(ra) # 490e <wait>
+  if(st != 747){
+    10d4:	ed442703          	lw	a4,-300(s0)
+    10d8:	2eb00793          	li	a5,747
+    10dc:	00f71663          	bne	a4,a5,10e8 <copyinstr2+0x1a6>
+}
+    10e0:	60b6                	ld	ra,328(sp)
+    10e2:	6416                	ld	s0,320(sp)
+    10e4:	6171                	addi	sp,sp,336
+    10e6:	8082                	ret
+    printf("exec(echo, BIG) succeeded, should have failed\n");
+    10e8:	00004517          	auipc	a0,0x4
+    10ec:	45850513          	addi	a0,a0,1112 # 5540 <malloc+0x7c0>
+    10f0:	00004097          	auipc	ra,0x4
+    10f4:	bd8080e7          	jalr	-1064(ra) # 4cc8 <printf>
+    exit(1);
+    10f8:	4505                	li	a0,1
+    10fa:	00004097          	auipc	ra,0x4
+    10fe:	80a080e7          	jalr	-2038(ra) # 4904 <exit>
+
+0000000000001102 <truncate3>:
+{
+    1102:	7159                	addi	sp,sp,-112
+    1104:	f486                	sd	ra,104(sp)
+    1106:	f0a2                	sd	s0,96(sp)
+    1108:	eca6                	sd	s1,88(sp)
+    110a:	e8ca                	sd	s2,80(sp)
+    110c:	e4ce                	sd	s3,72(sp)
+    110e:	e0d2                	sd	s4,64(sp)
+    1110:	fc56                	sd	s5,56(sp)
+    1112:	f85a                	sd	s6,48(sp)
+    1114:	1880                	addi	s0,sp,112
+    1116:	892a                	mv	s2,a0
+  close(open("truncfile", O_CREATE|O_TRUNC|O_WRONLY));
+    1118:	60100593          	li	a1,1537
+    111c:	00004517          	auipc	a0,0x4
+    1120:	e1c50513          	addi	a0,a0,-484 # 4f38 <malloc+0x1b8>
+    1124:	00004097          	auipc	ra,0x4
+    1128:	82c080e7          	jalr	-2004(ra) # 4950 <open>
+    112c:	00004097          	auipc	ra,0x4
+    1130:	808080e7          	jalr	-2040(ra) # 4934 <close>
+  pid = fork();
+    1134:	00003097          	auipc	ra,0x3
+    1138:	7c8080e7          	jalr	1992(ra) # 48fc <fork>
+  if(pid < 0){
+    113c:	08054163          	bltz	a0,11be <truncate3+0xbc>
+  if(pid == 0){
+    1140:	e971                	bnez	a0,1214 <truncate3+0x112>
+    1142:	06400993          	li	s3,100
+      int fd = open("truncfile", O_WRONLY);
+    1146:	00004a17          	auipc	s4,0x4
+    114a:	df2a0a13          	addi	s4,s4,-526 # 4f38 <malloc+0x1b8>
+      int n = write(fd, "1234567890", 10);
+    114e:	00004a97          	auipc	s5,0x4
+    1152:	452a8a93          	addi	s5,s5,1106 # 55a0 <malloc+0x820>
+      read(fd, buf, sizeof(buf));
+    1156:	f9840b13          	addi	s6,s0,-104
+      int fd = open("truncfile", O_WRONLY);
+    115a:	4585                	li	a1,1
+    115c:	8552                	mv	a0,s4
+    115e:	00003097          	auipc	ra,0x3
+    1162:	7f2080e7          	jalr	2034(ra) # 4950 <open>
+    1166:	84aa                	mv	s1,a0
+      if(fd < 0){
+    1168:	06054963          	bltz	a0,11da <truncate3+0xd8>
+      int n = write(fd, "1234567890", 10);
+    116c:	4629                	li	a2,10
+    116e:	85d6                	mv	a1,s5
+    1170:	00003097          	auipc	ra,0x3
+    1174:	7ba080e7          	jalr	1978(ra) # 492a <write>
+      if(n != 10){
+    1178:	47a9                	li	a5,10
+    117a:	06f51e63          	bne	a0,a5,11f6 <truncate3+0xf4>
+      close(fd);
+    117e:	8526                	mv	a0,s1
+    1180:	00003097          	auipc	ra,0x3
+    1184:	7b4080e7          	jalr	1972(ra) # 4934 <close>
+      fd = open("truncfile", O_RDONLY);
+    1188:	4581                	li	a1,0
+    118a:	8552                	mv	a0,s4
+    118c:	00003097          	auipc	ra,0x3
+    1190:	7c4080e7          	jalr	1988(ra) # 4950 <open>
+    1194:	84aa                	mv	s1,a0
+      read(fd, buf, sizeof(buf));
+    1196:	02000613          	li	a2,32
+    119a:	85da                	mv	a1,s6
+    119c:	00003097          	auipc	ra,0x3
+    11a0:	784080e7          	jalr	1924(ra) # 4920 <read>
+      close(fd);
+    11a4:	8526                	mv	a0,s1
+    11a6:	00003097          	auipc	ra,0x3
+    11aa:	78e080e7          	jalr	1934(ra) # 4934 <close>
+    for(int i = 0; i < 100; i++){
+    11ae:	39fd                	addiw	s3,s3,-1
+    11b0:	fa0995e3          	bnez	s3,115a <truncate3+0x58>
+    exit(0);
+    11b4:	4501                	li	a0,0
+    11b6:	00003097          	auipc	ra,0x3
+    11ba:	74e080e7          	jalr	1870(ra) # 4904 <exit>
+    printf("%s: fork failed\n", s);
+    11be:	85ca                	mv	a1,s2
+    11c0:	00004517          	auipc	a0,0x4
+    11c4:	3b050513          	addi	a0,a0,944 # 5570 <malloc+0x7f0>
+    11c8:	00004097          	auipc	ra,0x4
+    11cc:	b00080e7          	jalr	-1280(ra) # 4cc8 <printf>
+    exit(1);
+    11d0:	4505                	li	a0,1
+    11d2:	00003097          	auipc	ra,0x3
+    11d6:	732080e7          	jalr	1842(ra) # 4904 <exit>
+        printf("%s: open failed\n", s);
+    11da:	85ca                	mv	a1,s2
+    11dc:	00004517          	auipc	a0,0x4
+    11e0:	3ac50513          	addi	a0,a0,940 # 5588 <malloc+0x808>
+    11e4:	00004097          	auipc	ra,0x4
+    11e8:	ae4080e7          	jalr	-1308(ra) # 4cc8 <printf>
+        exit(1);
+    11ec:	4505                	li	a0,1
+    11ee:	00003097          	auipc	ra,0x3
+    11f2:	716080e7          	jalr	1814(ra) # 4904 <exit>
+        printf("%s: write got %d, expected 10\n", s, n);
+    11f6:	862a                	mv	a2,a0
+    11f8:	85ca                	mv	a1,s2
+    11fa:	00004517          	auipc	a0,0x4
+    11fe:	3b650513          	addi	a0,a0,950 # 55b0 <malloc+0x830>
+    1202:	00004097          	auipc	ra,0x4
+    1206:	ac6080e7          	jalr	-1338(ra) # 4cc8 <printf>
+        exit(1);
+    120a:	4505                	li	a0,1
+    120c:	00003097          	auipc	ra,0x3
+    1210:	6f8080e7          	jalr	1784(ra) # 4904 <exit>
+    1214:	09600993          	li	s3,150
+    int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC);
+    1218:	00004a17          	auipc	s4,0x4
+    121c:	d20a0a13          	addi	s4,s4,-736 # 4f38 <malloc+0x1b8>
+    int n = write(fd, "xxx", 3);
+    1220:	00004a97          	auipc	s5,0x4
+    1224:	3b0a8a93          	addi	s5,s5,944 # 55d0 <malloc+0x850>
+    int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC);
+    1228:	60100593          	li	a1,1537
+    122c:	8552                	mv	a0,s4
+    122e:	00003097          	auipc	ra,0x3
+    1232:	722080e7          	jalr	1826(ra) # 4950 <open>
+    1236:	84aa                	mv	s1,a0
+    if(fd < 0){
+    1238:	04054763          	bltz	a0,1286 <truncate3+0x184>
+    int n = write(fd, "xxx", 3);
+    123c:	460d                	li	a2,3
+    123e:	85d6                	mv	a1,s5
+    1240:	00003097          	auipc	ra,0x3
+    1244:	6ea080e7          	jalr	1770(ra) # 492a <write>
+    if(n != 3){
+    1248:	478d                	li	a5,3
+    124a:	04f51c63          	bne	a0,a5,12a2 <truncate3+0x1a0>
+    close(fd);
+    124e:	8526                	mv	a0,s1
+    1250:	00003097          	auipc	ra,0x3
+    1254:	6e4080e7          	jalr	1764(ra) # 4934 <close>
+  for(int i = 0; i < 150; i++){
+    1258:	39fd                	addiw	s3,s3,-1
+    125a:	fc0997e3          	bnez	s3,1228 <truncate3+0x126>
+  wait(&xstatus);
+    125e:	fbc40513          	addi	a0,s0,-68
+    1262:	00003097          	auipc	ra,0x3
+    1266:	6ac080e7          	jalr	1708(ra) # 490e <wait>
+  remove("truncfile");
+    126a:	00004517          	auipc	a0,0x4
+    126e:	cce50513          	addi	a0,a0,-818 # 4f38 <malloc+0x1b8>
+    1272:	00003097          	auipc	ra,0x3
+    1276:	752080e7          	jalr	1874(ra) # 49c4 <remove>
+  exit(xstatus);
+    127a:	fbc42503          	lw	a0,-68(s0)
+    127e:	00003097          	auipc	ra,0x3
+    1282:	686080e7          	jalr	1670(ra) # 4904 <exit>
+      printf("%s: open failed\n", s);
+    1286:	85ca                	mv	a1,s2
+    1288:	00004517          	auipc	a0,0x4
+    128c:	30050513          	addi	a0,a0,768 # 5588 <malloc+0x808>
+    1290:	00004097          	auipc	ra,0x4
+    1294:	a38080e7          	jalr	-1480(ra) # 4cc8 <printf>
+      exit(1);
+    1298:	4505                	li	a0,1
+    129a:	00003097          	auipc	ra,0x3
+    129e:	66a080e7          	jalr	1642(ra) # 4904 <exit>
+      printf("%s: write got %d, expected 3\n", s, n);
+    12a2:	862a                	mv	a2,a0
+    12a4:	85ca                	mv	a1,s2
+    12a6:	00004517          	auipc	a0,0x4
+    12aa:	33250513          	addi	a0,a0,818 # 55d8 <malloc+0x858>
+    12ae:	00004097          	auipc	ra,0x4
+    12b2:	a1a080e7          	jalr	-1510(ra) # 4cc8 <printf>
+      exit(1);
+    12b6:	4505                	li	a0,1
+    12b8:	00003097          	auipc	ra,0x3
+    12bc:	64c080e7          	jalr	1612(ra) # 4904 <exit>
+
+00000000000012c0 <exectest>:
+{
+    12c0:	715d                	addi	sp,sp,-80
+    12c2:	e486                	sd	ra,72(sp)
+    12c4:	e0a2                	sd	s0,64(sp)
+    12c6:	fc26                	sd	s1,56(sp)
+    12c8:	f84a                	sd	s2,48(sp)
+    12ca:	0880                	addi	s0,sp,80
+    12cc:	892a                	mv	s2,a0
+  char *echoargv[] = { "echo", "OK", 0 };
+    12ce:	00004797          	auipc	a5,0x4
+    12d2:	c1278793          	addi	a5,a5,-1006 # 4ee0 <malloc+0x160>
+    12d6:	fcf43023          	sd	a5,-64(s0)
+    12da:	00004797          	auipc	a5,0x4
+    12de:	31e78793          	addi	a5,a5,798 # 55f8 <malloc+0x878>
+    12e2:	fcf43423          	sd	a5,-56(s0)
+    12e6:	fc043823          	sd	zero,-48(s0)
+  remove("echo-ok");
+    12ea:	00004517          	auipc	a0,0x4
+    12ee:	31650513          	addi	a0,a0,790 # 5600 <malloc+0x880>
+    12f2:	00003097          	auipc	ra,0x3
+    12f6:	6d2080e7          	jalr	1746(ra) # 49c4 <remove>
+  pid = fork();
+    12fa:	00003097          	auipc	ra,0x3
+    12fe:	602080e7          	jalr	1538(ra) # 48fc <fork>
+  if(pid < 0) {
+    1302:	04054663          	bltz	a0,134e <exectest+0x8e>
+    1306:	84aa                	mv	s1,a0
+  if(pid == 0) {
+    1308:	e959                	bnez	a0,139e <exectest+0xde>
+    close(1);
+    130a:	4505                	li	a0,1
+    130c:	00003097          	auipc	ra,0x3
+    1310:	628080e7          	jalr	1576(ra) # 4934 <close>
+    fd = open("echo-ok", O_CREATE|O_WRONLY);
+    1314:	20100593          	li	a1,513
+    1318:	00004517          	auipc	a0,0x4
+    131c:	2e850513          	addi	a0,a0,744 # 5600 <malloc+0x880>
+    1320:	00003097          	auipc	ra,0x3
+    1324:	630080e7          	jalr	1584(ra) # 4950 <open>
+    if(fd < 0) {
+    1328:	04054163          	bltz	a0,136a <exectest+0xaa>
+    if(fd != 1) {
+    132c:	4785                	li	a5,1
+    132e:	04f50c63          	beq	a0,a5,1386 <exectest+0xc6>
+      printf("%s: wrong fd\n", s);
+    1332:	85ca                	mv	a1,s2
+    1334:	00004517          	auipc	a0,0x4
+    1338:	2ec50513          	addi	a0,a0,748 # 5620 <malloc+0x8a0>
+    133c:	00004097          	auipc	ra,0x4
+    1340:	98c080e7          	jalr	-1652(ra) # 4cc8 <printf>
+      exit(1);
+    1344:	4505                	li	a0,1
+    1346:	00003097          	auipc	ra,0x3
+    134a:	5be080e7          	jalr	1470(ra) # 4904 <exit>
+     printf("%s: fork failed\n", s);
+    134e:	85ca                	mv	a1,s2
+    1350:	00004517          	auipc	a0,0x4
+    1354:	22050513          	addi	a0,a0,544 # 5570 <malloc+0x7f0>
+    1358:	00004097          	auipc	ra,0x4
+    135c:	970080e7          	jalr	-1680(ra) # 4cc8 <printf>
+     exit(1);
+    1360:	4505                	li	a0,1
+    1362:	00003097          	auipc	ra,0x3
+    1366:	5a2080e7          	jalr	1442(ra) # 4904 <exit>
+      printf("%s: create failed\n", s);
+    136a:	85ca                	mv	a1,s2
+    136c:	00004517          	auipc	a0,0x4
+    1370:	29c50513          	addi	a0,a0,668 # 5608 <malloc+0x888>
+    1374:	00004097          	auipc	ra,0x4
+    1378:	954080e7          	jalr	-1708(ra) # 4cc8 <printf>
+      exit(1);
+    137c:	4505                	li	a0,1
+    137e:	00003097          	auipc	ra,0x3
+    1382:	586080e7          	jalr	1414(ra) # 4904 <exit>
+    if(exec("echo", echoargv) < 0){
+    1386:	fc040593          	addi	a1,s0,-64
+    138a:	00004517          	auipc	a0,0x4
+    138e:	b5650513          	addi	a0,a0,-1194 # 4ee0 <malloc+0x160>
+    1392:	00003097          	auipc	ra,0x3
+    1396:	5b4080e7          	jalr	1460(ra) # 4946 <exec>
+    139a:	02054163          	bltz	a0,13bc <exectest+0xfc>
+  if (wait(&xstatus) != pid) {
+    139e:	fdc40513          	addi	a0,s0,-36
+    13a2:	00003097          	auipc	ra,0x3
+    13a6:	56c080e7          	jalr	1388(ra) # 490e <wait>
+    13aa:	02951763          	bne	a0,s1,13d8 <exectest+0x118>
+  if(xstatus != 0)
+    13ae:	fdc42503          	lw	a0,-36(s0)
+    13b2:	cd0d                	beqz	a0,13ec <exectest+0x12c>
+    exit(xstatus);
+    13b4:	00003097          	auipc	ra,0x3
+    13b8:	550080e7          	jalr	1360(ra) # 4904 <exit>
+      printf("%s: exec echo failed\n", s);
+    13bc:	85ca                	mv	a1,s2
+    13be:	00004517          	auipc	a0,0x4
+    13c2:	27250513          	addi	a0,a0,626 # 5630 <malloc+0x8b0>
+    13c6:	00004097          	auipc	ra,0x4
+    13ca:	902080e7          	jalr	-1790(ra) # 4cc8 <printf>
+      exit(1);
+    13ce:	4505                	li	a0,1
+    13d0:	00003097          	auipc	ra,0x3
+    13d4:	534080e7          	jalr	1332(ra) # 4904 <exit>
+    printf("%s: wait failed!\n", s);
+    13d8:	85ca                	mv	a1,s2
+    13da:	00004517          	auipc	a0,0x4
+    13de:	26e50513          	addi	a0,a0,622 # 5648 <malloc+0x8c8>
+    13e2:	00004097          	auipc	ra,0x4
+    13e6:	8e6080e7          	jalr	-1818(ra) # 4cc8 <printf>
+    13ea:	b7d1                	j	13ae <exectest+0xee>
+  fd = open("echo-ok", O_RDONLY);
+    13ec:	4581                	li	a1,0
+    13ee:	00004517          	auipc	a0,0x4
+    13f2:	21250513          	addi	a0,a0,530 # 5600 <malloc+0x880>
+    13f6:	00003097          	auipc	ra,0x3
+    13fa:	55a080e7          	jalr	1370(ra) # 4950 <open>
+  if(fd < 0) {
+    13fe:	02054a63          	bltz	a0,1432 <exectest+0x172>
+  if (read(fd, buf, 2) != 2) {
+    1402:	4609                	li	a2,2
+    1404:	fb840593          	addi	a1,s0,-72
+    1408:	00003097          	auipc	ra,0x3
+    140c:	518080e7          	jalr	1304(ra) # 4920 <read>
+    1410:	4789                	li	a5,2
+    1412:	02f50e63          	beq	a0,a5,144e <exectest+0x18e>
+    printf("%s: read failed\n", s);
+    1416:	85ca                	mv	a1,s2
+    1418:	00004517          	auipc	a0,0x4
+    141c:	e9850513          	addi	a0,a0,-360 # 52b0 <malloc+0x530>
+    1420:	00004097          	auipc	ra,0x4
+    1424:	8a8080e7          	jalr	-1880(ra) # 4cc8 <printf>
+    exit(1);
+    1428:	4505                	li	a0,1
+    142a:	00003097          	auipc	ra,0x3
+    142e:	4da080e7          	jalr	1242(ra) # 4904 <exit>
+    printf("%s: open failed\n", s);
+    1432:	85ca                	mv	a1,s2
+    1434:	00004517          	auipc	a0,0x4
+    1438:	15450513          	addi	a0,a0,340 # 5588 <malloc+0x808>
+    143c:	00004097          	auipc	ra,0x4
+    1440:	88c080e7          	jalr	-1908(ra) # 4cc8 <printf>
+    exit(1);
+    1444:	4505                	li	a0,1
+    1446:	00003097          	auipc	ra,0x3
+    144a:	4be080e7          	jalr	1214(ra) # 4904 <exit>
+  remove("echo-ok");
+    144e:	00004517          	auipc	a0,0x4
+    1452:	1b250513          	addi	a0,a0,434 # 5600 <malloc+0x880>
+    1456:	00003097          	auipc	ra,0x3
+    145a:	56e080e7          	jalr	1390(ra) # 49c4 <remove>
+  if(buf[0] == 'O' && buf[1] == 'K')
+    145e:	fb844703          	lbu	a4,-72(s0)
+    1462:	04f00793          	li	a5,79
+    1466:	00f71863          	bne	a4,a5,1476 <exectest+0x1b6>
+    146a:	fb944703          	lbu	a4,-71(s0)
+    146e:	04b00793          	li	a5,75
+    1472:	02f70063          	beq	a4,a5,1492 <exectest+0x1d2>
+    printf("%s: wrong output\n", s);
+    1476:	85ca                	mv	a1,s2
+    1478:	00004517          	auipc	a0,0x4
+    147c:	1e850513          	addi	a0,a0,488 # 5660 <malloc+0x8e0>
+    1480:	00004097          	auipc	ra,0x4
+    1484:	848080e7          	jalr	-1976(ra) # 4cc8 <printf>
+    exit(1);
+    1488:	4505                	li	a0,1
+    148a:	00003097          	auipc	ra,0x3
+    148e:	47a080e7          	jalr	1146(ra) # 4904 <exit>
+    exit(0);
+    1492:	4501                	li	a0,0
+    1494:	00003097          	auipc	ra,0x3
+    1498:	470080e7          	jalr	1136(ra) # 4904 <exit>
+
+000000000000149c <pipe1>:
+{
+    149c:	711d                	addi	sp,sp,-96
+    149e:	ec86                	sd	ra,88(sp)
+    14a0:	e8a2                	sd	s0,80(sp)
+    14a2:	e4a6                	sd	s1,72(sp)
+    14a4:	e0ca                	sd	s2,64(sp)
+    14a6:	fc4e                	sd	s3,56(sp)
+    14a8:	f852                	sd	s4,48(sp)
+    14aa:	f456                	sd	s5,40(sp)
+    14ac:	f05a                	sd	s6,32(sp)
+    14ae:	ec5e                	sd	s7,24(sp)
+    14b0:	1080                	addi	s0,sp,96
+    14b2:	892a                	mv	s2,a0
+  if(pipe(fds) != 0){
+    14b4:	fa840513          	addi	a0,s0,-88
+    14b8:	00003097          	auipc	ra,0x3
+    14bc:	45e080e7          	jalr	1118(ra) # 4916 <pipe>
+    14c0:	ed2d                	bnez	a0,153a <pipe1+0x9e>
+    14c2:	84aa                	mv	s1,a0
+  pid = fork();
+    14c4:	00003097          	auipc	ra,0x3
+    14c8:	438080e7          	jalr	1080(ra) # 48fc <fork>
+    14cc:	8a2a                	mv	s4,a0
+  if(pid == 0){
+    14ce:	c541                	beqz	a0,1556 <pipe1+0xba>
+  } else if(pid > 0){
+    14d0:	16a05f63          	blez	a0,164e <pipe1+0x1b2>
+    close(fds[1]);
+    14d4:	fac42503          	lw	a0,-84(s0)
+    14d8:	00003097          	auipc	ra,0x3
+    14dc:	45c080e7          	jalr	1116(ra) # 4934 <close>
+    total = 0;
+    14e0:	8aa6                	mv	s5,s1
+    cc = 1;
+    14e2:	4985                	li	s3,1
+    while((n = read(fds[0], buf, cc)) > 0){
+    14e4:	00009b17          	auipc	s6,0x9
+    14e8:	3b4b0b13          	addi	s6,s6,948 # a898 <buf>
+      if(cc > sizeof(buf))
+    14ec:	6a09                	lui	s4,0x2
+    14ee:	800a0a13          	addi	s4,s4,-2048 # 1800 <forkfork+0x42>
+    while((n = read(fds[0], buf, cc)) > 0){
+    14f2:	864e                	mv	a2,s3
+    14f4:	85da                	mv	a1,s6
+    14f6:	fa842503          	lw	a0,-88(s0)
+    14fa:	00003097          	auipc	ra,0x3
+    14fe:	426080e7          	jalr	1062(ra) # 4920 <read>
+    1502:	10a05163          	blez	a0,1604 <pipe1+0x168>
+      for(i = 0; i < n; i++){
+    1506:	00009717          	auipc	a4,0x9
+    150a:	39270713          	addi	a4,a4,914 # a898 <buf>
+    150e:	00a4863b          	addw	a2,s1,a0
+        if((buf[i] & 0xff) != (seq++ & 0xff)){
+    1512:	00074683          	lbu	a3,0(a4)
+    1516:	0ff4f793          	zext.b	a5,s1
+    151a:	2485                	addiw	s1,s1,1
+    151c:	0cf69063          	bne	a3,a5,15dc <pipe1+0x140>
+      for(i = 0; i < n; i++){
+    1520:	0705                	addi	a4,a4,1
+    1522:	fec498e3          	bne	s1,a2,1512 <pipe1+0x76>
+      total += n;
+    1526:	00aa8abb          	addw	s5,s5,a0
+      cc = cc * 2;
+    152a:	0019979b          	slliw	a5,s3,0x1
+    152e:	0007899b          	sext.w	s3,a5
+      if(cc > sizeof(buf))
+    1532:	fd3a70e3          	bgeu	s4,s3,14f2 <pipe1+0x56>
+        cc = sizeof(buf);
+    1536:	89d2                	mv	s3,s4
+    1538:	bf6d                	j	14f2 <pipe1+0x56>
+    printf("%s: pipe() failed\n", s);
+    153a:	85ca                	mv	a1,s2
+    153c:	00004517          	auipc	a0,0x4
+    1540:	13c50513          	addi	a0,a0,316 # 5678 <malloc+0x8f8>
+    1544:	00003097          	auipc	ra,0x3
+    1548:	784080e7          	jalr	1924(ra) # 4cc8 <printf>
+    exit(1);
+    154c:	4505                	li	a0,1
+    154e:	00003097          	auipc	ra,0x3
+    1552:	3b6080e7          	jalr	950(ra) # 4904 <exit>
+    close(fds[0]);
+    1556:	fa842503          	lw	a0,-88(s0)
+    155a:	00003097          	auipc	ra,0x3
+    155e:	3da080e7          	jalr	986(ra) # 4934 <close>
+    for(n = 0; n < N; n++){
+    1562:	00009b17          	auipc	s6,0x9
+    1566:	336b0b13          	addi	s6,s6,822 # a898 <buf>
+    156a:	416004bb          	negw	s1,s6
+    156e:	0ff4f493          	zext.b	s1,s1
+    1572:	409b0993          	addi	s3,s6,1033
+      if(write(fds[1], buf, SZ) != SZ){
+    1576:	8bda                	mv	s7,s6
+    for(n = 0; n < N; n++){
+    1578:	6a85                	lui	s5,0x1
+    157a:	42da8a93          	addi	s5,s5,1069 # 142d <exectest+0x16d>
+{
+    157e:	87da                	mv	a5,s6
+        buf[i] = seq++;
+    1580:	0097873b          	addw	a4,a5,s1
+    1584:	00e78023          	sb	a4,0(a5)
+      for(i = 0; i < SZ; i++)
+    1588:	0785                	addi	a5,a5,1
+    158a:	fef99be3          	bne	s3,a5,1580 <pipe1+0xe4>
+        buf[i] = seq++;
+    158e:	409a0a1b          	addiw	s4,s4,1033
+      if(write(fds[1], buf, SZ) != SZ){
+    1592:	40900613          	li	a2,1033
+    1596:	85de                	mv	a1,s7
+    1598:	fac42503          	lw	a0,-84(s0)
+    159c:	00003097          	auipc	ra,0x3
+    15a0:	38e080e7          	jalr	910(ra) # 492a <write>
+    15a4:	40900793          	li	a5,1033
+    15a8:	00f51c63          	bne	a0,a5,15c0 <pipe1+0x124>
+    for(n = 0; n < N; n++){
+    15ac:	24a5                	addiw	s1,s1,9
+    15ae:	0ff4f493          	zext.b	s1,s1
+    15b2:	fd5a16e3          	bne	s4,s5,157e <pipe1+0xe2>
+    exit(0);
+    15b6:	4501                	li	a0,0
+    15b8:	00003097          	auipc	ra,0x3
+    15bc:	34c080e7          	jalr	844(ra) # 4904 <exit>
+        printf("%s: pipe1 oops 1\n", s);
+    15c0:	85ca                	mv	a1,s2
+    15c2:	00004517          	auipc	a0,0x4
+    15c6:	0ce50513          	addi	a0,a0,206 # 5690 <malloc+0x910>
+    15ca:	00003097          	auipc	ra,0x3
+    15ce:	6fe080e7          	jalr	1790(ra) # 4cc8 <printf>
+        exit(1);
+    15d2:	4505                	li	a0,1
+    15d4:	00003097          	auipc	ra,0x3
+    15d8:	330080e7          	jalr	816(ra) # 4904 <exit>
+          printf("%s: pipe1 oops 2\n", s);
+    15dc:	85ca                	mv	a1,s2
+    15de:	00004517          	auipc	a0,0x4
+    15e2:	0ca50513          	addi	a0,a0,202 # 56a8 <malloc+0x928>
+    15e6:	00003097          	auipc	ra,0x3
+    15ea:	6e2080e7          	jalr	1762(ra) # 4cc8 <printf>
+}
+    15ee:	60e6                	ld	ra,88(sp)
+    15f0:	6446                	ld	s0,80(sp)
+    15f2:	64a6                	ld	s1,72(sp)
+    15f4:	6906                	ld	s2,64(sp)
+    15f6:	79e2                	ld	s3,56(sp)
+    15f8:	7a42                	ld	s4,48(sp)
+    15fa:	7aa2                	ld	s5,40(sp)
+    15fc:	7b02                	ld	s6,32(sp)
+    15fe:	6be2                	ld	s7,24(sp)
+    1600:	6125                	addi	sp,sp,96
+    1602:	8082                	ret
+    if(total != N * SZ){
+    1604:	6785                	lui	a5,0x1
+    1606:	42d78793          	addi	a5,a5,1069 # 142d <exectest+0x16d>
+    160a:	02fa8063          	beq	s5,a5,162a <pipe1+0x18e>
+      printf("%s: pipe1 oops 3 total %d\n", total);
+    160e:	85d6                	mv	a1,s5
+    1610:	00004517          	auipc	a0,0x4
+    1614:	0b050513          	addi	a0,a0,176 # 56c0 <malloc+0x940>
+    1618:	00003097          	auipc	ra,0x3
+    161c:	6b0080e7          	jalr	1712(ra) # 4cc8 <printf>
+      exit(1);
+    1620:	4505                	li	a0,1
+    1622:	00003097          	auipc	ra,0x3
+    1626:	2e2080e7          	jalr	738(ra) # 4904 <exit>
+    close(fds[0]);
+    162a:	fa842503          	lw	a0,-88(s0)
+    162e:	00003097          	auipc	ra,0x3
+    1632:	306080e7          	jalr	774(ra) # 4934 <close>
+    wait(&xstatus);
+    1636:	fa440513          	addi	a0,s0,-92
+    163a:	00003097          	auipc	ra,0x3
+    163e:	2d4080e7          	jalr	724(ra) # 490e <wait>
+    exit(xstatus);
+    1642:	fa442503          	lw	a0,-92(s0)
+    1646:	00003097          	auipc	ra,0x3
+    164a:	2be080e7          	jalr	702(ra) # 4904 <exit>
+    printf("%s: fork() failed\n", s);
+    164e:	85ca                	mv	a1,s2
+    1650:	00004517          	auipc	a0,0x4
+    1654:	09050513          	addi	a0,a0,144 # 56e0 <malloc+0x960>
+    1658:	00003097          	auipc	ra,0x3
+    165c:	670080e7          	jalr	1648(ra) # 4cc8 <printf>
+    exit(1);
+    1660:	4505                	li	a0,1
+    1662:	00003097          	auipc	ra,0x3
+    1666:	2a2080e7          	jalr	674(ra) # 4904 <exit>
+
+000000000000166a <exitwait>:
+{
+    166a:	715d                	addi	sp,sp,-80
+    166c:	e486                	sd	ra,72(sp)
+    166e:	e0a2                	sd	s0,64(sp)
+    1670:	fc26                	sd	s1,56(sp)
+    1672:	f84a                	sd	s2,48(sp)
+    1674:	f44e                	sd	s3,40(sp)
+    1676:	f052                	sd	s4,32(sp)
+    1678:	ec56                	sd	s5,24(sp)
+    167a:	0880                	addi	s0,sp,80
+    167c:	8aaa                	mv	s5,a0
+  for(i = 0; i < 100; i++){
+    167e:	4901                	li	s2,0
+      if(wait(&xstate) != pid){
+    1680:	fbc40993          	addi	s3,s0,-68
+  for(i = 0; i < 100; i++){
+    1684:	06400a13          	li	s4,100
+    pid = fork();
+    1688:	00003097          	auipc	ra,0x3
+    168c:	274080e7          	jalr	628(ra) # 48fc <fork>
+    1690:	84aa                	mv	s1,a0
+    if(pid < 0){
+    1692:	02054a63          	bltz	a0,16c6 <exitwait+0x5c>
+    if(pid){
+    1696:	c151                	beqz	a0,171a <exitwait+0xb0>
+      if(wait(&xstate) != pid){
+    1698:	854e                	mv	a0,s3
+    169a:	00003097          	auipc	ra,0x3
+    169e:	274080e7          	jalr	628(ra) # 490e <wait>
+    16a2:	04951063          	bne	a0,s1,16e2 <exitwait+0x78>
+      if(i != xstate) {
+    16a6:	fbc42783          	lw	a5,-68(s0)
+    16aa:	05279a63          	bne	a5,s2,16fe <exitwait+0x94>
+  for(i = 0; i < 100; i++){
+    16ae:	2905                	addiw	s2,s2,1
+    16b0:	fd491ce3          	bne	s2,s4,1688 <exitwait+0x1e>
+}
+    16b4:	60a6                	ld	ra,72(sp)
+    16b6:	6406                	ld	s0,64(sp)
+    16b8:	74e2                	ld	s1,56(sp)
+    16ba:	7942                	ld	s2,48(sp)
+    16bc:	79a2                	ld	s3,40(sp)
+    16be:	7a02                	ld	s4,32(sp)
+    16c0:	6ae2                	ld	s5,24(sp)
+    16c2:	6161                	addi	sp,sp,80
+    16c4:	8082                	ret
+      printf("%s: fork failed\n", s);
+    16c6:	85d6                	mv	a1,s5
+    16c8:	00004517          	auipc	a0,0x4
+    16cc:	ea850513          	addi	a0,a0,-344 # 5570 <malloc+0x7f0>
+    16d0:	00003097          	auipc	ra,0x3
+    16d4:	5f8080e7          	jalr	1528(ra) # 4cc8 <printf>
+      exit(1);
+    16d8:	4505                	li	a0,1
+    16da:	00003097          	auipc	ra,0x3
+    16de:	22a080e7          	jalr	554(ra) # 4904 <exit>
+        printf("%s: wait wrong pid\n", s);
+    16e2:	85d6                	mv	a1,s5
+    16e4:	00004517          	auipc	a0,0x4
+    16e8:	01450513          	addi	a0,a0,20 # 56f8 <malloc+0x978>
+    16ec:	00003097          	auipc	ra,0x3
+    16f0:	5dc080e7          	jalr	1500(ra) # 4cc8 <printf>
+        exit(1);
+    16f4:	4505                	li	a0,1
+    16f6:	00003097          	auipc	ra,0x3
+    16fa:	20e080e7          	jalr	526(ra) # 4904 <exit>
+        printf("%s: wait wrong exit status\n", s);
+    16fe:	85d6                	mv	a1,s5
+    1700:	00004517          	auipc	a0,0x4
+    1704:	01050513          	addi	a0,a0,16 # 5710 <malloc+0x990>
+    1708:	00003097          	auipc	ra,0x3
+    170c:	5c0080e7          	jalr	1472(ra) # 4cc8 <printf>
+        exit(1);
+    1710:	4505                	li	a0,1
+    1712:	00003097          	auipc	ra,0x3
+    1716:	1f2080e7          	jalr	498(ra) # 4904 <exit>
+      exit(i);
+    171a:	854a                	mv	a0,s2
+    171c:	00003097          	auipc	ra,0x3
+    1720:	1e8080e7          	jalr	488(ra) # 4904 <exit>
+
+0000000000001724 <twochildren>:
+{
+    1724:	1101                	addi	sp,sp,-32
+    1726:	ec06                	sd	ra,24(sp)
+    1728:	e822                	sd	s0,16(sp)
+    172a:	e426                	sd	s1,8(sp)
+    172c:	e04a                	sd	s2,0(sp)
+    172e:	1000                	addi	s0,sp,32
+    1730:	892a                	mv	s2,a0
+    1732:	3e800493          	li	s1,1000
+    int pid1 = fork();
+    1736:	00003097          	auipc	ra,0x3
+    173a:	1c6080e7          	jalr	454(ra) # 48fc <fork>
+    if(pid1 < 0){
+    173e:	02054c63          	bltz	a0,1776 <twochildren+0x52>
+    if(pid1 == 0){
+    1742:	c921                	beqz	a0,1792 <twochildren+0x6e>
+      int pid2 = fork();
+    1744:	00003097          	auipc	ra,0x3
+    1748:	1b8080e7          	jalr	440(ra) # 48fc <fork>
+      if(pid2 < 0){
+    174c:	04054763          	bltz	a0,179a <twochildren+0x76>
+      if(pid2 == 0){
+    1750:	c13d                	beqz	a0,17b6 <twochildren+0x92>
+        wait(0);
+    1752:	4501                	li	a0,0
+    1754:	00003097          	auipc	ra,0x3
+    1758:	1ba080e7          	jalr	442(ra) # 490e <wait>
+        wait(0);
+    175c:	4501                	li	a0,0
+    175e:	00003097          	auipc	ra,0x3
+    1762:	1b0080e7          	jalr	432(ra) # 490e <wait>
+  for(int i = 0; i < 1000; i++){
+    1766:	34fd                	addiw	s1,s1,-1
+    1768:	f4f9                	bnez	s1,1736 <twochildren+0x12>
+}
+    176a:	60e2                	ld	ra,24(sp)
+    176c:	6442                	ld	s0,16(sp)
+    176e:	64a2                	ld	s1,8(sp)
+    1770:	6902                	ld	s2,0(sp)
+    1772:	6105                	addi	sp,sp,32
+    1774:	8082                	ret
+      printf("%s: fork failed\n", s);
+    1776:	85ca                	mv	a1,s2
+    1778:	00004517          	auipc	a0,0x4
+    177c:	df850513          	addi	a0,a0,-520 # 5570 <malloc+0x7f0>
+    1780:	00003097          	auipc	ra,0x3
+    1784:	548080e7          	jalr	1352(ra) # 4cc8 <printf>
+      exit(1);
+    1788:	4505                	li	a0,1
+    178a:	00003097          	auipc	ra,0x3
+    178e:	17a080e7          	jalr	378(ra) # 4904 <exit>
+      exit(0);
+    1792:	00003097          	auipc	ra,0x3
+    1796:	172080e7          	jalr	370(ra) # 4904 <exit>
+        printf("%s: fork failed\n", s);
+    179a:	85ca                	mv	a1,s2
+    179c:	00004517          	auipc	a0,0x4
+    17a0:	dd450513          	addi	a0,a0,-556 # 5570 <malloc+0x7f0>
+    17a4:	00003097          	auipc	ra,0x3
+    17a8:	524080e7          	jalr	1316(ra) # 4cc8 <printf>
+        exit(1);
+    17ac:	4505                	li	a0,1
+    17ae:	00003097          	auipc	ra,0x3
+    17b2:	156080e7          	jalr	342(ra) # 4904 <exit>
+        exit(0);
+    17b6:	00003097          	auipc	ra,0x3
+    17ba:	14e080e7          	jalr	334(ra) # 4904 <exit>
+
+00000000000017be <forkfork>:
+{
+    17be:	7179                	addi	sp,sp,-48
+    17c0:	f406                	sd	ra,40(sp)
+    17c2:	f022                	sd	s0,32(sp)
+    17c4:	ec26                	sd	s1,24(sp)
+    17c6:	1800                	addi	s0,sp,48
+    17c8:	84aa                	mv	s1,a0
+    int pid = fork();
+    17ca:	00003097          	auipc	ra,0x3
+    17ce:	132080e7          	jalr	306(ra) # 48fc <fork>
+    if(pid < 0){
+    17d2:	04054163          	bltz	a0,1814 <forkfork+0x56>
+    if(pid == 0){
+    17d6:	cd29                	beqz	a0,1830 <forkfork+0x72>
+    int pid = fork();
+    17d8:	00003097          	auipc	ra,0x3
+    17dc:	124080e7          	jalr	292(ra) # 48fc <fork>
+    if(pid < 0){
+    17e0:	02054a63          	bltz	a0,1814 <forkfork+0x56>
+    if(pid == 0){
+    17e4:	c531                	beqz	a0,1830 <forkfork+0x72>
+    wait(&xstatus);
+    17e6:	fdc40513          	addi	a0,s0,-36
+    17ea:	00003097          	auipc	ra,0x3
+    17ee:	124080e7          	jalr	292(ra) # 490e <wait>
+    if(xstatus != 0) {
+    17f2:	fdc42783          	lw	a5,-36(s0)
+    17f6:	ebbd                	bnez	a5,186c <forkfork+0xae>
+    wait(&xstatus);
+    17f8:	fdc40513          	addi	a0,s0,-36
+    17fc:	00003097          	auipc	ra,0x3
+    1800:	112080e7          	jalr	274(ra) # 490e <wait>
+    if(xstatus != 0) {
+    1804:	fdc42783          	lw	a5,-36(s0)
+    1808:	e3b5                	bnez	a5,186c <forkfork+0xae>
+}
+    180a:	70a2                	ld	ra,40(sp)
+    180c:	7402                	ld	s0,32(sp)
+    180e:	64e2                	ld	s1,24(sp)
+    1810:	6145                	addi	sp,sp,48
+    1812:	8082                	ret
+      printf("%s: fork failed", s);
+    1814:	85a6                	mv	a1,s1
+    1816:	00004517          	auipc	a0,0x4
+    181a:	f1a50513          	addi	a0,a0,-230 # 5730 <malloc+0x9b0>
+    181e:	00003097          	auipc	ra,0x3
+    1822:	4aa080e7          	jalr	1194(ra) # 4cc8 <printf>
+      exit(1);
+    1826:	4505                	li	a0,1
+    1828:	00003097          	auipc	ra,0x3
+    182c:	0dc080e7          	jalr	220(ra) # 4904 <exit>
+{
+    1830:	0c800493          	li	s1,200
+        int pid1 = fork();
+    1834:	00003097          	auipc	ra,0x3
+    1838:	0c8080e7          	jalr	200(ra) # 48fc <fork>
+        if(pid1 < 0){
+    183c:	00054f63          	bltz	a0,185a <forkfork+0x9c>
+        if(pid1 == 0){
+    1840:	c115                	beqz	a0,1864 <forkfork+0xa6>
+        wait(0);
+    1842:	4501                	li	a0,0
+    1844:	00003097          	auipc	ra,0x3
+    1848:	0ca080e7          	jalr	202(ra) # 490e <wait>
+      for(int j = 0; j < 200; j++){
+    184c:	34fd                	addiw	s1,s1,-1
+    184e:	f0fd                	bnez	s1,1834 <forkfork+0x76>
+      exit(0);
+    1850:	4501                	li	a0,0
+    1852:	00003097          	auipc	ra,0x3
+    1856:	0b2080e7          	jalr	178(ra) # 4904 <exit>
+          exit(1);
+    185a:	4505                	li	a0,1
+    185c:	00003097          	auipc	ra,0x3
+    1860:	0a8080e7          	jalr	168(ra) # 4904 <exit>
+          exit(0);
+    1864:	00003097          	auipc	ra,0x3
+    1868:	0a0080e7          	jalr	160(ra) # 4904 <exit>
+      printf("%s: fork in child failed", s);
+    186c:	85a6                	mv	a1,s1
+    186e:	00004517          	auipc	a0,0x4
+    1872:	ed250513          	addi	a0,a0,-302 # 5740 <malloc+0x9c0>
+    1876:	00003097          	auipc	ra,0x3
+    187a:	452080e7          	jalr	1106(ra) # 4cc8 <printf>
+      exit(1);
+    187e:	4505                	li	a0,1
+    1880:	00003097          	auipc	ra,0x3
+    1884:	084080e7          	jalr	132(ra) # 4904 <exit>
+
+0000000000001888 <reparent2>:
+{
+    1888:	1101                	addi	sp,sp,-32
+    188a:	ec06                	sd	ra,24(sp)
+    188c:	e822                	sd	s0,16(sp)
+    188e:	e426                	sd	s1,8(sp)
+    1890:	1000                	addi	s0,sp,32
+    1892:	32000493          	li	s1,800
+    int pid1 = fork();
+    1896:	00003097          	auipc	ra,0x3
+    189a:	066080e7          	jalr	102(ra) # 48fc <fork>
+    if(pid1 < 0){
+    189e:	00054f63          	bltz	a0,18bc <reparent2+0x34>
+    if(pid1 == 0){
+    18a2:	c915                	beqz	a0,18d6 <reparent2+0x4e>
+    wait(0);
+    18a4:	4501                	li	a0,0
+    18a6:	00003097          	auipc	ra,0x3
+    18aa:	068080e7          	jalr	104(ra) # 490e <wait>
+  for(int i = 0; i < 800; i++){
+    18ae:	34fd                	addiw	s1,s1,-1
+    18b0:	f0fd                	bnez	s1,1896 <reparent2+0xe>
+  exit(0);
+    18b2:	4501                	li	a0,0
+    18b4:	00003097          	auipc	ra,0x3
+    18b8:	050080e7          	jalr	80(ra) # 4904 <exit>
+      printf("fork failed\n");
+    18bc:	00004517          	auipc	a0,0x4
+    18c0:	03450513          	addi	a0,a0,52 # 58f0 <malloc+0xb70>
+    18c4:	00003097          	auipc	ra,0x3
+    18c8:	404080e7          	jalr	1028(ra) # 4cc8 <printf>
+      exit(1);
+    18cc:	4505                	li	a0,1
+    18ce:	00003097          	auipc	ra,0x3
+    18d2:	036080e7          	jalr	54(ra) # 4904 <exit>
+      fork();
+    18d6:	00003097          	auipc	ra,0x3
+    18da:	026080e7          	jalr	38(ra) # 48fc <fork>
+      fork();
+    18de:	00003097          	auipc	ra,0x3
+    18e2:	01e080e7          	jalr	30(ra) # 48fc <fork>
+      exit(0);
+    18e6:	4501                	li	a0,0
+    18e8:	00003097          	auipc	ra,0x3
+    18ec:	01c080e7          	jalr	28(ra) # 4904 <exit>
+
+00000000000018f0 <forktest>:
+{
+    18f0:	7179                	addi	sp,sp,-48
+    18f2:	f406                	sd	ra,40(sp)
+    18f4:	f022                	sd	s0,32(sp)
+    18f6:	ec26                	sd	s1,24(sp)
+    18f8:	e84a                	sd	s2,16(sp)
+    18fa:	e44e                	sd	s3,8(sp)
+    18fc:	1800                	addi	s0,sp,48
+    18fe:	89aa                	mv	s3,a0
+  for(n=0; n<N; n++){
+    1900:	4481                	li	s1,0
+    1902:	3e800913          	li	s2,1000
+    pid = fork();
+    1906:	00003097          	auipc	ra,0x3
+    190a:	ff6080e7          	jalr	-10(ra) # 48fc <fork>
+    if(pid < 0)
+    190e:	02054863          	bltz	a0,193e <forktest+0x4e>
+    if(pid == 0)
+    1912:	c115                	beqz	a0,1936 <forktest+0x46>
+  for(n=0; n<N; n++){
+    1914:	2485                	addiw	s1,s1,1
+    1916:	ff2498e3          	bne	s1,s2,1906 <forktest+0x16>
+    printf("%s: fork claimed to work 1000 times!\n", s);
+    191a:	85ce                	mv	a1,s3
+    191c:	00004517          	auipc	a0,0x4
+    1920:	e5c50513          	addi	a0,a0,-420 # 5778 <malloc+0x9f8>
+    1924:	00003097          	auipc	ra,0x3
+    1928:	3a4080e7          	jalr	932(ra) # 4cc8 <printf>
+    exit(1);
+    192c:	4505                	li	a0,1
+    192e:	00003097          	auipc	ra,0x3
+    1932:	fd6080e7          	jalr	-42(ra) # 4904 <exit>
+      exit(0);
+    1936:	00003097          	auipc	ra,0x3
+    193a:	fce080e7          	jalr	-50(ra) # 4904 <exit>
+  if (n == 0) {
+    193e:	cc9d                	beqz	s1,197c <forktest+0x8c>
+  if(n == N){
+    1940:	3e800793          	li	a5,1000
+    1944:	fcf48be3          	beq	s1,a5,191a <forktest+0x2a>
+  for(; n > 0; n--){
+    1948:	00905b63          	blez	s1,195e <forktest+0x6e>
+    if(wait(0) < 0){
+    194c:	4501                	li	a0,0
+    194e:	00003097          	auipc	ra,0x3
+    1952:	fc0080e7          	jalr	-64(ra) # 490e <wait>
+    1956:	04054163          	bltz	a0,1998 <forktest+0xa8>
+  for(; n > 0; n--){
+    195a:	34fd                	addiw	s1,s1,-1
+    195c:	f8e5                	bnez	s1,194c <forktest+0x5c>
+  if(wait(0) != -1){
+    195e:	4501                	li	a0,0
+    1960:	00003097          	auipc	ra,0x3
+    1964:	fae080e7          	jalr	-82(ra) # 490e <wait>
+    1968:	57fd                	li	a5,-1
+    196a:	04f51563          	bne	a0,a5,19b4 <forktest+0xc4>
+}
+    196e:	70a2                	ld	ra,40(sp)
+    1970:	7402                	ld	s0,32(sp)
+    1972:	64e2                	ld	s1,24(sp)
+    1974:	6942                	ld	s2,16(sp)
+    1976:	69a2                	ld	s3,8(sp)
+    1978:	6145                	addi	sp,sp,48
+    197a:	8082                	ret
+    printf("%s: no fork at all!\n", s);
+    197c:	85ce                	mv	a1,s3
+    197e:	00004517          	auipc	a0,0x4
+    1982:	de250513          	addi	a0,a0,-542 # 5760 <malloc+0x9e0>
+    1986:	00003097          	auipc	ra,0x3
+    198a:	342080e7          	jalr	834(ra) # 4cc8 <printf>
+    exit(1);
+    198e:	4505                	li	a0,1
+    1990:	00003097          	auipc	ra,0x3
+    1994:	f74080e7          	jalr	-140(ra) # 4904 <exit>
+      printf("%s: wait stopped early\n", s);
+    1998:	85ce                	mv	a1,s3
+    199a:	00004517          	auipc	a0,0x4
+    199e:	e0650513          	addi	a0,a0,-506 # 57a0 <malloc+0xa20>
+    19a2:	00003097          	auipc	ra,0x3
+    19a6:	326080e7          	jalr	806(ra) # 4cc8 <printf>
+      exit(1);
+    19aa:	4505                	li	a0,1
+    19ac:	00003097          	auipc	ra,0x3
+    19b0:	f58080e7          	jalr	-168(ra) # 4904 <exit>
+    printf("%s: wait got too many\n", s);
+    19b4:	85ce                	mv	a1,s3
+    19b6:	00004517          	auipc	a0,0x4
+    19ba:	e0250513          	addi	a0,a0,-510 # 57b8 <malloc+0xa38>
+    19be:	00003097          	auipc	ra,0x3
+    19c2:	30a080e7          	jalr	778(ra) # 4cc8 <printf>
+    exit(1);
+    19c6:	4505                	li	a0,1
+    19c8:	00003097          	auipc	ra,0x3
+    19cc:	f3c080e7          	jalr	-196(ra) # 4904 <exit>
+
+00000000000019d0 <kernmem>:
+{
+    19d0:	715d                	addi	sp,sp,-80
+    19d2:	e486                	sd	ra,72(sp)
+    19d4:	e0a2                	sd	s0,64(sp)
+    19d6:	fc26                	sd	s1,56(sp)
+    19d8:	f84a                	sd	s2,48(sp)
+    19da:	f44e                	sd	s3,40(sp)
+    19dc:	f052                	sd	s4,32(sp)
+    19de:	ec56                	sd	s5,24(sp)
+    19e0:	e85a                	sd	s6,16(sp)
+    19e2:	0880                	addi	s0,sp,80
+    19e4:	8b2a                	mv	s6,a0
+  for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){
+    19e6:	40100493          	li	s1,1025
+    19ea:	04d6                	slli	s1,s1,0x15
+    wait(&xstatus);
+    19ec:	fbc40a93          	addi	s5,s0,-68
+    if(xstatus != -1)  // did kernel kill child?
+    19f0:	5a7d                	li	s4,-1
+  for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){
+    19f2:	69b1                	lui	s3,0xc
+    19f4:	35098993          	addi	s3,s3,848 # c350 <__BSS_END__+0x2a0>
+    19f8:	1007d937          	lui	s2,0x1007d
+    19fc:	090e                	slli	s2,s2,0x3
+    19fe:	48090913          	addi	s2,s2,1152 # 1007d480 <__BSS_END__+0x100713d0>
+    pid = fork();
+    1a02:	00003097          	auipc	ra,0x3
+    1a06:	efa080e7          	jalr	-262(ra) # 48fc <fork>
+    if(pid < 0){
+    1a0a:	02054963          	bltz	a0,1a3c <kernmem+0x6c>
+    if(pid == 0){
+    1a0e:	c529                	beqz	a0,1a58 <kernmem+0x88>
+    wait(&xstatus);
+    1a10:	8556                	mv	a0,s5
+    1a12:	00003097          	auipc	ra,0x3
+    1a16:	efc080e7          	jalr	-260(ra) # 490e <wait>
+    if(xstatus != -1)  // did kernel kill child?
+    1a1a:	fbc42783          	lw	a5,-68(s0)
+    1a1e:	05479d63          	bne	a5,s4,1a78 <kernmem+0xa8>
+  for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){
+    1a22:	94ce                	add	s1,s1,s3
+    1a24:	fd249fe3          	bne	s1,s2,1a02 <kernmem+0x32>
+}
+    1a28:	60a6                	ld	ra,72(sp)
+    1a2a:	6406                	ld	s0,64(sp)
+    1a2c:	74e2                	ld	s1,56(sp)
+    1a2e:	7942                	ld	s2,48(sp)
+    1a30:	79a2                	ld	s3,40(sp)
+    1a32:	7a02                	ld	s4,32(sp)
+    1a34:	6ae2                	ld	s5,24(sp)
+    1a36:	6b42                	ld	s6,16(sp)
+    1a38:	6161                	addi	sp,sp,80
+    1a3a:	8082                	ret
+      printf("%s: fork failed\n", s);
+    1a3c:	85da                	mv	a1,s6
+    1a3e:	00004517          	auipc	a0,0x4
+    1a42:	b3250513          	addi	a0,a0,-1230 # 5570 <malloc+0x7f0>
+    1a46:	00003097          	auipc	ra,0x3
+    1a4a:	282080e7          	jalr	642(ra) # 4cc8 <printf>
+      exit(1);
+    1a4e:	4505                	li	a0,1
+    1a50:	00003097          	auipc	ra,0x3
+    1a54:	eb4080e7          	jalr	-332(ra) # 4904 <exit>
+      printf("%s: oops could read %x = %x\n", a, *a);
+    1a58:	0004c603          	lbu	a2,0(s1)
+    1a5c:	85a6                	mv	a1,s1
+    1a5e:	00004517          	auipc	a0,0x4
+    1a62:	d7250513          	addi	a0,a0,-654 # 57d0 <malloc+0xa50>
+    1a66:	00003097          	auipc	ra,0x3
+    1a6a:	262080e7          	jalr	610(ra) # 4cc8 <printf>
+      exit(1);
+    1a6e:	4505                	li	a0,1
+    1a70:	00003097          	auipc	ra,0x3
+    1a74:	e94080e7          	jalr	-364(ra) # 4904 <exit>
+      exit(1);
+    1a78:	4505                	li	a0,1
+    1a7a:	00003097          	auipc	ra,0x3
+    1a7e:	e8a080e7          	jalr	-374(ra) # 4904 <exit>
+
+0000000000001a82 <bigargtest>:
+{
+    1a82:	7179                	addi	sp,sp,-48
+    1a84:	f406                	sd	ra,40(sp)
+    1a86:	f022                	sd	s0,32(sp)
+    1a88:	ec26                	sd	s1,24(sp)
+    1a8a:	1800                	addi	s0,sp,48
+    1a8c:	84aa                	mv	s1,a0
+  remove("bigarg-ok");
+    1a8e:	00004517          	auipc	a0,0x4
+    1a92:	d6250513          	addi	a0,a0,-670 # 57f0 <malloc+0xa70>
+    1a96:	00003097          	auipc	ra,0x3
+    1a9a:	f2e080e7          	jalr	-210(ra) # 49c4 <remove>
+  pid = fork();
+    1a9e:	00003097          	auipc	ra,0x3
+    1aa2:	e5e080e7          	jalr	-418(ra) # 48fc <fork>
+  if(pid == 0){
+    1aa6:	c921                	beqz	a0,1af6 <bigargtest+0x74>
+  } else if(pid < 0){
+    1aa8:	0a054a63          	bltz	a0,1b5c <bigargtest+0xda>
+  wait(&xstatus);
+    1aac:	fdc40513          	addi	a0,s0,-36
+    1ab0:	00003097          	auipc	ra,0x3
+    1ab4:	e5e080e7          	jalr	-418(ra) # 490e <wait>
+  if(xstatus != 0)
+    1ab8:	fdc42503          	lw	a0,-36(s0)
+    1abc:	ed55                	bnez	a0,1b78 <bigargtest+0xf6>
+  fd = open("bigarg-ok", 0);
+    1abe:	4581                	li	a1,0
+    1ac0:	00004517          	auipc	a0,0x4
+    1ac4:	d3050513          	addi	a0,a0,-720 # 57f0 <malloc+0xa70>
+    1ac8:	00003097          	auipc	ra,0x3
+    1acc:	e88080e7          	jalr	-376(ra) # 4950 <open>
+  if(fd < 0){
+    1ad0:	0a054863          	bltz	a0,1b80 <bigargtest+0xfe>
+  close(fd);
+    1ad4:	00003097          	auipc	ra,0x3
+    1ad8:	e60080e7          	jalr	-416(ra) # 4934 <close>
+  remove("bigarg-ok");
+    1adc:	00004517          	auipc	a0,0x4
+    1ae0:	d1450513          	addi	a0,a0,-748 # 57f0 <malloc+0xa70>
+    1ae4:	00003097          	auipc	ra,0x3
+    1ae8:	ee0080e7          	jalr	-288(ra) # 49c4 <remove>
+}
+    1aec:	70a2                	ld	ra,40(sp)
+    1aee:	7402                	ld	s0,32(sp)
+    1af0:	64e2                	ld	s1,24(sp)
+    1af2:	6145                	addi	sp,sp,48
+    1af4:	8082                	ret
+    1af6:	00005797          	auipc	a5,0x5
+    1afa:	58a78793          	addi	a5,a5,1418 # 7080 <args.1>
+    1afe:	00005697          	auipc	a3,0x5
+    1b02:	67a68693          	addi	a3,a3,1658 # 7178 <args.1+0xf8>
+      args[i] = "bigargs test: failed\n                                                                                                                                                                                                       ";
+    1b06:	00004717          	auipc	a4,0x4
+    1b0a:	cfa70713          	addi	a4,a4,-774 # 5800 <malloc+0xa80>
+    1b0e:	e398                	sd	a4,0(a5)
+    for(i = 0; i < MAXARG-1; i++)
+    1b10:	07a1                	addi	a5,a5,8
+    1b12:	fed79ee3          	bne	a5,a3,1b0e <bigargtest+0x8c>
+    args[MAXARG-1] = 0;
+    1b16:	00005797          	auipc	a5,0x5
+    1b1a:	6607b123          	sd	zero,1634(a5) # 7178 <args.1+0xf8>
+    exec("echo", args);
+    1b1e:	00005597          	auipc	a1,0x5
+    1b22:	56258593          	addi	a1,a1,1378 # 7080 <args.1>
+    1b26:	00003517          	auipc	a0,0x3
+    1b2a:	3ba50513          	addi	a0,a0,954 # 4ee0 <malloc+0x160>
+    1b2e:	00003097          	auipc	ra,0x3
+    1b32:	e18080e7          	jalr	-488(ra) # 4946 <exec>
+    fd = open("bigarg-ok", O_CREATE);
+    1b36:	20000593          	li	a1,512
+    1b3a:	00004517          	auipc	a0,0x4
+    1b3e:	cb650513          	addi	a0,a0,-842 # 57f0 <malloc+0xa70>
+    1b42:	00003097          	auipc	ra,0x3
+    1b46:	e0e080e7          	jalr	-498(ra) # 4950 <open>
+    close(fd);
+    1b4a:	00003097          	auipc	ra,0x3
+    1b4e:	dea080e7          	jalr	-534(ra) # 4934 <close>
+    exit(0);
+    1b52:	4501                	li	a0,0
+    1b54:	00003097          	auipc	ra,0x3
+    1b58:	db0080e7          	jalr	-592(ra) # 4904 <exit>
+    printf("%s: bigargtest: fork failed\n", s);
+    1b5c:	85a6                	mv	a1,s1
+    1b5e:	00004517          	auipc	a0,0x4
+    1b62:	d8250513          	addi	a0,a0,-638 # 58e0 <malloc+0xb60>
+    1b66:	00003097          	auipc	ra,0x3
+    1b6a:	162080e7          	jalr	354(ra) # 4cc8 <printf>
+    exit(1);
+    1b6e:	4505                	li	a0,1
+    1b70:	00003097          	auipc	ra,0x3
+    1b74:	d94080e7          	jalr	-620(ra) # 4904 <exit>
+    exit(xstatus);
+    1b78:	00003097          	auipc	ra,0x3
+    1b7c:	d8c080e7          	jalr	-628(ra) # 4904 <exit>
+    printf("%s: bigarg test failed!\n", s);
+    1b80:	85a6                	mv	a1,s1
+    1b82:	00004517          	auipc	a0,0x4
+    1b86:	d7e50513          	addi	a0,a0,-642 # 5900 <malloc+0xb80>
+    1b8a:	00003097          	auipc	ra,0x3
+    1b8e:	13e080e7          	jalr	318(ra) # 4cc8 <printf>
+    exit(1);
+    1b92:	4505                	li	a0,1
+    1b94:	00003097          	auipc	ra,0x3
+    1b98:	d70080e7          	jalr	-656(ra) # 4904 <exit>
+
+0000000000001b9c <stacktest>:
+{
+    1b9c:	7179                	addi	sp,sp,-48
+    1b9e:	f406                	sd	ra,40(sp)
+    1ba0:	f022                	sd	s0,32(sp)
+    1ba2:	ec26                	sd	s1,24(sp)
+    1ba4:	1800                	addi	s0,sp,48
+    1ba6:	84aa                	mv	s1,a0
+  pid = fork();
+    1ba8:	00003097          	auipc	ra,0x3
+    1bac:	d54080e7          	jalr	-684(ra) # 48fc <fork>
+  if(pid == 0) {
+    1bb0:	c115                	beqz	a0,1bd4 <stacktest+0x38>
+  } else if(pid < 0){
+    1bb2:	04054363          	bltz	a0,1bf8 <stacktest+0x5c>
+  wait(&xstatus);
+    1bb6:	fdc40513          	addi	a0,s0,-36
+    1bba:	00003097          	auipc	ra,0x3
+    1bbe:	d54080e7          	jalr	-684(ra) # 490e <wait>
+  if(xstatus == -1)  // kernel killed child?
+    1bc2:	fdc42503          	lw	a0,-36(s0)
+    1bc6:	57fd                	li	a5,-1
+    1bc8:	04f50663          	beq	a0,a5,1c14 <stacktest+0x78>
+    exit(xstatus);
+    1bcc:	00003097          	auipc	ra,0x3
+    1bd0:	d38080e7          	jalr	-712(ra) # 4904 <exit>
+
+static inline uint64
+r_sp()
+{
+  uint64 x;
+  asm volatile("mv %0, sp" : "=r" (x) );
+    1bd4:	870a                	mv	a4,sp
+    printf("%s: stacktest: read below stack %p\n", *sp);
+    1bd6:	77fd                	lui	a5,0xfffff
+    1bd8:	97ba                	add	a5,a5,a4
+    1bda:	0007c583          	lbu	a1,0(a5) # fffffffffffff000 <__BSS_END__+0xffffffffffff2f50>
+    1bde:	00004517          	auipc	a0,0x4
+    1be2:	d4250513          	addi	a0,a0,-702 # 5920 <malloc+0xba0>
+    1be6:	00003097          	auipc	ra,0x3
+    1bea:	0e2080e7          	jalr	226(ra) # 4cc8 <printf>
+    exit(1);
+    1bee:	4505                	li	a0,1
+    1bf0:	00003097          	auipc	ra,0x3
+    1bf4:	d14080e7          	jalr	-748(ra) # 4904 <exit>
+    printf("%s: fork failed\n", s);
+    1bf8:	85a6                	mv	a1,s1
+    1bfa:	00004517          	auipc	a0,0x4
+    1bfe:	97650513          	addi	a0,a0,-1674 # 5570 <malloc+0x7f0>
+    1c02:	00003097          	auipc	ra,0x3
+    1c06:	0c6080e7          	jalr	198(ra) # 4cc8 <printf>
+    exit(1);
+    1c0a:	4505                	li	a0,1
+    1c0c:	00003097          	auipc	ra,0x3
+    1c10:	cf8080e7          	jalr	-776(ra) # 4904 <exit>
+    exit(0);
+    1c14:	4501                	li	a0,0
+    1c16:	00003097          	auipc	ra,0x3
+    1c1a:	cee080e7          	jalr	-786(ra) # 4904 <exit>
+
+0000000000001c1e <copyinstr3>:
+{
+    1c1e:	7179                	addi	sp,sp,-48
+    1c20:	f406                	sd	ra,40(sp)
+    1c22:	f022                	sd	s0,32(sp)
+    1c24:	ec26                	sd	s1,24(sp)
+    1c26:	1800                	addi	s0,sp,48
+  sbrk(8192);
+    1c28:	6509                	lui	a0,0x2
+    1c2a:	00003097          	auipc	ra,0x3
+    1c2e:	d60080e7          	jalr	-672(ra) # 498a <sbrk>
+  uint64 top = (uint64) sbrk(0);
+    1c32:	4501                	li	a0,0
+    1c34:	00003097          	auipc	ra,0x3
+    1c38:	d56080e7          	jalr	-682(ra) # 498a <sbrk>
+  if((top % PGSIZE) != 0){
+    1c3c:	03451793          	slli	a5,a0,0x34
+    1c40:	eba5                	bnez	a5,1cb0 <copyinstr3+0x92>
+  top = (uint64) sbrk(0);
+    1c42:	4501                	li	a0,0
+    1c44:	00003097          	auipc	ra,0x3
+    1c48:	d46080e7          	jalr	-698(ra) # 498a <sbrk>
+  if(top % PGSIZE){
+    1c4c:	03451793          	slli	a5,a0,0x34
+    1c50:	ebb5                	bnez	a5,1cc4 <copyinstr3+0xa6>
+  char *b = (char *) (top - 1);
+    1c52:	fff50493          	addi	s1,a0,-1 # 1fff <sbrkmuch+0x143>
+  *b = 'x';
+    1c56:	07800793          	li	a5,120
+    1c5a:	fef50fa3          	sb	a5,-1(a0)
+  int ret = remove(b);
+    1c5e:	8526                	mv	a0,s1
+    1c60:	00003097          	auipc	ra,0x3
+    1c64:	d64080e7          	jalr	-668(ra) # 49c4 <remove>
+  if(ret != -1){
+    1c68:	57fd                	li	a5,-1
+    1c6a:	06f51a63          	bne	a0,a5,1cde <copyinstr3+0xc0>
+  int fd = open(b, O_CREATE | O_WRONLY);
+    1c6e:	20100593          	li	a1,513
+    1c72:	8526                	mv	a0,s1
+    1c74:	00003097          	auipc	ra,0x3
+    1c78:	cdc080e7          	jalr	-804(ra) # 4950 <open>
+  if(fd != -1){
+    1c7c:	57fd                	li	a5,-1
+    1c7e:	06f51f63          	bne	a0,a5,1cfc <copyinstr3+0xde>
+  char *args[] = { "xx", 0 };
+    1c82:	00004797          	auipc	a5,0x4
+    1c86:	44e78793          	addi	a5,a5,1102 # 60d0 <malloc+0x1350>
+    1c8a:	fcf43823          	sd	a5,-48(s0)
+    1c8e:	fc043c23          	sd	zero,-40(s0)
+  ret = exec(b, args);
+    1c92:	fd040593          	addi	a1,s0,-48
+    1c96:	8526                	mv	a0,s1
+    1c98:	00003097          	auipc	ra,0x3
+    1c9c:	cae080e7          	jalr	-850(ra) # 4946 <exec>
+  if(ret != -1){
+    1ca0:	57fd                	li	a5,-1
+    1ca2:	06f51c63          	bne	a0,a5,1d1a <copyinstr3+0xfc>
+}
+    1ca6:	70a2                	ld	ra,40(sp)
+    1ca8:	7402                	ld	s0,32(sp)
+    1caa:	64e2                	ld	s1,24(sp)
+    1cac:	6145                	addi	sp,sp,48
+    1cae:	8082                	ret
+    sbrk(PGSIZE - (top % PGSIZE));
+    1cb0:	0347d513          	srli	a0,a5,0x34
+    1cb4:	6785                	lui	a5,0x1
+    1cb6:	40a7853b          	subw	a0,a5,a0
+    1cba:	00003097          	auipc	ra,0x3
+    1cbe:	cd0080e7          	jalr	-816(ra) # 498a <sbrk>
+    1cc2:	b741                	j	1c42 <copyinstr3+0x24>
+    printf("oops\n");
+    1cc4:	00004517          	auipc	a0,0x4
+    1cc8:	c8450513          	addi	a0,a0,-892 # 5948 <malloc+0xbc8>
+    1ccc:	00003097          	auipc	ra,0x3
+    1cd0:	ffc080e7          	jalr	-4(ra) # 4cc8 <printf>
+    exit(1);
+    1cd4:	4505                	li	a0,1
+    1cd6:	00003097          	auipc	ra,0x3
+    1cda:	c2e080e7          	jalr	-978(ra) # 4904 <exit>
+    printf("remove(%s) returned %d, not -1\n", b, ret);
+    1cde:	862a                	mv	a2,a0
+    1ce0:	85a6                	mv	a1,s1
+    1ce2:	00003517          	auipc	a0,0x3
+    1ce6:	7d650513          	addi	a0,a0,2006 # 54b8 <malloc+0x738>
+    1cea:	00003097          	auipc	ra,0x3
+    1cee:	fde080e7          	jalr	-34(ra) # 4cc8 <printf>
+    exit(1);
+    1cf2:	4505                	li	a0,1
+    1cf4:	00003097          	auipc	ra,0x3
+    1cf8:	c10080e7          	jalr	-1008(ra) # 4904 <exit>
+    printf("open(%s) returned %d, not -1\n", b, fd);
+    1cfc:	862a                	mv	a2,a0
+    1cfe:	85a6                	mv	a1,s1
+    1d00:	00003517          	auipc	a0,0x3
+    1d04:	7d850513          	addi	a0,a0,2008 # 54d8 <malloc+0x758>
+    1d08:	00003097          	auipc	ra,0x3
+    1d0c:	fc0080e7          	jalr	-64(ra) # 4cc8 <printf>
+    exit(1);
+    1d10:	4505                	li	a0,1
+    1d12:	00003097          	auipc	ra,0x3
+    1d16:	bf2080e7          	jalr	-1038(ra) # 4904 <exit>
+    printf("exec(%s) returned %d, not -1\n", b, fd);
+    1d1a:	567d                	li	a2,-1
+    1d1c:	85a6                	mv	a1,s1
+    1d1e:	00003517          	auipc	a0,0x3
+    1d22:	7da50513          	addi	a0,a0,2010 # 54f8 <malloc+0x778>
+    1d26:	00003097          	auipc	ra,0x3
+    1d2a:	fa2080e7          	jalr	-94(ra) # 4cc8 <printf>
+    exit(1);
+    1d2e:	4505                	li	a0,1
+    1d30:	00003097          	auipc	ra,0x3
+    1d34:	bd4080e7          	jalr	-1068(ra) # 4904 <exit>
+
+0000000000001d38 <sbrkbasic>:
+{
+    1d38:	7139                	addi	sp,sp,-64
+    1d3a:	fc06                	sd	ra,56(sp)
+    1d3c:	f822                	sd	s0,48(sp)
+    1d3e:	f426                	sd	s1,40(sp)
+    1d40:	f04a                	sd	s2,32(sp)
+    1d42:	ec4e                	sd	s3,24(sp)
+    1d44:	e852                	sd	s4,16(sp)
+    1d46:	0080                	addi	s0,sp,64
+    1d48:	8a2a                	mv	s4,a0
+  pid = fork();
+    1d4a:	00003097          	auipc	ra,0x3
+    1d4e:	bb2080e7          	jalr	-1102(ra) # 48fc <fork>
+  if(pid < 0){
+    1d52:	02054c63          	bltz	a0,1d8a <sbrkbasic+0x52>
+  if(pid == 0){
+    1d56:	ed21                	bnez	a0,1dae <sbrkbasic+0x76>
+    a = sbrk(TOOMUCH);
+    1d58:	40000537          	lui	a0,0x40000
+    1d5c:	00003097          	auipc	ra,0x3
+    1d60:	c2e080e7          	jalr	-978(ra) # 498a <sbrk>
+    if(a == (char*)0xffffffffffffffffL){
+    1d64:	57fd                	li	a5,-1
+    1d66:	02f50f63          	beq	a0,a5,1da4 <sbrkbasic+0x6c>
+    for(b = a; b < a+TOOMUCH; b += 4096){
+    1d6a:	400007b7          	lui	a5,0x40000
+    1d6e:	97aa                	add	a5,a5,a0
+      *b = 99;
+    1d70:	06300693          	li	a3,99
+    for(b = a; b < a+TOOMUCH; b += 4096){
+    1d74:	6705                	lui	a4,0x1
+      *b = 99;
+    1d76:	00d50023          	sb	a3,0(a0) # 40000000 <__BSS_END__+0x3fff3f50>
+    for(b = a; b < a+TOOMUCH; b += 4096){
+    1d7a:	953a                	add	a0,a0,a4
+    1d7c:	fef51de3          	bne	a0,a5,1d76 <sbrkbasic+0x3e>
+    exit(1);
+    1d80:	4505                	li	a0,1
+    1d82:	00003097          	auipc	ra,0x3
+    1d86:	b82080e7          	jalr	-1150(ra) # 4904 <exit>
+    printf("fork failed in sbrkbasic\n");
+    1d8a:	00004517          	auipc	a0,0x4
+    1d8e:	bc650513          	addi	a0,a0,-1082 # 5950 <malloc+0xbd0>
+    1d92:	00003097          	auipc	ra,0x3
+    1d96:	f36080e7          	jalr	-202(ra) # 4cc8 <printf>
+    exit(1);
+    1d9a:	4505                	li	a0,1
+    1d9c:	00003097          	auipc	ra,0x3
+    1da0:	b68080e7          	jalr	-1176(ra) # 4904 <exit>
+      exit(0);
+    1da4:	4501                	li	a0,0
+    1da6:	00003097          	auipc	ra,0x3
+    1daa:	b5e080e7          	jalr	-1186(ra) # 4904 <exit>
+  wait(&xstatus);
+    1dae:	fcc40513          	addi	a0,s0,-52
+    1db2:	00003097          	auipc	ra,0x3
+    1db6:	b5c080e7          	jalr	-1188(ra) # 490e <wait>
+  if(xstatus == 1){
+    1dba:	fcc42703          	lw	a4,-52(s0)
+    1dbe:	4785                	li	a5,1
+    1dc0:	00f70d63          	beq	a4,a5,1dda <sbrkbasic+0xa2>
+  a = sbrk(0);
+    1dc4:	4501                	li	a0,0
+    1dc6:	00003097          	auipc	ra,0x3
+    1dca:	bc4080e7          	jalr	-1084(ra) # 498a <sbrk>
+    1dce:	84aa                	mv	s1,a0
+  for(i = 0; i < 5000; i++){
+    1dd0:	4901                	li	s2,0
+    1dd2:	6985                	lui	s3,0x1
+    1dd4:	38898993          	addi	s3,s3,904 # 1388 <exectest+0xc8>
+    1dd8:	a005                	j	1df8 <sbrkbasic+0xc0>
+    printf("%s: too much memory allocated!\n", s);
+    1dda:	85d2                	mv	a1,s4
+    1ddc:	00004517          	auipc	a0,0x4
+    1de0:	b9450513          	addi	a0,a0,-1132 # 5970 <malloc+0xbf0>
+    1de4:	00003097          	auipc	ra,0x3
+    1de8:	ee4080e7          	jalr	-284(ra) # 4cc8 <printf>
+    exit(1);
+    1dec:	4505                	li	a0,1
+    1dee:	00003097          	auipc	ra,0x3
+    1df2:	b16080e7          	jalr	-1258(ra) # 4904 <exit>
+    a = b + 1;
+    1df6:	84be                	mv	s1,a5
+    b = sbrk(1);
+    1df8:	4505                	li	a0,1
+    1dfa:	00003097          	auipc	ra,0x3
+    1dfe:	b90080e7          	jalr	-1136(ra) # 498a <sbrk>
+    if(b != a){
+    1e02:	04951c63          	bne	a0,s1,1e5a <sbrkbasic+0x122>
+    *b = 1;
+    1e06:	4785                	li	a5,1
+    1e08:	00f48023          	sb	a5,0(s1)
+    a = b + 1;
+    1e0c:	00148793          	addi	a5,s1,1
+  for(i = 0; i < 5000; i++){
+    1e10:	2905                	addiw	s2,s2,1
+    1e12:	ff3912e3          	bne	s2,s3,1df6 <sbrkbasic+0xbe>
+  pid = fork();
+    1e16:	00003097          	auipc	ra,0x3
+    1e1a:	ae6080e7          	jalr	-1306(ra) # 48fc <fork>
+    1e1e:	892a                	mv	s2,a0
+  if(pid < 0){
+    1e20:	04054d63          	bltz	a0,1e7a <sbrkbasic+0x142>
+  c = sbrk(1);
+    1e24:	4505                	li	a0,1
+    1e26:	00003097          	auipc	ra,0x3
+    1e2a:	b64080e7          	jalr	-1180(ra) # 498a <sbrk>
+  c = sbrk(1);
+    1e2e:	4505                	li	a0,1
+    1e30:	00003097          	auipc	ra,0x3
+    1e34:	b5a080e7          	jalr	-1190(ra) # 498a <sbrk>
+  if(c != a + 1){
+    1e38:	0489                	addi	s1,s1,2
+    1e3a:	04a48e63          	beq	s1,a0,1e96 <sbrkbasic+0x15e>
+    printf("%s: sbrk test failed post-fork\n", s);
+    1e3e:	85d2                	mv	a1,s4
+    1e40:	00004517          	auipc	a0,0x4
+    1e44:	b9050513          	addi	a0,a0,-1136 # 59d0 <malloc+0xc50>
+    1e48:	00003097          	auipc	ra,0x3
+    1e4c:	e80080e7          	jalr	-384(ra) # 4cc8 <printf>
+    exit(1);
+    1e50:	4505                	li	a0,1
+    1e52:	00003097          	auipc	ra,0x3
+    1e56:	ab2080e7          	jalr	-1358(ra) # 4904 <exit>
+      printf("%s: sbrk test failed %d %x %x\n", i, a, b);
+    1e5a:	86aa                	mv	a3,a0
+    1e5c:	8626                	mv	a2,s1
+    1e5e:	85ca                	mv	a1,s2
+    1e60:	00004517          	auipc	a0,0x4
+    1e64:	b3050513          	addi	a0,a0,-1232 # 5990 <malloc+0xc10>
+    1e68:	00003097          	auipc	ra,0x3
+    1e6c:	e60080e7          	jalr	-416(ra) # 4cc8 <printf>
+      exit(1);
+    1e70:	4505                	li	a0,1
+    1e72:	00003097          	auipc	ra,0x3
+    1e76:	a92080e7          	jalr	-1390(ra) # 4904 <exit>
+    printf("%s: sbrk test fork failed\n", s);
+    1e7a:	85d2                	mv	a1,s4
+    1e7c:	00004517          	auipc	a0,0x4
+    1e80:	b3450513          	addi	a0,a0,-1228 # 59b0 <malloc+0xc30>
+    1e84:	00003097          	auipc	ra,0x3
+    1e88:	e44080e7          	jalr	-444(ra) # 4cc8 <printf>
+    exit(1);
+    1e8c:	4505                	li	a0,1
+    1e8e:	00003097          	auipc	ra,0x3
+    1e92:	a76080e7          	jalr	-1418(ra) # 4904 <exit>
+  if(pid == 0)
+    1e96:	00091763          	bnez	s2,1ea4 <sbrkbasic+0x16c>
+    exit(0);
+    1e9a:	4501                	li	a0,0
+    1e9c:	00003097          	auipc	ra,0x3
+    1ea0:	a68080e7          	jalr	-1432(ra) # 4904 <exit>
+  wait(&xstatus);
+    1ea4:	fcc40513          	addi	a0,s0,-52
+    1ea8:	00003097          	auipc	ra,0x3
+    1eac:	a66080e7          	jalr	-1434(ra) # 490e <wait>
+  exit(xstatus);
+    1eb0:	fcc42503          	lw	a0,-52(s0)
+    1eb4:	00003097          	auipc	ra,0x3
+    1eb8:	a50080e7          	jalr	-1456(ra) # 4904 <exit>
+
+0000000000001ebc <sbrkmuch>:
+{
+    1ebc:	7179                	addi	sp,sp,-48
+    1ebe:	f406                	sd	ra,40(sp)
+    1ec0:	f022                	sd	s0,32(sp)
+    1ec2:	ec26                	sd	s1,24(sp)
+    1ec4:	e84a                	sd	s2,16(sp)
+    1ec6:	e44e                	sd	s3,8(sp)
+    1ec8:	e052                	sd	s4,0(sp)
+    1eca:	1800                	addi	s0,sp,48
+    1ecc:	89aa                	mv	s3,a0
+  oldbrk = sbrk(0);
+    1ece:	4501                	li	a0,0
+    1ed0:	00003097          	auipc	ra,0x3
+    1ed4:	aba080e7          	jalr	-1350(ra) # 498a <sbrk>
+    1ed8:	892a                	mv	s2,a0
+  a = sbrk(0);
+    1eda:	4501                	li	a0,0
+    1edc:	00003097          	auipc	ra,0x3
+    1ee0:	aae080e7          	jalr	-1362(ra) # 498a <sbrk>
+    1ee4:	84aa                	mv	s1,a0
+  p = sbrk(amt);
+    1ee6:	00300537          	lui	a0,0x300
+    1eea:	9d05                	subw	a0,a0,s1
+    1eec:	00003097          	auipc	ra,0x3
+    1ef0:	a9e080e7          	jalr	-1378(ra) # 498a <sbrk>
+  if (p != a) {
+    1ef4:	0ca49863          	bne	s1,a0,1fc4 <sbrkmuch+0x108>
+  char *eee = sbrk(0);
+    1ef8:	4501                	li	a0,0
+    1efa:	00003097          	auipc	ra,0x3
+    1efe:	a90080e7          	jalr	-1392(ra) # 498a <sbrk>
+    1f02:	87aa                	mv	a5,a0
+  for(char *pp = a; pp < eee; pp += 4096)
+    1f04:	00a4f963          	bgeu	s1,a0,1f16 <sbrkmuch+0x5a>
+    *pp = 1;
+    1f08:	4685                	li	a3,1
+  for(char *pp = a; pp < eee; pp += 4096)
+    1f0a:	6705                	lui	a4,0x1
+    *pp = 1;
+    1f0c:	00d48023          	sb	a3,0(s1)
+  for(char *pp = a; pp < eee; pp += 4096)
+    1f10:	94ba                	add	s1,s1,a4
+    1f12:	fef4ede3          	bltu	s1,a5,1f0c <sbrkmuch+0x50>
+  *lastaddr = 99;
+    1f16:	003007b7          	lui	a5,0x300
+    1f1a:	06300713          	li	a4,99
+    1f1e:	fee78fa3          	sb	a4,-1(a5) # 2fffff <__BSS_END__+0x2f3f4f>
+  a = sbrk(0);
+    1f22:	4501                	li	a0,0
+    1f24:	00003097          	auipc	ra,0x3
+    1f28:	a66080e7          	jalr	-1434(ra) # 498a <sbrk>
+    1f2c:	84aa                	mv	s1,a0
+  c = sbrk(-PGSIZE);
+    1f2e:	757d                	lui	a0,0xfffff
+    1f30:	00003097          	auipc	ra,0x3
+    1f34:	a5a080e7          	jalr	-1446(ra) # 498a <sbrk>
+  if(c == (char*)0xffffffffffffffffL){
+    1f38:	57fd                	li	a5,-1
+    1f3a:	0af50363          	beq	a0,a5,1fe0 <sbrkmuch+0x124>
+  c = sbrk(0);
+    1f3e:	4501                	li	a0,0
+    1f40:	00003097          	auipc	ra,0x3
+    1f44:	a4a080e7          	jalr	-1462(ra) # 498a <sbrk>
+  if(c != a - PGSIZE){
+    1f48:	77fd                	lui	a5,0xfffff
+    1f4a:	97a6                	add	a5,a5,s1
+    1f4c:	0af51863          	bne	a0,a5,1ffc <sbrkmuch+0x140>
+  a = sbrk(0);
+    1f50:	4501                	li	a0,0
+    1f52:	00003097          	auipc	ra,0x3
+    1f56:	a38080e7          	jalr	-1480(ra) # 498a <sbrk>
+    1f5a:	84aa                	mv	s1,a0
+  c = sbrk(PGSIZE);
+    1f5c:	6505                	lui	a0,0x1
+    1f5e:	00003097          	auipc	ra,0x3
+    1f62:	a2c080e7          	jalr	-1492(ra) # 498a <sbrk>
+    1f66:	8a2a                	mv	s4,a0
+  if(c != a || sbrk(0) != a + PGSIZE){
+    1f68:	0aa49963          	bne	s1,a0,201a <sbrkmuch+0x15e>
+    1f6c:	4501                	li	a0,0
+    1f6e:	00003097          	auipc	ra,0x3
+    1f72:	a1c080e7          	jalr	-1508(ra) # 498a <sbrk>
+    1f76:	6785                	lui	a5,0x1
+    1f78:	97a6                	add	a5,a5,s1
+    1f7a:	0af51063          	bne	a0,a5,201a <sbrkmuch+0x15e>
+  if(*lastaddr == 99){
+    1f7e:	003007b7          	lui	a5,0x300
+    1f82:	fff7c703          	lbu	a4,-1(a5) # 2fffff <__BSS_END__+0x2f3f4f>
+    1f86:	06300793          	li	a5,99
+    1f8a:	0af70763          	beq	a4,a5,2038 <sbrkmuch+0x17c>
+  a = sbrk(0);
+    1f8e:	4501                	li	a0,0
+    1f90:	00003097          	auipc	ra,0x3
+    1f94:	9fa080e7          	jalr	-1542(ra) # 498a <sbrk>
+    1f98:	84aa                	mv	s1,a0
+  c = sbrk(-(sbrk(0) - oldbrk));
+    1f9a:	4501                	li	a0,0
+    1f9c:	00003097          	auipc	ra,0x3
+    1fa0:	9ee080e7          	jalr	-1554(ra) # 498a <sbrk>
+    1fa4:	40a9053b          	subw	a0,s2,a0
+    1fa8:	00003097          	auipc	ra,0x3
+    1fac:	9e2080e7          	jalr	-1566(ra) # 498a <sbrk>
+  if(c != a){
+    1fb0:	0aa49263          	bne	s1,a0,2054 <sbrkmuch+0x198>
+}
+    1fb4:	70a2                	ld	ra,40(sp)
+    1fb6:	7402                	ld	s0,32(sp)
+    1fb8:	64e2                	ld	s1,24(sp)
+    1fba:	6942                	ld	s2,16(sp)
+    1fbc:	69a2                	ld	s3,8(sp)
+    1fbe:	6a02                	ld	s4,0(sp)
+    1fc0:	6145                	addi	sp,sp,48
+    1fc2:	8082                	ret
+    printf("%s: sbrk test failed to grow big address space; enough phys mem?\n", s);
+    1fc4:	85ce                	mv	a1,s3
+    1fc6:	00004517          	auipc	a0,0x4
+    1fca:	a2a50513          	addi	a0,a0,-1494 # 59f0 <malloc+0xc70>
+    1fce:	00003097          	auipc	ra,0x3
+    1fd2:	cfa080e7          	jalr	-774(ra) # 4cc8 <printf>
+    exit(1);
+    1fd6:	4505                	li	a0,1
+    1fd8:	00003097          	auipc	ra,0x3
+    1fdc:	92c080e7          	jalr	-1748(ra) # 4904 <exit>
+    printf("%s: sbrk could not deallocate\n", s);
+    1fe0:	85ce                	mv	a1,s3
+    1fe2:	00004517          	auipc	a0,0x4
+    1fe6:	a5650513          	addi	a0,a0,-1450 # 5a38 <malloc+0xcb8>
+    1fea:	00003097          	auipc	ra,0x3
+    1fee:	cde080e7          	jalr	-802(ra) # 4cc8 <printf>
+    exit(1);
+    1ff2:	4505                	li	a0,1
+    1ff4:	00003097          	auipc	ra,0x3
+    1ff8:	910080e7          	jalr	-1776(ra) # 4904 <exit>
+    printf("%s: sbrk deallocation produced wrong address, a %x c %x\n", a, c);
+    1ffc:	862a                	mv	a2,a0
+    1ffe:	85a6                	mv	a1,s1
+    2000:	00004517          	auipc	a0,0x4
+    2004:	a5850513          	addi	a0,a0,-1448 # 5a58 <malloc+0xcd8>
+    2008:	00003097          	auipc	ra,0x3
+    200c:	cc0080e7          	jalr	-832(ra) # 4cc8 <printf>
+    exit(1);
+    2010:	4505                	li	a0,1
+    2012:	00003097          	auipc	ra,0x3
+    2016:	8f2080e7          	jalr	-1806(ra) # 4904 <exit>
+    printf("%s: sbrk re-allocation failed, a %x c %x\n", a, c);
+    201a:	8652                	mv	a2,s4
+    201c:	85a6                	mv	a1,s1
+    201e:	00004517          	auipc	a0,0x4
+    2022:	a7a50513          	addi	a0,a0,-1414 # 5a98 <malloc+0xd18>
+    2026:	00003097          	auipc	ra,0x3
+    202a:	ca2080e7          	jalr	-862(ra) # 4cc8 <printf>
+    exit(1);
+    202e:	4505                	li	a0,1
+    2030:	00003097          	auipc	ra,0x3
+    2034:	8d4080e7          	jalr	-1836(ra) # 4904 <exit>
+    printf("%s: sbrk de-allocation didn't really deallocate\n", s);
+    2038:	85ce                	mv	a1,s3
+    203a:	00004517          	auipc	a0,0x4
+    203e:	a8e50513          	addi	a0,a0,-1394 # 5ac8 <malloc+0xd48>
+    2042:	00003097          	auipc	ra,0x3
+    2046:	c86080e7          	jalr	-890(ra) # 4cc8 <printf>
+    exit(1);
+    204a:	4505                	li	a0,1
+    204c:	00003097          	auipc	ra,0x3
+    2050:	8b8080e7          	jalr	-1864(ra) # 4904 <exit>
+    printf("%s: sbrk downsize failed, a %x c %x\n", a, c);
+    2054:	862a                	mv	a2,a0
+    2056:	85a6                	mv	a1,s1
+    2058:	00004517          	auipc	a0,0x4
+    205c:	aa850513          	addi	a0,a0,-1368 # 5b00 <malloc+0xd80>
+    2060:	00003097          	auipc	ra,0x3
+    2064:	c68080e7          	jalr	-920(ra) # 4cc8 <printf>
+    exit(1);
+    2068:	4505                	li	a0,1
+    206a:	00003097          	auipc	ra,0x3
+    206e:	89a080e7          	jalr	-1894(ra) # 4904 <exit>
+
+0000000000002072 <sbrkarg>:
+{
+    2072:	7179                	addi	sp,sp,-48
+    2074:	f406                	sd	ra,40(sp)
+    2076:	f022                	sd	s0,32(sp)
+    2078:	ec26                	sd	s1,24(sp)
+    207a:	e84a                	sd	s2,16(sp)
+    207c:	e44e                	sd	s3,8(sp)
+    207e:	1800                	addi	s0,sp,48
+    2080:	89aa                	mv	s3,a0
+  a = sbrk(PGSIZE);
+    2082:	6505                	lui	a0,0x1
+    2084:	00003097          	auipc	ra,0x3
+    2088:	906080e7          	jalr	-1786(ra) # 498a <sbrk>
+    208c:	892a                	mv	s2,a0
+  fd = open("sbrk", O_CREATE|O_WRONLY);
+    208e:	20100593          	li	a1,513
+    2092:	00004517          	auipc	a0,0x4
+    2096:	a9650513          	addi	a0,a0,-1386 # 5b28 <malloc+0xda8>
+    209a:	00003097          	auipc	ra,0x3
+    209e:	8b6080e7          	jalr	-1866(ra) # 4950 <open>
+    20a2:	84aa                	mv	s1,a0
+  remove("sbrk");
+    20a4:	00004517          	auipc	a0,0x4
+    20a8:	a8450513          	addi	a0,a0,-1404 # 5b28 <malloc+0xda8>
+    20ac:	00003097          	auipc	ra,0x3
+    20b0:	918080e7          	jalr	-1768(ra) # 49c4 <remove>
+  if(fd < 0)  {
+    20b4:	0404c163          	bltz	s1,20f6 <sbrkarg+0x84>
+  if ((n = write(fd, a, PGSIZE)) < 0) {
+    20b8:	6605                	lui	a2,0x1
+    20ba:	85ca                	mv	a1,s2
+    20bc:	8526                	mv	a0,s1
+    20be:	00003097          	auipc	ra,0x3
+    20c2:	86c080e7          	jalr	-1940(ra) # 492a <write>
+    20c6:	04054663          	bltz	a0,2112 <sbrkarg+0xa0>
+  close(fd);
+    20ca:	8526                	mv	a0,s1
+    20cc:	00003097          	auipc	ra,0x3
+    20d0:	868080e7          	jalr	-1944(ra) # 4934 <close>
+  a = sbrk(PGSIZE);
+    20d4:	6505                	lui	a0,0x1
+    20d6:	00003097          	auipc	ra,0x3
+    20da:	8b4080e7          	jalr	-1868(ra) # 498a <sbrk>
+  if(pipe((int *) a) != 0){
+    20de:	00003097          	auipc	ra,0x3
+    20e2:	838080e7          	jalr	-1992(ra) # 4916 <pipe>
+    20e6:	e521                	bnez	a0,212e <sbrkarg+0xbc>
+}
+    20e8:	70a2                	ld	ra,40(sp)
+    20ea:	7402                	ld	s0,32(sp)
+    20ec:	64e2                	ld	s1,24(sp)
+    20ee:	6942                	ld	s2,16(sp)
+    20f0:	69a2                	ld	s3,8(sp)
+    20f2:	6145                	addi	sp,sp,48
+    20f4:	8082                	ret
+    printf("%s: open sbrk failed\n", s);
+    20f6:	85ce                	mv	a1,s3
+    20f8:	00004517          	auipc	a0,0x4
+    20fc:	a3850513          	addi	a0,a0,-1480 # 5b30 <malloc+0xdb0>
+    2100:	00003097          	auipc	ra,0x3
+    2104:	bc8080e7          	jalr	-1080(ra) # 4cc8 <printf>
+    exit(1);
+    2108:	4505                	li	a0,1
+    210a:	00002097          	auipc	ra,0x2
+    210e:	7fa080e7          	jalr	2042(ra) # 4904 <exit>
+    printf("%s: write sbrk failed\n", s);
+    2112:	85ce                	mv	a1,s3
+    2114:	00004517          	auipc	a0,0x4
+    2118:	a3450513          	addi	a0,a0,-1484 # 5b48 <malloc+0xdc8>
+    211c:	00003097          	auipc	ra,0x3
+    2120:	bac080e7          	jalr	-1108(ra) # 4cc8 <printf>
+    exit(1);
+    2124:	4505                	li	a0,1
+    2126:	00002097          	auipc	ra,0x2
+    212a:	7de080e7          	jalr	2014(ra) # 4904 <exit>
+    printf("%s: pipe() failed\n", s);
+    212e:	85ce                	mv	a1,s3
+    2130:	00003517          	auipc	a0,0x3
+    2134:	54850513          	addi	a0,a0,1352 # 5678 <malloc+0x8f8>
+    2138:	00003097          	auipc	ra,0x3
+    213c:	b90080e7          	jalr	-1136(ra) # 4cc8 <printf>
+    exit(1);
+    2140:	4505                	li	a0,1
+    2142:	00002097          	auipc	ra,0x2
+    2146:	7c2080e7          	jalr	1986(ra) # 4904 <exit>
+
+000000000000214a <argptest>:
+{
+    214a:	1101                	addi	sp,sp,-32
+    214c:	ec06                	sd	ra,24(sp)
+    214e:	e822                	sd	s0,16(sp)
+    2150:	e426                	sd	s1,8(sp)
+    2152:	e04a                	sd	s2,0(sp)
+    2154:	1000                	addi	s0,sp,32
+    2156:	892a                	mv	s2,a0
+  fd = open("init", O_RDONLY);
+    2158:	4581                	li	a1,0
+    215a:	00004517          	auipc	a0,0x4
+    215e:	a0650513          	addi	a0,a0,-1530 # 5b60 <malloc+0xde0>
+    2162:	00002097          	auipc	ra,0x2
+    2166:	7ee080e7          	jalr	2030(ra) # 4950 <open>
+  if (fd < 0) {
+    216a:	02054b63          	bltz	a0,21a0 <argptest+0x56>
+    216e:	84aa                	mv	s1,a0
+  read(fd, sbrk(0) - 1, -1);
+    2170:	4501                	li	a0,0
+    2172:	00003097          	auipc	ra,0x3
+    2176:	818080e7          	jalr	-2024(ra) # 498a <sbrk>
+    217a:	567d                	li	a2,-1
+    217c:	fff50593          	addi	a1,a0,-1
+    2180:	8526                	mv	a0,s1
+    2182:	00002097          	auipc	ra,0x2
+    2186:	79e080e7          	jalr	1950(ra) # 4920 <read>
+  close(fd);
+    218a:	8526                	mv	a0,s1
+    218c:	00002097          	auipc	ra,0x2
+    2190:	7a8080e7          	jalr	1960(ra) # 4934 <close>
+}
+    2194:	60e2                	ld	ra,24(sp)
+    2196:	6442                	ld	s0,16(sp)
+    2198:	64a2                	ld	s1,8(sp)
+    219a:	6902                	ld	s2,0(sp)
+    219c:	6105                	addi	sp,sp,32
+    219e:	8082                	ret
+    printf("%s: open failed\n", s);
+    21a0:	85ca                	mv	a1,s2
+    21a2:	00003517          	auipc	a0,0x3
+    21a6:	3e650513          	addi	a0,a0,998 # 5588 <malloc+0x808>
+    21aa:	00003097          	auipc	ra,0x3
+    21ae:	b1e080e7          	jalr	-1250(ra) # 4cc8 <printf>
+    exit(1);
+    21b2:	4505                	li	a0,1
+    21b4:	00002097          	auipc	ra,0x2
+    21b8:	750080e7          	jalr	1872(ra) # 4904 <exit>
+
+00000000000021bc <sbrkbugs>:
+{
+    21bc:	1141                	addi	sp,sp,-16
+    21be:	e406                	sd	ra,8(sp)
+    21c0:	e022                	sd	s0,0(sp)
+    21c2:	0800                	addi	s0,sp,16
+  int pid = fork();
+    21c4:	00002097          	auipc	ra,0x2
+    21c8:	738080e7          	jalr	1848(ra) # 48fc <fork>
+  if(pid < 0){
+    21cc:	02054263          	bltz	a0,21f0 <sbrkbugs+0x34>
+  if(pid == 0){
+    21d0:	ed0d                	bnez	a0,220a <sbrkbugs+0x4e>
+    int sz = (uint64) sbrk(0);
+    21d2:	00002097          	auipc	ra,0x2
+    21d6:	7b8080e7          	jalr	1976(ra) # 498a <sbrk>
+    sbrk(-sz);
+    21da:	40a0053b          	negw	a0,a0
+    21de:	00002097          	auipc	ra,0x2
+    21e2:	7ac080e7          	jalr	1964(ra) # 498a <sbrk>
+    exit(0);
+    21e6:	4501                	li	a0,0
+    21e8:	00002097          	auipc	ra,0x2
+    21ec:	71c080e7          	jalr	1820(ra) # 4904 <exit>
+    printf("fork failed\n");
+    21f0:	00003517          	auipc	a0,0x3
+    21f4:	70050513          	addi	a0,a0,1792 # 58f0 <malloc+0xb70>
+    21f8:	00003097          	auipc	ra,0x3
+    21fc:	ad0080e7          	jalr	-1328(ra) # 4cc8 <printf>
+    exit(1);
+    2200:	4505                	li	a0,1
+    2202:	00002097          	auipc	ra,0x2
+    2206:	702080e7          	jalr	1794(ra) # 4904 <exit>
+  wait(0);
+    220a:	4501                	li	a0,0
+    220c:	00002097          	auipc	ra,0x2
+    2210:	702080e7          	jalr	1794(ra) # 490e <wait>
+  pid = fork();
+    2214:	00002097          	auipc	ra,0x2
+    2218:	6e8080e7          	jalr	1768(ra) # 48fc <fork>
+  if(pid < 0){
+    221c:	02054563          	bltz	a0,2246 <sbrkbugs+0x8a>
+  if(pid == 0){
+    2220:	e121                	bnez	a0,2260 <sbrkbugs+0xa4>
+    int sz = (uint64) sbrk(0);
+    2222:	00002097          	auipc	ra,0x2
+    2226:	768080e7          	jalr	1896(ra) # 498a <sbrk>
+    sbrk(-(sz - 3500));
+    222a:	6785                	lui	a5,0x1
+    222c:	dac7879b          	addiw	a5,a5,-596 # dac <removeread+0xa6>
+    2230:	40a7853b          	subw	a0,a5,a0
+    2234:	00002097          	auipc	ra,0x2
+    2238:	756080e7          	jalr	1878(ra) # 498a <sbrk>
+    exit(0);
+    223c:	4501                	li	a0,0
+    223e:	00002097          	auipc	ra,0x2
+    2242:	6c6080e7          	jalr	1734(ra) # 4904 <exit>
+    printf("fork failed\n");
+    2246:	00003517          	auipc	a0,0x3
+    224a:	6aa50513          	addi	a0,a0,1706 # 58f0 <malloc+0xb70>
+    224e:	00003097          	auipc	ra,0x3
+    2252:	a7a080e7          	jalr	-1414(ra) # 4cc8 <printf>
+    exit(1);
+    2256:	4505                	li	a0,1
+    2258:	00002097          	auipc	ra,0x2
+    225c:	6ac080e7          	jalr	1708(ra) # 4904 <exit>
+  wait(0);
+    2260:	4501                	li	a0,0
+    2262:	00002097          	auipc	ra,0x2
+    2266:	6ac080e7          	jalr	1708(ra) # 490e <wait>
+  pid = fork();
+    226a:	00002097          	auipc	ra,0x2
+    226e:	692080e7          	jalr	1682(ra) # 48fc <fork>
+  if(pid < 0){
+    2272:	02054a63          	bltz	a0,22a6 <sbrkbugs+0xea>
+  if(pid == 0){
+    2276:	e529                	bnez	a0,22c0 <sbrkbugs+0x104>
+    sbrk((10*4096 + 2048) - (uint64)sbrk(0));
+    2278:	00002097          	auipc	ra,0x2
+    227c:	712080e7          	jalr	1810(ra) # 498a <sbrk>
+    2280:	67ad                	lui	a5,0xb
+    2282:	8007879b          	addiw	a5,a5,-2048 # a800 <uninit+0x2678>
+    2286:	40a7853b          	subw	a0,a5,a0
+    228a:	00002097          	auipc	ra,0x2
+    228e:	700080e7          	jalr	1792(ra) # 498a <sbrk>
+    sbrk(-10);
+    2292:	5559                	li	a0,-10
+    2294:	00002097          	auipc	ra,0x2
+    2298:	6f6080e7          	jalr	1782(ra) # 498a <sbrk>
+    exit(0);
+    229c:	4501                	li	a0,0
+    229e:	00002097          	auipc	ra,0x2
+    22a2:	666080e7          	jalr	1638(ra) # 4904 <exit>
+    printf("fork failed\n");
+    22a6:	00003517          	auipc	a0,0x3
+    22aa:	64a50513          	addi	a0,a0,1610 # 58f0 <malloc+0xb70>
+    22ae:	00003097          	auipc	ra,0x3
+    22b2:	a1a080e7          	jalr	-1510(ra) # 4cc8 <printf>
+    exit(1);
+    22b6:	4505                	li	a0,1
+    22b8:	00002097          	auipc	ra,0x2
+    22bc:	64c080e7          	jalr	1612(ra) # 4904 <exit>
+  wait(0);
+    22c0:	4501                	li	a0,0
+    22c2:	00002097          	auipc	ra,0x2
+    22c6:	64c080e7          	jalr	1612(ra) # 490e <wait>
+  exit(0);
+    22ca:	4501                	li	a0,0
+    22cc:	00002097          	auipc	ra,0x2
+    22d0:	638080e7          	jalr	1592(ra) # 4904 <exit>
+
+00000000000022d4 <execout>:
+// test the exec() code that cleans up if it runs out
+// of memory. it's really a test that such a condition
+// doesn't cause a panic.
+void
+execout(char *s)
+{
+    22d4:	715d                	addi	sp,sp,-80
+    22d6:	e486                	sd	ra,72(sp)
+    22d8:	e0a2                	sd	s0,64(sp)
+    22da:	fc26                	sd	s1,56(sp)
+    22dc:	f84a                	sd	s2,48(sp)
+    22de:	f44e                	sd	s3,40(sp)
+    22e0:	f052                	sd	s4,32(sp)
+    22e2:	0880                	addi	s0,sp,80
+  for(int avail = 0; avail < 15; avail++){
+    22e4:	4901                	li	s2,0
+    22e6:	49bd                	li	s3,15
+    int pid = fork();
+    22e8:	00002097          	auipc	ra,0x2
+    22ec:	614080e7          	jalr	1556(ra) # 48fc <fork>
+    22f0:	84aa                	mv	s1,a0
+    if(pid < 0){
+    22f2:	02054063          	bltz	a0,2312 <execout+0x3e>
+      printf("fork failed\n");
+      exit(1);
+    } else if(pid == 0){
+    22f6:	c91d                	beqz	a0,232c <execout+0x58>
+      close(1);
+      char *args[] = { "echo", "x", 0 };
+      exec("echo", args);
+      exit(0);
+    } else {
+      wait((int*)0);
+    22f8:	4501                	li	a0,0
+    22fa:	00002097          	auipc	ra,0x2
+    22fe:	614080e7          	jalr	1556(ra) # 490e <wait>
+  for(int avail = 0; avail < 15; avail++){
+    2302:	2905                	addiw	s2,s2,1
+    2304:	ff3912e3          	bne	s2,s3,22e8 <execout+0x14>
+    }
+  }
+
+  exit(0);
+    2308:	4501                	li	a0,0
+    230a:	00002097          	auipc	ra,0x2
+    230e:	5fa080e7          	jalr	1530(ra) # 4904 <exit>
+      printf("fork failed\n");
+    2312:	00003517          	auipc	a0,0x3
+    2316:	5de50513          	addi	a0,a0,1502 # 58f0 <malloc+0xb70>
+    231a:	00003097          	auipc	ra,0x3
+    231e:	9ae080e7          	jalr	-1618(ra) # 4cc8 <printf>
+      exit(1);
+    2322:	4505                	li	a0,1
+    2324:	00002097          	auipc	ra,0x2
+    2328:	5e0080e7          	jalr	1504(ra) # 4904 <exit>
+        if(a == 0xffffffffffffffffLL)
+    232c:	59fd                	li	s3,-1
+        *(char*)(a + 4096 - 1) = 1;
+    232e:	4a05                	li	s4,1
+        uint64 a = (uint64) sbrk(4096);
+    2330:	6505                	lui	a0,0x1
+    2332:	00002097          	auipc	ra,0x2
+    2336:	658080e7          	jalr	1624(ra) # 498a <sbrk>
+        if(a == 0xffffffffffffffffLL)
+    233a:	01350763          	beq	a0,s3,2348 <execout+0x74>
+        *(char*)(a + 4096 - 1) = 1;
+    233e:	6785                	lui	a5,0x1
+    2340:	97aa                	add	a5,a5,a0
+    2342:	ff478fa3          	sb	s4,-1(a5) # fff <copyinstr2+0xbd>
+      while(1){
+    2346:	b7ed                	j	2330 <execout+0x5c>
+      for(int i = 0; i < avail; i++)
+    2348:	01205a63          	blez	s2,235c <execout+0x88>
+        sbrk(-4096);
+    234c:	757d                	lui	a0,0xfffff
+    234e:	00002097          	auipc	ra,0x2
+    2352:	63c080e7          	jalr	1596(ra) # 498a <sbrk>
+      for(int i = 0; i < avail; i++)
+    2356:	2485                	addiw	s1,s1,1
+    2358:	ff249ae3          	bne	s1,s2,234c <execout+0x78>
+      close(1);
+    235c:	4505                	li	a0,1
+    235e:	00002097          	auipc	ra,0x2
+    2362:	5d6080e7          	jalr	1494(ra) # 4934 <close>
+      char *args[] = { "echo", "x", 0 };
+    2366:	00003517          	auipc	a0,0x3
+    236a:	b7a50513          	addi	a0,a0,-1158 # 4ee0 <malloc+0x160>
+    236e:	faa43c23          	sd	a0,-72(s0)
+    2372:	00003797          	auipc	a5,0x3
+    2376:	bde78793          	addi	a5,a5,-1058 # 4f50 <malloc+0x1d0>
+    237a:	fcf43023          	sd	a5,-64(s0)
+    237e:	fc043423          	sd	zero,-56(s0)
+      exec("echo", args);
+    2382:	fb840593          	addi	a1,s0,-72
+    2386:	00002097          	auipc	ra,0x2
+    238a:	5c0080e7          	jalr	1472(ra) # 4946 <exec>
+      exit(0);
+    238e:	4501                	li	a0,0
+    2390:	00002097          	auipc	ra,0x2
+    2394:	574080e7          	jalr	1396(ra) # 4904 <exit>
+
+0000000000002398 <iputtest>:
+{
+    2398:	1101                	addi	sp,sp,-32
+    239a:	ec06                	sd	ra,24(sp)
+    239c:	e822                	sd	s0,16(sp)
+    239e:	e426                	sd	s1,8(sp)
+    23a0:	1000                	addi	s0,sp,32
+    23a2:	84aa                	mv	s1,a0
+  if(mkdir("iputdir") < 0){
+    23a4:	00003517          	auipc	a0,0x3
+    23a8:	7c450513          	addi	a0,a0,1988 # 5b68 <malloc+0xde8>
+    23ac:	00002097          	auipc	ra,0x2
+    23b0:	5b8080e7          	jalr	1464(ra) # 4964 <mkdir>
+    23b4:	04054563          	bltz	a0,23fe <iputtest+0x66>
+  if(chdir("iputdir") < 0){
+    23b8:	00003517          	auipc	a0,0x3
+    23bc:	7b050513          	addi	a0,a0,1968 # 5b68 <malloc+0xde8>
+    23c0:	00002097          	auipc	ra,0x2
+    23c4:	5ae080e7          	jalr	1454(ra) # 496e <chdir>
+    23c8:	04054963          	bltz	a0,241a <iputtest+0x82>
+  if(remove("../iputdir") < 0){
+    23cc:	00003517          	auipc	a0,0x3
+    23d0:	7dc50513          	addi	a0,a0,2012 # 5ba8 <malloc+0xe28>
+    23d4:	00002097          	auipc	ra,0x2
+    23d8:	5f0080e7          	jalr	1520(ra) # 49c4 <remove>
+    23dc:	04054d63          	bltz	a0,2436 <iputtest+0x9e>
+  if(chdir("/") < 0){
+    23e0:	00003517          	auipc	a0,0x3
+    23e4:	7f850513          	addi	a0,a0,2040 # 5bd8 <malloc+0xe58>
+    23e8:	00002097          	auipc	ra,0x2
+    23ec:	586080e7          	jalr	1414(ra) # 496e <chdir>
+    23f0:	06054163          	bltz	a0,2452 <iputtest+0xba>
+}
+    23f4:	60e2                	ld	ra,24(sp)
+    23f6:	6442                	ld	s0,16(sp)
+    23f8:	64a2                	ld	s1,8(sp)
+    23fa:	6105                	addi	sp,sp,32
+    23fc:	8082                	ret
+    printf("%s: mkdir failed\n", s);
+    23fe:	85a6                	mv	a1,s1
+    2400:	00003517          	auipc	a0,0x3
+    2404:	77050513          	addi	a0,a0,1904 # 5b70 <malloc+0xdf0>
+    2408:	00003097          	auipc	ra,0x3
+    240c:	8c0080e7          	jalr	-1856(ra) # 4cc8 <printf>
+    exit(1);
+    2410:	4505                	li	a0,1
+    2412:	00002097          	auipc	ra,0x2
+    2416:	4f2080e7          	jalr	1266(ra) # 4904 <exit>
+    printf("%s: chdir iputdir failed\n", s);
+    241a:	85a6                	mv	a1,s1
+    241c:	00003517          	auipc	a0,0x3
+    2420:	76c50513          	addi	a0,a0,1900 # 5b88 <malloc+0xe08>
+    2424:	00003097          	auipc	ra,0x3
+    2428:	8a4080e7          	jalr	-1884(ra) # 4cc8 <printf>
+    exit(1);
+    242c:	4505                	li	a0,1
+    242e:	00002097          	auipc	ra,0x2
+    2432:	4d6080e7          	jalr	1238(ra) # 4904 <exit>
+    printf("%s: remove ../iputdir failed\n", s);
+    2436:	85a6                	mv	a1,s1
+    2438:	00003517          	auipc	a0,0x3
+    243c:	78050513          	addi	a0,a0,1920 # 5bb8 <malloc+0xe38>
+    2440:	00003097          	auipc	ra,0x3
+    2444:	888080e7          	jalr	-1912(ra) # 4cc8 <printf>
+    exit(1);
+    2448:	4505                	li	a0,1
+    244a:	00002097          	auipc	ra,0x2
+    244e:	4ba080e7          	jalr	1210(ra) # 4904 <exit>
+    printf("%s: chdir / failed\n", s);
+    2452:	85a6                	mv	a1,s1
+    2454:	00003517          	auipc	a0,0x3
+    2458:	78c50513          	addi	a0,a0,1932 # 5be0 <malloc+0xe60>
+    245c:	00003097          	auipc	ra,0x3
+    2460:	86c080e7          	jalr	-1940(ra) # 4cc8 <printf>
+    exit(1);
+    2464:	4505                	li	a0,1
+    2466:	00002097          	auipc	ra,0x2
+    246a:	49e080e7          	jalr	1182(ra) # 4904 <exit>
+
+000000000000246e <exitiputtest>:
+{
+    246e:	7179                	addi	sp,sp,-48
+    2470:	f406                	sd	ra,40(sp)
+    2472:	f022                	sd	s0,32(sp)
+    2474:	ec26                	sd	s1,24(sp)
+    2476:	1800                	addi	s0,sp,48
+    2478:	84aa                	mv	s1,a0
+  pid = fork();
+    247a:	00002097          	auipc	ra,0x2
+    247e:	482080e7          	jalr	1154(ra) # 48fc <fork>
+  if(pid < 0){
+    2482:	04054663          	bltz	a0,24ce <exitiputtest+0x60>
+  if(pid == 0){
+    2486:	ed45                	bnez	a0,253e <exitiputtest+0xd0>
+    if(mkdir("iputdir") < 0){
+    2488:	00003517          	auipc	a0,0x3
+    248c:	6e050513          	addi	a0,a0,1760 # 5b68 <malloc+0xde8>
+    2490:	00002097          	auipc	ra,0x2
+    2494:	4d4080e7          	jalr	1236(ra) # 4964 <mkdir>
+    2498:	04054963          	bltz	a0,24ea <exitiputtest+0x7c>
+    if(chdir("iputdir") < 0){
+    249c:	00003517          	auipc	a0,0x3
+    24a0:	6cc50513          	addi	a0,a0,1740 # 5b68 <malloc+0xde8>
+    24a4:	00002097          	auipc	ra,0x2
+    24a8:	4ca080e7          	jalr	1226(ra) # 496e <chdir>
+    24ac:	04054d63          	bltz	a0,2506 <exitiputtest+0x98>
+    if(remove("../iputdir") < 0){
+    24b0:	00003517          	auipc	a0,0x3
+    24b4:	6f850513          	addi	a0,a0,1784 # 5ba8 <malloc+0xe28>
+    24b8:	00002097          	auipc	ra,0x2
+    24bc:	50c080e7          	jalr	1292(ra) # 49c4 <remove>
+    24c0:	06054163          	bltz	a0,2522 <exitiputtest+0xb4>
+    exit(0);
+    24c4:	4501                	li	a0,0
+    24c6:	00002097          	auipc	ra,0x2
+    24ca:	43e080e7          	jalr	1086(ra) # 4904 <exit>
+    printf("%s: fork failed\n", s);
+    24ce:	85a6                	mv	a1,s1
+    24d0:	00003517          	auipc	a0,0x3
+    24d4:	0a050513          	addi	a0,a0,160 # 5570 <malloc+0x7f0>
+    24d8:	00002097          	auipc	ra,0x2
+    24dc:	7f0080e7          	jalr	2032(ra) # 4cc8 <printf>
+    exit(1);
+    24e0:	4505                	li	a0,1
+    24e2:	00002097          	auipc	ra,0x2
+    24e6:	422080e7          	jalr	1058(ra) # 4904 <exit>
+      printf("%s: mkdir failed\n", s);
+    24ea:	85a6                	mv	a1,s1
+    24ec:	00003517          	auipc	a0,0x3
+    24f0:	68450513          	addi	a0,a0,1668 # 5b70 <malloc+0xdf0>
+    24f4:	00002097          	auipc	ra,0x2
+    24f8:	7d4080e7          	jalr	2004(ra) # 4cc8 <printf>
+      exit(1);
+    24fc:	4505                	li	a0,1
+    24fe:	00002097          	auipc	ra,0x2
+    2502:	406080e7          	jalr	1030(ra) # 4904 <exit>
+      printf("%s: child chdir failed\n", s);
+    2506:	85a6                	mv	a1,s1
+    2508:	00003517          	auipc	a0,0x3
+    250c:	6f050513          	addi	a0,a0,1776 # 5bf8 <malloc+0xe78>
+    2510:	00002097          	auipc	ra,0x2
+    2514:	7b8080e7          	jalr	1976(ra) # 4cc8 <printf>
+      exit(1);
+    2518:	4505                	li	a0,1
+    251a:	00002097          	auipc	ra,0x2
+    251e:	3ea080e7          	jalr	1002(ra) # 4904 <exit>
+      printf("%s: remove ../iputdir failed\n", s);
+    2522:	85a6                	mv	a1,s1
+    2524:	00003517          	auipc	a0,0x3
+    2528:	69450513          	addi	a0,a0,1684 # 5bb8 <malloc+0xe38>
+    252c:	00002097          	auipc	ra,0x2
+    2530:	79c080e7          	jalr	1948(ra) # 4cc8 <printf>
+      exit(1);
+    2534:	4505                	li	a0,1
+    2536:	00002097          	auipc	ra,0x2
+    253a:	3ce080e7          	jalr	974(ra) # 4904 <exit>
+  wait(&xstatus);
+    253e:	fdc40513          	addi	a0,s0,-36
+    2542:	00002097          	auipc	ra,0x2
+    2546:	3cc080e7          	jalr	972(ra) # 490e <wait>
+  exit(xstatus);
+    254a:	fdc42503          	lw	a0,-36(s0)
+    254e:	00002097          	auipc	ra,0x2
+    2552:	3b6080e7          	jalr	950(ra) # 4904 <exit>
+
+0000000000002556 <subdir>:
+{
+    2556:	1101                	addi	sp,sp,-32
+    2558:	ec06                	sd	ra,24(sp)
+    255a:	e822                	sd	s0,16(sp)
+    255c:	e426                	sd	s1,8(sp)
+    255e:	e04a                	sd	s2,0(sp)
+    2560:	1000                	addi	s0,sp,32
+    2562:	892a                	mv	s2,a0
+  remove("ff");
+    2564:	00003517          	auipc	a0,0x3
+    2568:	6ac50513          	addi	a0,a0,1708 # 5c10 <malloc+0xe90>
+    256c:	00002097          	auipc	ra,0x2
+    2570:	458080e7          	jalr	1112(ra) # 49c4 <remove>
+  if(mkdir("dd") != 0){
+    2574:	00003517          	auipc	a0,0x3
+    2578:	6a450513          	addi	a0,a0,1700 # 5c18 <malloc+0xe98>
+    257c:	00002097          	auipc	ra,0x2
+    2580:	3e8080e7          	jalr	1000(ra) # 4964 <mkdir>
+    2584:	24051363          	bnez	a0,27ca <subdir+0x274>
+  fd = open("dd/ff", O_CREATE | O_RDWR);
+    2588:	20200593          	li	a1,514
+    258c:	00003517          	auipc	a0,0x3
+    2590:	6ac50513          	addi	a0,a0,1708 # 5c38 <malloc+0xeb8>
+    2594:	00002097          	auipc	ra,0x2
+    2598:	3bc080e7          	jalr	956(ra) # 4950 <open>
+    259c:	84aa                	mv	s1,a0
+  if(fd < 0){
+    259e:	24054463          	bltz	a0,27e6 <subdir+0x290>
+  write(fd, "ff", 2);
+    25a2:	4609                	li	a2,2
+    25a4:	00003597          	auipc	a1,0x3
+    25a8:	66c58593          	addi	a1,a1,1644 # 5c10 <malloc+0xe90>
+    25ac:	00002097          	auipc	ra,0x2
+    25b0:	37e080e7          	jalr	894(ra) # 492a <write>
+  close(fd);
+    25b4:	8526                	mv	a0,s1
+    25b6:	00002097          	auipc	ra,0x2
+    25ba:	37e080e7          	jalr	894(ra) # 4934 <close>
+  if(remove("dd") >= 0){
+    25be:	00003517          	auipc	a0,0x3
+    25c2:	65a50513          	addi	a0,a0,1626 # 5c18 <malloc+0xe98>
+    25c6:	00002097          	auipc	ra,0x2
+    25ca:	3fe080e7          	jalr	1022(ra) # 49c4 <remove>
+    25ce:	22055a63          	bgez	a0,2802 <subdir+0x2ac>
+  if(mkdir("/dd/dd") != 0){
+    25d2:	00003517          	auipc	a0,0x3
+    25d6:	6be50513          	addi	a0,a0,1726 # 5c90 <malloc+0xf10>
+    25da:	00002097          	auipc	ra,0x2
+    25de:	38a080e7          	jalr	906(ra) # 4964 <mkdir>
+    25e2:	22051e63          	bnez	a0,281e <subdir+0x2c8>
+  fd = open("dd/dd/ff", O_CREATE | O_RDWR);
+    25e6:	20200593          	li	a1,514
+    25ea:	00003517          	auipc	a0,0x3
+    25ee:	6ce50513          	addi	a0,a0,1742 # 5cb8 <malloc+0xf38>
+    25f2:	00002097          	auipc	ra,0x2
+    25f6:	35e080e7          	jalr	862(ra) # 4950 <open>
+    25fa:	84aa                	mv	s1,a0
+  if(fd < 0){
+    25fc:	22054f63          	bltz	a0,283a <subdir+0x2e4>
+  write(fd, "FF", 2);
+    2600:	4609                	li	a2,2
+    2602:	00003597          	auipc	a1,0x3
+    2606:	6e658593          	addi	a1,a1,1766 # 5ce8 <malloc+0xf68>
+    260a:	00002097          	auipc	ra,0x2
+    260e:	320080e7          	jalr	800(ra) # 492a <write>
+  close(fd);
+    2612:	8526                	mv	a0,s1
+    2614:	00002097          	auipc	ra,0x2
+    2618:	320080e7          	jalr	800(ra) # 4934 <close>
+  fd = open("dd/dd/../ff", 0);
+    261c:	4581                	li	a1,0
+    261e:	00003517          	auipc	a0,0x3
+    2622:	6d250513          	addi	a0,a0,1746 # 5cf0 <malloc+0xf70>
+    2626:	00002097          	auipc	ra,0x2
+    262a:	32a080e7          	jalr	810(ra) # 4950 <open>
+    262e:	84aa                	mv	s1,a0
+  if(fd < 0){
+    2630:	22054363          	bltz	a0,2856 <subdir+0x300>
+  cc = read(fd, buf, sizeof(buf));
+    2634:	6609                	lui	a2,0x2
+    2636:	80060613          	addi	a2,a2,-2048 # 1800 <forkfork+0x42>
+    263a:	00008597          	auipc	a1,0x8
+    263e:	25e58593          	addi	a1,a1,606 # a898 <buf>
+    2642:	00002097          	auipc	ra,0x2
+    2646:	2de080e7          	jalr	734(ra) # 4920 <read>
+  if(cc != 2 || buf[0] != 'f'){
+    264a:	4789                	li	a5,2
+    264c:	22f51363          	bne	a0,a5,2872 <subdir+0x31c>
+    2650:	00008717          	auipc	a4,0x8
+    2654:	24874703          	lbu	a4,584(a4) # a898 <buf>
+    2658:	06600793          	li	a5,102
+    265c:	20f71b63          	bne	a4,a5,2872 <subdir+0x31c>
+  close(fd);
+    2660:	8526                	mv	a0,s1
+    2662:	00002097          	auipc	ra,0x2
+    2666:	2d2080e7          	jalr	722(ra) # 4934 <close>
+  if(remove("dd/dd/ff") != 0){
+    266a:	00003517          	auipc	a0,0x3
+    266e:	64e50513          	addi	a0,a0,1614 # 5cb8 <malloc+0xf38>
+    2672:	00002097          	auipc	ra,0x2
+    2676:	352080e7          	jalr	850(ra) # 49c4 <remove>
+    267a:	20051a63          	bnez	a0,288e <subdir+0x338>
+  if(open("dd/dd/ff", O_RDONLY) >= 0){
+    267e:	4581                	li	a1,0
+    2680:	00003517          	auipc	a0,0x3
+    2684:	63850513          	addi	a0,a0,1592 # 5cb8 <malloc+0xf38>
+    2688:	00002097          	auipc	ra,0x2
+    268c:	2c8080e7          	jalr	712(ra) # 4950 <open>
+    2690:	20055d63          	bgez	a0,28aa <subdir+0x354>
+  if(chdir("dd") != 0){
+    2694:	00003517          	auipc	a0,0x3
+    2698:	58450513          	addi	a0,a0,1412 # 5c18 <malloc+0xe98>
+    269c:	00002097          	auipc	ra,0x2
+    26a0:	2d2080e7          	jalr	722(ra) # 496e <chdir>
+    26a4:	22051163          	bnez	a0,28c6 <subdir+0x370>
+  if(chdir("dd/../../dd") != 0){
+    26a8:	00003517          	auipc	a0,0x3
+    26ac:	6f850513          	addi	a0,a0,1784 # 5da0 <malloc+0x1020>
+    26b0:	00002097          	auipc	ra,0x2
+    26b4:	2be080e7          	jalr	702(ra) # 496e <chdir>
+    26b8:	22051563          	bnez	a0,28e2 <subdir+0x38c>
+  if(chdir("dd/../../../dd") != 0){
+    26bc:	00003517          	auipc	a0,0x3
+    26c0:	71450513          	addi	a0,a0,1812 # 5dd0 <malloc+0x1050>
+    26c4:	00002097          	auipc	ra,0x2
+    26c8:	2aa080e7          	jalr	682(ra) # 496e <chdir>
+    26cc:	22051963          	bnez	a0,28fe <subdir+0x3a8>
+  if(chdir("./..") != 0){
+    26d0:	00003517          	auipc	a0,0x3
+    26d4:	73050513          	addi	a0,a0,1840 # 5e00 <malloc+0x1080>
+    26d8:	00002097          	auipc	ra,0x2
+    26dc:	296080e7          	jalr	662(ra) # 496e <chdir>
+    26e0:	22051d63          	bnez	a0,291a <subdir+0x3c4>
+  if(open("dd/dd/ff", O_RDONLY) >= 0){
+    26e4:	4581                	li	a1,0
+    26e6:	00003517          	auipc	a0,0x3
+    26ea:	5d250513          	addi	a0,a0,1490 # 5cb8 <malloc+0xf38>
+    26ee:	00002097          	auipc	ra,0x2
+    26f2:	262080e7          	jalr	610(ra) # 4950 <open>
+    26f6:	24055063          	bgez	a0,2936 <subdir+0x3e0>
+  if(open("dd/ff/ff", O_CREATE|O_RDWR) >= 0){
+    26fa:	20200593          	li	a1,514
+    26fe:	00003517          	auipc	a0,0x3
+    2702:	75250513          	addi	a0,a0,1874 # 5e50 <malloc+0x10d0>
+    2706:	00002097          	auipc	ra,0x2
+    270a:	24a080e7          	jalr	586(ra) # 4950 <open>
+    270e:	24055263          	bgez	a0,2952 <subdir+0x3fc>
+  if(open("dd/xx/ff", O_CREATE|O_RDWR) >= 0){
+    2712:	20200593          	li	a1,514
+    2716:	00003517          	auipc	a0,0x3
+    271a:	76a50513          	addi	a0,a0,1898 # 5e80 <malloc+0x1100>
+    271e:	00002097          	auipc	ra,0x2
+    2722:	232080e7          	jalr	562(ra) # 4950 <open>
+    2726:	24055463          	bgez	a0,296e <subdir+0x418>
+  if(open("dd", O_CREATE) >= 0){
+    272a:	20000593          	li	a1,512
+    272e:	00003517          	auipc	a0,0x3
+    2732:	4ea50513          	addi	a0,a0,1258 # 5c18 <malloc+0xe98>
+    2736:	00002097          	auipc	ra,0x2
+    273a:	21a080e7          	jalr	538(ra) # 4950 <open>
+    273e:	24055663          	bgez	a0,298a <subdir+0x434>
+  if(open("dd", O_RDWR) >= 0){
+    2742:	4589                	li	a1,2
+    2744:	00003517          	auipc	a0,0x3
+    2748:	4d450513          	addi	a0,a0,1236 # 5c18 <malloc+0xe98>
+    274c:	00002097          	auipc	ra,0x2
+    2750:	204080e7          	jalr	516(ra) # 4950 <open>
+    2754:	24055963          	bgez	a0,29a6 <subdir+0x450>
+  if(open("dd", O_WRONLY) >= 0){
+    2758:	4585                	li	a1,1
+    275a:	00003517          	auipc	a0,0x3
+    275e:	4be50513          	addi	a0,a0,1214 # 5c18 <malloc+0xe98>
+    2762:	00002097          	auipc	ra,0x2
+    2766:	1ee080e7          	jalr	494(ra) # 4950 <open>
+    276a:	24055c63          	bgez	a0,29c2 <subdir+0x46c>
+  if(remove("dd/ff") != 0){
+    276e:	00003517          	auipc	a0,0x3
+    2772:	4ca50513          	addi	a0,a0,1226 # 5c38 <malloc+0xeb8>
+    2776:	00002097          	auipc	ra,0x2
+    277a:	24e080e7          	jalr	590(ra) # 49c4 <remove>
+    277e:	26051063          	bnez	a0,29de <subdir+0x488>
+  if(remove("dd") == 0){
+    2782:	00003517          	auipc	a0,0x3
+    2786:	49650513          	addi	a0,a0,1174 # 5c18 <malloc+0xe98>
+    278a:	00002097          	auipc	ra,0x2
+    278e:	23a080e7          	jalr	570(ra) # 49c4 <remove>
+    2792:	26050463          	beqz	a0,29fa <subdir+0x4a4>
+  if(remove("dd/dd") < 0){
+    2796:	00003517          	auipc	a0,0x3
+    279a:	7c250513          	addi	a0,a0,1986 # 5f58 <malloc+0x11d8>
+    279e:	00002097          	auipc	ra,0x2
+    27a2:	226080e7          	jalr	550(ra) # 49c4 <remove>
+    27a6:	26054863          	bltz	a0,2a16 <subdir+0x4c0>
+  if(remove("dd") < 0){
+    27aa:	00003517          	auipc	a0,0x3
+    27ae:	46e50513          	addi	a0,a0,1134 # 5c18 <malloc+0xe98>
+    27b2:	00002097          	auipc	ra,0x2
+    27b6:	212080e7          	jalr	530(ra) # 49c4 <remove>
+    27ba:	26054c63          	bltz	a0,2a32 <subdir+0x4dc>
+}
+    27be:	60e2                	ld	ra,24(sp)
+    27c0:	6442                	ld	s0,16(sp)
+    27c2:	64a2                	ld	s1,8(sp)
+    27c4:	6902                	ld	s2,0(sp)
+    27c6:	6105                	addi	sp,sp,32
+    27c8:	8082                	ret
+    printf("%s: mkdir dd failed\n", s);
+    27ca:	85ca                	mv	a1,s2
+    27cc:	00003517          	auipc	a0,0x3
+    27d0:	45450513          	addi	a0,a0,1108 # 5c20 <malloc+0xea0>
+    27d4:	00002097          	auipc	ra,0x2
+    27d8:	4f4080e7          	jalr	1268(ra) # 4cc8 <printf>
+    exit(1);
+    27dc:	4505                	li	a0,1
+    27de:	00002097          	auipc	ra,0x2
+    27e2:	126080e7          	jalr	294(ra) # 4904 <exit>
+    printf("%s: create dd/ff failed\n", s);
+    27e6:	85ca                	mv	a1,s2
+    27e8:	00003517          	auipc	a0,0x3
+    27ec:	45850513          	addi	a0,a0,1112 # 5c40 <malloc+0xec0>
+    27f0:	00002097          	auipc	ra,0x2
+    27f4:	4d8080e7          	jalr	1240(ra) # 4cc8 <printf>
+    exit(1);
+    27f8:	4505                	li	a0,1
+    27fa:	00002097          	auipc	ra,0x2
+    27fe:	10a080e7          	jalr	266(ra) # 4904 <exit>
+    printf("%s: remove dd (non-empty dir) succeeded!\n", s);
+    2802:	85ca                	mv	a1,s2
+    2804:	00003517          	auipc	a0,0x3
+    2808:	45c50513          	addi	a0,a0,1116 # 5c60 <malloc+0xee0>
+    280c:	00002097          	auipc	ra,0x2
+    2810:	4bc080e7          	jalr	1212(ra) # 4cc8 <printf>
+    exit(1);
+    2814:	4505                	li	a0,1
+    2816:	00002097          	auipc	ra,0x2
+    281a:	0ee080e7          	jalr	238(ra) # 4904 <exit>
+    printf("subdir mkdir dd/dd failed\n", s);
+    281e:	85ca                	mv	a1,s2
+    2820:	00003517          	auipc	a0,0x3
+    2824:	47850513          	addi	a0,a0,1144 # 5c98 <malloc+0xf18>
+    2828:	00002097          	auipc	ra,0x2
+    282c:	4a0080e7          	jalr	1184(ra) # 4cc8 <printf>
+    exit(1);
+    2830:	4505                	li	a0,1
+    2832:	00002097          	auipc	ra,0x2
+    2836:	0d2080e7          	jalr	210(ra) # 4904 <exit>
+    printf("%s: create dd/dd/ff failed\n", s);
+    283a:	85ca                	mv	a1,s2
+    283c:	00003517          	auipc	a0,0x3
+    2840:	48c50513          	addi	a0,a0,1164 # 5cc8 <malloc+0xf48>
+    2844:	00002097          	auipc	ra,0x2
+    2848:	484080e7          	jalr	1156(ra) # 4cc8 <printf>
+    exit(1);
+    284c:	4505                	li	a0,1
+    284e:	00002097          	auipc	ra,0x2
+    2852:	0b6080e7          	jalr	182(ra) # 4904 <exit>
+    printf("%s: open dd/dd/../ff failed\n", s);
+    2856:	85ca                	mv	a1,s2
+    2858:	00003517          	auipc	a0,0x3
+    285c:	4a850513          	addi	a0,a0,1192 # 5d00 <malloc+0xf80>
+    2860:	00002097          	auipc	ra,0x2
+    2864:	468080e7          	jalr	1128(ra) # 4cc8 <printf>
+    exit(1);
+    2868:	4505                	li	a0,1
+    286a:	00002097          	auipc	ra,0x2
+    286e:	09a080e7          	jalr	154(ra) # 4904 <exit>
+    printf("%s: dd/dd/../ff wrong content\n", s);
+    2872:	85ca                	mv	a1,s2
+    2874:	00003517          	auipc	a0,0x3
+    2878:	4ac50513          	addi	a0,a0,1196 # 5d20 <malloc+0xfa0>
+    287c:	00002097          	auipc	ra,0x2
+    2880:	44c080e7          	jalr	1100(ra) # 4cc8 <printf>
+    exit(1);
+    2884:	4505                	li	a0,1
+    2886:	00002097          	auipc	ra,0x2
+    288a:	07e080e7          	jalr	126(ra) # 4904 <exit>
+    printf("%s: remove dd/dd/ff failed\n", s);
+    288e:	85ca                	mv	a1,s2
+    2890:	00003517          	auipc	a0,0x3
+    2894:	4b050513          	addi	a0,a0,1200 # 5d40 <malloc+0xfc0>
+    2898:	00002097          	auipc	ra,0x2
+    289c:	430080e7          	jalr	1072(ra) # 4cc8 <printf>
+    exit(1);
+    28a0:	4505                	li	a0,1
+    28a2:	00002097          	auipc	ra,0x2
+    28a6:	062080e7          	jalr	98(ra) # 4904 <exit>
+    printf("%s: open (removeed) dd/dd/ff succeeded\n", s);
+    28aa:	85ca                	mv	a1,s2
+    28ac:	00003517          	auipc	a0,0x3
+    28b0:	4b450513          	addi	a0,a0,1204 # 5d60 <malloc+0xfe0>
+    28b4:	00002097          	auipc	ra,0x2
+    28b8:	414080e7          	jalr	1044(ra) # 4cc8 <printf>
+    exit(1);
+    28bc:	4505                	li	a0,1
+    28be:	00002097          	auipc	ra,0x2
+    28c2:	046080e7          	jalr	70(ra) # 4904 <exit>
+    printf("%s: chdir dd failed\n", s);
+    28c6:	85ca                	mv	a1,s2
+    28c8:	00003517          	auipc	a0,0x3
+    28cc:	4c050513          	addi	a0,a0,1216 # 5d88 <malloc+0x1008>
+    28d0:	00002097          	auipc	ra,0x2
+    28d4:	3f8080e7          	jalr	1016(ra) # 4cc8 <printf>
+    exit(1);
+    28d8:	4505                	li	a0,1
+    28da:	00002097          	auipc	ra,0x2
+    28de:	02a080e7          	jalr	42(ra) # 4904 <exit>
+    printf("%s: chdir dd/../../dd failed\n", s);
+    28e2:	85ca                	mv	a1,s2
+    28e4:	00003517          	auipc	a0,0x3
+    28e8:	4cc50513          	addi	a0,a0,1228 # 5db0 <malloc+0x1030>
+    28ec:	00002097          	auipc	ra,0x2
+    28f0:	3dc080e7          	jalr	988(ra) # 4cc8 <printf>
+    exit(1);
+    28f4:	4505                	li	a0,1
+    28f6:	00002097          	auipc	ra,0x2
+    28fa:	00e080e7          	jalr	14(ra) # 4904 <exit>
+    printf("chdir dd/../../dd failed\n", s);
+    28fe:	85ca                	mv	a1,s2
+    2900:	00003517          	auipc	a0,0x3
+    2904:	4e050513          	addi	a0,a0,1248 # 5de0 <malloc+0x1060>
+    2908:	00002097          	auipc	ra,0x2
+    290c:	3c0080e7          	jalr	960(ra) # 4cc8 <printf>
+    exit(1);
+    2910:	4505                	li	a0,1
+    2912:	00002097          	auipc	ra,0x2
+    2916:	ff2080e7          	jalr	-14(ra) # 4904 <exit>
+    printf("%s: chdir ./.. failed\n", s);
+    291a:	85ca                	mv	a1,s2
+    291c:	00003517          	auipc	a0,0x3
+    2920:	4ec50513          	addi	a0,a0,1260 # 5e08 <malloc+0x1088>
+    2924:	00002097          	auipc	ra,0x2
+    2928:	3a4080e7          	jalr	932(ra) # 4cc8 <printf>
+    exit(1);
+    292c:	4505                	li	a0,1
+    292e:	00002097          	auipc	ra,0x2
+    2932:	fd6080e7          	jalr	-42(ra) # 4904 <exit>
+    printf("%s: open (removeed) dd/dd/ff succeeded!\n", s);
+    2936:	85ca                	mv	a1,s2
+    2938:	00003517          	auipc	a0,0x3
+    293c:	4e850513          	addi	a0,a0,1256 # 5e20 <malloc+0x10a0>
+    2940:	00002097          	auipc	ra,0x2
+    2944:	388080e7          	jalr	904(ra) # 4cc8 <printf>
+    exit(1);
+    2948:	4505                	li	a0,1
+    294a:	00002097          	auipc	ra,0x2
+    294e:	fba080e7          	jalr	-70(ra) # 4904 <exit>
+    printf("%s: create dd/ff/ff succeeded!\n", s);
+    2952:	85ca                	mv	a1,s2
+    2954:	00003517          	auipc	a0,0x3
+    2958:	50c50513          	addi	a0,a0,1292 # 5e60 <malloc+0x10e0>
+    295c:	00002097          	auipc	ra,0x2
+    2960:	36c080e7          	jalr	876(ra) # 4cc8 <printf>
+    exit(1);
+    2964:	4505                	li	a0,1
+    2966:	00002097          	auipc	ra,0x2
+    296a:	f9e080e7          	jalr	-98(ra) # 4904 <exit>
+    printf("%s: create dd/xx/ff succeeded!\n", s);
+    296e:	85ca                	mv	a1,s2
+    2970:	00003517          	auipc	a0,0x3
+    2974:	52050513          	addi	a0,a0,1312 # 5e90 <malloc+0x1110>
+    2978:	00002097          	auipc	ra,0x2
+    297c:	350080e7          	jalr	848(ra) # 4cc8 <printf>
+    exit(1);
+    2980:	4505                	li	a0,1
+    2982:	00002097          	auipc	ra,0x2
+    2986:	f82080e7          	jalr	-126(ra) # 4904 <exit>
+    printf("%s: create dd succeeded!\n", s);
+    298a:	85ca                	mv	a1,s2
+    298c:	00003517          	auipc	a0,0x3
+    2990:	52450513          	addi	a0,a0,1316 # 5eb0 <malloc+0x1130>
+    2994:	00002097          	auipc	ra,0x2
+    2998:	334080e7          	jalr	820(ra) # 4cc8 <printf>
+    exit(1);
+    299c:	4505                	li	a0,1
+    299e:	00002097          	auipc	ra,0x2
+    29a2:	f66080e7          	jalr	-154(ra) # 4904 <exit>
+    printf("%s: open dd rdwr succeeded!\n", s);
+    29a6:	85ca                	mv	a1,s2
+    29a8:	00003517          	auipc	a0,0x3
+    29ac:	52850513          	addi	a0,a0,1320 # 5ed0 <malloc+0x1150>
+    29b0:	00002097          	auipc	ra,0x2
+    29b4:	318080e7          	jalr	792(ra) # 4cc8 <printf>
+    exit(1);
+    29b8:	4505                	li	a0,1
+    29ba:	00002097          	auipc	ra,0x2
+    29be:	f4a080e7          	jalr	-182(ra) # 4904 <exit>
+    printf("%s: open dd wronly succeeded!\n", s);
+    29c2:	85ca                	mv	a1,s2
+    29c4:	00003517          	auipc	a0,0x3
+    29c8:	52c50513          	addi	a0,a0,1324 # 5ef0 <malloc+0x1170>
+    29cc:	00002097          	auipc	ra,0x2
+    29d0:	2fc080e7          	jalr	764(ra) # 4cc8 <printf>
+    exit(1);
+    29d4:	4505                	li	a0,1
+    29d6:	00002097          	auipc	ra,0x2
+    29da:	f2e080e7          	jalr	-210(ra) # 4904 <exit>
+    printf("%s: remove dd/ff failed\n", s);
+    29de:	85ca                	mv	a1,s2
+    29e0:	00003517          	auipc	a0,0x3
+    29e4:	53050513          	addi	a0,a0,1328 # 5f10 <malloc+0x1190>
+    29e8:	00002097          	auipc	ra,0x2
+    29ec:	2e0080e7          	jalr	736(ra) # 4cc8 <printf>
+    exit(1);
+    29f0:	4505                	li	a0,1
+    29f2:	00002097          	auipc	ra,0x2
+    29f6:	f12080e7          	jalr	-238(ra) # 4904 <exit>
+    printf("%s: remove non-empty dd succeeded!\n", s);
+    29fa:	85ca                	mv	a1,s2
+    29fc:	00003517          	auipc	a0,0x3
+    2a00:	53450513          	addi	a0,a0,1332 # 5f30 <malloc+0x11b0>
+    2a04:	00002097          	auipc	ra,0x2
+    2a08:	2c4080e7          	jalr	708(ra) # 4cc8 <printf>
+    exit(1);
+    2a0c:	4505                	li	a0,1
+    2a0e:	00002097          	auipc	ra,0x2
+    2a12:	ef6080e7          	jalr	-266(ra) # 4904 <exit>
+    printf("%s: remove dd/dd failed\n", s);
+    2a16:	85ca                	mv	a1,s2
+    2a18:	00003517          	auipc	a0,0x3
+    2a1c:	54850513          	addi	a0,a0,1352 # 5f60 <malloc+0x11e0>
+    2a20:	00002097          	auipc	ra,0x2
+    2a24:	2a8080e7          	jalr	680(ra) # 4cc8 <printf>
+    exit(1);
+    2a28:	4505                	li	a0,1
+    2a2a:	00002097          	auipc	ra,0x2
+    2a2e:	eda080e7          	jalr	-294(ra) # 4904 <exit>
+    printf("%s: remove dd failed\n", s);
+    2a32:	85ca                	mv	a1,s2
+    2a34:	00003517          	auipc	a0,0x3
+    2a38:	54c50513          	addi	a0,a0,1356 # 5f80 <malloc+0x1200>
+    2a3c:	00002097          	auipc	ra,0x2
+    2a40:	28c080e7          	jalr	652(ra) # 4cc8 <printf>
+    exit(1);
+    2a44:	4505                	li	a0,1
+    2a46:	00002097          	auipc	ra,0x2
+    2a4a:	ebe080e7          	jalr	-322(ra) # 4904 <exit>
+
+0000000000002a4e <rmdot>:
+{
+    2a4e:	1101                	addi	sp,sp,-32
+    2a50:	ec06                	sd	ra,24(sp)
+    2a52:	e822                	sd	s0,16(sp)
+    2a54:	e426                	sd	s1,8(sp)
+    2a56:	1000                	addi	s0,sp,32
+    2a58:	84aa                	mv	s1,a0
+  if(mkdir("dots") != 0){
+    2a5a:	00003517          	auipc	a0,0x3
+    2a5e:	53e50513          	addi	a0,a0,1342 # 5f98 <malloc+0x1218>
+    2a62:	00002097          	auipc	ra,0x2
+    2a66:	f02080e7          	jalr	-254(ra) # 4964 <mkdir>
+    2a6a:	e549                	bnez	a0,2af4 <rmdot+0xa6>
+  if(chdir("dots") != 0){
+    2a6c:	00003517          	auipc	a0,0x3
+    2a70:	52c50513          	addi	a0,a0,1324 # 5f98 <malloc+0x1218>
+    2a74:	00002097          	auipc	ra,0x2
+    2a78:	efa080e7          	jalr	-262(ra) # 496e <chdir>
+    2a7c:	e951                	bnez	a0,2b10 <rmdot+0xc2>
+  if(remove(".") == 0){
+    2a7e:	00003517          	auipc	a0,0x3
+    2a82:	55250513          	addi	a0,a0,1362 # 5fd0 <malloc+0x1250>
+    2a86:	00002097          	auipc	ra,0x2
+    2a8a:	f3e080e7          	jalr	-194(ra) # 49c4 <remove>
+    2a8e:	cd59                	beqz	a0,2b2c <rmdot+0xde>
+  if(remove("..") == 0){
+    2a90:	00003517          	auipc	a0,0x3
+    2a94:	56050513          	addi	a0,a0,1376 # 5ff0 <malloc+0x1270>
+    2a98:	00002097          	auipc	ra,0x2
+    2a9c:	f2c080e7          	jalr	-212(ra) # 49c4 <remove>
+    2aa0:	c545                	beqz	a0,2b48 <rmdot+0xfa>
+  if(chdir("/") != 0){
+    2aa2:	00003517          	auipc	a0,0x3
+    2aa6:	13650513          	addi	a0,a0,310 # 5bd8 <malloc+0xe58>
+    2aaa:	00002097          	auipc	ra,0x2
+    2aae:	ec4080e7          	jalr	-316(ra) # 496e <chdir>
+    2ab2:	e94d                	bnez	a0,2b64 <rmdot+0x116>
+  if(remove("dots/.") == 0){
+    2ab4:	00003517          	auipc	a0,0x3
+    2ab8:	55c50513          	addi	a0,a0,1372 # 6010 <malloc+0x1290>
+    2abc:	00002097          	auipc	ra,0x2
+    2ac0:	f08080e7          	jalr	-248(ra) # 49c4 <remove>
+    2ac4:	cd55                	beqz	a0,2b80 <rmdot+0x132>
+  if(remove("dots/..") == 0){
+    2ac6:	00003517          	auipc	a0,0x3
+    2aca:	57250513          	addi	a0,a0,1394 # 6038 <malloc+0x12b8>
+    2ace:	00002097          	auipc	ra,0x2
+    2ad2:	ef6080e7          	jalr	-266(ra) # 49c4 <remove>
+    2ad6:	c179                	beqz	a0,2b9c <rmdot+0x14e>
+  if(remove("dots") != 0){
+    2ad8:	00003517          	auipc	a0,0x3
+    2adc:	4c050513          	addi	a0,a0,1216 # 5f98 <malloc+0x1218>
+    2ae0:	00002097          	auipc	ra,0x2
+    2ae4:	ee4080e7          	jalr	-284(ra) # 49c4 <remove>
+    2ae8:	e961                	bnez	a0,2bb8 <rmdot+0x16a>
+}
+    2aea:	60e2                	ld	ra,24(sp)
+    2aec:	6442                	ld	s0,16(sp)
+    2aee:	64a2                	ld	s1,8(sp)
+    2af0:	6105                	addi	sp,sp,32
+    2af2:	8082                	ret
+    printf("%s: mkdir dots failed\n", s);
+    2af4:	85a6                	mv	a1,s1
+    2af6:	00003517          	auipc	a0,0x3
+    2afa:	4aa50513          	addi	a0,a0,1194 # 5fa0 <malloc+0x1220>
+    2afe:	00002097          	auipc	ra,0x2
+    2b02:	1ca080e7          	jalr	458(ra) # 4cc8 <printf>
+    exit(1);
+    2b06:	4505                	li	a0,1
+    2b08:	00002097          	auipc	ra,0x2
+    2b0c:	dfc080e7          	jalr	-516(ra) # 4904 <exit>
+    printf("%s: chdir dots failed\n", s);
+    2b10:	85a6                	mv	a1,s1
+    2b12:	00003517          	auipc	a0,0x3
+    2b16:	4a650513          	addi	a0,a0,1190 # 5fb8 <malloc+0x1238>
+    2b1a:	00002097          	auipc	ra,0x2
+    2b1e:	1ae080e7          	jalr	430(ra) # 4cc8 <printf>
+    exit(1);
+    2b22:	4505                	li	a0,1
+    2b24:	00002097          	auipc	ra,0x2
+    2b28:	de0080e7          	jalr	-544(ra) # 4904 <exit>
+    printf("%s: rm . worked!\n", s);
+    2b2c:	85a6                	mv	a1,s1
+    2b2e:	00003517          	auipc	a0,0x3
+    2b32:	4aa50513          	addi	a0,a0,1194 # 5fd8 <malloc+0x1258>
+    2b36:	00002097          	auipc	ra,0x2
+    2b3a:	192080e7          	jalr	402(ra) # 4cc8 <printf>
+    exit(1);
+    2b3e:	4505                	li	a0,1
+    2b40:	00002097          	auipc	ra,0x2
+    2b44:	dc4080e7          	jalr	-572(ra) # 4904 <exit>
+    printf("%s: rm .. worked!\n", s);
+    2b48:	85a6                	mv	a1,s1
+    2b4a:	00003517          	auipc	a0,0x3
+    2b4e:	4ae50513          	addi	a0,a0,1198 # 5ff8 <malloc+0x1278>
+    2b52:	00002097          	auipc	ra,0x2
+    2b56:	176080e7          	jalr	374(ra) # 4cc8 <printf>
+    exit(1);
+    2b5a:	4505                	li	a0,1
+    2b5c:	00002097          	auipc	ra,0x2
+    2b60:	da8080e7          	jalr	-600(ra) # 4904 <exit>
+    printf("%s: chdir / failed\n", s);
+    2b64:	85a6                	mv	a1,s1
+    2b66:	00003517          	auipc	a0,0x3
+    2b6a:	07a50513          	addi	a0,a0,122 # 5be0 <malloc+0xe60>
+    2b6e:	00002097          	auipc	ra,0x2
+    2b72:	15a080e7          	jalr	346(ra) # 4cc8 <printf>
+    exit(1);
+    2b76:	4505                	li	a0,1
+    2b78:	00002097          	auipc	ra,0x2
+    2b7c:	d8c080e7          	jalr	-628(ra) # 4904 <exit>
+    printf("%s: remove dots/. worked!\n", s);
+    2b80:	85a6                	mv	a1,s1
+    2b82:	00003517          	auipc	a0,0x3
+    2b86:	49650513          	addi	a0,a0,1174 # 6018 <malloc+0x1298>
+    2b8a:	00002097          	auipc	ra,0x2
+    2b8e:	13e080e7          	jalr	318(ra) # 4cc8 <printf>
+    exit(1);
+    2b92:	4505                	li	a0,1
+    2b94:	00002097          	auipc	ra,0x2
+    2b98:	d70080e7          	jalr	-656(ra) # 4904 <exit>
+    printf("%s: remove dots/.. worked!\n", s);
+    2b9c:	85a6                	mv	a1,s1
+    2b9e:	00003517          	auipc	a0,0x3
+    2ba2:	4a250513          	addi	a0,a0,1186 # 6040 <malloc+0x12c0>
+    2ba6:	00002097          	auipc	ra,0x2
+    2baa:	122080e7          	jalr	290(ra) # 4cc8 <printf>
+    exit(1);
+    2bae:	4505                	li	a0,1
+    2bb0:	00002097          	auipc	ra,0x2
+    2bb4:	d54080e7          	jalr	-684(ra) # 4904 <exit>
+    printf("%s: remove dots failed!\n", s);
+    2bb8:	85a6                	mv	a1,s1
+    2bba:	00003517          	auipc	a0,0x3
+    2bbe:	4a650513          	addi	a0,a0,1190 # 6060 <malloc+0x12e0>
+    2bc2:	00002097          	auipc	ra,0x2
+    2bc6:	106080e7          	jalr	262(ra) # 4cc8 <printf>
+    exit(1);
+    2bca:	4505                	li	a0,1
+    2bcc:	00002097          	auipc	ra,0x2
+    2bd0:	d38080e7          	jalr	-712(ra) # 4904 <exit>
+
+0000000000002bd4 <dirfile>:
+{
+    2bd4:	1101                	addi	sp,sp,-32
+    2bd6:	ec06                	sd	ra,24(sp)
+    2bd8:	e822                	sd	s0,16(sp)
+    2bda:	e426                	sd	s1,8(sp)
+    2bdc:	e04a                	sd	s2,0(sp)
+    2bde:	1000                	addi	s0,sp,32
+    2be0:	892a                	mv	s2,a0
+  fd = open("dirfile", O_CREATE);
+    2be2:	20000593          	li	a1,512
+    2be6:	00003517          	auipc	a0,0x3
+    2bea:	49a50513          	addi	a0,a0,1178 # 6080 <malloc+0x1300>
+    2bee:	00002097          	auipc	ra,0x2
+    2bf2:	d62080e7          	jalr	-670(ra) # 4950 <open>
+  if(fd < 0){
+    2bf6:	0c054d63          	bltz	a0,2cd0 <dirfile+0xfc>
+  close(fd);
+    2bfa:	00002097          	auipc	ra,0x2
+    2bfe:	d3a080e7          	jalr	-710(ra) # 4934 <close>
+  if(chdir("dirfile") == 0){
+    2c02:	00003517          	auipc	a0,0x3
+    2c06:	47e50513          	addi	a0,a0,1150 # 6080 <malloc+0x1300>
+    2c0a:	00002097          	auipc	ra,0x2
+    2c0e:	d64080e7          	jalr	-668(ra) # 496e <chdir>
+    2c12:	cd69                	beqz	a0,2cec <dirfile+0x118>
+  fd = open("dirfile/xx", 0);
+    2c14:	4581                	li	a1,0
+    2c16:	00003517          	auipc	a0,0x3
+    2c1a:	4b250513          	addi	a0,a0,1202 # 60c8 <malloc+0x1348>
+    2c1e:	00002097          	auipc	ra,0x2
+    2c22:	d32080e7          	jalr	-718(ra) # 4950 <open>
+  if(fd >= 0){
+    2c26:	0e055163          	bgez	a0,2d08 <dirfile+0x134>
+  fd = open("dirfile/xx", O_CREATE);
+    2c2a:	20000593          	li	a1,512
+    2c2e:	00003517          	auipc	a0,0x3
+    2c32:	49a50513          	addi	a0,a0,1178 # 60c8 <malloc+0x1348>
+    2c36:	00002097          	auipc	ra,0x2
+    2c3a:	d1a080e7          	jalr	-742(ra) # 4950 <open>
+  if(fd >= 0){
+    2c3e:	0e055363          	bgez	a0,2d24 <dirfile+0x150>
+  if(mkdir("dirfile/xx") == 0){
+    2c42:	00003517          	auipc	a0,0x3
+    2c46:	48650513          	addi	a0,a0,1158 # 60c8 <malloc+0x1348>
+    2c4a:	00002097          	auipc	ra,0x2
+    2c4e:	d1a080e7          	jalr	-742(ra) # 4964 <mkdir>
+    2c52:	c57d                	beqz	a0,2d40 <dirfile+0x16c>
+  if(remove("dirfile/xx") == 0){
+    2c54:	00003517          	auipc	a0,0x3
+    2c58:	47450513          	addi	a0,a0,1140 # 60c8 <malloc+0x1348>
+    2c5c:	00002097          	auipc	ra,0x2
+    2c60:	d68080e7          	jalr	-664(ra) # 49c4 <remove>
+    2c64:	cd65                	beqz	a0,2d5c <dirfile+0x188>
+  if(remove("dirfile") != 0){
+    2c66:	00003517          	auipc	a0,0x3
+    2c6a:	41a50513          	addi	a0,a0,1050 # 6080 <malloc+0x1300>
+    2c6e:	00002097          	auipc	ra,0x2
+    2c72:	d56080e7          	jalr	-682(ra) # 49c4 <remove>
+    2c76:	10051163          	bnez	a0,2d78 <dirfile+0x1a4>
+  fd = open(".", O_RDWR);
+    2c7a:	4589                	li	a1,2
+    2c7c:	00003517          	auipc	a0,0x3
+    2c80:	35450513          	addi	a0,a0,852 # 5fd0 <malloc+0x1250>
+    2c84:	00002097          	auipc	ra,0x2
+    2c88:	ccc080e7          	jalr	-820(ra) # 4950 <open>
+  if(fd >= 0){
+    2c8c:	10055463          	bgez	a0,2d94 <dirfile+0x1c0>
+  fd = open(".", 0);
+    2c90:	4581                	li	a1,0
+    2c92:	00003517          	auipc	a0,0x3
+    2c96:	33e50513          	addi	a0,a0,830 # 5fd0 <malloc+0x1250>
+    2c9a:	00002097          	auipc	ra,0x2
+    2c9e:	cb6080e7          	jalr	-842(ra) # 4950 <open>
+    2ca2:	84aa                	mv	s1,a0
+  if(write(fd, "x", 1) > 0){
+    2ca4:	4605                	li	a2,1
+    2ca6:	00002597          	auipc	a1,0x2
+    2caa:	2aa58593          	addi	a1,a1,682 # 4f50 <malloc+0x1d0>
+    2cae:	00002097          	auipc	ra,0x2
+    2cb2:	c7c080e7          	jalr	-900(ra) # 492a <write>
+    2cb6:	0ea04d63          	bgtz	a0,2db0 <dirfile+0x1dc>
+  close(fd);
+    2cba:	8526                	mv	a0,s1
+    2cbc:	00002097          	auipc	ra,0x2
+    2cc0:	c78080e7          	jalr	-904(ra) # 4934 <close>
+}
+    2cc4:	60e2                	ld	ra,24(sp)
+    2cc6:	6442                	ld	s0,16(sp)
+    2cc8:	64a2                	ld	s1,8(sp)
+    2cca:	6902                	ld	s2,0(sp)
+    2ccc:	6105                	addi	sp,sp,32
+    2cce:	8082                	ret
+    printf("%s: create dirfile failed\n", s);
+    2cd0:	85ca                	mv	a1,s2
+    2cd2:	00003517          	auipc	a0,0x3
+    2cd6:	3b650513          	addi	a0,a0,950 # 6088 <malloc+0x1308>
+    2cda:	00002097          	auipc	ra,0x2
+    2cde:	fee080e7          	jalr	-18(ra) # 4cc8 <printf>
+    exit(1);
+    2ce2:	4505                	li	a0,1
+    2ce4:	00002097          	auipc	ra,0x2
+    2ce8:	c20080e7          	jalr	-992(ra) # 4904 <exit>
+    printf("%s: chdir dirfile succeeded!\n", s);
+    2cec:	85ca                	mv	a1,s2
+    2cee:	00003517          	auipc	a0,0x3
+    2cf2:	3ba50513          	addi	a0,a0,954 # 60a8 <malloc+0x1328>
+    2cf6:	00002097          	auipc	ra,0x2
+    2cfa:	fd2080e7          	jalr	-46(ra) # 4cc8 <printf>
+    exit(1);
+    2cfe:	4505                	li	a0,1
+    2d00:	00002097          	auipc	ra,0x2
+    2d04:	c04080e7          	jalr	-1020(ra) # 4904 <exit>
+    printf("%s: create dirfile/xx succeeded!\n", s);
+    2d08:	85ca                	mv	a1,s2
+    2d0a:	00003517          	auipc	a0,0x3
+    2d0e:	3ce50513          	addi	a0,a0,974 # 60d8 <malloc+0x1358>
+    2d12:	00002097          	auipc	ra,0x2
+    2d16:	fb6080e7          	jalr	-74(ra) # 4cc8 <printf>
+    exit(1);
+    2d1a:	4505                	li	a0,1
+    2d1c:	00002097          	auipc	ra,0x2
+    2d20:	be8080e7          	jalr	-1048(ra) # 4904 <exit>
+    printf("%s: create dirfile/xx succeeded!\n", s);
+    2d24:	85ca                	mv	a1,s2
+    2d26:	00003517          	auipc	a0,0x3
+    2d2a:	3b250513          	addi	a0,a0,946 # 60d8 <malloc+0x1358>
+    2d2e:	00002097          	auipc	ra,0x2
+    2d32:	f9a080e7          	jalr	-102(ra) # 4cc8 <printf>
+    exit(1);
+    2d36:	4505                	li	a0,1
+    2d38:	00002097          	auipc	ra,0x2
+    2d3c:	bcc080e7          	jalr	-1076(ra) # 4904 <exit>
+    printf("%s: mkdir dirfile/xx succeeded!\n", s);
+    2d40:	85ca                	mv	a1,s2
+    2d42:	00003517          	auipc	a0,0x3
+    2d46:	3be50513          	addi	a0,a0,958 # 6100 <malloc+0x1380>
+    2d4a:	00002097          	auipc	ra,0x2
+    2d4e:	f7e080e7          	jalr	-130(ra) # 4cc8 <printf>
+    exit(1);
+    2d52:	4505                	li	a0,1
+    2d54:	00002097          	auipc	ra,0x2
+    2d58:	bb0080e7          	jalr	-1104(ra) # 4904 <exit>
+    printf("%s: remove dirfile/xx succeeded!\n", s);
+    2d5c:	85ca                	mv	a1,s2
+    2d5e:	00003517          	auipc	a0,0x3
+    2d62:	3ca50513          	addi	a0,a0,970 # 6128 <malloc+0x13a8>
+    2d66:	00002097          	auipc	ra,0x2
+    2d6a:	f62080e7          	jalr	-158(ra) # 4cc8 <printf>
+    exit(1);
+    2d6e:	4505                	li	a0,1
+    2d70:	00002097          	auipc	ra,0x2
+    2d74:	b94080e7          	jalr	-1132(ra) # 4904 <exit>
+    printf("%s: remove dirfile failed!\n", s);
+    2d78:	85ca                	mv	a1,s2
+    2d7a:	00003517          	auipc	a0,0x3
+    2d7e:	3d650513          	addi	a0,a0,982 # 6150 <malloc+0x13d0>
+    2d82:	00002097          	auipc	ra,0x2
+    2d86:	f46080e7          	jalr	-186(ra) # 4cc8 <printf>
+    exit(1);
+    2d8a:	4505                	li	a0,1
+    2d8c:	00002097          	auipc	ra,0x2
+    2d90:	b78080e7          	jalr	-1160(ra) # 4904 <exit>
+    printf("%s: open . for writing succeeded!\n", s);
+    2d94:	85ca                	mv	a1,s2
+    2d96:	00003517          	auipc	a0,0x3
+    2d9a:	3da50513          	addi	a0,a0,986 # 6170 <malloc+0x13f0>
+    2d9e:	00002097          	auipc	ra,0x2
+    2da2:	f2a080e7          	jalr	-214(ra) # 4cc8 <printf>
+    exit(1);
+    2da6:	4505                	li	a0,1
+    2da8:	00002097          	auipc	ra,0x2
+    2dac:	b5c080e7          	jalr	-1188(ra) # 4904 <exit>
+    printf("%s: write . succeeded!\n", s);
+    2db0:	85ca                	mv	a1,s2
+    2db2:	00003517          	auipc	a0,0x3
+    2db6:	3e650513          	addi	a0,a0,998 # 6198 <malloc+0x1418>
+    2dba:	00002097          	auipc	ra,0x2
+    2dbe:	f0e080e7          	jalr	-242(ra) # 4cc8 <printf>
+    exit(1);
+    2dc2:	4505                	li	a0,1
+    2dc4:	00002097          	auipc	ra,0x2
+    2dc8:	b40080e7          	jalr	-1216(ra) # 4904 <exit>
+
+0000000000002dcc <iref>:
+{
+    2dcc:	7139                	addi	sp,sp,-64
+    2dce:	fc06                	sd	ra,56(sp)
+    2dd0:	f822                	sd	s0,48(sp)
+    2dd2:	f426                	sd	s1,40(sp)
+    2dd4:	f04a                	sd	s2,32(sp)
+    2dd6:	ec4e                	sd	s3,24(sp)
+    2dd8:	e852                	sd	s4,16(sp)
+    2dda:	e456                	sd	s5,8(sp)
+    2ddc:	0080                	addi	s0,sp,64
+    2dde:	8aaa                	mv	s5,a0
+    2de0:	02e00493          	li	s1,46
+    if(mkdir("irefd") != 0){
+    2de4:	00003917          	auipc	s2,0x3
+    2de8:	3cc90913          	addi	s2,s2,972 # 61b0 <malloc+0x1430>
+    mkdir("");
+    2dec:	00003a17          	auipc	s4,0x3
+    2df0:	05ca0a13          	addi	s4,s4,92 # 5e48 <malloc+0x10c8>
+    fd = open("xx", O_CREATE);
+    2df4:	00003997          	auipc	s3,0x3
+    2df8:	2dc98993          	addi	s3,s3,732 # 60d0 <malloc+0x1350>
+    2dfc:	a889                	j	2e4e <iref+0x82>
+      printf("%s: mkdir irefd failed\n", s);
+    2dfe:	85d6                	mv	a1,s5
+    2e00:	00003517          	auipc	a0,0x3
+    2e04:	3b850513          	addi	a0,a0,952 # 61b8 <malloc+0x1438>
+    2e08:	00002097          	auipc	ra,0x2
+    2e0c:	ec0080e7          	jalr	-320(ra) # 4cc8 <printf>
+      exit(1);
+    2e10:	4505                	li	a0,1
+    2e12:	00002097          	auipc	ra,0x2
+    2e16:	af2080e7          	jalr	-1294(ra) # 4904 <exit>
+      printf("%s: chdir irefd failed\n", s);
+    2e1a:	85d6                	mv	a1,s5
+    2e1c:	00003517          	auipc	a0,0x3
+    2e20:	3b450513          	addi	a0,a0,948 # 61d0 <malloc+0x1450>
+    2e24:	00002097          	auipc	ra,0x2
+    2e28:	ea4080e7          	jalr	-348(ra) # 4cc8 <printf>
+      exit(1);
+    2e2c:	4505                	li	a0,1
+    2e2e:	00002097          	auipc	ra,0x2
+    2e32:	ad6080e7          	jalr	-1322(ra) # 4904 <exit>
+      close(fd);
+    2e36:	00002097          	auipc	ra,0x2
+    2e3a:	afe080e7          	jalr	-1282(ra) # 4934 <close>
+    2e3e:	a091                	j	2e82 <iref+0xb6>
+    remove("xx");
+    2e40:	854e                	mv	a0,s3
+    2e42:	00002097          	auipc	ra,0x2
+    2e46:	b82080e7          	jalr	-1150(ra) # 49c4 <remove>
+  for(i = 0; i < NINODE - 4; i++){
+    2e4a:	34fd                	addiw	s1,s1,-1
+    2e4c:	c8a9                	beqz	s1,2e9e <iref+0xd2>
+    if(mkdir("irefd") != 0){
+    2e4e:	854a                	mv	a0,s2
+    2e50:	00002097          	auipc	ra,0x2
+    2e54:	b14080e7          	jalr	-1260(ra) # 4964 <mkdir>
+    2e58:	f15d                	bnez	a0,2dfe <iref+0x32>
+    if(chdir("irefd") != 0){
+    2e5a:	854a                	mv	a0,s2
+    2e5c:	00002097          	auipc	ra,0x2
+    2e60:	b12080e7          	jalr	-1262(ra) # 496e <chdir>
+    2e64:	f95d                	bnez	a0,2e1a <iref+0x4e>
+    mkdir("");
+    2e66:	8552                	mv	a0,s4
+    2e68:	00002097          	auipc	ra,0x2
+    2e6c:	afc080e7          	jalr	-1284(ra) # 4964 <mkdir>
+    fd = open("", O_CREATE);
+    2e70:	20000593          	li	a1,512
+    2e74:	8552                	mv	a0,s4
+    2e76:	00002097          	auipc	ra,0x2
+    2e7a:	ada080e7          	jalr	-1318(ra) # 4950 <open>
+    if(fd >= 0)
+    2e7e:	fa055ce3          	bgez	a0,2e36 <iref+0x6a>
+    fd = open("xx", O_CREATE);
+    2e82:	20000593          	li	a1,512
+    2e86:	854e                	mv	a0,s3
+    2e88:	00002097          	auipc	ra,0x2
+    2e8c:	ac8080e7          	jalr	-1336(ra) # 4950 <open>
+    if(fd >= 0)
+    2e90:	fa0548e3          	bltz	a0,2e40 <iref+0x74>
+      close(fd);
+    2e94:	00002097          	auipc	ra,0x2
+    2e98:	aa0080e7          	jalr	-1376(ra) # 4934 <close>
+    2e9c:	b755                	j	2e40 <iref+0x74>
+    2e9e:	03300493          	li	s1,51
+    chdir("..");
+    2ea2:	00003997          	auipc	s3,0x3
+    2ea6:	14e98993          	addi	s3,s3,334 # 5ff0 <malloc+0x1270>
+    remove("irefd");
+    2eaa:	00003917          	auipc	s2,0x3
+    2eae:	30690913          	addi	s2,s2,774 # 61b0 <malloc+0x1430>
+    chdir("..");
+    2eb2:	854e                	mv	a0,s3
+    2eb4:	00002097          	auipc	ra,0x2
+    2eb8:	aba080e7          	jalr	-1350(ra) # 496e <chdir>
+    remove("irefd");
+    2ebc:	854a                	mv	a0,s2
+    2ebe:	00002097          	auipc	ra,0x2
+    2ec2:	b06080e7          	jalr	-1274(ra) # 49c4 <remove>
+  for(i = 0; i < NINODE + 1; i++){
+    2ec6:	34fd                	addiw	s1,s1,-1
+    2ec8:	f4ed                	bnez	s1,2eb2 <iref+0xe6>
+  chdir("/");
+    2eca:	00003517          	auipc	a0,0x3
+    2ece:	d0e50513          	addi	a0,a0,-754 # 5bd8 <malloc+0xe58>
+    2ed2:	00002097          	auipc	ra,0x2
+    2ed6:	a9c080e7          	jalr	-1380(ra) # 496e <chdir>
+}
+    2eda:	70e2                	ld	ra,56(sp)
+    2edc:	7442                	ld	s0,48(sp)
+    2ede:	74a2                	ld	s1,40(sp)
+    2ee0:	7902                	ld	s2,32(sp)
+    2ee2:	69e2                	ld	s3,24(sp)
+    2ee4:	6a42                	ld	s4,16(sp)
+    2ee6:	6aa2                	ld	s5,8(sp)
+    2ee8:	6121                	addi	sp,sp,64
+    2eea:	8082                	ret
+
+0000000000002eec <openiputtest>:
+{
+    2eec:	7179                	addi	sp,sp,-48
+    2eee:	f406                	sd	ra,40(sp)
+    2ef0:	f022                	sd	s0,32(sp)
+    2ef2:	ec26                	sd	s1,24(sp)
+    2ef4:	1800                	addi	s0,sp,48
+    2ef6:	84aa                	mv	s1,a0
+  if(mkdir("oidir") < 0){
+    2ef8:	00003517          	auipc	a0,0x3
+    2efc:	2f050513          	addi	a0,a0,752 # 61e8 <malloc+0x1468>
+    2f00:	00002097          	auipc	ra,0x2
+    2f04:	a64080e7          	jalr	-1436(ra) # 4964 <mkdir>
+    2f08:	04054263          	bltz	a0,2f4c <openiputtest+0x60>
+  pid = fork();
+    2f0c:	00002097          	auipc	ra,0x2
+    2f10:	9f0080e7          	jalr	-1552(ra) # 48fc <fork>
+  if(pid < 0){
+    2f14:	04054a63          	bltz	a0,2f68 <openiputtest+0x7c>
+  if(pid == 0){
+    2f18:	e93d                	bnez	a0,2f8e <openiputtest+0xa2>
+    int fd = open("oidir", O_RDWR);
+    2f1a:	4589                	li	a1,2
+    2f1c:	00003517          	auipc	a0,0x3
+    2f20:	2cc50513          	addi	a0,a0,716 # 61e8 <malloc+0x1468>
+    2f24:	00002097          	auipc	ra,0x2
+    2f28:	a2c080e7          	jalr	-1492(ra) # 4950 <open>
+    if(fd >= 0){
+    2f2c:	04054c63          	bltz	a0,2f84 <openiputtest+0x98>
+      printf("%s: open directory for write succeeded\n", s);
+    2f30:	85a6                	mv	a1,s1
+    2f32:	00003517          	auipc	a0,0x3
+    2f36:	2d650513          	addi	a0,a0,726 # 6208 <malloc+0x1488>
+    2f3a:	00002097          	auipc	ra,0x2
+    2f3e:	d8e080e7          	jalr	-626(ra) # 4cc8 <printf>
+      exit(1);
+    2f42:	4505                	li	a0,1
+    2f44:	00002097          	auipc	ra,0x2
+    2f48:	9c0080e7          	jalr	-1600(ra) # 4904 <exit>
+    printf("%s: mkdir oidir failed\n", s);
+    2f4c:	85a6                	mv	a1,s1
+    2f4e:	00003517          	auipc	a0,0x3
+    2f52:	2a250513          	addi	a0,a0,674 # 61f0 <malloc+0x1470>
+    2f56:	00002097          	auipc	ra,0x2
+    2f5a:	d72080e7          	jalr	-654(ra) # 4cc8 <printf>
+    exit(1);
+    2f5e:	4505                	li	a0,1
+    2f60:	00002097          	auipc	ra,0x2
+    2f64:	9a4080e7          	jalr	-1628(ra) # 4904 <exit>
+    printf("%s: fork failed\n", s);
+    2f68:	85a6                	mv	a1,s1
+    2f6a:	00002517          	auipc	a0,0x2
+    2f6e:	60650513          	addi	a0,a0,1542 # 5570 <malloc+0x7f0>
+    2f72:	00002097          	auipc	ra,0x2
+    2f76:	d56080e7          	jalr	-682(ra) # 4cc8 <printf>
+    exit(1);
+    2f7a:	4505                	li	a0,1
+    2f7c:	00002097          	auipc	ra,0x2
+    2f80:	988080e7          	jalr	-1656(ra) # 4904 <exit>
+    exit(0);
+    2f84:	4501                	li	a0,0
+    2f86:	00002097          	auipc	ra,0x2
+    2f8a:	97e080e7          	jalr	-1666(ra) # 4904 <exit>
+  sleep(1);
+    2f8e:	4505                	li	a0,1
+    2f90:	00002097          	auipc	ra,0x2
+    2f94:	a02080e7          	jalr	-1534(ra) # 4992 <sleep>
+  if(remove("oidir") != 0){
+    2f98:	00003517          	auipc	a0,0x3
+    2f9c:	25050513          	addi	a0,a0,592 # 61e8 <malloc+0x1468>
+    2fa0:	00002097          	auipc	ra,0x2
+    2fa4:	a24080e7          	jalr	-1500(ra) # 49c4 <remove>
+    2fa8:	cd19                	beqz	a0,2fc6 <openiputtest+0xda>
+    printf("%s: remove failed\n", s);
+    2faa:	85a6                	mv	a1,s1
+    2fac:	00003517          	auipc	a0,0x3
+    2fb0:	28450513          	addi	a0,a0,644 # 6230 <malloc+0x14b0>
+    2fb4:	00002097          	auipc	ra,0x2
+    2fb8:	d14080e7          	jalr	-748(ra) # 4cc8 <printf>
+    exit(1);
+    2fbc:	4505                	li	a0,1
+    2fbe:	00002097          	auipc	ra,0x2
+    2fc2:	946080e7          	jalr	-1722(ra) # 4904 <exit>
+  wait(&xstatus);
+    2fc6:	fdc40513          	addi	a0,s0,-36
+    2fca:	00002097          	auipc	ra,0x2
+    2fce:	944080e7          	jalr	-1724(ra) # 490e <wait>
+  exit(xstatus);
+    2fd2:	fdc42503          	lw	a0,-36(s0)
+    2fd6:	00002097          	auipc	ra,0x2
+    2fda:	92e080e7          	jalr	-1746(ra) # 4904 <exit>
+
+0000000000002fde <forkforkfork>:
+{
+    2fde:	1101                	addi	sp,sp,-32
+    2fe0:	ec06                	sd	ra,24(sp)
+    2fe2:	e822                	sd	s0,16(sp)
+    2fe4:	e426                	sd	s1,8(sp)
+    2fe6:	1000                	addi	s0,sp,32
+    2fe8:	84aa                	mv	s1,a0
+  remove("stopforking");
+    2fea:	00003517          	auipc	a0,0x3
+    2fee:	25e50513          	addi	a0,a0,606 # 6248 <malloc+0x14c8>
+    2ff2:	00002097          	auipc	ra,0x2
+    2ff6:	9d2080e7          	jalr	-1582(ra) # 49c4 <remove>
+  int pid = fork();
+    2ffa:	00002097          	auipc	ra,0x2
+    2ffe:	902080e7          	jalr	-1790(ra) # 48fc <fork>
+  if(pid < 0){
+    3002:	04054d63          	bltz	a0,305c <forkforkfork+0x7e>
+  if(pid == 0){
+    3006:	c92d                	beqz	a0,3078 <forkforkfork+0x9a>
+  sleep(20); // two seconds
+    3008:	4551                	li	a0,20
+    300a:	00002097          	auipc	ra,0x2
+    300e:	988080e7          	jalr	-1656(ra) # 4992 <sleep>
+  close(open("stopforking", O_CREATE|O_RDWR));
+    3012:	20200593          	li	a1,514
+    3016:	00003517          	auipc	a0,0x3
+    301a:	23250513          	addi	a0,a0,562 # 6248 <malloc+0x14c8>
+    301e:	00002097          	auipc	ra,0x2
+    3022:	932080e7          	jalr	-1742(ra) # 4950 <open>
+    3026:	00002097          	auipc	ra,0x2
+    302a:	90e080e7          	jalr	-1778(ra) # 4934 <close>
+  wait(0);
+    302e:	4501                	li	a0,0
+    3030:	00002097          	auipc	ra,0x2
+    3034:	8de080e7          	jalr	-1826(ra) # 490e <wait>
+  sleep(10); // one second
+    3038:	4529                	li	a0,10
+    303a:	00002097          	auipc	ra,0x2
+    303e:	958080e7          	jalr	-1704(ra) # 4992 <sleep>
+  remove("stopforking");
+    3042:	00003517          	auipc	a0,0x3
+    3046:	20650513          	addi	a0,a0,518 # 6248 <malloc+0x14c8>
+    304a:	00002097          	auipc	ra,0x2
+    304e:	97a080e7          	jalr	-1670(ra) # 49c4 <remove>
+}
+    3052:	60e2                	ld	ra,24(sp)
+    3054:	6442                	ld	s0,16(sp)
+    3056:	64a2                	ld	s1,8(sp)
+    3058:	6105                	addi	sp,sp,32
+    305a:	8082                	ret
+    printf("%s: fork failed", s);
+    305c:	85a6                	mv	a1,s1
+    305e:	00002517          	auipc	a0,0x2
+    3062:	6d250513          	addi	a0,a0,1746 # 5730 <malloc+0x9b0>
+    3066:	00002097          	auipc	ra,0x2
+    306a:	c62080e7          	jalr	-926(ra) # 4cc8 <printf>
+    exit(1);
+    306e:	4505                	li	a0,1
+    3070:	00002097          	auipc	ra,0x2
+    3074:	894080e7          	jalr	-1900(ra) # 4904 <exit>
+      int fd = open("stopforking", 0);
+    3078:	00003497          	auipc	s1,0x3
+    307c:	1d048493          	addi	s1,s1,464 # 6248 <malloc+0x14c8>
+    3080:	4581                	li	a1,0
+    3082:	8526                	mv	a0,s1
+    3084:	00002097          	auipc	ra,0x2
+    3088:	8cc080e7          	jalr	-1844(ra) # 4950 <open>
+      if(fd >= 0){
+    308c:	02055463          	bgez	a0,30b4 <forkforkfork+0xd6>
+      if(fork() < 0){
+    3090:	00002097          	auipc	ra,0x2
+    3094:	86c080e7          	jalr	-1940(ra) # 48fc <fork>
+    3098:	fe0554e3          	bgez	a0,3080 <forkforkfork+0xa2>
+        close(open("stopforking", O_CREATE|O_RDWR));
+    309c:	20200593          	li	a1,514
+    30a0:	8526                	mv	a0,s1
+    30a2:	00002097          	auipc	ra,0x2
+    30a6:	8ae080e7          	jalr	-1874(ra) # 4950 <open>
+    30aa:	00002097          	auipc	ra,0x2
+    30ae:	88a080e7          	jalr	-1910(ra) # 4934 <close>
+    30b2:	b7f9                	j	3080 <forkforkfork+0xa2>
+        exit(0);
+    30b4:	4501                	li	a0,0
+    30b6:	00002097          	auipc	ra,0x2
+    30ba:	84e080e7          	jalr	-1970(ra) # 4904 <exit>
+
+00000000000030be <preempt>:
+{
+    30be:	7139                	addi	sp,sp,-64
+    30c0:	fc06                	sd	ra,56(sp)
+    30c2:	f822                	sd	s0,48(sp)
+    30c4:	f426                	sd	s1,40(sp)
+    30c6:	f04a                	sd	s2,32(sp)
+    30c8:	ec4e                	sd	s3,24(sp)
+    30ca:	e852                	sd	s4,16(sp)
+    30cc:	0080                	addi	s0,sp,64
+    30ce:	892a                	mv	s2,a0
+  pid1 = fork();
+    30d0:	00002097          	auipc	ra,0x2
+    30d4:	82c080e7          	jalr	-2004(ra) # 48fc <fork>
+  if(pid1 < 0) {
+    30d8:	00054563          	bltz	a0,30e2 <preempt+0x24>
+    30dc:	84aa                	mv	s1,a0
+  if(pid1 == 0)
+    30de:	ed19                	bnez	a0,30fc <preempt+0x3e>
+    for(;;)
+    30e0:	a001                	j	30e0 <preempt+0x22>
+    printf("%s: fork failed");
+    30e2:	00002517          	auipc	a0,0x2
+    30e6:	64e50513          	addi	a0,a0,1614 # 5730 <malloc+0x9b0>
+    30ea:	00002097          	auipc	ra,0x2
+    30ee:	bde080e7          	jalr	-1058(ra) # 4cc8 <printf>
+    exit(1);
+    30f2:	4505                	li	a0,1
+    30f4:	00002097          	auipc	ra,0x2
+    30f8:	810080e7          	jalr	-2032(ra) # 4904 <exit>
+  pid2 = fork();
+    30fc:	00002097          	auipc	ra,0x2
+    3100:	800080e7          	jalr	-2048(ra) # 48fc <fork>
+    3104:	89aa                	mv	s3,a0
+  if(pid2 < 0) {
+    3106:	00054463          	bltz	a0,310e <preempt+0x50>
+  if(pid2 == 0)
+    310a:	e105                	bnez	a0,312a <preempt+0x6c>
+    for(;;)
+    310c:	a001                	j	310c <preempt+0x4e>
+    printf("%s: fork failed\n", s);
+    310e:	85ca                	mv	a1,s2
+    3110:	00002517          	auipc	a0,0x2
+    3114:	46050513          	addi	a0,a0,1120 # 5570 <malloc+0x7f0>
+    3118:	00002097          	auipc	ra,0x2
+    311c:	bb0080e7          	jalr	-1104(ra) # 4cc8 <printf>
+    exit(1);
+    3120:	4505                	li	a0,1
+    3122:	00001097          	auipc	ra,0x1
+    3126:	7e2080e7          	jalr	2018(ra) # 4904 <exit>
+  pipe(pfds);
+    312a:	fc840513          	addi	a0,s0,-56
+    312e:	00001097          	auipc	ra,0x1
+    3132:	7e8080e7          	jalr	2024(ra) # 4916 <pipe>
+  pid3 = fork();
+    3136:	00001097          	auipc	ra,0x1
+    313a:	7c6080e7          	jalr	1990(ra) # 48fc <fork>
+    313e:	8a2a                	mv	s4,a0
+  if(pid3 < 0) {
+    3140:	02054e63          	bltz	a0,317c <preempt+0xbe>
+  if(pid3 == 0){
+    3144:	e13d                	bnez	a0,31aa <preempt+0xec>
+    close(pfds[0]);
+    3146:	fc842503          	lw	a0,-56(s0)
+    314a:	00001097          	auipc	ra,0x1
+    314e:	7ea080e7          	jalr	2026(ra) # 4934 <close>
+    if(write(pfds[1], "x", 1) != 1)
+    3152:	4605                	li	a2,1
+    3154:	00002597          	auipc	a1,0x2
+    3158:	dfc58593          	addi	a1,a1,-516 # 4f50 <malloc+0x1d0>
+    315c:	fcc42503          	lw	a0,-52(s0)
+    3160:	00001097          	auipc	ra,0x1
+    3164:	7ca080e7          	jalr	1994(ra) # 492a <write>
+    3168:	4785                	li	a5,1
+    316a:	02f51763          	bne	a0,a5,3198 <preempt+0xda>
+    close(pfds[1]);
+    316e:	fcc42503          	lw	a0,-52(s0)
+    3172:	00001097          	auipc	ra,0x1
+    3176:	7c2080e7          	jalr	1986(ra) # 4934 <close>
+    for(;;)
+    317a:	a001                	j	317a <preempt+0xbc>
+     printf("%s: fork failed\n", s);
+    317c:	85ca                	mv	a1,s2
+    317e:	00002517          	auipc	a0,0x2
+    3182:	3f250513          	addi	a0,a0,1010 # 5570 <malloc+0x7f0>
+    3186:	00002097          	auipc	ra,0x2
+    318a:	b42080e7          	jalr	-1214(ra) # 4cc8 <printf>
+     exit(1);
+    318e:	4505                	li	a0,1
+    3190:	00001097          	auipc	ra,0x1
+    3194:	774080e7          	jalr	1908(ra) # 4904 <exit>
+      printf("%s: preempt write error");
+    3198:	00003517          	auipc	a0,0x3
+    319c:	0c050513          	addi	a0,a0,192 # 6258 <malloc+0x14d8>
+    31a0:	00002097          	auipc	ra,0x2
+    31a4:	b28080e7          	jalr	-1240(ra) # 4cc8 <printf>
+    31a8:	b7d9                	j	316e <preempt+0xb0>
+  close(pfds[1]);
+    31aa:	fcc42503          	lw	a0,-52(s0)
+    31ae:	00001097          	auipc	ra,0x1
+    31b2:	786080e7          	jalr	1926(ra) # 4934 <close>
+  if(read(pfds[0], buf, sizeof(buf)) != 1){
+    31b6:	6609                	lui	a2,0x2
+    31b8:	80060613          	addi	a2,a2,-2048 # 1800 <forkfork+0x42>
+    31bc:	00007597          	auipc	a1,0x7
+    31c0:	6dc58593          	addi	a1,a1,1756 # a898 <buf>
+    31c4:	fc842503          	lw	a0,-56(s0)
+    31c8:	00001097          	auipc	ra,0x1
+    31cc:	758080e7          	jalr	1880(ra) # 4920 <read>
+    31d0:	4785                	li	a5,1
+    31d2:	02f50263          	beq	a0,a5,31f6 <preempt+0x138>
+    printf("%s: preempt read error");
+    31d6:	00003517          	auipc	a0,0x3
+    31da:	09a50513          	addi	a0,a0,154 # 6270 <malloc+0x14f0>
+    31de:	00002097          	auipc	ra,0x2
+    31e2:	aea080e7          	jalr	-1302(ra) # 4cc8 <printf>
+}
+    31e6:	70e2                	ld	ra,56(sp)
+    31e8:	7442                	ld	s0,48(sp)
+    31ea:	74a2                	ld	s1,40(sp)
+    31ec:	7902                	ld	s2,32(sp)
+    31ee:	69e2                	ld	s3,24(sp)
+    31f0:	6a42                	ld	s4,16(sp)
+    31f2:	6121                	addi	sp,sp,64
+    31f4:	8082                	ret
+  close(pfds[0]);
+    31f6:	fc842503          	lw	a0,-56(s0)
+    31fa:	00001097          	auipc	ra,0x1
+    31fe:	73a080e7          	jalr	1850(ra) # 4934 <close>
+  printf("kill... ");
+    3202:	00003517          	auipc	a0,0x3
+    3206:	08650513          	addi	a0,a0,134 # 6288 <malloc+0x1508>
+    320a:	00002097          	auipc	ra,0x2
+    320e:	abe080e7          	jalr	-1346(ra) # 4cc8 <printf>
+  kill(pid1);
+    3212:	8526                	mv	a0,s1
+    3214:	00001097          	auipc	ra,0x1
+    3218:	72a080e7          	jalr	1834(ra) # 493e <kill>
+  kill(pid2);
+    321c:	854e                	mv	a0,s3
+    321e:	00001097          	auipc	ra,0x1
+    3222:	720080e7          	jalr	1824(ra) # 493e <kill>
+  kill(pid3);
+    3226:	8552                	mv	a0,s4
+    3228:	00001097          	auipc	ra,0x1
+    322c:	716080e7          	jalr	1814(ra) # 493e <kill>
+  printf("wait... ");
+    3230:	00003517          	auipc	a0,0x3
+    3234:	06850513          	addi	a0,a0,104 # 6298 <malloc+0x1518>
+    3238:	00002097          	auipc	ra,0x2
+    323c:	a90080e7          	jalr	-1392(ra) # 4cc8 <printf>
+  wait(0);
+    3240:	4501                	li	a0,0
+    3242:	00001097          	auipc	ra,0x1
+    3246:	6cc080e7          	jalr	1740(ra) # 490e <wait>
+  wait(0);
+    324a:	4501                	li	a0,0
+    324c:	00001097          	auipc	ra,0x1
+    3250:	6c2080e7          	jalr	1730(ra) # 490e <wait>
+  wait(0);
+    3254:	4501                	li	a0,0
+    3256:	00001097          	auipc	ra,0x1
+    325a:	6b8080e7          	jalr	1720(ra) # 490e <wait>
+    325e:	b761                	j	31e6 <preempt+0x128>
+
+0000000000003260 <sbrkfail>:
+{
+    3260:	7119                	addi	sp,sp,-128
+    3262:	fc86                	sd	ra,120(sp)
+    3264:	f8a2                	sd	s0,112(sp)
+    3266:	f4a6                	sd	s1,104(sp)
+    3268:	f0ca                	sd	s2,96(sp)
+    326a:	ecce                	sd	s3,88(sp)
+    326c:	e8d2                	sd	s4,80(sp)
+    326e:	e4d6                	sd	s5,72(sp)
+    3270:	e0da                	sd	s6,64(sp)
+    3272:	0100                	addi	s0,sp,128
+    3274:	8b2a                	mv	s6,a0
+  if(pipe(fds) != 0){
+    3276:	fb040513          	addi	a0,s0,-80
+    327a:	00001097          	auipc	ra,0x1
+    327e:	69c080e7          	jalr	1692(ra) # 4916 <pipe>
+    3282:	e911                	bnez	a0,3296 <sbrkfail+0x36>
+    3284:	f8040493          	addi	s1,s0,-128
+    3288:	fa840993          	addi	s3,s0,-88
+    328c:	8926                	mv	s2,s1
+    if(pids[i] != -1)
+    328e:	5a7d                	li	s4,-1
+      read(fds[0], &scratch, 1);
+    3290:	faf40a93          	addi	s5,s0,-81
+    3294:	a085                	j	32f4 <sbrkfail+0x94>
+    printf("%s: pipe() failed\n", s);
+    3296:	85da                	mv	a1,s6
+    3298:	00002517          	auipc	a0,0x2
+    329c:	3e050513          	addi	a0,a0,992 # 5678 <malloc+0x8f8>
+    32a0:	00002097          	auipc	ra,0x2
+    32a4:	a28080e7          	jalr	-1496(ra) # 4cc8 <printf>
+    exit(1);
+    32a8:	4505                	li	a0,1
+    32aa:	00001097          	auipc	ra,0x1
+    32ae:	65a080e7          	jalr	1626(ra) # 4904 <exit>
+      sbrk(BIG - (uint64)sbrk(0));
+    32b2:	00001097          	auipc	ra,0x1
+    32b6:	6d8080e7          	jalr	1752(ra) # 498a <sbrk>
+    32ba:	064007b7          	lui	a5,0x6400
+    32be:	40a7853b          	subw	a0,a5,a0
+    32c2:	00001097          	auipc	ra,0x1
+    32c6:	6c8080e7          	jalr	1736(ra) # 498a <sbrk>
+      write(fds[1], "x", 1);
+    32ca:	4605                	li	a2,1
+    32cc:	00002597          	auipc	a1,0x2
+    32d0:	c8458593          	addi	a1,a1,-892 # 4f50 <malloc+0x1d0>
+    32d4:	fb442503          	lw	a0,-76(s0)
+    32d8:	00001097          	auipc	ra,0x1
+    32dc:	652080e7          	jalr	1618(ra) # 492a <write>
+      for(;;) sleep(1000);
+    32e0:	3e800513          	li	a0,1000
+    32e4:	00001097          	auipc	ra,0x1
+    32e8:	6ae080e7          	jalr	1710(ra) # 4992 <sleep>
+    32ec:	bfd5                	j	32e0 <sbrkfail+0x80>
+  for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
+    32ee:	0911                	addi	s2,s2,4
+    32f0:	03390463          	beq	s2,s3,3318 <sbrkfail+0xb8>
+    if((pids[i] = fork()) == 0){
+    32f4:	00001097          	auipc	ra,0x1
+    32f8:	608080e7          	jalr	1544(ra) # 48fc <fork>
+    32fc:	00a92023          	sw	a0,0(s2)
+    3300:	d94d                	beqz	a0,32b2 <sbrkfail+0x52>
+    if(pids[i] != -1)
+    3302:	ff4506e3          	beq	a0,s4,32ee <sbrkfail+0x8e>
+      read(fds[0], &scratch, 1);
+    3306:	4605                	li	a2,1
+    3308:	85d6                	mv	a1,s5
+    330a:	fb042503          	lw	a0,-80(s0)
+    330e:	00001097          	auipc	ra,0x1
+    3312:	612080e7          	jalr	1554(ra) # 4920 <read>
+    3316:	bfe1                	j	32ee <sbrkfail+0x8e>
+  c = sbrk(PGSIZE);
+    3318:	6505                	lui	a0,0x1
+    331a:	00001097          	auipc	ra,0x1
+    331e:	670080e7          	jalr	1648(ra) # 498a <sbrk>
+    3322:	8a2a                	mv	s4,a0
+    if(pids[i] == -1)
+    3324:	597d                	li	s2,-1
+    3326:	a021                	j	332e <sbrkfail+0xce>
+  for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
+    3328:	0491                	addi	s1,s1,4
+    332a:	01348f63          	beq	s1,s3,3348 <sbrkfail+0xe8>
+    if(pids[i] == -1)
+    332e:	4088                	lw	a0,0(s1)
+    3330:	ff250ce3          	beq	a0,s2,3328 <sbrkfail+0xc8>
+    kill(pids[i]);
+    3334:	00001097          	auipc	ra,0x1
+    3338:	60a080e7          	jalr	1546(ra) # 493e <kill>
+    wait(0);
+    333c:	4501                	li	a0,0
+    333e:	00001097          	auipc	ra,0x1
+    3342:	5d0080e7          	jalr	1488(ra) # 490e <wait>
+    3346:	b7cd                	j	3328 <sbrkfail+0xc8>
+  if(c == (char*)0xffffffffffffffffL){
+    3348:	57fd                	li	a5,-1
+    334a:	04fa0263          	beq	s4,a5,338e <sbrkfail+0x12e>
+  pid = fork();
+    334e:	00001097          	auipc	ra,0x1
+    3352:	5ae080e7          	jalr	1454(ra) # 48fc <fork>
+    3356:	84aa                	mv	s1,a0
+  if(pid < 0){
+    3358:	04054963          	bltz	a0,33aa <sbrkfail+0x14a>
+  if(pid == 0){
+    335c:	c52d                	beqz	a0,33c6 <sbrkfail+0x166>
+  wait(&xstatus);
+    335e:	fbc40513          	addi	a0,s0,-68
+    3362:	00001097          	auipc	ra,0x1
+    3366:	5ac080e7          	jalr	1452(ra) # 490e <wait>
+  if(xstatus != -1 && xstatus != 2)
+    336a:	fbc42783          	lw	a5,-68(s0)
+    336e:	577d                	li	a4,-1
+    3370:	00e78563          	beq	a5,a4,337a <sbrkfail+0x11a>
+    3374:	4709                	li	a4,2
+    3376:	08e79d63          	bne	a5,a4,3410 <sbrkfail+0x1b0>
+}
+    337a:	70e6                	ld	ra,120(sp)
+    337c:	7446                	ld	s0,112(sp)
+    337e:	74a6                	ld	s1,104(sp)
+    3380:	7906                	ld	s2,96(sp)
+    3382:	69e6                	ld	s3,88(sp)
+    3384:	6a46                	ld	s4,80(sp)
+    3386:	6aa6                	ld	s5,72(sp)
+    3388:	6b06                	ld	s6,64(sp)
+    338a:	6109                	addi	sp,sp,128
+    338c:	8082                	ret
+    printf("%s: failed sbrk leaked memory\n", s);
+    338e:	85da                	mv	a1,s6
+    3390:	00003517          	auipc	a0,0x3
+    3394:	f1850513          	addi	a0,a0,-232 # 62a8 <malloc+0x1528>
+    3398:	00002097          	auipc	ra,0x2
+    339c:	930080e7          	jalr	-1744(ra) # 4cc8 <printf>
+    exit(1);
+    33a0:	4505                	li	a0,1
+    33a2:	00001097          	auipc	ra,0x1
+    33a6:	562080e7          	jalr	1378(ra) # 4904 <exit>
+    printf("%s: fork failed\n", s);
+    33aa:	85da                	mv	a1,s6
+    33ac:	00002517          	auipc	a0,0x2
+    33b0:	1c450513          	addi	a0,a0,452 # 5570 <malloc+0x7f0>
+    33b4:	00002097          	auipc	ra,0x2
+    33b8:	914080e7          	jalr	-1772(ra) # 4cc8 <printf>
+    exit(1);
+    33bc:	4505                	li	a0,1
+    33be:	00001097          	auipc	ra,0x1
+    33c2:	546080e7          	jalr	1350(ra) # 4904 <exit>
+    a = sbrk(0);
+    33c6:	4501                	li	a0,0
+    33c8:	00001097          	auipc	ra,0x1
+    33cc:	5c2080e7          	jalr	1474(ra) # 498a <sbrk>
+    33d0:	892a                	mv	s2,a0
+    sbrk(10*BIG);
+    33d2:	3e800537          	lui	a0,0x3e800
+    33d6:	00001097          	auipc	ra,0x1
+    33da:	5b4080e7          	jalr	1460(ra) # 498a <sbrk>
+    for (i = 0; i < 10*BIG; i += PGSIZE) {
+    33de:	87ca                	mv	a5,s2
+    33e0:	3e800737          	lui	a4,0x3e800
+    33e4:	993a                	add	s2,s2,a4
+    33e6:	6705                	lui	a4,0x1
+      n += *(a+i);
+    33e8:	0007c683          	lbu	a3,0(a5) # 6400000 <__BSS_END__+0x63f3f50>
+    33ec:	9cb5                	addw	s1,s1,a3
+    for (i = 0; i < 10*BIG; i += PGSIZE) {
+    33ee:	97ba                	add	a5,a5,a4
+    33f0:	ff279ce3          	bne	a5,s2,33e8 <sbrkfail+0x188>
+    printf("%s: allocate a lot of memory succeeded %d\n", n);
+    33f4:	85a6                	mv	a1,s1
+    33f6:	00003517          	auipc	a0,0x3
+    33fa:	ed250513          	addi	a0,a0,-302 # 62c8 <malloc+0x1548>
+    33fe:	00002097          	auipc	ra,0x2
+    3402:	8ca080e7          	jalr	-1846(ra) # 4cc8 <printf>
+    exit(1);
+    3406:	4505                	li	a0,1
+    3408:	00001097          	auipc	ra,0x1
+    340c:	4fc080e7          	jalr	1276(ra) # 4904 <exit>
+    exit(1);
+    3410:	4505                	li	a0,1
+    3412:	00001097          	auipc	ra,0x1
+    3416:	4f2080e7          	jalr	1266(ra) # 4904 <exit>
+
+000000000000341a <reparent>:
+{
+    341a:	7179                	addi	sp,sp,-48
+    341c:	f406                	sd	ra,40(sp)
+    341e:	f022                	sd	s0,32(sp)
+    3420:	ec26                	sd	s1,24(sp)
+    3422:	e84a                	sd	s2,16(sp)
+    3424:	e44e                	sd	s3,8(sp)
+    3426:	e052                	sd	s4,0(sp)
+    3428:	1800                	addi	s0,sp,48
+    342a:	89aa                	mv	s3,a0
+  int master_pid = getpid();
+    342c:	00001097          	auipc	ra,0x1
+    3430:	554080e7          	jalr	1364(ra) # 4980 <getpid>
+    3434:	8a2a                	mv	s4,a0
+    3436:	0c800913          	li	s2,200
+    int pid = fork();
+    343a:	00001097          	auipc	ra,0x1
+    343e:	4c2080e7          	jalr	1218(ra) # 48fc <fork>
+    3442:	84aa                	mv	s1,a0
+    if(pid < 0){
+    3444:	02054263          	bltz	a0,3468 <reparent+0x4e>
+    if(pid){
+    3448:	cd21                	beqz	a0,34a0 <reparent+0x86>
+      if(wait(0) != pid){
+    344a:	4501                	li	a0,0
+    344c:	00001097          	auipc	ra,0x1
+    3450:	4c2080e7          	jalr	1218(ra) # 490e <wait>
+    3454:	02951863          	bne	a0,s1,3484 <reparent+0x6a>
+  for(int i = 0; i < 200; i++){
+    3458:	397d                	addiw	s2,s2,-1
+    345a:	fe0910e3          	bnez	s2,343a <reparent+0x20>
+  exit(0);
+    345e:	4501                	li	a0,0
+    3460:	00001097          	auipc	ra,0x1
+    3464:	4a4080e7          	jalr	1188(ra) # 4904 <exit>
+      printf("%s: fork failed\n", s);
+    3468:	85ce                	mv	a1,s3
+    346a:	00002517          	auipc	a0,0x2
+    346e:	10650513          	addi	a0,a0,262 # 5570 <malloc+0x7f0>
+    3472:	00002097          	auipc	ra,0x2
+    3476:	856080e7          	jalr	-1962(ra) # 4cc8 <printf>
+      exit(1);
+    347a:	4505                	li	a0,1
+    347c:	00001097          	auipc	ra,0x1
+    3480:	488080e7          	jalr	1160(ra) # 4904 <exit>
+        printf("%s: wait wrong pid\n", s);
+    3484:	85ce                	mv	a1,s3
+    3486:	00002517          	auipc	a0,0x2
+    348a:	27250513          	addi	a0,a0,626 # 56f8 <malloc+0x978>
+    348e:	00002097          	auipc	ra,0x2
+    3492:	83a080e7          	jalr	-1990(ra) # 4cc8 <printf>
+        exit(1);
+    3496:	4505                	li	a0,1
+    3498:	00001097          	auipc	ra,0x1
+    349c:	46c080e7          	jalr	1132(ra) # 4904 <exit>
+      int pid2 = fork();
+    34a0:	00001097          	auipc	ra,0x1
+    34a4:	45c080e7          	jalr	1116(ra) # 48fc <fork>
+      if(pid2 < 0){
+    34a8:	00054763          	bltz	a0,34b6 <reparent+0x9c>
+      exit(0);
+    34ac:	4501                	li	a0,0
+    34ae:	00001097          	auipc	ra,0x1
+    34b2:	456080e7          	jalr	1110(ra) # 4904 <exit>
+        kill(master_pid);
+    34b6:	8552                	mv	a0,s4
+    34b8:	00001097          	auipc	ra,0x1
+    34bc:	486080e7          	jalr	1158(ra) # 493e <kill>
+        exit(1);
+    34c0:	4505                	li	a0,1
+    34c2:	00001097          	auipc	ra,0x1
+    34c6:	442080e7          	jalr	1090(ra) # 4904 <exit>
+
+00000000000034ca <mem>:
+{
+    34ca:	7139                	addi	sp,sp,-64
+    34cc:	fc06                	sd	ra,56(sp)
+    34ce:	f822                	sd	s0,48(sp)
+    34d0:	f426                	sd	s1,40(sp)
+    34d2:	f04a                	sd	s2,32(sp)
+    34d4:	ec4e                	sd	s3,24(sp)
+    34d6:	0080                	addi	s0,sp,64
+    34d8:	89aa                	mv	s3,a0
+  if((pid = fork()) == 0){
+    34da:	00001097          	auipc	ra,0x1
+    34de:	422080e7          	jalr	1058(ra) # 48fc <fork>
+    m1 = 0;
+    34e2:	4481                	li	s1,0
+    while((m2 = malloc(10001)) != 0){
+    34e4:	6909                	lui	s2,0x2
+    34e6:	71190913          	addi	s2,s2,1809 # 2711 <subdir+0x1bb>
+  if((pid = fork()) == 0){
+    34ea:	c115                	beqz	a0,350e <mem+0x44>
+    wait(&xstatus);
+    34ec:	fcc40513          	addi	a0,s0,-52
+    34f0:	00001097          	auipc	ra,0x1
+    34f4:	41e080e7          	jalr	1054(ra) # 490e <wait>
+    if(xstatus == -1){
+    34f8:	fcc42503          	lw	a0,-52(s0)
+    34fc:	57fd                	li	a5,-1
+    34fe:	06f50363          	beq	a0,a5,3564 <mem+0x9a>
+    exit(xstatus);
+    3502:	00001097          	auipc	ra,0x1
+    3506:	402080e7          	jalr	1026(ra) # 4904 <exit>
+      *(char**)m2 = m1;
+    350a:	e104                	sd	s1,0(a0)
+      m1 = m2;
+    350c:	84aa                	mv	s1,a0
+    while((m2 = malloc(10001)) != 0){
+    350e:	854a                	mv	a0,s2
+    3510:	00002097          	auipc	ra,0x2
+    3514:	870080e7          	jalr	-1936(ra) # 4d80 <malloc>
+    3518:	f96d                	bnez	a0,350a <mem+0x40>
+    while(m1){
+    351a:	c881                	beqz	s1,352a <mem+0x60>
+      m2 = *(char**)m1;
+    351c:	8526                	mv	a0,s1
+    351e:	6084                	ld	s1,0(s1)
+      free(m1);
+    3520:	00001097          	auipc	ra,0x1
+    3524:	7de080e7          	jalr	2014(ra) # 4cfe <free>
+    while(m1){
+    3528:	f8f5                	bnez	s1,351c <mem+0x52>
+    m1 = malloc(1024*20);
+    352a:	6515                	lui	a0,0x5
+    352c:	00002097          	auipc	ra,0x2
+    3530:	854080e7          	jalr	-1964(ra) # 4d80 <malloc>
+    if(m1 == 0){
+    3534:	c911                	beqz	a0,3548 <mem+0x7e>
+    free(m1);
+    3536:	00001097          	auipc	ra,0x1
+    353a:	7c8080e7          	jalr	1992(ra) # 4cfe <free>
+    exit(0);
+    353e:	4501                	li	a0,0
+    3540:	00001097          	auipc	ra,0x1
+    3544:	3c4080e7          	jalr	964(ra) # 4904 <exit>
+      printf("couldn't allocate mem?!!\n", s);
+    3548:	85ce                	mv	a1,s3
+    354a:	00003517          	auipc	a0,0x3
+    354e:	dae50513          	addi	a0,a0,-594 # 62f8 <malloc+0x1578>
+    3552:	00001097          	auipc	ra,0x1
+    3556:	776080e7          	jalr	1910(ra) # 4cc8 <printf>
+      exit(1);
+    355a:	4505                	li	a0,1
+    355c:	00001097          	auipc	ra,0x1
+    3560:	3a8080e7          	jalr	936(ra) # 4904 <exit>
+      exit(0);
+    3564:	4501                	li	a0,0
+    3566:	00001097          	auipc	ra,0x1
+    356a:	39e080e7          	jalr	926(ra) # 4904 <exit>
+
+000000000000356e <sharedfd>:
+{
+    356e:	7159                	addi	sp,sp,-112
+    3570:	f486                	sd	ra,104(sp)
+    3572:	f0a2                	sd	s0,96(sp)
+    3574:	eca6                	sd	s1,88(sp)
+    3576:	e8ca                	sd	s2,80(sp)
+    3578:	e4ce                	sd	s3,72(sp)
+    357a:	e0d2                	sd	s4,64(sp)
+    357c:	fc56                	sd	s5,56(sp)
+    357e:	f85a                	sd	s6,48(sp)
+    3580:	f45e                	sd	s7,40(sp)
+    3582:	f062                	sd	s8,32(sp)
+    3584:	1880                	addi	s0,sp,112
+    3586:	8aaa                	mv	s5,a0
+  remove("sharedfd");
+    3588:	00003517          	auipc	a0,0x3
+    358c:	d9050513          	addi	a0,a0,-624 # 6318 <malloc+0x1598>
+    3590:	00001097          	auipc	ra,0x1
+    3594:	434080e7          	jalr	1076(ra) # 49c4 <remove>
+  fd = open("sharedfd", O_CREATE|O_RDWR);
+    3598:	20200593          	li	a1,514
+    359c:	00003517          	auipc	a0,0x3
+    35a0:	d7c50513          	addi	a0,a0,-644 # 6318 <malloc+0x1598>
+    35a4:	00001097          	auipc	ra,0x1
+    35a8:	3ac080e7          	jalr	940(ra) # 4950 <open>
+  if(fd < 0){
+    35ac:	04054b63          	bltz	a0,3602 <sharedfd+0x94>
+    35b0:	892a                	mv	s2,a0
+  pid = fork();
+    35b2:	00001097          	auipc	ra,0x1
+    35b6:	34a080e7          	jalr	842(ra) # 48fc <fork>
+    35ba:	8a2a                	mv	s4,a0
+  memset(buf, pid==0?'c':'p', sizeof(buf));
+    35bc:	06300593          	li	a1,99
+    35c0:	c119                	beqz	a0,35c6 <sharedfd+0x58>
+    35c2:	07000593          	li	a1,112
+    35c6:	4629                	li	a2,10
+    35c8:	fa040513          	addi	a0,s0,-96
+    35cc:	00001097          	auipc	ra,0x1
+    35d0:	120080e7          	jalr	288(ra) # 46ec <memset>
+    35d4:	3e800493          	li	s1,1000
+    if(write(fd, buf, sizeof(buf)) != sizeof(buf)){
+    35d8:	fa040993          	addi	s3,s0,-96
+    35dc:	4629                	li	a2,10
+    35de:	85ce                	mv	a1,s3
+    35e0:	854a                	mv	a0,s2
+    35e2:	00001097          	auipc	ra,0x1
+    35e6:	348080e7          	jalr	840(ra) # 492a <write>
+    35ea:	47a9                	li	a5,10
+    35ec:	02f51963          	bne	a0,a5,361e <sharedfd+0xb0>
+  for(i = 0; i < N; i++){
+    35f0:	34fd                	addiw	s1,s1,-1
+    35f2:	f4ed                	bnez	s1,35dc <sharedfd+0x6e>
+  if(pid == 0) {
+    35f4:	040a1363          	bnez	s4,363a <sharedfd+0xcc>
+    exit(0);
+    35f8:	4501                	li	a0,0
+    35fa:	00001097          	auipc	ra,0x1
+    35fe:	30a080e7          	jalr	778(ra) # 4904 <exit>
+    printf("%s: cannot open sharedfd for writing", s);
+    3602:	85d6                	mv	a1,s5
+    3604:	00003517          	auipc	a0,0x3
+    3608:	d2450513          	addi	a0,a0,-732 # 6328 <malloc+0x15a8>
+    360c:	00001097          	auipc	ra,0x1
+    3610:	6bc080e7          	jalr	1724(ra) # 4cc8 <printf>
+    exit(1);
+    3614:	4505                	li	a0,1
+    3616:	00001097          	auipc	ra,0x1
+    361a:	2ee080e7          	jalr	750(ra) # 4904 <exit>
+      printf("%s: write sharedfd failed\n", s);
+    361e:	85d6                	mv	a1,s5
+    3620:	00003517          	auipc	a0,0x3
+    3624:	d3050513          	addi	a0,a0,-720 # 6350 <malloc+0x15d0>
+    3628:	00001097          	auipc	ra,0x1
+    362c:	6a0080e7          	jalr	1696(ra) # 4cc8 <printf>
+      exit(1);
+    3630:	4505                	li	a0,1
+    3632:	00001097          	auipc	ra,0x1
+    3636:	2d2080e7          	jalr	722(ra) # 4904 <exit>
+    wait(&xstatus);
+    363a:	f9c40513          	addi	a0,s0,-100
+    363e:	00001097          	auipc	ra,0x1
+    3642:	2d0080e7          	jalr	720(ra) # 490e <wait>
+    if(xstatus != 0)
+    3646:	f9c42983          	lw	s3,-100(s0)
+    364a:	00098763          	beqz	s3,3658 <sharedfd+0xea>
+      exit(xstatus);
+    364e:	854e                	mv	a0,s3
+    3650:	00001097          	auipc	ra,0x1
+    3654:	2b4080e7          	jalr	692(ra) # 4904 <exit>
+  close(fd);
+    3658:	854a                	mv	a0,s2
+    365a:	00001097          	auipc	ra,0x1
+    365e:	2da080e7          	jalr	730(ra) # 4934 <close>
+  fd = open("sharedfd", 0);
+    3662:	4581                	li	a1,0
+    3664:	00003517          	auipc	a0,0x3
+    3668:	cb450513          	addi	a0,a0,-844 # 6318 <malloc+0x1598>
+    366c:	00001097          	auipc	ra,0x1
+    3670:	2e4080e7          	jalr	740(ra) # 4950 <open>
+    3674:	8baa                	mv	s7,a0
+  nc = np = 0;
+    3676:	8a4e                	mv	s4,s3
+  if(fd < 0){
+    3678:	02054663          	bltz	a0,36a4 <sharedfd+0x136>
+  while((n = read(fd, buf, sizeof(buf))) > 0){
+    367c:	fa040c13          	addi	s8,s0,-96
+    3680:	faa40913          	addi	s2,s0,-86
+      if(buf[i] == 'c')
+    3684:	06300493          	li	s1,99
+      if(buf[i] == 'p')
+    3688:	07000b13          	li	s6,112
+  while((n = read(fd, buf, sizeof(buf))) > 0){
+    368c:	4629                	li	a2,10
+    368e:	85e2                	mv	a1,s8
+    3690:	855e                	mv	a0,s7
+    3692:	00001097          	auipc	ra,0x1
+    3696:	28e080e7          	jalr	654(ra) # 4920 <read>
+    369a:	02a05f63          	blez	a0,36d8 <sharedfd+0x16a>
+    369e:	fa040793          	addi	a5,s0,-96
+    36a2:	a01d                	j	36c8 <sharedfd+0x15a>
+    printf("%s: cannot open sharedfd for reading\n", s);
+    36a4:	85d6                	mv	a1,s5
+    36a6:	00003517          	auipc	a0,0x3
+    36aa:	cca50513          	addi	a0,a0,-822 # 6370 <malloc+0x15f0>
+    36ae:	00001097          	auipc	ra,0x1
+    36b2:	61a080e7          	jalr	1562(ra) # 4cc8 <printf>
+    exit(1);
+    36b6:	4505                	li	a0,1
+    36b8:	00001097          	auipc	ra,0x1
+    36bc:	24c080e7          	jalr	588(ra) # 4904 <exit>
+        nc++;
+    36c0:	2985                	addiw	s3,s3,1
+    for(i = 0; i < sizeof(buf); i++){
+    36c2:	0785                	addi	a5,a5,1
+    36c4:	fd2784e3          	beq	a5,s2,368c <sharedfd+0x11e>
+      if(buf[i] == 'c')
+    36c8:	0007c703          	lbu	a4,0(a5)
+    36cc:	fe970ae3          	beq	a4,s1,36c0 <sharedfd+0x152>
+      if(buf[i] == 'p')
+    36d0:	ff6719e3          	bne	a4,s6,36c2 <sharedfd+0x154>
+        np++;
+    36d4:	2a05                	addiw	s4,s4,1
+    36d6:	b7f5                	j	36c2 <sharedfd+0x154>
+  close(fd);
+    36d8:	855e                	mv	a0,s7
+    36da:	00001097          	auipc	ra,0x1
+    36de:	25a080e7          	jalr	602(ra) # 4934 <close>
+  remove("sharedfd");
+    36e2:	00003517          	auipc	a0,0x3
+    36e6:	c3650513          	addi	a0,a0,-970 # 6318 <malloc+0x1598>
+    36ea:	00001097          	auipc	ra,0x1
+    36ee:	2da080e7          	jalr	730(ra) # 49c4 <remove>
+  if(nc == N*SZ && np == N*SZ){
+    36f2:	6789                	lui	a5,0x2
+    36f4:	71078793          	addi	a5,a5,1808 # 2710 <subdir+0x1ba>
+    36f8:	00f99763          	bne	s3,a5,3706 <sharedfd+0x198>
+    36fc:	6789                	lui	a5,0x2
+    36fe:	71078793          	addi	a5,a5,1808 # 2710 <subdir+0x1ba>
+    3702:	02fa0063          	beq	s4,a5,3722 <sharedfd+0x1b4>
+    printf("%s: nc/np test fails\n", s);
+    3706:	85d6                	mv	a1,s5
+    3708:	00003517          	auipc	a0,0x3
+    370c:	c9050513          	addi	a0,a0,-880 # 6398 <malloc+0x1618>
+    3710:	00001097          	auipc	ra,0x1
+    3714:	5b8080e7          	jalr	1464(ra) # 4cc8 <printf>
+    exit(1);
+    3718:	4505                	li	a0,1
+    371a:	00001097          	auipc	ra,0x1
+    371e:	1ea080e7          	jalr	490(ra) # 4904 <exit>
+    exit(0);
+    3722:	4501                	li	a0,0
+    3724:	00001097          	auipc	ra,0x1
+    3728:	1e0080e7          	jalr	480(ra) # 4904 <exit>
+
+000000000000372c <fourfiles>:
+{
+    372c:	7171                	addi	sp,sp,-176
+    372e:	f506                	sd	ra,168(sp)
+    3730:	f122                	sd	s0,160(sp)
+    3732:	ed26                	sd	s1,152(sp)
+    3734:	e94a                	sd	s2,144(sp)
+    3736:	e54e                	sd	s3,136(sp)
+    3738:	e152                	sd	s4,128(sp)
+    373a:	fcd6                	sd	s5,120(sp)
+    373c:	f8da                	sd	s6,112(sp)
+    373e:	f4de                	sd	s7,104(sp)
+    3740:	f0e2                	sd	s8,96(sp)
+    3742:	ece6                	sd	s9,88(sp)
+    3744:	e8ea                	sd	s10,80(sp)
+    3746:	e4ee                	sd	s11,72(sp)
+    3748:	1900                	addi	s0,sp,176
+    374a:	f4a43c23          	sd	a0,-168(s0)
+  char *names[] = { "f0", "f1", "f2", "f3" };
+    374e:	00003797          	auipc	a5,0x3
+    3752:	c6278793          	addi	a5,a5,-926 # 63b0 <malloc+0x1630>
+    3756:	f6f43823          	sd	a5,-144(s0)
+    375a:	00003797          	auipc	a5,0x3
+    375e:	c5e78793          	addi	a5,a5,-930 # 63b8 <malloc+0x1638>
+    3762:	f6f43c23          	sd	a5,-136(s0)
+    3766:	00003797          	auipc	a5,0x3
+    376a:	c5a78793          	addi	a5,a5,-934 # 63c0 <malloc+0x1640>
+    376e:	f8f43023          	sd	a5,-128(s0)
+    3772:	00003797          	auipc	a5,0x3
+    3776:	c5678793          	addi	a5,a5,-938 # 63c8 <malloc+0x1648>
+    377a:	f8f43423          	sd	a5,-120(s0)
+  for(pi = 0; pi < NCHILD; pi++){
+    377e:	f7040c93          	addi	s9,s0,-144
+  char *names[] = { "f0", "f1", "f2", "f3" };
+    3782:	8966                	mv	s2,s9
+  for(pi = 0; pi < NCHILD; pi++){
+    3784:	4481                	li	s1,0
+    3786:	4a11                	li	s4,4
+    fname = names[pi];
+    3788:	00093983          	ld	s3,0(s2)
+    remove(fname);
+    378c:	854e                	mv	a0,s3
+    378e:	00001097          	auipc	ra,0x1
+    3792:	236080e7          	jalr	566(ra) # 49c4 <remove>
+    pid = fork();
+    3796:	00001097          	auipc	ra,0x1
+    379a:	166080e7          	jalr	358(ra) # 48fc <fork>
+    if(pid < 0){
+    379e:	04054a63          	bltz	a0,37f2 <fourfiles+0xc6>
+    if(pid == 0){
+    37a2:	c53d                	beqz	a0,3810 <fourfiles+0xe4>
+  for(pi = 0; pi < NCHILD; pi++){
+    37a4:	2485                	addiw	s1,s1,1
+    37a6:	0921                	addi	s2,s2,8
+    37a8:	ff4490e3          	bne	s1,s4,3788 <fourfiles+0x5c>
+    37ac:	4491                	li	s1,4
+    wait(&xstatus);
+    37ae:	f6c40913          	addi	s2,s0,-148
+    37b2:	854a                	mv	a0,s2
+    37b4:	00001097          	auipc	ra,0x1
+    37b8:	15a080e7          	jalr	346(ra) # 490e <wait>
+    if(xstatus != 0)
+    37bc:	f6c42b83          	lw	s7,-148(s0)
+    37c0:	0e0b9363          	bnez	s7,38a6 <fourfiles+0x17a>
+  for(pi = 0; pi < NCHILD; pi++){
+    37c4:	34fd                	addiw	s1,s1,-1
+    37c6:	f4f5                	bnez	s1,37b2 <fourfiles+0x86>
+    37c8:	03000c13          	li	s8,48
+    while((n = read(fd, buf, sizeof(buf))) > 0){
+    37cc:	6a09                	lui	s4,0x2
+    37ce:	800a0a13          	addi	s4,s4,-2048 # 1800 <forkfork+0x42>
+    37d2:	00007a97          	auipc	s5,0x7
+    37d6:	0c6a8a93          	addi	s5,s5,198 # a898 <buf>
+    37da:	00007b17          	auipc	s6,0x7
+    37de:	0bfb0b13          	addi	s6,s6,191 # a899 <buf+0x1>
+    if(total != N*SZ){
+    37e2:	6785                	lui	a5,0x1
+    37e4:	77078793          	addi	a5,a5,1904 # 1770 <twochildren+0x4c>
+    37e8:	f4f43823          	sd	a5,-176(s0)
+  for(i = 0; i < NCHILD; i++){
+    37ec:	03400d93          	li	s11,52
+    37f0:	aa2d                	j	392a <fourfiles+0x1fe>
+      printf("fork failed\n", s);
+    37f2:	f5843583          	ld	a1,-168(s0)
+    37f6:	00002517          	auipc	a0,0x2
+    37fa:	0fa50513          	addi	a0,a0,250 # 58f0 <malloc+0xb70>
+    37fe:	00001097          	auipc	ra,0x1
+    3802:	4ca080e7          	jalr	1226(ra) # 4cc8 <printf>
+      exit(1);
+    3806:	4505                	li	a0,1
+    3808:	00001097          	auipc	ra,0x1
+    380c:	0fc080e7          	jalr	252(ra) # 4904 <exit>
+      fd = open(fname, O_CREATE | O_RDWR);
+    3810:	20200593          	li	a1,514
+    3814:	854e                	mv	a0,s3
+    3816:	00001097          	auipc	ra,0x1
+    381a:	13a080e7          	jalr	314(ra) # 4950 <open>
+    381e:	892a                	mv	s2,a0
+      if(fd < 0){
+    3820:	04054763          	bltz	a0,386e <fourfiles+0x142>
+      memset(buf, '0'+pi, SZ);
+    3824:	1f400613          	li	a2,500
+    3828:	0304859b          	addiw	a1,s1,48
+    382c:	00007517          	auipc	a0,0x7
+    3830:	06c50513          	addi	a0,a0,108 # a898 <buf>
+    3834:	00001097          	auipc	ra,0x1
+    3838:	eb8080e7          	jalr	-328(ra) # 46ec <memset>
+    383c:	44b1                	li	s1,12
+        if((n = write(fd, buf, SZ)) != SZ){
+    383e:	00007997          	auipc	s3,0x7
+    3842:	05a98993          	addi	s3,s3,90 # a898 <buf>
+    3846:	1f400613          	li	a2,500
+    384a:	85ce                	mv	a1,s3
+    384c:	854a                	mv	a0,s2
+    384e:	00001097          	auipc	ra,0x1
+    3852:	0dc080e7          	jalr	220(ra) # 492a <write>
+    3856:	85aa                	mv	a1,a0
+    3858:	1f400793          	li	a5,500
+    385c:	02f51863          	bne	a0,a5,388c <fourfiles+0x160>
+      for(i = 0; i < N; i++){
+    3860:	34fd                	addiw	s1,s1,-1
+    3862:	f0f5                	bnez	s1,3846 <fourfiles+0x11a>
+      exit(0);
+    3864:	4501                	li	a0,0
+    3866:	00001097          	auipc	ra,0x1
+    386a:	09e080e7          	jalr	158(ra) # 4904 <exit>
+        printf("create failed\n", s);
+    386e:	f5843583          	ld	a1,-168(s0)
+    3872:	00003517          	auipc	a0,0x3
+    3876:	b5e50513          	addi	a0,a0,-1186 # 63d0 <malloc+0x1650>
+    387a:	00001097          	auipc	ra,0x1
+    387e:	44e080e7          	jalr	1102(ra) # 4cc8 <printf>
+        exit(1);
+    3882:	4505                	li	a0,1
+    3884:	00001097          	auipc	ra,0x1
+    3888:	080080e7          	jalr	128(ra) # 4904 <exit>
+          printf("write failed %d\n", n);
+    388c:	00003517          	auipc	a0,0x3
+    3890:	b5450513          	addi	a0,a0,-1196 # 63e0 <malloc+0x1660>
+    3894:	00001097          	auipc	ra,0x1
+    3898:	434080e7          	jalr	1076(ra) # 4cc8 <printf>
+          exit(1);
+    389c:	4505                	li	a0,1
+    389e:	00001097          	auipc	ra,0x1
+    38a2:	066080e7          	jalr	102(ra) # 4904 <exit>
+      exit(xstatus);
+    38a6:	855e                	mv	a0,s7
+    38a8:	00001097          	auipc	ra,0x1
+    38ac:	05c080e7          	jalr	92(ra) # 4904 <exit>
+          printf("wrong char\n", s);
+    38b0:	f5843583          	ld	a1,-168(s0)
+    38b4:	00003517          	auipc	a0,0x3
+    38b8:	b4450513          	addi	a0,a0,-1212 # 63f8 <malloc+0x1678>
+    38bc:	00001097          	auipc	ra,0x1
+    38c0:	40c080e7          	jalr	1036(ra) # 4cc8 <printf>
+          exit(1);
+    38c4:	4505                	li	a0,1
+    38c6:	00001097          	auipc	ra,0x1
+    38ca:	03e080e7          	jalr	62(ra) # 4904 <exit>
+      total += n;
+    38ce:	00a9093b          	addw	s2,s2,a0
+    while((n = read(fd, buf, sizeof(buf))) > 0){
+    38d2:	8652                	mv	a2,s4
+    38d4:	85d6                	mv	a1,s5
+    38d6:	854e                	mv	a0,s3
+    38d8:	00001097          	auipc	ra,0x1
+    38dc:	048080e7          	jalr	72(ra) # 4920 <read>
+    38e0:	02a05363          	blez	a0,3906 <fourfiles+0x1da>
+    38e4:	00007797          	auipc	a5,0x7
+    38e8:	fb478793          	addi	a5,a5,-76 # a898 <buf>
+    38ec:	fff5069b          	addiw	a3,a0,-1
+    38f0:	1682                	slli	a3,a3,0x20
+    38f2:	9281                	srli	a3,a3,0x20
+    38f4:	96da                	add	a3,a3,s6
+        if(buf[j] != '0'+i){
+    38f6:	0007c703          	lbu	a4,0(a5)
+    38fa:	fa971be3          	bne	a4,s1,38b0 <fourfiles+0x184>
+      for(j = 0; j < n; j++){
+    38fe:	0785                	addi	a5,a5,1
+    3900:	fed79be3          	bne	a5,a3,38f6 <fourfiles+0x1ca>
+    3904:	b7e9                	j	38ce <fourfiles+0x1a2>
+    close(fd);
+    3906:	854e                	mv	a0,s3
+    3908:	00001097          	auipc	ra,0x1
+    390c:	02c080e7          	jalr	44(ra) # 4934 <close>
+    if(total != N*SZ){
+    3910:	f5043783          	ld	a5,-176(s0)
+    3914:	02f91863          	bne	s2,a5,3944 <fourfiles+0x218>
+    remove(fname);
+    3918:	856a                	mv	a0,s10
+    391a:	00001097          	auipc	ra,0x1
+    391e:	0aa080e7          	jalr	170(ra) # 49c4 <remove>
+  for(i = 0; i < NCHILD; i++){
+    3922:	0ca1                	addi	s9,s9,8
+    3924:	2c05                	addiw	s8,s8,1
+    3926:	03bc0d63          	beq	s8,s11,3960 <fourfiles+0x234>
+    fname = names[i];
+    392a:	000cbd03          	ld	s10,0(s9)
+    fd = open(fname, 0);
+    392e:	4581                	li	a1,0
+    3930:	856a                	mv	a0,s10
+    3932:	00001097          	auipc	ra,0x1
+    3936:	01e080e7          	jalr	30(ra) # 4950 <open>
+    393a:	89aa                	mv	s3,a0
+    total = 0;
+    393c:	895e                	mv	s2,s7
+        if(buf[j] != '0'+i){
+    393e:	000c049b          	sext.w	s1,s8
+    while((n = read(fd, buf, sizeof(buf))) > 0){
+    3942:	bf41                	j	38d2 <fourfiles+0x1a6>
+      printf("wrong length %d\n", total);
+    3944:	85ca                	mv	a1,s2
+    3946:	00003517          	auipc	a0,0x3
+    394a:	ac250513          	addi	a0,a0,-1342 # 6408 <malloc+0x1688>
+    394e:	00001097          	auipc	ra,0x1
+    3952:	37a080e7          	jalr	890(ra) # 4cc8 <printf>
+      exit(1);
+    3956:	4505                	li	a0,1
+    3958:	00001097          	auipc	ra,0x1
+    395c:	fac080e7          	jalr	-84(ra) # 4904 <exit>
+}
+    3960:	70aa                	ld	ra,168(sp)
+    3962:	740a                	ld	s0,160(sp)
+    3964:	64ea                	ld	s1,152(sp)
+    3966:	694a                	ld	s2,144(sp)
+    3968:	69aa                	ld	s3,136(sp)
+    396a:	6a0a                	ld	s4,128(sp)
+    396c:	7ae6                	ld	s5,120(sp)
+    396e:	7b46                	ld	s6,112(sp)
+    3970:	7ba6                	ld	s7,104(sp)
+    3972:	7c06                	ld	s8,96(sp)
+    3974:	6ce6                	ld	s9,88(sp)
+    3976:	6d46                	ld	s10,80(sp)
+    3978:	6da6                	ld	s11,72(sp)
+    397a:	614d                	addi	sp,sp,176
+    397c:	8082                	ret
+
+000000000000397e <bigfile>:
+{
+    397e:	7139                	addi	sp,sp,-64
+    3980:	fc06                	sd	ra,56(sp)
+    3982:	f822                	sd	s0,48(sp)
+    3984:	f426                	sd	s1,40(sp)
+    3986:	f04a                	sd	s2,32(sp)
+    3988:	ec4e                	sd	s3,24(sp)
+    398a:	e852                	sd	s4,16(sp)
+    398c:	e456                	sd	s5,8(sp)
+    398e:	0080                	addi	s0,sp,64
+    3990:	8aaa                	mv	s5,a0
+  remove("bigfile.dat");
+    3992:	00003517          	auipc	a0,0x3
+    3996:	a8e50513          	addi	a0,a0,-1394 # 6420 <malloc+0x16a0>
+    399a:	00001097          	auipc	ra,0x1
+    399e:	02a080e7          	jalr	42(ra) # 49c4 <remove>
+  fd = open("bigfile.dat", O_CREATE | O_RDWR);
+    39a2:	20200593          	li	a1,514
+    39a6:	00003517          	auipc	a0,0x3
+    39aa:	a7a50513          	addi	a0,a0,-1414 # 6420 <malloc+0x16a0>
+    39ae:	00001097          	auipc	ra,0x1
+    39b2:	fa2080e7          	jalr	-94(ra) # 4950 <open>
+    39b6:	89aa                	mv	s3,a0
+  for(i = 0; i < N; i++){
+    39b8:	4481                	li	s1,0
+    memset(buf, i, SZ);
+    39ba:	00007917          	auipc	s2,0x7
+    39be:	ede90913          	addi	s2,s2,-290 # a898 <buf>
+  for(i = 0; i < N; i++){
+    39c2:	4a51                	li	s4,20
+  if(fd < 0){
+    39c4:	0a054063          	bltz	a0,3a64 <bigfile+0xe6>
+    memset(buf, i, SZ);
+    39c8:	25800613          	li	a2,600
+    39cc:	85a6                	mv	a1,s1
+    39ce:	854a                	mv	a0,s2
+    39d0:	00001097          	auipc	ra,0x1
+    39d4:	d1c080e7          	jalr	-740(ra) # 46ec <memset>
+    if(write(fd, buf, SZ) != SZ){
+    39d8:	25800613          	li	a2,600
+    39dc:	85ca                	mv	a1,s2
+    39de:	854e                	mv	a0,s3
+    39e0:	00001097          	auipc	ra,0x1
+    39e4:	f4a080e7          	jalr	-182(ra) # 492a <write>
+    39e8:	25800793          	li	a5,600
+    39ec:	08f51a63          	bne	a0,a5,3a80 <bigfile+0x102>
+  for(i = 0; i < N; i++){
+    39f0:	2485                	addiw	s1,s1,1
+    39f2:	fd449be3          	bne	s1,s4,39c8 <bigfile+0x4a>
+  close(fd);
+    39f6:	854e                	mv	a0,s3
+    39f8:	00001097          	auipc	ra,0x1
+    39fc:	f3c080e7          	jalr	-196(ra) # 4934 <close>
+  fd = open("bigfile.dat", 0);
+    3a00:	4581                	li	a1,0
+    3a02:	00003517          	auipc	a0,0x3
+    3a06:	a1e50513          	addi	a0,a0,-1506 # 6420 <malloc+0x16a0>
+    3a0a:	00001097          	auipc	ra,0x1
+    3a0e:	f46080e7          	jalr	-186(ra) # 4950 <open>
+    3a12:	8a2a                	mv	s4,a0
+  total = 0;
+    3a14:	4981                	li	s3,0
+  for(i = 0; ; i++){
+    3a16:	4481                	li	s1,0
+    cc = read(fd, buf, SZ/2);
+    3a18:	00007917          	auipc	s2,0x7
+    3a1c:	e8090913          	addi	s2,s2,-384 # a898 <buf>
+  if(fd < 0){
+    3a20:	06054e63          	bltz	a0,3a9c <bigfile+0x11e>
+    cc = read(fd, buf, SZ/2);
+    3a24:	12c00613          	li	a2,300
+    3a28:	85ca                	mv	a1,s2
+    3a2a:	8552                	mv	a0,s4
+    3a2c:	00001097          	auipc	ra,0x1
+    3a30:	ef4080e7          	jalr	-268(ra) # 4920 <read>
+    if(cc < 0){
+    3a34:	08054263          	bltz	a0,3ab8 <bigfile+0x13a>
+    if(cc == 0)
+    3a38:	c971                	beqz	a0,3b0c <bigfile+0x18e>
+    if(cc != SZ/2){
+    3a3a:	12c00793          	li	a5,300
+    3a3e:	08f51b63          	bne	a0,a5,3ad4 <bigfile+0x156>
+    if(buf[0] != i/2 || buf[SZ/2-1] != i/2){
+    3a42:	01f4d79b          	srliw	a5,s1,0x1f
+    3a46:	9fa5                	addw	a5,a5,s1
+    3a48:	4017d79b          	sraiw	a5,a5,0x1
+    3a4c:	00094703          	lbu	a4,0(s2)
+    3a50:	0af71063          	bne	a4,a5,3af0 <bigfile+0x172>
+    3a54:	12b94703          	lbu	a4,299(s2)
+    3a58:	08f71c63          	bne	a4,a5,3af0 <bigfile+0x172>
+    total += cc;
+    3a5c:	12c9899b          	addiw	s3,s3,300
+  for(i = 0; ; i++){
+    3a60:	2485                	addiw	s1,s1,1
+    cc = read(fd, buf, SZ/2);
+    3a62:	b7c9                	j	3a24 <bigfile+0xa6>
+    printf("%s: cannot create bigfile", s);
+    3a64:	85d6                	mv	a1,s5
+    3a66:	00003517          	auipc	a0,0x3
+    3a6a:	9ca50513          	addi	a0,a0,-1590 # 6430 <malloc+0x16b0>
+    3a6e:	00001097          	auipc	ra,0x1
+    3a72:	25a080e7          	jalr	602(ra) # 4cc8 <printf>
+    exit(1);
+    3a76:	4505                	li	a0,1
+    3a78:	00001097          	auipc	ra,0x1
+    3a7c:	e8c080e7          	jalr	-372(ra) # 4904 <exit>
+      printf("%s: write bigfile failed\n", s);
+    3a80:	85d6                	mv	a1,s5
+    3a82:	00003517          	auipc	a0,0x3
+    3a86:	9ce50513          	addi	a0,a0,-1586 # 6450 <malloc+0x16d0>
+    3a8a:	00001097          	auipc	ra,0x1
+    3a8e:	23e080e7          	jalr	574(ra) # 4cc8 <printf>
+      exit(1);
+    3a92:	4505                	li	a0,1
+    3a94:	00001097          	auipc	ra,0x1
+    3a98:	e70080e7          	jalr	-400(ra) # 4904 <exit>
+    printf("%s: cannot open bigfile\n", s);
+    3a9c:	85d6                	mv	a1,s5
+    3a9e:	00003517          	auipc	a0,0x3
+    3aa2:	9d250513          	addi	a0,a0,-1582 # 6470 <malloc+0x16f0>
+    3aa6:	00001097          	auipc	ra,0x1
+    3aaa:	222080e7          	jalr	546(ra) # 4cc8 <printf>
+    exit(1);
+    3aae:	4505                	li	a0,1
+    3ab0:	00001097          	auipc	ra,0x1
+    3ab4:	e54080e7          	jalr	-428(ra) # 4904 <exit>
+      printf("%s: read bigfile failed\n", s);
+    3ab8:	85d6                	mv	a1,s5
+    3aba:	00003517          	auipc	a0,0x3
+    3abe:	9d650513          	addi	a0,a0,-1578 # 6490 <malloc+0x1710>
+    3ac2:	00001097          	auipc	ra,0x1
+    3ac6:	206080e7          	jalr	518(ra) # 4cc8 <printf>
+      exit(1);
+    3aca:	4505                	li	a0,1
+    3acc:	00001097          	auipc	ra,0x1
+    3ad0:	e38080e7          	jalr	-456(ra) # 4904 <exit>
+      printf("%s: short read bigfile\n", s);
+    3ad4:	85d6                	mv	a1,s5
+    3ad6:	00003517          	auipc	a0,0x3
+    3ada:	9da50513          	addi	a0,a0,-1574 # 64b0 <malloc+0x1730>
+    3ade:	00001097          	auipc	ra,0x1
+    3ae2:	1ea080e7          	jalr	490(ra) # 4cc8 <printf>
+      exit(1);
+    3ae6:	4505                	li	a0,1
+    3ae8:	00001097          	auipc	ra,0x1
+    3aec:	e1c080e7          	jalr	-484(ra) # 4904 <exit>
+      printf("%s: read bigfile wrong data\n", s);
+    3af0:	85d6                	mv	a1,s5
+    3af2:	00003517          	auipc	a0,0x3
+    3af6:	9d650513          	addi	a0,a0,-1578 # 64c8 <malloc+0x1748>
+    3afa:	00001097          	auipc	ra,0x1
+    3afe:	1ce080e7          	jalr	462(ra) # 4cc8 <printf>
+      exit(1);
+    3b02:	4505                	li	a0,1
+    3b04:	00001097          	auipc	ra,0x1
+    3b08:	e00080e7          	jalr	-512(ra) # 4904 <exit>
+  close(fd);
+    3b0c:	8552                	mv	a0,s4
+    3b0e:	00001097          	auipc	ra,0x1
+    3b12:	e26080e7          	jalr	-474(ra) # 4934 <close>
+  if(total != N*SZ){
+    3b16:	678d                	lui	a5,0x3
+    3b18:	ee078793          	addi	a5,a5,-288 # 2ee0 <iref+0x114>
+    3b1c:	02f99363          	bne	s3,a5,3b42 <bigfile+0x1c4>
+  remove("bigfile.dat");
+    3b20:	00003517          	auipc	a0,0x3
+    3b24:	90050513          	addi	a0,a0,-1792 # 6420 <malloc+0x16a0>
+    3b28:	00001097          	auipc	ra,0x1
+    3b2c:	e9c080e7          	jalr	-356(ra) # 49c4 <remove>
+}
+    3b30:	70e2                	ld	ra,56(sp)
+    3b32:	7442                	ld	s0,48(sp)
+    3b34:	74a2                	ld	s1,40(sp)
+    3b36:	7902                	ld	s2,32(sp)
+    3b38:	69e2                	ld	s3,24(sp)
+    3b3a:	6a42                	ld	s4,16(sp)
+    3b3c:	6aa2                	ld	s5,8(sp)
+    3b3e:	6121                	addi	sp,sp,64
+    3b40:	8082                	ret
+    printf("%s: read bigfile wrong total\n", s);
+    3b42:	85d6                	mv	a1,s5
+    3b44:	00003517          	auipc	a0,0x3
+    3b48:	9a450513          	addi	a0,a0,-1628 # 64e8 <malloc+0x1768>
+    3b4c:	00001097          	auipc	ra,0x1
+    3b50:	17c080e7          	jalr	380(ra) # 4cc8 <printf>
+    exit(1);
+    3b54:	4505                	li	a0,1
+    3b56:	00001097          	auipc	ra,0x1
+    3b5a:	dae080e7          	jalr	-594(ra) # 4904 <exit>
+
+0000000000003b5e <createdelete>:
+{
+    3b5e:	7171                	addi	sp,sp,-176
+    3b60:	f506                	sd	ra,168(sp)
+    3b62:	f122                	sd	s0,160(sp)
+    3b64:	ed26                	sd	s1,152(sp)
+    3b66:	e94a                	sd	s2,144(sp)
+    3b68:	e54e                	sd	s3,136(sp)
+    3b6a:	e152                	sd	s4,128(sp)
+    3b6c:	fcd6                	sd	s5,120(sp)
+    3b6e:	f8da                	sd	s6,112(sp)
+    3b70:	f4de                	sd	s7,104(sp)
+    3b72:	f0e2                	sd	s8,96(sp)
+    3b74:	ece6                	sd	s9,88(sp)
+    3b76:	e8ea                	sd	s10,80(sp)
+    3b78:	e4ee                	sd	s11,72(sp)
+    3b7a:	1900                	addi	s0,sp,176
+    3b7c:	8daa                	mv	s11,a0
+  char illegal[] = { '\"', '*', '/', ':', '<', '>', '?', '\\', '|', 0 };
+    3b7e:	00003797          	auipc	a5,0x3
+    3b82:	9f278793          	addi	a5,a5,-1550 # 6570 <malloc+0x17f0>
+    3b86:	6398                	ld	a4,0(a5)
+    3b88:	f6e43023          	sd	a4,-160(s0)
+    3b8c:	0087d783          	lhu	a5,8(a5)
+    3b90:	f6f41423          	sh	a5,-152(s0)
+  for(pi = 0; pi < NCHILD; pi++){
+    3b94:	4901                	li	s2,0
+    3b96:	4991                	li	s3,4
+    pid = fork();
+    3b98:	00001097          	auipc	ra,0x1
+    3b9c:	d64080e7          	jalr	-668(ra) # 48fc <fork>
+    3ba0:	84aa                	mv	s1,a0
+    if(pid < 0){
+    3ba2:	04054263          	bltz	a0,3be6 <createdelete+0x88>
+    if(pid == 0){
+    3ba6:	cd31                	beqz	a0,3c02 <createdelete+0xa4>
+  for(pi = 0; pi < NCHILD; pi++){
+    3ba8:	2905                	addiw	s2,s2,1
+    3baa:	ff3917e3          	bne	s2,s3,3b98 <createdelete+0x3a>
+    3bae:	4491                	li	s1,4
+    wait(&xstatus);
+    3bb0:	f5c40913          	addi	s2,s0,-164
+    3bb4:	854a                	mv	a0,s2
+    3bb6:	00001097          	auipc	ra,0x1
+    3bba:	d58080e7          	jalr	-680(ra) # 490e <wait>
+    if(xstatus != 0)
+    3bbe:	f5c42983          	lw	s3,-164(s0)
+    3bc2:	10099963          	bnez	s3,3cd4 <createdelete+0x176>
+  for(pi = 0; pi < NCHILD; pi++){
+    3bc6:	34fd                	addiw	s1,s1,-1
+    3bc8:	f4f5                	bnez	s1,3bb4 <createdelete+0x56>
+  name[0] = name[1] = name[2] = 0;
+    3bca:	f6040923          	sb	zero,-142(s0)
+    3bce:	03000913          	li	s2,48
+    3bd2:	5b7d                	li	s6,-1
+    3bd4:	07000c93          	li	s9,112
+      if (strchr(illegal, name[1]) != 0) { continue; }
+    3bd8:	f6040a93          	addi	s5,s0,-160
+      fd = open(name, 0);
+    3bdc:	f7040c13          	addi	s8,s0,-144
+      } else if((i >= 1 && i < N/2) && fd >= 0){
+    3be0:	4ba1                	li	s7,8
+      if((i == 0 || i >= N/2) && fd < 0){
+    3be2:	4d25                	li	s10,9
+    3be4:	aa71                	j	3d80 <createdelete+0x222>
+      printf("fork failed\n", s);
+    3be6:	85ee                	mv	a1,s11
+    3be8:	00002517          	auipc	a0,0x2
+    3bec:	d0850513          	addi	a0,a0,-760 # 58f0 <malloc+0xb70>
+    3bf0:	00001097          	auipc	ra,0x1
+    3bf4:	0d8080e7          	jalr	216(ra) # 4cc8 <printf>
+      exit(1);
+    3bf8:	4505                	li	a0,1
+    3bfa:	00001097          	auipc	ra,0x1
+    3bfe:	d0a080e7          	jalr	-758(ra) # 4904 <exit>
+      name[0] = 'p' + pi;
+    3c02:	0709091b          	addiw	s2,s2,112
+    3c06:	f7240823          	sb	s2,-144(s0)
+      name[2] = '\0';
+    3c0a:	f6040923          	sb	zero,-142(s0)
+        if (strchr(illegal, name[1]) == 0) {
+    3c0e:	f6040913          	addi	s2,s0,-160
+          fd = open(name, O_CREATE | O_RDWR);
+    3c12:	f7040a13          	addi	s4,s0,-144
+      for(i = 0; i < N; i++){
+    3c16:	49d1                	li	s3,20
+    3c18:	a091                	j	3c5c <createdelete+0xfe>
+          fd = open(name, O_CREATE | O_RDWR);
+    3c1a:	20200593          	li	a1,514
+    3c1e:	8552                	mv	a0,s4
+    3c20:	00001097          	auipc	ra,0x1
+    3c24:	d30080e7          	jalr	-720(ra) # 4950 <open>
+          if(fd < 0){
+    3c28:	00054763          	bltz	a0,3c36 <createdelete+0xd8>
+          close(fd);
+    3c2c:	00001097          	auipc	ra,0x1
+    3c30:	d08080e7          	jalr	-760(ra) # 4934 <close>
+    3c34:	a081                	j	3c74 <createdelete+0x116>
+            printf("%s: create %s failed\n", s, name);
+    3c36:	f7040613          	addi	a2,s0,-144
+    3c3a:	85ee                	mv	a1,s11
+    3c3c:	00003517          	auipc	a0,0x3
+    3c40:	8cc50513          	addi	a0,a0,-1844 # 6508 <malloc+0x1788>
+    3c44:	00001097          	auipc	ra,0x1
+    3c48:	084080e7          	jalr	132(ra) # 4cc8 <printf>
+            exit(1);
+    3c4c:	4505                	li	a0,1
+    3c4e:	00001097          	auipc	ra,0x1
+    3c52:	cb6080e7          	jalr	-842(ra) # 4904 <exit>
+      for(i = 0; i < N; i++){
+    3c56:	2485                	addiw	s1,s1,1
+    3c58:	07348963          	beq	s1,s3,3cca <createdelete+0x16c>
+        name[1] = '0' + i;
+    3c5c:	0304859b          	addiw	a1,s1,48
+    3c60:	0ff5f593          	zext.b	a1,a1
+    3c64:	f6b408a3          	sb	a1,-143(s0)
+        if (strchr(illegal, name[1]) == 0) {
+    3c68:	854a                	mv	a0,s2
+    3c6a:	00001097          	auipc	ra,0x1
+    3c6e:	aa4080e7          	jalr	-1372(ra) # 470e <strchr>
+    3c72:	d545                	beqz	a0,3c1a <createdelete+0xbc>
+        if(i > 0 && (i % 2 ) == 0){
+    3c74:	fe9051e3          	blez	s1,3c56 <createdelete+0xf8>
+    3c78:	0014f793          	andi	a5,s1,1
+    3c7c:	ffe9                	bnez	a5,3c56 <createdelete+0xf8>
+          name[1] = '0' + (i / 2);
+    3c7e:	01f4d59b          	srliw	a1,s1,0x1f
+    3c82:	9da5                	addw	a1,a1,s1
+    3c84:	4015d59b          	sraiw	a1,a1,0x1
+    3c88:	0305859b          	addiw	a1,a1,48
+    3c8c:	0ff5f593          	zext.b	a1,a1
+    3c90:	f6b408a3          	sb	a1,-143(s0)
+          if (strchr(illegal, name[1]) == 0) {
+    3c94:	854a                	mv	a0,s2
+    3c96:	00001097          	auipc	ra,0x1
+    3c9a:	a78080e7          	jalr	-1416(ra) # 470e <strchr>
+    3c9e:	fd45                	bnez	a0,3c56 <createdelete+0xf8>
+            if(remove(name) < 0){
+    3ca0:	8552                	mv	a0,s4
+    3ca2:	00001097          	auipc	ra,0x1
+    3ca6:	d22080e7          	jalr	-734(ra) # 49c4 <remove>
+    3caa:	fa0556e3          	bgez	a0,3c56 <createdelete+0xf8>
+              printf("%s: remove failed\n", s);
+    3cae:	85ee                	mv	a1,s11
+    3cb0:	00002517          	auipc	a0,0x2
+    3cb4:	58050513          	addi	a0,a0,1408 # 6230 <malloc+0x14b0>
+    3cb8:	00001097          	auipc	ra,0x1
+    3cbc:	010080e7          	jalr	16(ra) # 4cc8 <printf>
+              exit(1);
+    3cc0:	4505                	li	a0,1
+    3cc2:	00001097          	auipc	ra,0x1
+    3cc6:	c42080e7          	jalr	-958(ra) # 4904 <exit>
+      exit(0);
+    3cca:	4501                	li	a0,0
+    3ccc:	00001097          	auipc	ra,0x1
+    3cd0:	c38080e7          	jalr	-968(ra) # 4904 <exit>
+      exit(1);
+    3cd4:	4505                	li	a0,1
+    3cd6:	00001097          	auipc	ra,0x1
+    3cda:	c2e080e7          	jalr	-978(ra) # 4904 <exit>
+        printf("%s: oops createdelete %s didn't exist\n", s, name);
+    3cde:	f7040613          	addi	a2,s0,-144
+    3ce2:	85ee                	mv	a1,s11
+    3ce4:	00003517          	auipc	a0,0x3
+    3ce8:	83c50513          	addi	a0,a0,-1988 # 6520 <malloc+0x17a0>
+    3cec:	00001097          	auipc	ra,0x1
+    3cf0:	fdc080e7          	jalr	-36(ra) # 4cc8 <printf>
+        exit(1);
+    3cf4:	4505                	li	a0,1
+    3cf6:	00001097          	auipc	ra,0x1
+    3cfa:	c0e080e7          	jalr	-1010(ra) # 4904 <exit>
+      } else if((i >= 1 && i < N/2) && fd >= 0){
+    3cfe:	056bf763          	bgeu	s7,s6,3d4c <createdelete+0x1ee>
+      if(fd >= 0)
+    3d02:	04055063          	bgez	a0,3d42 <createdelete+0x1e4>
+    for(pi = 0; pi < NCHILD; pi++){
+    3d06:	2485                	addiw	s1,s1,1
+    3d08:	0ff4f493          	zext.b	s1,s1
+    3d0c:	07448263          	beq	s1,s4,3d70 <createdelete+0x212>
+      name[0] = 'p' + pi;
+    3d10:	f6940823          	sb	s1,-144(s0)
+      name[1] = '0' + i;
+    3d14:	f72408a3          	sb	s2,-143(s0)
+      if (strchr(illegal, name[1]) != 0) { continue; }
+    3d18:	85ca                	mv	a1,s2
+    3d1a:	8556                	mv	a0,s5
+    3d1c:	00001097          	auipc	ra,0x1
+    3d20:	9f2080e7          	jalr	-1550(ra) # 470e <strchr>
+    3d24:	f16d                	bnez	a0,3d06 <createdelete+0x1a8>
+      fd = open(name, 0);
+    3d26:	4581                	li	a1,0
+    3d28:	8562                	mv	a0,s8
+    3d2a:	00001097          	auipc	ra,0x1
+    3d2e:	c26080e7          	jalr	-986(ra) # 4950 <open>
+      if((i == 0 || i >= N/2) && fd < 0){
+    3d32:	00098463          	beqz	s3,3d3a <createdelete+0x1dc>
+    3d36:	fd3d54e3          	bge	s10,s3,3cfe <createdelete+0x1a0>
+    3d3a:	fa0542e3          	bltz	a0,3cde <createdelete+0x180>
+      } else if((i >= 1 && i < N/2) && fd >= 0){
+    3d3e:	016bf963          	bgeu	s7,s6,3d50 <createdelete+0x1f2>
+        close(fd);
+    3d42:	00001097          	auipc	ra,0x1
+    3d46:	bf2080e7          	jalr	-1038(ra) # 4934 <close>
+    3d4a:	bf75                	j	3d06 <createdelete+0x1a8>
+      } else if((i >= 1 && i < N/2) && fd >= 0){
+    3d4c:	fa054de3          	bltz	a0,3d06 <createdelete+0x1a8>
+        printf("%s: oops createdelete %s did exist\n", s, name);
+    3d50:	f7040613          	addi	a2,s0,-144
+    3d54:	85ee                	mv	a1,s11
+    3d56:	00002517          	auipc	a0,0x2
+    3d5a:	7f250513          	addi	a0,a0,2034 # 6548 <malloc+0x17c8>
+    3d5e:	00001097          	auipc	ra,0x1
+    3d62:	f6a080e7          	jalr	-150(ra) # 4cc8 <printf>
+        exit(1);
+    3d66:	4505                	li	a0,1
+    3d68:	00001097          	auipc	ra,0x1
+    3d6c:	b9c080e7          	jalr	-1124(ra) # 4904 <exit>
+  for(i = 0; i < N; i++){
+    3d70:	2985                	addiw	s3,s3,1
+    3d72:	2b05                	addiw	s6,s6,1
+    3d74:	2905                	addiw	s2,s2,1
+    3d76:	0ff97913          	zext.b	s2,s2
+    3d7a:	47d1                	li	a5,20
+    3d7c:	02f98b63          	beq	s3,a5,3db2 <createdelete+0x254>
+    for(pi = 0; pi < NCHILD; pi++){
+    3d80:	84e6                	mv	s1,s9
+    3d82:	07400a13          	li	s4,116
+    3d86:	b769                	j	3d10 <createdelete+0x1b2>
+  for(i = 0; i < N; i++){
+    3d88:	2905                	addiw	s2,s2,1
+    3d8a:	0ff97913          	zext.b	s2,s2
+    3d8e:	03590d63          	beq	s2,s5,3dc8 <createdelete+0x26a>
+  name[0] = name[1] = name[2] = 0;
+    3d92:	84da                	mv	s1,s6
+      name[0] = 'p' + pi;
+    3d94:	f6940823          	sb	s1,-144(s0)
+      name[1] = '0' + i;
+    3d98:	f72408a3          	sb	s2,-143(s0)
+      remove(name);
+    3d9c:	8552                	mv	a0,s4
+    3d9e:	00001097          	auipc	ra,0x1
+    3da2:	c26080e7          	jalr	-986(ra) # 49c4 <remove>
+    for(pi = 0; pi < NCHILD; pi++){
+    3da6:	2485                	addiw	s1,s1,1
+    3da8:	0ff4f493          	zext.b	s1,s1
+    3dac:	ff3494e3          	bne	s1,s3,3d94 <createdelete+0x236>
+    3db0:	bfe1                	j	3d88 <createdelete+0x22a>
+    3db2:	03000913          	li	s2,48
+  name[0] = name[1] = name[2] = 0;
+    3db6:	07000b13          	li	s6,112
+      remove(name);
+    3dba:	f7040a13          	addi	s4,s0,-144
+    for(pi = 0; pi < NCHILD; pi++){
+    3dbe:	07400993          	li	s3,116
+  for(i = 0; i < N; i++){
+    3dc2:	04400a93          	li	s5,68
+    3dc6:	b7f1                	j	3d92 <createdelete+0x234>
+}
+    3dc8:	70aa                	ld	ra,168(sp)
+    3dca:	740a                	ld	s0,160(sp)
+    3dcc:	64ea                	ld	s1,152(sp)
+    3dce:	694a                	ld	s2,144(sp)
+    3dd0:	69aa                	ld	s3,136(sp)
+    3dd2:	6a0a                	ld	s4,128(sp)
+    3dd4:	7ae6                	ld	s5,120(sp)
+    3dd6:	7b46                	ld	s6,112(sp)
+    3dd8:	7ba6                	ld	s7,104(sp)
+    3dda:	7c06                	ld	s8,96(sp)
+    3ddc:	6ce6                	ld	s9,88(sp)
+    3dde:	6d46                	ld	s10,80(sp)
+    3de0:	6da6                	ld	s11,72(sp)
+    3de2:	614d                	addi	sp,sp,176
+    3de4:	8082                	ret
+
+0000000000003de6 <dirtest>:
+{
+    3de6:	1101                	addi	sp,sp,-32
+    3de8:	ec06                	sd	ra,24(sp)
+    3dea:	e822                	sd	s0,16(sp)
+    3dec:	e426                	sd	s1,8(sp)
+    3dee:	1000                	addi	s0,sp,32
+    3df0:	84aa                	mv	s1,a0
+  printf("mkdir test\n");
+    3df2:	00002517          	auipc	a0,0x2
+    3df6:	78e50513          	addi	a0,a0,1934 # 6580 <malloc+0x1800>
+    3dfa:	00001097          	auipc	ra,0x1
+    3dfe:	ece080e7          	jalr	-306(ra) # 4cc8 <printf>
+  if(mkdir("dir0") < 0){
+    3e02:	00002517          	auipc	a0,0x2
+    3e06:	78e50513          	addi	a0,a0,1934 # 6590 <malloc+0x1810>
+    3e0a:	00001097          	auipc	ra,0x1
+    3e0e:	b5a080e7          	jalr	-1190(ra) # 4964 <mkdir>
+    3e12:	04054d63          	bltz	a0,3e6c <dirtest+0x86>
+  if(chdir("dir0") < 0){
+    3e16:	00002517          	auipc	a0,0x2
+    3e1a:	77a50513          	addi	a0,a0,1914 # 6590 <malloc+0x1810>
+    3e1e:	00001097          	auipc	ra,0x1
+    3e22:	b50080e7          	jalr	-1200(ra) # 496e <chdir>
+    3e26:	06054163          	bltz	a0,3e88 <dirtest+0xa2>
+  if(chdir("..") < 0){
+    3e2a:	00002517          	auipc	a0,0x2
+    3e2e:	1c650513          	addi	a0,a0,454 # 5ff0 <malloc+0x1270>
+    3e32:	00001097          	auipc	ra,0x1
+    3e36:	b3c080e7          	jalr	-1220(ra) # 496e <chdir>
+    3e3a:	06054563          	bltz	a0,3ea4 <dirtest+0xbe>
+  if(remove("dir0") < 0){
+    3e3e:	00002517          	auipc	a0,0x2
+    3e42:	75250513          	addi	a0,a0,1874 # 6590 <malloc+0x1810>
+    3e46:	00001097          	auipc	ra,0x1
+    3e4a:	b7e080e7          	jalr	-1154(ra) # 49c4 <remove>
+    3e4e:	06054963          	bltz	a0,3ec0 <dirtest+0xda>
+  printf("%s: mkdir test ok\n");
+    3e52:	00002517          	auipc	a0,0x2
+    3e56:	78e50513          	addi	a0,a0,1934 # 65e0 <malloc+0x1860>
+    3e5a:	00001097          	auipc	ra,0x1
+    3e5e:	e6e080e7          	jalr	-402(ra) # 4cc8 <printf>
+}
+    3e62:	60e2                	ld	ra,24(sp)
+    3e64:	6442                	ld	s0,16(sp)
+    3e66:	64a2                	ld	s1,8(sp)
+    3e68:	6105                	addi	sp,sp,32
+    3e6a:	8082                	ret
+    printf("%s: mkdir failed\n", s);
+    3e6c:	85a6                	mv	a1,s1
+    3e6e:	00002517          	auipc	a0,0x2
+    3e72:	d0250513          	addi	a0,a0,-766 # 5b70 <malloc+0xdf0>
+    3e76:	00001097          	auipc	ra,0x1
+    3e7a:	e52080e7          	jalr	-430(ra) # 4cc8 <printf>
+    exit(1);
+    3e7e:	4505                	li	a0,1
+    3e80:	00001097          	auipc	ra,0x1
+    3e84:	a84080e7          	jalr	-1404(ra) # 4904 <exit>
+    printf("%s: chdir dir0 failed\n", s);
+    3e88:	85a6                	mv	a1,s1
+    3e8a:	00002517          	auipc	a0,0x2
+    3e8e:	70e50513          	addi	a0,a0,1806 # 6598 <malloc+0x1818>
+    3e92:	00001097          	auipc	ra,0x1
+    3e96:	e36080e7          	jalr	-458(ra) # 4cc8 <printf>
+    exit(1);
+    3e9a:	4505                	li	a0,1
+    3e9c:	00001097          	auipc	ra,0x1
+    3ea0:	a68080e7          	jalr	-1432(ra) # 4904 <exit>
+    printf("%s: chdir .. failed\n", s);
+    3ea4:	85a6                	mv	a1,s1
+    3ea6:	00002517          	auipc	a0,0x2
+    3eaa:	70a50513          	addi	a0,a0,1802 # 65b0 <malloc+0x1830>
+    3eae:	00001097          	auipc	ra,0x1
+    3eb2:	e1a080e7          	jalr	-486(ra) # 4cc8 <printf>
+    exit(1);
+    3eb6:	4505                	li	a0,1
+    3eb8:	00001097          	auipc	ra,0x1
+    3ebc:	a4c080e7          	jalr	-1460(ra) # 4904 <exit>
+    printf("%s: remove dir0 failed\n", s);
+    3ec0:	85a6                	mv	a1,s1
+    3ec2:	00002517          	auipc	a0,0x2
+    3ec6:	70650513          	addi	a0,a0,1798 # 65c8 <malloc+0x1848>
+    3eca:	00001097          	auipc	ra,0x1
+    3ece:	dfe080e7          	jalr	-514(ra) # 4cc8 <printf>
+    exit(1);
+    3ed2:	4505                	li	a0,1
+    3ed4:	00001097          	auipc	ra,0x1
+    3ed8:	a30080e7          	jalr	-1488(ra) # 4904 <exit>
+
+0000000000003edc <fourteen>:
+{
+    3edc:	1101                	addi	sp,sp,-32
+    3ede:	ec06                	sd	ra,24(sp)
+    3ee0:	e822                	sd	s0,16(sp)
+    3ee2:	e426                	sd	s1,8(sp)
+    3ee4:	1000                	addi	s0,sp,32
+    3ee6:	84aa                	mv	s1,a0
+  if(mkdir("12345678901234") != 0){
+    3ee8:	00003517          	auipc	a0,0x3
+    3eec:	8e050513          	addi	a0,a0,-1824 # 67c8 <malloc+0x1a48>
+    3ef0:	00001097          	auipc	ra,0x1
+    3ef4:	a74080e7          	jalr	-1420(ra) # 4964 <mkdir>
+    3ef8:	e165                	bnez	a0,3fd8 <fourteen+0xfc>
+  if(mkdir("12345678901234/123456789012345") != 0){
+    3efa:	00002517          	auipc	a0,0x2
+    3efe:	72650513          	addi	a0,a0,1830 # 6620 <malloc+0x18a0>
+    3f02:	00001097          	auipc	ra,0x1
+    3f06:	a62080e7          	jalr	-1438(ra) # 4964 <mkdir>
+    3f0a:	e56d                	bnez	a0,3ff4 <fourteen+0x118>
+  fd = open("123456789012345/123456789012345/123456789012345", O_CREATE);
+    3f0c:	20000593          	li	a1,512
+    3f10:	00002517          	auipc	a0,0x2
+    3f14:	76850513          	addi	a0,a0,1896 # 6678 <malloc+0x18f8>
+    3f18:	00001097          	auipc	ra,0x1
+    3f1c:	a38080e7          	jalr	-1480(ra) # 4950 <open>
+  if(fd < 0){
+    3f20:	0e054863          	bltz	a0,4010 <fourteen+0x134>
+  close(fd);
+    3f24:	00001097          	auipc	ra,0x1
+    3f28:	a10080e7          	jalr	-1520(ra) # 4934 <close>
+  fd = open("12345678901234/12345678901234/12345678901234", 0);
+    3f2c:	4581                	li	a1,0
+    3f2e:	00002517          	auipc	a0,0x2
+    3f32:	7c250513          	addi	a0,a0,1986 # 66f0 <malloc+0x1970>
+    3f36:	00001097          	auipc	ra,0x1
+    3f3a:	a1a080e7          	jalr	-1510(ra) # 4950 <open>
+  if(fd < 0){
+    3f3e:	0e054763          	bltz	a0,402c <fourteen+0x150>
+  close(fd);
+    3f42:	00001097          	auipc	ra,0x1
+    3f46:	9f2080e7          	jalr	-1550(ra) # 4934 <close>
+  if(mkdir("12345678901234/12345678901234") == 0){
+    3f4a:	00003517          	auipc	a0,0x3
+    3f4e:	81650513          	addi	a0,a0,-2026 # 6760 <malloc+0x19e0>
+    3f52:	00001097          	auipc	ra,0x1
+    3f56:	a12080e7          	jalr	-1518(ra) # 4964 <mkdir>
+    3f5a:	c57d                	beqz	a0,4048 <fourteen+0x16c>
+  if(mkdir("123456789012345/12345678901234") == 0){
+    3f5c:	00003517          	auipc	a0,0x3
+    3f60:	85c50513          	addi	a0,a0,-1956 # 67b8 <malloc+0x1a38>
+    3f64:	00001097          	auipc	ra,0x1
+    3f68:	a00080e7          	jalr	-1536(ra) # 4964 <mkdir>
+    3f6c:	cd65                	beqz	a0,4064 <fourteen+0x188>
+  remove("123456789012345/12345678901234");
+    3f6e:	00003517          	auipc	a0,0x3
+    3f72:	84a50513          	addi	a0,a0,-1974 # 67b8 <malloc+0x1a38>
+    3f76:	00001097          	auipc	ra,0x1
+    3f7a:	a4e080e7          	jalr	-1458(ra) # 49c4 <remove>
+  remove("12345678901234/12345678901234");
+    3f7e:	00002517          	auipc	a0,0x2
+    3f82:	7e250513          	addi	a0,a0,2018 # 6760 <malloc+0x19e0>
+    3f86:	00001097          	auipc	ra,0x1
+    3f8a:	a3e080e7          	jalr	-1474(ra) # 49c4 <remove>
+  remove("12345678901234/12345678901234/12345678901234");
+    3f8e:	00002517          	auipc	a0,0x2
+    3f92:	76250513          	addi	a0,a0,1890 # 66f0 <malloc+0x1970>
+    3f96:	00001097          	auipc	ra,0x1
+    3f9a:	a2e080e7          	jalr	-1490(ra) # 49c4 <remove>
+  remove("123456789012345/123456789012345/123456789012345");
+    3f9e:	00002517          	auipc	a0,0x2
+    3fa2:	6da50513          	addi	a0,a0,1754 # 6678 <malloc+0x18f8>
+    3fa6:	00001097          	auipc	ra,0x1
+    3faa:	a1e080e7          	jalr	-1506(ra) # 49c4 <remove>
+  remove("12345678901234/123456789012345");
+    3fae:	00002517          	auipc	a0,0x2
+    3fb2:	67250513          	addi	a0,a0,1650 # 6620 <malloc+0x18a0>
+    3fb6:	00001097          	auipc	ra,0x1
+    3fba:	a0e080e7          	jalr	-1522(ra) # 49c4 <remove>
+  remove("12345678901234");
+    3fbe:	00003517          	auipc	a0,0x3
+    3fc2:	80a50513          	addi	a0,a0,-2038 # 67c8 <malloc+0x1a48>
+    3fc6:	00001097          	auipc	ra,0x1
+    3fca:	9fe080e7          	jalr	-1538(ra) # 49c4 <remove>
+}
+    3fce:	60e2                	ld	ra,24(sp)
+    3fd0:	6442                	ld	s0,16(sp)
+    3fd2:	64a2                	ld	s1,8(sp)
+    3fd4:	6105                	addi	sp,sp,32
+    3fd6:	8082                	ret
+    printf("%s: mkdir 12345678901234 failed\n", s);
+    3fd8:	85a6                	mv	a1,s1
+    3fda:	00002517          	auipc	a0,0x2
+    3fde:	61e50513          	addi	a0,a0,1566 # 65f8 <malloc+0x1878>
+    3fe2:	00001097          	auipc	ra,0x1
+    3fe6:	ce6080e7          	jalr	-794(ra) # 4cc8 <printf>
+    exit(1);
+    3fea:	4505                	li	a0,1
+    3fec:	00001097          	auipc	ra,0x1
+    3ff0:	918080e7          	jalr	-1768(ra) # 4904 <exit>
+    printf("%s: mkdir 12345678901234/123456789012345 failed\n", s);
+    3ff4:	85a6                	mv	a1,s1
+    3ff6:	00002517          	auipc	a0,0x2
+    3ffa:	64a50513          	addi	a0,a0,1610 # 6640 <malloc+0x18c0>
+    3ffe:	00001097          	auipc	ra,0x1
+    4002:	cca080e7          	jalr	-822(ra) # 4cc8 <printf>
+    exit(1);
+    4006:	4505                	li	a0,1
+    4008:	00001097          	auipc	ra,0x1
+    400c:	8fc080e7          	jalr	-1796(ra) # 4904 <exit>
+    printf("%s: create 123456789012345/123456789012345/123456789012345 failed\n", s);
+    4010:	85a6                	mv	a1,s1
+    4012:	00002517          	auipc	a0,0x2
+    4016:	69650513          	addi	a0,a0,1686 # 66a8 <malloc+0x1928>
+    401a:	00001097          	auipc	ra,0x1
+    401e:	cae080e7          	jalr	-850(ra) # 4cc8 <printf>
+    exit(1);
+    4022:	4505                	li	a0,1
+    4024:	00001097          	auipc	ra,0x1
+    4028:	8e0080e7          	jalr	-1824(ra) # 4904 <exit>
+    printf("%s: open 12345678901234/12345678901234/12345678901234 failed\n", s);
+    402c:	85a6                	mv	a1,s1
+    402e:	00002517          	auipc	a0,0x2
+    4032:	6f250513          	addi	a0,a0,1778 # 6720 <malloc+0x19a0>
+    4036:	00001097          	auipc	ra,0x1
+    403a:	c92080e7          	jalr	-878(ra) # 4cc8 <printf>
+    exit(1);
+    403e:	4505                	li	a0,1
+    4040:	00001097          	auipc	ra,0x1
+    4044:	8c4080e7          	jalr	-1852(ra) # 4904 <exit>
+    printf("%s: mkdir 12345678901234/12345678901234 succeeded!\n", s);
+    4048:	85a6                	mv	a1,s1
+    404a:	00002517          	auipc	a0,0x2
+    404e:	73650513          	addi	a0,a0,1846 # 6780 <malloc+0x1a00>
+    4052:	00001097          	auipc	ra,0x1
+    4056:	c76080e7          	jalr	-906(ra) # 4cc8 <printf>
+    exit(1);
+    405a:	4505                	li	a0,1
+    405c:	00001097          	auipc	ra,0x1
+    4060:	8a8080e7          	jalr	-1880(ra) # 4904 <exit>
+    printf("%s: mkdir 12345678901234/123456789012345 succeeded!\n", s);
+    4064:	85a6                	mv	a1,s1
+    4066:	00002517          	auipc	a0,0x2
+    406a:	77250513          	addi	a0,a0,1906 # 67d8 <malloc+0x1a58>
+    406e:	00001097          	auipc	ra,0x1
+    4072:	c5a080e7          	jalr	-934(ra) # 4cc8 <printf>
+    exit(1);
+    4076:	4505                	li	a0,1
+    4078:	00001097          	auipc	ra,0x1
+    407c:	88c080e7          	jalr	-1908(ra) # 4904 <exit>
+
+0000000000004080 <fsfull>:
+{
+    4080:	7171                	addi	sp,sp,-176
+    4082:	f506                	sd	ra,168(sp)
+    4084:	f122                	sd	s0,160(sp)
+    4086:	ed26                	sd	s1,152(sp)
+    4088:	e94a                	sd	s2,144(sp)
+    408a:	e54e                	sd	s3,136(sp)
+    408c:	e152                	sd	s4,128(sp)
+    408e:	fcd6                	sd	s5,120(sp)
+    4090:	f8da                	sd	s6,112(sp)
+    4092:	f4de                	sd	s7,104(sp)
+    4094:	f0e2                	sd	s8,96(sp)
+    4096:	ece6                	sd	s9,88(sp)
+    4098:	e8ea                	sd	s10,80(sp)
+    409a:	e4ee                	sd	s11,72(sp)
+    409c:	1900                	addi	s0,sp,176
+  printf("fsfull test\n");
+    409e:	00002517          	auipc	a0,0x2
+    40a2:	77250513          	addi	a0,a0,1906 # 6810 <malloc+0x1a90>
+    40a6:	00001097          	auipc	ra,0x1
+    40aa:	c22080e7          	jalr	-990(ra) # 4cc8 <printf>
+  for(nfiles = 0; ; nfiles++){
+    40ae:	4481                	li	s1,0
+    name[0] = 'f';
+    40b0:	06600d93          	li	s11,102
+    name[1] = '0' + nfiles / 1000;
+    40b4:	3e800c93          	li	s9,1000
+    name[2] = '0' + (nfiles % 1000) / 100;
+    40b8:	06400c13          	li	s8,100
+    name[3] = '0' + (nfiles % 100) / 10;
+    40bc:	4ba9                	li	s7,10
+    printf("%s: writing %s\n", name);
+    40be:	f5040b13          	addi	s6,s0,-176
+    40c2:	00002d17          	auipc	s10,0x2
+    40c6:	75ed0d13          	addi	s10,s10,1886 # 6820 <malloc+0x1aa0>
+      int cc = write(fd, buf, BSIZE);
+    40ca:	00006a17          	auipc	s4,0x6
+    40ce:	7cea0a13          	addi	s4,s4,1998 # a898 <buf>
+    name[0] = 'f';
+    40d2:	f5b40823          	sb	s11,-176(s0)
+    name[1] = '0' + nfiles / 1000;
+    40d6:	0394c7bb          	divw	a5,s1,s9
+    40da:	0307879b          	addiw	a5,a5,48
+    40de:	f4f408a3          	sb	a5,-175(s0)
+    name[2] = '0' + (nfiles % 1000) / 100;
+    40e2:	0394e7bb          	remw	a5,s1,s9
+    40e6:	0387c7bb          	divw	a5,a5,s8
+    40ea:	0307879b          	addiw	a5,a5,48
+    40ee:	f4f40923          	sb	a5,-174(s0)
+    name[3] = '0' + (nfiles % 100) / 10;
+    40f2:	0384e7bb          	remw	a5,s1,s8
+    40f6:	0377c7bb          	divw	a5,a5,s7
+    40fa:	0307879b          	addiw	a5,a5,48
+    40fe:	f4f409a3          	sb	a5,-173(s0)
+    name[4] = '0' + (nfiles % 10);
+    4102:	0374e7bb          	remw	a5,s1,s7
+    4106:	0307879b          	addiw	a5,a5,48
+    410a:	f4f40a23          	sb	a5,-172(s0)
+    name[5] = '\0';
+    410e:	f4040aa3          	sb	zero,-171(s0)
+    printf("%s: writing %s\n", name);
+    4112:	85da                	mv	a1,s6
+    4114:	856a                	mv	a0,s10
+    4116:	00001097          	auipc	ra,0x1
+    411a:	bb2080e7          	jalr	-1102(ra) # 4cc8 <printf>
+    int fd = open(name, O_CREATE|O_RDWR);
+    411e:	20200593          	li	a1,514
+    4122:	855a                	mv	a0,s6
+    4124:	00001097          	auipc	ra,0x1
+    4128:	82c080e7          	jalr	-2004(ra) # 4950 <open>
+    412c:	892a                	mv	s2,a0
+    if(fd < 0){
+    412e:	0a055763          	bgez	a0,41dc <fsfull+0x15c>
+      printf("%s: open %s failed\n", name);
+    4132:	f5040593          	addi	a1,s0,-176
+    4136:	00002517          	auipc	a0,0x2
+    413a:	6fa50513          	addi	a0,a0,1786 # 6830 <malloc+0x1ab0>
+    413e:	00001097          	auipc	ra,0x1
+    4142:	b8a080e7          	jalr	-1142(ra) # 4cc8 <printf>
+  while(nfiles >= 0){
+    4146:	0604c463          	bltz	s1,41ae <fsfull+0x12e>
+    name[0] = 'f';
+    414a:	06600b93          	li	s7,102
+    name[1] = '0' + nfiles / 1000;
+    414e:	3e800a13          	li	s4,1000
+    name[2] = '0' + (nfiles % 1000) / 100;
+    4152:	06400993          	li	s3,100
+    name[3] = '0' + (nfiles % 100) / 10;
+    4156:	4929                	li	s2,10
+    remove(name);
+    4158:	f5040b13          	addi	s6,s0,-176
+  while(nfiles >= 0){
+    415c:	5afd                	li	s5,-1
+    name[0] = 'f';
+    415e:	f5740823          	sb	s7,-176(s0)
+    name[1] = '0' + nfiles / 1000;
+    4162:	0344c7bb          	divw	a5,s1,s4
+    4166:	0307879b          	addiw	a5,a5,48
+    416a:	f4f408a3          	sb	a5,-175(s0)
+    name[2] = '0' + (nfiles % 1000) / 100;
+    416e:	0344e7bb          	remw	a5,s1,s4
+    4172:	0337c7bb          	divw	a5,a5,s3
+    4176:	0307879b          	addiw	a5,a5,48
+    417a:	f4f40923          	sb	a5,-174(s0)
+    name[3] = '0' + (nfiles % 100) / 10;
+    417e:	0334e7bb          	remw	a5,s1,s3
+    4182:	0327c7bb          	divw	a5,a5,s2
+    4186:	0307879b          	addiw	a5,a5,48
+    418a:	f4f409a3          	sb	a5,-173(s0)
+    name[4] = '0' + (nfiles % 10);
+    418e:	0324e7bb          	remw	a5,s1,s2
+    4192:	0307879b          	addiw	a5,a5,48
+    4196:	f4f40a23          	sb	a5,-172(s0)
+    name[5] = '\0';
+    419a:	f4040aa3          	sb	zero,-171(s0)
+    remove(name);
+    419e:	855a                	mv	a0,s6
+    41a0:	00001097          	auipc	ra,0x1
+    41a4:	824080e7          	jalr	-2012(ra) # 49c4 <remove>
+    nfiles--;
+    41a8:	34fd                	addiw	s1,s1,-1
+  while(nfiles >= 0){
+    41aa:	fb549ae3          	bne	s1,s5,415e <fsfull+0xde>
+  printf("fsfull test finished\n");
+    41ae:	00002517          	auipc	a0,0x2
+    41b2:	6b250513          	addi	a0,a0,1714 # 6860 <malloc+0x1ae0>
+    41b6:	00001097          	auipc	ra,0x1
+    41ba:	b12080e7          	jalr	-1262(ra) # 4cc8 <printf>
+}
+    41be:	70aa                	ld	ra,168(sp)
+    41c0:	740a                	ld	s0,160(sp)
+    41c2:	64ea                	ld	s1,152(sp)
+    41c4:	694a                	ld	s2,144(sp)
+    41c6:	69aa                	ld	s3,136(sp)
+    41c8:	6a0a                	ld	s4,128(sp)
+    41ca:	7ae6                	ld	s5,120(sp)
+    41cc:	7b46                	ld	s6,112(sp)
+    41ce:	7ba6                	ld	s7,104(sp)
+    41d0:	7c06                	ld	s8,96(sp)
+    41d2:	6ce6                	ld	s9,88(sp)
+    41d4:	6d46                	ld	s10,80(sp)
+    41d6:	6da6                	ld	s11,72(sp)
+    41d8:	614d                	addi	sp,sp,176
+    41da:	8082                	ret
+    int total = 0;
+    41dc:	4981                	li	s3,0
+      if(cc < BSIZE)
+    41de:	1ff00a93          	li	s5,511
+      int cc = write(fd, buf, BSIZE);
+    41e2:	20000613          	li	a2,512
+    41e6:	85d2                	mv	a1,s4
+    41e8:	854a                	mv	a0,s2
+    41ea:	00000097          	auipc	ra,0x0
+    41ee:	740080e7          	jalr	1856(ra) # 492a <write>
+      if(cc < BSIZE)
+    41f2:	00aad563          	bge	s5,a0,41fc <fsfull+0x17c>
+      total += cc;
+    41f6:	00a989bb          	addw	s3,s3,a0
+    while(1){
+    41fa:	b7e5                	j	41e2 <fsfull+0x162>
+    printf("%s: wrote %d bytes\n", total);
+    41fc:	85ce                	mv	a1,s3
+    41fe:	00002517          	auipc	a0,0x2
+    4202:	64a50513          	addi	a0,a0,1610 # 6848 <malloc+0x1ac8>
+    4206:	00001097          	auipc	ra,0x1
+    420a:	ac2080e7          	jalr	-1342(ra) # 4cc8 <printf>
+    close(fd);
+    420e:	854a                	mv	a0,s2
+    4210:	00000097          	auipc	ra,0x0
+    4214:	724080e7          	jalr	1828(ra) # 4934 <close>
+    if(total == 0)
+    4218:	f20987e3          	beqz	s3,4146 <fsfull+0xc6>
+  for(nfiles = 0; ; nfiles++){
+    421c:	2485                	addiw	s1,s1,1
+    421e:	bd55                	j	40d2 <fsfull+0x52>
+
+0000000000004220 <rand>:
+{
+    4220:	1141                	addi	sp,sp,-16
+    4222:	e422                	sd	s0,8(sp)
+    4224:	0800                	addi	s0,sp,16
+  randstate = randstate * 1664525 + 1013904223;
+    4226:	00003717          	auipc	a4,0x3
+    422a:	aea70713          	addi	a4,a4,-1302 # 6d10 <__DATA_BEGIN__>
+    422e:	7308                	ld	a0,32(a4)
+    4230:	001967b7          	lui	a5,0x196
+    4234:	60d78793          	addi	a5,a5,1549 # 19660d <__BSS_END__+0x18a55d>
+    4238:	02f50533          	mul	a0,a0,a5
+    423c:	3c6ef7b7          	lui	a5,0x3c6ef
+    4240:	35f78793          	addi	a5,a5,863 # 3c6ef35f <__BSS_END__+0x3c6e32af>
+    4244:	953e                	add	a0,a0,a5
+    4246:	f308                	sd	a0,32(a4)
+}
+    4248:	2501                	sext.w	a0,a0
+    424a:	6422                	ld	s0,8(sp)
+    424c:	0141                	addi	sp,sp,16
+    424e:	8082                	ret
+
+0000000000004250 <countfree>:
+// because out of memory with lazy allocation results in the process
+// taking a fault and being killed, fork and report back.
+//
+int
+countfree()
+{
+    4250:	7139                	addi	sp,sp,-64
+    4252:	fc06                	sd	ra,56(sp)
+    4254:	f822                	sd	s0,48(sp)
+    4256:	f426                	sd	s1,40(sp)
+    4258:	f04a                	sd	s2,32(sp)
+    425a:	ec4e                	sd	s3,24(sp)
+    425c:	0080                	addi	s0,sp,64
+  int fds[2];
+
+  if(pipe(fds) < 0){
+    425e:	fc840513          	addi	a0,s0,-56
+    4262:	00000097          	auipc	ra,0x0
+    4266:	6b4080e7          	jalr	1716(ra) # 4916 <pipe>
+    426a:	06054763          	bltz	a0,42d8 <countfree+0x88>
+    printf("pipe() failed in countfree()\n");
+    exit(1);
+  }
+  
+  int pid = fork();
+    426e:	00000097          	auipc	ra,0x0
+    4272:	68e080e7          	jalr	1678(ra) # 48fc <fork>
+
+  if(pid < 0){
+    4276:	06054e63          	bltz	a0,42f2 <countfree+0xa2>
+    printf("fork failed in countfree()\n");
+    exit(1);
+  }
+
+  if(pid == 0){
+    427a:	ed51                	bnez	a0,4316 <countfree+0xc6>
+    close(fds[0]);
+    427c:	fc842503          	lw	a0,-56(s0)
+    4280:	00000097          	auipc	ra,0x0
+    4284:	6b4080e7          	jalr	1716(ra) # 4934 <close>
+    
+    while(1){
+      uint64 a = (uint64) sbrk(4096);
+      if(a == 0xffffffffffffffff){
+    4288:	597d                	li	s2,-1
+        break;
+      }
+
+      // modify the memory to make sure it's really allocated.
+      *(char *)(a + 4096 - 1) = 1;
+    428a:	4485                	li	s1,1
+
+      // report back one more page.
+      if(write(fds[1], "x", 1) != 1){
+    428c:	00001997          	auipc	s3,0x1
+    4290:	cc498993          	addi	s3,s3,-828 # 4f50 <malloc+0x1d0>
+      uint64 a = (uint64) sbrk(4096);
+    4294:	6505                	lui	a0,0x1
+    4296:	00000097          	auipc	ra,0x0
+    429a:	6f4080e7          	jalr	1780(ra) # 498a <sbrk>
+      if(a == 0xffffffffffffffff){
+    429e:	07250763          	beq	a0,s2,430c <countfree+0xbc>
+      *(char *)(a + 4096 - 1) = 1;
+    42a2:	6785                	lui	a5,0x1
+    42a4:	97aa                	add	a5,a5,a0
+    42a6:	fe978fa3          	sb	s1,-1(a5) # fff <copyinstr2+0xbd>
+      if(write(fds[1], "x", 1) != 1){
+    42aa:	8626                	mv	a2,s1
+    42ac:	85ce                	mv	a1,s3
+    42ae:	fcc42503          	lw	a0,-52(s0)
+    42b2:	00000097          	auipc	ra,0x0
+    42b6:	678080e7          	jalr	1656(ra) # 492a <write>
+    42ba:	fc950de3          	beq	a0,s1,4294 <countfree+0x44>
+        printf("write() failed in countfree()\n");
+    42be:	00002517          	auipc	a0,0x2
+    42c2:	5fa50513          	addi	a0,a0,1530 # 68b8 <malloc+0x1b38>
+    42c6:	00001097          	auipc	ra,0x1
+    42ca:	a02080e7          	jalr	-1534(ra) # 4cc8 <printf>
+        exit(1);
+    42ce:	4505                	li	a0,1
+    42d0:	00000097          	auipc	ra,0x0
+    42d4:	634080e7          	jalr	1588(ra) # 4904 <exit>
+    printf("pipe() failed in countfree()\n");
+    42d8:	00002517          	auipc	a0,0x2
+    42dc:	5a050513          	addi	a0,a0,1440 # 6878 <malloc+0x1af8>
+    42e0:	00001097          	auipc	ra,0x1
+    42e4:	9e8080e7          	jalr	-1560(ra) # 4cc8 <printf>
+    exit(1);
+    42e8:	4505                	li	a0,1
+    42ea:	00000097          	auipc	ra,0x0
+    42ee:	61a080e7          	jalr	1562(ra) # 4904 <exit>
+    printf("fork failed in countfree()\n");
+    42f2:	00002517          	auipc	a0,0x2
+    42f6:	5a650513          	addi	a0,a0,1446 # 6898 <malloc+0x1b18>
+    42fa:	00001097          	auipc	ra,0x1
+    42fe:	9ce080e7          	jalr	-1586(ra) # 4cc8 <printf>
+    exit(1);
+    4302:	4505                	li	a0,1
+    4304:	00000097          	auipc	ra,0x0
+    4308:	600080e7          	jalr	1536(ra) # 4904 <exit>
+      }
+    }
+
+    exit(0);
+    430c:	4501                	li	a0,0
+    430e:	00000097          	auipc	ra,0x0
+    4312:	5f6080e7          	jalr	1526(ra) # 4904 <exit>
+  }
+
+  close(fds[1]);
+    4316:	fcc42503          	lw	a0,-52(s0)
+    431a:	00000097          	auipc	ra,0x0
+    431e:	61a080e7          	jalr	1562(ra) # 4934 <close>
+
+  int n = 0;
+    4322:	4481                	li	s1,0
+  while(1){
+    char c;
+    int cc = read(fds[0], &c, 1);
+    4324:	fc740913          	addi	s2,s0,-57
+    4328:	4605                	li	a2,1
+    432a:	85ca                	mv	a1,s2
+    432c:	fc842503          	lw	a0,-56(s0)
+    4330:	00000097          	auipc	ra,0x0
+    4334:	5f0080e7          	jalr	1520(ra) # 4920 <read>
+    if(cc < 0){
+    4338:	00054563          	bltz	a0,4342 <countfree+0xf2>
+      printf("read() failed in countfree()\n");
+      exit(1);
+    }
+    if(cc == 0)
+    433c:	c105                	beqz	a0,435c <countfree+0x10c>
+      break;
+    n += 1;
+    433e:	2485                	addiw	s1,s1,1
+  while(1){
+    4340:	b7e5                	j	4328 <countfree+0xd8>
+      printf("read() failed in countfree()\n");
+    4342:	00002517          	auipc	a0,0x2
+    4346:	59650513          	addi	a0,a0,1430 # 68d8 <malloc+0x1b58>
+    434a:	00001097          	auipc	ra,0x1
+    434e:	97e080e7          	jalr	-1666(ra) # 4cc8 <printf>
+      exit(1);
+    4352:	4505                	li	a0,1
+    4354:	00000097          	auipc	ra,0x0
+    4358:	5b0080e7          	jalr	1456(ra) # 4904 <exit>
+  }
+
+  close(fds[0]);
+    435c:	fc842503          	lw	a0,-56(s0)
+    4360:	00000097          	auipc	ra,0x0
+    4364:	5d4080e7          	jalr	1492(ra) # 4934 <close>
+  wait((int*)0);
+    4368:	4501                	li	a0,0
+    436a:	00000097          	auipc	ra,0x0
+    436e:	5a4080e7          	jalr	1444(ra) # 490e <wait>
+  
+  return n;
+}
+    4372:	8526                	mv	a0,s1
+    4374:	70e2                	ld	ra,56(sp)
+    4376:	7442                	ld	s0,48(sp)
+    4378:	74a2                	ld	s1,40(sp)
+    437a:	7902                	ld	s2,32(sp)
+    437c:	69e2                	ld	s3,24(sp)
+    437e:	6121                	addi	sp,sp,64
+    4380:	8082                	ret
+
+0000000000004382 <run>:
+
+// run each test in its own process. run returns 1 if child's exit()
+// indicates success.
+int
+run(void f(char *), char *s) {
+    4382:	7179                	addi	sp,sp,-48
+    4384:	f406                	sd	ra,40(sp)
+    4386:	f022                	sd	s0,32(sp)
+    4388:	ec26                	sd	s1,24(sp)
+    438a:	e84a                	sd	s2,16(sp)
+    438c:	1800                	addi	s0,sp,48
+    438e:	84aa                	mv	s1,a0
+    4390:	892e                	mv	s2,a1
+  int pid;
+  int xstatus;
+
+  printf("test %s: ", s);
+    4392:	00002517          	auipc	a0,0x2
+    4396:	56650513          	addi	a0,a0,1382 # 68f8 <malloc+0x1b78>
+    439a:	00001097          	auipc	ra,0x1
+    439e:	92e080e7          	jalr	-1746(ra) # 4cc8 <printf>
+  if((pid = fork()) < 0) {
+    43a2:	00000097          	auipc	ra,0x0
+    43a6:	55a080e7          	jalr	1370(ra) # 48fc <fork>
+    43aa:	02054e63          	bltz	a0,43e6 <run+0x64>
+    printf("runtest: fork error\n");
+    exit(1);
+  }
+  if(pid == 0) {
+    43ae:	c929                	beqz	a0,4400 <run+0x7e>
+    f(s);
+    exit(0);
+  } else {
+    wait(&xstatus);
+    43b0:	fdc40513          	addi	a0,s0,-36
+    43b4:	00000097          	auipc	ra,0x0
+    43b8:	55a080e7          	jalr	1370(ra) # 490e <wait>
+    if(xstatus != 0) 
+    43bc:	fdc42783          	lw	a5,-36(s0)
+    43c0:	c7b9                	beqz	a5,440e <run+0x8c>
+      printf("FAILED\n");
+    43c2:	00002517          	auipc	a0,0x2
+    43c6:	55e50513          	addi	a0,a0,1374 # 6920 <malloc+0x1ba0>
+    43ca:	00001097          	auipc	ra,0x1
+    43ce:	8fe080e7          	jalr	-1794(ra) # 4cc8 <printf>
+    else
+      printf("OK\n");
+    return xstatus == 0;
+    43d2:	fdc42503          	lw	a0,-36(s0)
+  }
+}
+    43d6:	00153513          	seqz	a0,a0
+    43da:	70a2                	ld	ra,40(sp)
+    43dc:	7402                	ld	s0,32(sp)
+    43de:	64e2                	ld	s1,24(sp)
+    43e0:	6942                	ld	s2,16(sp)
+    43e2:	6145                	addi	sp,sp,48
+    43e4:	8082                	ret
+    printf("runtest: fork error\n");
+    43e6:	00002517          	auipc	a0,0x2
+    43ea:	52250513          	addi	a0,a0,1314 # 6908 <malloc+0x1b88>
+    43ee:	00001097          	auipc	ra,0x1
+    43f2:	8da080e7          	jalr	-1830(ra) # 4cc8 <printf>
+    exit(1);
+    43f6:	4505                	li	a0,1
+    43f8:	00000097          	auipc	ra,0x0
+    43fc:	50c080e7          	jalr	1292(ra) # 4904 <exit>
+    f(s);
+    4400:	854a                	mv	a0,s2
+    4402:	9482                	jalr	s1
+    exit(0);
+    4404:	4501                	li	a0,0
+    4406:	00000097          	auipc	ra,0x0
+    440a:	4fe080e7          	jalr	1278(ra) # 4904 <exit>
+      printf("OK\n");
+    440e:	00002517          	auipc	a0,0x2
+    4412:	51a50513          	addi	a0,a0,1306 # 6928 <malloc+0x1ba8>
+    4416:	00001097          	auipc	ra,0x1
+    441a:	8b2080e7          	jalr	-1870(ra) # 4cc8 <printf>
+    441e:	bf55                	j	43d2 <run+0x50>
+
+0000000000004420 <main>:
+
+int
+main(int argc, char *argv[])
+{
+    4420:	c8010113          	addi	sp,sp,-896
+    4424:	36113c23          	sd	ra,888(sp)
+    4428:	36813823          	sd	s0,880(sp)
+    442c:	36913423          	sd	s1,872(sp)
+    4430:	37213023          	sd	s2,864(sp)
+    4434:	35313c23          	sd	s3,856(sp)
+    4438:	35413823          	sd	s4,848(sp)
+    443c:	35513423          	sd	s5,840(sp)
+    4440:	35613023          	sd	s6,832(sp)
+    4444:	0700                	addi	s0,sp,896
+    4446:	89aa                	mv	s3,a0
+  int continuous = 0;
+  char *justone = 0;
+
+  if(argc == 2 && strcmp(argv[1], "-c") == 0){
+    4448:	4789                	li	a5,2
+    444a:	08f50763          	beq	a0,a5,44d8 <main+0xb8>
+    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){
+    444e:	4785                	li	a5,1
+  char *justone = 0;
+    4450:	4901                	li	s2,0
+  } else if(argc > 1){
+    4452:	0ca7c163          	blt	a5,a0,4514 <main+0xf4>
+  }
+  
+  struct test {
+    void (*f)(char *);
+    char *s;
+  } tests[] = {
+    4456:	00003797          	auipc	a5,0x3
+    445a:	8e278793          	addi	a5,a5,-1822 # 6d38 <randstate+0x8>
+    445e:	c8040713          	addi	a4,s0,-896
+    4462:	00003817          	auipc	a6,0x3
+    4466:	c1680813          	addi	a6,a6,-1002 # 7078 <name>
+    446a:	6388                	ld	a0,0(a5)
+    446c:	678c                	ld	a1,8(a5)
+    446e:	6b90                	ld	a2,16(a5)
+    4470:	6f94                	ld	a3,24(a5)
+    4472:	e308                	sd	a0,0(a4)
+    4474:	e70c                	sd	a1,8(a4)
+    4476:	eb10                	sd	a2,16(a4)
+    4478:	ef14                	sd	a3,24(a4)
+    447a:	02078793          	addi	a5,a5,32
+    447e:	02070713          	addi	a4,a4,32
+    4482:	ff0794e3          	bne	a5,a6,446a <main+0x4a>
+          exit(1);
+      }
+    }
+  }
+
+  printf("usertests starting\n");
+    4486:	00002517          	auipc	a0,0x2
+    448a:	55a50513          	addi	a0,a0,1370 # 69e0 <malloc+0x1c60>
+    448e:	00001097          	auipc	ra,0x1
+    4492:	83a080e7          	jalr	-1990(ra) # 4cc8 <printf>
+  int free0 = countfree();
+    4496:	00000097          	auipc	ra,0x0
+    449a:	dba080e7          	jalr	-582(ra) # 4250 <countfree>
+    449e:	8a2a                	mv	s4,a0
+  int free1 = 0;
+  int fail = 0;
+  for (struct test *t = tests; t->s != 0; t++) {
+    44a0:	c8843503          	ld	a0,-888(s0)
+    44a4:	c8040493          	addi	s1,s0,-896
+  int fail = 0;
+    44a8:	4981                	li	s3,0
+    if((justone == 0) || strcmp(t->s, justone) == 0) {
+      if(!run(t->f, t->s))
+        fail = 1;
+    44aa:	4a85                	li	s5,1
+  for (struct test *t = tests; t->s != 0; t++) {
+    44ac:	e55d                	bnez	a0,455a <main+0x13a>
+  }
+
+  if(fail){
+    printf("SOME TESTS FAILED\n");
+    exit(1);
+  } else if((free1 = countfree()) < free0){
+    44ae:	00000097          	auipc	ra,0x0
+    44b2:	da2080e7          	jalr	-606(ra) # 4250 <countfree>
+    44b6:	85aa                	mv	a1,a0
+    44b8:	0f455163          	bge	a0,s4,459a <main+0x17a>
+    printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0);
+    44bc:	8652                	mv	a2,s4
+    44be:	00002517          	auipc	a0,0x2
+    44c2:	4da50513          	addi	a0,a0,1242 # 6998 <malloc+0x1c18>
+    44c6:	00001097          	auipc	ra,0x1
+    44ca:	802080e7          	jalr	-2046(ra) # 4cc8 <printf>
+    exit(1);
+    44ce:	4505                	li	a0,1
+    44d0:	00000097          	auipc	ra,0x0
+    44d4:	434080e7          	jalr	1076(ra) # 4904 <exit>
+    44d8:	84ae                	mv	s1,a1
+  if(argc == 2 && strcmp(argv[1], "-c") == 0){
+    44da:	00002597          	auipc	a1,0x2
+    44de:	45658593          	addi	a1,a1,1110 # 6930 <malloc+0x1bb0>
+    44e2:	6488                	ld	a0,8(s1)
+    44e4:	00000097          	auipc	ra,0x0
+    44e8:	1b2080e7          	jalr	434(ra) # 4696 <strcmp>
+    44ec:	10050563          	beqz	a0,45f6 <main+0x1d6>
+  } else if(argc == 2 && strcmp(argv[1], "-C") == 0){
+    44f0:	00002597          	auipc	a1,0x2
+    44f4:	52858593          	addi	a1,a1,1320 # 6a18 <malloc+0x1c98>
+    44f8:	6488                	ld	a0,8(s1)
+    44fa:	00000097          	auipc	ra,0x0
+    44fe:	19c080e7          	jalr	412(ra) # 4696 <strcmp>
+    4502:	c97d                	beqz	a0,45f8 <main+0x1d8>
+  } else if(argc == 2 && argv[1][0] != '-'){
+    4504:	0084b903          	ld	s2,8(s1)
+    4508:	00094703          	lbu	a4,0(s2)
+    450c:	02d00793          	li	a5,45
+    4510:	f4f713e3          	bne	a4,a5,4456 <main+0x36>
+    printf("Usage: usertests [-c] [testname]\n");
+    4514:	00002517          	auipc	a0,0x2
+    4518:	42450513          	addi	a0,a0,1060 # 6938 <malloc+0x1bb8>
+    451c:	00000097          	auipc	ra,0x0
+    4520:	7ac080e7          	jalr	1964(ra) # 4cc8 <printf>
+    exit(1);
+    4524:	4505                	li	a0,1
+    4526:	00000097          	auipc	ra,0x0
+    452a:	3de080e7          	jalr	990(ra) # 4904 <exit>
+          exit(1);
+    452e:	4505                	li	a0,1
+    4530:	00000097          	auipc	ra,0x0
+    4534:	3d4080e7          	jalr	980(ra) # 4904 <exit>
+        printf("FAILED -- lost %d free pages\n", free0 - free1);
+    4538:	40a905bb          	subw	a1,s2,a0
+    453c:	855a                	mv	a0,s6
+    453e:	00000097          	auipc	ra,0x0
+    4542:	78a080e7          	jalr	1930(ra) # 4cc8 <printf>
+        if(continuous != 2)
+    4546:	09498463          	beq	s3,s4,45ce <main+0x1ae>
+          exit(1);
+    454a:	4505                	li	a0,1
+    454c:	00000097          	auipc	ra,0x0
+    4550:	3b8080e7          	jalr	952(ra) # 4904 <exit>
+  for (struct test *t = tests; t->s != 0; t++) {
+    4554:	04c1                	addi	s1,s1,16
+    4556:	6488                	ld	a0,8(s1)
+    4558:	c115                	beqz	a0,457c <main+0x15c>
+    if((justone == 0) || strcmp(t->s, justone) == 0) {
+    455a:	00090863          	beqz	s2,456a <main+0x14a>
+    455e:	85ca                	mv	a1,s2
+    4560:	00000097          	auipc	ra,0x0
+    4564:	136080e7          	jalr	310(ra) # 4696 <strcmp>
+    4568:	f575                	bnez	a0,4554 <main+0x134>
+      if(!run(t->f, t->s))
+    456a:	648c                	ld	a1,8(s1)
+    456c:	6088                	ld	a0,0(s1)
+    456e:	00000097          	auipc	ra,0x0
+    4572:	e14080e7          	jalr	-492(ra) # 4382 <run>
+    4576:	fd79                	bnez	a0,4554 <main+0x134>
+        fail = 1;
+    4578:	89d6                	mv	s3,s5
+    457a:	bfe9                	j	4554 <main+0x134>
+  if(fail){
+    457c:	f20989e3          	beqz	s3,44ae <main+0x8e>
+    printf("SOME TESTS FAILED\n");
+    4580:	00002517          	auipc	a0,0x2
+    4584:	40050513          	addi	a0,a0,1024 # 6980 <malloc+0x1c00>
+    4588:	00000097          	auipc	ra,0x0
+    458c:	740080e7          	jalr	1856(ra) # 4cc8 <printf>
+    exit(1);
+    4590:	4505                	li	a0,1
+    4592:	00000097          	auipc	ra,0x0
+    4596:	372080e7          	jalr	882(ra) # 4904 <exit>
+  } else {
+    printf("ALL TESTS PASSED\n");
+    459a:	00002517          	auipc	a0,0x2
+    459e:	42e50513          	addi	a0,a0,1070 # 69c8 <malloc+0x1c48>
+    45a2:	00000097          	auipc	ra,0x0
+    45a6:	726080e7          	jalr	1830(ra) # 4cc8 <printf>
+    exit(0);
+    45aa:	4501                	li	a0,0
+    45ac:	00000097          	auipc	ra,0x0
+    45b0:	358080e7          	jalr	856(ra) # 4904 <exit>
+        printf("SOME TESTS FAILED\n");
+    45b4:	8556                	mv	a0,s5
+    45b6:	00000097          	auipc	ra,0x0
+    45ba:	712080e7          	jalr	1810(ra) # 4cc8 <printf>
+        if(continuous != 2)
+    45be:	f74998e3          	bne	s3,s4,452e <main+0x10e>
+      int free1 = countfree();
+    45c2:	00000097          	auipc	ra,0x0
+    45c6:	c8e080e7          	jalr	-882(ra) # 4250 <countfree>
+      if(free1 < free0){
+    45ca:	f72547e3          	blt	a0,s2,4538 <main+0x118>
+      int free0 = countfree();
+    45ce:	00000097          	auipc	ra,0x0
+    45d2:	c82080e7          	jalr	-894(ra) # 4250 <countfree>
+    45d6:	892a                	mv	s2,a0
+      for (struct test *t = tests; t->s != 0; t++) {
+    45d8:	c8843583          	ld	a1,-888(s0)
+    45dc:	d1fd                	beqz	a1,45c2 <main+0x1a2>
+    45de:	c8040493          	addi	s1,s0,-896
+        if(!run(t->f, t->s)){
+    45e2:	6088                	ld	a0,0(s1)
+    45e4:	00000097          	auipc	ra,0x0
+    45e8:	d9e080e7          	jalr	-610(ra) # 4382 <run>
+    45ec:	d561                	beqz	a0,45b4 <main+0x194>
+      for (struct test *t = tests; t->s != 0; t++) {
+    45ee:	04c1                	addi	s1,s1,16
+    45f0:	648c                	ld	a1,8(s1)
+    45f2:	f9e5                	bnez	a1,45e2 <main+0x1c2>
+    45f4:	b7f9                	j	45c2 <main+0x1a2>
+    continuous = 1;
+    45f6:	4985                	li	s3,1
+  } tests[] = {
+    45f8:	00002797          	auipc	a5,0x2
+    45fc:	74078793          	addi	a5,a5,1856 # 6d38 <randstate+0x8>
+    4600:	c8040713          	addi	a4,s0,-896
+    4604:	00003817          	auipc	a6,0x3
+    4608:	a7480813          	addi	a6,a6,-1420 # 7078 <name>
+    460c:	6388                	ld	a0,0(a5)
+    460e:	678c                	ld	a1,8(a5)
+    4610:	6b90                	ld	a2,16(a5)
+    4612:	6f94                	ld	a3,24(a5)
+    4614:	e308                	sd	a0,0(a4)
+    4616:	e70c                	sd	a1,8(a4)
+    4618:	eb10                	sd	a2,16(a4)
+    461a:	ef14                	sd	a3,24(a4)
+    461c:	02078793          	addi	a5,a5,32
+    4620:	02070713          	addi	a4,a4,32
+    4624:	ff0794e3          	bne	a5,a6,460c <main+0x1ec>
+    printf("continuous usertests starting\n");
+    4628:	00002517          	auipc	a0,0x2
+    462c:	3d050513          	addi	a0,a0,976 # 69f8 <malloc+0x1c78>
+    4630:	00000097          	auipc	ra,0x0
+    4634:	698080e7          	jalr	1688(ra) # 4cc8 <printf>
+        printf("SOME TESTS FAILED\n");
+    4638:	00002a97          	auipc	s5,0x2
+    463c:	348a8a93          	addi	s5,s5,840 # 6980 <malloc+0x1c00>
+        if(continuous != 2)
+    4640:	4a09                	li	s4,2
+        printf("FAILED -- lost %d free pages\n", free0 - free1);
+    4642:	00002b17          	auipc	s6,0x2
+    4646:	31eb0b13          	addi	s6,s6,798 # 6960 <malloc+0x1be0>
+    464a:	b751                	j	45ce <main+0x1ae>
+
+000000000000464c <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+    464c:	1141                	addi	sp,sp,-16
+    464e:	e422                	sd	s0,8(sp)
+    4650:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+    4652:	87aa                	mv	a5,a0
+    4654:	0585                	addi	a1,a1,1
+    4656:	0785                	addi	a5,a5,1
+    4658:	fff5c703          	lbu	a4,-1(a1)
+    465c:	fee78fa3          	sb	a4,-1(a5)
+    4660:	fb75                	bnez	a4,4654 <strcpy+0x8>
+    ;
+  return os;
+}
+    4662:	6422                	ld	s0,8(sp)
+    4664:	0141                	addi	sp,sp,16
+    4666:	8082                	ret
+
+0000000000004668 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+    4668:	1141                	addi	sp,sp,-16
+    466a:	e422                	sd	s0,8(sp)
+    466c:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+    466e:	00054783          	lbu	a5,0(a0)
+    4672:	c385                	beqz	a5,4692 <strcat+0x2a>
+    4674:	87aa                	mv	a5,a0
+    s++;
+    4676:	0785                	addi	a5,a5,1
+  while(*s)
+    4678:	0007c703          	lbu	a4,0(a5)
+    467c:	ff6d                	bnez	a4,4676 <strcat+0xe>
+  while((*s++ = *t++))
+    467e:	0585                	addi	a1,a1,1
+    4680:	0785                	addi	a5,a5,1
+    4682:	fff5c703          	lbu	a4,-1(a1)
+    4686:	fee78fa3          	sb	a4,-1(a5)
+    468a:	fb75                	bnez	a4,467e <strcat+0x16>
+    ;
+  return os;
+}
+    468c:	6422                	ld	s0,8(sp)
+    468e:	0141                	addi	sp,sp,16
+    4690:	8082                	ret
+  while(*s)
+    4692:	87aa                	mv	a5,a0
+    4694:	b7ed                	j	467e <strcat+0x16>
+
+0000000000004696 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+    4696:	1141                	addi	sp,sp,-16
+    4698:	e422                	sd	s0,8(sp)
+    469a:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+    469c:	00054783          	lbu	a5,0(a0)
+    46a0:	cb91                	beqz	a5,46b4 <strcmp+0x1e>
+    46a2:	0005c703          	lbu	a4,0(a1)
+    46a6:	00f71763          	bne	a4,a5,46b4 <strcmp+0x1e>
+    p++, q++;
+    46aa:	0505                	addi	a0,a0,1
+    46ac:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+    46ae:	00054783          	lbu	a5,0(a0)
+    46b2:	fbe5                	bnez	a5,46a2 <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+    46b4:	0005c503          	lbu	a0,0(a1)
+}
+    46b8:	40a7853b          	subw	a0,a5,a0
+    46bc:	6422                	ld	s0,8(sp)
+    46be:	0141                	addi	sp,sp,16
+    46c0:	8082                	ret
+
+00000000000046c2 <strlen>:
+
+uint
+strlen(const char *s)
+{
+    46c2:	1141                	addi	sp,sp,-16
+    46c4:	e422                	sd	s0,8(sp)
+    46c6:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+    46c8:	00054783          	lbu	a5,0(a0)
+    46cc:	cf91                	beqz	a5,46e8 <strlen+0x26>
+    46ce:	0505                	addi	a0,a0,1
+    46d0:	87aa                	mv	a5,a0
+    46d2:	4685                	li	a3,1
+    46d4:	9e89                	subw	a3,a3,a0
+    46d6:	00f6853b          	addw	a0,a3,a5
+    46da:	0785                	addi	a5,a5,1
+    46dc:	fff7c703          	lbu	a4,-1(a5)
+    46e0:	fb7d                	bnez	a4,46d6 <strlen+0x14>
+    ;
+  return n;
+}
+    46e2:	6422                	ld	s0,8(sp)
+    46e4:	0141                	addi	sp,sp,16
+    46e6:	8082                	ret
+  for(n = 0; s[n]; n++)
+    46e8:	4501                	li	a0,0
+    46ea:	bfe5                	j	46e2 <strlen+0x20>
+
+00000000000046ec <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+    46ec:	1141                	addi	sp,sp,-16
+    46ee:	e422                	sd	s0,8(sp)
+    46f0:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+    46f2:	ca19                	beqz	a2,4708 <memset+0x1c>
+    46f4:	87aa                	mv	a5,a0
+    46f6:	1602                	slli	a2,a2,0x20
+    46f8:	9201                	srli	a2,a2,0x20
+    46fa:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+    46fe:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+    4702:	0785                	addi	a5,a5,1
+    4704:	fee79de3          	bne	a5,a4,46fe <memset+0x12>
+  }
+  return dst;
+}
+    4708:	6422                	ld	s0,8(sp)
+    470a:	0141                	addi	sp,sp,16
+    470c:	8082                	ret
+
+000000000000470e <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+    470e:	1141                	addi	sp,sp,-16
+    4710:	e422                	sd	s0,8(sp)
+    4712:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+    4714:	00054783          	lbu	a5,0(a0)
+    4718:	cb99                	beqz	a5,472e <strchr+0x20>
+    if(*s == c)
+    471a:	00f58763          	beq	a1,a5,4728 <strchr+0x1a>
+  for(; *s; s++)
+    471e:	0505                	addi	a0,a0,1
+    4720:	00054783          	lbu	a5,0(a0)
+    4724:	fbfd                	bnez	a5,471a <strchr+0xc>
+      return (char*)s;
+  return 0;
+    4726:	4501                	li	a0,0
+}
+    4728:	6422                	ld	s0,8(sp)
+    472a:	0141                	addi	sp,sp,16
+    472c:	8082                	ret
+  return 0;
+    472e:	4501                	li	a0,0
+    4730:	bfe5                	j	4728 <strchr+0x1a>
+
+0000000000004732 <gets>:
+
+char*
+gets(char *buf, int max)
+{
+    4732:	711d                	addi	sp,sp,-96
+    4734:	ec86                	sd	ra,88(sp)
+    4736:	e8a2                	sd	s0,80(sp)
+    4738:	e4a6                	sd	s1,72(sp)
+    473a:	e0ca                	sd	s2,64(sp)
+    473c:	fc4e                	sd	s3,56(sp)
+    473e:	f852                	sd	s4,48(sp)
+    4740:	f456                	sd	s5,40(sp)
+    4742:	f05a                	sd	s6,32(sp)
+    4744:	ec5e                	sd	s7,24(sp)
+    4746:	e862                	sd	s8,16(sp)
+    4748:	1080                	addi	s0,sp,96
+    474a:	8baa                	mv	s7,a0
+    474c:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+    474e:	892a                	mv	s2,a0
+    4750:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+    4752:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+    4756:	4b29                	li	s6,10
+    4758:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+    475a:	89a6                	mv	s3,s1
+    475c:	2485                	addiw	s1,s1,1
+    475e:	0344d763          	bge	s1,s4,478c <gets+0x5a>
+    cc = read(0, &c, 1);
+    4762:	4605                	li	a2,1
+    4764:	85d6                	mv	a1,s5
+    4766:	4501                	li	a0,0
+    4768:	00000097          	auipc	ra,0x0
+    476c:	1b8080e7          	jalr	440(ra) # 4920 <read>
+    if(cc < 1)
+    4770:	00a05e63          	blez	a0,478c <gets+0x5a>
+    buf[i++] = c;
+    4774:	faf44783          	lbu	a5,-81(s0)
+    4778:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+    477c:	01678763          	beq	a5,s6,478a <gets+0x58>
+    4780:	0905                	addi	s2,s2,1
+    4782:	fd879ce3          	bne	a5,s8,475a <gets+0x28>
+  for(i=0; i+1 < max; ){
+    4786:	89a6                	mv	s3,s1
+    4788:	a011                	j	478c <gets+0x5a>
+    478a:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+    478c:	99de                	add	s3,s3,s7
+    478e:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+    4792:	855e                	mv	a0,s7
+    4794:	60e6                	ld	ra,88(sp)
+    4796:	6446                	ld	s0,80(sp)
+    4798:	64a6                	ld	s1,72(sp)
+    479a:	6906                	ld	s2,64(sp)
+    479c:	79e2                	ld	s3,56(sp)
+    479e:	7a42                	ld	s4,48(sp)
+    47a0:	7aa2                	ld	s5,40(sp)
+    47a2:	7b02                	ld	s6,32(sp)
+    47a4:	6be2                	ld	s7,24(sp)
+    47a6:	6c42                	ld	s8,16(sp)
+    47a8:	6125                	addi	sp,sp,96
+    47aa:	8082                	ret
+
+00000000000047ac <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+    47ac:	1101                	addi	sp,sp,-32
+    47ae:	ec06                	sd	ra,24(sp)
+    47b0:	e822                	sd	s0,16(sp)
+    47b2:	e426                	sd	s1,8(sp)
+    47b4:	e04a                	sd	s2,0(sp)
+    47b6:	1000                	addi	s0,sp,32
+    47b8:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+    47ba:	4581                	li	a1,0
+    47bc:	00000097          	auipc	ra,0x0
+    47c0:	194080e7          	jalr	404(ra) # 4950 <open>
+  if(fd < 0)
+    47c4:	02054563          	bltz	a0,47ee <stat+0x42>
+    47c8:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+    47ca:	85ca                	mv	a1,s2
+    47cc:	00000097          	auipc	ra,0x0
+    47d0:	18e080e7          	jalr	398(ra) # 495a <fstat>
+    47d4:	892a                	mv	s2,a0
+  close(fd);
+    47d6:	8526                	mv	a0,s1
+    47d8:	00000097          	auipc	ra,0x0
+    47dc:	15c080e7          	jalr	348(ra) # 4934 <close>
+  return r;
+}
+    47e0:	854a                	mv	a0,s2
+    47e2:	60e2                	ld	ra,24(sp)
+    47e4:	6442                	ld	s0,16(sp)
+    47e6:	64a2                	ld	s1,8(sp)
+    47e8:	6902                	ld	s2,0(sp)
+    47ea:	6105                	addi	sp,sp,32
+    47ec:	8082                	ret
+    return -1;
+    47ee:	597d                	li	s2,-1
+    47f0:	bfc5                	j	47e0 <stat+0x34>
+
+00000000000047f2 <atoi>:
+
+int
+atoi(const char *s)
+{
+    47f2:	1141                	addi	sp,sp,-16
+    47f4:	e422                	sd	s0,8(sp)
+    47f6:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+    47f8:	00054703          	lbu	a4,0(a0)
+    47fc:	02d00793          	li	a5,45
+  int neg = 1;
+    4800:	4585                	li	a1,1
+  if (*s == '-') {
+    4802:	04f70363          	beq	a4,a5,4848 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+    4806:	00054703          	lbu	a4,0(a0)
+    480a:	fd07079b          	addiw	a5,a4,-48
+    480e:	0ff7f793          	zext.b	a5,a5
+    4812:	46a5                	li	a3,9
+    4814:	02f6ed63          	bltu	a3,a5,484e <atoi+0x5c>
+  n = 0;
+    4818:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+    481a:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+    481c:	0505                	addi	a0,a0,1
+    481e:	0026979b          	slliw	a5,a3,0x2
+    4822:	9fb5                	addw	a5,a5,a3
+    4824:	0017979b          	slliw	a5,a5,0x1
+    4828:	9fb9                	addw	a5,a5,a4
+    482a:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+    482e:	00054703          	lbu	a4,0(a0)
+    4832:	fd07079b          	addiw	a5,a4,-48
+    4836:	0ff7f793          	zext.b	a5,a5
+    483a:	fef671e3          	bgeu	a2,a5,481c <atoi+0x2a>
+  return n * neg;
+}
+    483e:	02d5853b          	mulw	a0,a1,a3
+    4842:	6422                	ld	s0,8(sp)
+    4844:	0141                	addi	sp,sp,16
+    4846:	8082                	ret
+    s++;
+    4848:	0505                	addi	a0,a0,1
+    neg = -1;
+    484a:	55fd                	li	a1,-1
+    484c:	bf6d                	j	4806 <atoi+0x14>
+  n = 0;
+    484e:	4681                	li	a3,0
+    4850:	b7fd                	j	483e <atoi+0x4c>
+
+0000000000004852 <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+    4852:	1141                	addi	sp,sp,-16
+    4854:	e422                	sd	s0,8(sp)
+    4856:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+    4858:	02b57463          	bgeu	a0,a1,4880 <memmove+0x2e>
+    while(n-- > 0)
+    485c:	00c05f63          	blez	a2,487a <memmove+0x28>
+    4860:	1602                	slli	a2,a2,0x20
+    4862:	9201                	srli	a2,a2,0x20
+    4864:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+    4868:	872a                	mv	a4,a0
+      *dst++ = *src++;
+    486a:	0585                	addi	a1,a1,1
+    486c:	0705                	addi	a4,a4,1
+    486e:	fff5c683          	lbu	a3,-1(a1)
+    4872:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+    4876:	fee79ae3          	bne	a5,a4,486a <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+    487a:	6422                	ld	s0,8(sp)
+    487c:	0141                	addi	sp,sp,16
+    487e:	8082                	ret
+    dst += n;
+    4880:	00c50733          	add	a4,a0,a2
+    src += n;
+    4884:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+    4886:	fec05ae3          	blez	a2,487a <memmove+0x28>
+    488a:	fff6079b          	addiw	a5,a2,-1
+    488e:	1782                	slli	a5,a5,0x20
+    4890:	9381                	srli	a5,a5,0x20
+    4892:	fff7c793          	not	a5,a5
+    4896:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+    4898:	15fd                	addi	a1,a1,-1
+    489a:	177d                	addi	a4,a4,-1
+    489c:	0005c683          	lbu	a3,0(a1)
+    48a0:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+    48a4:	fee79ae3          	bne	a5,a4,4898 <memmove+0x46>
+    48a8:	bfc9                	j	487a <memmove+0x28>
+
+00000000000048aa <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+    48aa:	1141                	addi	sp,sp,-16
+    48ac:	e422                	sd	s0,8(sp)
+    48ae:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+    48b0:	ca05                	beqz	a2,48e0 <memcmp+0x36>
+    48b2:	fff6069b          	addiw	a3,a2,-1
+    48b6:	1682                	slli	a3,a3,0x20
+    48b8:	9281                	srli	a3,a3,0x20
+    48ba:	0685                	addi	a3,a3,1
+    48bc:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+    48be:	00054783          	lbu	a5,0(a0)
+    48c2:	0005c703          	lbu	a4,0(a1)
+    48c6:	00e79863          	bne	a5,a4,48d6 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+    48ca:	0505                	addi	a0,a0,1
+    p2++;
+    48cc:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+    48ce:	fed518e3          	bne	a0,a3,48be <memcmp+0x14>
+  }
+  return 0;
+    48d2:	4501                	li	a0,0
+    48d4:	a019                	j	48da <memcmp+0x30>
+      return *p1 - *p2;
+    48d6:	40e7853b          	subw	a0,a5,a4
+}
+    48da:	6422                	ld	s0,8(sp)
+    48dc:	0141                	addi	sp,sp,16
+    48de:	8082                	ret
+  return 0;
+    48e0:	4501                	li	a0,0
+    48e2:	bfe5                	j	48da <memcmp+0x30>
+
+00000000000048e4 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+    48e4:	1141                	addi	sp,sp,-16
+    48e6:	e406                	sd	ra,8(sp)
+    48e8:	e022                	sd	s0,0(sp)
+    48ea:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+    48ec:	00000097          	auipc	ra,0x0
+    48f0:	f66080e7          	jalr	-154(ra) # 4852 <memmove>
+}
+    48f4:	60a2                	ld	ra,8(sp)
+    48f6:	6402                	ld	s0,0(sp)
+    48f8:	0141                	addi	sp,sp,16
+    48fa:	8082                	ret
+
+00000000000048fc <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+    48fc:	4885                	li	a7,1
+ ecall
+    48fe:	00000073          	ecall
+ ret
+    4902:	8082                	ret
+
+0000000000004904 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+    4904:	05d00893          	li	a7,93
+ ecall
+    4908:	00000073          	ecall
+ ret
+    490c:	8082                	ret
+
+000000000000490e <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+    490e:	488d                	li	a7,3
+ ecall
+    4910:	00000073          	ecall
+ ret
+    4914:	8082                	ret
+
+0000000000004916 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+    4916:	03b00893          	li	a7,59
+ ecall
+    491a:	00000073          	ecall
+ ret
+    491e:	8082                	ret
+
+0000000000004920 <read>:
+.global read
+read:
+ li a7, SYS_read
+    4920:	03f00893          	li	a7,63
+ ecall
+    4924:	00000073          	ecall
+ ret
+    4928:	8082                	ret
+
+000000000000492a <write>:
+.global write
+write:
+ li a7, SYS_write
+    492a:	04000893          	li	a7,64
+ ecall
+    492e:	00000073          	ecall
+ ret
+    4932:	8082                	ret
+
+0000000000004934 <close>:
+.global close
+close:
+ li a7, SYS_close
+    4934:	03900893          	li	a7,57
+ ecall
+    4938:	00000073          	ecall
+ ret
+    493c:	8082                	ret
+
+000000000000493e <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+    493e:	4899                	li	a7,6
+ ecall
+    4940:	00000073          	ecall
+ ret
+    4944:	8082                	ret
+
+0000000000004946 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+    4946:	0dd00893          	li	a7,221
+ ecall
+    494a:	00000073          	ecall
+ ret
+    494e:	8082                	ret
+
+0000000000004950 <open>:
+.global open
+open:
+ li a7, SYS_open
+    4950:	03800893          	li	a7,56
+ ecall
+    4954:	00000073          	ecall
+ ret
+    4958:	8082                	ret
+
+000000000000495a <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+    495a:	05000893          	li	a7,80
+ ecall
+    495e:	00000073          	ecall
+ ret
+    4962:	8082                	ret
+
+0000000000004964 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+    4964:	02200893          	li	a7,34
+ ecall
+    4968:	00000073          	ecall
+ ret
+    496c:	8082                	ret
+
+000000000000496e <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+    496e:	03100893          	li	a7,49
+ ecall
+    4972:	00000073          	ecall
+ ret
+    4976:	8082                	ret
+
+0000000000004978 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+    4978:	48dd                	li	a7,23
+ ecall
+    497a:	00000073          	ecall
+ ret
+    497e:	8082                	ret
+
+0000000000004980 <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+    4980:	0ac00893          	li	a7,172
+ ecall
+    4984:	00000073          	ecall
+ ret
+    4988:	8082                	ret
+
+000000000000498a <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+    498a:	48b1                	li	a7,12
+ ecall
+    498c:	00000073          	ecall
+ ret
+    4990:	8082                	ret
+
+0000000000004992 <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+    4992:	48b5                	li	a7,13
+ ecall
+    4994:	00000073          	ecall
+ ret
+    4998:	8082                	ret
+
+000000000000499a <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+    499a:	48b9                	li	a7,14
+ ecall
+    499c:	00000073          	ecall
+ ret
+    49a0:	8082                	ret
+
+00000000000049a2 <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+    49a2:	48d9                	li	a7,22
+ ecall
+    49a4:	00000073          	ecall
+ ret
+    49a8:	8082                	ret
+
+00000000000049aa <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+    49aa:	03200893          	li	a7,50
+ ecall
+    49ae:	00000073          	ecall
+ ret
+    49b2:	8082                	ret
+
+00000000000049b4 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+    49b4:	48ed                	li	a7,27
+ ecall
+    49b6:	00000073          	ecall
+ ret
+    49ba:	8082                	ret
+
+00000000000049bc <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+    49bc:	48c5                	li	a7,17
+ ecall
+    49be:	00000073          	ecall
+ ret
+    49c2:	8082                	ret
+
+00000000000049c4 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+    49c4:	07500893          	li	a7,117
+ ecall
+    49c8:	00000073          	ecall
+ ret
+    49cc:	8082                	ret
+
+00000000000049ce <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+    49ce:	48c9                	li	a7,18
+ ecall
+    49d0:	00000073          	ecall
+ ret
+    49d4:	8082                	ret
+
+00000000000049d6 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+    49d6:	48cd                	li	a7,19
+ ecall
+    49d8:	00000073          	ecall
+ ret
+    49dc:	8082                	ret
+
+00000000000049de <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+    49de:	48e9                	li	a7,26
+ ecall
+    49e0:	00000073          	ecall
+ ret
+    49e4:	8082                	ret
+
+00000000000049e6 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+    49e6:	0d200893          	li	a7,210
+ ecall
+    49ea:	00000073          	ecall
+ ret
+    49ee:	8082                	ret
+
+00000000000049f0 <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+    49f0:	1101                	addi	sp,sp,-32
+    49f2:	ec06                	sd	ra,24(sp)
+    49f4:	e822                	sd	s0,16(sp)
+    49f6:	1000                	addi	s0,sp,32
+    49f8:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+    49fc:	4605                	li	a2,1
+    49fe:	fef40593          	addi	a1,s0,-17
+    4a02:	00000097          	auipc	ra,0x0
+    4a06:	f28080e7          	jalr	-216(ra) # 492a <write>
+}
+    4a0a:	60e2                	ld	ra,24(sp)
+    4a0c:	6442                	ld	s0,16(sp)
+    4a0e:	6105                	addi	sp,sp,32
+    4a10:	8082                	ret
+
+0000000000004a12 <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+    4a12:	7139                	addi	sp,sp,-64
+    4a14:	fc06                	sd	ra,56(sp)
+    4a16:	f822                	sd	s0,48(sp)
+    4a18:	f426                	sd	s1,40(sp)
+    4a1a:	f04a                	sd	s2,32(sp)
+    4a1c:	ec4e                	sd	s3,24(sp)
+    4a1e:	0080                	addi	s0,sp,64
+    4a20:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+    4a22:	c299                	beqz	a3,4a28 <printint+0x16>
+    4a24:	0805c863          	bltz	a1,4ab4 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+    4a28:	2581                	sext.w	a1,a1
+  neg = 0;
+    4a2a:	4881                	li	a7,0
+  }
+
+  i = 0;
+    4a2c:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+    4a30:	86ce                	mv	a3,s3
+  i = 0;
+    4a32:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+    4a34:	2601                	sext.w	a2,a2
+    4a36:	00002517          	auipc	a0,0x2
+    4a3a:	2c250513          	addi	a0,a0,706 # 6cf8 <digits>
+    4a3e:	883a                	mv	a6,a4
+    4a40:	2705                	addiw	a4,a4,1
+    4a42:	02c5f7bb          	remuw	a5,a1,a2
+    4a46:	1782                	slli	a5,a5,0x20
+    4a48:	9381                	srli	a5,a5,0x20
+    4a4a:	97aa                	add	a5,a5,a0
+    4a4c:	0007c783          	lbu	a5,0(a5)
+    4a50:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+    4a54:	0005879b          	sext.w	a5,a1
+    4a58:	02c5d5bb          	divuw	a1,a1,a2
+    4a5c:	0685                	addi	a3,a3,1
+    4a5e:	fec7f0e3          	bgeu	a5,a2,4a3e <printint+0x2c>
+  if(neg)
+    4a62:	00088c63          	beqz	a7,4a7a <printint+0x68>
+    buf[i++] = '-';
+    4a66:	fd070793          	addi	a5,a4,-48
+    4a6a:	00878733          	add	a4,a5,s0
+    4a6e:	02d00793          	li	a5,45
+    4a72:	fef70823          	sb	a5,-16(a4)
+    4a76:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+    4a7a:	02e05663          	blez	a4,4aa6 <printint+0x94>
+    4a7e:	fc040913          	addi	s2,s0,-64
+    4a82:	993a                	add	s2,s2,a4
+    4a84:	19fd                	addi	s3,s3,-1
+    4a86:	99ba                	add	s3,s3,a4
+    4a88:	377d                	addiw	a4,a4,-1
+    4a8a:	1702                	slli	a4,a4,0x20
+    4a8c:	9301                	srli	a4,a4,0x20
+    4a8e:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+    4a92:	fff94583          	lbu	a1,-1(s2)
+    4a96:	8526                	mv	a0,s1
+    4a98:	00000097          	auipc	ra,0x0
+    4a9c:	f58080e7          	jalr	-168(ra) # 49f0 <putc>
+  while(--i >= 0)
+    4aa0:	197d                	addi	s2,s2,-1
+    4aa2:	ff3918e3          	bne	s2,s3,4a92 <printint+0x80>
+}
+    4aa6:	70e2                	ld	ra,56(sp)
+    4aa8:	7442                	ld	s0,48(sp)
+    4aaa:	74a2                	ld	s1,40(sp)
+    4aac:	7902                	ld	s2,32(sp)
+    4aae:	69e2                	ld	s3,24(sp)
+    4ab0:	6121                	addi	sp,sp,64
+    4ab2:	8082                	ret
+    x = -xx;
+    4ab4:	40b005bb          	negw	a1,a1
+    neg = 1;
+    4ab8:	4885                	li	a7,1
+    x = -xx;
+    4aba:	bf8d                	j	4a2c <printint+0x1a>
+
+0000000000004abc <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+    4abc:	7119                	addi	sp,sp,-128
+    4abe:	fc86                	sd	ra,120(sp)
+    4ac0:	f8a2                	sd	s0,112(sp)
+    4ac2:	f4a6                	sd	s1,104(sp)
+    4ac4:	f0ca                	sd	s2,96(sp)
+    4ac6:	ecce                	sd	s3,88(sp)
+    4ac8:	e8d2                	sd	s4,80(sp)
+    4aca:	e4d6                	sd	s5,72(sp)
+    4acc:	e0da                	sd	s6,64(sp)
+    4ace:	fc5e                	sd	s7,56(sp)
+    4ad0:	f862                	sd	s8,48(sp)
+    4ad2:	f466                	sd	s9,40(sp)
+    4ad4:	f06a                	sd	s10,32(sp)
+    4ad6:	ec6e                	sd	s11,24(sp)
+    4ad8:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+    4ada:	0005c903          	lbu	s2,0(a1)
+    4ade:	18090f63          	beqz	s2,4c7c <vprintf+0x1c0>
+    4ae2:	8aaa                	mv	s5,a0
+    4ae4:	8b32                	mv	s6,a2
+    4ae6:	00158493          	addi	s1,a1,1
+  state = 0;
+    4aea:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+    4aec:	02500a13          	li	s4,37
+    4af0:	4c55                	li	s8,21
+    4af2:	00002c97          	auipc	s9,0x2
+    4af6:	1aec8c93          	addi	s9,s9,430 # 6ca0 <malloc+0x1f20>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+    4afa:	02800d93          	li	s11,40
+  putc(fd, 'x');
+    4afe:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+    4b00:	00002b97          	auipc	s7,0x2
+    4b04:	1f8b8b93          	addi	s7,s7,504 # 6cf8 <digits>
+    4b08:	a839                	j	4b26 <vprintf+0x6a>
+        putc(fd, c);
+    4b0a:	85ca                	mv	a1,s2
+    4b0c:	8556                	mv	a0,s5
+    4b0e:	00000097          	auipc	ra,0x0
+    4b12:	ee2080e7          	jalr	-286(ra) # 49f0 <putc>
+    4b16:	a019                	j	4b1c <vprintf+0x60>
+    } else if(state == '%'){
+    4b18:	01498d63          	beq	s3,s4,4b32 <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+    4b1c:	0485                	addi	s1,s1,1
+    4b1e:	fff4c903          	lbu	s2,-1(s1)
+    4b22:	14090d63          	beqz	s2,4c7c <vprintf+0x1c0>
+    if(state == 0){
+    4b26:	fe0999e3          	bnez	s3,4b18 <vprintf+0x5c>
+      if(c == '%'){
+    4b2a:	ff4910e3          	bne	s2,s4,4b0a <vprintf+0x4e>
+        state = '%';
+    4b2e:	89d2                	mv	s3,s4
+    4b30:	b7f5                	j	4b1c <vprintf+0x60>
+      if(c == 'd'){
+    4b32:	11490c63          	beq	s2,s4,4c4a <vprintf+0x18e>
+    4b36:	f9d9079b          	addiw	a5,s2,-99
+    4b3a:	0ff7f793          	zext.b	a5,a5
+    4b3e:	10fc6e63          	bltu	s8,a5,4c5a <vprintf+0x19e>
+    4b42:	f9d9079b          	addiw	a5,s2,-99
+    4b46:	0ff7f713          	zext.b	a4,a5
+    4b4a:	10ec6863          	bltu	s8,a4,4c5a <vprintf+0x19e>
+    4b4e:	00271793          	slli	a5,a4,0x2
+    4b52:	97e6                	add	a5,a5,s9
+    4b54:	439c                	lw	a5,0(a5)
+    4b56:	97e6                	add	a5,a5,s9
+    4b58:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+    4b5a:	008b0913          	addi	s2,s6,8
+    4b5e:	4685                	li	a3,1
+    4b60:	4629                	li	a2,10
+    4b62:	000b2583          	lw	a1,0(s6)
+    4b66:	8556                	mv	a0,s5
+    4b68:	00000097          	auipc	ra,0x0
+    4b6c:	eaa080e7          	jalr	-342(ra) # 4a12 <printint>
+    4b70:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+    4b72:	4981                	li	s3,0
+    4b74:	b765                	j	4b1c <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+    4b76:	008b0913          	addi	s2,s6,8
+    4b7a:	4681                	li	a3,0
+    4b7c:	4629                	li	a2,10
+    4b7e:	000b2583          	lw	a1,0(s6)
+    4b82:	8556                	mv	a0,s5
+    4b84:	00000097          	auipc	ra,0x0
+    4b88:	e8e080e7          	jalr	-370(ra) # 4a12 <printint>
+    4b8c:	8b4a                	mv	s6,s2
+      state = 0;
+    4b8e:	4981                	li	s3,0
+    4b90:	b771                	j	4b1c <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+    4b92:	008b0913          	addi	s2,s6,8
+    4b96:	4681                	li	a3,0
+    4b98:	866a                	mv	a2,s10
+    4b9a:	000b2583          	lw	a1,0(s6)
+    4b9e:	8556                	mv	a0,s5
+    4ba0:	00000097          	auipc	ra,0x0
+    4ba4:	e72080e7          	jalr	-398(ra) # 4a12 <printint>
+    4ba8:	8b4a                	mv	s6,s2
+      state = 0;
+    4baa:	4981                	li	s3,0
+    4bac:	bf85                	j	4b1c <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+    4bae:	008b0793          	addi	a5,s6,8
+    4bb2:	f8f43423          	sd	a5,-120(s0)
+    4bb6:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+    4bba:	03000593          	li	a1,48
+    4bbe:	8556                	mv	a0,s5
+    4bc0:	00000097          	auipc	ra,0x0
+    4bc4:	e30080e7          	jalr	-464(ra) # 49f0 <putc>
+  putc(fd, 'x');
+    4bc8:	07800593          	li	a1,120
+    4bcc:	8556                	mv	a0,s5
+    4bce:	00000097          	auipc	ra,0x0
+    4bd2:	e22080e7          	jalr	-478(ra) # 49f0 <putc>
+    4bd6:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+    4bd8:	03c9d793          	srli	a5,s3,0x3c
+    4bdc:	97de                	add	a5,a5,s7
+    4bde:	0007c583          	lbu	a1,0(a5)
+    4be2:	8556                	mv	a0,s5
+    4be4:	00000097          	auipc	ra,0x0
+    4be8:	e0c080e7          	jalr	-500(ra) # 49f0 <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+    4bec:	0992                	slli	s3,s3,0x4
+    4bee:	397d                	addiw	s2,s2,-1
+    4bf0:	fe0914e3          	bnez	s2,4bd8 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+    4bf4:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+    4bf8:	4981                	li	s3,0
+    4bfa:	b70d                	j	4b1c <vprintf+0x60>
+        s = va_arg(ap, char*);
+    4bfc:	008b0913          	addi	s2,s6,8
+    4c00:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+    4c04:	02098163          	beqz	s3,4c26 <vprintf+0x16a>
+        while(*s != 0){
+    4c08:	0009c583          	lbu	a1,0(s3)
+    4c0c:	c5ad                	beqz	a1,4c76 <vprintf+0x1ba>
+          putc(fd, *s);
+    4c0e:	8556                	mv	a0,s5
+    4c10:	00000097          	auipc	ra,0x0
+    4c14:	de0080e7          	jalr	-544(ra) # 49f0 <putc>
+          s++;
+    4c18:	0985                	addi	s3,s3,1
+        while(*s != 0){
+    4c1a:	0009c583          	lbu	a1,0(s3)
+    4c1e:	f9e5                	bnez	a1,4c0e <vprintf+0x152>
+        s = va_arg(ap, char*);
+    4c20:	8b4a                	mv	s6,s2
+      state = 0;
+    4c22:	4981                	li	s3,0
+    4c24:	bde5                	j	4b1c <vprintf+0x60>
+          s = "(null)";
+    4c26:	00002997          	auipc	s3,0x2
+    4c2a:	07298993          	addi	s3,s3,114 # 6c98 <malloc+0x1f18>
+        while(*s != 0){
+    4c2e:	85ee                	mv	a1,s11
+    4c30:	bff9                	j	4c0e <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+    4c32:	008b0913          	addi	s2,s6,8
+    4c36:	000b4583          	lbu	a1,0(s6)
+    4c3a:	8556                	mv	a0,s5
+    4c3c:	00000097          	auipc	ra,0x0
+    4c40:	db4080e7          	jalr	-588(ra) # 49f0 <putc>
+    4c44:	8b4a                	mv	s6,s2
+      state = 0;
+    4c46:	4981                	li	s3,0
+    4c48:	bdd1                	j	4b1c <vprintf+0x60>
+        putc(fd, c);
+    4c4a:	85d2                	mv	a1,s4
+    4c4c:	8556                	mv	a0,s5
+    4c4e:	00000097          	auipc	ra,0x0
+    4c52:	da2080e7          	jalr	-606(ra) # 49f0 <putc>
+      state = 0;
+    4c56:	4981                	li	s3,0
+    4c58:	b5d1                	j	4b1c <vprintf+0x60>
+        putc(fd, '%');
+    4c5a:	85d2                	mv	a1,s4
+    4c5c:	8556                	mv	a0,s5
+    4c5e:	00000097          	auipc	ra,0x0
+    4c62:	d92080e7          	jalr	-622(ra) # 49f0 <putc>
+        putc(fd, c);
+    4c66:	85ca                	mv	a1,s2
+    4c68:	8556                	mv	a0,s5
+    4c6a:	00000097          	auipc	ra,0x0
+    4c6e:	d86080e7          	jalr	-634(ra) # 49f0 <putc>
+      state = 0;
+    4c72:	4981                	li	s3,0
+    4c74:	b565                	j	4b1c <vprintf+0x60>
+        s = va_arg(ap, char*);
+    4c76:	8b4a                	mv	s6,s2
+      state = 0;
+    4c78:	4981                	li	s3,0
+    4c7a:	b54d                	j	4b1c <vprintf+0x60>
+    }
+  }
+}
+    4c7c:	70e6                	ld	ra,120(sp)
+    4c7e:	7446                	ld	s0,112(sp)
+    4c80:	74a6                	ld	s1,104(sp)
+    4c82:	7906                	ld	s2,96(sp)
+    4c84:	69e6                	ld	s3,88(sp)
+    4c86:	6a46                	ld	s4,80(sp)
+    4c88:	6aa6                	ld	s5,72(sp)
+    4c8a:	6b06                	ld	s6,64(sp)
+    4c8c:	7be2                	ld	s7,56(sp)
+    4c8e:	7c42                	ld	s8,48(sp)
+    4c90:	7ca2                	ld	s9,40(sp)
+    4c92:	7d02                	ld	s10,32(sp)
+    4c94:	6de2                	ld	s11,24(sp)
+    4c96:	6109                	addi	sp,sp,128
+    4c98:	8082                	ret
+
+0000000000004c9a <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+    4c9a:	715d                	addi	sp,sp,-80
+    4c9c:	ec06                	sd	ra,24(sp)
+    4c9e:	e822                	sd	s0,16(sp)
+    4ca0:	1000                	addi	s0,sp,32
+    4ca2:	e010                	sd	a2,0(s0)
+    4ca4:	e414                	sd	a3,8(s0)
+    4ca6:	e818                	sd	a4,16(s0)
+    4ca8:	ec1c                	sd	a5,24(s0)
+    4caa:	03043023          	sd	a6,32(s0)
+    4cae:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+    4cb2:	8622                	mv	a2,s0
+    4cb4:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+    4cb8:	00000097          	auipc	ra,0x0
+    4cbc:	e04080e7          	jalr	-508(ra) # 4abc <vprintf>
+}
+    4cc0:	60e2                	ld	ra,24(sp)
+    4cc2:	6442                	ld	s0,16(sp)
+    4cc4:	6161                	addi	sp,sp,80
+    4cc6:	8082                	ret
+
+0000000000004cc8 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+    4cc8:	711d                	addi	sp,sp,-96
+    4cca:	ec06                	sd	ra,24(sp)
+    4ccc:	e822                	sd	s0,16(sp)
+    4cce:	1000                	addi	s0,sp,32
+    4cd0:	e40c                	sd	a1,8(s0)
+    4cd2:	e810                	sd	a2,16(s0)
+    4cd4:	ec14                	sd	a3,24(s0)
+    4cd6:	f018                	sd	a4,32(s0)
+    4cd8:	f41c                	sd	a5,40(s0)
+    4cda:	03043823          	sd	a6,48(s0)
+    4cde:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+    4ce2:	00840613          	addi	a2,s0,8
+    4ce6:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+    4cea:	85aa                	mv	a1,a0
+    4cec:	4505                	li	a0,1
+    4cee:	00000097          	auipc	ra,0x0
+    4cf2:	dce080e7          	jalr	-562(ra) # 4abc <vprintf>
+}
+    4cf6:	60e2                	ld	ra,24(sp)
+    4cf8:	6442                	ld	s0,16(sp)
+    4cfa:	6125                	addi	sp,sp,96
+    4cfc:	8082                	ret
+
+0000000000004cfe <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+    4cfe:	1141                	addi	sp,sp,-16
+    4d00:	e422                	sd	s0,8(sp)
+    4d02:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+    4d04:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+    4d08:	00007797          	auipc	a5,0x7
+    4d0c:	3907b783          	ld	a5,912(a5) # c098 <freep>
+    4d10:	a02d                	j	4d3a <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;
+    4d12:	4618                	lw	a4,8(a2)
+    4d14:	9f2d                	addw	a4,a4,a1
+    4d16:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+    4d1a:	6398                	ld	a4,0(a5)
+    4d1c:	6310                	ld	a2,0(a4)
+    4d1e:	a83d                	j	4d5c <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+    4d20:	ff852703          	lw	a4,-8(a0)
+    4d24:	9f31                	addw	a4,a4,a2
+    4d26:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+    4d28:	ff053683          	ld	a3,-16(a0)
+    4d2c:	a091                	j	4d70 <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+    4d2e:	6398                	ld	a4,0(a5)
+    4d30:	00e7e463          	bltu	a5,a4,4d38 <free+0x3a>
+    4d34:	00e6ea63          	bltu	a3,a4,4d48 <free+0x4a>
+{
+    4d38:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+    4d3a:	fed7fae3          	bgeu	a5,a3,4d2e <free+0x30>
+    4d3e:	6398                	ld	a4,0(a5)
+    4d40:	00e6e463          	bltu	a3,a4,4d48 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+    4d44:	fee7eae3          	bltu	a5,a4,4d38 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+    4d48:	ff852583          	lw	a1,-8(a0)
+    4d4c:	6390                	ld	a2,0(a5)
+    4d4e:	02059813          	slli	a6,a1,0x20
+    4d52:	01c85713          	srli	a4,a6,0x1c
+    4d56:	9736                	add	a4,a4,a3
+    4d58:	fae60de3          	beq	a2,a4,4d12 <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+    4d5c:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+    4d60:	4790                	lw	a2,8(a5)
+    4d62:	02061593          	slli	a1,a2,0x20
+    4d66:	01c5d713          	srli	a4,a1,0x1c
+    4d6a:	973e                	add	a4,a4,a5
+    4d6c:	fae68ae3          	beq	a3,a4,4d20 <free+0x22>
+    p->s.ptr = bp->s.ptr;
+    4d70:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+    4d72:	00007717          	auipc	a4,0x7
+    4d76:	32f73323          	sd	a5,806(a4) # c098 <freep>
+}
+    4d7a:	6422                	ld	s0,8(sp)
+    4d7c:	0141                	addi	sp,sp,16
+    4d7e:	8082                	ret
+
+0000000000004d80 <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+    4d80:	7139                	addi	sp,sp,-64
+    4d82:	fc06                	sd	ra,56(sp)
+    4d84:	f822                	sd	s0,48(sp)
+    4d86:	f426                	sd	s1,40(sp)
+    4d88:	f04a                	sd	s2,32(sp)
+    4d8a:	ec4e                	sd	s3,24(sp)
+    4d8c:	e852                	sd	s4,16(sp)
+    4d8e:	e456                	sd	s5,8(sp)
+    4d90:	e05a                	sd	s6,0(sp)
+    4d92:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+    4d94:	02051493          	slli	s1,a0,0x20
+    4d98:	9081                	srli	s1,s1,0x20
+    4d9a:	04bd                	addi	s1,s1,15
+    4d9c:	8091                	srli	s1,s1,0x4
+    4d9e:	00148a1b          	addiw	s4,s1,1
+    4da2:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+    4da4:	00007517          	auipc	a0,0x7
+    4da8:	2f453503          	ld	a0,756(a0) # c098 <freep>
+    4dac:	c515                	beqz	a0,4dd8 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+    4dae:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+    4db0:	4798                	lw	a4,8(a5)
+    4db2:	04977163          	bgeu	a4,s1,4df4 <malloc+0x74>
+    4db6:	89d2                	mv	s3,s4
+    4db8:	000a071b          	sext.w	a4,s4
+    4dbc:	6685                	lui	a3,0x1
+    4dbe:	00d77363          	bgeu	a4,a3,4dc4 <malloc+0x44>
+    4dc2:	6985                	lui	s3,0x1
+    4dc4:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+    4dc8:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+    4dcc:	00007917          	auipc	s2,0x7
+    4dd0:	2cc90913          	addi	s2,s2,716 # c098 <freep>
+  if(p == (char*)-1)
+    4dd4:	5afd                	li	s5,-1
+    4dd6:	a8a5                	j	4e4e <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+    4dd8:	00007797          	auipc	a5,0x7
+    4ddc:	2c078793          	addi	a5,a5,704 # c098 <freep>
+    4de0:	00007717          	auipc	a4,0x7
+    4de4:	2c070713          	addi	a4,a4,704 # c0a0 <base>
+    4de8:	e398                	sd	a4,0(a5)
+    4dea:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+    4dec:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+    4df0:	87ba                	mv	a5,a4
+    4df2:	b7d1                	j	4db6 <malloc+0x36>
+      if(p->s.size == nunits)
+    4df4:	02e48c63          	beq	s1,a4,4e2c <malloc+0xac>
+        p->s.size -= nunits;
+    4df8:	4147073b          	subw	a4,a4,s4
+    4dfc:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+    4dfe:	02071693          	slli	a3,a4,0x20
+    4e02:	01c6d713          	srli	a4,a3,0x1c
+    4e06:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+    4e08:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+    4e0c:	00007717          	auipc	a4,0x7
+    4e10:	28a73623          	sd	a0,652(a4) # c098 <freep>
+      return (void*)(p + 1);
+    4e14:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+    4e18:	70e2                	ld	ra,56(sp)
+    4e1a:	7442                	ld	s0,48(sp)
+    4e1c:	74a2                	ld	s1,40(sp)
+    4e1e:	7902                	ld	s2,32(sp)
+    4e20:	69e2                	ld	s3,24(sp)
+    4e22:	6a42                	ld	s4,16(sp)
+    4e24:	6aa2                	ld	s5,8(sp)
+    4e26:	6b02                	ld	s6,0(sp)
+    4e28:	6121                	addi	sp,sp,64
+    4e2a:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+    4e2c:	6398                	ld	a4,0(a5)
+    4e2e:	e118                	sd	a4,0(a0)
+    4e30:	bff1                	j	4e0c <malloc+0x8c>
+  hp->s.size = nu;
+    4e32:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+    4e36:	0541                	addi	a0,a0,16
+    4e38:	00000097          	auipc	ra,0x0
+    4e3c:	ec6080e7          	jalr	-314(ra) # 4cfe <free>
+  return freep;
+    4e40:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+    4e44:	d971                	beqz	a0,4e18 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+    4e46:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+    4e48:	4798                	lw	a4,8(a5)
+    4e4a:	fa9775e3          	bgeu	a4,s1,4df4 <malloc+0x74>
+    if(p == freep)
+    4e4e:	00093703          	ld	a4,0(s2)
+    4e52:	853e                	mv	a0,a5
+    4e54:	fef719e3          	bne	a4,a5,4e46 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+    4e58:	854e                	mv	a0,s3
+    4e5a:	00000097          	auipc	ra,0x0
+    4e5e:	b30080e7          	jalr	-1232(ra) # 498a <sbrk>
+  if(p == (char*)-1)
+    4e62:	fd5518e3          	bne	a0,s5,4e32 <malloc+0xb2>
+        return 0;
+    4e66:	4501                	li	a0,0
+    4e68:	bf45                	j	4e18 <malloc+0x98>
diff --git a/xv6-user/usertests.c b/xv6-user/usertests.c
new file mode 100644
index 0000000000000000000000000000000000000000..de67e6b907ea43947a019882ca091cd2cbff3581
--- /dev/null
+++ b/xv6-user/usertests.c
@@ -0,0 +1,2755 @@
+#include "kernel/include/param.h"
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+#include "kernel/include/fcntl.h"
+#include "kernel/include/syscall.h"
+#include "kernel/include/memlayout.h"
+#include "kernel/include/riscv.h"
+
+//
+// Tests xv6 system calls.  usertests without arguments runs them all
+// and usertests <name> runs <name> test. The test runner creates for
+// each test a process and based on the exit status of the process,
+// the test runner reports "OK" or "FAILED".  Some tests result in
+// kernel printing usertrap messages, which can be ignored if test
+// prints "OK".
+//
+
+#define BSIZE 512
+#define MAXFILE 512
+#define BUFSZ  ((MAXOPBLOCKS+2)*BSIZE)
+
+char buf[BUFSZ];
+char name[3];
+
+// what if you pass ridiculous pointers to system calls
+// that read user memory with copyin?
+void
+copyin(char *s)
+{
+  uint64 addrs[] = { 0x80000000LL, 0xffffffffffffffff };
+
+  for(int ai = 0; ai < 2; ai++){
+    uint64 addr = addrs[ai];
+    
+    int fd = open("copyin1", O_CREATE|O_WRONLY);
+    if(fd < 0){
+      printf("open(copyin1) failed\n");
+      exit(1);
+    }
+    int n = write(fd, (void*)addr, 8192);
+    if(n >= 0){
+      printf("write(fd, %p, 8192) returned %d, not -1\n", addr, n);
+      exit(1);
+    }
+    close(fd);
+    remove("copyin1");
+    
+    n = write(1, (char*)addr, 8192);
+    if(n > 0){
+      printf("write(1, %p, 8192) returned %d, not -1 or 0\n", addr, n);
+      exit(1);
+    }
+    
+    int fds[2];
+    if(pipe(fds) < 0){
+      printf("pipe() failed\n");
+      exit(1);
+    }
+    n = write(fds[1], (char*)addr, 8192);
+    if(n > 0){
+      printf("write(pipe, %p, 8192) returned %d, not -1 or 0\n", addr, n);
+      exit(1);
+    }
+    close(fds[0]);
+    close(fds[1]);
+  }
+}
+
+// what if you pass ridiculous pointers to system calls
+// that write user memory with copyout?
+void
+copyout(char *s)
+{
+  uint64 addrs[] = { 0x80000000LL, 0xffffffffffffffff };
+
+  for(int ai = 0; ai < 2; ai++){
+    uint64 addr = addrs[ai];
+
+    int fd = open("README", 0);
+    if(fd < 0){
+      printf("open(README) failed\n");
+      exit(1);
+    }
+    int n = read(fd, (void*)addr, 8192);
+    if(n > 0){
+      printf("read(fd, %p, 8192) returned %d, not -1 or 0\n", addr, n);
+      exit(1);
+    }
+    close(fd);
+
+    int fds[2];
+    if(pipe(fds) < 0){
+      printf("pipe() failed\n");
+      exit(1);
+    }
+    n = write(fds[1], "x", 1);
+    if(n != 1){
+      printf("pipe write failed\n");
+      exit(1);
+    }
+    n = read(fds[0], (void*)addr, 8192);
+    if(n > 0){
+      printf("read(pipe, %p, 8192) returned %d, not -1 or 0\n", addr, n);
+      exit(1);
+    }
+    close(fds[0]);
+    close(fds[1]);
+  }
+}
+
+// what if you pass ridiculous string pointers to system calls?
+void
+copyinstr1(char *s)
+{
+  uint64 addrs[] = { 0x80000000LL, 0xffffffffffffffff };
+
+  for(int ai = 0; ai < 2; ai++){
+    uint64 addr = addrs[ai];
+
+    int fd = open((char *)addr, O_CREATE|O_WRONLY);
+    if(fd >= 0){
+      printf("open(%p) returned %d, not -1\n", addr, fd);
+      exit(1);
+    }
+  }
+}
+
+// what if a string system call argument is exactly the size
+// of the kernel buffer it is copied into, so that the null
+// would fall just beyond the end of the kernel buffer?
+void
+copyinstr2(char *s)
+{
+  char b[MAXPATH+1];
+
+  for(int i = 0; i < MAXPATH; i++)
+    b[i] = 'x';
+  b[MAXPATH] = '\0';
+  
+  int ret = remove(b);
+  if(ret != -1){
+    printf("remove(%s) returned %d, not -1\n", b, ret);
+    exit(1);
+  }
+
+  int fd = open(b, O_CREATE | O_WRONLY);
+  if(fd != -1){
+    printf("open(%s) returned %d, not -1\n", b, fd);
+    exit(1);
+  }
+
+  // ret = link(b, b);
+  // if(ret != -1){
+  //   printf("link(%s, %s) returned %d, not -1\n", b, b, ret);
+  //   exit(1);
+  // }
+
+  char *args[] = { "xx", 0 };
+  ret = exec(b, args);
+  if(ret != -1){
+    printf("exec(%s) returned %d, not -1\n", b, fd);
+    exit(1);
+  }
+
+  int pid = fork();
+  if(pid < 0){
+    printf("fork failed\n");
+    exit(1);
+  }
+  if(pid == 0){
+    static char big[PGSIZE+1];
+    for(int i = 0; i < PGSIZE; i++)
+      big[i] = 'x';
+    big[PGSIZE] = '\0';
+    char *args2[] = { big, big, big, 0 };
+    ret = exec("echo", args2);
+    if(ret != -1){
+      printf("exec(echo, BIG) returned %d, not -1\n", fd);
+      exit(1);
+    }
+    exit(747); // OK
+  }
+
+  int st = 0;
+  wait(&st);
+  if(st != 747){
+    printf("exec(echo, BIG) succeeded, should have failed\n");
+    exit(1);
+  }
+}
+
+// what if a string argument crosses over the end of last user page?
+void
+copyinstr3(char *s)
+{
+  sbrk(8192);
+  uint64 top = (uint64) sbrk(0);
+  if((top % PGSIZE) != 0){
+    sbrk(PGSIZE - (top % PGSIZE));
+  }
+  top = (uint64) sbrk(0);
+  if(top % PGSIZE){
+    printf("oops\n");
+    exit(1);
+  }
+
+  char *b = (char *) (top - 1);
+  *b = 'x';
+
+  int ret = remove(b);
+  if(ret != -1){
+    printf("remove(%s) returned %d, not -1\n", b, ret);
+    exit(1);
+  }
+
+  int fd = open(b, O_CREATE | O_WRONLY);
+  if(fd != -1){
+    printf("open(%s) returned %d, not -1\n", b, fd);
+    exit(1);
+  }
+
+  // ret = link(b, b);
+  // if(ret != -1){
+  //   printf("link(%s, %s) returned %d, not -1\n", b, b, ret);
+  //   exit(1);
+  // }
+
+  char *args[] = { "xx", 0 };
+  ret = exec(b, args);
+  if(ret != -1){
+    printf("exec(%s) returned %d, not -1\n", b, fd);
+    exit(1);
+  }
+}
+
+// // test O_TRUNC.
+void
+truncate1(char *s)
+{
+  char buf[32];
+  
+  remove("truncfile");
+  int fd1 = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC);
+  write(fd1, "abcd", 4);
+  close(fd1);
+
+  int fd2 = open("truncfile", O_RDONLY);
+  int n = read(fd2, buf, sizeof(buf));
+  if(n != 4){
+    printf("%s: read %d bytes, wanted 4\n", s, n);
+    exit(1);
+  }
+
+  fd1 = open("truncfile", O_WRONLY|O_TRUNC);
+
+  int fd3 = open("truncfile", O_RDONLY);
+  n = read(fd3, buf, sizeof(buf));
+  if(n != 0){
+    printf("aaa fd3=%d\n", fd3);
+    printf("%s: read %d bytes, wanted 0\n", s, n);
+    exit(1);
+  }
+
+  n = read(fd2, buf, sizeof(buf));
+  if(n != 0){
+    printf("bbb fd2=%d\n", fd2);
+    printf("%s: read %d bytes, wanted 0\n", s, n);
+    exit(1);
+  }
+  
+  write(fd1, "abcdef", 6);
+
+  n = read(fd3, buf, sizeof(buf));
+  if(n != 6){
+    printf("%s: read %d bytes, wanted 6\n", s, n);
+    exit(1);
+  }
+
+  n = read(fd2, buf, sizeof(buf));
+  if(n != 2){
+    printf("%s: read %d bytes, wanted 2\n", s, n);
+    exit(1);
+  }
+
+  remove("truncfile");
+
+  close(fd1);
+  close(fd2);
+  close(fd3);
+}
+
+// write to an open FD whose file has just been truncated.
+// this causes a write at an offset beyond the end of the file.
+// such writes fail on xv6 (unlike POSIX) but at least
+// they don't crash.
+void
+truncate2(char *s)
+{
+  remove("truncfile");
+
+  int fd1 = open("truncfile", O_CREATE|O_TRUNC|O_WRONLY);
+  write(fd1, "abcd", 4);
+
+  int fd2 = open("truncfile", O_TRUNC|O_WRONLY);
+
+  int n = write(fd1, "x", 1);
+  if(n != -1){
+    printf("%s: write returned %d, expected -1\n", s, n);
+    exit(1);
+  }
+
+  remove("truncfile");
+  close(fd1);
+  close(fd2);
+}
+
+void
+truncate3(char *s)
+{
+  int pid, xstatus;
+
+  close(open("truncfile", O_CREATE|O_TRUNC|O_WRONLY));
+  
+  pid = fork();
+  if(pid < 0){
+    printf("%s: fork failed\n", s);
+    exit(1);
+  }
+
+  if(pid == 0){
+    for(int i = 0; i < 100; i++){
+      char buf[32];
+      int fd = open("truncfile", O_WRONLY);
+      if(fd < 0){
+        printf("%s: open failed\n", s);
+        exit(1);
+      }
+      int n = write(fd, "1234567890", 10);
+      if(n != 10){
+        printf("%s: write got %d, expected 10\n", s, n);
+        exit(1);
+      }
+      close(fd);
+      fd = open("truncfile", O_RDONLY);
+      read(fd, buf, sizeof(buf));
+      close(fd);
+    }
+    exit(0);
+  }
+
+  for(int i = 0; i < 150; i++){
+    int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC);
+    if(fd < 0){
+      printf("%s: open failed\n", s);
+      exit(1);
+    }
+    int n = write(fd, "xxx", 3);
+    if(n != 3){
+      printf("%s: write got %d, expected 3\n", s, n);
+      exit(1);
+    }
+    close(fd);
+  }
+
+  wait(&xstatus);
+  remove("truncfile");
+  exit(xstatus);
+}
+  
+
+// does chdir() call iput(p->cwd) in a transaction?
+void
+iputtest(char *s)
+{
+  if(mkdir("iputdir") < 0){
+    printf("%s: mkdir failed\n", s);
+    exit(1);
+  }
+  if(chdir("iputdir") < 0){
+    printf("%s: chdir iputdir failed\n", s);
+    exit(1);
+  }
+  if(remove("../iputdir") < 0){
+    printf("%s: remove ../iputdir failed\n", s);
+    exit(1);
+  }
+  if(chdir("/") < 0){
+    printf("%s: chdir / failed\n", s);
+    exit(1);
+  }
+}
+
+// does exit() call iput(p->cwd) in a transaction?
+void
+exitiputtest(char *s)
+{
+  int pid, xstatus;
+
+  pid = fork();
+  if(pid < 0){
+    printf("%s: fork failed\n", s);
+    exit(1);
+  }
+  if(pid == 0){
+    if(mkdir("iputdir") < 0){
+      printf("%s: mkdir failed\n", s);
+      exit(1);
+    }
+    if(chdir("iputdir") < 0){
+      printf("%s: child chdir failed\n", s);
+      exit(1);
+    }
+    if(remove("../iputdir") < 0){
+      printf("%s: remove ../iputdir failed\n", s);
+      exit(1);
+    }
+    exit(0);
+  }
+  wait(&xstatus);
+  exit(xstatus);
+}
+
+// does the error path in open() for attempt to write a
+// directory call iput() in a transaction?
+// needs a hacked kernel that pauses just after the namei()
+// call in sys_open():
+//    if((ip = namei(path)) == 0)
+//      return -1;
+//    {
+//      int i;
+//      for(i = 0; i < 10000; i++)
+//        yield();
+//    }
+void
+openiputtest(char *s)
+{
+  int pid, xstatus;
+
+  if(mkdir("oidir") < 0){
+    printf("%s: mkdir oidir failed\n", s);
+    exit(1);
+  }
+  pid = fork();
+  if(pid < 0){
+    printf("%s: fork failed\n", s);
+    exit(1);
+  }
+  if(pid == 0){
+    int fd = open("oidir", O_RDWR);
+    if(fd >= 0){
+      printf("%s: open directory for write succeeded\n", s);
+      exit(1);
+    }
+    exit(0);
+  }
+  sleep(1);
+  if(remove("oidir") != 0){
+    printf("%s: remove failed\n", s);
+    exit(1);
+  }
+  wait(&xstatus);
+  exit(xstatus);
+}
+
+// simple file system tests
+
+void
+opentest(char *s)
+{
+  int fd;
+
+  fd = open("echo", 0);
+  if(fd < 0){
+    printf("%s: open echo failed!\n", s);
+    exit(1);
+  }
+  close(fd);
+  fd = open("doesnotexist", 0);
+  if(fd >= 0){
+    printf("%s: open doesnotexist succeeded!\n", s);
+    exit(1);
+  }
+}
+
+void
+writetest(char *s)
+{
+  int fd;
+  int i;
+  enum { N=100, SZ=10 };
+  
+  fd = open("small", O_CREATE|O_RDWR);
+  if(fd < 0){
+    printf("%s: error: creat small failed!\n", s);
+    exit(1);
+  }
+  for(i = 0; i < N; i++){
+    if(write(fd, "aaaaaaaaaa", SZ) != SZ){
+      printf("%s: error: write aa %d new file failed\n", i);
+      exit(1);
+    }
+    if(write(fd, "bbbbbbbbbb", SZ) != SZ){
+      printf("%s: error: write bb %d new file failed\n", i);
+      exit(1);
+    }
+  }
+  close(fd);
+  fd = open("small", O_RDONLY);
+  if(fd < 0){
+    printf("%s: error: open small failed!\n", s);
+    exit(1);
+  }
+  i = read(fd, buf, N*SZ*2);
+  if(i != N*SZ*2){
+    printf("%s: read failed\n", s);
+    exit(1);
+  }
+  close(fd);
+
+  if(remove("small") < 0){
+    printf("%s: remove small failed\n", s);
+    exit(1);
+  }
+}
+
+void
+writebig(char *s)
+{
+  int i, fd, n;
+
+  fd = open("big", O_CREATE|O_RDWR);
+  if(fd < 0){
+    printf("%s: error: creat big failed!\n", s);
+    exit(1);
+  }
+
+  for(i = 0; i < MAXFILE; i++){
+    ((int*)buf)[0] = i;
+    if(write(fd, buf, BSIZE) != BSIZE){
+      printf("%s: error: write big file failed\n", i);
+      exit(1);
+    }
+  }
+
+  close(fd);
+
+  fd = open("big", O_RDONLY);
+  if(fd < 0){
+    printf("%s: error: open big failed!\n", s);
+    exit(1);
+  }
+
+  n = 0;
+  for(;;){
+    i = read(fd, buf, BSIZE);
+    if(i == 0){
+      if(n == MAXFILE - 1){
+        printf("%s: read only %d blocks from big", n);
+        exit(1);
+      }
+      break;
+    } else if(i != BSIZE){
+      printf("%s: read failed %d\n", i);
+      exit(1);
+    }
+    if(((int*)buf)[0] != n){
+      printf("%s: read content of block %d is %d\n",
+             n, ((int*)buf)[0]);
+      exit(1);
+    }
+    n++;
+  }
+  close(fd);
+  if(remove("big") < 0){
+    printf("%s: remove big failed\n", s);
+    exit(1);
+  }
+}
+
+// many creates, followed by remove test
+void
+createtest(char *s)
+{
+  int i, fd;
+  enum { N=52 };
+
+  name[0] = 'a';
+  name[2] = '\0';
+  for(i = 0; i < N; i++){
+    name[1] = '0' + i;
+    fd = open(name, O_CREATE|O_RDWR);
+    close(fd);
+  }
+  name[0] = 'a';
+  name[2] = '\0';
+  for(i = 0; i < N; i++){
+    name[1] = '0' + i;
+    remove(name);
+  }
+}
+
+void dirtest(char *s)
+{
+  printf("mkdir test\n");
+
+  if(mkdir("dir0") < 0){
+    printf("%s: mkdir failed\n", s);
+    exit(1);
+  }
+
+  if(chdir("dir0") < 0){
+    printf("%s: chdir dir0 failed\n", s);
+    exit(1);
+  }
+
+  if(chdir("..") < 0){
+    printf("%s: chdir .. failed\n", s);
+    exit(1);
+  }
+
+  if(remove("dir0") < 0){
+    printf("%s: remove dir0 failed\n", s);
+    exit(1);
+  }
+  printf("%s: mkdir test ok\n");
+}
+
+void
+exectest(char *s)
+{
+  int fd, xstatus, pid;
+  char *echoargv[] = { "echo", "OK", 0 };
+  char buf[3];
+
+  remove("echo-ok");
+  pid = fork();
+  if(pid < 0) {
+     printf("%s: fork failed\n", s);
+     exit(1);
+  }
+  if(pid == 0) {
+    close(1);
+    fd = open("echo-ok", O_CREATE|O_WRONLY);
+    if(fd < 0) {
+      printf("%s: create failed\n", s);
+      exit(1);
+    }
+    if(fd != 1) {
+      printf("%s: wrong fd\n", s);
+      exit(1);
+    }
+    if(exec("echo", echoargv) < 0){
+      printf("%s: exec echo failed\n", s);
+      exit(1);
+    }
+    // won't get to here
+  }
+  if (wait(&xstatus) != pid) {
+    printf("%s: wait failed!\n", s);
+  }
+  if(xstatus != 0)
+    exit(xstatus);
+
+  fd = open("echo-ok", O_RDONLY);
+  if(fd < 0) {
+    printf("%s: open failed\n", s);
+    exit(1);
+  }
+  if (read(fd, buf, 2) != 2) {
+    printf("%s: read failed\n", s);
+    exit(1);
+  }
+  remove("echo-ok");
+  if(buf[0] == 'O' && buf[1] == 'K')
+    exit(0);
+  else {
+    printf("%s: wrong output\n", s);
+    exit(1);
+  }
+
+}
+
+// simple fork and pipe read/write
+
+void
+pipe1(char *s)
+{
+  int fds[2], pid, xstatus;
+  int seq, i, n, cc, total;
+  enum { N=5, SZ=1033 };
+  
+  if(pipe(fds) != 0){
+    printf("%s: pipe() failed\n", s);
+    exit(1);
+  }
+  pid = fork();
+  seq = 0;
+  if(pid == 0){
+    close(fds[0]);
+    for(n = 0; n < N; n++){
+      for(i = 0; i < SZ; i++)
+        buf[i] = seq++;
+      if(write(fds[1], buf, SZ) != SZ){
+        printf("%s: pipe1 oops 1\n", s);
+        exit(1);
+      }
+    }
+    exit(0);
+  } else if(pid > 0){
+    close(fds[1]);
+    total = 0;
+    cc = 1;
+    while((n = read(fds[0], buf, cc)) > 0){
+      for(i = 0; i < n; i++){
+        if((buf[i] & 0xff) != (seq++ & 0xff)){
+          printf("%s: pipe1 oops 2\n", s);
+          return;
+        }
+      }
+      total += n;
+      cc = cc * 2;
+      if(cc > sizeof(buf))
+        cc = sizeof(buf);
+    }
+    if(total != N * SZ){
+      printf("%s: pipe1 oops 3 total %d\n", total);
+      exit(1);
+    }
+    close(fds[0]);
+    wait(&xstatus);
+    exit(xstatus);
+  } else {
+    printf("%s: fork() failed\n", s);
+    exit(1);
+  }
+}
+
+// meant to be run w/ at most two CPUs
+void
+preempt(char *s)
+{
+  int pid1, pid2, pid3;
+  int pfds[2];
+
+  pid1 = fork();
+  if(pid1 < 0) {
+    printf("%s: fork failed");
+    exit(1);
+  }
+  if(pid1 == 0)
+    for(;;)
+      ;
+
+  pid2 = fork();
+  if(pid2 < 0) {
+    printf("%s: fork failed\n", s);
+    exit(1);
+  }
+  if(pid2 == 0)
+    for(;;)
+      ;
+
+  pipe(pfds);
+  pid3 = fork();
+  if(pid3 < 0) {
+     printf("%s: fork failed\n", s);
+     exit(1);
+  }
+  if(pid3 == 0){
+    close(pfds[0]);
+    if(write(pfds[1], "x", 1) != 1)
+      printf("%s: preempt write error");
+    close(pfds[1]);
+    for(;;)
+      ;
+  }
+
+  close(pfds[1]);
+  if(read(pfds[0], buf, sizeof(buf)) != 1){
+    printf("%s: preempt read error");
+    return;
+  }
+  close(pfds[0]);
+  printf("kill... ");
+  kill(pid1);
+  kill(pid2);
+  kill(pid3);
+  printf("wait... ");
+  wait(0);
+  wait(0);
+  wait(0);
+}
+
+// try to find any races between exit and wait
+void
+exitwait(char *s)
+{
+  int i, pid;
+
+  for(i = 0; i < 100; i++){
+    pid = fork();
+    if(pid < 0){
+      printf("%s: fork failed\n", s);
+      exit(1);
+    }
+    if(pid){
+      int xstate;
+      if(wait(&xstate) != pid){
+        printf("%s: wait wrong pid\n", s);
+        exit(1);
+      }
+      if(i != xstate) {
+        printf("%s: wait wrong exit status\n", s);
+        exit(1);
+      }
+    } else {
+      exit(i);
+    }
+  }
+}
+
+// try to find races in the reparenting
+// code that handles a parent exiting
+// when it still has live children.
+void
+reparent(char *s)
+{
+  int master_pid = getpid();
+  for(int i = 0; i < 200; i++){
+    int pid = fork();
+    if(pid < 0){
+      printf("%s: fork failed\n", s);
+      exit(1);
+    }
+    if(pid){
+      if(wait(0) != pid){
+        printf("%s: wait wrong pid\n", s);
+        exit(1);
+      }
+    } else {
+      int pid2 = fork();
+      if(pid2 < 0){
+        kill(master_pid);
+        exit(1);
+      }
+      exit(0);
+    }
+  }
+  exit(0);
+}
+
+// what if two children exit() at the same time?
+void
+twochildren(char *s)
+{
+  for(int i = 0; i < 1000; i++){
+    int pid1 = fork();
+    if(pid1 < 0){
+      printf("%s: fork failed\n", s);
+      exit(1);
+    }
+    if(pid1 == 0){
+      exit(0);
+    } else {
+      int pid2 = fork();
+      if(pid2 < 0){
+        printf("%s: fork failed\n", s);
+        exit(1);
+      }
+      if(pid2 == 0){
+        exit(0);
+      } else {
+        wait(0);
+        wait(0);
+      }
+    }
+  }
+}
+
+// concurrent forks to try to expose locking bugs.
+void
+forkfork(char *s)
+{
+  enum { N=2 };
+  
+  for(int i = 0; i < N; i++){
+    int pid = fork();
+    if(pid < 0){
+      printf("%s: fork failed", s);
+      exit(1);
+    }
+    if(pid == 0){
+      for(int j = 0; j < 200; j++){
+        int pid1 = fork();
+        if(pid1 < 0){
+          exit(1);
+        }
+        if(pid1 == 0){
+          exit(0);
+        }
+        wait(0);
+      }
+      exit(0);
+    }
+  }
+
+  int xstatus;
+  for(int i = 0; i < N; i++){
+    wait(&xstatus);
+    if(xstatus != 0) {
+      printf("%s: fork in child failed", s);
+      exit(1);
+    }
+  }
+}
+
+void
+forkforkfork(char *s)
+{
+  remove("stopforking");
+
+  int pid = fork();
+  if(pid < 0){
+    printf("%s: fork failed", s);
+    exit(1);
+  }
+  if(pid == 0){
+    while(1){
+      int fd = open("stopforking", 0);
+      if(fd >= 0){
+        exit(0);
+      }
+      if(fork() < 0){
+        close(open("stopforking", O_CREATE|O_RDWR));
+      }
+    }
+
+    exit(0);
+  }
+
+  sleep(20); // two seconds
+  close(open("stopforking", O_CREATE|O_RDWR));
+  wait(0);
+  sleep(10); // one second
+  remove("stopforking");
+}
+
+// regression test. does reparent() violate the parent-then-child
+// locking order when giving away a child to init, so that exit()
+// deadlocks against init's wait()? also used to trigger a "panic:
+// release" due to exit() releasing a different p->parent->lock than
+// it acquired.
+void
+reparent2(char *s)
+{
+  for(int i = 0; i < 800; i++){
+    int pid1 = fork();
+    if(pid1 < 0){
+      printf("fork failed\n");
+      exit(1);
+    }
+    if(pid1 == 0){
+      fork();
+      fork();
+      exit(0);
+    }
+    wait(0);
+  }
+
+  exit(0);
+}
+
+// allocate all mem, free it, and allocate again
+void
+mem(char *s)
+{
+  void *m1, *m2;
+  int pid;
+
+  if((pid = fork()) == 0){
+    m1 = 0;
+    while((m2 = malloc(10001)) != 0){
+      *(char**)m2 = m1;
+      m1 = m2;
+    }
+    while(m1){
+      m2 = *(char**)m1;
+      free(m1);
+      m1 = m2;
+    }
+    m1 = malloc(1024*20);
+    if(m1 == 0){
+      printf("couldn't allocate mem?!!\n", s);
+      exit(1);
+    }
+    free(m1);
+    exit(0);
+  } else {
+    int xstatus;
+    wait(&xstatus);
+    if(xstatus == -1){
+      // probably page fault, so might be lazy lab,
+      // so OK.
+      exit(0);
+    }
+    exit(xstatus);
+  }
+}
+
+// More file system tests
+
+// two processes write to the same file descriptor
+// is the offset shared? does inode locking work?
+void
+sharedfd(char *s)
+{
+  int fd, pid, i, n, nc, np;
+  enum { N = 1000, SZ=10};
+  char buf[SZ];
+
+  remove("sharedfd");
+  fd = open("sharedfd", O_CREATE|O_RDWR);
+  if(fd < 0){
+    printf("%s: cannot open sharedfd for writing", s);
+    exit(1);
+  }
+  pid = fork();
+  memset(buf, pid==0?'c':'p', sizeof(buf));
+  for(i = 0; i < N; i++){
+    if(write(fd, buf, sizeof(buf)) != sizeof(buf)){
+      printf("%s: write sharedfd failed\n", s);
+      exit(1);
+    }
+  }
+  if(pid == 0) {
+    exit(0);
+  } else {
+    int xstatus;
+    wait(&xstatus);
+    if(xstatus != 0)
+      exit(xstatus);
+  }
+  
+  close(fd);
+  fd = open("sharedfd", 0);
+  if(fd < 0){
+    printf("%s: cannot open sharedfd for reading\n", s);
+    exit(1);
+  }
+  nc = np = 0;
+  while((n = read(fd, buf, sizeof(buf))) > 0){
+    for(i = 0; i < sizeof(buf); i++){
+      if(buf[i] == 'c')
+        nc++;
+      if(buf[i] == 'p')
+        np++;
+    }
+  }
+  close(fd);
+  remove("sharedfd");
+  if(nc == N*SZ && np == N*SZ){
+    exit(0);
+  } else {
+    printf("%s: nc/np test fails\n", s);
+    exit(1);
+  }
+}
+
+// four processes write different files at the same
+// time, to test block allocation.
+void
+fourfiles(char *s)
+{
+  int fd, pid, i, j, n, total, pi;
+  char *names[] = { "f0", "f1", "f2", "f3" };
+  char *fname;
+  enum { N=12, NCHILD=4, SZ=500 };
+  
+  for(pi = 0; pi < NCHILD; pi++){
+    fname = names[pi];
+    remove(fname);
+
+    pid = fork();
+    if(pid < 0){
+      printf("fork failed\n", s);
+      exit(1);
+    }
+
+    if(pid == 0){
+      fd = open(fname, O_CREATE | O_RDWR);
+      if(fd < 0){
+        printf("create failed\n", s);
+        exit(1);
+      }
+
+      memset(buf, '0'+pi, SZ);
+      for(i = 0; i < N; i++){
+        if((n = write(fd, buf, SZ)) != SZ){
+          printf("write failed %d\n", n);
+          exit(1);
+        }
+      }
+      exit(0);
+    }
+  }
+
+  int xstatus;
+  for(pi = 0; pi < NCHILD; pi++){
+    wait(&xstatus);
+    if(xstatus != 0)
+      exit(xstatus);
+  }
+
+  for(i = 0; i < NCHILD; i++){
+    fname = names[i];
+    fd = open(fname, 0);
+    total = 0;
+    while((n = read(fd, buf, sizeof(buf))) > 0){
+      for(j = 0; j < n; j++){
+        if(buf[j] != '0'+i){
+          printf("wrong char\n", s);
+          exit(1);
+        }
+      }
+      total += n;
+    }
+    close(fd);
+    if(total != N*SZ){
+      printf("wrong length %d\n", total);
+      exit(1);
+    }
+    remove(fname);
+  }
+}
+
+// four processes create and delete different files in same directory
+void
+createdelete(char *s)
+{
+  enum { N = 20, NCHILD=4 };
+  int pid, i, fd, pi;
+  char name[32];
+  char illegal[] = { '\"', '*', '/', ':', '<', '>', '?', '\\', '|', 0 };
+  for(pi = 0; pi < NCHILD; pi++){
+    pid = fork();
+    if(pid < 0){
+      printf("fork failed\n", s);
+      exit(1);
+    }
+
+    if(pid == 0){
+      name[0] = 'p' + pi;
+      name[2] = '\0';
+      for(i = 0; i < N; i++){
+        name[1] = '0' + i;
+        if (strchr(illegal, name[1]) == 0) {
+          fd = open(name, O_CREATE | O_RDWR);
+          if(fd < 0){
+            printf("%s: create %s failed\n", s, name);
+            exit(1);
+          }
+          close(fd);
+        }
+        if(i > 0 && (i % 2 ) == 0){
+          name[1] = '0' + (i / 2);
+          if (strchr(illegal, name[1]) == 0) {
+            if(remove(name) < 0){
+              printf("%s: remove failed\n", s);
+              exit(1);
+            }
+          }
+        }
+      }
+      exit(0);
+    }
+  }
+
+  int xstatus;
+  for(pi = 0; pi < NCHILD; pi++){
+    wait(&xstatus);
+    if(xstatus != 0)
+      exit(1);
+  }
+
+  name[0] = name[1] = name[2] = 0;
+  for(i = 0; i < N; i++){
+    for(pi = 0; pi < NCHILD; pi++){
+      name[0] = 'p' + pi;
+      name[1] = '0' + i;
+      if (strchr(illegal, name[1]) != 0) { continue; }
+      fd = open(name, 0);
+      if((i == 0 || i >= N/2) && fd < 0){
+        printf("%s: oops createdelete %s didn't exist\n", s, name);
+        exit(1);
+      } else if((i >= 1 && i < N/2) && fd >= 0){
+        printf("%s: oops createdelete %s did exist\n", s, name);
+        exit(1);
+      }
+      if(fd >= 0)
+        close(fd);
+    }
+  }
+
+  for(i = 0; i < N; i++){
+    for(pi = 0; pi < NCHILD; pi++){
+      name[0] = 'p' + pi;
+      name[1] = '0' + i;
+      remove(name);
+    }
+  }
+}
+
+// can I remove a file and still read it?
+void
+removeread(char *s)
+{
+  enum { SZ = 5 };
+  int fd, fd1;
+
+  fd = open("removeread", O_CREATE | O_RDWR);
+  if(fd < 0){
+    printf("%s: create removeread failed\n", s);
+    exit(1);
+  }
+  write(fd, "hello", SZ);
+  close(fd);
+
+  fd = open("removeread", O_RDWR);
+  if(fd < 0){
+    printf("%s: open removeread failed\n", s);
+    exit(1);
+  }
+  if(remove("removeread") != 0){
+    printf("%s: remove removeread failed\n", s);
+    exit(1);
+  }
+
+  fd1 = open("removeread", O_CREATE | O_RDWR);
+  write(fd1, "yyy", 3);
+  close(fd1);
+
+  if(read(fd, buf, sizeof(buf)) != SZ){
+    printf("%s: removeread read failed", s);
+    exit(1);
+  }
+  if(buf[0] != 'h'){
+    printf("%s: removeread wrong data\n", s);
+    exit(1);
+  }
+  if(write(fd, buf, 10) != 10){
+    printf("%s: removeread write failed\n", s);
+    exit(1);
+  }
+  close(fd);
+  remove("removeread");
+}
+
+// void
+// linktest(char *s)
+// {
+//   enum { SZ = 5 };
+//   int fd;
+
+//   remove("lf1");
+//   remove("lf2");
+
+//   fd = open("lf1", O_CREATE|O_RDWR);
+//   if(fd < 0){
+//     printf("%s: create lf1 failed\n", s);
+//     exit(1);
+//   }
+//   if(write(fd, "hello", SZ) != SZ){
+//     printf("%s: write lf1 failed\n", s);
+//     exit(1);
+//   }
+//   close(fd);
+
+//   if(link("lf1", "lf2") < 0){
+//     printf("%s: link lf1 lf2 failed\n", s);
+//     exit(1);
+//   }
+//   remove("lf1");
+
+//   if(open("lf1", 0) >= 0){
+//     printf("%s: removeed lf1 but it is still there!\n", s);
+//     exit(1);
+//   }
+
+//   fd = open("lf2", 0);
+//   if(fd < 0){
+//     printf("%s: open lf2 failed\n", s);
+//     exit(1);
+//   }
+//   if(read(fd, buf, sizeof(buf)) != SZ){
+//     printf("%s: read lf2 failed\n", s);
+//     exit(1);
+//   }
+//   close(fd);
+
+//   if(link("lf2", "lf2") >= 0){
+//     printf("%s: link lf2 lf2 succeeded! oops\n", s);
+//     exit(1);
+//   }
+
+//   remove("lf2");
+//   if(link("lf2", "lf1") >= 0){
+//     printf("%s: link non-existant succeeded! oops\n", s);
+//     exit(1);
+//   }
+
+//   if(link(".", "lf1") >= 0){
+//     printf("%s: link . lf1 succeeded! oops\n", s);
+//     exit(1);
+//   }
+// }
+
+// // test concurrent create/link/remove of the same file
+// void
+// concreate(char *s)
+// {
+//   enum { N = 40 };
+//   char file[3];
+//   int i, pid, n, fd;
+//   char fa[N];
+//   struct {
+//     ushort inum;
+//     char name[DIRSIZ];
+//   } de;
+
+//   file[0] = 'C';
+//   file[2] = '\0';
+//   for(i = 0; i < N; i++){
+//     file[1] = '0' + i;
+//     remove(file);
+//     pid = fork();
+//     if(pid && (i % 3) == 1){
+//       link("C0", file);
+//     } else if(pid == 0 && (i % 5) == 1){
+//       link("C0", file);
+//     } else {
+//       fd = open(file, O_CREATE | O_RDWR);
+//       if(fd < 0){
+//         printf("concreate create %s failed\n", file);
+//         exit(1);
+//       }
+//       close(fd);
+//     }
+//     if(pid == 0) {
+//       exit(0);
+//     } else {
+//       int xstatus;
+//       wait(&xstatus);
+//       if(xstatus != 0)
+//         exit(1);
+//     }
+//   }
+
+//   memset(fa, 0, sizeof(fa));
+//   fd = open(".", 0);
+//   n = 0;
+//   while(read(fd, &de, sizeof(de)) > 0){
+//     if(de.inum == 0)
+//       continue;
+//     if(de.name[0] == 'C' && de.name[2] == '\0'){
+//       i = de.name[1] - '0';
+//       if(i < 0 || i >= sizeof(fa)){
+//         printf("%s: concreate weird file %s\n", s, de.name);
+//         exit(1);
+//       }
+//       if(fa[i]){
+//         printf("%s: concreate duplicate file %s\n", s, de.name);
+//         exit(1);
+//       }
+//       fa[i] = 1;
+//       n++;
+//     }
+//   }
+//   close(fd);
+
+//   if(n != N){
+//     printf("%s: concreate not enough files in directory listing\n", s);
+//     exit(1);
+//   }
+
+//   for(i = 0; i < N; i++){
+//     file[1] = '0' + i;
+//     pid = fork();
+//     if(pid < 0){
+//       printf("%s: fork failed\n", s);
+//       exit(1);
+//     }
+//     if(((i % 3) == 0 && pid == 0) ||
+//        ((i % 3) == 1 && pid != 0)){
+//       close(open(file, 0));
+//       close(open(file, 0));
+//       close(open(file, 0));
+//       close(open(file, 0));
+//       close(open(file, 0));
+//       close(open(file, 0));
+//     } else {
+//       remove(file);
+//       remove(file);
+//       remove(file);
+//       remove(file);
+//       remove(file);
+//       remove(file);
+//     }
+//     if(pid == 0)
+//       exit(0);
+//     else
+//       wait(0);
+//   }
+// }
+
+// // another concurrent link/remove/create test,
+// // to look for deadlocks.
+// void
+// linkremove(char *s)
+// {
+//   int pid, i;
+
+//   remove("x");
+//   pid = fork();
+//   if(pid < 0){
+//     printf("%s: fork failed\n", s);
+//     exit(1);
+//   }
+
+//   unsigned int x = (pid ? 1 : 97);
+//   for(i = 0; i < 100; i++){
+//     x = x * 1103515245 + 12345;
+//     if((x % 3) == 0){
+//       close(open("x", O_RDWR | O_CREATE));
+//     } else if((x % 3) == 1){
+//       link("cat", "x");
+//     } else {
+//       remove("x");
+//     }
+//   }
+
+//   if(pid)
+//     wait(0);
+//   else
+//     exit(0);
+// }
+
+// // directory that uses indirect blocks
+// void
+// bigdir(char *s)
+// {
+//   enum { N = 500 };
+//   int i, fd;
+//   char name[10];
+
+//   remove("bd");
+
+//   fd = open("bd", O_CREATE);
+//   if(fd < 0){
+//     printf("%s: bigdir create failed\n", s);
+//     exit(1);
+//   }
+//   close(fd);
+
+//   for(i = 0; i < N; i++){
+//     name[0] = 'x';
+//     name[1] = '0' + (i / 64);
+//     name[2] = '0' + (i % 64);
+//     name[3] = '\0';
+//     if(link("bd", name) != 0){
+//       printf("%s: bigdir link(bd, %s) failed\n", s, name);
+//       exit(1);
+//     }
+//   }
+
+//   remove("bd");
+//   for(i = 0; i < N; i++){
+//     name[0] = 'x';
+//     name[1] = '0' + (i / 64);
+//     name[2] = '0' + (i % 64);
+//     name[3] = '\0';
+//     if(remove(name) != 0){
+//       printf("%s: bigdir remove failed", s);
+//       exit(1);
+//     }
+//   }
+// }
+
+void
+subdir(char *s)
+{
+  int fd, cc;
+
+  remove("ff");
+  if(mkdir("dd") != 0){
+    printf("%s: mkdir dd failed\n", s);
+    exit(1);
+  }
+
+  fd = open("dd/ff", O_CREATE | O_RDWR);
+  if(fd < 0){
+    printf("%s: create dd/ff failed\n", s);
+    exit(1);
+  }
+  write(fd, "ff", 2);
+  close(fd);
+
+  if(remove("dd") >= 0){
+    printf("%s: remove dd (non-empty dir) succeeded!\n", s);
+    exit(1);
+  }
+
+  if(mkdir("/dd/dd") != 0){
+    printf("subdir mkdir dd/dd failed\n", s);
+    exit(1);
+  }
+
+  fd = open("dd/dd/ff", O_CREATE | O_RDWR);
+  if(fd < 0){
+    printf("%s: create dd/dd/ff failed\n", s);
+    exit(1);
+  }
+  write(fd, "FF", 2);
+  close(fd);
+
+  fd = open("dd/dd/../ff", 0);
+  if(fd < 0){
+    printf("%s: open dd/dd/../ff failed\n", s);
+    exit(1);
+  }
+  cc = read(fd, buf, sizeof(buf));
+  if(cc != 2 || buf[0] != 'f'){
+    printf("%s: dd/dd/../ff wrong content\n", s);
+    exit(1);
+  }
+  close(fd);
+
+  // if(link("dd/dd/ff", "dd/dd/ffff") != 0){
+  //   printf("link dd/dd/ff dd/dd/ffff failed\n", s);
+  //   exit(1);
+  // }
+
+  if(remove("dd/dd/ff") != 0){
+    printf("%s: remove dd/dd/ff failed\n", s);
+    exit(1);
+  }
+  if(open("dd/dd/ff", O_RDONLY) >= 0){
+    printf("%s: open (removeed) dd/dd/ff succeeded\n", s);
+    exit(1);
+  }
+
+  if(chdir("dd") != 0){
+    printf("%s: chdir dd failed\n", s);
+    exit(1);
+  }
+  if(chdir("dd/../../dd") != 0){
+    printf("%s: chdir dd/../../dd failed\n", s);
+    exit(1);
+  }
+  if(chdir("dd/../../../dd") != 0){
+    printf("chdir dd/../../dd failed\n", s);
+    exit(1);
+  }
+  if(chdir("./..") != 0){
+    printf("%s: chdir ./.. failed\n", s);
+    exit(1);
+  }
+
+  // fd = open("dd/dd/ffff", 0);
+  // if(fd < 0){
+  //   printf("%s: open dd/dd/ffff failed\n", s);
+  //   exit(1);
+  // }
+  // if(read(fd, buf, sizeof(buf)) != 2){
+  //   printf("%s: read dd/dd/ffff wrong len\n", s);
+  //   exit(1);
+  // }
+  // close(fd);
+
+  if(open("dd/dd/ff", O_RDONLY) >= 0){
+    printf("%s: open (removeed) dd/dd/ff succeeded!\n", s);
+    exit(1);
+  }
+
+  if(open("dd/ff/ff", O_CREATE|O_RDWR) >= 0){
+    printf("%s: create dd/ff/ff succeeded!\n", s);
+    exit(1);
+  }
+  if(open("dd/xx/ff", O_CREATE|O_RDWR) >= 0){
+    printf("%s: create dd/xx/ff succeeded!\n", s);
+    exit(1);
+  }
+  if(open("dd", O_CREATE) >= 0){
+    printf("%s: create dd succeeded!\n", s);
+    exit(1);
+  }
+  if(open("dd", O_RDWR) >= 0){
+    printf("%s: open dd rdwr succeeded!\n", s);
+    exit(1);
+  }
+  if(open("dd", O_WRONLY) >= 0){
+    printf("%s: open dd wronly succeeded!\n", s);
+    exit(1);
+  }
+  // if(link("dd/ff/ff", "dd/dd/xx") == 0){
+  //   printf("%s: link dd/ff/ff dd/dd/xx succeeded!\n", s);
+  //   exit(1);
+  // }
+  // if(link("dd/xx/ff", "dd/dd/xx") == 0){
+  //   printf("%s: link dd/xx/ff dd/dd/xx succeeded!\n", s);
+  //   exit(1);
+  // }
+  // if(link("dd/ff", "dd/dd/ffff") == 0){
+  //   printf("%s: link dd/ff dd/dd/ffff succeeded!\n", s);
+  //   exit(1);
+  // }
+  // if(mkdir("dd/ff/ff") == 0){
+  //   printf("%s: mkdir dd/ff/ff succeeded!\n", s);
+  //   exit(1);
+  // }
+  // if(mkdir("dd/xx/ff") == 0){
+  //   printf("%s: mkdir dd/xx/ff succeeded!\n", s);
+  //   exit(1);
+  // }
+  // if(mkdir("dd/dd/ffff") == 0){
+  //   printf("%s: mkdir dd/dd/ffff succeeded!\n", s);
+  //   exit(1);
+  // }
+  // if(remove("dd/xx/ff") == 0){
+  //   printf("%s: remove dd/xx/ff succeeded!\n", s);
+  //   exit(1);
+  // }
+  // if(remove("dd/ff/ff") == 0){
+  //   printf("%s: remove dd/ff/ff succeeded!\n", s);
+  //   exit(1);
+  // }
+  // if(chdir("dd/ff") == 0){
+  //   printf("%s: chdir dd/ff succeeded!\n", s);
+  //   exit(1);
+  // }
+  // if(chdir("dd/xx") == 0){
+  //   printf("%s: chdir dd/xx succeeded!\n", s);
+  //   exit(1);
+  // }
+
+  // if(remove("dd/dd/ffff") != 0){
+  //   printf("%s: remove dd/dd/ff failed\n", s);
+  //   exit(1);
+  // }
+  if(remove("dd/ff") != 0){
+    printf("%s: remove dd/ff failed\n", s);
+    exit(1);
+  }
+  if(remove("dd") == 0){
+    printf("%s: remove non-empty dd succeeded!\n", s);
+    exit(1);
+  }
+  if(remove("dd/dd") < 0){
+    printf("%s: remove dd/dd failed\n", s);
+    exit(1);
+  }
+  if(remove("dd") < 0){
+    printf("%s: remove dd failed\n", s);
+    exit(1);
+  }
+}
+
+// test writes that are larger than the log.
+void
+bigwrite(char *s)
+{
+  int fd, sz;
+
+  remove("bigwrite");
+  for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){
+    fd = open("bigwrite", O_CREATE | O_RDWR);
+    if(fd < 0){
+      printf("%s: cannot create bigwrite\n", s);
+      exit(1);
+    }
+    int i;
+    for(i = 0; i < 2; i++){
+      int cc = write(fd, buf, sz);
+      if(cc != sz){
+        printf("%s: write(%d) ret %d\n", s, sz, cc);
+        exit(1);
+      }
+    }
+    close(fd);
+    remove("bigwrite");
+  }
+}
+
+void
+bigfile(char *s)
+{
+  enum { N = 20, SZ=600 };
+  int fd, i, total, cc;
+
+  remove("bigfile.dat");
+  fd = open("bigfile.dat", O_CREATE | O_RDWR);
+  if(fd < 0){
+    printf("%s: cannot create bigfile", s);
+    exit(1);
+  }
+  for(i = 0; i < N; i++){
+    memset(buf, i, SZ);
+    if(write(fd, buf, SZ) != SZ){
+      printf("%s: write bigfile failed\n", s);
+      exit(1);
+    }
+  }
+  close(fd);
+
+  fd = open("bigfile.dat", 0);
+  if(fd < 0){
+    printf("%s: cannot open bigfile\n", s);
+    exit(1);
+  }
+  total = 0;
+  for(i = 0; ; i++){
+    cc = read(fd, buf, SZ/2);
+    if(cc < 0){
+      printf("%s: read bigfile failed\n", s);
+      exit(1);
+    }
+    if(cc == 0)
+      break;
+    if(cc != SZ/2){
+      printf("%s: short read bigfile\n", s);
+      exit(1);
+    }
+    if(buf[0] != i/2 || buf[SZ/2-1] != i/2){
+      printf("%s: read bigfile wrong data\n", s);
+      exit(1);
+    }
+    total += cc;
+  }
+  close(fd);
+  if(total != N*SZ){
+    printf("%s: read bigfile wrong total\n", s);
+    exit(1);
+  }
+  remove("bigfile.dat");
+}
+
+void
+fourteen(char *s)
+{
+  int fd;
+
+  // DIRSIZ is 14.
+
+  if(mkdir("12345678901234") != 0){
+    printf("%s: mkdir 12345678901234 failed\n", s);
+    exit(1);
+  }
+  if(mkdir("12345678901234/123456789012345") != 0){
+    printf("%s: mkdir 12345678901234/123456789012345 failed\n", s);
+    exit(1);
+  }
+  fd = open("123456789012345/123456789012345/123456789012345", O_CREATE);
+  if(fd < 0){
+    printf("%s: create 123456789012345/123456789012345/123456789012345 failed\n", s);
+    exit(1);
+  }
+  close(fd);
+  fd = open("12345678901234/12345678901234/12345678901234", 0);
+  if(fd < 0){
+    printf("%s: open 12345678901234/12345678901234/12345678901234 failed\n", s);
+    exit(1);
+  }
+  close(fd);
+
+  if(mkdir("12345678901234/12345678901234") == 0){
+    printf("%s: mkdir 12345678901234/12345678901234 succeeded!\n", s);
+    exit(1);
+  }
+  if(mkdir("123456789012345/12345678901234") == 0){
+    printf("%s: mkdir 12345678901234/123456789012345 succeeded!\n", s);
+    exit(1);
+  }
+
+  // clean up
+  remove("123456789012345/12345678901234");
+  remove("12345678901234/12345678901234");
+  remove("12345678901234/12345678901234/12345678901234");
+  remove("123456789012345/123456789012345/123456789012345");
+  remove("12345678901234/123456789012345");
+  remove("12345678901234");
+}
+
+void
+rmdot(char *s)
+{
+  if(mkdir("dots") != 0){
+    printf("%s: mkdir dots failed\n", s);
+    exit(1);
+  }
+  if(chdir("dots") != 0){
+    printf("%s: chdir dots failed\n", s);
+    exit(1);
+  }
+  if(remove(".") == 0){
+    printf("%s: rm . worked!\n", s);
+    exit(1);
+  }
+  if(remove("..") == 0){
+    printf("%s: rm .. worked!\n", s);
+    exit(1);
+  }
+  if(chdir("/") != 0){
+    printf("%s: chdir / failed\n", s);
+    exit(1);
+  }
+  if(remove("dots/.") == 0){
+    printf("%s: remove dots/. worked!\n", s);
+    exit(1);
+  }
+  if(remove("dots/..") == 0){
+    printf("%s: remove dots/.. worked!\n", s);
+    exit(1);
+  }
+  if(remove("dots") != 0){
+    printf("%s: remove dots failed!\n", s);
+    exit(1);
+  }
+}
+
+void
+dirfile(char *s)
+{
+  int fd;
+
+  fd = open("dirfile", O_CREATE);
+  if(fd < 0){
+    printf("%s: create dirfile failed\n", s);
+    exit(1);
+  }
+  close(fd);
+  if(chdir("dirfile") == 0){
+    printf("%s: chdir dirfile succeeded!\n", s);
+    exit(1);
+  }
+  fd = open("dirfile/xx", 0);
+  if(fd >= 0){
+    printf("%s: create dirfile/xx succeeded!\n", s);
+    exit(1);
+  }
+  fd = open("dirfile/xx", O_CREATE);
+  if(fd >= 0){
+    printf("%s: create dirfile/xx succeeded!\n", s);
+    exit(1);
+  }
+  if(mkdir("dirfile/xx") == 0){
+    printf("%s: mkdir dirfile/xx succeeded!\n", s);
+    exit(1);
+  }
+  if(remove("dirfile/xx") == 0){
+    printf("%s: remove dirfile/xx succeeded!\n", s);
+    exit(1);
+  }
+  // if(link("README", "dirfile/xx") == 0){
+  //   printf("%s: link to dirfile/xx succeeded!\n", s);
+  //   exit(1);
+  // }
+  if(remove("dirfile") != 0){
+    printf("%s: remove dirfile failed!\n", s);
+    exit(1);
+  }
+
+  fd = open(".", O_RDWR);
+  if(fd >= 0){
+    printf("%s: open . for writing succeeded!\n", s);
+    exit(1);
+  }
+  fd = open(".", 0);
+  if(write(fd, "x", 1) > 0){
+    printf("%s: write . succeeded!\n", s);
+    exit(1);
+  }
+  close(fd);
+}
+
+// test that iput() is called at the end of _namei().
+// also tests empty file names.
+void
+iref(char *s)
+{
+  int i, fd;
+
+  for(i = 0; i < NINODE - 4; i++){
+    if(mkdir("irefd") != 0){
+      printf("%s: mkdir irefd failed\n", s);
+      exit(1);
+    }
+    if(chdir("irefd") != 0){
+      printf("%s: chdir irefd failed\n", s);
+      exit(1);
+    }
+
+    mkdir("");
+    // link("README", "");
+    fd = open("", O_CREATE);
+    if(fd >= 0)
+      close(fd);
+    fd = open("xx", O_CREATE);
+    if(fd >= 0)
+      close(fd);
+    remove("xx");
+  }
+
+  // clean up
+  for(i = 0; i < NINODE + 1; i++){
+    chdir("..");
+    remove("irefd");
+  }
+
+  chdir("/");
+}
+
+// test that fork fails gracefully
+// the forktest binary also does this, but it runs out of proc entries first.
+// inside the bigger usertests binary, we run out of memory first.
+void
+forktest(char *s)
+{
+  enum{ N = 1000 };
+  int n, pid;
+
+  for(n=0; n<N; n++){
+    pid = fork();
+    if(pid < 0)
+      break;
+    if(pid == 0)
+      exit(0);
+  }
+
+  if (n == 0) {
+    printf("%s: no fork at all!\n", s);
+    exit(1);
+  }
+
+  if(n == N){
+    printf("%s: fork claimed to work 1000 times!\n", s);
+    exit(1);
+  }
+
+  for(; n > 0; n--){
+    if(wait(0) < 0){
+      printf("%s: wait stopped early\n", s);
+      exit(1);
+    }
+  }
+
+  if(wait(0) != -1){
+    printf("%s: wait got too many\n", s);
+    exit(1);
+  }
+}
+
+void
+sbrkbasic(char *s)
+{
+  enum { TOOMUCH=1024*1024*1024};
+  int i, pid, xstatus;
+  char *c, *a, *b;
+
+  // does sbrk() return the expected failure value?
+  pid = fork();
+  if(pid < 0){
+    printf("fork failed in sbrkbasic\n");
+    exit(1);
+  }
+  if(pid == 0){
+    a = sbrk(TOOMUCH);
+    if(a == (char*)0xffffffffffffffffL){
+      // it's OK if this fails.
+      exit(0);
+    }
+    
+    for(b = a; b < a+TOOMUCH; b += 4096){
+      *b = 99;
+    }
+    
+    // we should not get here! either sbrk(TOOMUCH)
+    // should have failed, or (with lazy allocation)
+    // a pagefault should have killed this process.
+    exit(1);
+  }
+
+  wait(&xstatus);
+  if(xstatus == 1){
+    printf("%s: too much memory allocated!\n", s);
+    exit(1);
+  }
+
+  // can one sbrk() less than a page?
+  a = sbrk(0);
+  for(i = 0; i < 5000; i++){
+    b = sbrk(1);
+    if(b != a){
+      printf("%s: sbrk test failed %d %x %x\n", i, a, b);
+      exit(1);
+    }
+    *b = 1;
+    a = b + 1;
+  }
+  pid = fork();
+  if(pid < 0){
+    printf("%s: sbrk test fork failed\n", s);
+    exit(1);
+  }
+  c = sbrk(1);
+  c = sbrk(1);
+  if(c != a + 1){
+    printf("%s: sbrk test failed post-fork\n", s);
+    exit(1);
+  }
+  if(pid == 0)
+    exit(0);
+  wait(&xstatus);
+  exit(xstatus);
+}
+
+void
+sbrkmuch(char *s)
+{
+  enum { BIG=3*1024*1024 };
+  char *c, *oldbrk, *a, *lastaddr, *p;
+  uint64 amt;
+
+  oldbrk = sbrk(0);
+
+  // can one grow address space to something big?
+  a = sbrk(0);
+  amt = BIG - (uint64)a;
+  p = sbrk(amt);
+  if (p != a) {
+    printf("%s: sbrk test failed to grow big address space; enough phys mem?\n", s);
+    exit(1);
+  }
+
+  // touch each page to make sure it exists.
+  char *eee = sbrk(0);
+  for(char *pp = a; pp < eee; pp += 4096)
+    *pp = 1;
+
+  lastaddr = (char*) (BIG-1);
+  *lastaddr = 99;
+
+  // can one de-allocate?
+  a = sbrk(0);
+  c = sbrk(-PGSIZE);
+  if(c == (char*)0xffffffffffffffffL){
+    printf("%s: sbrk could not deallocate\n", s);
+    exit(1);
+  }
+  c = sbrk(0);
+  if(c != a - PGSIZE){
+    printf("%s: sbrk deallocation produced wrong address, a %x c %x\n", a, c);
+    exit(1);
+  }
+
+  // can one re-allocate that page?
+  a = sbrk(0);
+  c = sbrk(PGSIZE);
+  if(c != a || sbrk(0) != a + PGSIZE){
+    printf("%s: sbrk re-allocation failed, a %x c %x\n", a, c);
+    exit(1);
+  }
+  if(*lastaddr == 99){
+    // should be zero
+    printf("%s: sbrk de-allocation didn't really deallocate\n", s);
+    exit(1);
+  }
+
+  a = sbrk(0);
+  c = sbrk(-(sbrk(0) - oldbrk));
+  if(c != a){
+    printf("%s: sbrk downsize failed, a %x c %x\n", a, c);
+    exit(1);
+  }
+}
+
+// can we read the kernel's memory?
+void
+kernmem(char *s)
+{
+  char *a;
+  int pid;
+
+  for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){
+    pid = fork();
+    if(pid < 0){
+      printf("%s: fork failed\n", s);
+      exit(1);
+    }
+    if(pid == 0){
+      printf("%s: oops could read %x = %x\n", a, *a);
+      exit(1);
+    }
+    int xstatus;
+    wait(&xstatus);
+    if(xstatus != -1)  // did kernel kill child?
+      exit(1);
+  }
+}
+
+// if we run the system out of memory, does it clean up the last
+// failed allocation?
+void
+sbrkfail(char *s)
+{
+  enum { BIG=100*1024*1024 };
+  int i, xstatus;
+  int fds[2];
+  char scratch;
+  char *c, *a;
+  int pids[10];
+  int pid;
+ 
+  if(pipe(fds) != 0){
+    printf("%s: pipe() failed\n", s);
+    exit(1);
+  }
+  for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
+    if((pids[i] = fork()) == 0){
+      // allocate a lot of memory
+      sbrk(BIG - (uint64)sbrk(0));
+      write(fds[1], "x", 1);
+      // sit around until killed
+      for(;;) sleep(1000);
+    }
+    if(pids[i] != -1)
+      read(fds[0], &scratch, 1);
+  }
+
+  // if those failed allocations freed up the pages they did allocate,
+  // we'll be able to allocate here
+  c = sbrk(PGSIZE);
+  for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
+    if(pids[i] == -1)
+      continue;
+    kill(pids[i]);
+    wait(0);
+  }
+  if(c == (char*)0xffffffffffffffffL){
+    printf("%s: failed sbrk leaked memory\n", s);
+    exit(1);
+  }
+
+  // test running fork with the above allocated page 
+  pid = fork();
+  if(pid < 0){
+    printf("%s: fork failed\n", s);
+    exit(1);
+  }
+  if(pid == 0){
+    // allocate a lot of memory.
+    // this should produce a page fault,
+    // and thus not complete.
+    a = sbrk(0);
+    sbrk(10*BIG);
+    int n = 0;
+    for (i = 0; i < 10*BIG; i += PGSIZE) {
+      n += *(a+i);
+    }
+    // print n so the compiler doesn't optimize away
+    // the for loop.
+    printf("%s: allocate a lot of memory succeeded %d\n", n);
+    exit(1);
+  }
+  wait(&xstatus);
+  if(xstatus != -1 && xstatus != 2)
+    exit(1);
+}
+
+  
+// test reads/writes from/to allocated memory
+void
+sbrkarg(char *s)
+{
+  char *a;
+  int fd, n;
+
+  a = sbrk(PGSIZE);
+  fd = open("sbrk", O_CREATE|O_WRONLY);
+  remove("sbrk");
+  if(fd < 0)  {
+    printf("%s: open sbrk failed\n", s);
+    exit(1);
+  }
+  if ((n = write(fd, a, PGSIZE)) < 0) {
+    printf("%s: write sbrk failed\n", s);
+    exit(1);
+  }
+  close(fd);
+
+  // test writes to allocated memory
+  a = sbrk(PGSIZE);
+  if(pipe((int *) a) != 0){
+    printf("%s: pipe() failed\n", s);
+    exit(1);
+  } 
+}
+
+void
+validatetest(char *s)
+{
+  int hi;
+  uint64 p;
+
+  hi = 1100*1024;
+  for(p = 0; p <= (uint)hi; p += PGSIZE){
+    // try to crash the kernel by passing in a bad string pointer
+    if(open((char*)p, O_RDONLY) != -1){
+      printf("%s: link should not succeed\n", s);
+      printf("bad string:[%s]\n", (char*)p);
+      exit(1);
+    }
+  }
+}
+
+// does unintialized data start out zero?
+char uninit[10000];
+void
+bsstest(char *s)
+{
+  int i;
+
+  for(i = 0; i < sizeof(uninit); i++){
+    if(uninit[i] != '\0'){
+      printf("%s: bss test failed\n", s);
+      exit(1);
+    }
+  }
+}
+
+// does exec return an error if the arguments
+// are larger than a page? or does it write
+// below the stack and wreck the instructions/data?
+void
+bigargtest(char *s)
+{
+  int pid, fd, xstatus;
+
+  remove("bigarg-ok");
+  pid = fork();
+  if(pid == 0){
+    static char *args[MAXARG];
+    int i;
+    for(i = 0; i < MAXARG-1; i++)
+      args[i] = "bigargs test: failed\n                                                                                                                                                                                                       ";
+    args[MAXARG-1] = 0;
+    exec("echo", args);
+    fd = open("bigarg-ok", O_CREATE);
+    close(fd);
+    exit(0);
+  } else if(pid < 0){
+    printf("%s: bigargtest: fork failed\n", s);
+    exit(1);
+  }
+  
+  wait(&xstatus);
+  if(xstatus != 0)
+    exit(xstatus);
+  fd = open("bigarg-ok", 0);
+  if(fd < 0){
+    printf("%s: bigarg test failed!\n", s);
+    exit(1);
+  }
+  close(fd);
+  remove("bigarg-ok");
+}
+
+// what happens when the file system runs out of blocks?
+// answer: balloc panics, so this test is not useful.
+void
+fsfull()
+{
+  int nfiles;
+  int fsblocks = 0;
+
+  printf("fsfull test\n");
+
+  for(nfiles = 0; ; nfiles++){
+    char name[64];
+    name[0] = 'f';
+    name[1] = '0' + nfiles / 1000;
+    name[2] = '0' + (nfiles % 1000) / 100;
+    name[3] = '0' + (nfiles % 100) / 10;
+    name[4] = '0' + (nfiles % 10);
+    name[5] = '\0';
+    printf("%s: writing %s\n", name);
+    int fd = open(name, O_CREATE|O_RDWR);
+    if(fd < 0){
+      printf("%s: open %s failed\n", name);
+      break;
+    }
+    int total = 0;
+    while(1){
+      int cc = write(fd, buf, BSIZE);
+      if(cc < BSIZE)
+        break;
+      total += cc;
+      fsblocks++;
+    }
+    printf("%s: wrote %d bytes\n", total);
+    close(fd);
+    if(total == 0)
+      break;
+  }
+
+  while(nfiles >= 0){
+    char name[64];
+    name[0] = 'f';
+    name[1] = '0' + nfiles / 1000;
+    name[2] = '0' + (nfiles % 1000) / 100;
+    name[3] = '0' + (nfiles % 100) / 10;
+    name[4] = '0' + (nfiles % 10);
+    name[5] = '\0';
+    remove(name);
+    nfiles--;
+  }
+
+  printf("fsfull test finished\n");
+}
+
+void argptest(char *s)
+{
+  int fd;
+  fd = open("init", O_RDONLY);
+  if (fd < 0) {
+    printf("%s: open failed\n", s);
+    exit(1);
+  }
+  read(fd, sbrk(0) - 1, -1);
+  close(fd);
+}
+
+unsigned long randstate = 1;
+unsigned int
+rand()
+{
+  randstate = randstate * 1664525 + 1013904223;
+  return randstate;
+}
+
+// check that there's an invalid page beneath
+// the user stack, to catch stack overflow.
+void
+stacktest(char *s)
+{
+  int pid;
+  int xstatus;
+  
+  pid = fork();
+  if(pid == 0) {
+    char *sp = (char *) r_sp();
+    sp -= PGSIZE;
+    // the *sp should cause a trap.
+    printf("%s: stacktest: read below stack %p\n", *sp);
+    exit(1);
+  } else if(pid < 0){
+    printf("%s: fork failed\n", s);
+    exit(1);
+  }
+  wait(&xstatus);
+  if(xstatus == -1)  // kernel killed child?
+    exit(0);
+  else
+    exit(xstatus);
+}
+
+// regression test. copyin(), copyout(), and copyinstr() used to cast
+// the virtual page address to uint, which (with certain wild system
+// call arguments) resulted in a kernel page faults.
+void
+pgbug(char *s)
+{
+  char *argv[1];
+  argv[0] = 0;
+  exec((char*)0xeaeb0b5b00002f5e, argv);
+
+  pipe((int*)0xeaeb0b5b00002f5e);
+
+  exit(0);
+}
+
+// regression test. does the kernel panic if a process sbrk()s its
+// size to be less than a page, or zero, or reduces the break by an
+// amount too small to cause a page to be freed?
+void
+sbrkbugs(char *s)
+{
+  int pid = fork();
+  if(pid < 0){
+    printf("fork failed\n");
+    exit(1);
+  }
+  if(pid == 0){
+    int sz = (uint64) sbrk(0);
+    // free all user memory; there used to be a bug that
+    // would not adjust p->sz correctly in this case,
+    // causing exit() to panic.
+    sbrk(-sz);
+    // user page fault here.
+    exit(0);
+  }
+  wait(0);
+
+  pid = fork();
+  if(pid < 0){
+    printf("fork failed\n");
+    exit(1);
+  }
+  if(pid == 0){
+    int sz = (uint64) sbrk(0);
+    // set the break to somewhere in the very first
+    // page; there used to be a bug that would incorrectly
+    // free the first page.
+    sbrk(-(sz - 3500));
+    exit(0);
+  }
+  wait(0);
+
+  pid = fork();
+  if(pid < 0){
+    printf("fork failed\n");
+    exit(1);
+  }
+  if(pid == 0){
+    // set the break in the middle of a page.
+    sbrk((10*4096 + 2048) - (uint64)sbrk(0));
+
+    // reduce the break a bit, but not enough to
+    // cause a page to be freed. this used to cause
+    // a panic.
+    sbrk(-10);
+
+    exit(0);
+  }
+  wait(0);
+
+  exit(0);
+}
+
+// regression test. does write() with an invalid buffer pointer cause
+// a block to be allocated for a file that is then not freed when the
+// 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)
+{
+  int assumed_free = 600;
+  
+  remove("junk");
+  for(int i = 0; i < assumed_free; i++){
+    int fd = open("junk", O_CREATE|O_WRONLY);
+    if(fd < 0){
+      printf("open junk failed\n");
+      exit(1);
+    }
+    write(fd, (char*)0xffffffffffL, 1);
+    close(fd);
+    remove("junk");
+  }
+
+  int fd = open("junk", O_CREATE|O_WRONLY);
+  if(fd < 0){
+    printf("open junk failed\n");
+    exit(1);
+  }
+  if(write(fd, "x", 1) != 1){
+    printf("write failed\n");
+    exit(1);
+  }
+  close(fd);
+  remove("junk");
+
+  exit(0);
+}
+
+// regression test. test whether exec() leaks memory if one of the
+// arguments is invalid. the test passes if the kernel doesn't panic.
+void
+badarg(char *s)
+{
+  for(int i = 0; i < 50000; i++){
+    char *argv[2];
+    argv[0] = (char*)0xffffffff;
+    argv[1] = 0;
+    exec("echo", argv);
+  }
+  
+  exit(0);
+}
+
+// test the exec() code that cleans up if it runs out
+// of memory. it's really a test that such a condition
+// doesn't cause a panic.
+void
+execout(char *s)
+{
+  for(int avail = 0; avail < 15; avail++){
+    int pid = fork();
+    if(pid < 0){
+      printf("fork failed\n");
+      exit(1);
+    } else if(pid == 0){
+      // allocate all of memory.
+      while(1){
+        uint64 a = (uint64) sbrk(4096);
+        if(a == 0xffffffffffffffffLL)
+          break;
+        *(char*)(a + 4096 - 1) = 1;
+      }
+
+      // free a few pages, in order to let exec() make some
+      // progress.
+      for(int i = 0; i < avail; i++)
+        sbrk(-4096);
+      
+      close(1);
+      char *args[] = { "echo", "x", 0 };
+      exec("echo", args);
+      exit(0);
+    } else {
+      wait((int*)0);
+    }
+  }
+
+  exit(0);
+}
+
+//
+// use sbrk() to count how many free physical memory pages there are.
+// touches the pages to force allocation.
+// because out of memory with lazy allocation results in the process
+// taking a fault and being killed, fork and report back.
+//
+int
+countfree()
+{
+  int fds[2];
+
+  if(pipe(fds) < 0){
+    printf("pipe() failed in countfree()\n");
+    exit(1);
+  }
+  
+  int pid = fork();
+
+  if(pid < 0){
+    printf("fork failed in countfree()\n");
+    exit(1);
+  }
+
+  if(pid == 0){
+    close(fds[0]);
+    
+    while(1){
+      uint64 a = (uint64) sbrk(4096);
+      if(a == 0xffffffffffffffff){
+        break;
+      }
+
+      // modify the memory to make sure it's really allocated.
+      *(char *)(a + 4096 - 1) = 1;
+
+      // report back one more page.
+      if(write(fds[1], "x", 1) != 1){
+        printf("write() failed in countfree()\n");
+        exit(1);
+      }
+    }
+
+    exit(0);
+  }
+
+  close(fds[1]);
+
+  int n = 0;
+  while(1){
+    char c;
+    int cc = read(fds[0], &c, 1);
+    if(cc < 0){
+      printf("read() failed in countfree()\n");
+      exit(1);
+    }
+    if(cc == 0)
+      break;
+    n += 1;
+  }
+
+  close(fds[0]);
+  wait((int*)0);
+  
+  return n;
+}
+
+// run each test in its own process. run returns 1 if child's exit()
+// indicates success.
+int
+run(void f(char *), char *s) {
+  int pid;
+  int xstatus;
+
+  printf("test %s: ", s);
+  if((pid = fork()) < 0) {
+    printf("runtest: fork error\n");
+    exit(1);
+  }
+  if(pid == 0) {
+    f(s);
+    exit(0);
+  } else {
+    wait(&xstatus);
+    if(xstatus != 0) 
+      printf("FAILED\n");
+    else
+      printf("OK\n");
+    return xstatus == 0;
+  }
+}
+
+int
+main(int argc, char *argv[])
+{
+  int continuous = 0;
+  char *justone = 0;
+
+  if(argc == 2 && strcmp(argv[1], "-c") == 0){
+    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){
+    printf("Usage: usertests [-c] [testname]\n");
+    exit(1);
+  }
+  
+  struct test {
+    void (*f)(char *);
+    char *s;
+  } tests[] = {
+    {execout, "execout"},
+    {copyin, "copyin"},
+    {copyout, "copyout"},
+    {copyinstr1, "copyinstr1"},
+    {copyinstr2, "copyinstr2"},
+    {copyinstr3, "copyinstr3"},
+    {truncate1, "truncate1"},
+    {truncate2, "truncate2"},
+    {truncate3, "truncate3"},
+    {reparent2, "reparent2"},
+    {pgbug, "pgbug" },
+    {sbrkbugs, "sbrkbugs" },
+    {badwrite, "badwrite" },
+    {badarg, "badarg" },
+    {reparent, "reparent" },
+    {twochildren, "twochildren"},
+    {forkfork, "forkfork"},
+    {forkforkfork, "forkforkfork"},
+    {argptest, "argptest"},
+    {createdelete, "createdelete"},
+              // {linkremove, "linkremove"},
+              // {linktest, "linktest"},
+    {removeread, "removeread"},
+              // {concreate, "concreate"},
+    {subdir, "subdir"},
+    {fourfiles, "fourfiles"},
+    {sharedfd, "sharedfd"},
+    {exectest, "exectest"},
+    {bigargtest, "bigargtest"},
+    {bigwrite, "bigwrite"},
+    {bsstest, "bsstest"},
+    {sbrkbasic, "sbrkbasic"},
+    {sbrkmuch, "sbrkmuch"},
+    {kernmem, "kernmem"},
+    {sbrkfail, "sbrkfail"},
+    {sbrkarg, "sbrkarg"},
+    {validatetest, "validatetest"},
+    {stacktest, "stacktest"},
+    {opentest, "opentest"},
+    {writetest, "writetest"},
+    {writebig, "writebig"},
+    {createtest, "createtest"},
+    {openiputtest, "openiput"},
+    {exitiputtest, "exitiput"},
+    {iputtest, "iput"},
+    {mem, "mem"},
+    {pipe1, "pipe1"},
+    {preempt, "preempt"},
+    {exitwait, "exitwait"},
+    {rmdot, "rmdot"},
+              // {fourteen, "fourteen"},
+    {bigfile, "bigfile"},
+    {dirfile, "dirfile"},
+    {iref, "iref"},
+    {forktest, "forktest"},
+              // {bigdir, "bigdir"}, // slow
+    { 0, 0},
+  };
+
+  if(continuous){
+    printf("continuous usertests starting\n");
+    while(1){
+      int fail = 0;
+      int free0 = countfree();
+      for (struct test *t = tests; t->s != 0; t++) {
+        if(!run(t->f, t->s)){
+          fail = 1;
+          break;
+        }
+      }
+      if(fail){
+        printf("SOME TESTS FAILED\n");
+        if(continuous != 2)
+          exit(1);
+      }
+      int free1 = countfree();
+      if(free1 < free0){
+        printf("FAILED -- lost %d free pages\n", free0 - free1);
+        if(continuous != 2)
+          exit(1);
+      }
+    }
+  }
+
+  printf("usertests starting\n");
+  int free0 = countfree();
+  int free1 = 0;
+  int fail = 0;
+  for (struct test *t = tests; t->s != 0; t++) {
+    if((justone == 0) || strcmp(t->s, justone) == 0) {
+      if(!run(t->f, t->s))
+        fail = 1;
+    }
+  }
+
+  if(fail){
+    printf("SOME TESTS FAILED\n");
+    exit(1);
+  } else if((free1 = countfree()) < free0){
+    printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0);
+    exit(1);
+  } else {
+    printf("ALL TESTS PASSED\n");
+    exit(0);
+  }
+}
diff --git a/xv6-user/usertests.d b/xv6-user/usertests.d
new file mode 100644
index 0000000000000000000000000000000000000000..847686ad93cf6b0ef4055bb6523c659c8d5235cd
--- /dev/null
+++ b/xv6-user/usertests.d
@@ -0,0 +1,5 @@
+xv6-user/usertests.o: xv6-user/usertests.c kernel/include/param.h \
+ kernel/include/types.h kernel/include/stat.h xv6-user/user.h \
+ kernel/include/fcntl.h kernel/include/syscall.h kernel/include/types.h \
+ kernel/include/sysnum.h kernel/include/memlayout.h \
+ kernel/include/riscv.h
diff --git a/xv6-user/usertests.o b/xv6-user/usertests.o
new file mode 100644
index 0000000000000000000000000000000000000000..ae3d84aa1f0721bdf769c874ebe170ed7da74448
Binary files /dev/null and b/xv6-user/usertests.o differ
diff --git a/xv6-user/usertests.sym b/xv6-user/usertests.sym
new file mode 100644
index 0000000000000000000000000000000000000000..761050680a8e46d2d554efd366c7ffe59d1dc629
--- /dev/null
+++ b/xv6-user/usertests.sym
@@ -0,0 +1,140 @@
+0000000000000000 .text
+0000000000004e70 .rodata
+0000000000006d10 .data
+0000000000007078 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 usertests.c
+0000000000007180 big.0
+0000000000007080 args.1
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+00000000000049f0 putc
+0000000000004a12 printint
+0000000000006cf8 digits
+0000000000000000 umalloc.c
+000000000000c098 freep
+000000000000c0a0 base
+0000000000000b5c writebig
+000000000000464c strcpy
+000000000000166a exitwait
+0000000000004cc8 printf
+0000000000007878 __global_pointer$
+00000000000049aa dev
+0000000000001a82 bigargtest
+0000000000004852 memmove
+0000000000002eec openiputtest
+00000000000049ce trace
+000000000000341a reparent
+0000000000004732 gets
+0000000000007078 __SDATA_BEGIN__
+0000000000004980 getpid
+000000000000149c pipe1
+00000000000048e4 memcpy
+0000000000002dcc iref
+0000000000000ec0 pgbug
+0000000000004d80 malloc
+00000000000049c4 remove
+0000000000000654 copyout
+0000000000004992 sleep
+0000000000001b9c stacktest
+00000000000049d6 sysinfo
+00000000000022d4 execout
+00000000000021bc sbrkbugs
+000000000000246e exitiputtest
+00000000000049b4 readdir
+0000000000004080 fsfull
+00000000000018f0 forktest
+0000000000001102 truncate3
+00000000000002f0 bigwrite
+000000000000356e sharedfd
+0000000000006d30 randstate
+0000000000004916 pipe
+0000000000008188 uninit
+00000000000049de rename
+0000000000002bd4 dirfile
+000000000000492a write
+00000000000000d0 bsstest
+000000000000495a fstat
+0000000000004c9a fprintf
+000000000000493e kill
+0000000000000058 validatetest
+0000000000004668 strcat
+0000000000002a4e rmdot
+00000000000004ea copyin
+0000000000004abc vprintf
+0000000000000194 truncate2
+000000000000496e chdir
+00000000000012c0 exectest
+0000000000004946 exec
+00000000000003da badwrite
+000000000000490e wait
+0000000000004220 rand
+0000000000004920 read
+00000000000030be preempt
+0000000000000ef8 badarg
+000000000000214a argptest
+00000000000034ca mem
+00000000000048aa memcmp
+00000000000048fc fork
+000000000000c0b0 __BSS_END__
+0000000000001c1e copyinstr3
+00000000000017be forkfork
+000000000000498a sbrk
+00000000000049a2 test_proc
+000000000000499a uptime
+0000000000001724 twochildren
+0000000000007078 __bss_start
+00000000000046ec memset
+00000000000019d0 kernmem
+000000000000025c createtest
+0000000000004420 main
+0000000000003b5e createdelete
+0000000000002fde forkforkfork
+0000000000003260 sbrkfail
+0000000000004696 strcmp
+00000000000049e6 shutdown
+00000000000009d0 writetest
+0000000000004978 dup
+00000000000049bc getcwd
+00000000000007be truncate1
+0000000000000112 opentest
+0000000000004382 run
+0000000000002556 subdir
+0000000000000f42 copyinstr2
+000000000000a898 buf
+0000000000003de6 dirtest
+0000000000002072 sbrkarg
+0000000000002398 iputtest
+0000000000006d10 __DATA_BEGIN__
+00000000000047ac stat
+000000000000397e bigfile
+0000000000007078 _edata
+000000000000c0b0 _end
+0000000000004250 countfree
+0000000000004904 exit
+00000000000047f2 atoi
+0000000000000000 copyinstr1
+0000000000001d38 sbrkbasic
+0000000000007078 name
+00000000000046c2 strlen
+0000000000004950 open
+0000000000000d06 removeread
+000000000000470e strchr
+0000000000003edc fourteen
+000000000000372c fourfiles
+0000000000001ebc sbrkmuch
+0000000000004964 mkdir
+0000000000004934 close
+0000000000001888 reparent2
+0000000000004cfe free
diff --git a/xv6-user/usys.S b/xv6-user/usys.S
new file mode 100644
index 0000000000000000000000000000000000000000..ee106226953e314c1d3c71c95460a4f09bc408d3
--- /dev/null
+++ b/xv6-user/usys.S
@@ -0,0 +1,137 @@
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ ecall
+ ret
+.global exit
+exit:
+ li a7, SYS_exit
+ ecall
+ ret
+.global wait
+wait:
+ li a7, SYS_wait
+ ecall
+ ret
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ ecall
+ ret
+.global read
+read:
+ li a7, SYS_read
+ ecall
+ ret
+.global write
+write:
+ li a7, SYS_write
+ ecall
+ ret
+.global close
+close:
+ li a7, SYS_close
+ ecall
+ ret
+.global kill
+kill:
+ li a7, SYS_kill
+ ecall
+ ret
+.global exec
+exec:
+ li a7, SYS_exec
+ ecall
+ ret
+.global open
+open:
+ li a7, SYS_open
+ ecall
+ ret
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ ecall
+ ret
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ ecall
+ ret
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ ecall
+ ret
+.global dup
+dup:
+ li a7, SYS_dup
+ ecall
+ ret
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ ecall
+ ret
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ ecall
+ ret
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ ecall
+ ret
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ ecall
+ ret
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ ecall
+ ret
+.global dev
+dev:
+ li a7, SYS_dev
+ ecall
+ ret
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ ecall
+ ret
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ ecall
+ ret
+.global remove
+remove:
+ li a7, SYS_remove
+ ecall
+ ret
+.global trace
+trace:
+ li a7, SYS_trace
+ ecall
+ ret
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ ecall
+ ret
+.global rename
+rename:
+ li a7, SYS_rename
+ ecall
+ ret
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ ecall
+ ret
diff --git a/xv6-user/usys.d b/xv6-user/usys.d
new file mode 100644
index 0000000000000000000000000000000000000000..77ec25b3c63aa364b36357677fda1085ed7bc75d
--- /dev/null
+++ b/xv6-user/usys.d
@@ -0,0 +1 @@
+xv6-user/usys.o: xv6-user/usys.S kernel/include/sysnum.h
diff --git a/xv6-user/usys.o b/xv6-user/usys.o
new file mode 100644
index 0000000000000000000000000000000000000000..6c1a89d9ae3ac4378ea9b3febde18ca31846b7d1
Binary files /dev/null and b/xv6-user/usys.o differ
diff --git a/xv6-user/usys.pl b/xv6-user/usys.pl
new file mode 100644
index 0000000000000000000000000000000000000000..6f55cc5ec4da03bfd4dfd363836089ea8a49cb4d
--- /dev/null
+++ b/xv6-user/usys.pl
@@ -0,0 +1,45 @@
+#!/usr/bin/perl -w
+
+# Generate usys.S, the stubs for syscalls.
+
+print "# generated by usys.pl - do not edit\n";
+
+print "#include \"kernel/include/sysnum.h\"\n";
+
+sub entry {
+    my $name = shift;
+    print ".global $name\n";
+    print "${name}:\n";
+    print " li a7, SYS_${name}\n";
+    print " ecall\n";
+    print " ret\n";
+}
+	
+entry("fork");
+entry("exit");
+entry("wait");
+entry("pipe");
+entry("read");
+entry("write");
+entry("close");
+entry("kill");
+entry("exec");
+entry("open");
+entry("fstat");
+entry("mkdir");
+entry("chdir");
+entry("dup");
+entry("getpid");
+entry("sbrk");
+entry("sleep");
+entry("uptime");
+entry("test_proc");
+entry("dev");
+entry("readdir");
+entry("getcwd");
+entry("remove");
+entry("trace");
+entry("sysinfo");
+entry("rename");
+entry("shutdown");
+
diff --git a/xv6-user/wc.asm b/xv6-user/wc.asm
new file mode 100644
index 0000000000000000000000000000000000000000..98e76f1d4b6ae7c91e93f40d01979afd59f5fb4c
--- /dev/null
+++ b/xv6-user/wc.asm
@@ -0,0 +1,1603 @@
+
+xv6-user/_wc:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <wc>:
+
+char buf[512];
+
+void
+wc(int fd, char *name)
+{
+   0:	7119                	addi	sp,sp,-128
+   2:	fc86                	sd	ra,120(sp)
+   4:	f8a2                	sd	s0,112(sp)
+   6:	f4a6                	sd	s1,104(sp)
+   8:	f0ca                	sd	s2,96(sp)
+   a:	ecce                	sd	s3,88(sp)
+   c:	e8d2                	sd	s4,80(sp)
+   e:	e4d6                	sd	s5,72(sp)
+  10:	e0da                	sd	s6,64(sp)
+  12:	fc5e                	sd	s7,56(sp)
+  14:	f862                	sd	s8,48(sp)
+  16:	f466                	sd	s9,40(sp)
+  18:	f06a                	sd	s10,32(sp)
+  1a:	ec6e                	sd	s11,24(sp)
+  1c:	0100                	addi	s0,sp,128
+  1e:	f8a43423          	sd	a0,-120(s0)
+  22:	f8b43023          	sd	a1,-128(s0)
+  int i, n;
+  int l, w, c, inword;
+
+  l = w = c = 0;
+  inword = 0;
+  26:	4981                	li	s3,0
+  l = w = c = 0;
+  28:	4c81                	li	s9,0
+  2a:	4c01                	li	s8,0
+  2c:	4b81                	li	s7,0
+  2e:	00001d97          	auipc	s11,0x1
+  32:	a73d8d93          	addi	s11,s11,-1421 # aa1 <buf+0x1>
+  while((n = read(fd, buf, sizeof(buf))) > 0){
+    for(i=0; i<n; i++){
+      c++;
+      if(buf[i] == '\n')
+  36:	4aa9                	li	s5,10
+        l++;
+      if(strchr(" \r\t\n\v", buf[i]))
+  38:	00001a17          	auipc	s4,0x1
+  3c:	990a0a13          	addi	s4,s4,-1648 # 9c8 <malloc+0xec>
+        inword = 0;
+  40:	4b01                	li	s6,0
+  while((n = read(fd, buf, sizeof(buf))) > 0){
+  42:	a805                	j	72 <wc+0x72>
+      if(strchr(" \r\t\n\v", buf[i]))
+  44:	8552                	mv	a0,s4
+  46:	00000097          	auipc	ra,0x0
+  4a:	224080e7          	jalr	548(ra) # 26a <strchr>
+  4e:	c919                	beqz	a0,64 <wc+0x64>
+        inword = 0;
+  50:	89da                	mv	s3,s6
+    for(i=0; i<n; i++){
+  52:	0485                	addi	s1,s1,1
+  54:	01248d63          	beq	s1,s2,6e <wc+0x6e>
+      if(buf[i] == '\n')
+  58:	0004c583          	lbu	a1,0(s1)
+  5c:	ff5594e3          	bne	a1,s5,44 <wc+0x44>
+        l++;
+  60:	2b85                	addiw	s7,s7,1
+  62:	b7cd                	j	44 <wc+0x44>
+      else if(!inword){
+  64:	fe0997e3          	bnez	s3,52 <wc+0x52>
+        w++;
+  68:	2c05                	addiw	s8,s8,1
+        inword = 1;
+  6a:	4985                	li	s3,1
+  6c:	b7dd                	j	52 <wc+0x52>
+      c++;
+  6e:	01ac8cbb          	addw	s9,s9,s10
+  while((n = read(fd, buf, sizeof(buf))) > 0){
+  72:	20000613          	li	a2,512
+  76:	00001597          	auipc	a1,0x1
+  7a:	a2a58593          	addi	a1,a1,-1494 # aa0 <buf>
+  7e:	f8843503          	ld	a0,-120(s0)
+  82:	00000097          	auipc	ra,0x0
+  86:	3fa080e7          	jalr	1018(ra) # 47c <read>
+  8a:	00a05f63          	blez	a0,a8 <wc+0xa8>
+    for(i=0; i<n; i++){
+  8e:	00001497          	auipc	s1,0x1
+  92:	a1248493          	addi	s1,s1,-1518 # aa0 <buf>
+  96:	00050d1b          	sext.w	s10,a0
+  9a:	fff5091b          	addiw	s2,a0,-1
+  9e:	1902                	slli	s2,s2,0x20
+  a0:	02095913          	srli	s2,s2,0x20
+  a4:	996e                	add	s2,s2,s11
+  a6:	bf4d                	j	58 <wc+0x58>
+      }
+    }
+  }
+  if(n < 0){
+  a8:	02054e63          	bltz	a0,e4 <wc+0xe4>
+    printf("wc: read error\n");
+    exit(1);
+  }
+  printf("%d\t%d\t%d\t%s\n", l, w, c, name);
+  ac:	f8043703          	ld	a4,-128(s0)
+  b0:	86e6                	mv	a3,s9
+  b2:	8662                	mv	a2,s8
+  b4:	85de                	mv	a1,s7
+  b6:	00001517          	auipc	a0,0x1
+  ba:	92a50513          	addi	a0,a0,-1750 # 9e0 <malloc+0x104>
+  be:	00000097          	auipc	ra,0x0
+  c2:	766080e7          	jalr	1894(ra) # 824 <printf>
+}
+  c6:	70e6                	ld	ra,120(sp)
+  c8:	7446                	ld	s0,112(sp)
+  ca:	74a6                	ld	s1,104(sp)
+  cc:	7906                	ld	s2,96(sp)
+  ce:	69e6                	ld	s3,88(sp)
+  d0:	6a46                	ld	s4,80(sp)
+  d2:	6aa6                	ld	s5,72(sp)
+  d4:	6b06                	ld	s6,64(sp)
+  d6:	7be2                	ld	s7,56(sp)
+  d8:	7c42                	ld	s8,48(sp)
+  da:	7ca2                	ld	s9,40(sp)
+  dc:	7d02                	ld	s10,32(sp)
+  de:	6de2                	ld	s11,24(sp)
+  e0:	6109                	addi	sp,sp,128
+  e2:	8082                	ret
+    printf("wc: read error\n");
+  e4:	00001517          	auipc	a0,0x1
+  e8:	8ec50513          	addi	a0,a0,-1812 # 9d0 <malloc+0xf4>
+  ec:	00000097          	auipc	ra,0x0
+  f0:	738080e7          	jalr	1848(ra) # 824 <printf>
+    exit(1);
+  f4:	4505                	li	a0,1
+  f6:	00000097          	auipc	ra,0x0
+  fa:	36a080e7          	jalr	874(ra) # 460 <exit>
+
+00000000000000fe <main>:
+
+int
+main(int argc, char *argv[])
+{
+  fe:	7179                	addi	sp,sp,-48
+ 100:	f406                	sd	ra,40(sp)
+ 102:	f022                	sd	s0,32(sp)
+ 104:	ec26                	sd	s1,24(sp)
+ 106:	e84a                	sd	s2,16(sp)
+ 108:	e44e                	sd	s3,8(sp)
+ 10a:	e052                	sd	s4,0(sp)
+ 10c:	1800                	addi	s0,sp,48
+  int fd, i;
+
+  if(argc <= 1){
+ 10e:	4785                	li	a5,1
+ 110:	06a7d063          	bge	a5,a0,170 <main+0x72>
+ 114:	89aa                	mv	s3,a0
+ 116:	892e                	mv	s2,a1
+    wc(0, "");
+    exit(0);
+  }
+
+  printf("LINE\tWORD\tBYTE\tFILE\n");
+ 118:	00001517          	auipc	a0,0x1
+ 11c:	8e050513          	addi	a0,a0,-1824 # 9f8 <malloc+0x11c>
+ 120:	00000097          	auipc	ra,0x0
+ 124:	704080e7          	jalr	1796(ra) # 824 <printf>
+  for(i = 1; i < argc; i++){
+ 128:	00890493          	addi	s1,s2,8
+ 12c:	39f9                	addiw	s3,s3,-2
+ 12e:	02099793          	slli	a5,s3,0x20
+ 132:	01d7d993          	srli	s3,a5,0x1d
+ 136:	0941                	addi	s2,s2,16
+ 138:	99ca                	add	s3,s3,s2
+    if((fd = open(argv[i], 0)) < 0){
+ 13a:	4581                	li	a1,0
+ 13c:	6088                	ld	a0,0(s1)
+ 13e:	00000097          	auipc	ra,0x0
+ 142:	36e080e7          	jalr	878(ra) # 4ac <open>
+ 146:	892a                	mv	s2,a0
+ 148:	04054263          	bltz	a0,18c <main+0x8e>
+      printf("wc: cannot open %s\n", argv[i]);
+      exit(1);
+    }
+    wc(fd, argv[i]);
+ 14c:	608c                	ld	a1,0(s1)
+ 14e:	00000097          	auipc	ra,0x0
+ 152:	eb2080e7          	jalr	-334(ra) # 0 <wc>
+    close(fd);
+ 156:	854a                	mv	a0,s2
+ 158:	00000097          	auipc	ra,0x0
+ 15c:	338080e7          	jalr	824(ra) # 490 <close>
+  for(i = 1; i < argc; i++){
+ 160:	04a1                	addi	s1,s1,8
+ 162:	fd349ce3          	bne	s1,s3,13a <main+0x3c>
+  }
+  exit(0);
+ 166:	4501                	li	a0,0
+ 168:	00000097          	auipc	ra,0x0
+ 16c:	2f8080e7          	jalr	760(ra) # 460 <exit>
+    wc(0, "");
+ 170:	00001597          	auipc	a1,0x1
+ 174:	88058593          	addi	a1,a1,-1920 # 9f0 <malloc+0x114>
+ 178:	4501                	li	a0,0
+ 17a:	00000097          	auipc	ra,0x0
+ 17e:	e86080e7          	jalr	-378(ra) # 0 <wc>
+    exit(0);
+ 182:	4501                	li	a0,0
+ 184:	00000097          	auipc	ra,0x0
+ 188:	2dc080e7          	jalr	732(ra) # 460 <exit>
+      printf("wc: cannot open %s\n", argv[i]);
+ 18c:	608c                	ld	a1,0(s1)
+ 18e:	00001517          	auipc	a0,0x1
+ 192:	88250513          	addi	a0,a0,-1918 # a10 <malloc+0x134>
+ 196:	00000097          	auipc	ra,0x0
+ 19a:	68e080e7          	jalr	1678(ra) # 824 <printf>
+      exit(1);
+ 19e:	4505                	li	a0,1
+ 1a0:	00000097          	auipc	ra,0x0
+ 1a4:	2c0080e7          	jalr	704(ra) # 460 <exit>
+
+00000000000001a8 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+ 1a8:	1141                	addi	sp,sp,-16
+ 1aa:	e422                	sd	s0,8(sp)
+ 1ac:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+ 1ae:	87aa                	mv	a5,a0
+ 1b0:	0585                	addi	a1,a1,1
+ 1b2:	0785                	addi	a5,a5,1
+ 1b4:	fff5c703          	lbu	a4,-1(a1)
+ 1b8:	fee78fa3          	sb	a4,-1(a5)
+ 1bc:	fb75                	bnez	a4,1b0 <strcpy+0x8>
+    ;
+  return os;
+}
+ 1be:	6422                	ld	s0,8(sp)
+ 1c0:	0141                	addi	sp,sp,16
+ 1c2:	8082                	ret
+
+00000000000001c4 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+ 1c4:	1141                	addi	sp,sp,-16
+ 1c6:	e422                	sd	s0,8(sp)
+ 1c8:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+ 1ca:	00054783          	lbu	a5,0(a0)
+ 1ce:	c385                	beqz	a5,1ee <strcat+0x2a>
+ 1d0:	87aa                	mv	a5,a0
+    s++;
+ 1d2:	0785                	addi	a5,a5,1
+  while(*s)
+ 1d4:	0007c703          	lbu	a4,0(a5)
+ 1d8:	ff6d                	bnez	a4,1d2 <strcat+0xe>
+  while((*s++ = *t++))
+ 1da:	0585                	addi	a1,a1,1
+ 1dc:	0785                	addi	a5,a5,1
+ 1de:	fff5c703          	lbu	a4,-1(a1)
+ 1e2:	fee78fa3          	sb	a4,-1(a5)
+ 1e6:	fb75                	bnez	a4,1da <strcat+0x16>
+    ;
+  return os;
+}
+ 1e8:	6422                	ld	s0,8(sp)
+ 1ea:	0141                	addi	sp,sp,16
+ 1ec:	8082                	ret
+  while(*s)
+ 1ee:	87aa                	mv	a5,a0
+ 1f0:	b7ed                	j	1da <strcat+0x16>
+
+00000000000001f2 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+ 1f2:	1141                	addi	sp,sp,-16
+ 1f4:	e422                	sd	s0,8(sp)
+ 1f6:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+ 1f8:	00054783          	lbu	a5,0(a0)
+ 1fc:	cb91                	beqz	a5,210 <strcmp+0x1e>
+ 1fe:	0005c703          	lbu	a4,0(a1)
+ 202:	00f71763          	bne	a4,a5,210 <strcmp+0x1e>
+    p++, q++;
+ 206:	0505                	addi	a0,a0,1
+ 208:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+ 20a:	00054783          	lbu	a5,0(a0)
+ 20e:	fbe5                	bnez	a5,1fe <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+ 210:	0005c503          	lbu	a0,0(a1)
+}
+ 214:	40a7853b          	subw	a0,a5,a0
+ 218:	6422                	ld	s0,8(sp)
+ 21a:	0141                	addi	sp,sp,16
+ 21c:	8082                	ret
+
+000000000000021e <strlen>:
+
+uint
+strlen(const char *s)
+{
+ 21e:	1141                	addi	sp,sp,-16
+ 220:	e422                	sd	s0,8(sp)
+ 222:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 224:	00054783          	lbu	a5,0(a0)
+ 228:	cf91                	beqz	a5,244 <strlen+0x26>
+ 22a:	0505                	addi	a0,a0,1
+ 22c:	87aa                	mv	a5,a0
+ 22e:	4685                	li	a3,1
+ 230:	9e89                	subw	a3,a3,a0
+ 232:	00f6853b          	addw	a0,a3,a5
+ 236:	0785                	addi	a5,a5,1
+ 238:	fff7c703          	lbu	a4,-1(a5)
+ 23c:	fb7d                	bnez	a4,232 <strlen+0x14>
+    ;
+  return n;
+}
+ 23e:	6422                	ld	s0,8(sp)
+ 240:	0141                	addi	sp,sp,16
+ 242:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 244:	4501                	li	a0,0
+ 246:	bfe5                	j	23e <strlen+0x20>
+
+0000000000000248 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 248:	1141                	addi	sp,sp,-16
+ 24a:	e422                	sd	s0,8(sp)
+ 24c:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 24e:	ca19                	beqz	a2,264 <memset+0x1c>
+ 250:	87aa                	mv	a5,a0
+ 252:	1602                	slli	a2,a2,0x20
+ 254:	9201                	srli	a2,a2,0x20
+ 256:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 25a:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 25e:	0785                	addi	a5,a5,1
+ 260:	fee79de3          	bne	a5,a4,25a <memset+0x12>
+  }
+  return dst;
+}
+ 264:	6422                	ld	s0,8(sp)
+ 266:	0141                	addi	sp,sp,16
+ 268:	8082                	ret
+
+000000000000026a <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 26a:	1141                	addi	sp,sp,-16
+ 26c:	e422                	sd	s0,8(sp)
+ 26e:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 270:	00054783          	lbu	a5,0(a0)
+ 274:	cb99                	beqz	a5,28a <strchr+0x20>
+    if(*s == c)
+ 276:	00f58763          	beq	a1,a5,284 <strchr+0x1a>
+  for(; *s; s++)
+ 27a:	0505                	addi	a0,a0,1
+ 27c:	00054783          	lbu	a5,0(a0)
+ 280:	fbfd                	bnez	a5,276 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 282:	4501                	li	a0,0
+}
+ 284:	6422                	ld	s0,8(sp)
+ 286:	0141                	addi	sp,sp,16
+ 288:	8082                	ret
+  return 0;
+ 28a:	4501                	li	a0,0
+ 28c:	bfe5                	j	284 <strchr+0x1a>
+
+000000000000028e <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 28e:	711d                	addi	sp,sp,-96
+ 290:	ec86                	sd	ra,88(sp)
+ 292:	e8a2                	sd	s0,80(sp)
+ 294:	e4a6                	sd	s1,72(sp)
+ 296:	e0ca                	sd	s2,64(sp)
+ 298:	fc4e                	sd	s3,56(sp)
+ 29a:	f852                	sd	s4,48(sp)
+ 29c:	f456                	sd	s5,40(sp)
+ 29e:	f05a                	sd	s6,32(sp)
+ 2a0:	ec5e                	sd	s7,24(sp)
+ 2a2:	e862                	sd	s8,16(sp)
+ 2a4:	1080                	addi	s0,sp,96
+ 2a6:	8baa                	mv	s7,a0
+ 2a8:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 2aa:	892a                	mv	s2,a0
+ 2ac:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 2ae:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 2b2:	4b29                	li	s6,10
+ 2b4:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 2b6:	89a6                	mv	s3,s1
+ 2b8:	2485                	addiw	s1,s1,1
+ 2ba:	0344d763          	bge	s1,s4,2e8 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 2be:	4605                	li	a2,1
+ 2c0:	85d6                	mv	a1,s5
+ 2c2:	4501                	li	a0,0
+ 2c4:	00000097          	auipc	ra,0x0
+ 2c8:	1b8080e7          	jalr	440(ra) # 47c <read>
+    if(cc < 1)
+ 2cc:	00a05e63          	blez	a0,2e8 <gets+0x5a>
+    buf[i++] = c;
+ 2d0:	faf44783          	lbu	a5,-81(s0)
+ 2d4:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 2d8:	01678763          	beq	a5,s6,2e6 <gets+0x58>
+ 2dc:	0905                	addi	s2,s2,1
+ 2de:	fd879ce3          	bne	a5,s8,2b6 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 2e2:	89a6                	mv	s3,s1
+ 2e4:	a011                	j	2e8 <gets+0x5a>
+ 2e6:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 2e8:	99de                	add	s3,s3,s7
+ 2ea:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 2ee:	855e                	mv	a0,s7
+ 2f0:	60e6                	ld	ra,88(sp)
+ 2f2:	6446                	ld	s0,80(sp)
+ 2f4:	64a6                	ld	s1,72(sp)
+ 2f6:	6906                	ld	s2,64(sp)
+ 2f8:	79e2                	ld	s3,56(sp)
+ 2fa:	7a42                	ld	s4,48(sp)
+ 2fc:	7aa2                	ld	s5,40(sp)
+ 2fe:	7b02                	ld	s6,32(sp)
+ 300:	6be2                	ld	s7,24(sp)
+ 302:	6c42                	ld	s8,16(sp)
+ 304:	6125                	addi	sp,sp,96
+ 306:	8082                	ret
+
+0000000000000308 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 308:	1101                	addi	sp,sp,-32
+ 30a:	ec06                	sd	ra,24(sp)
+ 30c:	e822                	sd	s0,16(sp)
+ 30e:	e426                	sd	s1,8(sp)
+ 310:	e04a                	sd	s2,0(sp)
+ 312:	1000                	addi	s0,sp,32
+ 314:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 316:	4581                	li	a1,0
+ 318:	00000097          	auipc	ra,0x0
+ 31c:	194080e7          	jalr	404(ra) # 4ac <open>
+  if(fd < 0)
+ 320:	02054563          	bltz	a0,34a <stat+0x42>
+ 324:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 326:	85ca                	mv	a1,s2
+ 328:	00000097          	auipc	ra,0x0
+ 32c:	18e080e7          	jalr	398(ra) # 4b6 <fstat>
+ 330:	892a                	mv	s2,a0
+  close(fd);
+ 332:	8526                	mv	a0,s1
+ 334:	00000097          	auipc	ra,0x0
+ 338:	15c080e7          	jalr	348(ra) # 490 <close>
+  return r;
+}
+ 33c:	854a                	mv	a0,s2
+ 33e:	60e2                	ld	ra,24(sp)
+ 340:	6442                	ld	s0,16(sp)
+ 342:	64a2                	ld	s1,8(sp)
+ 344:	6902                	ld	s2,0(sp)
+ 346:	6105                	addi	sp,sp,32
+ 348:	8082                	ret
+    return -1;
+ 34a:	597d                	li	s2,-1
+ 34c:	bfc5                	j	33c <stat+0x34>
+
+000000000000034e <atoi>:
+
+int
+atoi(const char *s)
+{
+ 34e:	1141                	addi	sp,sp,-16
+ 350:	e422                	sd	s0,8(sp)
+ 352:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 354:	00054703          	lbu	a4,0(a0)
+ 358:	02d00793          	li	a5,45
+  int neg = 1;
+ 35c:	4585                	li	a1,1
+  if (*s == '-') {
+ 35e:	04f70363          	beq	a4,a5,3a4 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 362:	00054703          	lbu	a4,0(a0)
+ 366:	fd07079b          	addiw	a5,a4,-48
+ 36a:	0ff7f793          	zext.b	a5,a5
+ 36e:	46a5                	li	a3,9
+ 370:	02f6ed63          	bltu	a3,a5,3aa <atoi+0x5c>
+  n = 0;
+ 374:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 376:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 378:	0505                	addi	a0,a0,1
+ 37a:	0026979b          	slliw	a5,a3,0x2
+ 37e:	9fb5                	addw	a5,a5,a3
+ 380:	0017979b          	slliw	a5,a5,0x1
+ 384:	9fb9                	addw	a5,a5,a4
+ 386:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 38a:	00054703          	lbu	a4,0(a0)
+ 38e:	fd07079b          	addiw	a5,a4,-48
+ 392:	0ff7f793          	zext.b	a5,a5
+ 396:	fef671e3          	bgeu	a2,a5,378 <atoi+0x2a>
+  return n * neg;
+}
+ 39a:	02d5853b          	mulw	a0,a1,a3
+ 39e:	6422                	ld	s0,8(sp)
+ 3a0:	0141                	addi	sp,sp,16
+ 3a2:	8082                	ret
+    s++;
+ 3a4:	0505                	addi	a0,a0,1
+    neg = -1;
+ 3a6:	55fd                	li	a1,-1
+ 3a8:	bf6d                	j	362 <atoi+0x14>
+  n = 0;
+ 3aa:	4681                	li	a3,0
+ 3ac:	b7fd                	j	39a <atoi+0x4c>
+
+00000000000003ae <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 3ae:	1141                	addi	sp,sp,-16
+ 3b0:	e422                	sd	s0,8(sp)
+ 3b2:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 3b4:	02b57463          	bgeu	a0,a1,3dc <memmove+0x2e>
+    while(n-- > 0)
+ 3b8:	00c05f63          	blez	a2,3d6 <memmove+0x28>
+ 3bc:	1602                	slli	a2,a2,0x20
+ 3be:	9201                	srli	a2,a2,0x20
+ 3c0:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 3c4:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 3c6:	0585                	addi	a1,a1,1
+ 3c8:	0705                	addi	a4,a4,1
+ 3ca:	fff5c683          	lbu	a3,-1(a1)
+ 3ce:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 3d2:	fee79ae3          	bne	a5,a4,3c6 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 3d6:	6422                	ld	s0,8(sp)
+ 3d8:	0141                	addi	sp,sp,16
+ 3da:	8082                	ret
+    dst += n;
+ 3dc:	00c50733          	add	a4,a0,a2
+    src += n;
+ 3e0:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 3e2:	fec05ae3          	blez	a2,3d6 <memmove+0x28>
+ 3e6:	fff6079b          	addiw	a5,a2,-1
+ 3ea:	1782                	slli	a5,a5,0x20
+ 3ec:	9381                	srli	a5,a5,0x20
+ 3ee:	fff7c793          	not	a5,a5
+ 3f2:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 3f4:	15fd                	addi	a1,a1,-1
+ 3f6:	177d                	addi	a4,a4,-1
+ 3f8:	0005c683          	lbu	a3,0(a1)
+ 3fc:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 400:	fee79ae3          	bne	a5,a4,3f4 <memmove+0x46>
+ 404:	bfc9                	j	3d6 <memmove+0x28>
+
+0000000000000406 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 406:	1141                	addi	sp,sp,-16
+ 408:	e422                	sd	s0,8(sp)
+ 40a:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 40c:	ca05                	beqz	a2,43c <memcmp+0x36>
+ 40e:	fff6069b          	addiw	a3,a2,-1
+ 412:	1682                	slli	a3,a3,0x20
+ 414:	9281                	srli	a3,a3,0x20
+ 416:	0685                	addi	a3,a3,1
+ 418:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 41a:	00054783          	lbu	a5,0(a0)
+ 41e:	0005c703          	lbu	a4,0(a1)
+ 422:	00e79863          	bne	a5,a4,432 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 426:	0505                	addi	a0,a0,1
+    p2++;
+ 428:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 42a:	fed518e3          	bne	a0,a3,41a <memcmp+0x14>
+  }
+  return 0;
+ 42e:	4501                	li	a0,0
+ 430:	a019                	j	436 <memcmp+0x30>
+      return *p1 - *p2;
+ 432:	40e7853b          	subw	a0,a5,a4
+}
+ 436:	6422                	ld	s0,8(sp)
+ 438:	0141                	addi	sp,sp,16
+ 43a:	8082                	ret
+  return 0;
+ 43c:	4501                	li	a0,0
+ 43e:	bfe5                	j	436 <memcmp+0x30>
+
+0000000000000440 <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 440:	1141                	addi	sp,sp,-16
+ 442:	e406                	sd	ra,8(sp)
+ 444:	e022                	sd	s0,0(sp)
+ 446:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 448:	00000097          	auipc	ra,0x0
+ 44c:	f66080e7          	jalr	-154(ra) # 3ae <memmove>
+}
+ 450:	60a2                	ld	ra,8(sp)
+ 452:	6402                	ld	s0,0(sp)
+ 454:	0141                	addi	sp,sp,16
+ 456:	8082                	ret
+
+0000000000000458 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 458:	4885                	li	a7,1
+ ecall
+ 45a:	00000073          	ecall
+ ret
+ 45e:	8082                	ret
+
+0000000000000460 <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 460:	05d00893          	li	a7,93
+ ecall
+ 464:	00000073          	ecall
+ ret
+ 468:	8082                	ret
+
+000000000000046a <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 46a:	488d                	li	a7,3
+ ecall
+ 46c:	00000073          	ecall
+ ret
+ 470:	8082                	ret
+
+0000000000000472 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 472:	03b00893          	li	a7,59
+ ecall
+ 476:	00000073          	ecall
+ ret
+ 47a:	8082                	ret
+
+000000000000047c <read>:
+.global read
+read:
+ li a7, SYS_read
+ 47c:	03f00893          	li	a7,63
+ ecall
+ 480:	00000073          	ecall
+ ret
+ 484:	8082                	ret
+
+0000000000000486 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 486:	04000893          	li	a7,64
+ ecall
+ 48a:	00000073          	ecall
+ ret
+ 48e:	8082                	ret
+
+0000000000000490 <close>:
+.global close
+close:
+ li a7, SYS_close
+ 490:	03900893          	li	a7,57
+ ecall
+ 494:	00000073          	ecall
+ ret
+ 498:	8082                	ret
+
+000000000000049a <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 49a:	4899                	li	a7,6
+ ecall
+ 49c:	00000073          	ecall
+ ret
+ 4a0:	8082                	ret
+
+00000000000004a2 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 4a2:	0dd00893          	li	a7,221
+ ecall
+ 4a6:	00000073          	ecall
+ ret
+ 4aa:	8082                	ret
+
+00000000000004ac <open>:
+.global open
+open:
+ li a7, SYS_open
+ 4ac:	03800893          	li	a7,56
+ ecall
+ 4b0:	00000073          	ecall
+ ret
+ 4b4:	8082                	ret
+
+00000000000004b6 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 4b6:	05000893          	li	a7,80
+ ecall
+ 4ba:	00000073          	ecall
+ ret
+ 4be:	8082                	ret
+
+00000000000004c0 <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 4c0:	02200893          	li	a7,34
+ ecall
+ 4c4:	00000073          	ecall
+ ret
+ 4c8:	8082                	ret
+
+00000000000004ca <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 4ca:	03100893          	li	a7,49
+ ecall
+ 4ce:	00000073          	ecall
+ ret
+ 4d2:	8082                	ret
+
+00000000000004d4 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 4d4:	48dd                	li	a7,23
+ ecall
+ 4d6:	00000073          	ecall
+ ret
+ 4da:	8082                	ret
+
+00000000000004dc <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 4dc:	0ac00893          	li	a7,172
+ ecall
+ 4e0:	00000073          	ecall
+ ret
+ 4e4:	8082                	ret
+
+00000000000004e6 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 4e6:	48b1                	li	a7,12
+ ecall
+ 4e8:	00000073          	ecall
+ ret
+ 4ec:	8082                	ret
+
+00000000000004ee <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 4ee:	48b5                	li	a7,13
+ ecall
+ 4f0:	00000073          	ecall
+ ret
+ 4f4:	8082                	ret
+
+00000000000004f6 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 4f6:	48b9                	li	a7,14
+ ecall
+ 4f8:	00000073          	ecall
+ ret
+ 4fc:	8082                	ret
+
+00000000000004fe <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 4fe:	48d9                	li	a7,22
+ ecall
+ 500:	00000073          	ecall
+ ret
+ 504:	8082                	ret
+
+0000000000000506 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 506:	03200893          	li	a7,50
+ ecall
+ 50a:	00000073          	ecall
+ ret
+ 50e:	8082                	ret
+
+0000000000000510 <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 510:	48ed                	li	a7,27
+ ecall
+ 512:	00000073          	ecall
+ ret
+ 516:	8082                	ret
+
+0000000000000518 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 518:	48c5                	li	a7,17
+ ecall
+ 51a:	00000073          	ecall
+ ret
+ 51e:	8082                	ret
+
+0000000000000520 <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 520:	07500893          	li	a7,117
+ ecall
+ 524:	00000073          	ecall
+ ret
+ 528:	8082                	ret
+
+000000000000052a <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 52a:	48c9                	li	a7,18
+ ecall
+ 52c:	00000073          	ecall
+ ret
+ 530:	8082                	ret
+
+0000000000000532 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 532:	48cd                	li	a7,19
+ ecall
+ 534:	00000073          	ecall
+ ret
+ 538:	8082                	ret
+
+000000000000053a <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 53a:	48e9                	li	a7,26
+ ecall
+ 53c:	00000073          	ecall
+ ret
+ 540:	8082                	ret
+
+0000000000000542 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 542:	0d200893          	li	a7,210
+ ecall
+ 546:	00000073          	ecall
+ ret
+ 54a:	8082                	ret
+
+000000000000054c <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 54c:	1101                	addi	sp,sp,-32
+ 54e:	ec06                	sd	ra,24(sp)
+ 550:	e822                	sd	s0,16(sp)
+ 552:	1000                	addi	s0,sp,32
+ 554:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 558:	4605                	li	a2,1
+ 55a:	fef40593          	addi	a1,s0,-17
+ 55e:	00000097          	auipc	ra,0x0
+ 562:	f28080e7          	jalr	-216(ra) # 486 <write>
+}
+ 566:	60e2                	ld	ra,24(sp)
+ 568:	6442                	ld	s0,16(sp)
+ 56a:	6105                	addi	sp,sp,32
+ 56c:	8082                	ret
+
+000000000000056e <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 56e:	7139                	addi	sp,sp,-64
+ 570:	fc06                	sd	ra,56(sp)
+ 572:	f822                	sd	s0,48(sp)
+ 574:	f426                	sd	s1,40(sp)
+ 576:	f04a                	sd	s2,32(sp)
+ 578:	ec4e                	sd	s3,24(sp)
+ 57a:	0080                	addi	s0,sp,64
+ 57c:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 57e:	c299                	beqz	a3,584 <printint+0x16>
+ 580:	0805c863          	bltz	a1,610 <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 584:	2581                	sext.w	a1,a1
+  neg = 0;
+ 586:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 588:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 58c:	86ce                	mv	a3,s3
+  i = 0;
+ 58e:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 590:	2601                	sext.w	a2,a2
+ 592:	00000517          	auipc	a0,0x0
+ 596:	4f650513          	addi	a0,a0,1270 # a88 <digits>
+ 59a:	883a                	mv	a6,a4
+ 59c:	2705                	addiw	a4,a4,1
+ 59e:	02c5f7bb          	remuw	a5,a1,a2
+ 5a2:	1782                	slli	a5,a5,0x20
+ 5a4:	9381                	srli	a5,a5,0x20
+ 5a6:	97aa                	add	a5,a5,a0
+ 5a8:	0007c783          	lbu	a5,0(a5)
+ 5ac:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 5b0:	0005879b          	sext.w	a5,a1
+ 5b4:	02c5d5bb          	divuw	a1,a1,a2
+ 5b8:	0685                	addi	a3,a3,1
+ 5ba:	fec7f0e3          	bgeu	a5,a2,59a <printint+0x2c>
+  if(neg)
+ 5be:	00088c63          	beqz	a7,5d6 <printint+0x68>
+    buf[i++] = '-';
+ 5c2:	fd070793          	addi	a5,a4,-48
+ 5c6:	00878733          	add	a4,a5,s0
+ 5ca:	02d00793          	li	a5,45
+ 5ce:	fef70823          	sb	a5,-16(a4)
+ 5d2:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 5d6:	02e05663          	blez	a4,602 <printint+0x94>
+ 5da:	fc040913          	addi	s2,s0,-64
+ 5de:	993a                	add	s2,s2,a4
+ 5e0:	19fd                	addi	s3,s3,-1
+ 5e2:	99ba                	add	s3,s3,a4
+ 5e4:	377d                	addiw	a4,a4,-1
+ 5e6:	1702                	slli	a4,a4,0x20
+ 5e8:	9301                	srli	a4,a4,0x20
+ 5ea:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 5ee:	fff94583          	lbu	a1,-1(s2)
+ 5f2:	8526                	mv	a0,s1
+ 5f4:	00000097          	auipc	ra,0x0
+ 5f8:	f58080e7          	jalr	-168(ra) # 54c <putc>
+  while(--i >= 0)
+ 5fc:	197d                	addi	s2,s2,-1
+ 5fe:	ff3918e3          	bne	s2,s3,5ee <printint+0x80>
+}
+ 602:	70e2                	ld	ra,56(sp)
+ 604:	7442                	ld	s0,48(sp)
+ 606:	74a2                	ld	s1,40(sp)
+ 608:	7902                	ld	s2,32(sp)
+ 60a:	69e2                	ld	s3,24(sp)
+ 60c:	6121                	addi	sp,sp,64
+ 60e:	8082                	ret
+    x = -xx;
+ 610:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 614:	4885                	li	a7,1
+    x = -xx;
+ 616:	bf8d                	j	588 <printint+0x1a>
+
+0000000000000618 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 618:	7119                	addi	sp,sp,-128
+ 61a:	fc86                	sd	ra,120(sp)
+ 61c:	f8a2                	sd	s0,112(sp)
+ 61e:	f4a6                	sd	s1,104(sp)
+ 620:	f0ca                	sd	s2,96(sp)
+ 622:	ecce                	sd	s3,88(sp)
+ 624:	e8d2                	sd	s4,80(sp)
+ 626:	e4d6                	sd	s5,72(sp)
+ 628:	e0da                	sd	s6,64(sp)
+ 62a:	fc5e                	sd	s7,56(sp)
+ 62c:	f862                	sd	s8,48(sp)
+ 62e:	f466                	sd	s9,40(sp)
+ 630:	f06a                	sd	s10,32(sp)
+ 632:	ec6e                	sd	s11,24(sp)
+ 634:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 636:	0005c903          	lbu	s2,0(a1)
+ 63a:	18090f63          	beqz	s2,7d8 <vprintf+0x1c0>
+ 63e:	8aaa                	mv	s5,a0
+ 640:	8b32                	mv	s6,a2
+ 642:	00158493          	addi	s1,a1,1
+  state = 0;
+ 646:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 648:	02500a13          	li	s4,37
+ 64c:	4c55                	li	s8,21
+ 64e:	00000c97          	auipc	s9,0x0
+ 652:	3e2c8c93          	addi	s9,s9,994 # a30 <malloc+0x154>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 656:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 65a:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 65c:	00000b97          	auipc	s7,0x0
+ 660:	42cb8b93          	addi	s7,s7,1068 # a88 <digits>
+ 664:	a839                	j	682 <vprintf+0x6a>
+        putc(fd, c);
+ 666:	85ca                	mv	a1,s2
+ 668:	8556                	mv	a0,s5
+ 66a:	00000097          	auipc	ra,0x0
+ 66e:	ee2080e7          	jalr	-286(ra) # 54c <putc>
+ 672:	a019                	j	678 <vprintf+0x60>
+    } else if(state == '%'){
+ 674:	01498d63          	beq	s3,s4,68e <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 678:	0485                	addi	s1,s1,1
+ 67a:	fff4c903          	lbu	s2,-1(s1)
+ 67e:	14090d63          	beqz	s2,7d8 <vprintf+0x1c0>
+    if(state == 0){
+ 682:	fe0999e3          	bnez	s3,674 <vprintf+0x5c>
+      if(c == '%'){
+ 686:	ff4910e3          	bne	s2,s4,666 <vprintf+0x4e>
+        state = '%';
+ 68a:	89d2                	mv	s3,s4
+ 68c:	b7f5                	j	678 <vprintf+0x60>
+      if(c == 'd'){
+ 68e:	11490c63          	beq	s2,s4,7a6 <vprintf+0x18e>
+ 692:	f9d9079b          	addiw	a5,s2,-99
+ 696:	0ff7f793          	zext.b	a5,a5
+ 69a:	10fc6e63          	bltu	s8,a5,7b6 <vprintf+0x19e>
+ 69e:	f9d9079b          	addiw	a5,s2,-99
+ 6a2:	0ff7f713          	zext.b	a4,a5
+ 6a6:	10ec6863          	bltu	s8,a4,7b6 <vprintf+0x19e>
+ 6aa:	00271793          	slli	a5,a4,0x2
+ 6ae:	97e6                	add	a5,a5,s9
+ 6b0:	439c                	lw	a5,0(a5)
+ 6b2:	97e6                	add	a5,a5,s9
+ 6b4:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 6b6:	008b0913          	addi	s2,s6,8
+ 6ba:	4685                	li	a3,1
+ 6bc:	4629                	li	a2,10
+ 6be:	000b2583          	lw	a1,0(s6)
+ 6c2:	8556                	mv	a0,s5
+ 6c4:	00000097          	auipc	ra,0x0
+ 6c8:	eaa080e7          	jalr	-342(ra) # 56e <printint>
+ 6cc:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 6ce:	4981                	li	s3,0
+ 6d0:	b765                	j	678 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 6d2:	008b0913          	addi	s2,s6,8
+ 6d6:	4681                	li	a3,0
+ 6d8:	4629                	li	a2,10
+ 6da:	000b2583          	lw	a1,0(s6)
+ 6de:	8556                	mv	a0,s5
+ 6e0:	00000097          	auipc	ra,0x0
+ 6e4:	e8e080e7          	jalr	-370(ra) # 56e <printint>
+ 6e8:	8b4a                	mv	s6,s2
+      state = 0;
+ 6ea:	4981                	li	s3,0
+ 6ec:	b771                	j	678 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 6ee:	008b0913          	addi	s2,s6,8
+ 6f2:	4681                	li	a3,0
+ 6f4:	866a                	mv	a2,s10
+ 6f6:	000b2583          	lw	a1,0(s6)
+ 6fa:	8556                	mv	a0,s5
+ 6fc:	00000097          	auipc	ra,0x0
+ 700:	e72080e7          	jalr	-398(ra) # 56e <printint>
+ 704:	8b4a                	mv	s6,s2
+      state = 0;
+ 706:	4981                	li	s3,0
+ 708:	bf85                	j	678 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 70a:	008b0793          	addi	a5,s6,8
+ 70e:	f8f43423          	sd	a5,-120(s0)
+ 712:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 716:	03000593          	li	a1,48
+ 71a:	8556                	mv	a0,s5
+ 71c:	00000097          	auipc	ra,0x0
+ 720:	e30080e7          	jalr	-464(ra) # 54c <putc>
+  putc(fd, 'x');
+ 724:	07800593          	li	a1,120
+ 728:	8556                	mv	a0,s5
+ 72a:	00000097          	auipc	ra,0x0
+ 72e:	e22080e7          	jalr	-478(ra) # 54c <putc>
+ 732:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 734:	03c9d793          	srli	a5,s3,0x3c
+ 738:	97de                	add	a5,a5,s7
+ 73a:	0007c583          	lbu	a1,0(a5)
+ 73e:	8556                	mv	a0,s5
+ 740:	00000097          	auipc	ra,0x0
+ 744:	e0c080e7          	jalr	-500(ra) # 54c <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 748:	0992                	slli	s3,s3,0x4
+ 74a:	397d                	addiw	s2,s2,-1
+ 74c:	fe0914e3          	bnez	s2,734 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 750:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 754:	4981                	li	s3,0
+ 756:	b70d                	j	678 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 758:	008b0913          	addi	s2,s6,8
+ 75c:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 760:	02098163          	beqz	s3,782 <vprintf+0x16a>
+        while(*s != 0){
+ 764:	0009c583          	lbu	a1,0(s3)
+ 768:	c5ad                	beqz	a1,7d2 <vprintf+0x1ba>
+          putc(fd, *s);
+ 76a:	8556                	mv	a0,s5
+ 76c:	00000097          	auipc	ra,0x0
+ 770:	de0080e7          	jalr	-544(ra) # 54c <putc>
+          s++;
+ 774:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 776:	0009c583          	lbu	a1,0(s3)
+ 77a:	f9e5                	bnez	a1,76a <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 77c:	8b4a                	mv	s6,s2
+      state = 0;
+ 77e:	4981                	li	s3,0
+ 780:	bde5                	j	678 <vprintf+0x60>
+          s = "(null)";
+ 782:	00000997          	auipc	s3,0x0
+ 786:	2a698993          	addi	s3,s3,678 # a28 <malloc+0x14c>
+        while(*s != 0){
+ 78a:	85ee                	mv	a1,s11
+ 78c:	bff9                	j	76a <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 78e:	008b0913          	addi	s2,s6,8
+ 792:	000b4583          	lbu	a1,0(s6)
+ 796:	8556                	mv	a0,s5
+ 798:	00000097          	auipc	ra,0x0
+ 79c:	db4080e7          	jalr	-588(ra) # 54c <putc>
+ 7a0:	8b4a                	mv	s6,s2
+      state = 0;
+ 7a2:	4981                	li	s3,0
+ 7a4:	bdd1                	j	678 <vprintf+0x60>
+        putc(fd, c);
+ 7a6:	85d2                	mv	a1,s4
+ 7a8:	8556                	mv	a0,s5
+ 7aa:	00000097          	auipc	ra,0x0
+ 7ae:	da2080e7          	jalr	-606(ra) # 54c <putc>
+      state = 0;
+ 7b2:	4981                	li	s3,0
+ 7b4:	b5d1                	j	678 <vprintf+0x60>
+        putc(fd, '%');
+ 7b6:	85d2                	mv	a1,s4
+ 7b8:	8556                	mv	a0,s5
+ 7ba:	00000097          	auipc	ra,0x0
+ 7be:	d92080e7          	jalr	-622(ra) # 54c <putc>
+        putc(fd, c);
+ 7c2:	85ca                	mv	a1,s2
+ 7c4:	8556                	mv	a0,s5
+ 7c6:	00000097          	auipc	ra,0x0
+ 7ca:	d86080e7          	jalr	-634(ra) # 54c <putc>
+      state = 0;
+ 7ce:	4981                	li	s3,0
+ 7d0:	b565                	j	678 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 7d2:	8b4a                	mv	s6,s2
+      state = 0;
+ 7d4:	4981                	li	s3,0
+ 7d6:	b54d                	j	678 <vprintf+0x60>
+    }
+  }
+}
+ 7d8:	70e6                	ld	ra,120(sp)
+ 7da:	7446                	ld	s0,112(sp)
+ 7dc:	74a6                	ld	s1,104(sp)
+ 7de:	7906                	ld	s2,96(sp)
+ 7e0:	69e6                	ld	s3,88(sp)
+ 7e2:	6a46                	ld	s4,80(sp)
+ 7e4:	6aa6                	ld	s5,72(sp)
+ 7e6:	6b06                	ld	s6,64(sp)
+ 7e8:	7be2                	ld	s7,56(sp)
+ 7ea:	7c42                	ld	s8,48(sp)
+ 7ec:	7ca2                	ld	s9,40(sp)
+ 7ee:	7d02                	ld	s10,32(sp)
+ 7f0:	6de2                	ld	s11,24(sp)
+ 7f2:	6109                	addi	sp,sp,128
+ 7f4:	8082                	ret
+
+00000000000007f6 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 7f6:	715d                	addi	sp,sp,-80
+ 7f8:	ec06                	sd	ra,24(sp)
+ 7fa:	e822                	sd	s0,16(sp)
+ 7fc:	1000                	addi	s0,sp,32
+ 7fe:	e010                	sd	a2,0(s0)
+ 800:	e414                	sd	a3,8(s0)
+ 802:	e818                	sd	a4,16(s0)
+ 804:	ec1c                	sd	a5,24(s0)
+ 806:	03043023          	sd	a6,32(s0)
+ 80a:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 80e:	8622                	mv	a2,s0
+ 810:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 814:	00000097          	auipc	ra,0x0
+ 818:	e04080e7          	jalr	-508(ra) # 618 <vprintf>
+}
+ 81c:	60e2                	ld	ra,24(sp)
+ 81e:	6442                	ld	s0,16(sp)
+ 820:	6161                	addi	sp,sp,80
+ 822:	8082                	ret
+
+0000000000000824 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 824:	711d                	addi	sp,sp,-96
+ 826:	ec06                	sd	ra,24(sp)
+ 828:	e822                	sd	s0,16(sp)
+ 82a:	1000                	addi	s0,sp,32
+ 82c:	e40c                	sd	a1,8(s0)
+ 82e:	e810                	sd	a2,16(s0)
+ 830:	ec14                	sd	a3,24(s0)
+ 832:	f018                	sd	a4,32(s0)
+ 834:	f41c                	sd	a5,40(s0)
+ 836:	03043823          	sd	a6,48(s0)
+ 83a:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 83e:	00840613          	addi	a2,s0,8
+ 842:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 846:	85aa                	mv	a1,a0
+ 848:	4505                	li	a0,1
+ 84a:	00000097          	auipc	ra,0x0
+ 84e:	dce080e7          	jalr	-562(ra) # 618 <vprintf>
+}
+ 852:	60e2                	ld	ra,24(sp)
+ 854:	6442                	ld	s0,16(sp)
+ 856:	6125                	addi	sp,sp,96
+ 858:	8082                	ret
+
+000000000000085a <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 85a:	1141                	addi	sp,sp,-16
+ 85c:	e422                	sd	s0,8(sp)
+ 85e:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 860:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 864:	00000797          	auipc	a5,0x0
+ 868:	43c7b783          	ld	a5,1084(a5) # ca0 <freep>
+ 86c:	a02d                	j	896 <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;
+ 86e:	4618                	lw	a4,8(a2)
+ 870:	9f2d                	addw	a4,a4,a1
+ 872:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 876:	6398                	ld	a4,0(a5)
+ 878:	6310                	ld	a2,0(a4)
+ 87a:	a83d                	j	8b8 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 87c:	ff852703          	lw	a4,-8(a0)
+ 880:	9f31                	addw	a4,a4,a2
+ 882:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 884:	ff053683          	ld	a3,-16(a0)
+ 888:	a091                	j	8cc <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 88a:	6398                	ld	a4,0(a5)
+ 88c:	00e7e463          	bltu	a5,a4,894 <free+0x3a>
+ 890:	00e6ea63          	bltu	a3,a4,8a4 <free+0x4a>
+{
+ 894:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 896:	fed7fae3          	bgeu	a5,a3,88a <free+0x30>
+ 89a:	6398                	ld	a4,0(a5)
+ 89c:	00e6e463          	bltu	a3,a4,8a4 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 8a0:	fee7eae3          	bltu	a5,a4,894 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 8a4:	ff852583          	lw	a1,-8(a0)
+ 8a8:	6390                	ld	a2,0(a5)
+ 8aa:	02059813          	slli	a6,a1,0x20
+ 8ae:	01c85713          	srli	a4,a6,0x1c
+ 8b2:	9736                	add	a4,a4,a3
+ 8b4:	fae60de3          	beq	a2,a4,86e <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 8b8:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 8bc:	4790                	lw	a2,8(a5)
+ 8be:	02061593          	slli	a1,a2,0x20
+ 8c2:	01c5d713          	srli	a4,a1,0x1c
+ 8c6:	973e                	add	a4,a4,a5
+ 8c8:	fae68ae3          	beq	a3,a4,87c <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 8cc:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 8ce:	00000717          	auipc	a4,0x0
+ 8d2:	3cf73923          	sd	a5,978(a4) # ca0 <freep>
+}
+ 8d6:	6422                	ld	s0,8(sp)
+ 8d8:	0141                	addi	sp,sp,16
+ 8da:	8082                	ret
+
+00000000000008dc <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 8dc:	7139                	addi	sp,sp,-64
+ 8de:	fc06                	sd	ra,56(sp)
+ 8e0:	f822                	sd	s0,48(sp)
+ 8e2:	f426                	sd	s1,40(sp)
+ 8e4:	f04a                	sd	s2,32(sp)
+ 8e6:	ec4e                	sd	s3,24(sp)
+ 8e8:	e852                	sd	s4,16(sp)
+ 8ea:	e456                	sd	s5,8(sp)
+ 8ec:	e05a                	sd	s6,0(sp)
+ 8ee:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 8f0:	02051493          	slli	s1,a0,0x20
+ 8f4:	9081                	srli	s1,s1,0x20
+ 8f6:	04bd                	addi	s1,s1,15
+ 8f8:	8091                	srli	s1,s1,0x4
+ 8fa:	00148a1b          	addiw	s4,s1,1
+ 8fe:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 900:	00000517          	auipc	a0,0x0
+ 904:	3a053503          	ld	a0,928(a0) # ca0 <freep>
+ 908:	c515                	beqz	a0,934 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 90a:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 90c:	4798                	lw	a4,8(a5)
+ 90e:	04977163          	bgeu	a4,s1,950 <malloc+0x74>
+ 912:	89d2                	mv	s3,s4
+ 914:	000a071b          	sext.w	a4,s4
+ 918:	6685                	lui	a3,0x1
+ 91a:	00d77363          	bgeu	a4,a3,920 <malloc+0x44>
+ 91e:	6985                	lui	s3,0x1
+ 920:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 924:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 928:	00000917          	auipc	s2,0x0
+ 92c:	37890913          	addi	s2,s2,888 # ca0 <freep>
+  if(p == (char*)-1)
+ 930:	5afd                	li	s5,-1
+ 932:	a8a5                	j	9aa <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 934:	00000797          	auipc	a5,0x0
+ 938:	36c78793          	addi	a5,a5,876 # ca0 <freep>
+ 93c:	00000717          	auipc	a4,0x0
+ 940:	36c70713          	addi	a4,a4,876 # ca8 <base>
+ 944:	e398                	sd	a4,0(a5)
+ 946:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 948:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 94c:	87ba                	mv	a5,a4
+ 94e:	b7d1                	j	912 <malloc+0x36>
+      if(p->s.size == nunits)
+ 950:	02e48c63          	beq	s1,a4,988 <malloc+0xac>
+        p->s.size -= nunits;
+ 954:	4147073b          	subw	a4,a4,s4
+ 958:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 95a:	02071693          	slli	a3,a4,0x20
+ 95e:	01c6d713          	srli	a4,a3,0x1c
+ 962:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 964:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 968:	00000717          	auipc	a4,0x0
+ 96c:	32a73c23          	sd	a0,824(a4) # ca0 <freep>
+      return (void*)(p + 1);
+ 970:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 974:	70e2                	ld	ra,56(sp)
+ 976:	7442                	ld	s0,48(sp)
+ 978:	74a2                	ld	s1,40(sp)
+ 97a:	7902                	ld	s2,32(sp)
+ 97c:	69e2                	ld	s3,24(sp)
+ 97e:	6a42                	ld	s4,16(sp)
+ 980:	6aa2                	ld	s5,8(sp)
+ 982:	6b02                	ld	s6,0(sp)
+ 984:	6121                	addi	sp,sp,64
+ 986:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 988:	6398                	ld	a4,0(a5)
+ 98a:	e118                	sd	a4,0(a0)
+ 98c:	bff1                	j	968 <malloc+0x8c>
+  hp->s.size = nu;
+ 98e:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 992:	0541                	addi	a0,a0,16
+ 994:	00000097          	auipc	ra,0x0
+ 998:	ec6080e7          	jalr	-314(ra) # 85a <free>
+  return freep;
+ 99c:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 9a0:	d971                	beqz	a0,974 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 9a2:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 9a4:	4798                	lw	a4,8(a5)
+ 9a6:	fa9775e3          	bgeu	a4,s1,950 <malloc+0x74>
+    if(p == freep)
+ 9aa:	00093703          	ld	a4,0(s2)
+ 9ae:	853e                	mv	a0,a5
+ 9b0:	fef719e3          	bne	a4,a5,9a2 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 9b4:	854e                	mv	a0,s3
+ 9b6:	00000097          	auipc	ra,0x0
+ 9ba:	b30080e7          	jalr	-1232(ra) # 4e6 <sbrk>
+  if(p == (char*)-1)
+ 9be:	fd5518e3          	bne	a0,s5,98e <malloc+0xb2>
+        return 0;
+ 9c2:	4501                	li	a0,0
+ 9c4:	bf45                	j	974 <malloc+0x98>
diff --git a/xv6-user/wc.c b/xv6-user/wc.c
new file mode 100644
index 0000000000000000000000000000000000000000..6e7beb682125056d521be8d06ef9d5effc70f262
--- /dev/null
+++ b/xv6-user/wc.c
@@ -0,0 +1,55 @@
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+char buf[512];
+
+void
+wc(int fd, char *name)
+{
+  int i, n;
+  int l, w, c, inword;
+
+  l = w = c = 0;
+  inword = 0;
+  while((n = read(fd, buf, sizeof(buf))) > 0){
+    for(i=0; i<n; i++){
+      c++;
+      if(buf[i] == '\n')
+        l++;
+      if(strchr(" \r\t\n\v", buf[i]))
+        inword = 0;
+      else if(!inword){
+        w++;
+        inword = 1;
+      }
+    }
+  }
+  if(n < 0){
+    printf("wc: read error\n");
+    exit(1);
+  }
+  printf("%d\t%d\t%d\t%s\n", l, w, c, name);
+}
+
+int
+main(int argc, char *argv[])
+{
+  int fd, i;
+
+  if(argc <= 1){
+    wc(0, "");
+    exit(0);
+  }
+
+  printf("LINE\tWORD\tBYTE\tFILE\n");
+  for(i = 1; i < argc; i++){
+    if((fd = open(argv[i], 0)) < 0){
+      printf("wc: cannot open %s\n", argv[i]);
+      exit(1);
+    }
+    wc(fd, argv[i]);
+    close(fd);
+  }
+  exit(0);
+}
diff --git a/xv6-user/wc.d b/xv6-user/wc.d
new file mode 100644
index 0000000000000000000000000000000000000000..bd3be8c175471e5da8f844b6b402c592b0102506
--- /dev/null
+++ b/xv6-user/wc.d
@@ -0,0 +1,2 @@
+xv6-user/wc.o: xv6-user/wc.c kernel/include/types.h kernel/include/stat.h \
+ xv6-user/user.h kernel/include/fcntl.h
diff --git a/xv6-user/wc.o b/xv6-user/wc.o
new file mode 100644
index 0000000000000000000000000000000000000000..1f6328be04d82e7c96d1a79d292941bb2d9d533d
Binary files /dev/null and b/xv6-user/wc.o differ
diff --git a/xv6-user/wc.sym b/xv6-user/wc.sym
new file mode 100644
index 0000000000000000000000000000000000000000..9b9b452b3f7969378444785287fcbb4fbd5ac501
--- /dev/null
+++ b/xv6-user/wc.sym
@@ -0,0 +1,78 @@
+0000000000000000 .text
+00000000000009c8 .rodata
+0000000000000aa0 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 wc.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+000000000000054c putc
+000000000000056e printint
+0000000000000a88 digits
+0000000000000000 umalloc.c
+0000000000000ca0 freep
+0000000000000ca8 base
+00000000000001a8 strcpy
+0000000000000824 printf
+0000000000001299 __global_pointer$
+0000000000000506 dev
+00000000000003ae memmove
+000000000000052a trace
+000000000000028e gets
+0000000000000a99 __SDATA_BEGIN__
+00000000000004dc getpid
+0000000000000440 memcpy
+00000000000008dc malloc
+0000000000000520 remove
+00000000000004ee sleep
+0000000000000532 sysinfo
+0000000000000510 readdir
+0000000000000472 pipe
+000000000000053a rename
+0000000000000486 write
+00000000000004b6 fstat
+00000000000007f6 fprintf
+000000000000049a kill
+00000000000001c4 strcat
+0000000000000618 vprintf
+00000000000004ca chdir
+00000000000004a2 exec
+000000000000046a wait
+000000000000047c read
+0000000000000000 wc
+0000000000000406 memcmp
+0000000000000458 fork
+0000000000000cb8 __BSS_END__
+00000000000004e6 sbrk
+00000000000004fe test_proc
+00000000000004f6 uptime
+0000000000000a99 __bss_start
+0000000000000248 memset
+00000000000000fe main
+00000000000001f2 strcmp
+0000000000000542 shutdown
+00000000000004d4 dup
+0000000000000518 getcwd
+0000000000000aa0 buf
+0000000000000a99 __DATA_BEGIN__
+0000000000000308 stat
+0000000000000a99 _edata
+0000000000000cb8 _end
+0000000000000460 exit
+000000000000034e atoi
+000000000000021e strlen
+00000000000004ac open
+000000000000026a strchr
+00000000000004c0 mkdir
+0000000000000490 close
+000000000000085a free
diff --git a/xv6-user/xargs.asm b/xv6-user/xargs.asm
new file mode 100644
index 0000000000000000000000000000000000000000..ac596ffb28e26ee22c2c670ff515cee0c2f4e0f5
--- /dev/null
+++ b/xv6-user/xargs.asm
@@ -0,0 +1,1602 @@
+
+xv6-user/_xargs:     file format elf64-littleriscv
+
+
+Disassembly of section .text:
+
+0000000000000000 <readline>:
+/**
+ * len:    include the 0 in the end.
+ * return: the number of bytes that read successfully (0 in the end is not included)
+ */
+int readline(int fd, char *buf, int len)
+{
+   0:	7139                	addi	sp,sp,-64
+   2:	fc06                	sd	ra,56(sp)
+   4:	f822                	sd	s0,48(sp)
+   6:	f426                	sd	s1,40(sp)
+   8:	f04a                	sd	s2,32(sp)
+   a:	ec4e                	sd	s3,24(sp)
+   c:	e852                	sd	s4,16(sp)
+   e:	e456                	sd	s5,8(sp)
+  10:	0080                	addi	s0,sp,64
+  12:	89aa                	mv	s3,a0
+  14:	892e                	mv	s2,a1
+    char *p = buf;
+  16:	84ae                	mv	s1,a1
+    while (read(fd, p, 1) != 0 && p < buf + len) {
+  18:	00c58a33          	add	s4,a1,a2
+        if (*p == '\n') {
+  1c:	4aa9                	li	s5,10
+    while (read(fd, p, 1) != 0 && p < buf + len) {
+  1e:	a011                	j	22 <readline+0x22>
+                continue;
+            }
+            *p = '\0';
+            break;
+        }
+        p++;
+  20:	0485                	addi	s1,s1,1
+    while (read(fd, p, 1) != 0 && p < buf + len) {
+  22:	4605                	li	a2,1
+  24:	85a6                	mv	a1,s1
+  26:	854e                	mv	a0,s3
+  28:	00000097          	auipc	ra,0x0
+  2c:	462080e7          	jalr	1122(ra) # 48a <read>
+  30:	c905                	beqz	a0,60 <readline+0x60>
+  32:	0344f763          	bgeu	s1,s4,60 <readline+0x60>
+        if (*p == '\n') {
+  36:	0004c783          	lbu	a5,0(s1)
+  3a:	ff5793e3          	bne	a5,s5,20 <readline+0x20>
+            if (p == buf) {     // ignore empty line
+  3e:	01248f63          	beq	s1,s2,5c <readline+0x5c>
+            *p = '\0';
+  42:	00048023          	sb	zero,0(s1)
+    }
+    if (p == buf) {
+        return 0;
+    }
+    return p - buf;
+  46:	4124853b          	subw	a0,s1,s2
+}
+  4a:	70e2                	ld	ra,56(sp)
+  4c:	7442                	ld	s0,48(sp)
+  4e:	74a2                	ld	s1,40(sp)
+  50:	7902                	ld	s2,32(sp)
+  52:	69e2                	ld	s3,24(sp)
+  54:	6a42                	ld	s4,16(sp)
+  56:	6aa2                	ld	s5,8(sp)
+  58:	6121                	addi	sp,sp,64
+  5a:	8082                	ret
+  5c:	84ca                	mv	s1,s2
+  5e:	b7d1                	j	22 <readline+0x22>
+        return 0;
+  60:	4501                	li	a0,0
+    if (p == buf) {
+  62:	ff2484e3          	beq	s1,s2,4a <readline+0x4a>
+  66:	b7c5                	j	46 <readline+0x46>
+
+0000000000000068 <main>:
+
+int main(int argc, char *argv[])
+{
+  68:	7161                	addi	sp,sp,-432
+  6a:	f706                	sd	ra,424(sp)
+  6c:	f322                	sd	s0,416(sp)
+  6e:	ef26                	sd	s1,408(sp)
+  70:	eb4a                	sd	s2,400(sp)
+  72:	e74e                	sd	s3,392(sp)
+  74:	1b00                	addi	s0,sp,432
+    if (argc < 2) {
+  76:	4785                	li	a5,1
+  78:	0aa7d063          	bge	a5,a0,118 <main+0xb0>
+  7c:	84aa                	mv	s1,a0
+  7e:	892e                	mv	s2,a1
+  80:	00858713          	addi	a4,a1,8
+  84:	ed040793          	addi	a5,s0,-304
+  88:	0005059b          	sext.w	a1,a0
+  8c:	ffe5061b          	addiw	a2,a0,-2
+  90:	02061693          	slli	a3,a2,0x20
+  94:	01d6d613          	srli	a2,a3,0x1d
+  98:	ed840693          	addi	a3,s0,-296
+  9c:	9636                	add	a2,a2,a3
+    }
+    char *argvs[MAXARG];
+    char buf[128];
+    int i;
+    for (i = 1; i < argc; i++) {
+        argvs[i - 1] = argv[i];         // argvs[0] = COMMAND
+  9e:	6314                	ld	a3,0(a4)
+  a0:	e394                	sd	a3,0(a5)
+    for (i = 1; i < argc; i++) {
+  a2:	0721                	addi	a4,a4,8
+  a4:	07a1                	addi	a5,a5,8
+  a6:	fec79ce3          	bne	a5,a2,9e <main+0x36>
+  aa:	fff5899b          	addiw	s3,a1,-1
+    }
+    i--;
+    if (readline(0, buf, 128) == 0) {   // if there is no input
+  ae:	08000613          	li	a2,128
+  b2:	e5040593          	addi	a1,s0,-432
+  b6:	4501                	li	a0,0
+  b8:	00000097          	auipc	ra,0x0
+  bc:	f48080e7          	jalr	-184(ra) # 0 <readline>
+  c0:	c935                	beqz	a0,134 <main+0xcc>
+            printf("xargs: exec %s fail\n", argv[1]);
+            exit(0);
+        }
+        wait(0);
+    } else {
+        argvs[i] = buf;
+  c2:	00399593          	slli	a1,s3,0x3
+  c6:	fd058793          	addi	a5,a1,-48
+  ca:	008785b3          	add	a1,a5,s0
+  ce:	e5040793          	addi	a5,s0,-432
+  d2:	f0f5b023          	sd	a5,-256(a1)
+        argvs[i + 1] = 0;
+  d6:	048e                	slli	s1,s1,0x3
+  d8:	fd048793          	addi	a5,s1,-48
+  dc:	008784b3          	add	s1,a5,s0
+  e0:	f004b023          	sd	zero,-256(s1)
+                exec(argv[1], argvs);
+                printf("xargs: exec %s fail\n", argv[1]);
+                exit(0);
+            }
+            wait(0);
+        } while (readline(0, buf, 128) != 0);
+  e4:	e5040493          	addi	s1,s0,-432
+            if (fork() == 0) {
+  e8:	00000097          	auipc	ra,0x0
+  ec:	37e080e7          	jalr	894(ra) # 466 <fork>
+  f0:	cd41                	beqz	a0,188 <main+0x120>
+            wait(0);
+  f2:	4501                	li	a0,0
+  f4:	00000097          	auipc	ra,0x0
+  f8:	384080e7          	jalr	900(ra) # 478 <wait>
+        } while (readline(0, buf, 128) != 0);
+  fc:	08000613          	li	a2,128
+ 100:	85a6                	mv	a1,s1
+ 102:	4501                	li	a0,0
+ 104:	00000097          	auipc	ra,0x0
+ 108:	efc080e7          	jalr	-260(ra) # 0 <readline>
+ 10c:	fd71                	bnez	a0,e8 <main+0x80>
+    }
+    exit(0);
+ 10e:	4501                	li	a0,0
+ 110:	00000097          	auipc	ra,0x0
+ 114:	35e080e7          	jalr	862(ra) # 46e <exit>
+        fprintf(2, "Usage: xargs COMMAND [INITIAL-ARGS]...\n");
+ 118:	00001597          	auipc	a1,0x1
+ 11c:	8c058593          	addi	a1,a1,-1856 # 9d8 <malloc+0xee>
+ 120:	4509                	li	a0,2
+ 122:	00000097          	auipc	ra,0x0
+ 126:	6e2080e7          	jalr	1762(ra) # 804 <fprintf>
+        exit(-1);
+ 12a:	557d                	li	a0,-1
+ 12c:	00000097          	auipc	ra,0x0
+ 130:	342080e7          	jalr	834(ra) # 46e <exit>
+        argvs[i] = 0;
+ 134:	00399593          	slli	a1,s3,0x3
+ 138:	fd058793          	addi	a5,a1,-48
+ 13c:	008785b3          	add	a1,a5,s0
+ 140:	f005b023          	sd	zero,-256(a1)
+        if (fork() == 0) {
+ 144:	00000097          	auipc	ra,0x0
+ 148:	322080e7          	jalr	802(ra) # 466 <fork>
+ 14c:	e905                	bnez	a0,17c <main+0x114>
+            exec(argv[1], argvs);
+ 14e:	ed040593          	addi	a1,s0,-304
+ 152:	00893503          	ld	a0,8(s2)
+ 156:	00000097          	auipc	ra,0x0
+ 15a:	35a080e7          	jalr	858(ra) # 4b0 <exec>
+            printf("xargs: exec %s fail\n", argv[1]);
+ 15e:	00893583          	ld	a1,8(s2)
+ 162:	00001517          	auipc	a0,0x1
+ 166:	89e50513          	addi	a0,a0,-1890 # a00 <malloc+0x116>
+ 16a:	00000097          	auipc	ra,0x0
+ 16e:	6c8080e7          	jalr	1736(ra) # 832 <printf>
+            exit(0);
+ 172:	4501                	li	a0,0
+ 174:	00000097          	auipc	ra,0x0
+ 178:	2fa080e7          	jalr	762(ra) # 46e <exit>
+        wait(0);
+ 17c:	4501                	li	a0,0
+ 17e:	00000097          	auipc	ra,0x0
+ 182:	2fa080e7          	jalr	762(ra) # 478 <wait>
+ 186:	b761                	j	10e <main+0xa6>
+                exec(argv[1], argvs);
+ 188:	ed040593          	addi	a1,s0,-304
+ 18c:	00893503          	ld	a0,8(s2)
+ 190:	00000097          	auipc	ra,0x0
+ 194:	320080e7          	jalr	800(ra) # 4b0 <exec>
+                printf("xargs: exec %s fail\n", argv[1]);
+ 198:	00893583          	ld	a1,8(s2)
+ 19c:	00001517          	auipc	a0,0x1
+ 1a0:	86450513          	addi	a0,a0,-1948 # a00 <malloc+0x116>
+ 1a4:	00000097          	auipc	ra,0x0
+ 1a8:	68e080e7          	jalr	1678(ra) # 832 <printf>
+                exit(0);
+ 1ac:	4501                	li	a0,0
+ 1ae:	00000097          	auipc	ra,0x0
+ 1b2:	2c0080e7          	jalr	704(ra) # 46e <exit>
+
+00000000000001b6 <strcpy>:
+#include "kernel/include/fcntl.h"
+#include "xv6-user/user.h"
+
+char*
+strcpy(char *s, const char *t)
+{
+ 1b6:	1141                	addi	sp,sp,-16
+ 1b8:	e422                	sd	s0,8(sp)
+ 1ba:	0800                	addi	s0,sp,16
+  char *os;
+
+  os = s;
+  while((*s++ = *t++) != 0)
+ 1bc:	87aa                	mv	a5,a0
+ 1be:	0585                	addi	a1,a1,1
+ 1c0:	0785                	addi	a5,a5,1
+ 1c2:	fff5c703          	lbu	a4,-1(a1)
+ 1c6:	fee78fa3          	sb	a4,-1(a5)
+ 1ca:	fb75                	bnez	a4,1be <strcpy+0x8>
+    ;
+  return os;
+}
+ 1cc:	6422                	ld	s0,8(sp)
+ 1ce:	0141                	addi	sp,sp,16
+ 1d0:	8082                	ret
+
+00000000000001d2 <strcat>:
+
+char*
+strcat(char *s, const char *t)
+{
+ 1d2:	1141                	addi	sp,sp,-16
+ 1d4:	e422                	sd	s0,8(sp)
+ 1d6:	0800                	addi	s0,sp,16
+  char *os = s;
+  while(*s)
+ 1d8:	00054783          	lbu	a5,0(a0)
+ 1dc:	c385                	beqz	a5,1fc <strcat+0x2a>
+ 1de:	87aa                	mv	a5,a0
+    s++;
+ 1e0:	0785                	addi	a5,a5,1
+  while(*s)
+ 1e2:	0007c703          	lbu	a4,0(a5)
+ 1e6:	ff6d                	bnez	a4,1e0 <strcat+0xe>
+  while((*s++ = *t++))
+ 1e8:	0585                	addi	a1,a1,1
+ 1ea:	0785                	addi	a5,a5,1
+ 1ec:	fff5c703          	lbu	a4,-1(a1)
+ 1f0:	fee78fa3          	sb	a4,-1(a5)
+ 1f4:	fb75                	bnez	a4,1e8 <strcat+0x16>
+    ;
+  return os;
+}
+ 1f6:	6422                	ld	s0,8(sp)
+ 1f8:	0141                	addi	sp,sp,16
+ 1fa:	8082                	ret
+  while(*s)
+ 1fc:	87aa                	mv	a5,a0
+ 1fe:	b7ed                	j	1e8 <strcat+0x16>
+
+0000000000000200 <strcmp>:
+
+
+int
+strcmp(const char *p, const char *q)
+{
+ 200:	1141                	addi	sp,sp,-16
+ 202:	e422                	sd	s0,8(sp)
+ 204:	0800                	addi	s0,sp,16
+  while(*p && *p == *q)
+ 206:	00054783          	lbu	a5,0(a0)
+ 20a:	cb91                	beqz	a5,21e <strcmp+0x1e>
+ 20c:	0005c703          	lbu	a4,0(a1)
+ 210:	00f71763          	bne	a4,a5,21e <strcmp+0x1e>
+    p++, q++;
+ 214:	0505                	addi	a0,a0,1
+ 216:	0585                	addi	a1,a1,1
+  while(*p && *p == *q)
+ 218:	00054783          	lbu	a5,0(a0)
+ 21c:	fbe5                	bnez	a5,20c <strcmp+0xc>
+  return (uchar)*p - (uchar)*q;
+ 21e:	0005c503          	lbu	a0,0(a1)
+}
+ 222:	40a7853b          	subw	a0,a5,a0
+ 226:	6422                	ld	s0,8(sp)
+ 228:	0141                	addi	sp,sp,16
+ 22a:	8082                	ret
+
+000000000000022c <strlen>:
+
+uint
+strlen(const char *s)
+{
+ 22c:	1141                	addi	sp,sp,-16
+ 22e:	e422                	sd	s0,8(sp)
+ 230:	0800                	addi	s0,sp,16
+  int n;
+
+  for(n = 0; s[n]; n++)
+ 232:	00054783          	lbu	a5,0(a0)
+ 236:	cf91                	beqz	a5,252 <strlen+0x26>
+ 238:	0505                	addi	a0,a0,1
+ 23a:	87aa                	mv	a5,a0
+ 23c:	4685                	li	a3,1
+ 23e:	9e89                	subw	a3,a3,a0
+ 240:	00f6853b          	addw	a0,a3,a5
+ 244:	0785                	addi	a5,a5,1
+ 246:	fff7c703          	lbu	a4,-1(a5)
+ 24a:	fb7d                	bnez	a4,240 <strlen+0x14>
+    ;
+  return n;
+}
+ 24c:	6422                	ld	s0,8(sp)
+ 24e:	0141                	addi	sp,sp,16
+ 250:	8082                	ret
+  for(n = 0; s[n]; n++)
+ 252:	4501                	li	a0,0
+ 254:	bfe5                	j	24c <strlen+0x20>
+
+0000000000000256 <memset>:
+
+void*
+memset(void *dst, int c, uint n)
+{
+ 256:	1141                	addi	sp,sp,-16
+ 258:	e422                	sd	s0,8(sp)
+ 25a:	0800                	addi	s0,sp,16
+  char *cdst = (char *) dst;
+  int i;
+  for(i = 0; i < n; i++){
+ 25c:	ca19                	beqz	a2,272 <memset+0x1c>
+ 25e:	87aa                	mv	a5,a0
+ 260:	1602                	slli	a2,a2,0x20
+ 262:	9201                	srli	a2,a2,0x20
+ 264:	00a60733          	add	a4,a2,a0
+    cdst[i] = c;
+ 268:	00b78023          	sb	a1,0(a5)
+  for(i = 0; i < n; i++){
+ 26c:	0785                	addi	a5,a5,1
+ 26e:	fee79de3          	bne	a5,a4,268 <memset+0x12>
+  }
+  return dst;
+}
+ 272:	6422                	ld	s0,8(sp)
+ 274:	0141                	addi	sp,sp,16
+ 276:	8082                	ret
+
+0000000000000278 <strchr>:
+
+char*
+strchr(const char *s, char c)
+{
+ 278:	1141                	addi	sp,sp,-16
+ 27a:	e422                	sd	s0,8(sp)
+ 27c:	0800                	addi	s0,sp,16
+  for(; *s; s++)
+ 27e:	00054783          	lbu	a5,0(a0)
+ 282:	cb99                	beqz	a5,298 <strchr+0x20>
+    if(*s == c)
+ 284:	00f58763          	beq	a1,a5,292 <strchr+0x1a>
+  for(; *s; s++)
+ 288:	0505                	addi	a0,a0,1
+ 28a:	00054783          	lbu	a5,0(a0)
+ 28e:	fbfd                	bnez	a5,284 <strchr+0xc>
+      return (char*)s;
+  return 0;
+ 290:	4501                	li	a0,0
+}
+ 292:	6422                	ld	s0,8(sp)
+ 294:	0141                	addi	sp,sp,16
+ 296:	8082                	ret
+  return 0;
+ 298:	4501                	li	a0,0
+ 29a:	bfe5                	j	292 <strchr+0x1a>
+
+000000000000029c <gets>:
+
+char*
+gets(char *buf, int max)
+{
+ 29c:	711d                	addi	sp,sp,-96
+ 29e:	ec86                	sd	ra,88(sp)
+ 2a0:	e8a2                	sd	s0,80(sp)
+ 2a2:	e4a6                	sd	s1,72(sp)
+ 2a4:	e0ca                	sd	s2,64(sp)
+ 2a6:	fc4e                	sd	s3,56(sp)
+ 2a8:	f852                	sd	s4,48(sp)
+ 2aa:	f456                	sd	s5,40(sp)
+ 2ac:	f05a                	sd	s6,32(sp)
+ 2ae:	ec5e                	sd	s7,24(sp)
+ 2b0:	e862                	sd	s8,16(sp)
+ 2b2:	1080                	addi	s0,sp,96
+ 2b4:	8baa                	mv	s7,a0
+ 2b6:	8a2e                	mv	s4,a1
+  int i, cc;
+  char c;
+
+  for(i=0; i+1 < max; ){
+ 2b8:	892a                	mv	s2,a0
+ 2ba:	4481                	li	s1,0
+    cc = read(0, &c, 1);
+ 2bc:	faf40a93          	addi	s5,s0,-81
+    if(cc < 1)
+      break;
+    buf[i++] = c;
+    if(c == '\n' || c == '\r')
+ 2c0:	4b29                	li	s6,10
+ 2c2:	4c35                	li	s8,13
+  for(i=0; i+1 < max; ){
+ 2c4:	89a6                	mv	s3,s1
+ 2c6:	2485                	addiw	s1,s1,1
+ 2c8:	0344d763          	bge	s1,s4,2f6 <gets+0x5a>
+    cc = read(0, &c, 1);
+ 2cc:	4605                	li	a2,1
+ 2ce:	85d6                	mv	a1,s5
+ 2d0:	4501                	li	a0,0
+ 2d2:	00000097          	auipc	ra,0x0
+ 2d6:	1b8080e7          	jalr	440(ra) # 48a <read>
+    if(cc < 1)
+ 2da:	00a05e63          	blez	a0,2f6 <gets+0x5a>
+    buf[i++] = c;
+ 2de:	faf44783          	lbu	a5,-81(s0)
+ 2e2:	00f90023          	sb	a5,0(s2)
+    if(c == '\n' || c == '\r')
+ 2e6:	01678763          	beq	a5,s6,2f4 <gets+0x58>
+ 2ea:	0905                	addi	s2,s2,1
+ 2ec:	fd879ce3          	bne	a5,s8,2c4 <gets+0x28>
+  for(i=0; i+1 < max; ){
+ 2f0:	89a6                	mv	s3,s1
+ 2f2:	a011                	j	2f6 <gets+0x5a>
+ 2f4:	89a6                	mv	s3,s1
+      break;
+  }
+  buf[i] = '\0';
+ 2f6:	99de                	add	s3,s3,s7
+ 2f8:	00098023          	sb	zero,0(s3)
+  return buf;
+}
+ 2fc:	855e                	mv	a0,s7
+ 2fe:	60e6                	ld	ra,88(sp)
+ 300:	6446                	ld	s0,80(sp)
+ 302:	64a6                	ld	s1,72(sp)
+ 304:	6906                	ld	s2,64(sp)
+ 306:	79e2                	ld	s3,56(sp)
+ 308:	7a42                	ld	s4,48(sp)
+ 30a:	7aa2                	ld	s5,40(sp)
+ 30c:	7b02                	ld	s6,32(sp)
+ 30e:	6be2                	ld	s7,24(sp)
+ 310:	6c42                	ld	s8,16(sp)
+ 312:	6125                	addi	sp,sp,96
+ 314:	8082                	ret
+
+0000000000000316 <stat>:
+
+int
+stat(const char *n, struct stat *st)
+{
+ 316:	1101                	addi	sp,sp,-32
+ 318:	ec06                	sd	ra,24(sp)
+ 31a:	e822                	sd	s0,16(sp)
+ 31c:	e426                	sd	s1,8(sp)
+ 31e:	e04a                	sd	s2,0(sp)
+ 320:	1000                	addi	s0,sp,32
+ 322:	892e                	mv	s2,a1
+  int fd;
+  int r;
+
+  fd = open(n, O_RDONLY);
+ 324:	4581                	li	a1,0
+ 326:	00000097          	auipc	ra,0x0
+ 32a:	194080e7          	jalr	404(ra) # 4ba <open>
+  if(fd < 0)
+ 32e:	02054563          	bltz	a0,358 <stat+0x42>
+ 332:	84aa                	mv	s1,a0
+    return -1;
+  r = fstat(fd, st);
+ 334:	85ca                	mv	a1,s2
+ 336:	00000097          	auipc	ra,0x0
+ 33a:	18e080e7          	jalr	398(ra) # 4c4 <fstat>
+ 33e:	892a                	mv	s2,a0
+  close(fd);
+ 340:	8526                	mv	a0,s1
+ 342:	00000097          	auipc	ra,0x0
+ 346:	15c080e7          	jalr	348(ra) # 49e <close>
+  return r;
+}
+ 34a:	854a                	mv	a0,s2
+ 34c:	60e2                	ld	ra,24(sp)
+ 34e:	6442                	ld	s0,16(sp)
+ 350:	64a2                	ld	s1,8(sp)
+ 352:	6902                	ld	s2,0(sp)
+ 354:	6105                	addi	sp,sp,32
+ 356:	8082                	ret
+    return -1;
+ 358:	597d                	li	s2,-1
+ 35a:	bfc5                	j	34a <stat+0x34>
+
+000000000000035c <atoi>:
+
+int
+atoi(const char *s)
+{
+ 35c:	1141                	addi	sp,sp,-16
+ 35e:	e422                	sd	s0,8(sp)
+ 360:	0800                	addi	s0,sp,16
+  int n;
+  int neg = 1;
+  if (*s == '-') {
+ 362:	00054703          	lbu	a4,0(a0)
+ 366:	02d00793          	li	a5,45
+  int neg = 1;
+ 36a:	4585                	li	a1,1
+  if (*s == '-') {
+ 36c:	04f70363          	beq	a4,a5,3b2 <atoi+0x56>
+    s++;
+    neg = -1;
+  }
+  n = 0;
+  while('0' <= *s && *s <= '9')
+ 370:	00054703          	lbu	a4,0(a0)
+ 374:	fd07079b          	addiw	a5,a4,-48
+ 378:	0ff7f793          	zext.b	a5,a5
+ 37c:	46a5                	li	a3,9
+ 37e:	02f6ed63          	bltu	a3,a5,3b8 <atoi+0x5c>
+  n = 0;
+ 382:	4681                	li	a3,0
+  while('0' <= *s && *s <= '9')
+ 384:	4625                	li	a2,9
+    n = n*10 + *s++ - '0';
+ 386:	0505                	addi	a0,a0,1
+ 388:	0026979b          	slliw	a5,a3,0x2
+ 38c:	9fb5                	addw	a5,a5,a3
+ 38e:	0017979b          	slliw	a5,a5,0x1
+ 392:	9fb9                	addw	a5,a5,a4
+ 394:	fd07869b          	addiw	a3,a5,-48
+  while('0' <= *s && *s <= '9')
+ 398:	00054703          	lbu	a4,0(a0)
+ 39c:	fd07079b          	addiw	a5,a4,-48
+ 3a0:	0ff7f793          	zext.b	a5,a5
+ 3a4:	fef671e3          	bgeu	a2,a5,386 <atoi+0x2a>
+  return n * neg;
+}
+ 3a8:	02d5853b          	mulw	a0,a1,a3
+ 3ac:	6422                	ld	s0,8(sp)
+ 3ae:	0141                	addi	sp,sp,16
+ 3b0:	8082                	ret
+    s++;
+ 3b2:	0505                	addi	a0,a0,1
+    neg = -1;
+ 3b4:	55fd                	li	a1,-1
+ 3b6:	bf6d                	j	370 <atoi+0x14>
+  n = 0;
+ 3b8:	4681                	li	a3,0
+ 3ba:	b7fd                	j	3a8 <atoi+0x4c>
+
+00000000000003bc <memmove>:
+
+void*
+memmove(void *vdst, const void *vsrc, int n)
+{
+ 3bc:	1141                	addi	sp,sp,-16
+ 3be:	e422                	sd	s0,8(sp)
+ 3c0:	0800                	addi	s0,sp,16
+  char *dst;
+  const char *src;
+
+  dst = vdst;
+  src = vsrc;
+  if (src > dst) {
+ 3c2:	02b57463          	bgeu	a0,a1,3ea <memmove+0x2e>
+    while(n-- > 0)
+ 3c6:	00c05f63          	blez	a2,3e4 <memmove+0x28>
+ 3ca:	1602                	slli	a2,a2,0x20
+ 3cc:	9201                	srli	a2,a2,0x20
+ 3ce:	00c507b3          	add	a5,a0,a2
+  dst = vdst;
+ 3d2:	872a                	mv	a4,a0
+      *dst++ = *src++;
+ 3d4:	0585                	addi	a1,a1,1
+ 3d6:	0705                	addi	a4,a4,1
+ 3d8:	fff5c683          	lbu	a3,-1(a1)
+ 3dc:	fed70fa3          	sb	a3,-1(a4)
+    while(n-- > 0)
+ 3e0:	fee79ae3          	bne	a5,a4,3d4 <memmove+0x18>
+    src += n;
+    while(n-- > 0)
+      *--dst = *--src;
+  }
+  return vdst;
+}
+ 3e4:	6422                	ld	s0,8(sp)
+ 3e6:	0141                	addi	sp,sp,16
+ 3e8:	8082                	ret
+    dst += n;
+ 3ea:	00c50733          	add	a4,a0,a2
+    src += n;
+ 3ee:	95b2                	add	a1,a1,a2
+    while(n-- > 0)
+ 3f0:	fec05ae3          	blez	a2,3e4 <memmove+0x28>
+ 3f4:	fff6079b          	addiw	a5,a2,-1
+ 3f8:	1782                	slli	a5,a5,0x20
+ 3fa:	9381                	srli	a5,a5,0x20
+ 3fc:	fff7c793          	not	a5,a5
+ 400:	97ba                	add	a5,a5,a4
+      *--dst = *--src;
+ 402:	15fd                	addi	a1,a1,-1
+ 404:	177d                	addi	a4,a4,-1
+ 406:	0005c683          	lbu	a3,0(a1)
+ 40a:	00d70023          	sb	a3,0(a4)
+    while(n-- > 0)
+ 40e:	fee79ae3          	bne	a5,a4,402 <memmove+0x46>
+ 412:	bfc9                	j	3e4 <memmove+0x28>
+
+0000000000000414 <memcmp>:
+
+int
+memcmp(const void *s1, const void *s2, uint n)
+{
+ 414:	1141                	addi	sp,sp,-16
+ 416:	e422                	sd	s0,8(sp)
+ 418:	0800                	addi	s0,sp,16
+  const char *p1 = s1, *p2 = s2;
+  while (n-- > 0) {
+ 41a:	ca05                	beqz	a2,44a <memcmp+0x36>
+ 41c:	fff6069b          	addiw	a3,a2,-1
+ 420:	1682                	slli	a3,a3,0x20
+ 422:	9281                	srli	a3,a3,0x20
+ 424:	0685                	addi	a3,a3,1
+ 426:	96aa                	add	a3,a3,a0
+    if (*p1 != *p2) {
+ 428:	00054783          	lbu	a5,0(a0)
+ 42c:	0005c703          	lbu	a4,0(a1)
+ 430:	00e79863          	bne	a5,a4,440 <memcmp+0x2c>
+      return *p1 - *p2;
+    }
+    p1++;
+ 434:	0505                	addi	a0,a0,1
+    p2++;
+ 436:	0585                	addi	a1,a1,1
+  while (n-- > 0) {
+ 438:	fed518e3          	bne	a0,a3,428 <memcmp+0x14>
+  }
+  return 0;
+ 43c:	4501                	li	a0,0
+ 43e:	a019                	j	444 <memcmp+0x30>
+      return *p1 - *p2;
+ 440:	40e7853b          	subw	a0,a5,a4
+}
+ 444:	6422                	ld	s0,8(sp)
+ 446:	0141                	addi	sp,sp,16
+ 448:	8082                	ret
+  return 0;
+ 44a:	4501                	li	a0,0
+ 44c:	bfe5                	j	444 <memcmp+0x30>
+
+000000000000044e <memcpy>:
+
+void *
+memcpy(void *dst, const void *src, uint n)
+{
+ 44e:	1141                	addi	sp,sp,-16
+ 450:	e406                	sd	ra,8(sp)
+ 452:	e022                	sd	s0,0(sp)
+ 454:	0800                	addi	s0,sp,16
+  return memmove(dst, src, n);
+ 456:	00000097          	auipc	ra,0x0
+ 45a:	f66080e7          	jalr	-154(ra) # 3bc <memmove>
+}
+ 45e:	60a2                	ld	ra,8(sp)
+ 460:	6402                	ld	s0,0(sp)
+ 462:	0141                	addi	sp,sp,16
+ 464:	8082                	ret
+
+0000000000000466 <fork>:
+# generated by usys.pl - do not edit
+#include "kernel/include/sysnum.h"
+.global fork
+fork:
+ li a7, SYS_fork
+ 466:	4885                	li	a7,1
+ ecall
+ 468:	00000073          	ecall
+ ret
+ 46c:	8082                	ret
+
+000000000000046e <exit>:
+.global exit
+exit:
+ li a7, SYS_exit
+ 46e:	05d00893          	li	a7,93
+ ecall
+ 472:	00000073          	ecall
+ ret
+ 476:	8082                	ret
+
+0000000000000478 <wait>:
+.global wait
+wait:
+ li a7, SYS_wait
+ 478:	488d                	li	a7,3
+ ecall
+ 47a:	00000073          	ecall
+ ret
+ 47e:	8082                	ret
+
+0000000000000480 <pipe>:
+.global pipe
+pipe:
+ li a7, SYS_pipe
+ 480:	03b00893          	li	a7,59
+ ecall
+ 484:	00000073          	ecall
+ ret
+ 488:	8082                	ret
+
+000000000000048a <read>:
+.global read
+read:
+ li a7, SYS_read
+ 48a:	03f00893          	li	a7,63
+ ecall
+ 48e:	00000073          	ecall
+ ret
+ 492:	8082                	ret
+
+0000000000000494 <write>:
+.global write
+write:
+ li a7, SYS_write
+ 494:	04000893          	li	a7,64
+ ecall
+ 498:	00000073          	ecall
+ ret
+ 49c:	8082                	ret
+
+000000000000049e <close>:
+.global close
+close:
+ li a7, SYS_close
+ 49e:	03900893          	li	a7,57
+ ecall
+ 4a2:	00000073          	ecall
+ ret
+ 4a6:	8082                	ret
+
+00000000000004a8 <kill>:
+.global kill
+kill:
+ li a7, SYS_kill
+ 4a8:	4899                	li	a7,6
+ ecall
+ 4aa:	00000073          	ecall
+ ret
+ 4ae:	8082                	ret
+
+00000000000004b0 <exec>:
+.global exec
+exec:
+ li a7, SYS_exec
+ 4b0:	0dd00893          	li	a7,221
+ ecall
+ 4b4:	00000073          	ecall
+ ret
+ 4b8:	8082                	ret
+
+00000000000004ba <open>:
+.global open
+open:
+ li a7, SYS_open
+ 4ba:	03800893          	li	a7,56
+ ecall
+ 4be:	00000073          	ecall
+ ret
+ 4c2:	8082                	ret
+
+00000000000004c4 <fstat>:
+.global fstat
+fstat:
+ li a7, SYS_fstat
+ 4c4:	05000893          	li	a7,80
+ ecall
+ 4c8:	00000073          	ecall
+ ret
+ 4cc:	8082                	ret
+
+00000000000004ce <mkdir>:
+.global mkdir
+mkdir:
+ li a7, SYS_mkdir
+ 4ce:	02200893          	li	a7,34
+ ecall
+ 4d2:	00000073          	ecall
+ ret
+ 4d6:	8082                	ret
+
+00000000000004d8 <chdir>:
+.global chdir
+chdir:
+ li a7, SYS_chdir
+ 4d8:	03100893          	li	a7,49
+ ecall
+ 4dc:	00000073          	ecall
+ ret
+ 4e0:	8082                	ret
+
+00000000000004e2 <dup>:
+.global dup
+dup:
+ li a7, SYS_dup
+ 4e2:	48dd                	li	a7,23
+ ecall
+ 4e4:	00000073          	ecall
+ ret
+ 4e8:	8082                	ret
+
+00000000000004ea <getpid>:
+.global getpid
+getpid:
+ li a7, SYS_getpid
+ 4ea:	0ac00893          	li	a7,172
+ ecall
+ 4ee:	00000073          	ecall
+ ret
+ 4f2:	8082                	ret
+
+00000000000004f4 <sbrk>:
+.global sbrk
+sbrk:
+ li a7, SYS_sbrk
+ 4f4:	48b1                	li	a7,12
+ ecall
+ 4f6:	00000073          	ecall
+ ret
+ 4fa:	8082                	ret
+
+00000000000004fc <sleep>:
+.global sleep
+sleep:
+ li a7, SYS_sleep
+ 4fc:	48b5                	li	a7,13
+ ecall
+ 4fe:	00000073          	ecall
+ ret
+ 502:	8082                	ret
+
+0000000000000504 <uptime>:
+.global uptime
+uptime:
+ li a7, SYS_uptime
+ 504:	48b9                	li	a7,14
+ ecall
+ 506:	00000073          	ecall
+ ret
+ 50a:	8082                	ret
+
+000000000000050c <test_proc>:
+.global test_proc
+test_proc:
+ li a7, SYS_test_proc
+ 50c:	48d9                	li	a7,22
+ ecall
+ 50e:	00000073          	ecall
+ ret
+ 512:	8082                	ret
+
+0000000000000514 <dev>:
+.global dev
+dev:
+ li a7, SYS_dev
+ 514:	03200893          	li	a7,50
+ ecall
+ 518:	00000073          	ecall
+ ret
+ 51c:	8082                	ret
+
+000000000000051e <readdir>:
+.global readdir
+readdir:
+ li a7, SYS_readdir
+ 51e:	48ed                	li	a7,27
+ ecall
+ 520:	00000073          	ecall
+ ret
+ 524:	8082                	ret
+
+0000000000000526 <getcwd>:
+.global getcwd
+getcwd:
+ li a7, SYS_getcwd
+ 526:	48c5                	li	a7,17
+ ecall
+ 528:	00000073          	ecall
+ ret
+ 52c:	8082                	ret
+
+000000000000052e <remove>:
+.global remove
+remove:
+ li a7, SYS_remove
+ 52e:	07500893          	li	a7,117
+ ecall
+ 532:	00000073          	ecall
+ ret
+ 536:	8082                	ret
+
+0000000000000538 <trace>:
+.global trace
+trace:
+ li a7, SYS_trace
+ 538:	48c9                	li	a7,18
+ ecall
+ 53a:	00000073          	ecall
+ ret
+ 53e:	8082                	ret
+
+0000000000000540 <sysinfo>:
+.global sysinfo
+sysinfo:
+ li a7, SYS_sysinfo
+ 540:	48cd                	li	a7,19
+ ecall
+ 542:	00000073          	ecall
+ ret
+ 546:	8082                	ret
+
+0000000000000548 <rename>:
+.global rename
+rename:
+ li a7, SYS_rename
+ 548:	48e9                	li	a7,26
+ ecall
+ 54a:	00000073          	ecall
+ ret
+ 54e:	8082                	ret
+
+0000000000000550 <shutdown>:
+.global shutdown
+shutdown:
+ li a7, SYS_shutdown
+ 550:	0d200893          	li	a7,210
+ ecall
+ 554:	00000073          	ecall
+ ret
+ 558:	8082                	ret
+
+000000000000055a <putc>:
+
+static char digits[] = "0123456789ABCDEF";
+
+static void
+putc(int fd, char c)
+{
+ 55a:	1101                	addi	sp,sp,-32
+ 55c:	ec06                	sd	ra,24(sp)
+ 55e:	e822                	sd	s0,16(sp)
+ 560:	1000                	addi	s0,sp,32
+ 562:	feb407a3          	sb	a1,-17(s0)
+  write(fd, &c, 1);
+ 566:	4605                	li	a2,1
+ 568:	fef40593          	addi	a1,s0,-17
+ 56c:	00000097          	auipc	ra,0x0
+ 570:	f28080e7          	jalr	-216(ra) # 494 <write>
+}
+ 574:	60e2                	ld	ra,24(sp)
+ 576:	6442                	ld	s0,16(sp)
+ 578:	6105                	addi	sp,sp,32
+ 57a:	8082                	ret
+
+000000000000057c <printint>:
+
+static void
+printint(int fd, int xx, int base, int sgn)
+{
+ 57c:	7139                	addi	sp,sp,-64
+ 57e:	fc06                	sd	ra,56(sp)
+ 580:	f822                	sd	s0,48(sp)
+ 582:	f426                	sd	s1,40(sp)
+ 584:	f04a                	sd	s2,32(sp)
+ 586:	ec4e                	sd	s3,24(sp)
+ 588:	0080                	addi	s0,sp,64
+ 58a:	84aa                	mv	s1,a0
+  char buf[16];
+  int i, neg;
+  uint x;
+
+  neg = 0;
+  if(sgn && xx < 0){
+ 58c:	c299                	beqz	a3,592 <printint+0x16>
+ 58e:	0805c863          	bltz	a1,61e <printint+0xa2>
+    neg = 1;
+    x = -xx;
+  } else {
+    x = xx;
+ 592:	2581                	sext.w	a1,a1
+  neg = 0;
+ 594:	4881                	li	a7,0
+  }
+
+  i = 0;
+ 596:	fc040993          	addi	s3,s0,-64
+  neg = 0;
+ 59a:	86ce                	mv	a3,s3
+  i = 0;
+ 59c:	4701                	li	a4,0
+  do{
+    buf[i++] = digits[x % base];
+ 59e:	2601                	sext.w	a2,a2
+ 5a0:	00000517          	auipc	a0,0x0
+ 5a4:	4d850513          	addi	a0,a0,1240 # a78 <digits>
+ 5a8:	883a                	mv	a6,a4
+ 5aa:	2705                	addiw	a4,a4,1
+ 5ac:	02c5f7bb          	remuw	a5,a1,a2
+ 5b0:	1782                	slli	a5,a5,0x20
+ 5b2:	9381                	srli	a5,a5,0x20
+ 5b4:	97aa                	add	a5,a5,a0
+ 5b6:	0007c783          	lbu	a5,0(a5)
+ 5ba:	00f68023          	sb	a5,0(a3)
+  }while((x /= base) != 0);
+ 5be:	0005879b          	sext.w	a5,a1
+ 5c2:	02c5d5bb          	divuw	a1,a1,a2
+ 5c6:	0685                	addi	a3,a3,1
+ 5c8:	fec7f0e3          	bgeu	a5,a2,5a8 <printint+0x2c>
+  if(neg)
+ 5cc:	00088c63          	beqz	a7,5e4 <printint+0x68>
+    buf[i++] = '-';
+ 5d0:	fd070793          	addi	a5,a4,-48
+ 5d4:	00878733          	add	a4,a5,s0
+ 5d8:	02d00793          	li	a5,45
+ 5dc:	fef70823          	sb	a5,-16(a4)
+ 5e0:	0028071b          	addiw	a4,a6,2
+
+  while(--i >= 0)
+ 5e4:	02e05663          	blez	a4,610 <printint+0x94>
+ 5e8:	fc040913          	addi	s2,s0,-64
+ 5ec:	993a                	add	s2,s2,a4
+ 5ee:	19fd                	addi	s3,s3,-1
+ 5f0:	99ba                	add	s3,s3,a4
+ 5f2:	377d                	addiw	a4,a4,-1
+ 5f4:	1702                	slli	a4,a4,0x20
+ 5f6:	9301                	srli	a4,a4,0x20
+ 5f8:	40e989b3          	sub	s3,s3,a4
+    putc(fd, buf[i]);
+ 5fc:	fff94583          	lbu	a1,-1(s2)
+ 600:	8526                	mv	a0,s1
+ 602:	00000097          	auipc	ra,0x0
+ 606:	f58080e7          	jalr	-168(ra) # 55a <putc>
+  while(--i >= 0)
+ 60a:	197d                	addi	s2,s2,-1
+ 60c:	ff3918e3          	bne	s2,s3,5fc <printint+0x80>
+}
+ 610:	70e2                	ld	ra,56(sp)
+ 612:	7442                	ld	s0,48(sp)
+ 614:	74a2                	ld	s1,40(sp)
+ 616:	7902                	ld	s2,32(sp)
+ 618:	69e2                	ld	s3,24(sp)
+ 61a:	6121                	addi	sp,sp,64
+ 61c:	8082                	ret
+    x = -xx;
+ 61e:	40b005bb          	negw	a1,a1
+    neg = 1;
+ 622:	4885                	li	a7,1
+    x = -xx;
+ 624:	bf8d                	j	596 <printint+0x1a>
+
+0000000000000626 <vprintf>:
+}
+
+// Print to the given fd. Only understands %d, %x, %p, %s.
+void
+vprintf(int fd, const char *fmt, va_list ap)
+{
+ 626:	7119                	addi	sp,sp,-128
+ 628:	fc86                	sd	ra,120(sp)
+ 62a:	f8a2                	sd	s0,112(sp)
+ 62c:	f4a6                	sd	s1,104(sp)
+ 62e:	f0ca                	sd	s2,96(sp)
+ 630:	ecce                	sd	s3,88(sp)
+ 632:	e8d2                	sd	s4,80(sp)
+ 634:	e4d6                	sd	s5,72(sp)
+ 636:	e0da                	sd	s6,64(sp)
+ 638:	fc5e                	sd	s7,56(sp)
+ 63a:	f862                	sd	s8,48(sp)
+ 63c:	f466                	sd	s9,40(sp)
+ 63e:	f06a                	sd	s10,32(sp)
+ 640:	ec6e                	sd	s11,24(sp)
+ 642:	0100                	addi	s0,sp,128
+  char *s;
+  int c, i, state;
+
+  state = 0;
+  for(i = 0; fmt[i]; i++){
+ 644:	0005c903          	lbu	s2,0(a1)
+ 648:	18090f63          	beqz	s2,7e6 <vprintf+0x1c0>
+ 64c:	8aaa                	mv	s5,a0
+ 64e:	8b32                	mv	s6,a2
+ 650:	00158493          	addi	s1,a1,1
+  state = 0;
+ 654:	4981                	li	s3,0
+      if(c == '%'){
+        state = '%';
+      } else {
+        putc(fd, c);
+      }
+    } else if(state == '%'){
+ 656:	02500a13          	li	s4,37
+ 65a:	4c55                	li	s8,21
+ 65c:	00000c97          	auipc	s9,0x0
+ 660:	3c4c8c93          	addi	s9,s9,964 # a20 <malloc+0x136>
+        printptr(fd, va_arg(ap, uint64));
+      } else if(c == 's'){
+        s = va_arg(ap, char*);
+        if(s == 0)
+          s = "(null)";
+        while(*s != 0){
+ 664:	02800d93          	li	s11,40
+  putc(fd, 'x');
+ 668:	4d41                	li	s10,16
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 66a:	00000b97          	auipc	s7,0x0
+ 66e:	40eb8b93          	addi	s7,s7,1038 # a78 <digits>
+ 672:	a839                	j	690 <vprintf+0x6a>
+        putc(fd, c);
+ 674:	85ca                	mv	a1,s2
+ 676:	8556                	mv	a0,s5
+ 678:	00000097          	auipc	ra,0x0
+ 67c:	ee2080e7          	jalr	-286(ra) # 55a <putc>
+ 680:	a019                	j	686 <vprintf+0x60>
+    } else if(state == '%'){
+ 682:	01498d63          	beq	s3,s4,69c <vprintf+0x76>
+  for(i = 0; fmt[i]; i++){
+ 686:	0485                	addi	s1,s1,1
+ 688:	fff4c903          	lbu	s2,-1(s1)
+ 68c:	14090d63          	beqz	s2,7e6 <vprintf+0x1c0>
+    if(state == 0){
+ 690:	fe0999e3          	bnez	s3,682 <vprintf+0x5c>
+      if(c == '%'){
+ 694:	ff4910e3          	bne	s2,s4,674 <vprintf+0x4e>
+        state = '%';
+ 698:	89d2                	mv	s3,s4
+ 69a:	b7f5                	j	686 <vprintf+0x60>
+      if(c == 'd'){
+ 69c:	11490c63          	beq	s2,s4,7b4 <vprintf+0x18e>
+ 6a0:	f9d9079b          	addiw	a5,s2,-99
+ 6a4:	0ff7f793          	zext.b	a5,a5
+ 6a8:	10fc6e63          	bltu	s8,a5,7c4 <vprintf+0x19e>
+ 6ac:	f9d9079b          	addiw	a5,s2,-99
+ 6b0:	0ff7f713          	zext.b	a4,a5
+ 6b4:	10ec6863          	bltu	s8,a4,7c4 <vprintf+0x19e>
+ 6b8:	00271793          	slli	a5,a4,0x2
+ 6bc:	97e6                	add	a5,a5,s9
+ 6be:	439c                	lw	a5,0(a5)
+ 6c0:	97e6                	add	a5,a5,s9
+ 6c2:	8782                	jr	a5
+        printint(fd, va_arg(ap, int), 10, 1);
+ 6c4:	008b0913          	addi	s2,s6,8
+ 6c8:	4685                	li	a3,1
+ 6ca:	4629                	li	a2,10
+ 6cc:	000b2583          	lw	a1,0(s6)
+ 6d0:	8556                	mv	a0,s5
+ 6d2:	00000097          	auipc	ra,0x0
+ 6d6:	eaa080e7          	jalr	-342(ra) # 57c <printint>
+ 6da:	8b4a                	mv	s6,s2
+      } else {
+        // Unknown % sequence.  Print it to draw attention.
+        putc(fd, '%');
+        putc(fd, c);
+      }
+      state = 0;
+ 6dc:	4981                	li	s3,0
+ 6de:	b765                	j	686 <vprintf+0x60>
+        printint(fd, va_arg(ap, uint64), 10, 0);
+ 6e0:	008b0913          	addi	s2,s6,8
+ 6e4:	4681                	li	a3,0
+ 6e6:	4629                	li	a2,10
+ 6e8:	000b2583          	lw	a1,0(s6)
+ 6ec:	8556                	mv	a0,s5
+ 6ee:	00000097          	auipc	ra,0x0
+ 6f2:	e8e080e7          	jalr	-370(ra) # 57c <printint>
+ 6f6:	8b4a                	mv	s6,s2
+      state = 0;
+ 6f8:	4981                	li	s3,0
+ 6fa:	b771                	j	686 <vprintf+0x60>
+        printint(fd, va_arg(ap, int), 16, 0);
+ 6fc:	008b0913          	addi	s2,s6,8
+ 700:	4681                	li	a3,0
+ 702:	866a                	mv	a2,s10
+ 704:	000b2583          	lw	a1,0(s6)
+ 708:	8556                	mv	a0,s5
+ 70a:	00000097          	auipc	ra,0x0
+ 70e:	e72080e7          	jalr	-398(ra) # 57c <printint>
+ 712:	8b4a                	mv	s6,s2
+      state = 0;
+ 714:	4981                	li	s3,0
+ 716:	bf85                	j	686 <vprintf+0x60>
+        printptr(fd, va_arg(ap, uint64));
+ 718:	008b0793          	addi	a5,s6,8
+ 71c:	f8f43423          	sd	a5,-120(s0)
+ 720:	000b3983          	ld	s3,0(s6)
+  putc(fd, '0');
+ 724:	03000593          	li	a1,48
+ 728:	8556                	mv	a0,s5
+ 72a:	00000097          	auipc	ra,0x0
+ 72e:	e30080e7          	jalr	-464(ra) # 55a <putc>
+  putc(fd, 'x');
+ 732:	07800593          	li	a1,120
+ 736:	8556                	mv	a0,s5
+ 738:	00000097          	auipc	ra,0x0
+ 73c:	e22080e7          	jalr	-478(ra) # 55a <putc>
+ 740:	896a                	mv	s2,s10
+    putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]);
+ 742:	03c9d793          	srli	a5,s3,0x3c
+ 746:	97de                	add	a5,a5,s7
+ 748:	0007c583          	lbu	a1,0(a5)
+ 74c:	8556                	mv	a0,s5
+ 74e:	00000097          	auipc	ra,0x0
+ 752:	e0c080e7          	jalr	-500(ra) # 55a <putc>
+  for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4)
+ 756:	0992                	slli	s3,s3,0x4
+ 758:	397d                	addiw	s2,s2,-1
+ 75a:	fe0914e3          	bnez	s2,742 <vprintf+0x11c>
+        printptr(fd, va_arg(ap, uint64));
+ 75e:	f8843b03          	ld	s6,-120(s0)
+      state = 0;
+ 762:	4981                	li	s3,0
+ 764:	b70d                	j	686 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 766:	008b0913          	addi	s2,s6,8
+ 76a:	000b3983          	ld	s3,0(s6)
+        if(s == 0)
+ 76e:	02098163          	beqz	s3,790 <vprintf+0x16a>
+        while(*s != 0){
+ 772:	0009c583          	lbu	a1,0(s3)
+ 776:	c5ad                	beqz	a1,7e0 <vprintf+0x1ba>
+          putc(fd, *s);
+ 778:	8556                	mv	a0,s5
+ 77a:	00000097          	auipc	ra,0x0
+ 77e:	de0080e7          	jalr	-544(ra) # 55a <putc>
+          s++;
+ 782:	0985                	addi	s3,s3,1
+        while(*s != 0){
+ 784:	0009c583          	lbu	a1,0(s3)
+ 788:	f9e5                	bnez	a1,778 <vprintf+0x152>
+        s = va_arg(ap, char*);
+ 78a:	8b4a                	mv	s6,s2
+      state = 0;
+ 78c:	4981                	li	s3,0
+ 78e:	bde5                	j	686 <vprintf+0x60>
+          s = "(null)";
+ 790:	00000997          	auipc	s3,0x0
+ 794:	28898993          	addi	s3,s3,648 # a18 <malloc+0x12e>
+        while(*s != 0){
+ 798:	85ee                	mv	a1,s11
+ 79a:	bff9                	j	778 <vprintf+0x152>
+        putc(fd, va_arg(ap, uint));
+ 79c:	008b0913          	addi	s2,s6,8
+ 7a0:	000b4583          	lbu	a1,0(s6)
+ 7a4:	8556                	mv	a0,s5
+ 7a6:	00000097          	auipc	ra,0x0
+ 7aa:	db4080e7          	jalr	-588(ra) # 55a <putc>
+ 7ae:	8b4a                	mv	s6,s2
+      state = 0;
+ 7b0:	4981                	li	s3,0
+ 7b2:	bdd1                	j	686 <vprintf+0x60>
+        putc(fd, c);
+ 7b4:	85d2                	mv	a1,s4
+ 7b6:	8556                	mv	a0,s5
+ 7b8:	00000097          	auipc	ra,0x0
+ 7bc:	da2080e7          	jalr	-606(ra) # 55a <putc>
+      state = 0;
+ 7c0:	4981                	li	s3,0
+ 7c2:	b5d1                	j	686 <vprintf+0x60>
+        putc(fd, '%');
+ 7c4:	85d2                	mv	a1,s4
+ 7c6:	8556                	mv	a0,s5
+ 7c8:	00000097          	auipc	ra,0x0
+ 7cc:	d92080e7          	jalr	-622(ra) # 55a <putc>
+        putc(fd, c);
+ 7d0:	85ca                	mv	a1,s2
+ 7d2:	8556                	mv	a0,s5
+ 7d4:	00000097          	auipc	ra,0x0
+ 7d8:	d86080e7          	jalr	-634(ra) # 55a <putc>
+      state = 0;
+ 7dc:	4981                	li	s3,0
+ 7de:	b565                	j	686 <vprintf+0x60>
+        s = va_arg(ap, char*);
+ 7e0:	8b4a                	mv	s6,s2
+      state = 0;
+ 7e2:	4981                	li	s3,0
+ 7e4:	b54d                	j	686 <vprintf+0x60>
+    }
+  }
+}
+ 7e6:	70e6                	ld	ra,120(sp)
+ 7e8:	7446                	ld	s0,112(sp)
+ 7ea:	74a6                	ld	s1,104(sp)
+ 7ec:	7906                	ld	s2,96(sp)
+ 7ee:	69e6                	ld	s3,88(sp)
+ 7f0:	6a46                	ld	s4,80(sp)
+ 7f2:	6aa6                	ld	s5,72(sp)
+ 7f4:	6b06                	ld	s6,64(sp)
+ 7f6:	7be2                	ld	s7,56(sp)
+ 7f8:	7c42                	ld	s8,48(sp)
+ 7fa:	7ca2                	ld	s9,40(sp)
+ 7fc:	7d02                	ld	s10,32(sp)
+ 7fe:	6de2                	ld	s11,24(sp)
+ 800:	6109                	addi	sp,sp,128
+ 802:	8082                	ret
+
+0000000000000804 <fprintf>:
+
+void
+fprintf(int fd, const char *fmt, ...)
+{
+ 804:	715d                	addi	sp,sp,-80
+ 806:	ec06                	sd	ra,24(sp)
+ 808:	e822                	sd	s0,16(sp)
+ 80a:	1000                	addi	s0,sp,32
+ 80c:	e010                	sd	a2,0(s0)
+ 80e:	e414                	sd	a3,8(s0)
+ 810:	e818                	sd	a4,16(s0)
+ 812:	ec1c                	sd	a5,24(s0)
+ 814:	03043023          	sd	a6,32(s0)
+ 818:	03143423          	sd	a7,40(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 81c:	8622                	mv	a2,s0
+ 81e:	fe843423          	sd	s0,-24(s0)
+  vprintf(fd, fmt, ap);
+ 822:	00000097          	auipc	ra,0x0
+ 826:	e04080e7          	jalr	-508(ra) # 626 <vprintf>
+}
+ 82a:	60e2                	ld	ra,24(sp)
+ 82c:	6442                	ld	s0,16(sp)
+ 82e:	6161                	addi	sp,sp,80
+ 830:	8082                	ret
+
+0000000000000832 <printf>:
+
+void
+printf(const char *fmt, ...)
+{
+ 832:	711d                	addi	sp,sp,-96
+ 834:	ec06                	sd	ra,24(sp)
+ 836:	e822                	sd	s0,16(sp)
+ 838:	1000                	addi	s0,sp,32
+ 83a:	e40c                	sd	a1,8(s0)
+ 83c:	e810                	sd	a2,16(s0)
+ 83e:	ec14                	sd	a3,24(s0)
+ 840:	f018                	sd	a4,32(s0)
+ 842:	f41c                	sd	a5,40(s0)
+ 844:	03043823          	sd	a6,48(s0)
+ 848:	03143c23          	sd	a7,56(s0)
+  va_list ap;
+
+  va_start(ap, fmt);
+ 84c:	00840613          	addi	a2,s0,8
+ 850:	fec43423          	sd	a2,-24(s0)
+  vprintf(1, fmt, ap);
+ 854:	85aa                	mv	a1,a0
+ 856:	4505                	li	a0,1
+ 858:	00000097          	auipc	ra,0x0
+ 85c:	dce080e7          	jalr	-562(ra) # 626 <vprintf>
+}
+ 860:	60e2                	ld	ra,24(sp)
+ 862:	6442                	ld	s0,16(sp)
+ 864:	6125                	addi	sp,sp,96
+ 866:	8082                	ret
+
+0000000000000868 <free>:
+static Header base;
+static Header *freep;
+
+void
+free(void *ap)
+{
+ 868:	1141                	addi	sp,sp,-16
+ 86a:	e422                	sd	s0,8(sp)
+ 86c:	0800                	addi	s0,sp,16
+  Header *bp, *p;
+
+  bp = (Header*)ap - 1;
+ 86e:	ff050693          	addi	a3,a0,-16
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 872:	00000797          	auipc	a5,0x0
+ 876:	21e7b783          	ld	a5,542(a5) # a90 <freep>
+ 87a:	a02d                	j	8a4 <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;
+ 87c:	4618                	lw	a4,8(a2)
+ 87e:	9f2d                	addw	a4,a4,a1
+ 880:	fee52c23          	sw	a4,-8(a0)
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 884:	6398                	ld	a4,0(a5)
+ 886:	6310                	ld	a2,0(a4)
+ 888:	a83d                	j	8c6 <free+0x5e>
+  } else
+    bp->s.ptr = p->s.ptr;
+  if(p + p->s.size == bp){
+    p->s.size += bp->s.size;
+ 88a:	ff852703          	lw	a4,-8(a0)
+ 88e:	9f31                	addw	a4,a4,a2
+ 890:	c798                	sw	a4,8(a5)
+    p->s.ptr = bp->s.ptr;
+ 892:	ff053683          	ld	a3,-16(a0)
+ 896:	a091                	j	8da <free+0x72>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 898:	6398                	ld	a4,0(a5)
+ 89a:	00e7e463          	bltu	a5,a4,8a2 <free+0x3a>
+ 89e:	00e6ea63          	bltu	a3,a4,8b2 <free+0x4a>
+{
+ 8a2:	87ba                	mv	a5,a4
+  for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
+ 8a4:	fed7fae3          	bgeu	a5,a3,898 <free+0x30>
+ 8a8:	6398                	ld	a4,0(a5)
+ 8aa:	00e6e463          	bltu	a3,a4,8b2 <free+0x4a>
+    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr))
+ 8ae:	fee7eae3          	bltu	a5,a4,8a2 <free+0x3a>
+  if(bp + bp->s.size == p->s.ptr){
+ 8b2:	ff852583          	lw	a1,-8(a0)
+ 8b6:	6390                	ld	a2,0(a5)
+ 8b8:	02059813          	slli	a6,a1,0x20
+ 8bc:	01c85713          	srli	a4,a6,0x1c
+ 8c0:	9736                	add	a4,a4,a3
+ 8c2:	fae60de3          	beq	a2,a4,87c <free+0x14>
+    bp->s.ptr = p->s.ptr->s.ptr;
+ 8c6:	fec53823          	sd	a2,-16(a0)
+  if(p + p->s.size == bp){
+ 8ca:	4790                	lw	a2,8(a5)
+ 8cc:	02061593          	slli	a1,a2,0x20
+ 8d0:	01c5d713          	srli	a4,a1,0x1c
+ 8d4:	973e                	add	a4,a4,a5
+ 8d6:	fae68ae3          	beq	a3,a4,88a <free+0x22>
+    p->s.ptr = bp->s.ptr;
+ 8da:	e394                	sd	a3,0(a5)
+  } else
+    p->s.ptr = bp;
+  freep = p;
+ 8dc:	00000717          	auipc	a4,0x0
+ 8e0:	1af73a23          	sd	a5,436(a4) # a90 <freep>
+}
+ 8e4:	6422                	ld	s0,8(sp)
+ 8e6:	0141                	addi	sp,sp,16
+ 8e8:	8082                	ret
+
+00000000000008ea <malloc>:
+  return freep;
+}
+
+void*
+malloc(uint nbytes)
+{
+ 8ea:	7139                	addi	sp,sp,-64
+ 8ec:	fc06                	sd	ra,56(sp)
+ 8ee:	f822                	sd	s0,48(sp)
+ 8f0:	f426                	sd	s1,40(sp)
+ 8f2:	f04a                	sd	s2,32(sp)
+ 8f4:	ec4e                	sd	s3,24(sp)
+ 8f6:	e852                	sd	s4,16(sp)
+ 8f8:	e456                	sd	s5,8(sp)
+ 8fa:	e05a                	sd	s6,0(sp)
+ 8fc:	0080                	addi	s0,sp,64
+  Header *p, *prevp;
+  uint nunits;
+
+  nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1;
+ 8fe:	02051493          	slli	s1,a0,0x20
+ 902:	9081                	srli	s1,s1,0x20
+ 904:	04bd                	addi	s1,s1,15
+ 906:	8091                	srli	s1,s1,0x4
+ 908:	00148a1b          	addiw	s4,s1,1
+ 90c:	0485                	addi	s1,s1,1
+  if((prevp = freep) == 0){
+ 90e:	00000517          	auipc	a0,0x0
+ 912:	18253503          	ld	a0,386(a0) # a90 <freep>
+ 916:	c515                	beqz	a0,942 <malloc+0x58>
+    base.s.ptr = freep = prevp = &base;
+    base.s.size = 0;
+  }
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 918:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 91a:	4798                	lw	a4,8(a5)
+ 91c:	04977163          	bgeu	a4,s1,95e <malloc+0x74>
+ 920:	89d2                	mv	s3,s4
+ 922:	000a071b          	sext.w	a4,s4
+ 926:	6685                	lui	a3,0x1
+ 928:	00d77363          	bgeu	a4,a3,92e <malloc+0x44>
+ 92c:	6985                	lui	s3,0x1
+ 92e:	00098b1b          	sext.w	s6,s3
+  p = sbrk(nu * sizeof(Header));
+ 932:	0049999b          	slliw	s3,s3,0x4
+        p->s.size = nunits;
+      }
+      freep = prevp;
+      return (void*)(p + 1);
+    }
+    if(p == freep)
+ 936:	00000917          	auipc	s2,0x0
+ 93a:	15a90913          	addi	s2,s2,346 # a90 <freep>
+  if(p == (char*)-1)
+ 93e:	5afd                	li	s5,-1
+ 940:	a8a5                	j	9b8 <malloc+0xce>
+    base.s.ptr = freep = prevp = &base;
+ 942:	00000797          	auipc	a5,0x0
+ 946:	14e78793          	addi	a5,a5,334 # a90 <freep>
+ 94a:	00000717          	auipc	a4,0x0
+ 94e:	14e70713          	addi	a4,a4,334 # a98 <base>
+ 952:	e398                	sd	a4,0(a5)
+ 954:	e798                	sd	a4,8(a5)
+    base.s.size = 0;
+ 956:	0007a823          	sw	zero,16(a5)
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 95a:	87ba                	mv	a5,a4
+ 95c:	b7d1                	j	920 <malloc+0x36>
+      if(p->s.size == nunits)
+ 95e:	02e48c63          	beq	s1,a4,996 <malloc+0xac>
+        p->s.size -= nunits;
+ 962:	4147073b          	subw	a4,a4,s4
+ 966:	c798                	sw	a4,8(a5)
+        p += p->s.size;
+ 968:	02071693          	slli	a3,a4,0x20
+ 96c:	01c6d713          	srli	a4,a3,0x1c
+ 970:	97ba                	add	a5,a5,a4
+        p->s.size = nunits;
+ 972:	0147a423          	sw	s4,8(a5)
+      freep = prevp;
+ 976:	00000717          	auipc	a4,0x0
+ 97a:	10a73d23          	sd	a0,282(a4) # a90 <freep>
+      return (void*)(p + 1);
+ 97e:	01078513          	addi	a0,a5,16
+      if((p = morecore(nunits)) == 0)
+        return 0;
+  }
+}
+ 982:	70e2                	ld	ra,56(sp)
+ 984:	7442                	ld	s0,48(sp)
+ 986:	74a2                	ld	s1,40(sp)
+ 988:	7902                	ld	s2,32(sp)
+ 98a:	69e2                	ld	s3,24(sp)
+ 98c:	6a42                	ld	s4,16(sp)
+ 98e:	6aa2                	ld	s5,8(sp)
+ 990:	6b02                	ld	s6,0(sp)
+ 992:	6121                	addi	sp,sp,64
+ 994:	8082                	ret
+        prevp->s.ptr = p->s.ptr;
+ 996:	6398                	ld	a4,0(a5)
+ 998:	e118                	sd	a4,0(a0)
+ 99a:	bff1                	j	976 <malloc+0x8c>
+  hp->s.size = nu;
+ 99c:	01652423          	sw	s6,8(a0)
+  free((void*)(hp + 1));
+ 9a0:	0541                	addi	a0,a0,16
+ 9a2:	00000097          	auipc	ra,0x0
+ 9a6:	ec6080e7          	jalr	-314(ra) # 868 <free>
+  return freep;
+ 9aa:	00093503          	ld	a0,0(s2)
+      if((p = morecore(nunits)) == 0)
+ 9ae:	d971                	beqz	a0,982 <malloc+0x98>
+  for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){
+ 9b0:	611c                	ld	a5,0(a0)
+    if(p->s.size >= nunits){
+ 9b2:	4798                	lw	a4,8(a5)
+ 9b4:	fa9775e3          	bgeu	a4,s1,95e <malloc+0x74>
+    if(p == freep)
+ 9b8:	00093703          	ld	a4,0(s2)
+ 9bc:	853e                	mv	a0,a5
+ 9be:	fef719e3          	bne	a4,a5,9b0 <malloc+0xc6>
+  p = sbrk(nu * sizeof(Header));
+ 9c2:	854e                	mv	a0,s3
+ 9c4:	00000097          	auipc	ra,0x0
+ 9c8:	b30080e7          	jalr	-1232(ra) # 4f4 <sbrk>
+  if(p == (char*)-1)
+ 9cc:	fd5518e3          	bne	a0,s5,99c <malloc+0xb2>
+        return 0;
+ 9d0:	4501                	li	a0,0
+ 9d2:	bf45                	j	982 <malloc+0x98>
diff --git a/xv6-user/xargs.c b/xv6-user/xargs.c
new file mode 100644
index 0000000000000000000000000000000000000000..4396b13b6ef8b6d3696a86fa2c1b2d7821f3e73e
--- /dev/null
+++ b/xv6-user/xargs.c
@@ -0,0 +1,62 @@
+#include "kernel/include/types.h"
+#include "kernel/include/param.h"
+#include "xv6-user/user.h"
+
+/**
+ * len:    include the 0 in the end.
+ * return: the number of bytes that read successfully (0 in the end is not included)
+ */
+int readline(int fd, char *buf, int len)
+{
+    char *p = buf;
+    while (read(fd, p, 1) != 0 && p < buf + len) {
+        if (*p == '\n') {
+            if (p == buf) {     // ignore empty line
+                continue;
+            }
+            *p = '\0';
+            break;
+        }
+        p++;
+    }
+    if (p == buf) {
+        return 0;
+    }
+    return p - buf;
+}
+
+int main(int argc, char *argv[])
+{
+    if (argc < 2) {
+        fprintf(2, "Usage: xargs COMMAND [INITIAL-ARGS]...\n");
+        exit(-1);
+    }
+    char *argvs[MAXARG];
+    char buf[128];
+    int i;
+    for (i = 1; i < argc; i++) {
+        argvs[i - 1] = argv[i];         // argvs[0] = COMMAND
+    }
+    i--;
+    if (readline(0, buf, 128) == 0) {   // if there is no input
+        argvs[i] = 0;
+        if (fork() == 0) {
+            exec(argv[1], argvs);
+            printf("xargs: exec %s fail\n", argv[1]);
+            exit(0);
+        }
+        wait(0);
+    } else {
+        argvs[i] = buf;
+        argvs[i + 1] = 0;
+        do {
+            if (fork() == 0) {
+                exec(argv[1], argvs);
+                printf("xargs: exec %s fail\n", argv[1]);
+                exit(0);
+            }
+            wait(0);
+        } while (readline(0, buf, 128) != 0);
+    }
+    exit(0);
+}
diff --git a/xv6-user/xargs.d b/xv6-user/xargs.d
new file mode 100644
index 0000000000000000000000000000000000000000..0c873ade25280d22cf0ab20c05ae6745264fc749
--- /dev/null
+++ b/xv6-user/xargs.d
@@ -0,0 +1,3 @@
+xv6-user/xargs.o: xv6-user/xargs.c kernel/include/types.h \
+ kernel/include/param.h xv6-user/user.h kernel/include/stat.h \
+ kernel/include/fcntl.h
diff --git a/xv6-user/xargs.o b/xv6-user/xargs.o
new file mode 100644
index 0000000000000000000000000000000000000000..15d0853be426642397bdb55370ec4ccafa10fb63
Binary files /dev/null and b/xv6-user/xargs.o differ
diff --git a/xv6-user/xargs.sym b/xv6-user/xargs.sym
new file mode 100644
index 0000000000000000000000000000000000000000..1de8df8d1081f540e96015ae869c391ab07bc846
--- /dev/null
+++ b/xv6-user/xargs.sym
@@ -0,0 +1,77 @@
+0000000000000000 .text
+00000000000009d8 .rodata
+0000000000000a90 .bss
+0000000000000000 .comment
+0000000000000000 .riscv.attributes
+0000000000000000 .debug_aranges
+0000000000000000 .debug_info
+0000000000000000 .debug_abbrev
+0000000000000000 .debug_line
+0000000000000000 .debug_frame
+0000000000000000 .debug_str
+0000000000000000 .debug_line_str
+0000000000000000 .debug_loclists
+0000000000000000 .debug_rnglists
+0000000000000000 xargs.c
+0000000000000000 ulib.c
+0000000000000000 usys.o
+0000000000000000 printf.c
+000000000000055a putc
+000000000000057c printint
+0000000000000a78 digits
+0000000000000000 umalloc.c
+0000000000000a90 freep
+0000000000000a98 base
+00000000000001b6 strcpy
+0000000000000832 printf
+0000000000001289 __global_pointer$
+0000000000000514 dev
+00000000000003bc memmove
+0000000000000538 trace
+000000000000029c gets
+0000000000000a89 __SDATA_BEGIN__
+00000000000004ea getpid
+000000000000044e memcpy
+0000000000000000 readline
+00000000000008ea malloc
+000000000000052e remove
+00000000000004fc sleep
+0000000000000540 sysinfo
+000000000000051e readdir
+0000000000000480 pipe
+0000000000000548 rename
+0000000000000494 write
+00000000000004c4 fstat
+0000000000000804 fprintf
+00000000000004a8 kill
+00000000000001d2 strcat
+0000000000000626 vprintf
+00000000000004d8 chdir
+00000000000004b0 exec
+0000000000000478 wait
+000000000000048a read
+0000000000000414 memcmp
+0000000000000466 fork
+0000000000000aa8 __BSS_END__
+00000000000004f4 sbrk
+000000000000050c test_proc
+0000000000000504 uptime
+0000000000000a89 __bss_start
+0000000000000256 memset
+0000000000000068 main
+0000000000000200 strcmp
+0000000000000550 shutdown
+00000000000004e2 dup
+0000000000000526 getcwd
+0000000000000a89 __DATA_BEGIN__
+0000000000000316 stat
+0000000000000a89 _edata
+0000000000000aa8 _end
+000000000000046e exit
+000000000000035c atoi
+000000000000022c strlen
+00000000000004ba open
+0000000000000278 strchr
+00000000000004ce mkdir
+000000000000049e close
+0000000000000868 free
diff --git a/xv6-user/xargstest.sh b/xv6-user/xargstest.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4362589c83455cc3e9e8e72dcbaacf7511e2cc16
--- /dev/null
+++ b/xv6-user/xargstest.sh
@@ -0,0 +1,6 @@
+mkdir a
+echo hello > a/b
+mkdir c
+echo hello > c/b
+echo hello > b
+find . b | xargs grep hello
diff --git a/xv6-user/xv6-riscv-license b/xv6-user/xv6-riscv-license
new file mode 100644
index 0000000000000000000000000000000000000000..bd4fb5bfcb80957d5c88e2b14a3df63d3510598c
--- /dev/null
+++ b/xv6-user/xv6-riscv-license
@@ -0,0 +1,23 @@
+The xv6 software is:
+
+Copyright (c) 2006-2019 Frans Kaashoek, Robert Morris, Russ Cox,
+                        Massachusetts Institute of Technology
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/xv6-user/zombie.c b/xv6-user/zombie.c
new file mode 100644
index 0000000000000000000000000000000000000000..abdb693613798ce0b53f87d4bdf00d224d7370f8
--- /dev/null
+++ b/xv6-user/zombie.c
@@ -0,0 +1,14 @@
+// Create a zombie process that
+// must be reparented at exit.
+
+#include "kernel/include/types.h"
+#include "kernel/include/stat.h"
+#include "xv6-user/user.h"
+
+int
+main(void)
+{
+  if(fork() > 0)
+    sleep(5);  // Let child exit before parent.
+  exit(0);
+}