diff --git a/.dir-locals.el b/.dir-locals.el deleted file mode 100644 index da72247468..0000000000 --- a/.dir-locals.el +++ /dev/null @@ -1,4 +0,0 @@ -((c-mode - (indent-tabs-mode . nil) - (c-file-style . "bsd") - (c-basic-offset . 2))) diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index c47611efea..0000000000 --- a/.editorconfig +++ /dev/null @@ -1,22 +0,0 @@ -; https://editorconfig.org - -root = true - -[*] -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 4 - -[*.{c,h}] -indent_size = 2 - -[*.S] -indent_size = 8 - -[*.ld] -indent_size = 2 - -[Makefile] -indent_style = tab -indent_size = 8 diff --git a/.gdbinit.tmpl-riscv b/.gdbinit.tmpl-riscv deleted file mode 100644 index a2bfde3cfc..0000000000 --- a/.gdbinit.tmpl-riscv +++ /dev/null @@ -1,6 +0,0 @@ -set confirm off -set architecture riscv:rv64 -target remote 127.0.0.1:1234 -symbol-file kernel/kernel -set disassemble-next-line auto -set riscv use-compressed-breakpoints yes diff --git a/.gitignore b/.gitignore deleted file mode 100644 index aebb7d253d..0000000000 --- a/.gitignore +++ /dev/null @@ -1,18 +0,0 @@ -*~ -_* -*.o -*.d -*.asm -*.sym -*.img -vectors.S -bootblock -entryother -initcode -initcode.out -kernelmemfs -mkfs -kernel/kernel -user/usys.S -.gdbinit -TAGS diff --git a/LICENSE b/G12_Project1_xv6CustomizeSystemCalls/LICENSE similarity index 100% rename from LICENSE rename to G12_Project1_xv6CustomizeSystemCalls/LICENSE diff --git a/G12_Project1_xv6CustomizeSystemCalls/Makefile b/G12_Project1_xv6CustomizeSystemCalls/Makefile new file mode 100644 index 0000000000..f21c018180 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/Makefile @@ -0,0 +1,198 @@ +K=kernel +U=user + +OBJS = \ + $K/entry.o \ + $K/start.o \ + $K/console.o \ + $K/printf.o \ + $K/uart.o \ + $K/kalloc.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/fs.o \ + $K/log.o \ + $K/sleeplock.o \ + $K/file.o \ + $K/pipe.o \ + $K/exec.o \ + $K/sysfile.o \ + $K/kernelvec.o \ + $K/plic.o \ + $K/virtio_disk.o + +# riscv64-unknown-elf- or riscv64-linux-gnu- +# perhaps in /opt/riscv/bin +#TOOLPREFIX = + +# Try to infer the correct TOOLPREFIX if not set +ifndef TOOLPREFIX +TOOLPREFIX := $(shell if riscv64-unknown-elf-objdump -i 2>&1 | grep 'elf64-big' >/dev/null 2>&1; \ + then echo 'riscv64-unknown-elf-'; \ + elif riscv64-elf-objdump -i 2>&1 | grep 'elf64-big' >/dev/null 2>&1; \ + then echo 'riscv64-elf-'; \ + elif riscv64-none-elf-objdump -i 2>&1 | grep 'elf64-big' >/dev/null 2>&1; \ + then echo 'riscv64-none-elf-'; \ + elif riscv64-linux-gnu-objdump -i 2>&1 | grep 'elf64-big' >/dev/null 2>&1; \ + then echo 'riscv64-linux-gnu-'; \ + elif riscv64-unknown-linux-gnu-objdump -i 2>&1 | grep 'elf64-big' >/dev/null 2>&1; \ + then echo 'riscv64-unknown-linux-gnu-'; \ + else echo "***" 1>&2; \ + echo "*** Error: Couldn't find a riscv64 version of GCC/binutils." 1>&2; \ + echo "*** To turn off this error, run 'gmake TOOLPREFIX= ...'." 1>&2; \ + echo "***" 1>&2; exit 1; fi) +endif + +QEMU = qemu-system-riscv64 +MIN_QEMU_VERSION = 7.2 + +CC = $(TOOLPREFIX)gcc +AS = $(TOOLPREFIX)gas +LD = $(TOOLPREFIX)ld +OBJCOPY = $(TOOLPREFIX)objcopy +OBJDUMP = $(TOOLPREFIX)objdump + +CFLAGS = -Wall -Werror -Wno-unknown-attributes -O -fno-omit-frame-pointer -ggdb -gdwarf-2 +CFLAGS += -march=rv64gc +CFLAGS += -MD +CFLAGS += -mcmodel=medany +CFLAGS += -ffreestanding +CFLAGS += -fno-common -nostdlib +CFLAGS += -fno-builtin-strncpy -fno-builtin-strncmp -fno-builtin-strlen -fno-builtin-memset +CFLAGS += -fno-builtin-memmove -fno-builtin-memcmp -fno-builtin-log -fno-builtin-bzero +CFLAGS += -fno-builtin-strchr -fno-builtin-exit -fno-builtin-malloc -fno-builtin-putc +CFLAGS += -fno-builtin-free +CFLAGS += -fno-builtin-memcpy -Wno-main +CFLAGS += -fno-builtin-printf -fno-builtin-fprintf -fno-builtin-vprintf +CFLAGS += -I. +CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) + +# Disable PIE when possible (for Ubuntu 16.10 toolchain) +ifneq ($(shell $(CC) -dumpspecs 2>/dev/null | grep -e '[^f]no-pie'),) +CFLAGS += -fno-pie -no-pie +endif +ifneq ($(shell $(CC) -dumpspecs 2>/dev/null | grep -e '[^f]nopie'),) +CFLAGS += -fno-pie -nopie +endif + +LDFLAGS = -z max-page-size=4096 + +$K/kernel: $(OBJS) $K/kernel.ld + $(LD) $(LDFLAGS) -T $K/kernel.ld -o $K/kernel $(OBJS) + $(OBJDUMP) -S $K/kernel > $K/kernel.asm + $(OBJDUMP) -t $K/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $K/kernel.sym + +$K/%.o: $K/%.S + $(CC) -march=rv64gc -g -c -o $@ $< + +tags: $(OBJS) + etags kernel/*.S kernel/*.c + +ULIB = $U/ulib.o $U/usys.o $U/printf.o $U/umalloc.o + +_%: %.o $(ULIB) $U/user.ld + $(LD) $(LDFLAGS) -T $U/user.ld -o $@ $< $(ULIB) + $(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 + +mkfs/mkfs: mkfs/mkfs.c $K/fs.h $K/param.h + gcc -Wno-unknown-attributes -I. -o mkfs/mkfs mkfs/mkfs.c + +# 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/_cat\ + $U/_echo\ + $U/_forktest\ + $U/_grep\ + $U/_init\ + $U/_kill\ + $U/_ln\ + $U/_ls\ + $U/_mkdir\ + $U/_rm\ + $U/_sh\ + $U/_stressfs\ + $U/_usertests\ + $U/_grind\ + $U/_wc\ + $U/_zombie\ + $U/_logstress\ + $U/_forphan\ + $U/_dorphan\ + $U/_test_procs\ + $U/_test_getppid\ + $U/_test_sleep2 + +fs.img: mkfs/mkfs README $(UPROGS) + mkfs/mkfs fs.img README $(UPROGS) + +-include kernel/*.d user/*.d + +clean: + rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \ + */*.o */*.d */*.asm */*.sym \ + $K/kernel fs.img \ + mkfs/mkfs .gdbinit \ + $U/usys.S \ + $(UPROGS) + +# try to generate a unique GDB port +GDBPORT = $(shell expr `id -u` % 5000 + 25000) +# QEMU's gdb stub command line changed in 0.11 +QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \ + then echo "-gdb tcp::$(GDBPORT)"; \ + else echo "-s -p $(GDBPORT)"; fi) +ifndef CPUS +CPUS := 3 +endif + +QEMUOPTS = -machine virt -bios none -kernel $K/kernel -m 128M -smp $(CPUS) -nographic +QEMUOPTS += -global virtio-mmio.force-legacy=false +QEMUOPTS += -drive file=fs.img,if=none,format=raw,id=x0 +QEMUOPTS += -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0 + +qemu: check-qemu-version $K/kernel fs.img + $(QEMU) $(QEMUOPTS) + +.gdbinit: .gdbinit.tmpl-riscv + sed "s/:1234/:$(GDBPORT)/" < $^ > $@ + +qemu-gdb: $K/kernel .gdbinit fs.img + @echo "*** Now run 'gdb' in another window." 1>&2 + $(QEMU) $(QEMUOPTS) -S $(QEMUGDB) + +print-gdbport: + @echo $(GDBPORT) + +QEMU_VERSION := $(shell $(QEMU) --version | head -n 1 | sed -E 's/^QEMU emulator version ([0-9]+\.[0-9]+)\..*/\1/') +check-qemu-version: + @if [ "$(shell echo "$(QEMU_VERSION) >= $(MIN_QEMU_VERSION)" | bc)" -eq 0 ]; then \ + echo "ERROR: Need qemu version >= $(MIN_QEMU_VERSION)"; \ + exit 1; \ + fi diff --git a/README b/G12_Project1_xv6CustomizeSystemCalls/README similarity index 100% rename from README rename to G12_Project1_xv6CustomizeSystemCalls/README diff --git a/G12_Project1_xv6CustomizeSystemCalls/fs.img b/G12_Project1_xv6CustomizeSystemCalls/fs.img new file mode 100644 index 0000000000..9f2140b8eb Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/fs.img differ diff --git a/kernel/bio.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/bio.c similarity index 100% rename from kernel/bio.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/bio.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/bio.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/bio.d new file mode 100644 index 0000000000..63aa36fdf2 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/bio.d @@ -0,0 +1,3 @@ +kernel/bio.o: kernel/bio.c kernel/types.h kernel/param.h \ + kernel/spinlock.h kernel/sleeplock.h kernel/riscv.h kernel/defs.h \ + kernel/fs.h kernel/buf.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/bio.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/bio.o new file mode 100644 index 0000000000..75dd140617 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/bio.o differ diff --git a/kernel/buf.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/buf.h similarity index 100% rename from kernel/buf.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/buf.h diff --git a/kernel/console.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/console.c similarity index 100% rename from kernel/console.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/console.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/console.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/console.d new file mode 100644 index 0000000000..af8fd03afb --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/console.d @@ -0,0 +1,5 @@ +kernel/console.o: kernel/console.c \ + /usr/lib/gcc-cross/riscv64-linux-gnu/13/include/stdarg.h kernel/types.h \ + kernel/param.h kernel/spinlock.h kernel/sleeplock.h kernel/fs.h \ + kernel/file.h kernel/memlayout.h kernel/riscv.h kernel/defs.h \ + kernel/proc.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/console.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/console.o new file mode 100644 index 0000000000..ff3a02e15c Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/console.o differ diff --git a/kernel/defs.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/defs.h similarity index 100% rename from kernel/defs.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/defs.h diff --git a/kernel/elf.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/elf.h similarity index 100% rename from kernel/elf.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/elf.h diff --git a/kernel/entry.S b/G12_Project1_xv6CustomizeSystemCalls/kernel/entry.S similarity index 100% rename from kernel/entry.S rename to G12_Project1_xv6CustomizeSystemCalls/kernel/entry.S diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/entry.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/entry.o new file mode 100644 index 0000000000..29609e01d3 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/entry.o differ diff --git a/kernel/exec.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/exec.c similarity index 100% rename from kernel/exec.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/exec.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/exec.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/exec.d new file mode 100644 index 0000000000..f162b3b2e6 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/exec.d @@ -0,0 +1,3 @@ +kernel/exec.o: kernel/exec.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/defs.h kernel/elf.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/exec.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/exec.o new file mode 100644 index 0000000000..ba67deec1f Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/exec.o differ diff --git a/kernel/fcntl.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/fcntl.h similarity index 100% rename from kernel/fcntl.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/fcntl.h diff --git a/kernel/file.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/file.c similarity index 100% rename from kernel/file.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/file.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/file.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/file.d new file mode 100644 index 0000000000..222a010087 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/file.d @@ -0,0 +1,3 @@ +kernel/file.o: kernel/file.c kernel/types.h kernel/riscv.h kernel/defs.h \ + kernel/param.h kernel/fs.h kernel/spinlock.h kernel/sleeplock.h \ + kernel/file.h kernel/stat.h kernel/proc.h diff --git a/kernel/file.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/file.h similarity index 100% rename from kernel/file.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/file.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/file.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/file.o new file mode 100644 index 0000000000..3b62967627 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/file.o differ diff --git a/kernel/fs.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/fs.c similarity index 100% rename from kernel/fs.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/fs.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/fs.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/fs.d new file mode 100644 index 0000000000..9e5d3ff277 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/fs.d @@ -0,0 +1,3 @@ +kernel/fs.o: kernel/fs.c kernel/types.h kernel/riscv.h kernel/defs.h \ + kernel/param.h kernel/stat.h kernel/spinlock.h kernel/proc.h \ + kernel/sleeplock.h kernel/fs.h kernel/buf.h kernel/file.h diff --git a/kernel/fs.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/fs.h similarity index 100% rename from kernel/fs.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/fs.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/fs.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/fs.o new file mode 100644 index 0000000000..e8e2a4d0d9 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/fs.o differ diff --git a/kernel/kalloc.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/kalloc.c similarity index 100% rename from kernel/kalloc.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/kalloc.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/kalloc.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/kalloc.d new file mode 100644 index 0000000000..d495b70fd8 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/kalloc.d @@ -0,0 +1,2 @@ +kernel/kalloc.o: kernel/kalloc.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/spinlock.h kernel/riscv.h kernel/defs.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/kalloc.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/kalloc.o new file mode 100644 index 0000000000..d0d4ae384e Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/kalloc.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel new file mode 100755 index 0000000000..ffada11f2b Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel.asm b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel.asm new file mode 100644 index 0000000000..9fc1a05a6e --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel.asm @@ -0,0 +1,13035 @@ + +kernel/kernel: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000080000000 <_entry>: +_entry: + # set up a stack for C. + # stack0 is declared in start.c, + # with a 4096-byte stack per CPU. + # sp = stack0 + ((hartid + 1) * 4096) + la sp, stack0 + 80000000: 0000a117 auipc sp,0xa + 80000004: 25813103 ld sp,600(sp) # 8000a258 <_GLOBAL_OFFSET_TABLE_+0x8> + li a0, 1024*4 + 80000008: 6505 lui a0,0x1 + csrr a1, mhartid + 8000000a: f14025f3 csrr a1,mhartid + addi a1, a1, 1 + 8000000e: 0585 addi a1,a1,1 + mul a0, a0, a1 + 80000010: 02b50533 mul a0,a0,a1 + add sp, sp, a0 + 80000014: 912a add sp,sp,a0 + # jump to start() in start.c + call start + 80000016: 04a000ef jal 80000060 + +000000008000001a : +spin: + j spin + 8000001a: a001 j 8000001a + +000000008000001c : +} + +// ask each hart to generate timer interrupts. +void +timerinit() +{ + 8000001c: 1141 addi sp,sp,-16 + 8000001e: e422 sd s0,8(sp) + 80000020: 0800 addi s0,sp,16 +#define MIE_STIE (1L << 5) // supervisor timer +static inline uint64 +r_mie() +{ + uint64 x; + asm volatile("csrr %0, mie" : "=r" (x) ); + 80000022: 304027f3 csrr a5,mie + // enable supervisor-mode timer interrupts. + w_mie(r_mie() | MIE_STIE); + 80000026: 0207e793 ori a5,a5,32 +} + +static inline void +w_mie(uint64 x) +{ + asm volatile("csrw mie, %0" : : "r" (x)); + 8000002a: 30479073 csrw mie,a5 +static inline uint64 +r_menvcfg() +{ + uint64 x; + // asm volatile("csrr %0, menvcfg" : "=r" (x) ); + asm volatile("csrr %0, 0x30a" : "=r" (x) ); + 8000002e: 30a027f3 csrr a5,0x30a + + // enable the sstc extension (i.e. stimecmp). + w_menvcfg(r_menvcfg() | (1L << 63)); + 80000032: 577d li a4,-1 + 80000034: 177e slli a4,a4,0x3f + 80000036: 8fd9 or a5,a5,a4 + +static inline void +w_menvcfg(uint64 x) +{ + // asm volatile("csrw menvcfg, %0" : : "r" (x)); + asm volatile("csrw 0x30a, %0" : : "r" (x)); + 80000038: 30a79073 csrw 0x30a,a5 + +static inline uint64 +r_mcounteren() +{ + uint64 x; + asm volatile("csrr %0, mcounteren" : "=r" (x) ); + 8000003c: 306027f3 csrr a5,mcounteren + + // allow supervisor to use stimecmp and time. + w_mcounteren(r_mcounteren() | 2); + 80000040: 0027e793 ori a5,a5,2 + asm volatile("csrw mcounteren, %0" : : "r" (x)); + 80000044: 30679073 csrw mcounteren,a5 +// machine-mode cycle counter +static inline uint64 +r_time() +{ + uint64 x; + asm volatile("csrr %0, time" : "=r" (x) ); + 80000048: c01027f3 rdtime a5 + + // ask for the very first timer interrupt. + w_stimecmp(r_time() + 1000000); + 8000004c: 000f4737 lui a4,0xf4 + 80000050: 24070713 addi a4,a4,576 # f4240 <_entry-0x7ff0bdc0> + 80000054: 97ba add a5,a5,a4 + asm volatile("csrw 0x14d, %0" : : "r" (x)); + 80000056: 14d79073 csrw stimecmp,a5 +} + 8000005a: 6422 ld s0,8(sp) + 8000005c: 0141 addi sp,sp,16 + 8000005e: 8082 ret + +0000000080000060 : +{ + 80000060: 1141 addi sp,sp,-16 + 80000062: e406 sd ra,8(sp) + 80000064: e022 sd s0,0(sp) + 80000066: 0800 addi s0,sp,16 + asm volatile("csrr %0, mstatus" : "=r" (x) ); + 80000068: 300027f3 csrr a5,mstatus + x &= ~MSTATUS_MPP_MASK; + 8000006c: 7779 lui a4,0xffffe + 8000006e: 7ff70713 addi a4,a4,2047 # ffffffffffffe7ff + 80000072: 8ff9 and a5,a5,a4 + x |= MSTATUS_MPP_S; + 80000074: 6705 lui a4,0x1 + 80000076: 80070713 addi a4,a4,-2048 # 800 <_entry-0x7ffff800> + 8000007a: 8fd9 or a5,a5,a4 + asm volatile("csrw mstatus, %0" : : "r" (x)); + 8000007c: 30079073 csrw mstatus,a5 + asm volatile("csrw mepc, %0" : : "r" (x)); + 80000080: 00001797 auipc a5,0x1 + 80000084: dbc78793 addi a5,a5,-580 # 80000e3c
+ 80000088: 34179073 csrw mepc,a5 + asm volatile("csrw satp, %0" : : "r" (x)); + 8000008c: 4781 li a5,0 + 8000008e: 18079073 csrw satp,a5 + asm volatile("csrw medeleg, %0" : : "r" (x)); + 80000092: 67c1 lui a5,0x10 + 80000094: 17fd addi a5,a5,-1 # ffff <_entry-0x7fff0001> + 80000096: 30279073 csrw medeleg,a5 + asm volatile("csrw mideleg, %0" : : "r" (x)); + 8000009a: 30379073 csrw mideleg,a5 + asm volatile("csrr %0, sie" : "=r" (x) ); + 8000009e: 104027f3 csrr a5,sie + w_sie(r_sie() | SIE_SEIE | SIE_STIE); + 800000a2: 2207e793 ori a5,a5,544 + asm volatile("csrw sie, %0" : : "r" (x)); + 800000a6: 10479073 csrw sie,a5 + asm volatile("csrw pmpaddr0, %0" : : "r" (x)); + 800000aa: 57fd li a5,-1 + 800000ac: 83a9 srli a5,a5,0xa + 800000ae: 3b079073 csrw pmpaddr0,a5 + asm volatile("csrw pmpcfg0, %0" : : "r" (x)); + 800000b2: 47bd li a5,15 + 800000b4: 3a079073 csrw pmpcfg0,a5 + timerinit(); + 800000b8: f65ff0ef jal 8000001c + asm volatile("csrr %0, mhartid" : "=r" (x) ); + 800000bc: f14027f3 csrr a5,mhartid + w_tp(id); + 800000c0: 2781 sext.w a5,a5 +} + +static inline void +w_tp(uint64 x) +{ + asm volatile("mv tp, %0" : : "r" (x)); + 800000c2: 823e mv tp,a5 + asm volatile("mret"); + 800000c4: 30200073 mret +} + 800000c8: 60a2 ld ra,8(sp) + 800000ca: 6402 ld s0,0(sp) + 800000cc: 0141 addi sp,sp,16 + 800000ce: 8082 ret + +00000000800000d0 : +// user write() system calls to the console go here. +// uses sleep() and UART interrupts. +// +int +consolewrite(int user_src, uint64 src, int n) +{ + 800000d0: 7119 addi sp,sp,-128 + 800000d2: fc86 sd ra,120(sp) + 800000d4: f8a2 sd s0,112(sp) + 800000d6: f4a6 sd s1,104(sp) + 800000d8: 0100 addi s0,sp,128 + char buf[32]; // move batches from user space to uart. + int i = 0; + + while(i < n){ + 800000da: 06c05a63 blez a2,8000014e + 800000de: f0ca sd s2,96(sp) + 800000e0: ecce sd s3,88(sp) + 800000e2: e8d2 sd s4,80(sp) + 800000e4: e4d6 sd s5,72(sp) + 800000e6: e0da sd s6,64(sp) + 800000e8: fc5e sd s7,56(sp) + 800000ea: f862 sd s8,48(sp) + 800000ec: f466 sd s9,40(sp) + 800000ee: 8aaa mv s5,a0 + 800000f0: 8b2e mv s6,a1 + 800000f2: 8a32 mv s4,a2 + int i = 0; + 800000f4: 4481 li s1,0 + int nn = sizeof(buf); + if(nn > n - i) + 800000f6: 02000c13 li s8,32 + 800000fa: 02000c93 li s9,32 + nn = n - i; + if(either_copyin(buf, user_src, src+i, nn) == -1) + 800000fe: 5bfd li s7,-1 + 80000100: a035 j 8000012c + if(nn > n - i) + 80000102: 0009099b sext.w s3,s2 + if(either_copyin(buf, user_src, src+i, nn) == -1) + 80000106: 86ce mv a3,s3 + 80000108: 01648633 add a2,s1,s6 + 8000010c: 85d6 mv a1,s5 + 8000010e: f8040513 addi a0,s0,-128 + 80000112: 16c020ef jal 8000227e + 80000116: 03750e63 beq a0,s7,80000152 + break; + uartwrite(buf, nn); + 8000011a: 85ce mv a1,s3 + 8000011c: f8040513 addi a0,s0,-128 + 80000120: 778000ef jal 80000898 + i += nn; + 80000124: 009904bb addw s1,s2,s1 + while(i < n){ + 80000128: 0144da63 bge s1,s4,8000013c + if(nn > n - i) + 8000012c: 409a093b subw s2,s4,s1 + 80000130: 0009079b sext.w a5,s2 + 80000134: fcfc57e3 bge s8,a5,80000102 + 80000138: 8966 mv s2,s9 + 8000013a: b7e1 j 80000102 + 8000013c: 7906 ld s2,96(sp) + 8000013e: 69e6 ld s3,88(sp) + 80000140: 6a46 ld s4,80(sp) + 80000142: 6aa6 ld s5,72(sp) + 80000144: 6b06 ld s6,64(sp) + 80000146: 7be2 ld s7,56(sp) + 80000148: 7c42 ld s8,48(sp) + 8000014a: 7ca2 ld s9,40(sp) + 8000014c: a819 j 80000162 + int i = 0; + 8000014e: 4481 li s1,0 + 80000150: a809 j 80000162 + 80000152: 7906 ld s2,96(sp) + 80000154: 69e6 ld s3,88(sp) + 80000156: 6a46 ld s4,80(sp) + 80000158: 6aa6 ld s5,72(sp) + 8000015a: 6b06 ld s6,64(sp) + 8000015c: 7be2 ld s7,56(sp) + 8000015e: 7c42 ld s8,48(sp) + 80000160: 7ca2 ld s9,40(sp) + } + + return i; +} + 80000162: 8526 mv a0,s1 + 80000164: 70e6 ld ra,120(sp) + 80000166: 7446 ld s0,112(sp) + 80000168: 74a6 ld s1,104(sp) + 8000016a: 6109 addi sp,sp,128 + 8000016c: 8082 ret + +000000008000016e : +// user_dst indicates whether dst is a user +// or kernel address. +// +int +consoleread(int user_dst, uint64 dst, int n) +{ + 8000016e: 711d addi sp,sp,-96 + 80000170: ec86 sd ra,88(sp) + 80000172: e8a2 sd s0,80(sp) + 80000174: e4a6 sd s1,72(sp) + 80000176: e0ca sd s2,64(sp) + 80000178: fc4e sd s3,56(sp) + 8000017a: f852 sd s4,48(sp) + 8000017c: f456 sd s5,40(sp) + 8000017e: f05a sd s6,32(sp) + 80000180: 1080 addi s0,sp,96 + 80000182: 8aaa mv s5,a0 + 80000184: 8a2e mv s4,a1 + 80000186: 89b2 mv s3,a2 + uint target; + int c; + char cbuf; + + target = n; + 80000188: 00060b1b sext.w s6,a2 + acquire(&cons.lock); + 8000018c: 00012517 auipc a0,0x12 + 80000190: 11450513 addi a0,a0,276 # 800122a0 + 80000194: 23b000ef jal 80000bce + while(n > 0){ + // wait until interrupt handler has put some + // input into cons.buffer. + while(cons.r == cons.w){ + 80000198: 00012497 auipc s1,0x12 + 8000019c: 10848493 addi s1,s1,264 # 800122a0 + if(killed(myproc())){ + release(&cons.lock); + return -1; + } + sleep(&cons.r, &cons.lock); + 800001a0: 00012917 auipc s2,0x12 + 800001a4: 19890913 addi s2,s2,408 # 80012338 + while(n > 0){ + 800001a8: 0b305d63 blez s3,80000262 + while(cons.r == cons.w){ + 800001ac: 0984a783 lw a5,152(s1) + 800001b0: 09c4a703 lw a4,156(s1) + 800001b4: 0af71263 bne a4,a5,80000258 + if(killed(myproc())){ + 800001b8: 716010ef jal 800018ce + 800001bc: 755010ef jal 80002110 + 800001c0: e12d bnez a0,80000222 + sleep(&cons.r, &cons.lock); + 800001c2: 85a6 mv a1,s1 + 800001c4: 854a mv a0,s2 + 800001c6: 513010ef jal 80001ed8 + while(cons.r == cons.w){ + 800001ca: 0984a783 lw a5,152(s1) + 800001ce: 09c4a703 lw a4,156(s1) + 800001d2: fef703e3 beq a4,a5,800001b8 + 800001d6: ec5e sd s7,24(sp) + } + + c = cons.buf[cons.r++ % INPUT_BUF_SIZE]; + 800001d8: 00012717 auipc a4,0x12 + 800001dc: 0c870713 addi a4,a4,200 # 800122a0 + 800001e0: 0017869b addiw a3,a5,1 + 800001e4: 08d72c23 sw a3,152(a4) + 800001e8: 07f7f693 andi a3,a5,127 + 800001ec: 9736 add a4,a4,a3 + 800001ee: 01874703 lbu a4,24(a4) + 800001f2: 00070b9b sext.w s7,a4 + + if(c == C('D')){ // end-of-file + 800001f6: 4691 li a3,4 + 800001f8: 04db8663 beq s7,a3,80000244 + } + break; + } + + // copy the input byte to the user-space buffer. + cbuf = c; + 800001fc: fae407a3 sb a4,-81(s0) + if(either_copyout(user_dst, dst, &cbuf, 1) == -1) + 80000200: 4685 li a3,1 + 80000202: faf40613 addi a2,s0,-81 + 80000206: 85d2 mv a1,s4 + 80000208: 8556 mv a0,s5 + 8000020a: 02a020ef jal 80002234 + 8000020e: 57fd li a5,-1 + 80000210: 04f50863 beq a0,a5,80000260 + break; + + dst++; + 80000214: 0a05 addi s4,s4,1 + --n; + 80000216: 39fd addiw s3,s3,-1 + + if(c == '\n'){ + 80000218: 47a9 li a5,10 + 8000021a: 04fb8d63 beq s7,a5,80000274 + 8000021e: 6be2 ld s7,24(sp) + 80000220: b761 j 800001a8 + release(&cons.lock); + 80000222: 00012517 auipc a0,0x12 + 80000226: 07e50513 addi a0,a0,126 # 800122a0 + 8000022a: 23d000ef jal 80000c66 + return -1; + 8000022e: 557d li a0,-1 + } + } + release(&cons.lock); + + return target - n; +} + 80000230: 60e6 ld ra,88(sp) + 80000232: 6446 ld s0,80(sp) + 80000234: 64a6 ld s1,72(sp) + 80000236: 6906 ld s2,64(sp) + 80000238: 79e2 ld s3,56(sp) + 8000023a: 7a42 ld s4,48(sp) + 8000023c: 7aa2 ld s5,40(sp) + 8000023e: 7b02 ld s6,32(sp) + 80000240: 6125 addi sp,sp,96 + 80000242: 8082 ret + if(n < target){ + 80000244: 0009871b sext.w a4,s3 + 80000248: 01677a63 bgeu a4,s6,8000025c + cons.r--; + 8000024c: 00012717 auipc a4,0x12 + 80000250: 0ef72623 sw a5,236(a4) # 80012338 + 80000254: 6be2 ld s7,24(sp) + 80000256: a031 j 80000262 + 80000258: ec5e sd s7,24(sp) + 8000025a: bfbd j 800001d8 + 8000025c: 6be2 ld s7,24(sp) + 8000025e: a011 j 80000262 + 80000260: 6be2 ld s7,24(sp) + release(&cons.lock); + 80000262: 00012517 auipc a0,0x12 + 80000266: 03e50513 addi a0,a0,62 # 800122a0 + 8000026a: 1fd000ef jal 80000c66 + return target - n; + 8000026e: 413b053b subw a0,s6,s3 + 80000272: bf7d j 80000230 + 80000274: 6be2 ld s7,24(sp) + 80000276: b7f5 j 80000262 + +0000000080000278 : +{ + 80000278: 1141 addi sp,sp,-16 + 8000027a: e406 sd ra,8(sp) + 8000027c: e022 sd s0,0(sp) + 8000027e: 0800 addi s0,sp,16 + if(c == BACKSPACE){ + 80000280: 10000793 li a5,256 + 80000284: 00f50863 beq a0,a5,80000294 + uartputc_sync(c); + 80000288: 6a4000ef jal 8000092c +} + 8000028c: 60a2 ld ra,8(sp) + 8000028e: 6402 ld s0,0(sp) + 80000290: 0141 addi sp,sp,16 + 80000292: 8082 ret + uartputc_sync('\b'); uartputc_sync(' '); uartputc_sync('\b'); + 80000294: 4521 li a0,8 + 80000296: 696000ef jal 8000092c + 8000029a: 02000513 li a0,32 + 8000029e: 68e000ef jal 8000092c + 800002a2: 4521 li a0,8 + 800002a4: 688000ef jal 8000092c + 800002a8: b7d5 j 8000028c + +00000000800002aa : +// do erase/kill processing, append to cons.buf, +// wake up consoleread() if a whole line has arrived. +// +void +consoleintr(int c) +{ + 800002aa: 1101 addi sp,sp,-32 + 800002ac: ec06 sd ra,24(sp) + 800002ae: e822 sd s0,16(sp) + 800002b0: e426 sd s1,8(sp) + 800002b2: 1000 addi s0,sp,32 + 800002b4: 84aa mv s1,a0 + acquire(&cons.lock); + 800002b6: 00012517 auipc a0,0x12 + 800002ba: fea50513 addi a0,a0,-22 # 800122a0 + 800002be: 111000ef jal 80000bce + + switch(c){ + 800002c2: 47d5 li a5,21 + 800002c4: 08f48f63 beq s1,a5,80000362 + 800002c8: 0297c563 blt a5,s1,800002f2 + 800002cc: 47a1 li a5,8 + 800002ce: 0ef48463 beq s1,a5,800003b6 + 800002d2: 47c1 li a5,16 + 800002d4: 10f49563 bne s1,a5,800003de + case C('P'): // Print process list. + procdump(); + 800002d8: 7f1010ef jal 800022c8 + } + } + break; + } + + release(&cons.lock); + 800002dc: 00012517 auipc a0,0x12 + 800002e0: fc450513 addi a0,a0,-60 # 800122a0 + 800002e4: 183000ef jal 80000c66 +} + 800002e8: 60e2 ld ra,24(sp) + 800002ea: 6442 ld s0,16(sp) + 800002ec: 64a2 ld s1,8(sp) + 800002ee: 6105 addi sp,sp,32 + 800002f0: 8082 ret + switch(c){ + 800002f2: 07f00793 li a5,127 + 800002f6: 0cf48063 beq s1,a5,800003b6 + if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){ + 800002fa: 00012717 auipc a4,0x12 + 800002fe: fa670713 addi a4,a4,-90 # 800122a0 + 80000302: 0a072783 lw a5,160(a4) + 80000306: 09872703 lw a4,152(a4) + 8000030a: 9f99 subw a5,a5,a4 + 8000030c: 07f00713 li a4,127 + 80000310: fcf766e3 bltu a4,a5,800002dc + c = (c == '\r') ? '\n' : c; + 80000314: 47b5 li a5,13 + 80000316: 0cf48763 beq s1,a5,800003e4 + consputc(c); + 8000031a: 8526 mv a0,s1 + 8000031c: f5dff0ef jal 80000278 + cons.buf[cons.e++ % INPUT_BUF_SIZE] = c; + 80000320: 00012797 auipc a5,0x12 + 80000324: f8078793 addi a5,a5,-128 # 800122a0 + 80000328: 0a07a683 lw a3,160(a5) + 8000032c: 0016871b addiw a4,a3,1 + 80000330: 0007061b sext.w a2,a4 + 80000334: 0ae7a023 sw a4,160(a5) + 80000338: 07f6f693 andi a3,a3,127 + 8000033c: 97b6 add a5,a5,a3 + 8000033e: 00978c23 sb s1,24(a5) + if(c == '\n' || c == C('D') || cons.e-cons.r == INPUT_BUF_SIZE){ + 80000342: 47a9 li a5,10 + 80000344: 0cf48563 beq s1,a5,8000040e + 80000348: 4791 li a5,4 + 8000034a: 0cf48263 beq s1,a5,8000040e + 8000034e: 00012797 auipc a5,0x12 + 80000352: fea7a783 lw a5,-22(a5) # 80012338 + 80000356: 9f1d subw a4,a4,a5 + 80000358: 08000793 li a5,128 + 8000035c: f8f710e3 bne a4,a5,800002dc + 80000360: a07d j 8000040e + 80000362: e04a sd s2,0(sp) + while(cons.e != cons.w && + 80000364: 00012717 auipc a4,0x12 + 80000368: f3c70713 addi a4,a4,-196 # 800122a0 + 8000036c: 0a072783 lw a5,160(a4) + 80000370: 09c72703 lw a4,156(a4) + cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){ + 80000374: 00012497 auipc s1,0x12 + 80000378: f2c48493 addi s1,s1,-212 # 800122a0 + while(cons.e != cons.w && + 8000037c: 4929 li s2,10 + 8000037e: 02f70863 beq a4,a5,800003ae + cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){ + 80000382: 37fd addiw a5,a5,-1 + 80000384: 07f7f713 andi a4,a5,127 + 80000388: 9726 add a4,a4,s1 + while(cons.e != cons.w && + 8000038a: 01874703 lbu a4,24(a4) + 8000038e: 03270263 beq a4,s2,800003b2 + cons.e--; + 80000392: 0af4a023 sw a5,160(s1) + consputc(BACKSPACE); + 80000396: 10000513 li a0,256 + 8000039a: edfff0ef jal 80000278 + while(cons.e != cons.w && + 8000039e: 0a04a783 lw a5,160(s1) + 800003a2: 09c4a703 lw a4,156(s1) + 800003a6: fcf71ee3 bne a4,a5,80000382 + 800003aa: 6902 ld s2,0(sp) + 800003ac: bf05 j 800002dc + 800003ae: 6902 ld s2,0(sp) + 800003b0: b735 j 800002dc + 800003b2: 6902 ld s2,0(sp) + 800003b4: b725 j 800002dc + if(cons.e != cons.w){ + 800003b6: 00012717 auipc a4,0x12 + 800003ba: eea70713 addi a4,a4,-278 # 800122a0 + 800003be: 0a072783 lw a5,160(a4) + 800003c2: 09c72703 lw a4,156(a4) + 800003c6: f0f70be3 beq a4,a5,800002dc + cons.e--; + 800003ca: 37fd addiw a5,a5,-1 + 800003cc: 00012717 auipc a4,0x12 + 800003d0: f6f72a23 sw a5,-140(a4) # 80012340 + consputc(BACKSPACE); + 800003d4: 10000513 li a0,256 + 800003d8: ea1ff0ef jal 80000278 + 800003dc: b701 j 800002dc + if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){ + 800003de: ee048fe3 beqz s1,800002dc + 800003e2: bf21 j 800002fa + consputc(c); + 800003e4: 4529 li a0,10 + 800003e6: e93ff0ef jal 80000278 + cons.buf[cons.e++ % INPUT_BUF_SIZE] = c; + 800003ea: 00012797 auipc a5,0x12 + 800003ee: eb678793 addi a5,a5,-330 # 800122a0 + 800003f2: 0a07a703 lw a4,160(a5) + 800003f6: 0017069b addiw a3,a4,1 + 800003fa: 0006861b sext.w a2,a3 + 800003fe: 0ad7a023 sw a3,160(a5) + 80000402: 07f77713 andi a4,a4,127 + 80000406: 97ba add a5,a5,a4 + 80000408: 4729 li a4,10 + 8000040a: 00e78c23 sb a4,24(a5) + cons.w = cons.e; + 8000040e: 00012797 auipc a5,0x12 + 80000412: f2c7a723 sw a2,-210(a5) # 8001233c + wakeup(&cons.r); + 80000416: 00012517 auipc a0,0x12 + 8000041a: f2250513 addi a0,a0,-222 # 80012338 + 8000041e: 307010ef jal 80001f24 + 80000422: bd6d j 800002dc + +0000000080000424 : + +void +consoleinit(void) +{ + 80000424: 1141 addi sp,sp,-16 + 80000426: e406 sd ra,8(sp) + 80000428: e022 sd s0,0(sp) + 8000042a: 0800 addi s0,sp,16 + initlock(&cons.lock, "cons"); + 8000042c: 00007597 auipc a1,0x7 + 80000430: bd458593 addi a1,a1,-1068 # 80007000 + 80000434: 00012517 auipc a0,0x12 + 80000438: e6c50513 addi a0,a0,-404 # 800122a0 + 8000043c: 712000ef jal 80000b4e + + uartinit(); + 80000440: 400000ef jal 80000840 + + // connect read and write system calls + // to consoleread and consolewrite. + devsw[CONSOLE].read = consoleread; + 80000444: 00022797 auipc a5,0x22 + 80000448: fcc78793 addi a5,a5,-52 # 80022410 + 8000044c: 00000717 auipc a4,0x0 + 80000450: d2270713 addi a4,a4,-734 # 8000016e + 80000454: eb98 sd a4,16(a5) + devsw[CONSOLE].write = consolewrite; + 80000456: 00000717 auipc a4,0x0 + 8000045a: c7a70713 addi a4,a4,-902 # 800000d0 + 8000045e: ef98 sd a4,24(a5) +} + 80000460: 60a2 ld ra,8(sp) + 80000462: 6402 ld s0,0(sp) + 80000464: 0141 addi sp,sp,16 + 80000466: 8082 ret + +0000000080000468 : + +static char digits[] = "0123456789abcdef"; + +static void +printint(long long xx, int base, int sign) +{ + 80000468: 7139 addi sp,sp,-64 + 8000046a: fc06 sd ra,56(sp) + 8000046c: f822 sd s0,48(sp) + 8000046e: 0080 addi s0,sp,64 + char buf[20]; + int i; + unsigned long long x; + + if(sign && (sign = (xx < 0))) + 80000470: c219 beqz a2,80000476 + 80000472: 08054063 bltz a0,800004f2 + x = -xx; + else + x = xx; + 80000476: 4881 li a7,0 + 80000478: fc840693 addi a3,s0,-56 + + i = 0; + 8000047c: 4781 li a5,0 + do { + buf[i++] = digits[x % base]; + 8000047e: 00007617 auipc a2,0x7 + 80000482: 2b260613 addi a2,a2,690 # 80007730 + 80000486: 883e mv a6,a5 + 80000488: 2785 addiw a5,a5,1 + 8000048a: 02b57733 remu a4,a0,a1 + 8000048e: 9732 add a4,a4,a2 + 80000490: 00074703 lbu a4,0(a4) + 80000494: 00e68023 sb a4,0(a3) + } while((x /= base) != 0); + 80000498: 872a mv a4,a0 + 8000049a: 02b55533 divu a0,a0,a1 + 8000049e: 0685 addi a3,a3,1 + 800004a0: feb773e3 bgeu a4,a1,80000486 + + if(sign) + 800004a4: 00088a63 beqz a7,800004b8 + buf[i++] = '-'; + 800004a8: 1781 addi a5,a5,-32 + 800004aa: 97a2 add a5,a5,s0 + 800004ac: 02d00713 li a4,45 + 800004b0: fee78423 sb a4,-24(a5) + 800004b4: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 800004b8: 02f05963 blez a5,800004ea + 800004bc: f426 sd s1,40(sp) + 800004be: f04a sd s2,32(sp) + 800004c0: fc840713 addi a4,s0,-56 + 800004c4: 00f704b3 add s1,a4,a5 + 800004c8: fff70913 addi s2,a4,-1 + 800004cc: 993e add s2,s2,a5 + 800004ce: 37fd addiw a5,a5,-1 + 800004d0: 1782 slli a5,a5,0x20 + 800004d2: 9381 srli a5,a5,0x20 + 800004d4: 40f90933 sub s2,s2,a5 + consputc(buf[i]); + 800004d8: fff4c503 lbu a0,-1(s1) + 800004dc: d9dff0ef jal 80000278 + while(--i >= 0) + 800004e0: 14fd addi s1,s1,-1 + 800004e2: ff249be3 bne s1,s2,800004d8 + 800004e6: 74a2 ld s1,40(sp) + 800004e8: 7902 ld s2,32(sp) +} + 800004ea: 70e2 ld ra,56(sp) + 800004ec: 7442 ld s0,48(sp) + 800004ee: 6121 addi sp,sp,64 + 800004f0: 8082 ret + x = -xx; + 800004f2: 40a00533 neg a0,a0 + if(sign && (sign = (xx < 0))) + 800004f6: 4885 li a7,1 + x = -xx; + 800004f8: b741 j 80000478 + +00000000800004fa : +} + +// Print to the console. +int +printf(char *fmt, ...) +{ + 800004fa: 7131 addi sp,sp,-192 + 800004fc: fc86 sd ra,120(sp) + 800004fe: f8a2 sd s0,112(sp) + 80000500: e8d2 sd s4,80(sp) + 80000502: 0100 addi s0,sp,128 + 80000504: 8a2a mv s4,a0 + 80000506: e40c sd a1,8(s0) + 80000508: e810 sd a2,16(s0) + 8000050a: ec14 sd a3,24(s0) + 8000050c: f018 sd a4,32(s0) + 8000050e: f41c sd a5,40(s0) + 80000510: 03043823 sd a6,48(s0) + 80000514: 03143c23 sd a7,56(s0) + va_list ap; + int i, cx, c0, c1, c2; + char *s; + + if(panicking == 0) + 80000518: 0000a797 auipc a5,0xa + 8000051c: d5c7a783 lw a5,-676(a5) # 8000a274 + 80000520: c3a1 beqz a5,80000560 + acquire(&pr.lock); + + va_start(ap, fmt); + 80000522: 00840793 addi a5,s0,8 + 80000526: f8f43423 sd a5,-120(s0) + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ + 8000052a: 000a4503 lbu a0,0(s4) + 8000052e: 28050763 beqz a0,800007bc + 80000532: f4a6 sd s1,104(sp) + 80000534: f0ca sd s2,96(sp) + 80000536: ecce sd s3,88(sp) + 80000538: e4d6 sd s5,72(sp) + 8000053a: e0da sd s6,64(sp) + 8000053c: f862 sd s8,48(sp) + 8000053e: f466 sd s9,40(sp) + 80000540: f06a sd s10,32(sp) + 80000542: ec6e sd s11,24(sp) + 80000544: 4981 li s3,0 + if(cx != '%'){ + 80000546: 02500a93 li s5,37 + i++; + c0 = fmt[i+0] & 0xff; + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 8000054a: 06400b13 li s6,100 + printint(va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 8000054e: 06c00c13 li s8,108 + printint(va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 80000552: 07500c93 li s9,117 + printint(va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 80000556: 07800d13 li s10,120 + printint(va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 8000055a: 07000d93 li s11,112 + 8000055e: a01d j 80000584 + acquire(&pr.lock); + 80000560: 00012517 auipc a0,0x12 + 80000564: de850513 addi a0,a0,-536 # 80012348 + 80000568: 666000ef jal 80000bce + 8000056c: bf5d j 80000522 + consputc(cx); + 8000056e: d0bff0ef jal 80000278 + continue; + 80000572: 84ce mv s1,s3 + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ + 80000574: 0014899b addiw s3,s1,1 + 80000578: 013a07b3 add a5,s4,s3 + 8000057c: 0007c503 lbu a0,0(a5) + 80000580: 20050b63 beqz a0,80000796 + if(cx != '%'){ + 80000584: ff5515e3 bne a0,s5,8000056e + i++; + 80000588: 0019849b addiw s1,s3,1 + c0 = fmt[i+0] & 0xff; + 8000058c: 009a07b3 add a5,s4,s1 + 80000590: 0007c903 lbu s2,0(a5) + if(c0) c1 = fmt[i+1] & 0xff; + 80000594: 20090b63 beqz s2,800007aa + 80000598: 0017c783 lbu a5,1(a5) + c1 = c2 = 0; + 8000059c: 86be mv a3,a5 + if(c1) c2 = fmt[i+2] & 0xff; + 8000059e: c789 beqz a5,800005a8 + 800005a0: 009a0733 add a4,s4,s1 + 800005a4: 00274683 lbu a3,2(a4) + if(c0 == 'd'){ + 800005a8: 03690963 beq s2,s6,800005da + } else if(c0 == 'l' && c1 == 'd'){ + 800005ac: 05890363 beq s2,s8,800005f2 + } else if(c0 == 'u'){ + 800005b0: 0d990663 beq s2,s9,8000067c + } else if(c0 == 'x'){ + 800005b4: 11a90d63 beq s2,s10,800006ce + } else if(c0 == 'p'){ + 800005b8: 15b90663 beq s2,s11,80000704 + printptr(va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 800005bc: 06300793 li a5,99 + 800005c0: 18f90563 beq s2,a5,8000074a + consputc(va_arg(ap, uint)); + } else if(c0 == 's'){ + 800005c4: 07300793 li a5,115 + 800005c8: 18f90b63 beq s2,a5,8000075e + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + consputc(*s); + } else if(c0 == '%'){ + 800005cc: 03591b63 bne s2,s5,80000602 + consputc('%'); + 800005d0: 02500513 li a0,37 + 800005d4: ca5ff0ef jal 80000278 + 800005d8: bf71 j 80000574 + printint(va_arg(ap, int), 10, 1); + 800005da: f8843783 ld a5,-120(s0) + 800005de: 00878713 addi a4,a5,8 + 800005e2: f8e43423 sd a4,-120(s0) + 800005e6: 4605 li a2,1 + 800005e8: 45a9 li a1,10 + 800005ea: 4388 lw a0,0(a5) + 800005ec: e7dff0ef jal 80000468 + 800005f0: b751 j 80000574 + } else if(c0 == 'l' && c1 == 'd'){ + 800005f2: 01678f63 beq a5,s6,80000610 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 800005f6: 03878b63 beq a5,s8,8000062c + } else if(c0 == 'l' && c1 == 'u'){ + 800005fa: 09978e63 beq a5,s9,80000696 + } else if(c0 == 'l' && c1 == 'x'){ + 800005fe: 0fa78563 beq a5,s10,800006e8 + } else if(c0 == 0){ + break; + } else { + // Print unknown % sequence to draw attention. + consputc('%'); + 80000602: 8556 mv a0,s5 + 80000604: c75ff0ef jal 80000278 + consputc(c0); + 80000608: 854a mv a0,s2 + 8000060a: c6fff0ef jal 80000278 + 8000060e: b79d j 80000574 + printint(va_arg(ap, uint64), 10, 1); + 80000610: f8843783 ld a5,-120(s0) + 80000614: 00878713 addi a4,a5,8 + 80000618: f8e43423 sd a4,-120(s0) + 8000061c: 4605 li a2,1 + 8000061e: 45a9 li a1,10 + 80000620: 6388 ld a0,0(a5) + 80000622: e47ff0ef jal 80000468 + i += 1; + 80000626: 0029849b addiw s1,s3,2 + 8000062a: b7a9 j 80000574 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 8000062c: 06400793 li a5,100 + 80000630: 02f68863 beq a3,a5,80000660 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 80000634: 07500793 li a5,117 + 80000638: 06f68d63 beq a3,a5,800006b2 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 8000063c: 07800793 li a5,120 + 80000640: fcf691e3 bne a3,a5,80000602 + printint(va_arg(ap, uint64), 16, 0); + 80000644: f8843783 ld a5,-120(s0) + 80000648: 00878713 addi a4,a5,8 + 8000064c: f8e43423 sd a4,-120(s0) + 80000650: 4601 li a2,0 + 80000652: 45c1 li a1,16 + 80000654: 6388 ld a0,0(a5) + 80000656: e13ff0ef jal 80000468 + i += 2; + 8000065a: 0039849b addiw s1,s3,3 + 8000065e: bf19 j 80000574 + printint(va_arg(ap, uint64), 10, 1); + 80000660: f8843783 ld a5,-120(s0) + 80000664: 00878713 addi a4,a5,8 + 80000668: f8e43423 sd a4,-120(s0) + 8000066c: 4605 li a2,1 + 8000066e: 45a9 li a1,10 + 80000670: 6388 ld a0,0(a5) + 80000672: df7ff0ef jal 80000468 + i += 2; + 80000676: 0039849b addiw s1,s3,3 + 8000067a: bded j 80000574 + printint(va_arg(ap, uint32), 10, 0); + 8000067c: f8843783 ld a5,-120(s0) + 80000680: 00878713 addi a4,a5,8 + 80000684: f8e43423 sd a4,-120(s0) + 80000688: 4601 li a2,0 + 8000068a: 45a9 li a1,10 + 8000068c: 0007e503 lwu a0,0(a5) + 80000690: dd9ff0ef jal 80000468 + 80000694: b5c5 j 80000574 + printint(va_arg(ap, uint64), 10, 0); + 80000696: f8843783 ld a5,-120(s0) + 8000069a: 00878713 addi a4,a5,8 + 8000069e: f8e43423 sd a4,-120(s0) + 800006a2: 4601 li a2,0 + 800006a4: 45a9 li a1,10 + 800006a6: 6388 ld a0,0(a5) + 800006a8: dc1ff0ef jal 80000468 + i += 1; + 800006ac: 0029849b addiw s1,s3,2 + 800006b0: b5d1 j 80000574 + printint(va_arg(ap, uint64), 10, 0); + 800006b2: f8843783 ld a5,-120(s0) + 800006b6: 00878713 addi a4,a5,8 + 800006ba: f8e43423 sd a4,-120(s0) + 800006be: 4601 li a2,0 + 800006c0: 45a9 li a1,10 + 800006c2: 6388 ld a0,0(a5) + 800006c4: da5ff0ef jal 80000468 + i += 2; + 800006c8: 0039849b addiw s1,s3,3 + 800006cc: b565 j 80000574 + printint(va_arg(ap, uint32), 16, 0); + 800006ce: f8843783 ld a5,-120(s0) + 800006d2: 00878713 addi a4,a5,8 + 800006d6: f8e43423 sd a4,-120(s0) + 800006da: 4601 li a2,0 + 800006dc: 45c1 li a1,16 + 800006de: 0007e503 lwu a0,0(a5) + 800006e2: d87ff0ef jal 80000468 + 800006e6: b579 j 80000574 + printint(va_arg(ap, uint64), 16, 0); + 800006e8: f8843783 ld a5,-120(s0) + 800006ec: 00878713 addi a4,a5,8 + 800006f0: f8e43423 sd a4,-120(s0) + 800006f4: 4601 li a2,0 + 800006f6: 45c1 li a1,16 + 800006f8: 6388 ld a0,0(a5) + 800006fa: d6fff0ef jal 80000468 + i += 1; + 800006fe: 0029849b addiw s1,s3,2 + 80000702: bd8d j 80000574 + 80000704: fc5e sd s7,56(sp) + printptr(va_arg(ap, uint64)); + 80000706: f8843783 ld a5,-120(s0) + 8000070a: 00878713 addi a4,a5,8 + 8000070e: f8e43423 sd a4,-120(s0) + 80000712: 0007b983 ld s3,0(a5) + consputc('0'); + 80000716: 03000513 li a0,48 + 8000071a: b5fff0ef jal 80000278 + consputc('x'); + 8000071e: 07800513 li a0,120 + 80000722: b57ff0ef jal 80000278 + 80000726: 4941 li s2,16 + consputc(digits[x >> (sizeof(uint64) * 8 - 4)]); + 80000728: 00007b97 auipc s7,0x7 + 8000072c: 008b8b93 addi s7,s7,8 # 80007730 + 80000730: 03c9d793 srli a5,s3,0x3c + 80000734: 97de add a5,a5,s7 + 80000736: 0007c503 lbu a0,0(a5) + 8000073a: b3fff0ef jal 80000278 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 8000073e: 0992 slli s3,s3,0x4 + 80000740: 397d addiw s2,s2,-1 + 80000742: fe0917e3 bnez s2,80000730 + 80000746: 7be2 ld s7,56(sp) + 80000748: b535 j 80000574 + consputc(va_arg(ap, uint)); + 8000074a: f8843783 ld a5,-120(s0) + 8000074e: 00878713 addi a4,a5,8 + 80000752: f8e43423 sd a4,-120(s0) + 80000756: 4388 lw a0,0(a5) + 80000758: b21ff0ef jal 80000278 + 8000075c: bd21 j 80000574 + if((s = va_arg(ap, char*)) == 0) + 8000075e: f8843783 ld a5,-120(s0) + 80000762: 00878713 addi a4,a5,8 + 80000766: f8e43423 sd a4,-120(s0) + 8000076a: 0007b903 ld s2,0(a5) + 8000076e: 00090d63 beqz s2,80000788 + for(; *s; s++) + 80000772: 00094503 lbu a0,0(s2) + 80000776: de050fe3 beqz a0,80000574 + consputc(*s); + 8000077a: affff0ef jal 80000278 + for(; *s; s++) + 8000077e: 0905 addi s2,s2,1 + 80000780: 00094503 lbu a0,0(s2) + 80000784: f97d bnez a0,8000077a + 80000786: b3fd j 80000574 + s = "(null)"; + 80000788: 00007917 auipc s2,0x7 + 8000078c: 88090913 addi s2,s2,-1920 # 80007008 + for(; *s; s++) + 80000790: 02800513 li a0,40 + 80000794: b7dd j 8000077a + 80000796: 74a6 ld s1,104(sp) + 80000798: 7906 ld s2,96(sp) + 8000079a: 69e6 ld s3,88(sp) + 8000079c: 6aa6 ld s5,72(sp) + 8000079e: 6b06 ld s6,64(sp) + 800007a0: 7c42 ld s8,48(sp) + 800007a2: 7ca2 ld s9,40(sp) + 800007a4: 7d02 ld s10,32(sp) + 800007a6: 6de2 ld s11,24(sp) + 800007a8: a811 j 800007bc + 800007aa: 74a6 ld s1,104(sp) + 800007ac: 7906 ld s2,96(sp) + 800007ae: 69e6 ld s3,88(sp) + 800007b0: 6aa6 ld s5,72(sp) + 800007b2: 6b06 ld s6,64(sp) + 800007b4: 7c42 ld s8,48(sp) + 800007b6: 7ca2 ld s9,40(sp) + 800007b8: 7d02 ld s10,32(sp) + 800007ba: 6de2 ld s11,24(sp) + } + + } + va_end(ap); + + if(panicking == 0) + 800007bc: 0000a797 auipc a5,0xa + 800007c0: ab87a783 lw a5,-1352(a5) # 8000a274 + 800007c4: c799 beqz a5,800007d2 + release(&pr.lock); + + return 0; +} + 800007c6: 4501 li a0,0 + 800007c8: 70e6 ld ra,120(sp) + 800007ca: 7446 ld s0,112(sp) + 800007cc: 6a46 ld s4,80(sp) + 800007ce: 6129 addi sp,sp,192 + 800007d0: 8082 ret + release(&pr.lock); + 800007d2: 00012517 auipc a0,0x12 + 800007d6: b7650513 addi a0,a0,-1162 # 80012348 + 800007da: 48c000ef jal 80000c66 + return 0; + 800007de: b7e5 j 800007c6 + +00000000800007e0 : + +void +panic(char *s) +{ + 800007e0: 1101 addi sp,sp,-32 + 800007e2: ec06 sd ra,24(sp) + 800007e4: e822 sd s0,16(sp) + 800007e6: e426 sd s1,8(sp) + 800007e8: e04a sd s2,0(sp) + 800007ea: 1000 addi s0,sp,32 + 800007ec: 84aa mv s1,a0 + panicking = 1; + 800007ee: 4905 li s2,1 + 800007f0: 0000a797 auipc a5,0xa + 800007f4: a927a223 sw s2,-1404(a5) # 8000a274 + printf("panic: "); + 800007f8: 00007517 auipc a0,0x7 + 800007fc: 82050513 addi a0,a0,-2016 # 80007018 + 80000800: cfbff0ef jal 800004fa + printf("%s\n", s); + 80000804: 85a6 mv a1,s1 + 80000806: 00007517 auipc a0,0x7 + 8000080a: 81a50513 addi a0,a0,-2022 # 80007020 + 8000080e: cedff0ef jal 800004fa + panicked = 1; // freeze uart output from other CPUs + 80000812: 0000a797 auipc a5,0xa + 80000816: a527af23 sw s2,-1442(a5) # 8000a270 + for(;;) + 8000081a: a001 j 8000081a + +000000008000081c : + ; +} + +void +printfinit(void) +{ + 8000081c: 1141 addi sp,sp,-16 + 8000081e: e406 sd ra,8(sp) + 80000820: e022 sd s0,0(sp) + 80000822: 0800 addi s0,sp,16 + initlock(&pr.lock, "pr"); + 80000824: 00007597 auipc a1,0x7 + 80000828: 80458593 addi a1,a1,-2044 # 80007028 + 8000082c: 00012517 auipc a0,0x12 + 80000830: b1c50513 addi a0,a0,-1252 # 80012348 + 80000834: 31a000ef jal 80000b4e +} + 80000838: 60a2 ld ra,8(sp) + 8000083a: 6402 ld s0,0(sp) + 8000083c: 0141 addi sp,sp,16 + 8000083e: 8082 ret + +0000000080000840 : +extern volatile int panicking; // from printf.c +extern volatile int panicked; // from printf.c + +void +uartinit(void) +{ + 80000840: 1141 addi sp,sp,-16 + 80000842: e406 sd ra,8(sp) + 80000844: e022 sd s0,0(sp) + 80000846: 0800 addi s0,sp,16 + // disable interrupts. + WriteReg(IER, 0x00); + 80000848: 100007b7 lui a5,0x10000 + 8000084c: 000780a3 sb zero,1(a5) # 10000001 <_entry-0x6fffffff> + + // special mode to set baud rate. + WriteReg(LCR, LCR_BAUD_LATCH); + 80000850: 10000737 lui a4,0x10000 + 80000854: f8000693 li a3,-128 + 80000858: 00d701a3 sb a3,3(a4) # 10000003 <_entry-0x6ffffffd> + + // LSB for baud rate of 38.4K. + WriteReg(0, 0x03); + 8000085c: 468d li a3,3 + 8000085e: 10000637 lui a2,0x10000 + 80000862: 00d60023 sb a3,0(a2) # 10000000 <_entry-0x70000000> + + // MSB for baud rate of 38.4K. + WriteReg(1, 0x00); + 80000866: 000780a3 sb zero,1(a5) + + // leave set-baud mode, + // and set word length to 8 bits, no parity. + WriteReg(LCR, LCR_EIGHT_BITS); + 8000086a: 00d701a3 sb a3,3(a4) + + // reset and enable FIFOs. + WriteReg(FCR, FCR_FIFO_ENABLE | FCR_FIFO_CLEAR); + 8000086e: 10000737 lui a4,0x10000 + 80000872: 461d li a2,7 + 80000874: 00c70123 sb a2,2(a4) # 10000002 <_entry-0x6ffffffe> + + // enable transmit and receive interrupts. + WriteReg(IER, IER_TX_ENABLE | IER_RX_ENABLE); + 80000878: 00d780a3 sb a3,1(a5) + + initlock(&tx_lock, "uart"); + 8000087c: 00006597 auipc a1,0x6 + 80000880: 7b458593 addi a1,a1,1972 # 80007030 + 80000884: 00012517 auipc a0,0x12 + 80000888: adc50513 addi a0,a0,-1316 # 80012360 + 8000088c: 2c2000ef jal 80000b4e +} + 80000890: 60a2 ld ra,8(sp) + 80000892: 6402 ld s0,0(sp) + 80000894: 0141 addi sp,sp,16 + 80000896: 8082 ret + +0000000080000898 : +// transmit buf[] to the uart. it blocks if the +// uart is busy, so it cannot be called from +// interrupts, only from write() system calls. +void +uartwrite(char buf[], int n) +{ + 80000898: 715d addi sp,sp,-80 + 8000089a: e486 sd ra,72(sp) + 8000089c: e0a2 sd s0,64(sp) + 8000089e: fc26 sd s1,56(sp) + 800008a0: ec56 sd s5,24(sp) + 800008a2: 0880 addi s0,sp,80 + 800008a4: 8aaa mv s5,a0 + 800008a6: 84ae mv s1,a1 + acquire(&tx_lock); + 800008a8: 00012517 auipc a0,0x12 + 800008ac: ab850513 addi a0,a0,-1352 # 80012360 + 800008b0: 31e000ef jal 80000bce + + int i = 0; + while(i < n){ + 800008b4: 06905063 blez s1,80000914 + 800008b8: f84a sd s2,48(sp) + 800008ba: f44e sd s3,40(sp) + 800008bc: f052 sd s4,32(sp) + 800008be: e85a sd s6,16(sp) + 800008c0: e45e sd s7,8(sp) + 800008c2: 8a56 mv s4,s5 + 800008c4: 9aa6 add s5,s5,s1 + while(tx_busy != 0){ + 800008c6: 0000a497 auipc s1,0xa + 800008ca: 9b648493 addi s1,s1,-1610 # 8000a27c + // wait for a UART transmit-complete interrupt + // to set tx_busy to 0. + sleep(&tx_chan, &tx_lock); + 800008ce: 00012997 auipc s3,0x12 + 800008d2: a9298993 addi s3,s3,-1390 # 80012360 + 800008d6: 0000a917 auipc s2,0xa + 800008da: 9a290913 addi s2,s2,-1630 # 8000a278 + } + + WriteReg(THR, buf[i]); + 800008de: 10000bb7 lui s7,0x10000 + i += 1; + tx_busy = 1; + 800008e2: 4b05 li s6,1 + 800008e4: a005 j 80000904 + sleep(&tx_chan, &tx_lock); + 800008e6: 85ce mv a1,s3 + 800008e8: 854a mv a0,s2 + 800008ea: 5ee010ef jal 80001ed8 + while(tx_busy != 0){ + 800008ee: 409c lw a5,0(s1) + 800008f0: fbfd bnez a5,800008e6 + WriteReg(THR, buf[i]); + 800008f2: 000a4783 lbu a5,0(s4) + 800008f6: 00fb8023 sb a5,0(s7) # 10000000 <_entry-0x70000000> + tx_busy = 1; + 800008fa: 0164a023 sw s6,0(s1) + while(i < n){ + 800008fe: 0a05 addi s4,s4,1 + 80000900: 015a0563 beq s4,s5,8000090a + while(tx_busy != 0){ + 80000904: 409c lw a5,0(s1) + 80000906: f3e5 bnez a5,800008e6 + 80000908: b7ed j 800008f2 + 8000090a: 7942 ld s2,48(sp) + 8000090c: 79a2 ld s3,40(sp) + 8000090e: 7a02 ld s4,32(sp) + 80000910: 6b42 ld s6,16(sp) + 80000912: 6ba2 ld s7,8(sp) + } + + release(&tx_lock); + 80000914: 00012517 auipc a0,0x12 + 80000918: a4c50513 addi a0,a0,-1460 # 80012360 + 8000091c: 34a000ef jal 80000c66 +} + 80000920: 60a6 ld ra,72(sp) + 80000922: 6406 ld s0,64(sp) + 80000924: 74e2 ld s1,56(sp) + 80000926: 6ae2 ld s5,24(sp) + 80000928: 6161 addi sp,sp,80 + 8000092a: 8082 ret + +000000008000092c : +// interrupts, for use by kernel printf() and +// to echo characters. it spins waiting for the uart's +// output register to be empty. +void +uartputc_sync(int c) +{ + 8000092c: 1101 addi sp,sp,-32 + 8000092e: ec06 sd ra,24(sp) + 80000930: e822 sd s0,16(sp) + 80000932: e426 sd s1,8(sp) + 80000934: 1000 addi s0,sp,32 + 80000936: 84aa mv s1,a0 + if(panicking == 0) + 80000938: 0000a797 auipc a5,0xa + 8000093c: 93c7a783 lw a5,-1732(a5) # 8000a274 + 80000940: cf95 beqz a5,8000097c + push_off(); + + if(panicked){ + 80000942: 0000a797 auipc a5,0xa + 80000946: 92e7a783 lw a5,-1746(a5) # 8000a270 + 8000094a: ef85 bnez a5,80000982 + for(;;) + ; + } + + // wait for UART to set Transmit Holding Empty in LSR. + while((ReadReg(LSR) & LSR_TX_IDLE) == 0) + 8000094c: 10000737 lui a4,0x10000 + 80000950: 0715 addi a4,a4,5 # 10000005 <_entry-0x6ffffffb> + 80000952: 00074783 lbu a5,0(a4) + 80000956: 0207f793 andi a5,a5,32 + 8000095a: dfe5 beqz a5,80000952 + ; + WriteReg(THR, c); + 8000095c: 0ff4f513 zext.b a0,s1 + 80000960: 100007b7 lui a5,0x10000 + 80000964: 00a78023 sb a0,0(a5) # 10000000 <_entry-0x70000000> + + if(panicking == 0) + 80000968: 0000a797 auipc a5,0xa + 8000096c: 90c7a783 lw a5,-1780(a5) # 8000a274 + 80000970: cb91 beqz a5,80000984 + pop_off(); +} + 80000972: 60e2 ld ra,24(sp) + 80000974: 6442 ld s0,16(sp) + 80000976: 64a2 ld s1,8(sp) + 80000978: 6105 addi sp,sp,32 + 8000097a: 8082 ret + push_off(); + 8000097c: 212000ef jal 80000b8e + 80000980: b7c9 j 80000942 + for(;;) + 80000982: a001 j 80000982 + pop_off(); + 80000984: 28e000ef jal 80000c12 +} + 80000988: b7ed j 80000972 + +000000008000098a : + +// try to read one input character from the UART. +// return -1 if none is waiting. +int +uartgetc(void) +{ + 8000098a: 1141 addi sp,sp,-16 + 8000098c: e422 sd s0,8(sp) + 8000098e: 0800 addi s0,sp,16 + if(ReadReg(LSR) & LSR_RX_READY){ + 80000990: 100007b7 lui a5,0x10000 + 80000994: 0795 addi a5,a5,5 # 10000005 <_entry-0x6ffffffb> + 80000996: 0007c783 lbu a5,0(a5) + 8000099a: 8b85 andi a5,a5,1 + 8000099c: cb81 beqz a5,800009ac + // input data is ready. + return ReadReg(RHR); + 8000099e: 100007b7 lui a5,0x10000 + 800009a2: 0007c503 lbu a0,0(a5) # 10000000 <_entry-0x70000000> + } else { + return -1; + } +} + 800009a6: 6422 ld s0,8(sp) + 800009a8: 0141 addi sp,sp,16 + 800009aa: 8082 ret + return -1; + 800009ac: 557d li a0,-1 + 800009ae: bfe5 j 800009a6 + +00000000800009b0 : +// handle a uart interrupt, raised because input has +// arrived, or the uart is ready for more output, or +// both. called from devintr(). +void +uartintr(void) +{ + 800009b0: 1101 addi sp,sp,-32 + 800009b2: ec06 sd ra,24(sp) + 800009b4: e822 sd s0,16(sp) + 800009b6: e426 sd s1,8(sp) + 800009b8: 1000 addi s0,sp,32 + ReadReg(ISR); // acknowledge the interrupt + 800009ba: 100007b7 lui a5,0x10000 + 800009be: 0789 addi a5,a5,2 # 10000002 <_entry-0x6ffffffe> + 800009c0: 0007c783 lbu a5,0(a5) + + acquire(&tx_lock); + 800009c4: 00012517 auipc a0,0x12 + 800009c8: 99c50513 addi a0,a0,-1636 # 80012360 + 800009cc: 202000ef jal 80000bce + if(ReadReg(LSR) & LSR_TX_IDLE){ + 800009d0: 100007b7 lui a5,0x10000 + 800009d4: 0795 addi a5,a5,5 # 10000005 <_entry-0x6ffffffb> + 800009d6: 0007c783 lbu a5,0(a5) + 800009da: 0207f793 andi a5,a5,32 + 800009de: eb89 bnez a5,800009f0 + // UART finished transmitting; wake up sending thread. + tx_busy = 0; + wakeup(&tx_chan); + } + release(&tx_lock); + 800009e0: 00012517 auipc a0,0x12 + 800009e4: 98050513 addi a0,a0,-1664 # 80012360 + 800009e8: 27e000ef jal 80000c66 + + // read and process incoming characters, if any. + while(1){ + int c = uartgetc(); + if(c == -1) + 800009ec: 54fd li s1,-1 + 800009ee: a831 j 80000a0a + tx_busy = 0; + 800009f0: 0000a797 auipc a5,0xa + 800009f4: 8807a623 sw zero,-1908(a5) # 8000a27c + wakeup(&tx_chan); + 800009f8: 0000a517 auipc a0,0xa + 800009fc: 88050513 addi a0,a0,-1920 # 8000a278 + 80000a00: 524010ef jal 80001f24 + 80000a04: bff1 j 800009e0 + break; + consoleintr(c); + 80000a06: 8a5ff0ef jal 800002aa + int c = uartgetc(); + 80000a0a: f81ff0ef jal 8000098a + if(c == -1) + 80000a0e: fe951ce3 bne a0,s1,80000a06 + } +} + 80000a12: 60e2 ld ra,24(sp) + 80000a14: 6442 ld s0,16(sp) + 80000a16: 64a2 ld s1,8(sp) + 80000a18: 6105 addi sp,sp,32 + 80000a1a: 8082 ret + +0000000080000a1c : +// 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) +{ + 80000a1c: 1101 addi sp,sp,-32 + 80000a1e: ec06 sd ra,24(sp) + 80000a20: e822 sd s0,16(sp) + 80000a22: e426 sd s1,8(sp) + 80000a24: e04a sd s2,0(sp) + 80000a26: 1000 addi s0,sp,32 + struct run *r; + + if(((uint64)pa % PGSIZE) != 0 || (char*)pa < end || (uint64)pa >= PHYSTOP) + 80000a28: 03451793 slli a5,a0,0x34 + 80000a2c: e7a9 bnez a5,80000a76 + 80000a2e: 84aa mv s1,a0 + 80000a30: 00023797 auipc a5,0x23 + 80000a34: b7878793 addi a5,a5,-1160 # 800235a8 + 80000a38: 02f56f63 bltu a0,a5,80000a76 + 80000a3c: 47c5 li a5,17 + 80000a3e: 07ee slli a5,a5,0x1b + 80000a40: 02f57b63 bgeu a0,a5,80000a76 + panic("kfree"); + + // Fill with junk to catch dangling refs. + memset(pa, 1, PGSIZE); + 80000a44: 6605 lui a2,0x1 + 80000a46: 4585 li a1,1 + 80000a48: 25a000ef jal 80000ca2 + + r = (struct run*)pa; + + acquire(&kmem.lock); + 80000a4c: 00012917 auipc s2,0x12 + 80000a50: 92c90913 addi s2,s2,-1748 # 80012378 + 80000a54: 854a mv a0,s2 + 80000a56: 178000ef jal 80000bce + r->next = kmem.freelist; + 80000a5a: 01893783 ld a5,24(s2) + 80000a5e: e09c sd a5,0(s1) + kmem.freelist = r; + 80000a60: 00993c23 sd s1,24(s2) + release(&kmem.lock); + 80000a64: 854a mv a0,s2 + 80000a66: 200000ef jal 80000c66 +} + 80000a6a: 60e2 ld ra,24(sp) + 80000a6c: 6442 ld s0,16(sp) + 80000a6e: 64a2 ld s1,8(sp) + 80000a70: 6902 ld s2,0(sp) + 80000a72: 6105 addi sp,sp,32 + 80000a74: 8082 ret + panic("kfree"); + 80000a76: 00006517 auipc a0,0x6 + 80000a7a: 5c250513 addi a0,a0,1474 # 80007038 + 80000a7e: d63ff0ef jal 800007e0 + +0000000080000a82 : +{ + 80000a82: 7179 addi sp,sp,-48 + 80000a84: f406 sd ra,40(sp) + 80000a86: f022 sd s0,32(sp) + 80000a88: ec26 sd s1,24(sp) + 80000a8a: 1800 addi s0,sp,48 + p = (char*)PGROUNDUP((uint64)pa_start); + 80000a8c: 6785 lui a5,0x1 + 80000a8e: fff78713 addi a4,a5,-1 # fff <_entry-0x7ffff001> + 80000a92: 00e504b3 add s1,a0,a4 + 80000a96: 777d lui a4,0xfffff + 80000a98: 8cf9 and s1,s1,a4 + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + 80000a9a: 94be add s1,s1,a5 + 80000a9c: 0295e263 bltu a1,s1,80000ac0 + 80000aa0: e84a sd s2,16(sp) + 80000aa2: e44e sd s3,8(sp) + 80000aa4: e052 sd s4,0(sp) + 80000aa6: 892e mv s2,a1 + kfree(p); + 80000aa8: 7a7d lui s4,0xfffff + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + 80000aaa: 6985 lui s3,0x1 + kfree(p); + 80000aac: 01448533 add a0,s1,s4 + 80000ab0: f6dff0ef jal 80000a1c + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + 80000ab4: 94ce add s1,s1,s3 + 80000ab6: fe997be3 bgeu s2,s1,80000aac + 80000aba: 6942 ld s2,16(sp) + 80000abc: 69a2 ld s3,8(sp) + 80000abe: 6a02 ld s4,0(sp) +} + 80000ac0: 70a2 ld ra,40(sp) + 80000ac2: 7402 ld s0,32(sp) + 80000ac4: 64e2 ld s1,24(sp) + 80000ac6: 6145 addi sp,sp,48 + 80000ac8: 8082 ret + +0000000080000aca : +{ + 80000aca: 1141 addi sp,sp,-16 + 80000acc: e406 sd ra,8(sp) + 80000ace: e022 sd s0,0(sp) + 80000ad0: 0800 addi s0,sp,16 + initlock(&kmem.lock, "kmem"); + 80000ad2: 00006597 auipc a1,0x6 + 80000ad6: 56e58593 addi a1,a1,1390 # 80007040 + 80000ada: 00012517 auipc a0,0x12 + 80000ade: 89e50513 addi a0,a0,-1890 # 80012378 + 80000ae2: 06c000ef jal 80000b4e + freerange(end, (void*)PHYSTOP); + 80000ae6: 45c5 li a1,17 + 80000ae8: 05ee slli a1,a1,0x1b + 80000aea: 00023517 auipc a0,0x23 + 80000aee: abe50513 addi a0,a0,-1346 # 800235a8 + 80000af2: f91ff0ef jal 80000a82 +} + 80000af6: 60a2 ld ra,8(sp) + 80000af8: 6402 ld s0,0(sp) + 80000afa: 0141 addi sp,sp,16 + 80000afc: 8082 ret + +0000000080000afe : +// 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) +{ + 80000afe: 1101 addi sp,sp,-32 + 80000b00: ec06 sd ra,24(sp) + 80000b02: e822 sd s0,16(sp) + 80000b04: e426 sd s1,8(sp) + 80000b06: 1000 addi s0,sp,32 + struct run *r; + + acquire(&kmem.lock); + 80000b08: 00012497 auipc s1,0x12 + 80000b0c: 87048493 addi s1,s1,-1936 # 80012378 + 80000b10: 8526 mv a0,s1 + 80000b12: 0bc000ef jal 80000bce + r = kmem.freelist; + 80000b16: 6c84 ld s1,24(s1) + if(r) + 80000b18: c485 beqz s1,80000b40 + kmem.freelist = r->next; + 80000b1a: 609c ld a5,0(s1) + 80000b1c: 00012517 auipc a0,0x12 + 80000b20: 85c50513 addi a0,a0,-1956 # 80012378 + 80000b24: ed1c sd a5,24(a0) + release(&kmem.lock); + 80000b26: 140000ef jal 80000c66 + + if(r) + memset((char*)r, 5, PGSIZE); // fill with junk + 80000b2a: 6605 lui a2,0x1 + 80000b2c: 4595 li a1,5 + 80000b2e: 8526 mv a0,s1 + 80000b30: 172000ef jal 80000ca2 + return (void*)r; +} + 80000b34: 8526 mv a0,s1 + 80000b36: 60e2 ld ra,24(sp) + 80000b38: 6442 ld s0,16(sp) + 80000b3a: 64a2 ld s1,8(sp) + 80000b3c: 6105 addi sp,sp,32 + 80000b3e: 8082 ret + release(&kmem.lock); + 80000b40: 00012517 auipc a0,0x12 + 80000b44: 83850513 addi a0,a0,-1992 # 80012378 + 80000b48: 11e000ef jal 80000c66 + if(r) + 80000b4c: b7e5 j 80000b34 + +0000000080000b4e : +#include "proc.h" +#include "defs.h" + +void +initlock(struct spinlock *lk, char *name) +{ + 80000b4e: 1141 addi sp,sp,-16 + 80000b50: e422 sd s0,8(sp) + 80000b52: 0800 addi s0,sp,16 + lk->name = name; + 80000b54: e50c sd a1,8(a0) + lk->locked = 0; + 80000b56: 00052023 sw zero,0(a0) + lk->cpu = 0; + 80000b5a: 00053823 sd zero,16(a0) +} + 80000b5e: 6422 ld s0,8(sp) + 80000b60: 0141 addi sp,sp,16 + 80000b62: 8082 ret + +0000000080000b64 : +// Interrupts must be off. +int +holding(struct spinlock *lk) +{ + int r; + r = (lk->locked && lk->cpu == mycpu()); + 80000b64: 411c lw a5,0(a0) + 80000b66: e399 bnez a5,80000b6c + 80000b68: 4501 li a0,0 + return r; +} + 80000b6a: 8082 ret +{ + 80000b6c: 1101 addi sp,sp,-32 + 80000b6e: ec06 sd ra,24(sp) + 80000b70: e822 sd s0,16(sp) + 80000b72: e426 sd s1,8(sp) + 80000b74: 1000 addi s0,sp,32 + r = (lk->locked && lk->cpu == mycpu()); + 80000b76: 6904 ld s1,16(a0) + 80000b78: 53b000ef jal 800018b2 + 80000b7c: 40a48533 sub a0,s1,a0 + 80000b80: 00153513 seqz a0,a0 +} + 80000b84: 60e2 ld ra,24(sp) + 80000b86: 6442 ld s0,16(sp) + 80000b88: 64a2 ld s1,8(sp) + 80000b8a: 6105 addi sp,sp,32 + 80000b8c: 8082 ret + +0000000080000b8e : +// 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) +{ + 80000b8e: 1101 addi sp,sp,-32 + 80000b90: ec06 sd ra,24(sp) + 80000b92: e822 sd s0,16(sp) + 80000b94: e426 sd s1,8(sp) + 80000b96: 1000 addi s0,sp,32 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80000b98: 100024f3 csrr s1,sstatus + 80000b9c: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() & ~SSTATUS_SIE); + 80000ba0: 9bf5 andi a5,a5,-3 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80000ba2: 10079073 csrw sstatus,a5 + + // disable interrupts to prevent an involuntary context + // switch while using mycpu(). + intr_off(); + + if(mycpu()->noff == 0) + 80000ba6: 50d000ef jal 800018b2 + 80000baa: 5d3c lw a5,120(a0) + 80000bac: cb99 beqz a5,80000bc2 + mycpu()->intena = old; + mycpu()->noff += 1; + 80000bae: 505000ef jal 800018b2 + 80000bb2: 5d3c lw a5,120(a0) + 80000bb4: 2785 addiw a5,a5,1 + 80000bb6: dd3c sw a5,120(a0) +} + 80000bb8: 60e2 ld ra,24(sp) + 80000bba: 6442 ld s0,16(sp) + 80000bbc: 64a2 ld s1,8(sp) + 80000bbe: 6105 addi sp,sp,32 + 80000bc0: 8082 ret + mycpu()->intena = old; + 80000bc2: 4f1000ef jal 800018b2 + return (x & SSTATUS_SIE) != 0; + 80000bc6: 8085 srli s1,s1,0x1 + 80000bc8: 8885 andi s1,s1,1 + 80000bca: dd64 sw s1,124(a0) + 80000bcc: b7cd j 80000bae + +0000000080000bce : +{ + 80000bce: 1101 addi sp,sp,-32 + 80000bd0: ec06 sd ra,24(sp) + 80000bd2: e822 sd s0,16(sp) + 80000bd4: e426 sd s1,8(sp) + 80000bd6: 1000 addi s0,sp,32 + 80000bd8: 84aa mv s1,a0 + push_off(); // disable interrupts to avoid deadlock. + 80000bda: fb5ff0ef jal 80000b8e + if(holding(lk)) + 80000bde: 8526 mv a0,s1 + 80000be0: f85ff0ef jal 80000b64 + while(__sync_lock_test_and_set(&lk->locked, 1) != 0) + 80000be4: 4705 li a4,1 + if(holding(lk)) + 80000be6: e105 bnez a0,80000c06 + while(__sync_lock_test_and_set(&lk->locked, 1) != 0) + 80000be8: 87ba mv a5,a4 + 80000bea: 0cf4a7af amoswap.w.aq a5,a5,(s1) + 80000bee: 2781 sext.w a5,a5 + 80000bf0: ffe5 bnez a5,80000be8 + __sync_synchronize(); + 80000bf2: 0330000f fence rw,rw + lk->cpu = mycpu(); + 80000bf6: 4bd000ef jal 800018b2 + 80000bfa: e888 sd a0,16(s1) +} + 80000bfc: 60e2 ld ra,24(sp) + 80000bfe: 6442 ld s0,16(sp) + 80000c00: 64a2 ld s1,8(sp) + 80000c02: 6105 addi sp,sp,32 + 80000c04: 8082 ret + panic("acquire"); + 80000c06: 00006517 auipc a0,0x6 + 80000c0a: 44250513 addi a0,a0,1090 # 80007048 + 80000c0e: bd3ff0ef jal 800007e0 + +0000000080000c12 : + +void +pop_off(void) +{ + 80000c12: 1141 addi sp,sp,-16 + 80000c14: e406 sd ra,8(sp) + 80000c16: e022 sd s0,0(sp) + 80000c18: 0800 addi s0,sp,16 + struct cpu *c = mycpu(); + 80000c1a: 499000ef jal 800018b2 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80000c1e: 100027f3 csrr a5,sstatus + return (x & SSTATUS_SIE) != 0; + 80000c22: 8b89 andi a5,a5,2 + if(intr_get()) + 80000c24: e78d bnez a5,80000c4e + panic("pop_off - interruptible"); + if(c->noff < 1) + 80000c26: 5d3c lw a5,120(a0) + 80000c28: 02f05963 blez a5,80000c5a + panic("pop_off"); + c->noff -= 1; + 80000c2c: 37fd addiw a5,a5,-1 + 80000c2e: 0007871b sext.w a4,a5 + 80000c32: dd3c sw a5,120(a0) + if(c->noff == 0 && c->intena) + 80000c34: eb09 bnez a4,80000c46 + 80000c36: 5d7c lw a5,124(a0) + 80000c38: c799 beqz a5,80000c46 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80000c3a: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 80000c3e: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80000c42: 10079073 csrw sstatus,a5 + intr_on(); +} + 80000c46: 60a2 ld ra,8(sp) + 80000c48: 6402 ld s0,0(sp) + 80000c4a: 0141 addi sp,sp,16 + 80000c4c: 8082 ret + panic("pop_off - interruptible"); + 80000c4e: 00006517 auipc a0,0x6 + 80000c52: 40250513 addi a0,a0,1026 # 80007050 + 80000c56: b8bff0ef jal 800007e0 + panic("pop_off"); + 80000c5a: 00006517 auipc a0,0x6 + 80000c5e: 40e50513 addi a0,a0,1038 # 80007068 + 80000c62: b7fff0ef jal 800007e0 + +0000000080000c66 : +{ + 80000c66: 1101 addi sp,sp,-32 + 80000c68: ec06 sd ra,24(sp) + 80000c6a: e822 sd s0,16(sp) + 80000c6c: e426 sd s1,8(sp) + 80000c6e: 1000 addi s0,sp,32 + 80000c70: 84aa mv s1,a0 + if(!holding(lk)) + 80000c72: ef3ff0ef jal 80000b64 + 80000c76: c105 beqz a0,80000c96 + lk->cpu = 0; + 80000c78: 0004b823 sd zero,16(s1) + __sync_synchronize(); + 80000c7c: 0330000f fence rw,rw + __sync_lock_release(&lk->locked); + 80000c80: 0310000f fence rw,w + 80000c84: 0004a023 sw zero,0(s1) + pop_off(); + 80000c88: f8bff0ef jal 80000c12 +} + 80000c8c: 60e2 ld ra,24(sp) + 80000c8e: 6442 ld s0,16(sp) + 80000c90: 64a2 ld s1,8(sp) + 80000c92: 6105 addi sp,sp,32 + 80000c94: 8082 ret + panic("release"); + 80000c96: 00006517 auipc a0,0x6 + 80000c9a: 3da50513 addi a0,a0,986 # 80007070 + 80000c9e: b43ff0ef jal 800007e0 + +0000000080000ca2 : +#include "types.h" + +void* +memset(void *dst, int c, uint n) +{ + 80000ca2: 1141 addi sp,sp,-16 + 80000ca4: e422 sd s0,8(sp) + 80000ca6: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 80000ca8: ca19 beqz a2,80000cbe + 80000caa: 87aa mv a5,a0 + 80000cac: 1602 slli a2,a2,0x20 + 80000cae: 9201 srli a2,a2,0x20 + 80000cb0: 00a60733 add a4,a2,a0 + cdst[i] = c; + 80000cb4: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 80000cb8: 0785 addi a5,a5,1 + 80000cba: fee79de3 bne a5,a4,80000cb4 + } + return dst; +} + 80000cbe: 6422 ld s0,8(sp) + 80000cc0: 0141 addi sp,sp,16 + 80000cc2: 8082 ret + +0000000080000cc4 : + +int +memcmp(const void *v1, const void *v2, uint n) +{ + 80000cc4: 1141 addi sp,sp,-16 + 80000cc6: e422 sd s0,8(sp) + 80000cc8: 0800 addi s0,sp,16 + const uchar *s1, *s2; + + s1 = v1; + s2 = v2; + while(n-- > 0){ + 80000cca: ca05 beqz a2,80000cfa + 80000ccc: fff6069b addiw a3,a2,-1 # fff <_entry-0x7ffff001> + 80000cd0: 1682 slli a3,a3,0x20 + 80000cd2: 9281 srli a3,a3,0x20 + 80000cd4: 0685 addi a3,a3,1 + 80000cd6: 96aa add a3,a3,a0 + if(*s1 != *s2) + 80000cd8: 00054783 lbu a5,0(a0) + 80000cdc: 0005c703 lbu a4,0(a1) + 80000ce0: 00e79863 bne a5,a4,80000cf0 + return *s1 - *s2; + s1++, s2++; + 80000ce4: 0505 addi a0,a0,1 + 80000ce6: 0585 addi a1,a1,1 + while(n-- > 0){ + 80000ce8: fed518e3 bne a0,a3,80000cd8 + } + + return 0; + 80000cec: 4501 li a0,0 + 80000cee: a019 j 80000cf4 + return *s1 - *s2; + 80000cf0: 40e7853b subw a0,a5,a4 +} + 80000cf4: 6422 ld s0,8(sp) + 80000cf6: 0141 addi sp,sp,16 + 80000cf8: 8082 ret + return 0; + 80000cfa: 4501 li a0,0 + 80000cfc: bfe5 j 80000cf4 + +0000000080000cfe : + +void* +memmove(void *dst, const void *src, uint n) +{ + 80000cfe: 1141 addi sp,sp,-16 + 80000d00: e422 sd s0,8(sp) + 80000d02: 0800 addi s0,sp,16 + const char *s; + char *d; + + if(n == 0) + 80000d04: c205 beqz a2,80000d24 + return dst; + + s = src; + d = dst; + if(s < d && s + n > d){ + 80000d06: 02a5e263 bltu a1,a0,80000d2a + s += n; + d += n; + while(n-- > 0) + *--d = *--s; + } else + while(n-- > 0) + 80000d0a: 1602 slli a2,a2,0x20 + 80000d0c: 9201 srli a2,a2,0x20 + 80000d0e: 00c587b3 add a5,a1,a2 +{ + 80000d12: 872a mv a4,a0 + *d++ = *s++; + 80000d14: 0585 addi a1,a1,1 + 80000d16: 0705 addi a4,a4,1 # fffffffffffff001 + 80000d18: fff5c683 lbu a3,-1(a1) + 80000d1c: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 80000d20: feb79ae3 bne a5,a1,80000d14 + + return dst; +} + 80000d24: 6422 ld s0,8(sp) + 80000d26: 0141 addi sp,sp,16 + 80000d28: 8082 ret + if(s < d && s + n > d){ + 80000d2a: 02061693 slli a3,a2,0x20 + 80000d2e: 9281 srli a3,a3,0x20 + 80000d30: 00d58733 add a4,a1,a3 + 80000d34: fce57be3 bgeu a0,a4,80000d0a + d += n; + 80000d38: 96aa add a3,a3,a0 + while(n-- > 0) + 80000d3a: fff6079b addiw a5,a2,-1 + 80000d3e: 1782 slli a5,a5,0x20 + 80000d40: 9381 srli a5,a5,0x20 + 80000d42: fff7c793 not a5,a5 + 80000d46: 97ba add a5,a5,a4 + *--d = *--s; + 80000d48: 177d addi a4,a4,-1 + 80000d4a: 16fd addi a3,a3,-1 + 80000d4c: 00074603 lbu a2,0(a4) + 80000d50: 00c68023 sb a2,0(a3) + while(n-- > 0) + 80000d54: fef71ae3 bne a4,a5,80000d48 + 80000d58: b7f1 j 80000d24 + +0000000080000d5a : + +// memcpy exists to placate GCC. Use memmove. +void* +memcpy(void *dst, const void *src, uint n) +{ + 80000d5a: 1141 addi sp,sp,-16 + 80000d5c: e406 sd ra,8(sp) + 80000d5e: e022 sd s0,0(sp) + 80000d60: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 80000d62: f9dff0ef jal 80000cfe +} + 80000d66: 60a2 ld ra,8(sp) + 80000d68: 6402 ld s0,0(sp) + 80000d6a: 0141 addi sp,sp,16 + 80000d6c: 8082 ret + +0000000080000d6e : + +int +strncmp(const char *p, const char *q, uint n) +{ + 80000d6e: 1141 addi sp,sp,-16 + 80000d70: e422 sd s0,8(sp) + 80000d72: 0800 addi s0,sp,16 + while(n > 0 && *p && *p == *q) + 80000d74: ce11 beqz a2,80000d90 + 80000d76: 00054783 lbu a5,0(a0) + 80000d7a: cf89 beqz a5,80000d94 + 80000d7c: 0005c703 lbu a4,0(a1) + 80000d80: 00f71a63 bne a4,a5,80000d94 + n--, p++, q++; + 80000d84: 367d addiw a2,a2,-1 + 80000d86: 0505 addi a0,a0,1 + 80000d88: 0585 addi a1,a1,1 + while(n > 0 && *p && *p == *q) + 80000d8a: f675 bnez a2,80000d76 + if(n == 0) + return 0; + 80000d8c: 4501 li a0,0 + 80000d8e: a801 j 80000d9e + 80000d90: 4501 li a0,0 + 80000d92: a031 j 80000d9e + return (uchar)*p - (uchar)*q; + 80000d94: 00054503 lbu a0,0(a0) + 80000d98: 0005c783 lbu a5,0(a1) + 80000d9c: 9d1d subw a0,a0,a5 +} + 80000d9e: 6422 ld s0,8(sp) + 80000da0: 0141 addi sp,sp,16 + 80000da2: 8082 ret + +0000000080000da4 : + +char* +strncpy(char *s, const char *t, int n) +{ + 80000da4: 1141 addi sp,sp,-16 + 80000da6: e422 sd s0,8(sp) + 80000da8: 0800 addi s0,sp,16 + char *os; + + os = s; + while(n-- > 0 && (*s++ = *t++) != 0) + 80000daa: 87aa mv a5,a0 + 80000dac: 86b2 mv a3,a2 + 80000dae: 367d addiw a2,a2,-1 + 80000db0: 02d05563 blez a3,80000dda + 80000db4: 0785 addi a5,a5,1 + 80000db6: 0005c703 lbu a4,0(a1) + 80000dba: fee78fa3 sb a4,-1(a5) + 80000dbe: 0585 addi a1,a1,1 + 80000dc0: f775 bnez a4,80000dac + ; + while(n-- > 0) + 80000dc2: 873e mv a4,a5 + 80000dc4: 9fb5 addw a5,a5,a3 + 80000dc6: 37fd addiw a5,a5,-1 + 80000dc8: 00c05963 blez a2,80000dda + *s++ = 0; + 80000dcc: 0705 addi a4,a4,1 + 80000dce: fe070fa3 sb zero,-1(a4) + while(n-- > 0) + 80000dd2: 40e786bb subw a3,a5,a4 + 80000dd6: fed04be3 bgtz a3,80000dcc + return os; +} + 80000dda: 6422 ld s0,8(sp) + 80000ddc: 0141 addi sp,sp,16 + 80000dde: 8082 ret + +0000000080000de0 : + +// Like strncpy but guaranteed to NUL-terminate. +char* +safestrcpy(char *s, const char *t, int n) +{ + 80000de0: 1141 addi sp,sp,-16 + 80000de2: e422 sd s0,8(sp) + 80000de4: 0800 addi s0,sp,16 + char *os; + + os = s; + if(n <= 0) + 80000de6: 02c05363 blez a2,80000e0c + 80000dea: fff6069b addiw a3,a2,-1 + 80000dee: 1682 slli a3,a3,0x20 + 80000df0: 9281 srli a3,a3,0x20 + 80000df2: 96ae add a3,a3,a1 + 80000df4: 87aa mv a5,a0 + return os; + while(--n > 0 && (*s++ = *t++) != 0) + 80000df6: 00d58963 beq a1,a3,80000e08 + 80000dfa: 0585 addi a1,a1,1 + 80000dfc: 0785 addi a5,a5,1 + 80000dfe: fff5c703 lbu a4,-1(a1) + 80000e02: fee78fa3 sb a4,-1(a5) + 80000e06: fb65 bnez a4,80000df6 + ; + *s = 0; + 80000e08: 00078023 sb zero,0(a5) + return os; +} + 80000e0c: 6422 ld s0,8(sp) + 80000e0e: 0141 addi sp,sp,16 + 80000e10: 8082 ret + +0000000080000e12 : + +int +strlen(const char *s) +{ + 80000e12: 1141 addi sp,sp,-16 + 80000e14: e422 sd s0,8(sp) + 80000e16: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 80000e18: 00054783 lbu a5,0(a0) + 80000e1c: cf91 beqz a5,80000e38 + 80000e1e: 0505 addi a0,a0,1 + 80000e20: 87aa mv a5,a0 + 80000e22: 86be mv a3,a5 + 80000e24: 0785 addi a5,a5,1 + 80000e26: fff7c703 lbu a4,-1(a5) + 80000e2a: ff65 bnez a4,80000e22 + 80000e2c: 40a6853b subw a0,a3,a0 + 80000e30: 2505 addiw a0,a0,1 + ; + return n; +} + 80000e32: 6422 ld s0,8(sp) + 80000e34: 0141 addi sp,sp,16 + 80000e36: 8082 ret + for(n = 0; s[n]; n++) + 80000e38: 4501 li a0,0 + 80000e3a: bfe5 j 80000e32 + +0000000080000e3c
: +volatile static int started = 0; + +// start() jumps here in supervisor mode on all CPUs. +void +main() +{ + 80000e3c: 1141 addi sp,sp,-16 + 80000e3e: e406 sd ra,8(sp) + 80000e40: e022 sd s0,0(sp) + 80000e42: 0800 addi s0,sp,16 + if(cpuid() == 0){ + 80000e44: 25f000ef jal 800018a2 + virtio_disk_init(); // emulated hard disk + userinit(); // first user process + __sync_synchronize(); + started = 1; + } else { + while(started == 0) + 80000e48: 00009717 auipc a4,0x9 + 80000e4c: 43870713 addi a4,a4,1080 # 8000a280 + if(cpuid() == 0){ + 80000e50: c51d beqz a0,80000e7e + while(started == 0) + 80000e52: 431c lw a5,0(a4) + 80000e54: 2781 sext.w a5,a5 + 80000e56: dff5 beqz a5,80000e52 + ; + __sync_synchronize(); + 80000e58: 0330000f fence rw,rw + printf("hart %d starting\n", cpuid()); + 80000e5c: 247000ef jal 800018a2 + 80000e60: 85aa mv a1,a0 + 80000e62: 00006517 auipc a0,0x6 + 80000e66: 23650513 addi a0,a0,566 # 80007098 + 80000e6a: e90ff0ef jal 800004fa + kvminithart(); // turn on paging + 80000e6e: 080000ef jal 80000eee + trapinithart(); // install kernel trap vector + 80000e72: 588010ef jal 800023fa + plicinithart(); // ask PLIC for device interrupts + 80000e76: 662040ef jal 800054d8 + } + + scheduler(); + 80000e7a: 6c7000ef jal 80001d40 + consoleinit(); + 80000e7e: da6ff0ef jal 80000424 + printfinit(); + 80000e82: 99bff0ef jal 8000081c + printf("\n"); + 80000e86: 00006517 auipc a0,0x6 + 80000e8a: 1f250513 addi a0,a0,498 # 80007078 + 80000e8e: e6cff0ef jal 800004fa + printf("xv6 kernel is booting\n"); + 80000e92: 00006517 auipc a0,0x6 + 80000e96: 1ee50513 addi a0,a0,494 # 80007080 + 80000e9a: e60ff0ef jal 800004fa + printf("\n"); + 80000e9e: 00006517 auipc a0,0x6 + 80000ea2: 1da50513 addi a0,a0,474 # 80007078 + 80000ea6: e54ff0ef jal 800004fa + kinit(); // physical page allocator + 80000eaa: c21ff0ef jal 80000aca + kvminit(); // create kernel page table + 80000eae: 2ca000ef jal 80001178 + kvminithart(); // turn on paging + 80000eb2: 03c000ef jal 80000eee + procinit(); // process table + 80000eb6: 137000ef jal 800017ec + trapinit(); // trap vectors + 80000eba: 51c010ef jal 800023d6 + trapinithart(); // install kernel trap vector + 80000ebe: 53c010ef jal 800023fa + plicinit(); // set up interrupt controller + 80000ec2: 5fc040ef jal 800054be + plicinithart(); // ask PLIC for device interrupts + 80000ec6: 612040ef jal 800054d8 + binit(); // buffer cache + 80000eca: 4d7010ef jal 80002ba0 + iinit(); // inode table + 80000ece: 25c020ef jal 8000312a + fileinit(); // file table + 80000ed2: 14e030ef jal 80004020 + virtio_disk_init(); // emulated hard disk + 80000ed6: 6f2040ef jal 800055c8 + userinit(); // first user process + 80000eda: 4bb000ef jal 80001b94 + __sync_synchronize(); + 80000ede: 0330000f fence rw,rw + started = 1; + 80000ee2: 4785 li a5,1 + 80000ee4: 00009717 auipc a4,0x9 + 80000ee8: 38f72e23 sw a5,924(a4) # 8000a280 + 80000eec: b779 j 80000e7a + +0000000080000eee : + +// Switch the current CPU's h/w page table register to +// the kernel's page table, and enable paging. +void +kvminithart() +{ + 80000eee: 1141 addi sp,sp,-16 + 80000ef0: e422 sd s0,8(sp) + 80000ef2: 0800 addi s0,sp,16 +// flush the TLB. +static inline void +sfence_vma() +{ + // the zero, zero means flush all TLB entries. + asm volatile("sfence.vma zero, zero"); + 80000ef4: 12000073 sfence.vma + // wait for any previous writes to the page table memory to finish. + sfence_vma(); + + w_satp(MAKE_SATP(kernel_pagetable)); + 80000ef8: 00009797 auipc a5,0x9 + 80000efc: 3907b783 ld a5,912(a5) # 8000a288 + 80000f00: 83b1 srli a5,a5,0xc + 80000f02: 577d li a4,-1 + 80000f04: 177e slli a4,a4,0x3f + 80000f06: 8fd9 or a5,a5,a4 + asm volatile("csrw satp, %0" : : "r" (x)); + 80000f08: 18079073 csrw satp,a5 + asm volatile("sfence.vma zero, zero"); + 80000f0c: 12000073 sfence.vma + + // flush stale entries from the TLB. + sfence_vma(); +} + 80000f10: 6422 ld s0,8(sp) + 80000f12: 0141 addi sp,sp,16 + 80000f14: 8082 ret + +0000000080000f16 : +// 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) +{ + 80000f16: 7139 addi sp,sp,-64 + 80000f18: fc06 sd ra,56(sp) + 80000f1a: f822 sd s0,48(sp) + 80000f1c: f426 sd s1,40(sp) + 80000f1e: f04a sd s2,32(sp) + 80000f20: ec4e sd s3,24(sp) + 80000f22: e852 sd s4,16(sp) + 80000f24: e456 sd s5,8(sp) + 80000f26: e05a sd s6,0(sp) + 80000f28: 0080 addi s0,sp,64 + 80000f2a: 84aa mv s1,a0 + 80000f2c: 89ae mv s3,a1 + 80000f2e: 8ab2 mv s5,a2 + if(va >= MAXVA) + 80000f30: 57fd li a5,-1 + 80000f32: 83e9 srli a5,a5,0x1a + 80000f34: 4a79 li s4,30 + panic("walk"); + + for(int level = 2; level > 0; level--) { + 80000f36: 4b31 li s6,12 + if(va >= MAXVA) + 80000f38: 02b7fc63 bgeu a5,a1,80000f70 + panic("walk"); + 80000f3c: 00006517 auipc a0,0x6 + 80000f40: 17450513 addi a0,a0,372 # 800070b0 + 80000f44: 89dff0ef jal 800007e0 + pte_t *pte = &pagetable[PX(level, va)]; + if(*pte & PTE_V) { + pagetable = (pagetable_t)PTE2PA(*pte); + } else { + if(!alloc || (pagetable = (pde_t*)kalloc()) == 0) + 80000f48: 060a8263 beqz s5,80000fac + 80000f4c: bb3ff0ef jal 80000afe + 80000f50: 84aa mv s1,a0 + 80000f52: c139 beqz a0,80000f98 + return 0; + memset(pagetable, 0, PGSIZE); + 80000f54: 6605 lui a2,0x1 + 80000f56: 4581 li a1,0 + 80000f58: d4bff0ef jal 80000ca2 + *pte = PA2PTE(pagetable) | PTE_V; + 80000f5c: 00c4d793 srli a5,s1,0xc + 80000f60: 07aa slli a5,a5,0xa + 80000f62: 0017e793 ori a5,a5,1 + 80000f66: 00f93023 sd a5,0(s2) + for(int level = 2; level > 0; level--) { + 80000f6a: 3a5d addiw s4,s4,-9 # ffffffffffffeff7 + 80000f6c: 036a0063 beq s4,s6,80000f8c + pte_t *pte = &pagetable[PX(level, va)]; + 80000f70: 0149d933 srl s2,s3,s4 + 80000f74: 1ff97913 andi s2,s2,511 + 80000f78: 090e slli s2,s2,0x3 + 80000f7a: 9926 add s2,s2,s1 + if(*pte & PTE_V) { + 80000f7c: 00093483 ld s1,0(s2) + 80000f80: 0014f793 andi a5,s1,1 + 80000f84: d3f1 beqz a5,80000f48 + pagetable = (pagetable_t)PTE2PA(*pte); + 80000f86: 80a9 srli s1,s1,0xa + 80000f88: 04b2 slli s1,s1,0xc + 80000f8a: b7c5 j 80000f6a + } + } + return &pagetable[PX(0, va)]; + 80000f8c: 00c9d513 srli a0,s3,0xc + 80000f90: 1ff57513 andi a0,a0,511 + 80000f94: 050e slli a0,a0,0x3 + 80000f96: 9526 add a0,a0,s1 +} + 80000f98: 70e2 ld ra,56(sp) + 80000f9a: 7442 ld s0,48(sp) + 80000f9c: 74a2 ld s1,40(sp) + 80000f9e: 7902 ld s2,32(sp) + 80000fa0: 69e2 ld s3,24(sp) + 80000fa2: 6a42 ld s4,16(sp) + 80000fa4: 6aa2 ld s5,8(sp) + 80000fa6: 6b02 ld s6,0(sp) + 80000fa8: 6121 addi sp,sp,64 + 80000faa: 8082 ret + return 0; + 80000fac: 4501 li a0,0 + 80000fae: b7ed j 80000f98 + +0000000080000fb0 : +walkaddr(pagetable_t pagetable, uint64 va) +{ + pte_t *pte; + uint64 pa; + + if(va >= MAXVA) + 80000fb0: 57fd li a5,-1 + 80000fb2: 83e9 srli a5,a5,0x1a + 80000fb4: 00b7f463 bgeu a5,a1,80000fbc + return 0; + 80000fb8: 4501 li a0,0 + return 0; + if((*pte & PTE_U) == 0) + return 0; + pa = PTE2PA(*pte); + return pa; +} + 80000fba: 8082 ret +{ + 80000fbc: 1141 addi sp,sp,-16 + 80000fbe: e406 sd ra,8(sp) + 80000fc0: e022 sd s0,0(sp) + 80000fc2: 0800 addi s0,sp,16 + pte = walk(pagetable, va, 0); + 80000fc4: 4601 li a2,0 + 80000fc6: f51ff0ef jal 80000f16 + if(pte == 0) + 80000fca: c105 beqz a0,80000fea + if((*pte & PTE_V) == 0) + 80000fcc: 611c ld a5,0(a0) + if((*pte & PTE_U) == 0) + 80000fce: 0117f693 andi a3,a5,17 + 80000fd2: 4745 li a4,17 + return 0; + 80000fd4: 4501 li a0,0 + if((*pte & PTE_U) == 0) + 80000fd6: 00e68663 beq a3,a4,80000fe2 +} + 80000fda: 60a2 ld ra,8(sp) + 80000fdc: 6402 ld s0,0(sp) + 80000fde: 0141 addi sp,sp,16 + 80000fe0: 8082 ret + pa = PTE2PA(*pte); + 80000fe2: 83a9 srli a5,a5,0xa + 80000fe4: 00c79513 slli a0,a5,0xc + return pa; + 80000fe8: bfcd j 80000fda + return 0; + 80000fea: 4501 li a0,0 + 80000fec: b7fd j 80000fda + +0000000080000fee : +// va and size MUST be page-aligned. +// Returns 0 on success, -1 if walk() couldn't +// allocate a needed page-table page. +int +mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) +{ + 80000fee: 715d addi sp,sp,-80 + 80000ff0: e486 sd ra,72(sp) + 80000ff2: e0a2 sd s0,64(sp) + 80000ff4: fc26 sd s1,56(sp) + 80000ff6: f84a sd s2,48(sp) + 80000ff8: f44e sd s3,40(sp) + 80000ffa: f052 sd s4,32(sp) + 80000ffc: ec56 sd s5,24(sp) + 80000ffe: e85a sd s6,16(sp) + 80001000: e45e sd s7,8(sp) + 80001002: 0880 addi s0,sp,80 + uint64 a, last; + pte_t *pte; + + if((va % PGSIZE) != 0) + 80001004: 03459793 slli a5,a1,0x34 + 80001008: e7a9 bnez a5,80001052 + 8000100a: 8aaa mv s5,a0 + 8000100c: 8b3a mv s6,a4 + panic("mappages: va not aligned"); + + if((size % PGSIZE) != 0) + 8000100e: 03461793 slli a5,a2,0x34 + 80001012: e7b1 bnez a5,8000105e + panic("mappages: size not aligned"); + + if(size == 0) + 80001014: ca39 beqz a2,8000106a + panic("mappages: size"); + + a = va; + last = va + size - PGSIZE; + 80001016: 77fd lui a5,0xfffff + 80001018: 963e add a2,a2,a5 + 8000101a: 00b609b3 add s3,a2,a1 + a = va; + 8000101e: 892e mv s2,a1 + 80001020: 40b68a33 sub s4,a3,a1 + if(*pte & PTE_V) + panic("mappages: remap"); + *pte = PA2PTE(pa) | perm | PTE_V; + if(a == last) + break; + a += PGSIZE; + 80001024: 6b85 lui s7,0x1 + 80001026: 014904b3 add s1,s2,s4 + if((pte = walk(pagetable, a, 1)) == 0) + 8000102a: 4605 li a2,1 + 8000102c: 85ca mv a1,s2 + 8000102e: 8556 mv a0,s5 + 80001030: ee7ff0ef jal 80000f16 + 80001034: c539 beqz a0,80001082 + if(*pte & PTE_V) + 80001036: 611c ld a5,0(a0) + 80001038: 8b85 andi a5,a5,1 + 8000103a: ef95 bnez a5,80001076 + *pte = PA2PTE(pa) | perm | PTE_V; + 8000103c: 80b1 srli s1,s1,0xc + 8000103e: 04aa slli s1,s1,0xa + 80001040: 0164e4b3 or s1,s1,s6 + 80001044: 0014e493 ori s1,s1,1 + 80001048: e104 sd s1,0(a0) + if(a == last) + 8000104a: 05390863 beq s2,s3,8000109a + a += PGSIZE; + 8000104e: 995e add s2,s2,s7 + if((pte = walk(pagetable, a, 1)) == 0) + 80001050: bfd9 j 80001026 + panic("mappages: va not aligned"); + 80001052: 00006517 auipc a0,0x6 + 80001056: 06650513 addi a0,a0,102 # 800070b8 + 8000105a: f86ff0ef jal 800007e0 + panic("mappages: size not aligned"); + 8000105e: 00006517 auipc a0,0x6 + 80001062: 07a50513 addi a0,a0,122 # 800070d8 + 80001066: f7aff0ef jal 800007e0 + panic("mappages: size"); + 8000106a: 00006517 auipc a0,0x6 + 8000106e: 08e50513 addi a0,a0,142 # 800070f8 + 80001072: f6eff0ef jal 800007e0 + panic("mappages: remap"); + 80001076: 00006517 auipc a0,0x6 + 8000107a: 09250513 addi a0,a0,146 # 80007108 + 8000107e: f62ff0ef jal 800007e0 + return -1; + 80001082: 557d li a0,-1 + pa += PGSIZE; + } + return 0; +} + 80001084: 60a6 ld ra,72(sp) + 80001086: 6406 ld s0,64(sp) + 80001088: 74e2 ld s1,56(sp) + 8000108a: 7942 ld s2,48(sp) + 8000108c: 79a2 ld s3,40(sp) + 8000108e: 7a02 ld s4,32(sp) + 80001090: 6ae2 ld s5,24(sp) + 80001092: 6b42 ld s6,16(sp) + 80001094: 6ba2 ld s7,8(sp) + 80001096: 6161 addi sp,sp,80 + 80001098: 8082 ret + return 0; + 8000109a: 4501 li a0,0 + 8000109c: b7e5 j 80001084 + +000000008000109e : +{ + 8000109e: 1141 addi sp,sp,-16 + 800010a0: e406 sd ra,8(sp) + 800010a2: e022 sd s0,0(sp) + 800010a4: 0800 addi s0,sp,16 + 800010a6: 87b6 mv a5,a3 + if(mappages(kpgtbl, va, sz, pa, perm) != 0) + 800010a8: 86b2 mv a3,a2 + 800010aa: 863e mv a2,a5 + 800010ac: f43ff0ef jal 80000fee + 800010b0: e509 bnez a0,800010ba +} + 800010b2: 60a2 ld ra,8(sp) + 800010b4: 6402 ld s0,0(sp) + 800010b6: 0141 addi sp,sp,16 + 800010b8: 8082 ret + panic("kvmmap"); + 800010ba: 00006517 auipc a0,0x6 + 800010be: 05e50513 addi a0,a0,94 # 80007118 + 800010c2: f1eff0ef jal 800007e0 + +00000000800010c6 : +{ + 800010c6: 1101 addi sp,sp,-32 + 800010c8: ec06 sd ra,24(sp) + 800010ca: e822 sd s0,16(sp) + 800010cc: e426 sd s1,8(sp) + 800010ce: e04a sd s2,0(sp) + 800010d0: 1000 addi s0,sp,32 + kpgtbl = (pagetable_t) kalloc(); + 800010d2: a2dff0ef jal 80000afe + 800010d6: 84aa mv s1,a0 + memset(kpgtbl, 0, PGSIZE); + 800010d8: 6605 lui a2,0x1 + 800010da: 4581 li a1,0 + 800010dc: bc7ff0ef jal 80000ca2 + kvmmap(kpgtbl, UART0, UART0, PGSIZE, PTE_R | PTE_W); + 800010e0: 4719 li a4,6 + 800010e2: 6685 lui a3,0x1 + 800010e4: 10000637 lui a2,0x10000 + 800010e8: 100005b7 lui a1,0x10000 + 800010ec: 8526 mv a0,s1 + 800010ee: fb1ff0ef jal 8000109e + kvmmap(kpgtbl, VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W); + 800010f2: 4719 li a4,6 + 800010f4: 6685 lui a3,0x1 + 800010f6: 10001637 lui a2,0x10001 + 800010fa: 100015b7 lui a1,0x10001 + 800010fe: 8526 mv a0,s1 + 80001100: f9fff0ef jal 8000109e + kvmmap(kpgtbl, PLIC, PLIC, 0x4000000, PTE_R | PTE_W); + 80001104: 4719 li a4,6 + 80001106: 040006b7 lui a3,0x4000 + 8000110a: 0c000637 lui a2,0xc000 + 8000110e: 0c0005b7 lui a1,0xc000 + 80001112: 8526 mv a0,s1 + 80001114: f8bff0ef jal 8000109e + kvmmap(kpgtbl, KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X); + 80001118: 00006917 auipc s2,0x6 + 8000111c: ee890913 addi s2,s2,-280 # 80007000 + 80001120: 4729 li a4,10 + 80001122: 80006697 auipc a3,0x80006 + 80001126: ede68693 addi a3,a3,-290 # 7000 <_entry-0x7fff9000> + 8000112a: 4605 li a2,1 + 8000112c: 067e slli a2,a2,0x1f + 8000112e: 85b2 mv a1,a2 + 80001130: 8526 mv a0,s1 + 80001132: f6dff0ef jal 8000109e + kvmmap(kpgtbl, (uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W); + 80001136: 46c5 li a3,17 + 80001138: 06ee slli a3,a3,0x1b + 8000113a: 4719 li a4,6 + 8000113c: 412686b3 sub a3,a3,s2 + 80001140: 864a mv a2,s2 + 80001142: 85ca mv a1,s2 + 80001144: 8526 mv a0,s1 + 80001146: f59ff0ef jal 8000109e + kvmmap(kpgtbl, TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X); + 8000114a: 4729 li a4,10 + 8000114c: 6685 lui a3,0x1 + 8000114e: 00005617 auipc a2,0x5 + 80001152: eb260613 addi a2,a2,-334 # 80006000 <_trampoline> + 80001156: 040005b7 lui a1,0x4000 + 8000115a: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 8000115c: 05b2 slli a1,a1,0xc + 8000115e: 8526 mv a0,s1 + 80001160: f3fff0ef jal 8000109e + proc_mapstacks(kpgtbl); + 80001164: 8526 mv a0,s1 + 80001166: 5ee000ef jal 80001754 +} + 8000116a: 8526 mv a0,s1 + 8000116c: 60e2 ld ra,24(sp) + 8000116e: 6442 ld s0,16(sp) + 80001170: 64a2 ld s1,8(sp) + 80001172: 6902 ld s2,0(sp) + 80001174: 6105 addi sp,sp,32 + 80001176: 8082 ret + +0000000080001178 : +{ + 80001178: 1141 addi sp,sp,-16 + 8000117a: e406 sd ra,8(sp) + 8000117c: e022 sd s0,0(sp) + 8000117e: 0800 addi s0,sp,16 + kernel_pagetable = kvmmake(); + 80001180: f47ff0ef jal 800010c6 + 80001184: 00009797 auipc a5,0x9 + 80001188: 10a7b223 sd a0,260(a5) # 8000a288 +} + 8000118c: 60a2 ld ra,8(sp) + 8000118e: 6402 ld s0,0(sp) + 80001190: 0141 addi sp,sp,16 + 80001192: 8082 ret + +0000000080001194 : + +// create an empty user page table. +// returns 0 if out of memory. +pagetable_t +uvmcreate() +{ + 80001194: 1101 addi sp,sp,-32 + 80001196: ec06 sd ra,24(sp) + 80001198: e822 sd s0,16(sp) + 8000119a: e426 sd s1,8(sp) + 8000119c: 1000 addi s0,sp,32 + pagetable_t pagetable; + pagetable = (pagetable_t) kalloc(); + 8000119e: 961ff0ef jal 80000afe + 800011a2: 84aa mv s1,a0 + if(pagetable == 0) + 800011a4: c509 beqz a0,800011ae + return 0; + memset(pagetable, 0, PGSIZE); + 800011a6: 6605 lui a2,0x1 + 800011a8: 4581 li a1,0 + 800011aa: af9ff0ef jal 80000ca2 + return pagetable; +} + 800011ae: 8526 mv a0,s1 + 800011b0: 60e2 ld ra,24(sp) + 800011b2: 6442 ld s0,16(sp) + 800011b4: 64a2 ld s1,8(sp) + 800011b6: 6105 addi sp,sp,32 + 800011b8: 8082 ret + +00000000800011ba : +// Remove npages of mappings starting from va. va must be +// page-aligned. It's OK if the mappings don't exist. +// Optionally free the physical memory. +void +uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) +{ + 800011ba: 7139 addi sp,sp,-64 + 800011bc: fc06 sd ra,56(sp) + 800011be: f822 sd s0,48(sp) + 800011c0: 0080 addi s0,sp,64 + uint64 a; + pte_t *pte; + + if((va % PGSIZE) != 0) + 800011c2: 03459793 slli a5,a1,0x34 + 800011c6: e38d bnez a5,800011e8 + 800011c8: f04a sd s2,32(sp) + 800011ca: ec4e sd s3,24(sp) + 800011cc: e852 sd s4,16(sp) + 800011ce: e456 sd s5,8(sp) + 800011d0: e05a sd s6,0(sp) + 800011d2: 8a2a mv s4,a0 + 800011d4: 892e mv s2,a1 + 800011d6: 8ab6 mv s5,a3 + panic("uvmunmap: not aligned"); + + for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ + 800011d8: 0632 slli a2,a2,0xc + 800011da: 00b609b3 add s3,a2,a1 + 800011de: 6b05 lui s6,0x1 + 800011e0: 0535f963 bgeu a1,s3,80001232 + 800011e4: f426 sd s1,40(sp) + 800011e6: a015 j 8000120a + 800011e8: f426 sd s1,40(sp) + 800011ea: f04a sd s2,32(sp) + 800011ec: ec4e sd s3,24(sp) + 800011ee: e852 sd s4,16(sp) + 800011f0: e456 sd s5,8(sp) + 800011f2: e05a sd s6,0(sp) + panic("uvmunmap: not aligned"); + 800011f4: 00006517 auipc a0,0x6 + 800011f8: f2c50513 addi a0,a0,-212 # 80007120 + 800011fc: de4ff0ef jal 800007e0 + continue; + if(do_free){ + uint64 pa = PTE2PA(*pte); + kfree((void*)pa); + } + *pte = 0; + 80001200: 0004b023 sd zero,0(s1) + for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ + 80001204: 995a add s2,s2,s6 + 80001206: 03397563 bgeu s2,s3,80001230 + if((pte = walk(pagetable, a, 0)) == 0) // leaf page table entry allocated? + 8000120a: 4601 li a2,0 + 8000120c: 85ca mv a1,s2 + 8000120e: 8552 mv a0,s4 + 80001210: d07ff0ef jal 80000f16 + 80001214: 84aa mv s1,a0 + 80001216: d57d beqz a0,80001204 + if((*pte & PTE_V) == 0) // has physical page been allocated? + 80001218: 611c ld a5,0(a0) + 8000121a: 0017f713 andi a4,a5,1 + 8000121e: d37d beqz a4,80001204 + if(do_free){ + 80001220: fe0a80e3 beqz s5,80001200 + uint64 pa = PTE2PA(*pte); + 80001224: 83a9 srli a5,a5,0xa + kfree((void*)pa); + 80001226: 00c79513 slli a0,a5,0xc + 8000122a: ff2ff0ef jal 80000a1c + 8000122e: bfc9 j 80001200 + 80001230: 74a2 ld s1,40(sp) + 80001232: 7902 ld s2,32(sp) + 80001234: 69e2 ld s3,24(sp) + 80001236: 6a42 ld s4,16(sp) + 80001238: 6aa2 ld s5,8(sp) + 8000123a: 6b02 ld s6,0(sp) + } +} + 8000123c: 70e2 ld ra,56(sp) + 8000123e: 7442 ld s0,48(sp) + 80001240: 6121 addi sp,sp,64 + 80001242: 8082 ret + +0000000080001244 : +// newsz. oldsz and newsz need not be page-aligned, nor does newsz +// need to be less than oldsz. oldsz can be larger than the actual +// process size. Returns the new process size. +uint64 +uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) +{ + 80001244: 1101 addi sp,sp,-32 + 80001246: ec06 sd ra,24(sp) + 80001248: e822 sd s0,16(sp) + 8000124a: e426 sd s1,8(sp) + 8000124c: 1000 addi s0,sp,32 + if(newsz >= oldsz) + return oldsz; + 8000124e: 84ae mv s1,a1 + if(newsz >= oldsz) + 80001250: 00b67d63 bgeu a2,a1,8000126a + 80001254: 84b2 mv s1,a2 + + if(PGROUNDUP(newsz) < PGROUNDUP(oldsz)){ + 80001256: 6785 lui a5,0x1 + 80001258: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 8000125a: 00f60733 add a4,a2,a5 + 8000125e: 76fd lui a3,0xfffff + 80001260: 8f75 and a4,a4,a3 + 80001262: 97ae add a5,a5,a1 + 80001264: 8ff5 and a5,a5,a3 + 80001266: 00f76863 bltu a4,a5,80001276 + int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE; + uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1); + } + + return newsz; +} + 8000126a: 8526 mv a0,s1 + 8000126c: 60e2 ld ra,24(sp) + 8000126e: 6442 ld s0,16(sp) + 80001270: 64a2 ld s1,8(sp) + 80001272: 6105 addi sp,sp,32 + 80001274: 8082 ret + int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE; + 80001276: 8f99 sub a5,a5,a4 + 80001278: 83b1 srli a5,a5,0xc + uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1); + 8000127a: 4685 li a3,1 + 8000127c: 0007861b sext.w a2,a5 + 80001280: 85ba mv a1,a4 + 80001282: f39ff0ef jal 800011ba + 80001286: b7d5 j 8000126a + +0000000080001288 : + if(newsz < oldsz) + 80001288: 08b66f63 bltu a2,a1,80001326 +{ + 8000128c: 7139 addi sp,sp,-64 + 8000128e: fc06 sd ra,56(sp) + 80001290: f822 sd s0,48(sp) + 80001292: ec4e sd s3,24(sp) + 80001294: e852 sd s4,16(sp) + 80001296: e456 sd s5,8(sp) + 80001298: 0080 addi s0,sp,64 + 8000129a: 8aaa mv s5,a0 + 8000129c: 8a32 mv s4,a2 + oldsz = PGROUNDUP(oldsz); + 8000129e: 6785 lui a5,0x1 + 800012a0: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 800012a2: 95be add a1,a1,a5 + 800012a4: 77fd lui a5,0xfffff + 800012a6: 00f5f9b3 and s3,a1,a5 + for(a = oldsz; a < newsz; a += PGSIZE){ + 800012aa: 08c9f063 bgeu s3,a2,8000132a + 800012ae: f426 sd s1,40(sp) + 800012b0: f04a sd s2,32(sp) + 800012b2: e05a sd s6,0(sp) + 800012b4: 894e mv s2,s3 + if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){ + 800012b6: 0126eb13 ori s6,a3,18 + mem = kalloc(); + 800012ba: 845ff0ef jal 80000afe + 800012be: 84aa mv s1,a0 + if(mem == 0){ + 800012c0: c515 beqz a0,800012ec + memset(mem, 0, PGSIZE); + 800012c2: 6605 lui a2,0x1 + 800012c4: 4581 li a1,0 + 800012c6: 9ddff0ef jal 80000ca2 + if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){ + 800012ca: 875a mv a4,s6 + 800012cc: 86a6 mv a3,s1 + 800012ce: 6605 lui a2,0x1 + 800012d0: 85ca mv a1,s2 + 800012d2: 8556 mv a0,s5 + 800012d4: d1bff0ef jal 80000fee + 800012d8: e915 bnez a0,8000130c + for(a = oldsz; a < newsz; a += PGSIZE){ + 800012da: 6785 lui a5,0x1 + 800012dc: 993e add s2,s2,a5 + 800012de: fd496ee3 bltu s2,s4,800012ba + return newsz; + 800012e2: 8552 mv a0,s4 + 800012e4: 74a2 ld s1,40(sp) + 800012e6: 7902 ld s2,32(sp) + 800012e8: 6b02 ld s6,0(sp) + 800012ea: a811 j 800012fe + uvmdealloc(pagetable, a, oldsz); + 800012ec: 864e mv a2,s3 + 800012ee: 85ca mv a1,s2 + 800012f0: 8556 mv a0,s5 + 800012f2: f53ff0ef jal 80001244 + return 0; + 800012f6: 4501 li a0,0 + 800012f8: 74a2 ld s1,40(sp) + 800012fa: 7902 ld s2,32(sp) + 800012fc: 6b02 ld s6,0(sp) +} + 800012fe: 70e2 ld ra,56(sp) + 80001300: 7442 ld s0,48(sp) + 80001302: 69e2 ld s3,24(sp) + 80001304: 6a42 ld s4,16(sp) + 80001306: 6aa2 ld s5,8(sp) + 80001308: 6121 addi sp,sp,64 + 8000130a: 8082 ret + kfree(mem); + 8000130c: 8526 mv a0,s1 + 8000130e: f0eff0ef jal 80000a1c + uvmdealloc(pagetable, a, oldsz); + 80001312: 864e mv a2,s3 + 80001314: 85ca mv a1,s2 + 80001316: 8556 mv a0,s5 + 80001318: f2dff0ef jal 80001244 + return 0; + 8000131c: 4501 li a0,0 + 8000131e: 74a2 ld s1,40(sp) + 80001320: 7902 ld s2,32(sp) + 80001322: 6b02 ld s6,0(sp) + 80001324: bfe9 j 800012fe + return oldsz; + 80001326: 852e mv a0,a1 +} + 80001328: 8082 ret + return newsz; + 8000132a: 8532 mv a0,a2 + 8000132c: bfc9 j 800012fe + +000000008000132e : + +// Recursively free page-table pages. +// All leaf mappings must already have been removed. +void +freewalk(pagetable_t pagetable) +{ + 8000132e: 7179 addi sp,sp,-48 + 80001330: f406 sd ra,40(sp) + 80001332: f022 sd s0,32(sp) + 80001334: ec26 sd s1,24(sp) + 80001336: e84a sd s2,16(sp) + 80001338: e44e sd s3,8(sp) + 8000133a: e052 sd s4,0(sp) + 8000133c: 1800 addi s0,sp,48 + 8000133e: 8a2a mv s4,a0 + // there are 2^9 = 512 PTEs in a page table. + for(int i = 0; i < 512; i++){ + 80001340: 84aa mv s1,a0 + 80001342: 6905 lui s2,0x1 + 80001344: 992a add s2,s2,a0 + pte_t pte = pagetable[i]; + if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ + 80001346: 4985 li s3,1 + 80001348: a819 j 8000135e + // this PTE points to a lower-level page table. + uint64 child = PTE2PA(pte); + 8000134a: 83a9 srli a5,a5,0xa + freewalk((pagetable_t)child); + 8000134c: 00c79513 slli a0,a5,0xc + 80001350: fdfff0ef jal 8000132e + pagetable[i] = 0; + 80001354: 0004b023 sd zero,0(s1) + for(int i = 0; i < 512; i++){ + 80001358: 04a1 addi s1,s1,8 + 8000135a: 01248f63 beq s1,s2,80001378 + pte_t pte = pagetable[i]; + 8000135e: 609c ld a5,0(s1) + if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ + 80001360: 00f7f713 andi a4,a5,15 + 80001364: ff3703e3 beq a4,s3,8000134a + } else if(pte & PTE_V){ + 80001368: 8b85 andi a5,a5,1 + 8000136a: d7fd beqz a5,80001358 + panic("freewalk: leaf"); + 8000136c: 00006517 auipc a0,0x6 + 80001370: dcc50513 addi a0,a0,-564 # 80007138 + 80001374: c6cff0ef jal 800007e0 + } + } + kfree((void*)pagetable); + 80001378: 8552 mv a0,s4 + 8000137a: ea2ff0ef jal 80000a1c +} + 8000137e: 70a2 ld ra,40(sp) + 80001380: 7402 ld s0,32(sp) + 80001382: 64e2 ld s1,24(sp) + 80001384: 6942 ld s2,16(sp) + 80001386: 69a2 ld s3,8(sp) + 80001388: 6a02 ld s4,0(sp) + 8000138a: 6145 addi sp,sp,48 + 8000138c: 8082 ret + +000000008000138e : + +// Free user memory pages, +// then free page-table pages. +void +uvmfree(pagetable_t pagetable, uint64 sz) +{ + 8000138e: 1101 addi sp,sp,-32 + 80001390: ec06 sd ra,24(sp) + 80001392: e822 sd s0,16(sp) + 80001394: e426 sd s1,8(sp) + 80001396: 1000 addi s0,sp,32 + 80001398: 84aa mv s1,a0 + if(sz > 0) + 8000139a: e989 bnez a1,800013ac + uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1); + freewalk(pagetable); + 8000139c: 8526 mv a0,s1 + 8000139e: f91ff0ef jal 8000132e +} + 800013a2: 60e2 ld ra,24(sp) + 800013a4: 6442 ld s0,16(sp) + 800013a6: 64a2 ld s1,8(sp) + 800013a8: 6105 addi sp,sp,32 + 800013aa: 8082 ret + uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1); + 800013ac: 6785 lui a5,0x1 + 800013ae: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 800013b0: 95be add a1,a1,a5 + 800013b2: 4685 li a3,1 + 800013b4: 00c5d613 srli a2,a1,0xc + 800013b8: 4581 li a1,0 + 800013ba: e01ff0ef jal 800011ba + 800013be: bff9 j 8000139c + +00000000800013c0 : + pte_t *pte; + uint64 pa, i; + uint flags; + char *mem; + + for(i = 0; i < sz; i += PGSIZE){ + 800013c0: ce49 beqz a2,8000145a +{ + 800013c2: 715d addi sp,sp,-80 + 800013c4: e486 sd ra,72(sp) + 800013c6: e0a2 sd s0,64(sp) + 800013c8: fc26 sd s1,56(sp) + 800013ca: f84a sd s2,48(sp) + 800013cc: f44e sd s3,40(sp) + 800013ce: f052 sd s4,32(sp) + 800013d0: ec56 sd s5,24(sp) + 800013d2: e85a sd s6,16(sp) + 800013d4: e45e sd s7,8(sp) + 800013d6: 0880 addi s0,sp,80 + 800013d8: 8aaa mv s5,a0 + 800013da: 8b2e mv s6,a1 + 800013dc: 8a32 mv s4,a2 + for(i = 0; i < sz; i += PGSIZE){ + 800013de: 4481 li s1,0 + 800013e0: a029 j 800013ea + 800013e2: 6785 lui a5,0x1 + 800013e4: 94be add s1,s1,a5 + 800013e6: 0544fe63 bgeu s1,s4,80001442 + if((pte = walk(old, i, 0)) == 0) + 800013ea: 4601 li a2,0 + 800013ec: 85a6 mv a1,s1 + 800013ee: 8556 mv a0,s5 + 800013f0: b27ff0ef jal 80000f16 + 800013f4: d57d beqz a0,800013e2 + continue; // page table entry hasn't been allocated + if((*pte & PTE_V) == 0) + 800013f6: 6118 ld a4,0(a0) + 800013f8: 00177793 andi a5,a4,1 + 800013fc: d3fd beqz a5,800013e2 + continue; // physical page hasn't been allocated + pa = PTE2PA(*pte); + 800013fe: 00a75593 srli a1,a4,0xa + 80001402: 00c59b93 slli s7,a1,0xc + flags = PTE_FLAGS(*pte); + 80001406: 3ff77913 andi s2,a4,1023 + if((mem = kalloc()) == 0) + 8000140a: ef4ff0ef jal 80000afe + 8000140e: 89aa mv s3,a0 + 80001410: c105 beqz a0,80001430 + goto err; + memmove(mem, (char*)pa, PGSIZE); + 80001412: 6605 lui a2,0x1 + 80001414: 85de mv a1,s7 + 80001416: 8e9ff0ef jal 80000cfe + if(mappages(new, i, PGSIZE, (uint64)mem, flags) != 0){ + 8000141a: 874a mv a4,s2 + 8000141c: 86ce mv a3,s3 + 8000141e: 6605 lui a2,0x1 + 80001420: 85a6 mv a1,s1 + 80001422: 855a mv a0,s6 + 80001424: bcbff0ef jal 80000fee + 80001428: dd4d beqz a0,800013e2 + kfree(mem); + 8000142a: 854e mv a0,s3 + 8000142c: df0ff0ef jal 80000a1c + } + } + return 0; + + err: + uvmunmap(new, 0, i / PGSIZE, 1); + 80001430: 4685 li a3,1 + 80001432: 00c4d613 srli a2,s1,0xc + 80001436: 4581 li a1,0 + 80001438: 855a mv a0,s6 + 8000143a: d81ff0ef jal 800011ba + return -1; + 8000143e: 557d li a0,-1 + 80001440: a011 j 80001444 + return 0; + 80001442: 4501 li a0,0 +} + 80001444: 60a6 ld ra,72(sp) + 80001446: 6406 ld s0,64(sp) + 80001448: 74e2 ld s1,56(sp) + 8000144a: 7942 ld s2,48(sp) + 8000144c: 79a2 ld s3,40(sp) + 8000144e: 7a02 ld s4,32(sp) + 80001450: 6ae2 ld s5,24(sp) + 80001452: 6b42 ld s6,16(sp) + 80001454: 6ba2 ld s7,8(sp) + 80001456: 6161 addi sp,sp,80 + 80001458: 8082 ret + return 0; + 8000145a: 4501 li a0,0 +} + 8000145c: 8082 ret + +000000008000145e : + +// mark a PTE invalid for user access. +// used by exec for the user stack guard page. +void +uvmclear(pagetable_t pagetable, uint64 va) +{ + 8000145e: 1141 addi sp,sp,-16 + 80001460: e406 sd ra,8(sp) + 80001462: e022 sd s0,0(sp) + 80001464: 0800 addi s0,sp,16 + pte_t *pte; + + pte = walk(pagetable, va, 0); + 80001466: 4601 li a2,0 + 80001468: aafff0ef jal 80000f16 + if(pte == 0) + 8000146c: c901 beqz a0,8000147c + panic("uvmclear"); + *pte &= ~PTE_U; + 8000146e: 611c ld a5,0(a0) + 80001470: 9bbd andi a5,a5,-17 + 80001472: e11c sd a5,0(a0) +} + 80001474: 60a2 ld ra,8(sp) + 80001476: 6402 ld s0,0(sp) + 80001478: 0141 addi sp,sp,16 + 8000147a: 8082 ret + panic("uvmclear"); + 8000147c: 00006517 auipc a0,0x6 + 80001480: ccc50513 addi a0,a0,-820 # 80007148 + 80001484: b5cff0ef jal 800007e0 + +0000000080001488 : +copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) +{ + uint64 n, va0, pa0; + int got_null = 0; + + while(got_null == 0 && max > 0){ + 80001488: c6dd beqz a3,80001536 +{ + 8000148a: 715d addi sp,sp,-80 + 8000148c: e486 sd ra,72(sp) + 8000148e: e0a2 sd s0,64(sp) + 80001490: fc26 sd s1,56(sp) + 80001492: f84a sd s2,48(sp) + 80001494: f44e sd s3,40(sp) + 80001496: f052 sd s4,32(sp) + 80001498: ec56 sd s5,24(sp) + 8000149a: e85a sd s6,16(sp) + 8000149c: e45e sd s7,8(sp) + 8000149e: 0880 addi s0,sp,80 + 800014a0: 8a2a mv s4,a0 + 800014a2: 8b2e mv s6,a1 + 800014a4: 8bb2 mv s7,a2 + 800014a6: 8936 mv s2,a3 + va0 = PGROUNDDOWN(srcva); + 800014a8: 7afd lui s5,0xfffff + pa0 = walkaddr(pagetable, va0); + if(pa0 == 0) + return -1; + n = PGSIZE - (srcva - va0); + 800014aa: 6985 lui s3,0x1 + 800014ac: a825 j 800014e4 + n = max; + + char *p = (char *) (pa0 + (srcva - va0)); + while(n > 0){ + if(*p == '\0'){ + *dst = '\0'; + 800014ae: 00078023 sb zero,0(a5) # 1000 <_entry-0x7ffff000> + 800014b2: 4785 li a5,1 + dst++; + } + + srcva = va0 + PGSIZE; + } + if(got_null){ + 800014b4: 37fd addiw a5,a5,-1 + 800014b6: 0007851b sext.w a0,a5 + return 0; + } else { + return -1; + } +} + 800014ba: 60a6 ld ra,72(sp) + 800014bc: 6406 ld s0,64(sp) + 800014be: 74e2 ld s1,56(sp) + 800014c0: 7942 ld s2,48(sp) + 800014c2: 79a2 ld s3,40(sp) + 800014c4: 7a02 ld s4,32(sp) + 800014c6: 6ae2 ld s5,24(sp) + 800014c8: 6b42 ld s6,16(sp) + 800014ca: 6ba2 ld s7,8(sp) + 800014cc: 6161 addi sp,sp,80 + 800014ce: 8082 ret + 800014d0: fff90713 addi a4,s2,-1 # fff <_entry-0x7ffff001> + 800014d4: 9742 add a4,a4,a6 + --max; + 800014d6: 40b70933 sub s2,a4,a1 + srcva = va0 + PGSIZE; + 800014da: 01348bb3 add s7,s1,s3 + while(got_null == 0 && max > 0){ + 800014de: 04e58463 beq a1,a4,80001526 +{ + 800014e2: 8b3e mv s6,a5 + va0 = PGROUNDDOWN(srcva); + 800014e4: 015bf4b3 and s1,s7,s5 + pa0 = walkaddr(pagetable, va0); + 800014e8: 85a6 mv a1,s1 + 800014ea: 8552 mv a0,s4 + 800014ec: ac5ff0ef jal 80000fb0 + if(pa0 == 0) + 800014f0: cd0d beqz a0,8000152a + n = PGSIZE - (srcva - va0); + 800014f2: 417486b3 sub a3,s1,s7 + 800014f6: 96ce add a3,a3,s3 + if(n > max) + 800014f8: 00d97363 bgeu s2,a3,800014fe + 800014fc: 86ca mv a3,s2 + char *p = (char *) (pa0 + (srcva - va0)); + 800014fe: 955e add a0,a0,s7 + 80001500: 8d05 sub a0,a0,s1 + while(n > 0){ + 80001502: c695 beqz a3,8000152e + 80001504: 87da mv a5,s6 + 80001506: 885a mv a6,s6 + if(*p == '\0'){ + 80001508: 41650633 sub a2,a0,s6 + while(n > 0){ + 8000150c: 96da add a3,a3,s6 + 8000150e: 85be mv a1,a5 + if(*p == '\0'){ + 80001510: 00f60733 add a4,a2,a5 + 80001514: 00074703 lbu a4,0(a4) + 80001518: db59 beqz a4,800014ae + *dst = *p; + 8000151a: 00e78023 sb a4,0(a5) + dst++; + 8000151e: 0785 addi a5,a5,1 + while(n > 0){ + 80001520: fed797e3 bne a5,a3,8000150e + 80001524: b775 j 800014d0 + 80001526: 4781 li a5,0 + 80001528: b771 j 800014b4 + return -1; + 8000152a: 557d li a0,-1 + 8000152c: b779 j 800014ba + srcva = va0 + PGSIZE; + 8000152e: 6b85 lui s7,0x1 + 80001530: 9ba6 add s7,s7,s1 + 80001532: 87da mv a5,s6 + 80001534: b77d j 800014e2 + int got_null = 0; + 80001536: 4781 li a5,0 + if(got_null){ + 80001538: 37fd addiw a5,a5,-1 + 8000153a: 0007851b sext.w a0,a5 +} + 8000153e: 8082 ret + +0000000080001540 : + return mem; +} + +int +ismapped(pagetable_t pagetable, uint64 va) +{ + 80001540: 1141 addi sp,sp,-16 + 80001542: e406 sd ra,8(sp) + 80001544: e022 sd s0,0(sp) + 80001546: 0800 addi s0,sp,16 + pte_t *pte = walk(pagetable, va, 0); + 80001548: 4601 li a2,0 + 8000154a: 9cdff0ef jal 80000f16 + if (pte == 0) { + 8000154e: c519 beqz a0,8000155c + return 0; + } + if (*pte & PTE_V){ + 80001550: 6108 ld a0,0(a0) + 80001552: 8905 andi a0,a0,1 + return 1; + } + return 0; +} + 80001554: 60a2 ld ra,8(sp) + 80001556: 6402 ld s0,0(sp) + 80001558: 0141 addi sp,sp,16 + 8000155a: 8082 ret + return 0; + 8000155c: 4501 li a0,0 + 8000155e: bfdd j 80001554 + +0000000080001560 : +{ + 80001560: 7179 addi sp,sp,-48 + 80001562: f406 sd ra,40(sp) + 80001564: f022 sd s0,32(sp) + 80001566: ec26 sd s1,24(sp) + 80001568: e44e sd s3,8(sp) + 8000156a: 1800 addi s0,sp,48 + 8000156c: 89aa mv s3,a0 + 8000156e: 84ae mv s1,a1 + struct proc *p = myproc(); + 80001570: 35e000ef jal 800018ce + if (va >= p->sz) + 80001574: 653c ld a5,72(a0) + 80001576: 00f4ea63 bltu s1,a5,8000158a + return 0; + 8000157a: 4981 li s3,0 +} + 8000157c: 854e mv a0,s3 + 8000157e: 70a2 ld ra,40(sp) + 80001580: 7402 ld s0,32(sp) + 80001582: 64e2 ld s1,24(sp) + 80001584: 69a2 ld s3,8(sp) + 80001586: 6145 addi sp,sp,48 + 80001588: 8082 ret + 8000158a: e84a sd s2,16(sp) + 8000158c: 892a mv s2,a0 + va = PGROUNDDOWN(va); + 8000158e: 77fd lui a5,0xfffff + 80001590: 8cfd and s1,s1,a5 + if(ismapped(pagetable, va)) { + 80001592: 85a6 mv a1,s1 + 80001594: 854e mv a0,s3 + 80001596: fabff0ef jal 80001540 + return 0; + 8000159a: 4981 li s3,0 + if(ismapped(pagetable, va)) { + 8000159c: c119 beqz a0,800015a2 + 8000159e: 6942 ld s2,16(sp) + 800015a0: bff1 j 8000157c + 800015a2: e052 sd s4,0(sp) + mem = (uint64) kalloc(); + 800015a4: d5aff0ef jal 80000afe + 800015a8: 8a2a mv s4,a0 + if(mem == 0) + 800015aa: c90d beqz a0,800015dc + mem = (uint64) kalloc(); + 800015ac: 89aa mv s3,a0 + memset((void *) mem, 0, PGSIZE); + 800015ae: 6605 lui a2,0x1 + 800015b0: 4581 li a1,0 + 800015b2: ef0ff0ef jal 80000ca2 + if (mappages(p->pagetable, va, PGSIZE, mem, PTE_W|PTE_U|PTE_R) != 0) { + 800015b6: 4759 li a4,22 + 800015b8: 86d2 mv a3,s4 + 800015ba: 6605 lui a2,0x1 + 800015bc: 85a6 mv a1,s1 + 800015be: 05093503 ld a0,80(s2) + 800015c2: a2dff0ef jal 80000fee + 800015c6: e501 bnez a0,800015ce + 800015c8: 6942 ld s2,16(sp) + 800015ca: 6a02 ld s4,0(sp) + 800015cc: bf45 j 8000157c + kfree((void *)mem); + 800015ce: 8552 mv a0,s4 + 800015d0: c4cff0ef jal 80000a1c + return 0; + 800015d4: 4981 li s3,0 + 800015d6: 6942 ld s2,16(sp) + 800015d8: 6a02 ld s4,0(sp) + 800015da: b74d j 8000157c + 800015dc: 6942 ld s2,16(sp) + 800015de: 6a02 ld s4,0(sp) + 800015e0: bf71 j 8000157c + +00000000800015e2 : + while(len > 0){ + 800015e2: c2cd beqz a3,80001684 +{ + 800015e4: 711d addi sp,sp,-96 + 800015e6: ec86 sd ra,88(sp) + 800015e8: e8a2 sd s0,80(sp) + 800015ea: e4a6 sd s1,72(sp) + 800015ec: f852 sd s4,48(sp) + 800015ee: f05a sd s6,32(sp) + 800015f0: ec5e sd s7,24(sp) + 800015f2: e862 sd s8,16(sp) + 800015f4: 1080 addi s0,sp,96 + 800015f6: 8c2a mv s8,a0 + 800015f8: 8b2e mv s6,a1 + 800015fa: 8bb2 mv s7,a2 + 800015fc: 8a36 mv s4,a3 + va0 = PGROUNDDOWN(dstva); + 800015fe: 74fd lui s1,0xfffff + 80001600: 8ced and s1,s1,a1 + if(va0 >= MAXVA) + 80001602: 57fd li a5,-1 + 80001604: 83e9 srli a5,a5,0x1a + 80001606: 0897e163 bltu a5,s1,80001688 + 8000160a: e0ca sd s2,64(sp) + 8000160c: fc4e sd s3,56(sp) + 8000160e: f456 sd s5,40(sp) + 80001610: e466 sd s9,8(sp) + 80001612: e06a sd s10,0(sp) + 80001614: 6d05 lui s10,0x1 + 80001616: 8cbe mv s9,a5 + 80001618: a015 j 8000163c + memmove((void *)(pa0 + (dstva - va0)), src, n); + 8000161a: 409b0533 sub a0,s6,s1 + 8000161e: 0009861b sext.w a2,s3 + 80001622: 85de mv a1,s7 + 80001624: 954a add a0,a0,s2 + 80001626: ed8ff0ef jal 80000cfe + len -= n; + 8000162a: 413a0a33 sub s4,s4,s3 + src += n; + 8000162e: 9bce add s7,s7,s3 + while(len > 0){ + 80001630: 040a0363 beqz s4,80001676 + if(va0 >= MAXVA) + 80001634: 055cec63 bltu s9,s5,8000168c + 80001638: 84d6 mv s1,s5 + 8000163a: 8b56 mv s6,s5 + pa0 = walkaddr(pagetable, va0); + 8000163c: 85a6 mv a1,s1 + 8000163e: 8562 mv a0,s8 + 80001640: 971ff0ef jal 80000fb0 + 80001644: 892a mv s2,a0 + if(pa0 == 0) { + 80001646: e901 bnez a0,80001656 + if((pa0 = vmfault(pagetable, va0, 0)) == 0) { + 80001648: 4601 li a2,0 + 8000164a: 85a6 mv a1,s1 + 8000164c: 8562 mv a0,s8 + 8000164e: f13ff0ef jal 80001560 + 80001652: 892a mv s2,a0 + 80001654: c139 beqz a0,8000169a + pte = walk(pagetable, va0, 0); + 80001656: 4601 li a2,0 + 80001658: 85a6 mv a1,s1 + 8000165a: 8562 mv a0,s8 + 8000165c: 8bbff0ef jal 80000f16 + if((*pte & PTE_W) == 0) + 80001660: 611c ld a5,0(a0) + 80001662: 8b91 andi a5,a5,4 + 80001664: c3b1 beqz a5,800016a8 + n = PGSIZE - (dstva - va0); + 80001666: 01a48ab3 add s5,s1,s10 + 8000166a: 416a89b3 sub s3,s5,s6 + if(n > len) + 8000166e: fb3a76e3 bgeu s4,s3,8000161a + 80001672: 89d2 mv s3,s4 + 80001674: b75d j 8000161a + return 0; + 80001676: 4501 li a0,0 + 80001678: 6906 ld s2,64(sp) + 8000167a: 79e2 ld s3,56(sp) + 8000167c: 7aa2 ld s5,40(sp) + 8000167e: 6ca2 ld s9,8(sp) + 80001680: 6d02 ld s10,0(sp) + 80001682: a80d j 800016b4 + 80001684: 4501 li a0,0 +} + 80001686: 8082 ret + return -1; + 80001688: 557d li a0,-1 + 8000168a: a02d j 800016b4 + 8000168c: 557d li a0,-1 + 8000168e: 6906 ld s2,64(sp) + 80001690: 79e2 ld s3,56(sp) + 80001692: 7aa2 ld s5,40(sp) + 80001694: 6ca2 ld s9,8(sp) + 80001696: 6d02 ld s10,0(sp) + 80001698: a831 j 800016b4 + return -1; + 8000169a: 557d li a0,-1 + 8000169c: 6906 ld s2,64(sp) + 8000169e: 79e2 ld s3,56(sp) + 800016a0: 7aa2 ld s5,40(sp) + 800016a2: 6ca2 ld s9,8(sp) + 800016a4: 6d02 ld s10,0(sp) + 800016a6: a039 j 800016b4 + return -1; + 800016a8: 557d li a0,-1 + 800016aa: 6906 ld s2,64(sp) + 800016ac: 79e2 ld s3,56(sp) + 800016ae: 7aa2 ld s5,40(sp) + 800016b0: 6ca2 ld s9,8(sp) + 800016b2: 6d02 ld s10,0(sp) +} + 800016b4: 60e6 ld ra,88(sp) + 800016b6: 6446 ld s0,80(sp) + 800016b8: 64a6 ld s1,72(sp) + 800016ba: 7a42 ld s4,48(sp) + 800016bc: 7b02 ld s6,32(sp) + 800016be: 6be2 ld s7,24(sp) + 800016c0: 6c42 ld s8,16(sp) + 800016c2: 6125 addi sp,sp,96 + 800016c4: 8082 ret + +00000000800016c6 : + while(len > 0){ + 800016c6: c6c9 beqz a3,80001750 +{ + 800016c8: 715d addi sp,sp,-80 + 800016ca: e486 sd ra,72(sp) + 800016cc: e0a2 sd s0,64(sp) + 800016ce: fc26 sd s1,56(sp) + 800016d0: f84a sd s2,48(sp) + 800016d2: f44e sd s3,40(sp) + 800016d4: f052 sd s4,32(sp) + 800016d6: ec56 sd s5,24(sp) + 800016d8: e85a sd s6,16(sp) + 800016da: e45e sd s7,8(sp) + 800016dc: e062 sd s8,0(sp) + 800016de: 0880 addi s0,sp,80 + 800016e0: 8baa mv s7,a0 + 800016e2: 8aae mv s5,a1 + 800016e4: 8932 mv s2,a2 + 800016e6: 8a36 mv s4,a3 + va0 = PGROUNDDOWN(srcva); + 800016e8: 7c7d lui s8,0xfffff + n = PGSIZE - (srcva - va0); + 800016ea: 6b05 lui s6,0x1 + 800016ec: a035 j 80001718 + 800016ee: 412984b3 sub s1,s3,s2 + 800016f2: 94da add s1,s1,s6 + if(n > len) + 800016f4: 009a7363 bgeu s4,s1,800016fa + 800016f8: 84d2 mv s1,s4 + memmove(dst, (void *)(pa0 + (srcva - va0)), n); + 800016fa: 413905b3 sub a1,s2,s3 + 800016fe: 0004861b sext.w a2,s1 + 80001702: 95aa add a1,a1,a0 + 80001704: 8556 mv a0,s5 + 80001706: df8ff0ef jal 80000cfe + len -= n; + 8000170a: 409a0a33 sub s4,s4,s1 + dst += n; + 8000170e: 9aa6 add s5,s5,s1 + srcva = va0 + PGSIZE; + 80001710: 01698933 add s2,s3,s6 + while(len > 0){ + 80001714: 020a0163 beqz s4,80001736 + va0 = PGROUNDDOWN(srcva); + 80001718: 018979b3 and s3,s2,s8 + pa0 = walkaddr(pagetable, va0); + 8000171c: 85ce mv a1,s3 + 8000171e: 855e mv a0,s7 + 80001720: 891ff0ef jal 80000fb0 + if(pa0 == 0) { + 80001724: f569 bnez a0,800016ee + if((pa0 = vmfault(pagetable, va0, 0)) == 0) { + 80001726: 4601 li a2,0 + 80001728: 85ce mv a1,s3 + 8000172a: 855e mv a0,s7 + 8000172c: e35ff0ef jal 80001560 + 80001730: fd5d bnez a0,800016ee + return -1; + 80001732: 557d li a0,-1 + 80001734: a011 j 80001738 + return 0; + 80001736: 4501 li a0,0 +} + 80001738: 60a6 ld ra,72(sp) + 8000173a: 6406 ld s0,64(sp) + 8000173c: 74e2 ld s1,56(sp) + 8000173e: 7942 ld s2,48(sp) + 80001740: 79a2 ld s3,40(sp) + 80001742: 7a02 ld s4,32(sp) + 80001744: 6ae2 ld s5,24(sp) + 80001746: 6b42 ld s6,16(sp) + 80001748: 6ba2 ld s7,8(sp) + 8000174a: 6c02 ld s8,0(sp) + 8000174c: 6161 addi sp,sp,80 + 8000174e: 8082 ret + return 0; + 80001750: 4501 li a0,0 +} + 80001752: 8082 ret + +0000000080001754 : +// Allocate a page for each process's kernel stack. +// Map it high in memory, followed by an invalid +// guard page. +void +proc_mapstacks(pagetable_t kpgtbl) +{ + 80001754: 7139 addi sp,sp,-64 + 80001756: fc06 sd ra,56(sp) + 80001758: f822 sd s0,48(sp) + 8000175a: f426 sd s1,40(sp) + 8000175c: f04a sd s2,32(sp) + 8000175e: ec4e sd s3,24(sp) + 80001760: e852 sd s4,16(sp) + 80001762: e456 sd s5,8(sp) + 80001764: e05a sd s6,0(sp) + 80001766: 0080 addi s0,sp,64 + 80001768: 8a2a mv s4,a0 + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + 8000176a: 00011497 auipc s1,0x11 + 8000176e: 05e48493 addi s1,s1,94 # 800127c8 + char *pa = kalloc(); + if(pa == 0) + panic("kalloc"); + uint64 va = KSTACK((int) (p - proc)); + 80001772: 8b26 mv s6,s1 + 80001774: 04fa5937 lui s2,0x4fa5 + 80001778: fa590913 addi s2,s2,-91 # 4fa4fa5 <_entry-0x7b05b05b> + 8000177c: 0932 slli s2,s2,0xc + 8000177e: fa590913 addi s2,s2,-91 + 80001782: 0932 slli s2,s2,0xc + 80001784: fa590913 addi s2,s2,-91 + 80001788: 0932 slli s2,s2,0xc + 8000178a: fa590913 addi s2,s2,-91 + 8000178e: 040009b7 lui s3,0x4000 + 80001792: 19fd addi s3,s3,-1 # 3ffffff <_entry-0x7c000001> + 80001794: 09b2 slli s3,s3,0xc + for(p = proc; p < &proc[NPROC]; p++) { + 80001796: 00017a97 auipc s5,0x17 + 8000179a: a32a8a93 addi s5,s5,-1486 # 800181c8 + char *pa = kalloc(); + 8000179e: b60ff0ef jal 80000afe + 800017a2: 862a mv a2,a0 + if(pa == 0) + 800017a4: cd15 beqz a0,800017e0 + uint64 va = KSTACK((int) (p - proc)); + 800017a6: 416485b3 sub a1,s1,s6 + 800017aa: 858d srai a1,a1,0x3 + 800017ac: 032585b3 mul a1,a1,s2 + 800017b0: 2585 addiw a1,a1,1 + 800017b2: 00d5959b slliw a1,a1,0xd + kvmmap(kpgtbl, va, (uint64)pa, PGSIZE, PTE_R | PTE_W); + 800017b6: 4719 li a4,6 + 800017b8: 6685 lui a3,0x1 + 800017ba: 40b985b3 sub a1,s3,a1 + 800017be: 8552 mv a0,s4 + 800017c0: 8dfff0ef jal 8000109e + for(p = proc; p < &proc[NPROC]; p++) { + 800017c4: 16848493 addi s1,s1,360 + 800017c8: fd549be3 bne s1,s5,8000179e + } +} + 800017cc: 70e2 ld ra,56(sp) + 800017ce: 7442 ld s0,48(sp) + 800017d0: 74a2 ld s1,40(sp) + 800017d2: 7902 ld s2,32(sp) + 800017d4: 69e2 ld s3,24(sp) + 800017d6: 6a42 ld s4,16(sp) + 800017d8: 6aa2 ld s5,8(sp) + 800017da: 6b02 ld s6,0(sp) + 800017dc: 6121 addi sp,sp,64 + 800017de: 8082 ret + panic("kalloc"); + 800017e0: 00006517 auipc a0,0x6 + 800017e4: 97850513 addi a0,a0,-1672 # 80007158 + 800017e8: ff9fe0ef jal 800007e0 + +00000000800017ec : + +// initialize the proc table. +void +procinit(void) +{ + 800017ec: 7139 addi sp,sp,-64 + 800017ee: fc06 sd ra,56(sp) + 800017f0: f822 sd s0,48(sp) + 800017f2: f426 sd s1,40(sp) + 800017f4: f04a sd s2,32(sp) + 800017f6: ec4e sd s3,24(sp) + 800017f8: e852 sd s4,16(sp) + 800017fa: e456 sd s5,8(sp) + 800017fc: e05a sd s6,0(sp) + 800017fe: 0080 addi s0,sp,64 + struct proc *p; + + initlock(&pid_lock, "nextpid"); + 80001800: 00006597 auipc a1,0x6 + 80001804: 96058593 addi a1,a1,-1696 # 80007160 + 80001808: 00011517 auipc a0,0x11 + 8000180c: b9050513 addi a0,a0,-1136 # 80012398 + 80001810: b3eff0ef jal 80000b4e + initlock(&wait_lock, "wait_lock"); + 80001814: 00006597 auipc a1,0x6 + 80001818: 95458593 addi a1,a1,-1708 # 80007168 + 8000181c: 00011517 auipc a0,0x11 + 80001820: b9450513 addi a0,a0,-1132 # 800123b0 + 80001824: b2aff0ef jal 80000b4e + for(p = proc; p < &proc[NPROC]; p++) { + 80001828: 00011497 auipc s1,0x11 + 8000182c: fa048493 addi s1,s1,-96 # 800127c8 + initlock(&p->lock, "proc"); + 80001830: 00006b17 auipc s6,0x6 + 80001834: 948b0b13 addi s6,s6,-1720 # 80007178 + p->state = UNUSED; + p->kstack = KSTACK((int) (p - proc)); + 80001838: 8aa6 mv s5,s1 + 8000183a: 04fa5937 lui s2,0x4fa5 + 8000183e: fa590913 addi s2,s2,-91 # 4fa4fa5 <_entry-0x7b05b05b> + 80001842: 0932 slli s2,s2,0xc + 80001844: fa590913 addi s2,s2,-91 + 80001848: 0932 slli s2,s2,0xc + 8000184a: fa590913 addi s2,s2,-91 + 8000184e: 0932 slli s2,s2,0xc + 80001850: fa590913 addi s2,s2,-91 + 80001854: 040009b7 lui s3,0x4000 + 80001858: 19fd addi s3,s3,-1 # 3ffffff <_entry-0x7c000001> + 8000185a: 09b2 slli s3,s3,0xc + for(p = proc; p < &proc[NPROC]; p++) { + 8000185c: 00017a17 auipc s4,0x17 + 80001860: 96ca0a13 addi s4,s4,-1684 # 800181c8 + initlock(&p->lock, "proc"); + 80001864: 85da mv a1,s6 + 80001866: 8526 mv a0,s1 + 80001868: ae6ff0ef jal 80000b4e + p->state = UNUSED; + 8000186c: 0004ac23 sw zero,24(s1) + p->kstack = KSTACK((int) (p - proc)); + 80001870: 415487b3 sub a5,s1,s5 + 80001874: 878d srai a5,a5,0x3 + 80001876: 032787b3 mul a5,a5,s2 + 8000187a: 2785 addiw a5,a5,1 # fffffffffffff001 + 8000187c: 00d7979b slliw a5,a5,0xd + 80001880: 40f987b3 sub a5,s3,a5 + 80001884: e0bc sd a5,64(s1) + for(p = proc; p < &proc[NPROC]; p++) { + 80001886: 16848493 addi s1,s1,360 + 8000188a: fd449de3 bne s1,s4,80001864 + } +} + 8000188e: 70e2 ld ra,56(sp) + 80001890: 7442 ld s0,48(sp) + 80001892: 74a2 ld s1,40(sp) + 80001894: 7902 ld s2,32(sp) + 80001896: 69e2 ld s3,24(sp) + 80001898: 6a42 ld s4,16(sp) + 8000189a: 6aa2 ld s5,8(sp) + 8000189c: 6b02 ld s6,0(sp) + 8000189e: 6121 addi sp,sp,64 + 800018a0: 8082 ret + +00000000800018a2 : +// Must be called with interrupts disabled, +// to prevent race with process being moved +// to a different CPU. +int +cpuid() +{ + 800018a2: 1141 addi sp,sp,-16 + 800018a4: e422 sd s0,8(sp) + 800018a6: 0800 addi s0,sp,16 + asm volatile("mv %0, tp" : "=r" (x) ); + 800018a8: 8512 mv a0,tp + int id = r_tp(); + return id; +} + 800018aa: 2501 sext.w a0,a0 + 800018ac: 6422 ld s0,8(sp) + 800018ae: 0141 addi sp,sp,16 + 800018b0: 8082 ret + +00000000800018b2 : + +// Return this CPU's cpu struct. +// Interrupts must be disabled. +struct cpu* +mycpu(void) +{ + 800018b2: 1141 addi sp,sp,-16 + 800018b4: e422 sd s0,8(sp) + 800018b6: 0800 addi s0,sp,16 + 800018b8: 8792 mv a5,tp + int id = cpuid(); + struct cpu *c = &cpus[id]; + 800018ba: 2781 sext.w a5,a5 + 800018bc: 079e slli a5,a5,0x7 + return c; +} + 800018be: 00011517 auipc a0,0x11 + 800018c2: b0a50513 addi a0,a0,-1270 # 800123c8 + 800018c6: 953e add a0,a0,a5 + 800018c8: 6422 ld s0,8(sp) + 800018ca: 0141 addi sp,sp,16 + 800018cc: 8082 ret + +00000000800018ce : + +// Return the current struct proc *, or zero if none. +struct proc* +myproc(void) +{ + 800018ce: 1101 addi sp,sp,-32 + 800018d0: ec06 sd ra,24(sp) + 800018d2: e822 sd s0,16(sp) + 800018d4: e426 sd s1,8(sp) + 800018d6: 1000 addi s0,sp,32 + push_off(); + 800018d8: ab6ff0ef jal 80000b8e + 800018dc: 8792 mv a5,tp + struct cpu *c = mycpu(); + struct proc *p = c->proc; + 800018de: 2781 sext.w a5,a5 + 800018e0: 079e slli a5,a5,0x7 + 800018e2: 00011717 auipc a4,0x11 + 800018e6: ab670713 addi a4,a4,-1354 # 80012398 + 800018ea: 97ba add a5,a5,a4 + 800018ec: 7b84 ld s1,48(a5) + pop_off(); + 800018ee: b24ff0ef jal 80000c12 + return p; +} + 800018f2: 8526 mv a0,s1 + 800018f4: 60e2 ld ra,24(sp) + 800018f6: 6442 ld s0,16(sp) + 800018f8: 64a2 ld s1,8(sp) + 800018fa: 6105 addi sp,sp,32 + 800018fc: 8082 ret + +00000000800018fe : + +// A fork child's very first scheduling by scheduler() +// will swtch to forkret. +void +forkret(void) +{ + 800018fe: 7179 addi sp,sp,-48 + 80001900: f406 sd ra,40(sp) + 80001902: f022 sd s0,32(sp) + 80001904: ec26 sd s1,24(sp) + 80001906: 1800 addi s0,sp,48 + extern char userret[]; + static int first = 1; + struct proc *p = myproc(); + 80001908: fc7ff0ef jal 800018ce + 8000190c: 84aa mv s1,a0 + + // Still holding p->lock from scheduler. + release(&p->lock); + 8000190e: b58ff0ef jal 80000c66 + + if (first) { + 80001912: 00009797 auipc a5,0x9 + 80001916: 92e7a783 lw a5,-1746(a5) # 8000a240 + 8000191a: cf8d beqz a5,80001954 + // File system initialization must be run in the context of a + // regular process (e.g., because it calls sleep), and thus cannot + // be run from main(). + fsinit(ROOTDEV); + 8000191c: 4505 li a0,1 + 8000191e: 4c9010ef jal 800035e6 + + first = 0; + 80001922: 00009797 auipc a5,0x9 + 80001926: 9007af23 sw zero,-1762(a5) # 8000a240 + // ensure other cores see first=0. + __sync_synchronize(); + 8000192a: 0330000f fence rw,rw + + // We can invoke kexec() now that file system is initialized. + // Put the return value (argc) of kexec into a0. + p->trapframe->a0 = kexec("/init", (char *[]){ "/init", 0 }); + 8000192e: 00006517 auipc a0,0x6 + 80001932: 85250513 addi a0,a0,-1966 # 80007180 + 80001936: fca43823 sd a0,-48(s0) + 8000193a: fc043c23 sd zero,-40(s0) + 8000193e: fd040593 addi a1,s0,-48 + 80001942: 5af020ef jal 800046f0 + 80001946: 6cbc ld a5,88(s1) + 80001948: fba8 sd a0,112(a5) + if (p->trapframe->a0 == -1) { + 8000194a: 6cbc ld a5,88(s1) + 8000194c: 7bb8 ld a4,112(a5) + 8000194e: 57fd li a5,-1 + 80001950: 02f70d63 beq a4,a5,8000198a + panic("exec"); + } + } + + // return to user space, mimicing usertrap()'s return. + prepare_return(); + 80001954: 2bf000ef jal 80002412 + uint64 satp = MAKE_SATP(p->pagetable); + 80001958: 68a8 ld a0,80(s1) + 8000195a: 8131 srli a0,a0,0xc + uint64 trampoline_userret = TRAMPOLINE + (userret - trampoline); + 8000195c: 04000737 lui a4,0x4000 + 80001960: 177d addi a4,a4,-1 # 3ffffff <_entry-0x7c000001> + 80001962: 0732 slli a4,a4,0xc + 80001964: 00004797 auipc a5,0x4 + 80001968: 73878793 addi a5,a5,1848 # 8000609c + 8000196c: 00004697 auipc a3,0x4 + 80001970: 69468693 addi a3,a3,1684 # 80006000 <_trampoline> + 80001974: 8f95 sub a5,a5,a3 + 80001976: 97ba add a5,a5,a4 + ((void (*)(uint64))trampoline_userret)(satp); + 80001978: 577d li a4,-1 + 8000197a: 177e slli a4,a4,0x3f + 8000197c: 8d59 or a0,a0,a4 + 8000197e: 9782 jalr a5 +} + 80001980: 70a2 ld ra,40(sp) + 80001982: 7402 ld s0,32(sp) + 80001984: 64e2 ld s1,24(sp) + 80001986: 6145 addi sp,sp,48 + 80001988: 8082 ret + panic("exec"); + 8000198a: 00005517 auipc a0,0x5 + 8000198e: 7fe50513 addi a0,a0,2046 # 80007188 + 80001992: e4ffe0ef jal 800007e0 + +0000000080001996 : +{ + 80001996: 1101 addi sp,sp,-32 + 80001998: ec06 sd ra,24(sp) + 8000199a: e822 sd s0,16(sp) + 8000199c: e426 sd s1,8(sp) + 8000199e: e04a sd s2,0(sp) + 800019a0: 1000 addi s0,sp,32 + acquire(&pid_lock); + 800019a2: 00011917 auipc s2,0x11 + 800019a6: 9f690913 addi s2,s2,-1546 # 80012398 + 800019aa: 854a mv a0,s2 + 800019ac: a22ff0ef jal 80000bce + pid = nextpid; + 800019b0: 00009797 auipc a5,0x9 + 800019b4: 89478793 addi a5,a5,-1900 # 8000a244 + 800019b8: 4384 lw s1,0(a5) + nextpid = nextpid + 1; + 800019ba: 0014871b addiw a4,s1,1 + 800019be: c398 sw a4,0(a5) + release(&pid_lock); + 800019c0: 854a mv a0,s2 + 800019c2: aa4ff0ef jal 80000c66 +} + 800019c6: 8526 mv a0,s1 + 800019c8: 60e2 ld ra,24(sp) + 800019ca: 6442 ld s0,16(sp) + 800019cc: 64a2 ld s1,8(sp) + 800019ce: 6902 ld s2,0(sp) + 800019d0: 6105 addi sp,sp,32 + 800019d2: 8082 ret + +00000000800019d4 : +{ + 800019d4: 1101 addi sp,sp,-32 + 800019d6: ec06 sd ra,24(sp) + 800019d8: e822 sd s0,16(sp) + 800019da: e426 sd s1,8(sp) + 800019dc: e04a sd s2,0(sp) + 800019de: 1000 addi s0,sp,32 + 800019e0: 892a mv s2,a0 + pagetable = uvmcreate(); + 800019e2: fb2ff0ef jal 80001194 + 800019e6: 84aa mv s1,a0 + if(pagetable == 0) + 800019e8: cd05 beqz a0,80001a20 + if(mappages(pagetable, TRAMPOLINE, PGSIZE, + 800019ea: 4729 li a4,10 + 800019ec: 00004697 auipc a3,0x4 + 800019f0: 61468693 addi a3,a3,1556 # 80006000 <_trampoline> + 800019f4: 6605 lui a2,0x1 + 800019f6: 040005b7 lui a1,0x4000 + 800019fa: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 800019fc: 05b2 slli a1,a1,0xc + 800019fe: df0ff0ef jal 80000fee + 80001a02: 02054663 bltz a0,80001a2e + if(mappages(pagetable, TRAPFRAME, PGSIZE, + 80001a06: 4719 li a4,6 + 80001a08: 05893683 ld a3,88(s2) + 80001a0c: 6605 lui a2,0x1 + 80001a0e: 020005b7 lui a1,0x2000 + 80001a12: 15fd addi a1,a1,-1 # 1ffffff <_entry-0x7e000001> + 80001a14: 05b6 slli a1,a1,0xd + 80001a16: 8526 mv a0,s1 + 80001a18: dd6ff0ef jal 80000fee + 80001a1c: 00054f63 bltz a0,80001a3a +} + 80001a20: 8526 mv a0,s1 + 80001a22: 60e2 ld ra,24(sp) + 80001a24: 6442 ld s0,16(sp) + 80001a26: 64a2 ld s1,8(sp) + 80001a28: 6902 ld s2,0(sp) + 80001a2a: 6105 addi sp,sp,32 + 80001a2c: 8082 ret + uvmfree(pagetable, 0); + 80001a2e: 4581 li a1,0 + 80001a30: 8526 mv a0,s1 + 80001a32: 95dff0ef jal 8000138e + return 0; + 80001a36: 4481 li s1,0 + 80001a38: b7e5 j 80001a20 + uvmunmap(pagetable, TRAMPOLINE, 1, 0); + 80001a3a: 4681 li a3,0 + 80001a3c: 4605 li a2,1 + 80001a3e: 040005b7 lui a1,0x4000 + 80001a42: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 80001a44: 05b2 slli a1,a1,0xc + 80001a46: 8526 mv a0,s1 + 80001a48: f72ff0ef jal 800011ba + uvmfree(pagetable, 0); + 80001a4c: 4581 li a1,0 + 80001a4e: 8526 mv a0,s1 + 80001a50: 93fff0ef jal 8000138e + return 0; + 80001a54: 4481 li s1,0 + 80001a56: b7e9 j 80001a20 + +0000000080001a58 : +{ + 80001a58: 1101 addi sp,sp,-32 + 80001a5a: ec06 sd ra,24(sp) + 80001a5c: e822 sd s0,16(sp) + 80001a5e: e426 sd s1,8(sp) + 80001a60: e04a sd s2,0(sp) + 80001a62: 1000 addi s0,sp,32 + 80001a64: 84aa mv s1,a0 + 80001a66: 892e mv s2,a1 + uvmunmap(pagetable, TRAMPOLINE, 1, 0); + 80001a68: 4681 li a3,0 + 80001a6a: 4605 li a2,1 + 80001a6c: 040005b7 lui a1,0x4000 + 80001a70: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 80001a72: 05b2 slli a1,a1,0xc + 80001a74: f46ff0ef jal 800011ba + uvmunmap(pagetable, TRAPFRAME, 1, 0); + 80001a78: 4681 li a3,0 + 80001a7a: 4605 li a2,1 + 80001a7c: 020005b7 lui a1,0x2000 + 80001a80: 15fd addi a1,a1,-1 # 1ffffff <_entry-0x7e000001> + 80001a82: 05b6 slli a1,a1,0xd + 80001a84: 8526 mv a0,s1 + 80001a86: f34ff0ef jal 800011ba + uvmfree(pagetable, sz); + 80001a8a: 85ca mv a1,s2 + 80001a8c: 8526 mv a0,s1 + 80001a8e: 901ff0ef jal 8000138e +} + 80001a92: 60e2 ld ra,24(sp) + 80001a94: 6442 ld s0,16(sp) + 80001a96: 64a2 ld s1,8(sp) + 80001a98: 6902 ld s2,0(sp) + 80001a9a: 6105 addi sp,sp,32 + 80001a9c: 8082 ret + +0000000080001a9e : +{ + 80001a9e: 1101 addi sp,sp,-32 + 80001aa0: ec06 sd ra,24(sp) + 80001aa2: e822 sd s0,16(sp) + 80001aa4: e426 sd s1,8(sp) + 80001aa6: 1000 addi s0,sp,32 + 80001aa8: 84aa mv s1,a0 + if(p->trapframe) + 80001aaa: 6d28 ld a0,88(a0) + 80001aac: c119 beqz a0,80001ab2 + kfree((void*)p->trapframe); + 80001aae: f6ffe0ef jal 80000a1c + p->trapframe = 0; + 80001ab2: 0404bc23 sd zero,88(s1) + if(p->pagetable) + 80001ab6: 68a8 ld a0,80(s1) + 80001ab8: c501 beqz a0,80001ac0 + proc_freepagetable(p->pagetable, p->sz); + 80001aba: 64ac ld a1,72(s1) + 80001abc: f9dff0ef jal 80001a58 + p->pagetable = 0; + 80001ac0: 0404b823 sd zero,80(s1) + p->sz = 0; + 80001ac4: 0404b423 sd zero,72(s1) + p->pid = 0; + 80001ac8: 0204a823 sw zero,48(s1) + p->parent = 0; + 80001acc: 0204bc23 sd zero,56(s1) + p->name[0] = 0; + 80001ad0: 14048c23 sb zero,344(s1) + p->chan = 0; + 80001ad4: 0204b023 sd zero,32(s1) + p->killed = 0; + 80001ad8: 0204a423 sw zero,40(s1) + p->xstate = 0; + 80001adc: 0204a623 sw zero,44(s1) + p->state = UNUSED; + 80001ae0: 0004ac23 sw zero,24(s1) +} + 80001ae4: 60e2 ld ra,24(sp) + 80001ae6: 6442 ld s0,16(sp) + 80001ae8: 64a2 ld s1,8(sp) + 80001aea: 6105 addi sp,sp,32 + 80001aec: 8082 ret + +0000000080001aee : +{ + 80001aee: 1101 addi sp,sp,-32 + 80001af0: ec06 sd ra,24(sp) + 80001af2: e822 sd s0,16(sp) + 80001af4: e426 sd s1,8(sp) + 80001af6: e04a sd s2,0(sp) + 80001af8: 1000 addi s0,sp,32 + for(p = proc; p < &proc[NPROC]; p++) { + 80001afa: 00011497 auipc s1,0x11 + 80001afe: cce48493 addi s1,s1,-818 # 800127c8 + 80001b02: 00016917 auipc s2,0x16 + 80001b06: 6c690913 addi s2,s2,1734 # 800181c8 + acquire(&p->lock); + 80001b0a: 8526 mv a0,s1 + 80001b0c: 8c2ff0ef jal 80000bce + if(p->state == UNUSED) { + 80001b10: 4c9c lw a5,24(s1) + 80001b12: cb91 beqz a5,80001b26 + release(&p->lock); + 80001b14: 8526 mv a0,s1 + 80001b16: 950ff0ef jal 80000c66 + for(p = proc; p < &proc[NPROC]; p++) { + 80001b1a: 16848493 addi s1,s1,360 + 80001b1e: ff2496e3 bne s1,s2,80001b0a + return 0; + 80001b22: 4481 li s1,0 + 80001b24: a089 j 80001b66 + p->pid = allocpid(); + 80001b26: e71ff0ef jal 80001996 + 80001b2a: d888 sw a0,48(s1) + p->state = USED; + 80001b2c: 4785 li a5,1 + 80001b2e: cc9c sw a5,24(s1) + if((p->trapframe = (struct trapframe *)kalloc()) == 0){ + 80001b30: fcffe0ef jal 80000afe + 80001b34: 892a mv s2,a0 + 80001b36: eca8 sd a0,88(s1) + 80001b38: cd15 beqz a0,80001b74 + p->pagetable = proc_pagetable(p); + 80001b3a: 8526 mv a0,s1 + 80001b3c: e99ff0ef jal 800019d4 + 80001b40: 892a mv s2,a0 + 80001b42: e8a8 sd a0,80(s1) + if(p->pagetable == 0){ + 80001b44: c121 beqz a0,80001b84 + memset(&p->context, 0, sizeof(p->context)); + 80001b46: 07000613 li a2,112 + 80001b4a: 4581 li a1,0 + 80001b4c: 06048513 addi a0,s1,96 + 80001b50: 952ff0ef jal 80000ca2 + p->context.ra = (uint64)forkret; + 80001b54: 00000797 auipc a5,0x0 + 80001b58: daa78793 addi a5,a5,-598 # 800018fe + 80001b5c: f0bc sd a5,96(s1) + p->context.sp = p->kstack + PGSIZE; + 80001b5e: 60bc ld a5,64(s1) + 80001b60: 6705 lui a4,0x1 + 80001b62: 97ba add a5,a5,a4 + 80001b64: f4bc sd a5,104(s1) +} + 80001b66: 8526 mv a0,s1 + 80001b68: 60e2 ld ra,24(sp) + 80001b6a: 6442 ld s0,16(sp) + 80001b6c: 64a2 ld s1,8(sp) + 80001b6e: 6902 ld s2,0(sp) + 80001b70: 6105 addi sp,sp,32 + 80001b72: 8082 ret + freeproc(p); + 80001b74: 8526 mv a0,s1 + 80001b76: f29ff0ef jal 80001a9e + release(&p->lock); + 80001b7a: 8526 mv a0,s1 + 80001b7c: 8eaff0ef jal 80000c66 + return 0; + 80001b80: 84ca mv s1,s2 + 80001b82: b7d5 j 80001b66 + freeproc(p); + 80001b84: 8526 mv a0,s1 + 80001b86: f19ff0ef jal 80001a9e + release(&p->lock); + 80001b8a: 8526 mv a0,s1 + 80001b8c: 8daff0ef jal 80000c66 + return 0; + 80001b90: 84ca mv s1,s2 + 80001b92: bfd1 j 80001b66 + +0000000080001b94 : +{ + 80001b94: 1101 addi sp,sp,-32 + 80001b96: ec06 sd ra,24(sp) + 80001b98: e822 sd s0,16(sp) + 80001b9a: e426 sd s1,8(sp) + 80001b9c: 1000 addi s0,sp,32 + p = allocproc(); + 80001b9e: f51ff0ef jal 80001aee + 80001ba2: 84aa mv s1,a0 + initproc = p; + 80001ba4: 00008797 auipc a5,0x8 + 80001ba8: 6ea7b623 sd a0,1772(a5) # 8000a290 + p->cwd = namei("/"); + 80001bac: 00005517 auipc a0,0x5 + 80001bb0: 5e450513 addi a0,a0,1508 # 80007190 + 80001bb4: 755010ef jal 80003b08 + 80001bb8: 14a4b823 sd a0,336(s1) + p->state = RUNNABLE; + 80001bbc: 478d li a5,3 + 80001bbe: cc9c sw a5,24(s1) + release(&p->lock); + 80001bc0: 8526 mv a0,s1 + 80001bc2: 8a4ff0ef jal 80000c66 +} + 80001bc6: 60e2 ld ra,24(sp) + 80001bc8: 6442 ld s0,16(sp) + 80001bca: 64a2 ld s1,8(sp) + 80001bcc: 6105 addi sp,sp,32 + 80001bce: 8082 ret + +0000000080001bd0 : +{ + 80001bd0: 1101 addi sp,sp,-32 + 80001bd2: ec06 sd ra,24(sp) + 80001bd4: e822 sd s0,16(sp) + 80001bd6: e426 sd s1,8(sp) + 80001bd8: e04a sd s2,0(sp) + 80001bda: 1000 addi s0,sp,32 + 80001bdc: 84aa mv s1,a0 + struct proc *p = myproc(); + 80001bde: cf1ff0ef jal 800018ce + 80001be2: 892a mv s2,a0 + sz = p->sz; + 80001be4: 652c ld a1,72(a0) + if(n > 0){ + 80001be6: 02905963 blez s1,80001c18 + if(sz + n > TRAPFRAME) { + 80001bea: 00b48633 add a2,s1,a1 + 80001bee: 020007b7 lui a5,0x2000 + 80001bf2: 17fd addi a5,a5,-1 # 1ffffff <_entry-0x7e000001> + 80001bf4: 07b6 slli a5,a5,0xd + 80001bf6: 02c7ea63 bltu a5,a2,80001c2a + if((sz = uvmalloc(p->pagetable, sz, sz + n, PTE_W)) == 0) { + 80001bfa: 4691 li a3,4 + 80001bfc: 6928 ld a0,80(a0) + 80001bfe: e8aff0ef jal 80001288 + 80001c02: 85aa mv a1,a0 + 80001c04: c50d beqz a0,80001c2e + p->sz = sz; + 80001c06: 04b93423 sd a1,72(s2) + return 0; + 80001c0a: 4501 li a0,0 +} + 80001c0c: 60e2 ld ra,24(sp) + 80001c0e: 6442 ld s0,16(sp) + 80001c10: 64a2 ld s1,8(sp) + 80001c12: 6902 ld s2,0(sp) + 80001c14: 6105 addi sp,sp,32 + 80001c16: 8082 ret + } else if(n < 0){ + 80001c18: fe04d7e3 bgez s1,80001c06 + sz = uvmdealloc(p->pagetable, sz, sz + n); + 80001c1c: 00b48633 add a2,s1,a1 + 80001c20: 6928 ld a0,80(a0) + 80001c22: e22ff0ef jal 80001244 + 80001c26: 85aa mv a1,a0 + 80001c28: bff9 j 80001c06 + return -1; + 80001c2a: 557d li a0,-1 + 80001c2c: b7c5 j 80001c0c + return -1; + 80001c2e: 557d li a0,-1 + 80001c30: bff1 j 80001c0c + +0000000080001c32 : +{ + 80001c32: 7139 addi sp,sp,-64 + 80001c34: fc06 sd ra,56(sp) + 80001c36: f822 sd s0,48(sp) + 80001c38: f04a sd s2,32(sp) + 80001c3a: e456 sd s5,8(sp) + 80001c3c: 0080 addi s0,sp,64 + struct proc *p = myproc(); + 80001c3e: c91ff0ef jal 800018ce + 80001c42: 8aaa mv s5,a0 + if((np = allocproc()) == 0){ + 80001c44: eabff0ef jal 80001aee + 80001c48: 0e050a63 beqz a0,80001d3c + 80001c4c: e852 sd s4,16(sp) + 80001c4e: 8a2a mv s4,a0 + if(uvmcopy(p->pagetable, np->pagetable, p->sz) < 0){ + 80001c50: 048ab603 ld a2,72(s5) + 80001c54: 692c ld a1,80(a0) + 80001c56: 050ab503 ld a0,80(s5) + 80001c5a: f66ff0ef jal 800013c0 + 80001c5e: 04054a63 bltz a0,80001cb2 + 80001c62: f426 sd s1,40(sp) + 80001c64: ec4e sd s3,24(sp) + np->sz = p->sz; + 80001c66: 048ab783 ld a5,72(s5) + 80001c6a: 04fa3423 sd a5,72(s4) + *(np->trapframe) = *(p->trapframe); + 80001c6e: 058ab683 ld a3,88(s5) + 80001c72: 87b6 mv a5,a3 + 80001c74: 058a3703 ld a4,88(s4) + 80001c78: 12068693 addi a3,a3,288 + 80001c7c: 0007b803 ld a6,0(a5) + 80001c80: 6788 ld a0,8(a5) + 80001c82: 6b8c ld a1,16(a5) + 80001c84: 6f90 ld a2,24(a5) + 80001c86: 01073023 sd a6,0(a4) # 1000 <_entry-0x7ffff000> + 80001c8a: e708 sd a0,8(a4) + 80001c8c: eb0c sd a1,16(a4) + 80001c8e: ef10 sd a2,24(a4) + 80001c90: 02078793 addi a5,a5,32 + 80001c94: 02070713 addi a4,a4,32 + 80001c98: fed792e3 bne a5,a3,80001c7c + np->trapframe->a0 = 0; + 80001c9c: 058a3783 ld a5,88(s4) + 80001ca0: 0607b823 sd zero,112(a5) + for(i = 0; i < NOFILE; i++) + 80001ca4: 0d0a8493 addi s1,s5,208 + 80001ca8: 0d0a0913 addi s2,s4,208 + 80001cac: 150a8993 addi s3,s5,336 + 80001cb0: a831 j 80001ccc + freeproc(np); + 80001cb2: 8552 mv a0,s4 + 80001cb4: debff0ef jal 80001a9e + release(&np->lock); + 80001cb8: 8552 mv a0,s4 + 80001cba: fadfe0ef jal 80000c66 + return -1; + 80001cbe: 597d li s2,-1 + 80001cc0: 6a42 ld s4,16(sp) + 80001cc2: a0b5 j 80001d2e + for(i = 0; i < NOFILE; i++) + 80001cc4: 04a1 addi s1,s1,8 + 80001cc6: 0921 addi s2,s2,8 + 80001cc8: 01348963 beq s1,s3,80001cda + if(p->ofile[i]) + 80001ccc: 6088 ld a0,0(s1) + 80001cce: d97d beqz a0,80001cc4 + np->ofile[i] = filedup(p->ofile[i]); + 80001cd0: 3d2020ef jal 800040a2 + 80001cd4: 00a93023 sd a0,0(s2) + 80001cd8: b7f5 j 80001cc4 + np->cwd = idup(p->cwd); + 80001cda: 150ab503 ld a0,336(s5) + 80001cde: 5de010ef jal 800032bc + 80001ce2: 14aa3823 sd a0,336(s4) + safestrcpy(np->name, p->name, sizeof(p->name)); + 80001ce6: 4641 li a2,16 + 80001ce8: 158a8593 addi a1,s5,344 + 80001cec: 158a0513 addi a0,s4,344 + 80001cf0: 8f0ff0ef jal 80000de0 + pid = np->pid; + 80001cf4: 030a2903 lw s2,48(s4) + release(&np->lock); + 80001cf8: 8552 mv a0,s4 + 80001cfa: f6dfe0ef jal 80000c66 + acquire(&wait_lock); + 80001cfe: 00010497 auipc s1,0x10 + 80001d02: 6b248493 addi s1,s1,1714 # 800123b0 + 80001d06: 8526 mv a0,s1 + 80001d08: ec7fe0ef jal 80000bce + np->parent = p; + 80001d0c: 035a3c23 sd s5,56(s4) + release(&wait_lock); + 80001d10: 8526 mv a0,s1 + 80001d12: f55fe0ef jal 80000c66 + acquire(&np->lock); + 80001d16: 8552 mv a0,s4 + 80001d18: eb7fe0ef jal 80000bce + np->state = RUNNABLE; + 80001d1c: 478d li a5,3 + 80001d1e: 00fa2c23 sw a5,24(s4) + release(&np->lock); + 80001d22: 8552 mv a0,s4 + 80001d24: f43fe0ef jal 80000c66 + return pid; + 80001d28: 74a2 ld s1,40(sp) + 80001d2a: 69e2 ld s3,24(sp) + 80001d2c: 6a42 ld s4,16(sp) +} + 80001d2e: 854a mv a0,s2 + 80001d30: 70e2 ld ra,56(sp) + 80001d32: 7442 ld s0,48(sp) + 80001d34: 7902 ld s2,32(sp) + 80001d36: 6aa2 ld s5,8(sp) + 80001d38: 6121 addi sp,sp,64 + 80001d3a: 8082 ret + return -1; + 80001d3c: 597d li s2,-1 + 80001d3e: bfc5 j 80001d2e + +0000000080001d40 : +{ + 80001d40: 715d addi sp,sp,-80 + 80001d42: e486 sd ra,72(sp) + 80001d44: e0a2 sd s0,64(sp) + 80001d46: fc26 sd s1,56(sp) + 80001d48: f84a sd s2,48(sp) + 80001d4a: f44e sd s3,40(sp) + 80001d4c: f052 sd s4,32(sp) + 80001d4e: ec56 sd s5,24(sp) + 80001d50: e85a sd s6,16(sp) + 80001d52: e45e sd s7,8(sp) + 80001d54: e062 sd s8,0(sp) + 80001d56: 0880 addi s0,sp,80 + 80001d58: 8792 mv a5,tp + int id = r_tp(); + 80001d5a: 2781 sext.w a5,a5 + c->proc = 0; + 80001d5c: 00779b13 slli s6,a5,0x7 + 80001d60: 00010717 auipc a4,0x10 + 80001d64: 63870713 addi a4,a4,1592 # 80012398 + 80001d68: 975a add a4,a4,s6 + 80001d6a: 02073823 sd zero,48(a4) + swtch(&c->context, &p->context); + 80001d6e: 00010717 auipc a4,0x10 + 80001d72: 66270713 addi a4,a4,1634 # 800123d0 + 80001d76: 9b3a add s6,s6,a4 + p->state = RUNNING; + 80001d78: 4c11 li s8,4 + c->proc = p; + 80001d7a: 079e slli a5,a5,0x7 + 80001d7c: 00010a17 auipc s4,0x10 + 80001d80: 61ca0a13 addi s4,s4,1564 # 80012398 + 80001d84: 9a3e add s4,s4,a5 + found = 1; + 80001d86: 4b85 li s7,1 + for(p = proc; p < &proc[NPROC]; p++) { + 80001d88: 00016997 auipc s3,0x16 + 80001d8c: 44098993 addi s3,s3,1088 # 800181c8 + 80001d90: a83d j 80001dce + release(&p->lock); + 80001d92: 8526 mv a0,s1 + 80001d94: ed3fe0ef jal 80000c66 + for(p = proc; p < &proc[NPROC]; p++) { + 80001d98: 16848493 addi s1,s1,360 + 80001d9c: 03348563 beq s1,s3,80001dc6 + acquire(&p->lock); + 80001da0: 8526 mv a0,s1 + 80001da2: e2dfe0ef jal 80000bce + if(p->state == RUNNABLE) { + 80001da6: 4c9c lw a5,24(s1) + 80001da8: ff2795e3 bne a5,s2,80001d92 + p->state = RUNNING; + 80001dac: 0184ac23 sw s8,24(s1) + c->proc = p; + 80001db0: 029a3823 sd s1,48(s4) + swtch(&c->context, &p->context); + 80001db4: 06048593 addi a1,s1,96 + 80001db8: 855a mv a0,s6 + 80001dba: 5b2000ef jal 8000236c + c->proc = 0; + 80001dbe: 020a3823 sd zero,48(s4) + found = 1; + 80001dc2: 8ade mv s5,s7 + 80001dc4: b7f9 j 80001d92 + if(found == 0) { + 80001dc6: 000a9463 bnez s5,80001dce + asm volatile("wfi"); + 80001dca: 10500073 wfi + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80001dce: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 80001dd2: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80001dd6: 10079073 csrw sstatus,a5 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80001dda: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() & ~SSTATUS_SIE); + 80001dde: 9bf5 andi a5,a5,-3 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80001de0: 10079073 csrw sstatus,a5 + int found = 0; + 80001de4: 4a81 li s5,0 + for(p = proc; p < &proc[NPROC]; p++) { + 80001de6: 00011497 auipc s1,0x11 + 80001dea: 9e248493 addi s1,s1,-1566 # 800127c8 + if(p->state == RUNNABLE) { + 80001dee: 490d li s2,3 + 80001df0: bf45 j 80001da0 + +0000000080001df2 : +{ + 80001df2: 7179 addi sp,sp,-48 + 80001df4: f406 sd ra,40(sp) + 80001df6: f022 sd s0,32(sp) + 80001df8: ec26 sd s1,24(sp) + 80001dfa: e84a sd s2,16(sp) + 80001dfc: e44e sd s3,8(sp) + 80001dfe: 1800 addi s0,sp,48 + struct proc *p = myproc(); + 80001e00: acfff0ef jal 800018ce + 80001e04: 84aa mv s1,a0 + if(!holding(&p->lock)) + 80001e06: d5ffe0ef jal 80000b64 + 80001e0a: c92d beqz a0,80001e7c + asm volatile("mv %0, tp" : "=r" (x) ); + 80001e0c: 8792 mv a5,tp + if(mycpu()->noff != 1) + 80001e0e: 2781 sext.w a5,a5 + 80001e10: 079e slli a5,a5,0x7 + 80001e12: 00010717 auipc a4,0x10 + 80001e16: 58670713 addi a4,a4,1414 # 80012398 + 80001e1a: 97ba add a5,a5,a4 + 80001e1c: 0a87a703 lw a4,168(a5) + 80001e20: 4785 li a5,1 + 80001e22: 06f71363 bne a4,a5,80001e88 + if(p->state == RUNNING) + 80001e26: 4c98 lw a4,24(s1) + 80001e28: 4791 li a5,4 + 80001e2a: 06f70563 beq a4,a5,80001e94 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80001e2e: 100027f3 csrr a5,sstatus + return (x & SSTATUS_SIE) != 0; + 80001e32: 8b89 andi a5,a5,2 + if(intr_get()) + 80001e34: e7b5 bnez a5,80001ea0 + asm volatile("mv %0, tp" : "=r" (x) ); + 80001e36: 8792 mv a5,tp + intena = mycpu()->intena; + 80001e38: 00010917 auipc s2,0x10 + 80001e3c: 56090913 addi s2,s2,1376 # 80012398 + 80001e40: 2781 sext.w a5,a5 + 80001e42: 079e slli a5,a5,0x7 + 80001e44: 97ca add a5,a5,s2 + 80001e46: 0ac7a983 lw s3,172(a5) + 80001e4a: 8792 mv a5,tp + swtch(&p->context, &mycpu()->context); + 80001e4c: 2781 sext.w a5,a5 + 80001e4e: 079e slli a5,a5,0x7 + 80001e50: 00010597 auipc a1,0x10 + 80001e54: 58058593 addi a1,a1,1408 # 800123d0 + 80001e58: 95be add a1,a1,a5 + 80001e5a: 06048513 addi a0,s1,96 + 80001e5e: 50e000ef jal 8000236c + 80001e62: 8792 mv a5,tp + mycpu()->intena = intena; + 80001e64: 2781 sext.w a5,a5 + 80001e66: 079e slli a5,a5,0x7 + 80001e68: 993e add s2,s2,a5 + 80001e6a: 0b392623 sw s3,172(s2) +} + 80001e6e: 70a2 ld ra,40(sp) + 80001e70: 7402 ld s0,32(sp) + 80001e72: 64e2 ld s1,24(sp) + 80001e74: 6942 ld s2,16(sp) + 80001e76: 69a2 ld s3,8(sp) + 80001e78: 6145 addi sp,sp,48 + 80001e7a: 8082 ret + panic("sched p->lock"); + 80001e7c: 00005517 auipc a0,0x5 + 80001e80: 31c50513 addi a0,a0,796 # 80007198 + 80001e84: 95dfe0ef jal 800007e0 + panic("sched locks"); + 80001e88: 00005517 auipc a0,0x5 + 80001e8c: 32050513 addi a0,a0,800 # 800071a8 + 80001e90: 951fe0ef jal 800007e0 + panic("sched RUNNING"); + 80001e94: 00005517 auipc a0,0x5 + 80001e98: 32450513 addi a0,a0,804 # 800071b8 + 80001e9c: 945fe0ef jal 800007e0 + panic("sched interruptible"); + 80001ea0: 00005517 auipc a0,0x5 + 80001ea4: 32850513 addi a0,a0,808 # 800071c8 + 80001ea8: 939fe0ef jal 800007e0 + +0000000080001eac : +{ + 80001eac: 1101 addi sp,sp,-32 + 80001eae: ec06 sd ra,24(sp) + 80001eb0: e822 sd s0,16(sp) + 80001eb2: e426 sd s1,8(sp) + 80001eb4: 1000 addi s0,sp,32 + struct proc *p = myproc(); + 80001eb6: a19ff0ef jal 800018ce + 80001eba: 84aa mv s1,a0 + acquire(&p->lock); + 80001ebc: d13fe0ef jal 80000bce + p->state = RUNNABLE; + 80001ec0: 478d li a5,3 + 80001ec2: cc9c sw a5,24(s1) + sched(); + 80001ec4: f2fff0ef jal 80001df2 + release(&p->lock); + 80001ec8: 8526 mv a0,s1 + 80001eca: d9dfe0ef jal 80000c66 +} + 80001ece: 60e2 ld ra,24(sp) + 80001ed0: 6442 ld s0,16(sp) + 80001ed2: 64a2 ld s1,8(sp) + 80001ed4: 6105 addi sp,sp,32 + 80001ed6: 8082 ret + +0000000080001ed8 : + +// Sleep on channel chan, releasing condition lock lk. +// Re-acquires lk when awakened. +void +sleep(void *chan, struct spinlock *lk) +{ + 80001ed8: 7179 addi sp,sp,-48 + 80001eda: f406 sd ra,40(sp) + 80001edc: f022 sd s0,32(sp) + 80001ede: ec26 sd s1,24(sp) + 80001ee0: e84a sd s2,16(sp) + 80001ee2: e44e sd s3,8(sp) + 80001ee4: 1800 addi s0,sp,48 + 80001ee6: 89aa mv s3,a0 + 80001ee8: 892e mv s2,a1 + struct proc *p = myproc(); + 80001eea: 9e5ff0ef jal 800018ce + 80001eee: 84aa mv s1,a0 + // Once we hold p->lock, we can be + // guaranteed that we won't miss any wakeup + // (wakeup locks p->lock), + // so it's okay to release lk. + + acquire(&p->lock); //DOC: sleeplock1 + 80001ef0: cdffe0ef jal 80000bce + release(lk); + 80001ef4: 854a mv a0,s2 + 80001ef6: d71fe0ef jal 80000c66 + + // Go to sleep. + p->chan = chan; + 80001efa: 0334b023 sd s3,32(s1) + p->state = SLEEPING; + 80001efe: 4789 li a5,2 + 80001f00: cc9c sw a5,24(s1) + + sched(); + 80001f02: ef1ff0ef jal 80001df2 + + // Tidy up. + p->chan = 0; + 80001f06: 0204b023 sd zero,32(s1) + + // Reacquire original lock. + release(&p->lock); + 80001f0a: 8526 mv a0,s1 + 80001f0c: d5bfe0ef jal 80000c66 + acquire(lk); + 80001f10: 854a mv a0,s2 + 80001f12: cbdfe0ef jal 80000bce +} + 80001f16: 70a2 ld ra,40(sp) + 80001f18: 7402 ld s0,32(sp) + 80001f1a: 64e2 ld s1,24(sp) + 80001f1c: 6942 ld s2,16(sp) + 80001f1e: 69a2 ld s3,8(sp) + 80001f20: 6145 addi sp,sp,48 + 80001f22: 8082 ret + +0000000080001f24 : + +// Wake up all processes sleeping on channel chan. +// Caller should hold the condition lock. +void +wakeup(void *chan) +{ + 80001f24: 7139 addi sp,sp,-64 + 80001f26: fc06 sd ra,56(sp) + 80001f28: f822 sd s0,48(sp) + 80001f2a: f426 sd s1,40(sp) + 80001f2c: f04a sd s2,32(sp) + 80001f2e: ec4e sd s3,24(sp) + 80001f30: e852 sd s4,16(sp) + 80001f32: e456 sd s5,8(sp) + 80001f34: 0080 addi s0,sp,64 + 80001f36: 8a2a mv s4,a0 + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + 80001f38: 00011497 auipc s1,0x11 + 80001f3c: 89048493 addi s1,s1,-1904 # 800127c8 + if(p != myproc()){ + acquire(&p->lock); + if(p->state == SLEEPING && p->chan == chan) { + 80001f40: 4989 li s3,2 + p->state = RUNNABLE; + 80001f42: 4a8d li s5,3 + for(p = proc; p < &proc[NPROC]; p++) { + 80001f44: 00016917 auipc s2,0x16 + 80001f48: 28490913 addi s2,s2,644 # 800181c8 + 80001f4c: a801 j 80001f5c + } + release(&p->lock); + 80001f4e: 8526 mv a0,s1 + 80001f50: d17fe0ef jal 80000c66 + for(p = proc; p < &proc[NPROC]; p++) { + 80001f54: 16848493 addi s1,s1,360 + 80001f58: 03248263 beq s1,s2,80001f7c + if(p != myproc()){ + 80001f5c: 973ff0ef jal 800018ce + 80001f60: fea48ae3 beq s1,a0,80001f54 + acquire(&p->lock); + 80001f64: 8526 mv a0,s1 + 80001f66: c69fe0ef jal 80000bce + if(p->state == SLEEPING && p->chan == chan) { + 80001f6a: 4c9c lw a5,24(s1) + 80001f6c: ff3791e3 bne a5,s3,80001f4e + 80001f70: 709c ld a5,32(s1) + 80001f72: fd479ee3 bne a5,s4,80001f4e + p->state = RUNNABLE; + 80001f76: 0154ac23 sw s5,24(s1) + 80001f7a: bfd1 j 80001f4e + } + } +} + 80001f7c: 70e2 ld ra,56(sp) + 80001f7e: 7442 ld s0,48(sp) + 80001f80: 74a2 ld s1,40(sp) + 80001f82: 7902 ld s2,32(sp) + 80001f84: 69e2 ld s3,24(sp) + 80001f86: 6a42 ld s4,16(sp) + 80001f88: 6aa2 ld s5,8(sp) + 80001f8a: 6121 addi sp,sp,64 + 80001f8c: 8082 ret + +0000000080001f8e : +{ + 80001f8e: 7179 addi sp,sp,-48 + 80001f90: f406 sd ra,40(sp) + 80001f92: f022 sd s0,32(sp) + 80001f94: ec26 sd s1,24(sp) + 80001f96: e84a sd s2,16(sp) + 80001f98: e44e sd s3,8(sp) + 80001f9a: e052 sd s4,0(sp) + 80001f9c: 1800 addi s0,sp,48 + 80001f9e: 892a mv s2,a0 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 80001fa0: 00011497 auipc s1,0x11 + 80001fa4: 82848493 addi s1,s1,-2008 # 800127c8 + pp->parent = initproc; + 80001fa8: 00008a17 auipc s4,0x8 + 80001fac: 2e8a0a13 addi s4,s4,744 # 8000a290 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 80001fb0: 00016997 auipc s3,0x16 + 80001fb4: 21898993 addi s3,s3,536 # 800181c8 + 80001fb8: a029 j 80001fc2 + 80001fba: 16848493 addi s1,s1,360 + 80001fbe: 01348b63 beq s1,s3,80001fd4 + if(pp->parent == p){ + 80001fc2: 7c9c ld a5,56(s1) + 80001fc4: ff279be3 bne a5,s2,80001fba + pp->parent = initproc; + 80001fc8: 000a3503 ld a0,0(s4) + 80001fcc: fc88 sd a0,56(s1) + wakeup(initproc); + 80001fce: f57ff0ef jal 80001f24 + 80001fd2: b7e5 j 80001fba +} + 80001fd4: 70a2 ld ra,40(sp) + 80001fd6: 7402 ld s0,32(sp) + 80001fd8: 64e2 ld s1,24(sp) + 80001fda: 6942 ld s2,16(sp) + 80001fdc: 69a2 ld s3,8(sp) + 80001fde: 6a02 ld s4,0(sp) + 80001fe0: 6145 addi sp,sp,48 + 80001fe2: 8082 ret + +0000000080001fe4 : +{ + 80001fe4: 7179 addi sp,sp,-48 + 80001fe6: f406 sd ra,40(sp) + 80001fe8: f022 sd s0,32(sp) + 80001fea: ec26 sd s1,24(sp) + 80001fec: e84a sd s2,16(sp) + 80001fee: e44e sd s3,8(sp) + 80001ff0: e052 sd s4,0(sp) + 80001ff2: 1800 addi s0,sp,48 + 80001ff4: 8a2a mv s4,a0 + struct proc *p = myproc(); + 80001ff6: 8d9ff0ef jal 800018ce + 80001ffa: 89aa mv s3,a0 + if(p == initproc) + 80001ffc: 00008797 auipc a5,0x8 + 80002000: 2947b783 ld a5,660(a5) # 8000a290 + 80002004: 0d050493 addi s1,a0,208 + 80002008: 15050913 addi s2,a0,336 + 8000200c: 00a79f63 bne a5,a0,8000202a + panic("init exiting"); + 80002010: 00005517 auipc a0,0x5 + 80002014: 1d050513 addi a0,a0,464 # 800071e0 + 80002018: fc8fe0ef jal 800007e0 + fileclose(f); + 8000201c: 0cc020ef jal 800040e8 + p->ofile[fd] = 0; + 80002020: 0004b023 sd zero,0(s1) + for(int fd = 0; fd < NOFILE; fd++){ + 80002024: 04a1 addi s1,s1,8 + 80002026: 01248563 beq s1,s2,80002030 + if(p->ofile[fd]){ + 8000202a: 6088 ld a0,0(s1) + 8000202c: f965 bnez a0,8000201c + 8000202e: bfdd j 80002024 + begin_op(); + 80002030: 4ad010ef jal 80003cdc + iput(p->cwd); + 80002034: 1509b503 ld a0,336(s3) + 80002038: 43c010ef jal 80003474 + end_op(); + 8000203c: 50b010ef jal 80003d46 + p->cwd = 0; + 80002040: 1409b823 sd zero,336(s3) + acquire(&wait_lock); + 80002044: 00010497 auipc s1,0x10 + 80002048: 36c48493 addi s1,s1,876 # 800123b0 + 8000204c: 8526 mv a0,s1 + 8000204e: b81fe0ef jal 80000bce + reparent(p); + 80002052: 854e mv a0,s3 + 80002054: f3bff0ef jal 80001f8e + wakeup(p->parent); + 80002058: 0389b503 ld a0,56(s3) + 8000205c: ec9ff0ef jal 80001f24 + acquire(&p->lock); + 80002060: 854e mv a0,s3 + 80002062: b6dfe0ef jal 80000bce + p->xstate = status; + 80002066: 0349a623 sw s4,44(s3) + p->state = ZOMBIE; + 8000206a: 4795 li a5,5 + 8000206c: 00f9ac23 sw a5,24(s3) + release(&wait_lock); + 80002070: 8526 mv a0,s1 + 80002072: bf5fe0ef jal 80000c66 + sched(); + 80002076: d7dff0ef jal 80001df2 + panic("zombie exit"); + 8000207a: 00005517 auipc a0,0x5 + 8000207e: 17650513 addi a0,a0,374 # 800071f0 + 80002082: f5efe0ef jal 800007e0 + +0000000080002086 : +// 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 +kkill(int pid) +{ + 80002086: 7179 addi sp,sp,-48 + 80002088: f406 sd ra,40(sp) + 8000208a: f022 sd s0,32(sp) + 8000208c: ec26 sd s1,24(sp) + 8000208e: e84a sd s2,16(sp) + 80002090: e44e sd s3,8(sp) + 80002092: 1800 addi s0,sp,48 + 80002094: 892a mv s2,a0 + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++){ + 80002096: 00010497 auipc s1,0x10 + 8000209a: 73248493 addi s1,s1,1842 # 800127c8 + 8000209e: 00016997 auipc s3,0x16 + 800020a2: 12a98993 addi s3,s3,298 # 800181c8 + acquire(&p->lock); + 800020a6: 8526 mv a0,s1 + 800020a8: b27fe0ef jal 80000bce + if(p->pid == pid){ + 800020ac: 589c lw a5,48(s1) + 800020ae: 01278b63 beq a5,s2,800020c4 + p->state = RUNNABLE; + } + release(&p->lock); + return 0; + } + release(&p->lock); + 800020b2: 8526 mv a0,s1 + 800020b4: bb3fe0ef jal 80000c66 + for(p = proc; p < &proc[NPROC]; p++){ + 800020b8: 16848493 addi s1,s1,360 + 800020bc: ff3495e3 bne s1,s3,800020a6 + } + return -1; + 800020c0: 557d li a0,-1 + 800020c2: a819 j 800020d8 + p->killed = 1; + 800020c4: 4785 li a5,1 + 800020c6: d49c sw a5,40(s1) + if(p->state == SLEEPING){ + 800020c8: 4c98 lw a4,24(s1) + 800020ca: 4789 li a5,2 + 800020cc: 00f70d63 beq a4,a5,800020e6 + release(&p->lock); + 800020d0: 8526 mv a0,s1 + 800020d2: b95fe0ef jal 80000c66 + return 0; + 800020d6: 4501 li a0,0 +} + 800020d8: 70a2 ld ra,40(sp) + 800020da: 7402 ld s0,32(sp) + 800020dc: 64e2 ld s1,24(sp) + 800020de: 6942 ld s2,16(sp) + 800020e0: 69a2 ld s3,8(sp) + 800020e2: 6145 addi sp,sp,48 + 800020e4: 8082 ret + p->state = RUNNABLE; + 800020e6: 478d li a5,3 + 800020e8: cc9c sw a5,24(s1) + 800020ea: b7dd j 800020d0 + +00000000800020ec : + +void +setkilled(struct proc *p) +{ + 800020ec: 1101 addi sp,sp,-32 + 800020ee: ec06 sd ra,24(sp) + 800020f0: e822 sd s0,16(sp) + 800020f2: e426 sd s1,8(sp) + 800020f4: 1000 addi s0,sp,32 + 800020f6: 84aa mv s1,a0 + acquire(&p->lock); + 800020f8: ad7fe0ef jal 80000bce + p->killed = 1; + 800020fc: 4785 li a5,1 + 800020fe: d49c sw a5,40(s1) + release(&p->lock); + 80002100: 8526 mv a0,s1 + 80002102: b65fe0ef jal 80000c66 +} + 80002106: 60e2 ld ra,24(sp) + 80002108: 6442 ld s0,16(sp) + 8000210a: 64a2 ld s1,8(sp) + 8000210c: 6105 addi sp,sp,32 + 8000210e: 8082 ret + +0000000080002110 : + +int +killed(struct proc *p) +{ + 80002110: 1101 addi sp,sp,-32 + 80002112: ec06 sd ra,24(sp) + 80002114: e822 sd s0,16(sp) + 80002116: e426 sd s1,8(sp) + 80002118: e04a sd s2,0(sp) + 8000211a: 1000 addi s0,sp,32 + 8000211c: 84aa mv s1,a0 + int k; + + acquire(&p->lock); + 8000211e: ab1fe0ef jal 80000bce + k = p->killed; + 80002122: 0284a903 lw s2,40(s1) + release(&p->lock); + 80002126: 8526 mv a0,s1 + 80002128: b3ffe0ef jal 80000c66 + return k; +} + 8000212c: 854a mv a0,s2 + 8000212e: 60e2 ld ra,24(sp) + 80002130: 6442 ld s0,16(sp) + 80002132: 64a2 ld s1,8(sp) + 80002134: 6902 ld s2,0(sp) + 80002136: 6105 addi sp,sp,32 + 80002138: 8082 ret + +000000008000213a : +{ + 8000213a: 715d addi sp,sp,-80 + 8000213c: e486 sd ra,72(sp) + 8000213e: e0a2 sd s0,64(sp) + 80002140: fc26 sd s1,56(sp) + 80002142: f84a sd s2,48(sp) + 80002144: f44e sd s3,40(sp) + 80002146: f052 sd s4,32(sp) + 80002148: ec56 sd s5,24(sp) + 8000214a: e85a sd s6,16(sp) + 8000214c: e45e sd s7,8(sp) + 8000214e: e062 sd s8,0(sp) + 80002150: 0880 addi s0,sp,80 + 80002152: 8b2a mv s6,a0 + struct proc *p = myproc(); + 80002154: f7aff0ef jal 800018ce + 80002158: 892a mv s2,a0 + acquire(&wait_lock); + 8000215a: 00010517 auipc a0,0x10 + 8000215e: 25650513 addi a0,a0,598 # 800123b0 + 80002162: a6dfe0ef jal 80000bce + havekids = 0; + 80002166: 4b81 li s7,0 + if(pp->state == ZOMBIE){ + 80002168: 4a15 li s4,5 + havekids = 1; + 8000216a: 4a85 li s5,1 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 8000216c: 00016997 auipc s3,0x16 + 80002170: 05c98993 addi s3,s3,92 # 800181c8 + sleep(p, &wait_lock); //DOC: wait-sleep + 80002174: 00010c17 auipc s8,0x10 + 80002178: 23cc0c13 addi s8,s8,572 # 800123b0 + 8000217c: a871 j 80002218 + pid = pp->pid; + 8000217e: 0304a983 lw s3,48(s1) + if(addr != 0 && copyout(p->pagetable, addr, (char *)&pp->xstate, + 80002182: 000b0c63 beqz s6,8000219a + 80002186: 4691 li a3,4 + 80002188: 02c48613 addi a2,s1,44 + 8000218c: 85da mv a1,s6 + 8000218e: 05093503 ld a0,80(s2) + 80002192: c50ff0ef jal 800015e2 + 80002196: 02054b63 bltz a0,800021cc + freeproc(pp); + 8000219a: 8526 mv a0,s1 + 8000219c: 903ff0ef jal 80001a9e + release(&pp->lock); + 800021a0: 8526 mv a0,s1 + 800021a2: ac5fe0ef jal 80000c66 + release(&wait_lock); + 800021a6: 00010517 auipc a0,0x10 + 800021aa: 20a50513 addi a0,a0,522 # 800123b0 + 800021ae: ab9fe0ef jal 80000c66 +} + 800021b2: 854e mv a0,s3 + 800021b4: 60a6 ld ra,72(sp) + 800021b6: 6406 ld s0,64(sp) + 800021b8: 74e2 ld s1,56(sp) + 800021ba: 7942 ld s2,48(sp) + 800021bc: 79a2 ld s3,40(sp) + 800021be: 7a02 ld s4,32(sp) + 800021c0: 6ae2 ld s5,24(sp) + 800021c2: 6b42 ld s6,16(sp) + 800021c4: 6ba2 ld s7,8(sp) + 800021c6: 6c02 ld s8,0(sp) + 800021c8: 6161 addi sp,sp,80 + 800021ca: 8082 ret + release(&pp->lock); + 800021cc: 8526 mv a0,s1 + 800021ce: a99fe0ef jal 80000c66 + release(&wait_lock); + 800021d2: 00010517 auipc a0,0x10 + 800021d6: 1de50513 addi a0,a0,478 # 800123b0 + 800021da: a8dfe0ef jal 80000c66 + return -1; + 800021de: 59fd li s3,-1 + 800021e0: bfc9 j 800021b2 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 800021e2: 16848493 addi s1,s1,360 + 800021e6: 03348063 beq s1,s3,80002206 + if(pp->parent == p){ + 800021ea: 7c9c ld a5,56(s1) + 800021ec: ff279be3 bne a5,s2,800021e2 + acquire(&pp->lock); + 800021f0: 8526 mv a0,s1 + 800021f2: 9ddfe0ef jal 80000bce + if(pp->state == ZOMBIE){ + 800021f6: 4c9c lw a5,24(s1) + 800021f8: f94783e3 beq a5,s4,8000217e + release(&pp->lock); + 800021fc: 8526 mv a0,s1 + 800021fe: a69fe0ef jal 80000c66 + havekids = 1; + 80002202: 8756 mv a4,s5 + 80002204: bff9 j 800021e2 + if(!havekids || killed(p)){ + 80002206: cf19 beqz a4,80002224 + 80002208: 854a mv a0,s2 + 8000220a: f07ff0ef jal 80002110 + 8000220e: e919 bnez a0,80002224 + sleep(p, &wait_lock); //DOC: wait-sleep + 80002210: 85e2 mv a1,s8 + 80002212: 854a mv a0,s2 + 80002214: cc5ff0ef jal 80001ed8 + havekids = 0; + 80002218: 875e mv a4,s7 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 8000221a: 00010497 auipc s1,0x10 + 8000221e: 5ae48493 addi s1,s1,1454 # 800127c8 + 80002222: b7e1 j 800021ea + release(&wait_lock); + 80002224: 00010517 auipc a0,0x10 + 80002228: 18c50513 addi a0,a0,396 # 800123b0 + 8000222c: a3bfe0ef jal 80000c66 + return -1; + 80002230: 59fd li s3,-1 + 80002232: b741 j 800021b2 + +0000000080002234 : +// 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) +{ + 80002234: 7179 addi sp,sp,-48 + 80002236: f406 sd ra,40(sp) + 80002238: f022 sd s0,32(sp) + 8000223a: ec26 sd s1,24(sp) + 8000223c: e84a sd s2,16(sp) + 8000223e: e44e sd s3,8(sp) + 80002240: e052 sd s4,0(sp) + 80002242: 1800 addi s0,sp,48 + 80002244: 84aa mv s1,a0 + 80002246: 892e mv s2,a1 + 80002248: 89b2 mv s3,a2 + 8000224a: 8a36 mv s4,a3 + struct proc *p = myproc(); + 8000224c: e82ff0ef jal 800018ce + if(user_dst){ + 80002250: cc99 beqz s1,8000226e + return copyout(p->pagetable, dst, src, len); + 80002252: 86d2 mv a3,s4 + 80002254: 864e mv a2,s3 + 80002256: 85ca mv a1,s2 + 80002258: 6928 ld a0,80(a0) + 8000225a: b88ff0ef jal 800015e2 + } else { + memmove((char *)dst, src, len); + return 0; + } +} + 8000225e: 70a2 ld ra,40(sp) + 80002260: 7402 ld s0,32(sp) + 80002262: 64e2 ld s1,24(sp) + 80002264: 6942 ld s2,16(sp) + 80002266: 69a2 ld s3,8(sp) + 80002268: 6a02 ld s4,0(sp) + 8000226a: 6145 addi sp,sp,48 + 8000226c: 8082 ret + memmove((char *)dst, src, len); + 8000226e: 000a061b sext.w a2,s4 + 80002272: 85ce mv a1,s3 + 80002274: 854a mv a0,s2 + 80002276: a89fe0ef jal 80000cfe + return 0; + 8000227a: 8526 mv a0,s1 + 8000227c: b7cd j 8000225e + +000000008000227e : +// 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) +{ + 8000227e: 7179 addi sp,sp,-48 + 80002280: f406 sd ra,40(sp) + 80002282: f022 sd s0,32(sp) + 80002284: ec26 sd s1,24(sp) + 80002286: e84a sd s2,16(sp) + 80002288: e44e sd s3,8(sp) + 8000228a: e052 sd s4,0(sp) + 8000228c: 1800 addi s0,sp,48 + 8000228e: 892a mv s2,a0 + 80002290: 84ae mv s1,a1 + 80002292: 89b2 mv s3,a2 + 80002294: 8a36 mv s4,a3 + struct proc *p = myproc(); + 80002296: e38ff0ef jal 800018ce + if(user_src){ + 8000229a: cc99 beqz s1,800022b8 + return copyin(p->pagetable, dst, src, len); + 8000229c: 86d2 mv a3,s4 + 8000229e: 864e mv a2,s3 + 800022a0: 85ca mv a1,s2 + 800022a2: 6928 ld a0,80(a0) + 800022a4: c22ff0ef jal 800016c6 + } else { + memmove(dst, (char*)src, len); + return 0; + } +} + 800022a8: 70a2 ld ra,40(sp) + 800022aa: 7402 ld s0,32(sp) + 800022ac: 64e2 ld s1,24(sp) + 800022ae: 6942 ld s2,16(sp) + 800022b0: 69a2 ld s3,8(sp) + 800022b2: 6a02 ld s4,0(sp) + 800022b4: 6145 addi sp,sp,48 + 800022b6: 8082 ret + memmove(dst, (char*)src, len); + 800022b8: 000a061b sext.w a2,s4 + 800022bc: 85ce mv a1,s3 + 800022be: 854a mv a0,s2 + 800022c0: a3ffe0ef jal 80000cfe + return 0; + 800022c4: 8526 mv a0,s1 + 800022c6: b7cd j 800022a8 + +00000000800022c8 : +// 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) +{ + 800022c8: 715d addi sp,sp,-80 + 800022ca: e486 sd ra,72(sp) + 800022cc: e0a2 sd s0,64(sp) + 800022ce: fc26 sd s1,56(sp) + 800022d0: f84a sd s2,48(sp) + 800022d2: f44e sd s3,40(sp) + 800022d4: f052 sd s4,32(sp) + 800022d6: ec56 sd s5,24(sp) + 800022d8: e85a sd s6,16(sp) + 800022da: e45e sd s7,8(sp) + 800022dc: 0880 addi s0,sp,80 + [ZOMBIE] "zombie" + }; + struct proc *p; + char *state; + + printf("\n"); + 800022de: 00005517 auipc a0,0x5 + 800022e2: d9a50513 addi a0,a0,-614 # 80007078 + 800022e6: a14fe0ef jal 800004fa + for(p = proc; p < &proc[NPROC]; p++){ + 800022ea: 00010497 auipc s1,0x10 + 800022ee: 63648493 addi s1,s1,1590 # 80012920 + 800022f2: 00016917 auipc s2,0x16 + 800022f6: 02e90913 addi s2,s2,46 # 80018320 + if(p->state == UNUSED) + continue; + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + 800022fa: 4b15 li s6,5 + state = states[p->state]; + else + state = "???"; + 800022fc: 00005997 auipc s3,0x5 + 80002300: f0498993 addi s3,s3,-252 # 80007200 + printf("%d %s %s", p->pid, state, p->name); + 80002304: 00005a97 auipc s5,0x5 + 80002308: f04a8a93 addi s5,s5,-252 # 80007208 + printf("\n"); + 8000230c: 00005a17 auipc s4,0x5 + 80002310: d6ca0a13 addi s4,s4,-660 # 80007078 + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + 80002314: 00005b97 auipc s7,0x5 + 80002318: 434b8b93 addi s7,s7,1076 # 80007748 + 8000231c: a829 j 80002336 + printf("%d %s %s", p->pid, state, p->name); + 8000231e: ed86a583 lw a1,-296(a3) + 80002322: 8556 mv a0,s5 + 80002324: 9d6fe0ef jal 800004fa + printf("\n"); + 80002328: 8552 mv a0,s4 + 8000232a: 9d0fe0ef jal 800004fa + for(p = proc; p < &proc[NPROC]; p++){ + 8000232e: 16848493 addi s1,s1,360 + 80002332: 03248263 beq s1,s2,80002356 + if(p->state == UNUSED) + 80002336: 86a6 mv a3,s1 + 80002338: ec04a783 lw a5,-320(s1) + 8000233c: dbed beqz a5,8000232e + state = "???"; + 8000233e: 864e mv a2,s3 + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + 80002340: fcfb6fe3 bltu s6,a5,8000231e + 80002344: 02079713 slli a4,a5,0x20 + 80002348: 01d75793 srli a5,a4,0x1d + 8000234c: 97de add a5,a5,s7 + 8000234e: 6390 ld a2,0(a5) + 80002350: f679 bnez a2,8000231e + state = "???"; + 80002352: 864e mv a2,s3 + 80002354: b7e9 j 8000231e + } +} + 80002356: 60a6 ld ra,72(sp) + 80002358: 6406 ld s0,64(sp) + 8000235a: 74e2 ld s1,56(sp) + 8000235c: 7942 ld s2,48(sp) + 8000235e: 79a2 ld s3,40(sp) + 80002360: 7a02 ld s4,32(sp) + 80002362: 6ae2 ld s5,24(sp) + 80002364: 6b42 ld s6,16(sp) + 80002366: 6ba2 ld s7,8(sp) + 80002368: 6161 addi sp,sp,80 + 8000236a: 8082 ret + +000000008000236c : +# Save current registers in old. Load from new. + + +.globl swtch +swtch: + sd ra, 0(a0) + 8000236c: 00153023 sd ra,0(a0) + sd sp, 8(a0) + 80002370: 00253423 sd sp,8(a0) + sd s0, 16(a0) + 80002374: e900 sd s0,16(a0) + sd s1, 24(a0) + 80002376: ed04 sd s1,24(a0) + sd s2, 32(a0) + 80002378: 03253023 sd s2,32(a0) + sd s3, 40(a0) + 8000237c: 03353423 sd s3,40(a0) + sd s4, 48(a0) + 80002380: 03453823 sd s4,48(a0) + sd s5, 56(a0) + 80002384: 03553c23 sd s5,56(a0) + sd s6, 64(a0) + 80002388: 05653023 sd s6,64(a0) + sd s7, 72(a0) + 8000238c: 05753423 sd s7,72(a0) + sd s8, 80(a0) + 80002390: 05853823 sd s8,80(a0) + sd s9, 88(a0) + 80002394: 05953c23 sd s9,88(a0) + sd s10, 96(a0) + 80002398: 07a53023 sd s10,96(a0) + sd s11, 104(a0) + 8000239c: 07b53423 sd s11,104(a0) + + ld ra, 0(a1) + 800023a0: 0005b083 ld ra,0(a1) + ld sp, 8(a1) + 800023a4: 0085b103 ld sp,8(a1) + ld s0, 16(a1) + 800023a8: 6980 ld s0,16(a1) + ld s1, 24(a1) + 800023aa: 6d84 ld s1,24(a1) + ld s2, 32(a1) + 800023ac: 0205b903 ld s2,32(a1) + ld s3, 40(a1) + 800023b0: 0285b983 ld s3,40(a1) + ld s4, 48(a1) + 800023b4: 0305ba03 ld s4,48(a1) + ld s5, 56(a1) + 800023b8: 0385ba83 ld s5,56(a1) + ld s6, 64(a1) + 800023bc: 0405bb03 ld s6,64(a1) + ld s7, 72(a1) + 800023c0: 0485bb83 ld s7,72(a1) + ld s8, 80(a1) + 800023c4: 0505bc03 ld s8,80(a1) + ld s9, 88(a1) + 800023c8: 0585bc83 ld s9,88(a1) + ld s10, 96(a1) + 800023cc: 0605bd03 ld s10,96(a1) + ld s11, 104(a1) + 800023d0: 0685bd83 ld s11,104(a1) + + ret + 800023d4: 8082 ret + +00000000800023d6 : + +extern int devintr(); + +void +trapinit(void) +{ + 800023d6: 1141 addi sp,sp,-16 + 800023d8: e406 sd ra,8(sp) + 800023da: e022 sd s0,0(sp) + 800023dc: 0800 addi s0,sp,16 + initlock(&tickslock, "time"); + 800023de: 00005597 auipc a1,0x5 + 800023e2: e6a58593 addi a1,a1,-406 # 80007248 + 800023e6: 00016517 auipc a0,0x16 + 800023ea: de250513 addi a0,a0,-542 # 800181c8 + 800023ee: f60fe0ef jal 80000b4e +} + 800023f2: 60a2 ld ra,8(sp) + 800023f4: 6402 ld s0,0(sp) + 800023f6: 0141 addi sp,sp,16 + 800023f8: 8082 ret + +00000000800023fa : + +// set up to take exceptions and traps while in the kernel. +void +trapinithart(void) +{ + 800023fa: 1141 addi sp,sp,-16 + 800023fc: e422 sd s0,8(sp) + 800023fe: 0800 addi s0,sp,16 + asm volatile("csrw stvec, %0" : : "r" (x)); + 80002400: 00003797 auipc a5,0x3 + 80002404: 06078793 addi a5,a5,96 # 80005460 + 80002408: 10579073 csrw stvec,a5 + w_stvec((uint64)kernelvec); +} + 8000240c: 6422 ld s0,8(sp) + 8000240e: 0141 addi sp,sp,16 + 80002410: 8082 ret + +0000000080002412 : +// +// set up trapframe and control registers for a return to user space +// +void +prepare_return(void) +{ + 80002412: 1141 addi sp,sp,-16 + 80002414: e406 sd ra,8(sp) + 80002416: e022 sd s0,0(sp) + 80002418: 0800 addi s0,sp,16 + struct proc *p = myproc(); + 8000241a: cb4ff0ef jal 800018ce + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 8000241e: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() & ~SSTATUS_SIE); + 80002422: 9bf5 andi a5,a5,-3 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80002424: 10079073 csrw sstatus,a5 + // kerneltrap() to usertrap(). because a trap from kernel + // code to usertrap would be a disaster, turn off interrupts. + intr_off(); + + // send syscalls, interrupts, and exceptions to uservec in trampoline.S + uint64 trampoline_uservec = TRAMPOLINE + (uservec - trampoline); + 80002428: 04000737 lui a4,0x4000 + 8000242c: 177d addi a4,a4,-1 # 3ffffff <_entry-0x7c000001> + 8000242e: 0732 slli a4,a4,0xc + 80002430: 00004797 auipc a5,0x4 + 80002434: bd078793 addi a5,a5,-1072 # 80006000 <_trampoline> + 80002438: 00004697 auipc a3,0x4 + 8000243c: bc868693 addi a3,a3,-1080 # 80006000 <_trampoline> + 80002440: 8f95 sub a5,a5,a3 + 80002442: 97ba add a5,a5,a4 + asm volatile("csrw stvec, %0" : : "r" (x)); + 80002444: 10579073 csrw stvec,a5 + w_stvec(trampoline_uservec); + + // set up trapframe values that uservec will need when + // the process next traps into the kernel. + p->trapframe->kernel_satp = r_satp(); // kernel page table + 80002448: 6d3c ld a5,88(a0) + asm volatile("csrr %0, satp" : "=r" (x) ); + 8000244a: 18002773 csrr a4,satp + 8000244e: e398 sd a4,0(a5) + p->trapframe->kernel_sp = p->kstack + PGSIZE; // process's kernel stack + 80002450: 6d38 ld a4,88(a0) + 80002452: 613c ld a5,64(a0) + 80002454: 6685 lui a3,0x1 + 80002456: 97b6 add a5,a5,a3 + 80002458: e71c sd a5,8(a4) + p->trapframe->kernel_trap = (uint64)usertrap; + 8000245a: 6d3c ld a5,88(a0) + 8000245c: 00000717 auipc a4,0x0 + 80002460: 0f870713 addi a4,a4,248 # 80002554 + 80002464: eb98 sd a4,16(a5) + p->trapframe->kernel_hartid = r_tp(); // hartid for cpuid() + 80002466: 6d3c ld a5,88(a0) + asm volatile("mv %0, tp" : "=r" (x) ); + 80002468: 8712 mv a4,tp + 8000246a: f398 sd a4,32(a5) + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 8000246c: 100027f3 csrr a5,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 + 80002470: eff7f793 andi a5,a5,-257 + x |= SSTATUS_SPIE; // enable interrupts in user mode + 80002474: 0207e793 ori a5,a5,32 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80002478: 10079073 csrw sstatus,a5 + w_sstatus(x); + + // set S Exception Program Counter to the saved user pc. + w_sepc(p->trapframe->epc); + 8000247c: 6d3c ld a5,88(a0) + asm volatile("csrw sepc, %0" : : "r" (x)); + 8000247e: 6f9c ld a5,24(a5) + 80002480: 14179073 csrw sepc,a5 +} + 80002484: 60a2 ld ra,8(sp) + 80002486: 6402 ld s0,0(sp) + 80002488: 0141 addi sp,sp,16 + 8000248a: 8082 ret + +000000008000248c : + w_sstatus(sstatus); +} + +void +clockintr() +{ + 8000248c: 1101 addi sp,sp,-32 + 8000248e: ec06 sd ra,24(sp) + 80002490: e822 sd s0,16(sp) + 80002492: 1000 addi s0,sp,32 + if(cpuid() == 0){ + 80002494: c0eff0ef jal 800018a2 + 80002498: cd11 beqz a0,800024b4 + asm volatile("csrr %0, time" : "=r" (x) ); + 8000249a: c01027f3 rdtime a5 + } + + // ask for the next timer interrupt. this also clears + // the interrupt request. 1000000 is about a tenth + // of a second. + w_stimecmp(r_time() + 1000000); + 8000249e: 000f4737 lui a4,0xf4 + 800024a2: 24070713 addi a4,a4,576 # f4240 <_entry-0x7ff0bdc0> + 800024a6: 97ba add a5,a5,a4 + asm volatile("csrw 0x14d, %0" : : "r" (x)); + 800024a8: 14d79073 csrw stimecmp,a5 +} + 800024ac: 60e2 ld ra,24(sp) + 800024ae: 6442 ld s0,16(sp) + 800024b0: 6105 addi sp,sp,32 + 800024b2: 8082 ret + 800024b4: e426 sd s1,8(sp) + acquire(&tickslock); + 800024b6: 00016497 auipc s1,0x16 + 800024ba: d1248493 addi s1,s1,-750 # 800181c8 + 800024be: 8526 mv a0,s1 + 800024c0: f0efe0ef jal 80000bce + ticks++; + 800024c4: 00008517 auipc a0,0x8 + 800024c8: dd450513 addi a0,a0,-556 # 8000a298 + 800024cc: 411c lw a5,0(a0) + 800024ce: 2785 addiw a5,a5,1 + 800024d0: c11c sw a5,0(a0) + wakeup(&ticks); + 800024d2: a53ff0ef jal 80001f24 + release(&tickslock); + 800024d6: 8526 mv a0,s1 + 800024d8: f8efe0ef jal 80000c66 + 800024dc: 64a2 ld s1,8(sp) + 800024de: bf75 j 8000249a + +00000000800024e0 : +// returns 2 if timer interrupt, +// 1 if other device, +// 0 if not recognized. +int +devintr() +{ + 800024e0: 1101 addi sp,sp,-32 + 800024e2: ec06 sd ra,24(sp) + 800024e4: e822 sd s0,16(sp) + 800024e6: 1000 addi s0,sp,32 + asm volatile("csrr %0, scause" : "=r" (x) ); + 800024e8: 14202773 csrr a4,scause + uint64 scause = r_scause(); + + if(scause == 0x8000000000000009L){ + 800024ec: 57fd li a5,-1 + 800024ee: 17fe slli a5,a5,0x3f + 800024f0: 07a5 addi a5,a5,9 + 800024f2: 00f70c63 beq a4,a5,8000250a + // now allowed to interrupt again. + if(irq) + plic_complete(irq); + + return 1; + } else if(scause == 0x8000000000000005L){ + 800024f6: 57fd li a5,-1 + 800024f8: 17fe slli a5,a5,0x3f + 800024fa: 0795 addi a5,a5,5 + // timer interrupt. + clockintr(); + return 2; + } else { + return 0; + 800024fc: 4501 li a0,0 + } else if(scause == 0x8000000000000005L){ + 800024fe: 04f70763 beq a4,a5,8000254c + } +} + 80002502: 60e2 ld ra,24(sp) + 80002504: 6442 ld s0,16(sp) + 80002506: 6105 addi sp,sp,32 + 80002508: 8082 ret + 8000250a: e426 sd s1,8(sp) + int irq = plic_claim(); + 8000250c: 000030ef jal 8000550c + 80002510: 84aa mv s1,a0 + if(irq == UART0_IRQ){ + 80002512: 47a9 li a5,10 + 80002514: 00f50963 beq a0,a5,80002526 + } else if(irq == VIRTIO0_IRQ){ + 80002518: 4785 li a5,1 + 8000251a: 00f50963 beq a0,a5,8000252c + return 1; + 8000251e: 4505 li a0,1 + } else if(irq){ + 80002520: e889 bnez s1,80002532 + 80002522: 64a2 ld s1,8(sp) + 80002524: bff9 j 80002502 + uartintr(); + 80002526: c8afe0ef jal 800009b0 + if(irq) + 8000252a: a819 j 80002540 + virtio_disk_intr(); + 8000252c: 4a6030ef jal 800059d2 + if(irq) + 80002530: a801 j 80002540 + printf("unexpected interrupt irq=%d\n", irq); + 80002532: 85a6 mv a1,s1 + 80002534: 00005517 auipc a0,0x5 + 80002538: d1c50513 addi a0,a0,-740 # 80007250 + 8000253c: fbffd0ef jal 800004fa + plic_complete(irq); + 80002540: 8526 mv a0,s1 + 80002542: 7eb020ef jal 8000552c + return 1; + 80002546: 4505 li a0,1 + 80002548: 64a2 ld s1,8(sp) + 8000254a: bf65 j 80002502 + clockintr(); + 8000254c: f41ff0ef jal 8000248c + return 2; + 80002550: 4509 li a0,2 + 80002552: bf45 j 80002502 + +0000000080002554 : +{ + 80002554: 1101 addi sp,sp,-32 + 80002556: ec06 sd ra,24(sp) + 80002558: e822 sd s0,16(sp) + 8000255a: e426 sd s1,8(sp) + 8000255c: e04a sd s2,0(sp) + 8000255e: 1000 addi s0,sp,32 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80002560: 100027f3 csrr a5,sstatus + if((r_sstatus() & SSTATUS_SPP) != 0) + 80002564: 1007f793 andi a5,a5,256 + 80002568: eba5 bnez a5,800025d8 + asm volatile("csrw stvec, %0" : : "r" (x)); + 8000256a: 00003797 auipc a5,0x3 + 8000256e: ef678793 addi a5,a5,-266 # 80005460 + 80002572: 10579073 csrw stvec,a5 + struct proc *p = myproc(); + 80002576: b58ff0ef jal 800018ce + 8000257a: 84aa mv s1,a0 + p->trapframe->epc = r_sepc(); + 8000257c: 6d3c ld a5,88(a0) + asm volatile("csrr %0, sepc" : "=r" (x) ); + 8000257e: 14102773 csrr a4,sepc + 80002582: ef98 sd a4,24(a5) + asm volatile("csrr %0, scause" : "=r" (x) ); + 80002584: 14202773 csrr a4,scause + if(r_scause() == 8){ + 80002588: 47a1 li a5,8 + 8000258a: 04f70d63 beq a4,a5,800025e4 + } else if((which_dev = devintr()) != 0){ + 8000258e: f53ff0ef jal 800024e0 + 80002592: 892a mv s2,a0 + 80002594: e945 bnez a0,80002644 + 80002596: 14202773 csrr a4,scause + } else if((r_scause() == 15 || r_scause() == 13) && + 8000259a: 47bd li a5,15 + 8000259c: 08f70863 beq a4,a5,8000262c + 800025a0: 14202773 csrr a4,scause + 800025a4: 47b5 li a5,13 + 800025a6: 08f70363 beq a4,a5,8000262c + 800025aa: 142025f3 csrr a1,scause + printf("usertrap(): unexpected scause 0x%lx pid=%d\n", r_scause(), p->pid); + 800025ae: 5890 lw a2,48(s1) + 800025b0: 00005517 auipc a0,0x5 + 800025b4: ce050513 addi a0,a0,-800 # 80007290 + 800025b8: f43fd0ef jal 800004fa + asm volatile("csrr %0, sepc" : "=r" (x) ); + 800025bc: 141025f3 csrr a1,sepc + asm volatile("csrr %0, stval" : "=r" (x) ); + 800025c0: 14302673 csrr a2,stval + printf(" sepc=0x%lx stval=0x%lx\n", r_sepc(), r_stval()); + 800025c4: 00005517 auipc a0,0x5 + 800025c8: cfc50513 addi a0,a0,-772 # 800072c0 + 800025cc: f2ffd0ef jal 800004fa + setkilled(p); + 800025d0: 8526 mv a0,s1 + 800025d2: b1bff0ef jal 800020ec + 800025d6: a035 j 80002602 + panic("usertrap: not from user mode"); + 800025d8: 00005517 auipc a0,0x5 + 800025dc: c9850513 addi a0,a0,-872 # 80007270 + 800025e0: a00fe0ef jal 800007e0 + if(killed(p)) + 800025e4: b2dff0ef jal 80002110 + 800025e8: ed15 bnez a0,80002624 + p->trapframe->epc += 4; + 800025ea: 6cb8 ld a4,88(s1) + 800025ec: 6f1c ld a5,24(a4) + 800025ee: 0791 addi a5,a5,4 + 800025f0: ef1c sd a5,24(a4) + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 800025f2: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 800025f6: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 800025fa: 10079073 csrw sstatus,a5 + syscall(); + 800025fe: 246000ef jal 80002844 + if(killed(p)) + 80002602: 8526 mv a0,s1 + 80002604: b0dff0ef jal 80002110 + 80002608: e139 bnez a0,8000264e + prepare_return(); + 8000260a: e09ff0ef jal 80002412 + uint64 satp = MAKE_SATP(p->pagetable); + 8000260e: 68a8 ld a0,80(s1) + 80002610: 8131 srli a0,a0,0xc + 80002612: 57fd li a5,-1 + 80002614: 17fe slli a5,a5,0x3f + 80002616: 8d5d or a0,a0,a5 +} + 80002618: 60e2 ld ra,24(sp) + 8000261a: 6442 ld s0,16(sp) + 8000261c: 64a2 ld s1,8(sp) + 8000261e: 6902 ld s2,0(sp) + 80002620: 6105 addi sp,sp,32 + 80002622: 8082 ret + kexit(-1); + 80002624: 557d li a0,-1 + 80002626: 9bfff0ef jal 80001fe4 + 8000262a: b7c1 j 800025ea + asm volatile("csrr %0, stval" : "=r" (x) ); + 8000262c: 143025f3 csrr a1,stval + asm volatile("csrr %0, scause" : "=r" (x) ); + 80002630: 14202673 csrr a2,scause + vmfault(p->pagetable, r_stval(), (r_scause() == 13)? 1 : 0) != 0) { + 80002634: 164d addi a2,a2,-13 # ff3 <_entry-0x7ffff00d> + 80002636: 00163613 seqz a2,a2 + 8000263a: 68a8 ld a0,80(s1) + 8000263c: f25fe0ef jal 80001560 + } else if((r_scause() == 15 || r_scause() == 13) && + 80002640: f169 bnez a0,80002602 + 80002642: b7a5 j 800025aa + if(killed(p)) + 80002644: 8526 mv a0,s1 + 80002646: acbff0ef jal 80002110 + 8000264a: c511 beqz a0,80002656 + 8000264c: a011 j 80002650 + 8000264e: 4901 li s2,0 + kexit(-1); + 80002650: 557d li a0,-1 + 80002652: 993ff0ef jal 80001fe4 + if(which_dev == 2) + 80002656: 4789 li a5,2 + 80002658: faf919e3 bne s2,a5,8000260a + yield(); + 8000265c: 851ff0ef jal 80001eac + 80002660: b76d j 8000260a + +0000000080002662 : +{ + 80002662: 7179 addi sp,sp,-48 + 80002664: f406 sd ra,40(sp) + 80002666: f022 sd s0,32(sp) + 80002668: ec26 sd s1,24(sp) + 8000266a: e84a sd s2,16(sp) + 8000266c: e44e sd s3,8(sp) + 8000266e: 1800 addi s0,sp,48 + asm volatile("csrr %0, sepc" : "=r" (x) ); + 80002670: 14102973 csrr s2,sepc + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80002674: 100024f3 csrr s1,sstatus + asm volatile("csrr %0, scause" : "=r" (x) ); + 80002678: 142029f3 csrr s3,scause + if((sstatus & SSTATUS_SPP) == 0) + 8000267c: 1004f793 andi a5,s1,256 + 80002680: c795 beqz a5,800026ac + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80002682: 100027f3 csrr a5,sstatus + return (x & SSTATUS_SIE) != 0; + 80002686: 8b89 andi a5,a5,2 + if(intr_get() != 0) + 80002688: eb85 bnez a5,800026b8 + if((which_dev = devintr()) == 0){ + 8000268a: e57ff0ef jal 800024e0 + 8000268e: c91d beqz a0,800026c4 + if(which_dev == 2 && myproc() != 0) + 80002690: 4789 li a5,2 + 80002692: 04f50a63 beq a0,a5,800026e6 + asm volatile("csrw sepc, %0" : : "r" (x)); + 80002696: 14191073 csrw sepc,s2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 8000269a: 10049073 csrw sstatus,s1 +} + 8000269e: 70a2 ld ra,40(sp) + 800026a0: 7402 ld s0,32(sp) + 800026a2: 64e2 ld s1,24(sp) + 800026a4: 6942 ld s2,16(sp) + 800026a6: 69a2 ld s3,8(sp) + 800026a8: 6145 addi sp,sp,48 + 800026aa: 8082 ret + panic("kerneltrap: not from supervisor mode"); + 800026ac: 00005517 auipc a0,0x5 + 800026b0: c3c50513 addi a0,a0,-964 # 800072e8 + 800026b4: 92cfe0ef jal 800007e0 + panic("kerneltrap: interrupts enabled"); + 800026b8: 00005517 auipc a0,0x5 + 800026bc: c5850513 addi a0,a0,-936 # 80007310 + 800026c0: 920fe0ef jal 800007e0 + asm volatile("csrr %0, sepc" : "=r" (x) ); + 800026c4: 14102673 csrr a2,sepc + asm volatile("csrr %0, stval" : "=r" (x) ); + 800026c8: 143026f3 csrr a3,stval + printf("scause=0x%lx sepc=0x%lx stval=0x%lx\n", scause, r_sepc(), r_stval()); + 800026cc: 85ce mv a1,s3 + 800026ce: 00005517 auipc a0,0x5 + 800026d2: c6250513 addi a0,a0,-926 # 80007330 + 800026d6: e25fd0ef jal 800004fa + panic("kerneltrap"); + 800026da: 00005517 auipc a0,0x5 + 800026de: c7e50513 addi a0,a0,-898 # 80007358 + 800026e2: 8fefe0ef jal 800007e0 + if(which_dev == 2 && myproc() != 0) + 800026e6: 9e8ff0ef jal 800018ce + 800026ea: d555 beqz a0,80002696 + yield(); + 800026ec: fc0ff0ef jal 80001eac + 800026f0: b75d j 80002696 + +00000000800026f2 : + return strlen(buf); +} + +static uint64 +argraw(int n) +{ + 800026f2: 1101 addi sp,sp,-32 + 800026f4: ec06 sd ra,24(sp) + 800026f6: e822 sd s0,16(sp) + 800026f8: e426 sd s1,8(sp) + 800026fa: 1000 addi s0,sp,32 + 800026fc: 84aa mv s1,a0 + struct proc *p = myproc(); + 800026fe: 9d0ff0ef jal 800018ce + switch (n) { + 80002702: 4795 li a5,5 + 80002704: 0497e163 bltu a5,s1,80002746 + 80002708: 048a slli s1,s1,0x2 + 8000270a: 00005717 auipc a4,0x5 + 8000270e: 06e70713 addi a4,a4,110 # 80007778 + 80002712: 94ba add s1,s1,a4 + 80002714: 409c lw a5,0(s1) + 80002716: 97ba add a5,a5,a4 + 80002718: 8782 jr a5 + case 0: + return p->trapframe->a0; + 8000271a: 6d3c ld a5,88(a0) + 8000271c: 7ba8 ld a0,112(a5) + case 5: + return p->trapframe->a5; + } + panic("argraw"); + return -1; +} + 8000271e: 60e2 ld ra,24(sp) + 80002720: 6442 ld s0,16(sp) + 80002722: 64a2 ld s1,8(sp) + 80002724: 6105 addi sp,sp,32 + 80002726: 8082 ret + return p->trapframe->a1; + 80002728: 6d3c ld a5,88(a0) + 8000272a: 7fa8 ld a0,120(a5) + 8000272c: bfcd j 8000271e + return p->trapframe->a2; + 8000272e: 6d3c ld a5,88(a0) + 80002730: 63c8 ld a0,128(a5) + 80002732: b7f5 j 8000271e + return p->trapframe->a3; + 80002734: 6d3c ld a5,88(a0) + 80002736: 67c8 ld a0,136(a5) + 80002738: b7dd j 8000271e + return p->trapframe->a4; + 8000273a: 6d3c ld a5,88(a0) + 8000273c: 6bc8 ld a0,144(a5) + 8000273e: b7c5 j 8000271e + return p->trapframe->a5; + 80002740: 6d3c ld a5,88(a0) + 80002742: 6fc8 ld a0,152(a5) + 80002744: bfe9 j 8000271e + panic("argraw"); + 80002746: 00005517 auipc a0,0x5 + 8000274a: c2250513 addi a0,a0,-990 # 80007368 + 8000274e: 892fe0ef jal 800007e0 + +0000000080002752 : +{ + 80002752: 1101 addi sp,sp,-32 + 80002754: ec06 sd ra,24(sp) + 80002756: e822 sd s0,16(sp) + 80002758: e426 sd s1,8(sp) + 8000275a: e04a sd s2,0(sp) + 8000275c: 1000 addi s0,sp,32 + 8000275e: 84aa mv s1,a0 + 80002760: 892e mv s2,a1 + struct proc *p = myproc(); + 80002762: 96cff0ef jal 800018ce + if(addr >= p->sz || addr+sizeof(uint64) > p->sz) // both tests needed, in case of overflow + 80002766: 653c ld a5,72(a0) + 80002768: 02f4f663 bgeu s1,a5,80002794 + 8000276c: 00848713 addi a4,s1,8 + 80002770: 02e7e463 bltu a5,a4,80002798 + if(copyin(p->pagetable, (char *)ip, addr, sizeof(*ip)) != 0) + 80002774: 46a1 li a3,8 + 80002776: 8626 mv a2,s1 + 80002778: 85ca mv a1,s2 + 8000277a: 6928 ld a0,80(a0) + 8000277c: f4bfe0ef jal 800016c6 + 80002780: 00a03533 snez a0,a0 + 80002784: 40a00533 neg a0,a0 +} + 80002788: 60e2 ld ra,24(sp) + 8000278a: 6442 ld s0,16(sp) + 8000278c: 64a2 ld s1,8(sp) + 8000278e: 6902 ld s2,0(sp) + 80002790: 6105 addi sp,sp,32 + 80002792: 8082 ret + return -1; + 80002794: 557d li a0,-1 + 80002796: bfcd j 80002788 + 80002798: 557d li a0,-1 + 8000279a: b7fd j 80002788 + +000000008000279c : +{ + 8000279c: 7179 addi sp,sp,-48 + 8000279e: f406 sd ra,40(sp) + 800027a0: f022 sd s0,32(sp) + 800027a2: ec26 sd s1,24(sp) + 800027a4: e84a sd s2,16(sp) + 800027a6: e44e sd s3,8(sp) + 800027a8: 1800 addi s0,sp,48 + 800027aa: 892a mv s2,a0 + 800027ac: 84ae mv s1,a1 + 800027ae: 89b2 mv s3,a2 + struct proc *p = myproc(); + 800027b0: 91eff0ef jal 800018ce + if(copyinstr(p->pagetable, buf, addr, max) < 0) + 800027b4: 86ce mv a3,s3 + 800027b6: 864a mv a2,s2 + 800027b8: 85a6 mv a1,s1 + 800027ba: 6928 ld a0,80(a0) + 800027bc: ccdfe0ef jal 80001488 + 800027c0: 00054c63 bltz a0,800027d8 + return strlen(buf); + 800027c4: 8526 mv a0,s1 + 800027c6: e4cfe0ef jal 80000e12 +} + 800027ca: 70a2 ld ra,40(sp) + 800027cc: 7402 ld s0,32(sp) + 800027ce: 64e2 ld s1,24(sp) + 800027d0: 6942 ld s2,16(sp) + 800027d2: 69a2 ld s3,8(sp) + 800027d4: 6145 addi sp,sp,48 + 800027d6: 8082 ret + return -1; + 800027d8: 557d li a0,-1 + 800027da: bfc5 j 800027ca + +00000000800027dc : + +// Fetch the nth 32-bit system call argument. +void +argint(int n, int *ip) +{ + 800027dc: 1101 addi sp,sp,-32 + 800027de: ec06 sd ra,24(sp) + 800027e0: e822 sd s0,16(sp) + 800027e2: e426 sd s1,8(sp) + 800027e4: 1000 addi s0,sp,32 + 800027e6: 84ae mv s1,a1 + *ip = argraw(n); + 800027e8: f0bff0ef jal 800026f2 + 800027ec: c088 sw a0,0(s1) +} + 800027ee: 60e2 ld ra,24(sp) + 800027f0: 6442 ld s0,16(sp) + 800027f2: 64a2 ld s1,8(sp) + 800027f4: 6105 addi sp,sp,32 + 800027f6: 8082 ret + +00000000800027f8 : +// Retrieve an argument as a pointer. +// Doesn't check for legality, since +// copyin/copyout will do that. +void +argaddr(int n, uint64 *ip) +{ + 800027f8: 1101 addi sp,sp,-32 + 800027fa: ec06 sd ra,24(sp) + 800027fc: e822 sd s0,16(sp) + 800027fe: e426 sd s1,8(sp) + 80002800: 1000 addi s0,sp,32 + 80002802: 84ae mv s1,a1 + *ip = argraw(n); + 80002804: eefff0ef jal 800026f2 + 80002808: e088 sd a0,0(s1) +} + 8000280a: 60e2 ld ra,24(sp) + 8000280c: 6442 ld s0,16(sp) + 8000280e: 64a2 ld s1,8(sp) + 80002810: 6105 addi sp,sp,32 + 80002812: 8082 ret + +0000000080002814 : +// Fetch the nth word-sized system call argument as a null-terminated string. +// Copies into buf, at most max. +// Returns string length if OK (including nul), -1 if error. +int +argstr(int n, char *buf, int max) +{ + 80002814: 7179 addi sp,sp,-48 + 80002816: f406 sd ra,40(sp) + 80002818: f022 sd s0,32(sp) + 8000281a: ec26 sd s1,24(sp) + 8000281c: e84a sd s2,16(sp) + 8000281e: 1800 addi s0,sp,48 + 80002820: 84ae mv s1,a1 + 80002822: 8932 mv s2,a2 + uint64 addr; + argaddr(n, &addr); + 80002824: fd840593 addi a1,s0,-40 + 80002828: fd1ff0ef jal 800027f8 + return fetchstr(addr, buf, max); + 8000282c: 864a mv a2,s2 + 8000282e: 85a6 mv a1,s1 + 80002830: fd843503 ld a0,-40(s0) + 80002834: f69ff0ef jal 8000279c +} + 80002838: 70a2 ld ra,40(sp) + 8000283a: 7402 ld s0,32(sp) + 8000283c: 64e2 ld s1,24(sp) + 8000283e: 6942 ld s2,16(sp) + 80002840: 6145 addi sp,sp,48 + 80002842: 8082 ret + +0000000080002844 : +[SYS_sleep2] sys_sleep2, +}; + +void +syscall(void) +{ + 80002844: 1101 addi sp,sp,-32 + 80002846: ec06 sd ra,24(sp) + 80002848: e822 sd s0,16(sp) + 8000284a: e426 sd s1,8(sp) + 8000284c: e04a sd s2,0(sp) + 8000284e: 1000 addi s0,sp,32 + int num; + struct proc *p = myproc(); + 80002850: 87eff0ef jal 800018ce + 80002854: 84aa mv s1,a0 + + num = p->trapframe->a7; + 80002856: 05853903 ld s2,88(a0) + 8000285a: 0a893783 ld a5,168(s2) + 8000285e: 0007869b sext.w a3,a5 + if(num > 0 && num < NELEM(syscalls) && syscalls[num]) { + 80002862: 37fd addiw a5,a5,-1 + 80002864: 475d li a4,23 + 80002866: 00f76f63 bltu a4,a5,80002884 + 8000286a: 00369713 slli a4,a3,0x3 + 8000286e: 00005797 auipc a5,0x5 + 80002872: f2278793 addi a5,a5,-222 # 80007790 + 80002876: 97ba add a5,a5,a4 + 80002878: 639c ld a5,0(a5) + 8000287a: c789 beqz a5,80002884 + // Use num to lookup the system call function for num, call it, + // and store its return value in p->trapframe->a0 + p->trapframe->a0 = syscalls[num](); + 8000287c: 9782 jalr a5 + 8000287e: 06a93823 sd a0,112(s2) + 80002882: a829 j 8000289c + } else { + printf("%d %s: unknown sys call %d\n", + 80002884: 15848613 addi a2,s1,344 + 80002888: 588c lw a1,48(s1) + 8000288a: 00005517 auipc a0,0x5 + 8000288e: ae650513 addi a0,a0,-1306 # 80007370 + 80002892: c69fd0ef jal 800004fa + p->pid, p->name, num); + p->trapframe->a0 = -1; + 80002896: 6cbc ld a5,88(s1) + 80002898: 577d li a4,-1 + 8000289a: fbb8 sd a4,112(a5) + } +} + 8000289c: 60e2 ld ra,24(sp) + 8000289e: 6442 ld s0,16(sp) + 800028a0: 64a2 ld s1,8(sp) + 800028a2: 6902 ld s2,0(sp) + 800028a4: 6105 addi sp,sp,32 + 800028a6: 8082 ret + +00000000800028a8 : +#include "spinlock.h" +#include "proc.h" +#include "vm.h" +uint64 +sys_exit(void) +{ + 800028a8: 1101 addi sp,sp,-32 + 800028aa: ec06 sd ra,24(sp) + 800028ac: e822 sd s0,16(sp) + 800028ae: 1000 addi s0,sp,32 + int n; + argint(0, &n); + 800028b0: fec40593 addi a1,s0,-20 + 800028b4: 4501 li a0,0 + 800028b6: f27ff0ef jal 800027dc + kexit(n); + 800028ba: fec42503 lw a0,-20(s0) + 800028be: f26ff0ef jal 80001fe4 + return 0; // not reached +} + 800028c2: 4501 li a0,0 + 800028c4: 60e2 ld ra,24(sp) + 800028c6: 6442 ld s0,16(sp) + 800028c8: 6105 addi sp,sp,32 + 800028ca: 8082 ret + +00000000800028cc : + +uint64 +sys_getpid(void) +{ + 800028cc: 1141 addi sp,sp,-16 + 800028ce: e406 sd ra,8(sp) + 800028d0: e022 sd s0,0(sp) + 800028d2: 0800 addi s0,sp,16 + return myproc()->pid; + 800028d4: ffbfe0ef jal 800018ce +} + 800028d8: 5908 lw a0,48(a0) + 800028da: 60a2 ld ra,8(sp) + 800028dc: 6402 ld s0,0(sp) + 800028de: 0141 addi sp,sp,16 + 800028e0: 8082 ret + +00000000800028e2 : + +uint64 +sys_fork(void) +{ + 800028e2: 1141 addi sp,sp,-16 + 800028e4: e406 sd ra,8(sp) + 800028e6: e022 sd s0,0(sp) + 800028e8: 0800 addi s0,sp,16 + return kfork(); + 800028ea: b48ff0ef jal 80001c32 +} + 800028ee: 60a2 ld ra,8(sp) + 800028f0: 6402 ld s0,0(sp) + 800028f2: 0141 addi sp,sp,16 + 800028f4: 8082 ret + +00000000800028f6 : + +uint64 +sys_wait(void) +{ + 800028f6: 1101 addi sp,sp,-32 + 800028f8: ec06 sd ra,24(sp) + 800028fa: e822 sd s0,16(sp) + 800028fc: 1000 addi s0,sp,32 + uint64 p; + argaddr(0, &p); + 800028fe: fe840593 addi a1,s0,-24 + 80002902: 4501 li a0,0 + 80002904: ef5ff0ef jal 800027f8 + return kwait(p); + 80002908: fe843503 ld a0,-24(s0) + 8000290c: 82fff0ef jal 8000213a +} + 80002910: 60e2 ld ra,24(sp) + 80002912: 6442 ld s0,16(sp) + 80002914: 6105 addi sp,sp,32 + 80002916: 8082 ret + +0000000080002918 : + +uint64 +sys_sbrk(void) +{ + 80002918: 7179 addi sp,sp,-48 + 8000291a: f406 sd ra,40(sp) + 8000291c: f022 sd s0,32(sp) + 8000291e: ec26 sd s1,24(sp) + 80002920: 1800 addi s0,sp,48 + uint64 addr; + int t; + int n; + + argint(0, &n); + 80002922: fd840593 addi a1,s0,-40 + 80002926: 4501 li a0,0 + 80002928: eb5ff0ef jal 800027dc + argint(1, &t); + 8000292c: fdc40593 addi a1,s0,-36 + 80002930: 4505 li a0,1 + 80002932: eabff0ef jal 800027dc + addr = myproc()->sz; + 80002936: f99fe0ef jal 800018ce + 8000293a: 6524 ld s1,72(a0) + + if(t == SBRK_EAGER || n < 0) { + 8000293c: fdc42703 lw a4,-36(s0) + 80002940: 4785 li a5,1 + 80002942: 02f70763 beq a4,a5,80002970 + 80002946: fd842783 lw a5,-40(s0) + 8000294a: 0207c363 bltz a5,80002970 + } + } else { + // Lazily allocate memory for this process: increase its memory + // size but don't allocate memory. If the processes uses the + // memory, vmfault() will allocate it. + if(addr + n < addr) + 8000294e: 97a6 add a5,a5,s1 + 80002950: 0297ee63 bltu a5,s1,8000298c + return -1; + if(addr + n > TRAPFRAME) + 80002954: 02000737 lui a4,0x2000 + 80002958: 177d addi a4,a4,-1 # 1ffffff <_entry-0x7e000001> + 8000295a: 0736 slli a4,a4,0xd + 8000295c: 02f76a63 bltu a4,a5,80002990 + return -1; + myproc()->sz += n; + 80002960: f6ffe0ef jal 800018ce + 80002964: fd842703 lw a4,-40(s0) + 80002968: 653c ld a5,72(a0) + 8000296a: 97ba add a5,a5,a4 + 8000296c: e53c sd a5,72(a0) + 8000296e: a039 j 8000297c + if(growproc(n) < 0) { + 80002970: fd842503 lw a0,-40(s0) + 80002974: a5cff0ef jal 80001bd0 + 80002978: 00054863 bltz a0,80002988 + } + return addr; +} + 8000297c: 8526 mv a0,s1 + 8000297e: 70a2 ld ra,40(sp) + 80002980: 7402 ld s0,32(sp) + 80002982: 64e2 ld s1,24(sp) + 80002984: 6145 addi sp,sp,48 + 80002986: 8082 ret + return -1; + 80002988: 54fd li s1,-1 + 8000298a: bfcd j 8000297c + return -1; + 8000298c: 54fd li s1,-1 + 8000298e: b7fd j 8000297c + return -1; + 80002990: 54fd li s1,-1 + 80002992: b7ed j 8000297c + +0000000080002994 : + +uint64 +sys_pause(void) +{ + 80002994: 7139 addi sp,sp,-64 + 80002996: fc06 sd ra,56(sp) + 80002998: f822 sd s0,48(sp) + 8000299a: f04a sd s2,32(sp) + 8000299c: 0080 addi s0,sp,64 + int n; + uint ticks0; + + argint(0, &n); + 8000299e: fcc40593 addi a1,s0,-52 + 800029a2: 4501 li a0,0 + 800029a4: e39ff0ef jal 800027dc + if(n < 0) + 800029a8: fcc42783 lw a5,-52(s0) + 800029ac: 0607c763 bltz a5,80002a1a + n = 0; + acquire(&tickslock); + 800029b0: 00016517 auipc a0,0x16 + 800029b4: 81850513 addi a0,a0,-2024 # 800181c8 + 800029b8: a16fe0ef jal 80000bce + ticks0 = ticks; + 800029bc: 00008917 auipc s2,0x8 + 800029c0: 8dc92903 lw s2,-1828(s2) # 8000a298 + while(ticks - ticks0 < n){ + 800029c4: fcc42783 lw a5,-52(s0) + 800029c8: cf8d beqz a5,80002a02 + 800029ca: f426 sd s1,40(sp) + 800029cc: ec4e sd s3,24(sp) + if(killed(myproc())){ + release(&tickslock); + return -1; + } + sleep(&ticks, &tickslock); + 800029ce: 00015997 auipc s3,0x15 + 800029d2: 7fa98993 addi s3,s3,2042 # 800181c8 + 800029d6: 00008497 auipc s1,0x8 + 800029da: 8c248493 addi s1,s1,-1854 # 8000a298 + if(killed(myproc())){ + 800029de: ef1fe0ef jal 800018ce + 800029e2: f2eff0ef jal 80002110 + 800029e6: ed0d bnez a0,80002a20 + sleep(&ticks, &tickslock); + 800029e8: 85ce mv a1,s3 + 800029ea: 8526 mv a0,s1 + 800029ec: cecff0ef jal 80001ed8 + while(ticks - ticks0 < n){ + 800029f0: 409c lw a5,0(s1) + 800029f2: 412787bb subw a5,a5,s2 + 800029f6: fcc42703 lw a4,-52(s0) + 800029fa: fee7e2e3 bltu a5,a4,800029de + 800029fe: 74a2 ld s1,40(sp) + 80002a00: 69e2 ld s3,24(sp) + } + release(&tickslock); + 80002a02: 00015517 auipc a0,0x15 + 80002a06: 7c650513 addi a0,a0,1990 # 800181c8 + 80002a0a: a5cfe0ef jal 80000c66 + return 0; + 80002a0e: 4501 li a0,0 +} + 80002a10: 70e2 ld ra,56(sp) + 80002a12: 7442 ld s0,48(sp) + 80002a14: 7902 ld s2,32(sp) + 80002a16: 6121 addi sp,sp,64 + 80002a18: 8082 ret + n = 0; + 80002a1a: fc042623 sw zero,-52(s0) + 80002a1e: bf49 j 800029b0 + release(&tickslock); + 80002a20: 00015517 auipc a0,0x15 + 80002a24: 7a850513 addi a0,a0,1960 # 800181c8 + 80002a28: a3efe0ef jal 80000c66 + return -1; + 80002a2c: 557d li a0,-1 + 80002a2e: 74a2 ld s1,40(sp) + 80002a30: 69e2 ld s3,24(sp) + 80002a32: bff9 j 80002a10 + +0000000080002a34 : + +uint64 +sys_kill(void) +{ + 80002a34: 1101 addi sp,sp,-32 + 80002a36: ec06 sd ra,24(sp) + 80002a38: e822 sd s0,16(sp) + 80002a3a: 1000 addi s0,sp,32 + int pid; + + argint(0, &pid); + 80002a3c: fec40593 addi a1,s0,-20 + 80002a40: 4501 li a0,0 + 80002a42: d9bff0ef jal 800027dc + return kkill(pid); + 80002a46: fec42503 lw a0,-20(s0) + 80002a4a: e3cff0ef jal 80002086 +} + 80002a4e: 60e2 ld ra,24(sp) + 80002a50: 6442 ld s0,16(sp) + 80002a52: 6105 addi sp,sp,32 + 80002a54: 8082 ret + +0000000080002a56 : + +// return how many clock tick interrupts have occurred +// since start. +uint64 +sys_uptime(void) +{ + 80002a56: 1101 addi sp,sp,-32 + 80002a58: ec06 sd ra,24(sp) + 80002a5a: e822 sd s0,16(sp) + 80002a5c: e426 sd s1,8(sp) + 80002a5e: 1000 addi s0,sp,32 + uint xticks; + + acquire(&tickslock); + 80002a60: 00015517 auipc a0,0x15 + 80002a64: 76850513 addi a0,a0,1896 # 800181c8 + 80002a68: 966fe0ef jal 80000bce + xticks = ticks; + 80002a6c: 00008497 auipc s1,0x8 + 80002a70: 82c4a483 lw s1,-2004(s1) # 8000a298 + release(&tickslock); + 80002a74: 00015517 auipc a0,0x15 + 80002a78: 75450513 addi a0,a0,1876 # 800181c8 + 80002a7c: 9eafe0ef jal 80000c66 + return xticks; +} + 80002a80: 02049513 slli a0,s1,0x20 + 80002a84: 9101 srli a0,a0,0x20 + 80002a86: 60e2 ld ra,24(sp) + 80002a88: 6442 ld s0,16(sp) + 80002a8a: 64a2 ld s1,8(sp) + 80002a8c: 6105 addi sp,sp,32 + 80002a8e: 8082 ret + +0000000080002a90 : + +extern struct proc proc[NPROC]; + +uint64 +sys_getprocsinfo(void) +{ + 80002a90: 7179 addi sp,sp,-48 + 80002a92: f406 sd ra,40(sp) + 80002a94: f022 sd s0,32(sp) + 80002a96: ec26 sd s1,24(sp) + 80002a98: e84a sd s2,16(sp) + 80002a9a: e44e sd s3,8(sp) + 80002a9c: 1800 addi s0,sp,48 + struct proc *p; + + printf("PID\tSTATE\tSIZE\n"); + 80002a9e: 00005517 auipc a0,0x5 + 80002aa2: 8f250513 addi a0,a0,-1806 # 80007390 + 80002aa6: a55fd0ef jal 800004fa + + for(p = proc; p < &proc[NPROC]; p++){ + 80002aaa: 00010497 auipc s1,0x10 + 80002aae: d1e48493 addi s1,s1,-738 # 800127c8 + if(p->state != UNUSED){ + printf("%d\t%d\t%ld\n", p->pid, p->state, p->sz); + 80002ab2: 00005997 auipc s3,0x5 + 80002ab6: 8ee98993 addi s3,s3,-1810 # 800073a0 + for(p = proc; p < &proc[NPROC]; p++){ + 80002aba: 00015917 auipc s2,0x15 + 80002abe: 70e90913 addi s2,s2,1806 # 800181c8 + 80002ac2: a029 j 80002acc + 80002ac4: 16848493 addi s1,s1,360 + 80002ac8: 01248a63 beq s1,s2,80002adc + if(p->state != UNUSED){ + 80002acc: 4c90 lw a2,24(s1) + 80002ace: da7d beqz a2,80002ac4 + printf("%d\t%d\t%ld\n", p->pid, p->state, p->sz); + 80002ad0: 64b4 ld a3,72(s1) + 80002ad2: 588c lw a1,48(s1) + 80002ad4: 854e mv a0,s3 + 80002ad6: a25fd0ef jal 800004fa + 80002ada: b7ed j 80002ac4 + } + } + + return 0; +} + 80002adc: 4501 li a0,0 + 80002ade: 70a2 ld ra,40(sp) + 80002ae0: 7402 ld s0,32(sp) + 80002ae2: 64e2 ld s1,24(sp) + 80002ae4: 6942 ld s2,16(sp) + 80002ae6: 69a2 ld s3,8(sp) + 80002ae8: 6145 addi sp,sp,48 + 80002aea: 8082 ret + +0000000080002aec : +uint64 +sys_getppid(void) +{ + 80002aec: 1141 addi sp,sp,-16 + 80002aee: e406 sd ra,8(sp) + 80002af0: e022 sd s0,0(sp) + 80002af2: 0800 addi s0,sp,16 + struct proc *p = myproc(); + 80002af4: ddbfe0ef jal 800018ce + if(p->parent) + 80002af8: 7d1c ld a5,56(a0) + return p->parent->pid; + return -1; + 80002afa: 557d li a0,-1 + if(p->parent) + 80002afc: c391 beqz a5,80002b00 + return p->parent->pid; + 80002afe: 5b88 lw a0,48(a5) +} + 80002b00: 60a2 ld ra,8(sp) + 80002b02: 6402 ld s0,0(sp) + 80002b04: 0141 addi sp,sp,16 + 80002b06: 8082 ret + +0000000080002b08 : +uint64 +sys_sleep2(void) +{ + 80002b08: 7139 addi sp,sp,-64 + 80002b0a: fc06 sd ra,56(sp) + 80002b0c: f822 sd s0,48(sp) + 80002b0e: f04a sd s2,32(sp) + 80002b10: ec4e sd s3,24(sp) + 80002b12: 0080 addi s0,sp,64 + int n; + argint(0, &n); + 80002b14: fcc40593 addi a1,s0,-52 + 80002b18: 4501 li a0,0 + 80002b1a: cc3ff0ef jal 800027dc + + struct proc *p = myproc(); + 80002b1e: db1fe0ef jal 800018ce + 80002b22: 892a mv s2,a0 + + acquire(&tickslock); + 80002b24: 00015517 auipc a0,0x15 + 80002b28: 6a450513 addi a0,a0,1700 # 800181c8 + 80002b2c: 8a2fe0ef jal 80000bce + uint ticks0 = ticks; + 80002b30: 00007997 auipc s3,0x7 + 80002b34: 7689a983 lw s3,1896(s3) # 8000a298 + + while(ticks - ticks0 < n){ + 80002b38: fcc42783 lw a5,-52(s0) + 80002b3c: cb9d beqz a5,80002b72 + 80002b3e: f426 sd s1,40(sp) + 80002b40: e852 sd s4,16(sp) + if(p->killed){ + release(&tickslock); + return -1; + } + sleep(&ticks, &tickslock); + 80002b42: 00015a17 auipc s4,0x15 + 80002b46: 686a0a13 addi s4,s4,1670 # 800181c8 + 80002b4a: 00007497 auipc s1,0x7 + 80002b4e: 74e48493 addi s1,s1,1870 # 8000a298 + if(p->killed){ + 80002b52: 02892783 lw a5,40(s2) + 80002b56: eb9d bnez a5,80002b8c + sleep(&ticks, &tickslock); + 80002b58: 85d2 mv a1,s4 + 80002b5a: 8526 mv a0,s1 + 80002b5c: b7cff0ef jal 80001ed8 + while(ticks - ticks0 < n){ + 80002b60: 409c lw a5,0(s1) + 80002b62: 413787bb subw a5,a5,s3 + 80002b66: fcc42703 lw a4,-52(s0) + 80002b6a: fee7e4e3 bltu a5,a4,80002b52 + 80002b6e: 74a2 ld s1,40(sp) + 80002b70: 6a42 ld s4,16(sp) + } + + release(&tickslock); + 80002b72: 00015517 auipc a0,0x15 + 80002b76: 65650513 addi a0,a0,1622 # 800181c8 + 80002b7a: 8ecfe0ef jal 80000c66 + return 0; + 80002b7e: 4501 li a0,0 +} + 80002b80: 70e2 ld ra,56(sp) + 80002b82: 7442 ld s0,48(sp) + 80002b84: 7902 ld s2,32(sp) + 80002b86: 69e2 ld s3,24(sp) + 80002b88: 6121 addi sp,sp,64 + 80002b8a: 8082 ret + release(&tickslock); + 80002b8c: 00015517 auipc a0,0x15 + 80002b90: 63c50513 addi a0,a0,1596 # 800181c8 + 80002b94: 8d2fe0ef jal 80000c66 + return -1; + 80002b98: 557d li a0,-1 + 80002b9a: 74a2 ld s1,40(sp) + 80002b9c: 6a42 ld s4,16(sp) + 80002b9e: b7cd j 80002b80 + +0000000080002ba0 : + struct buf head; +} bcache; + +void +binit(void) +{ + 80002ba0: 7179 addi sp,sp,-48 + 80002ba2: f406 sd ra,40(sp) + 80002ba4: f022 sd s0,32(sp) + 80002ba6: ec26 sd s1,24(sp) + 80002ba8: e84a sd s2,16(sp) + 80002baa: e44e sd s3,8(sp) + 80002bac: e052 sd s4,0(sp) + 80002bae: 1800 addi s0,sp,48 + struct buf *b; + + initlock(&bcache.lock, "bcache"); + 80002bb0: 00005597 auipc a1,0x5 + 80002bb4: 80058593 addi a1,a1,-2048 # 800073b0 + 80002bb8: 00015517 auipc a0,0x15 + 80002bbc: 62850513 addi a0,a0,1576 # 800181e0 + 80002bc0: f8ffd0ef jal 80000b4e + + // Create linked list of buffers + bcache.head.prev = &bcache.head; + 80002bc4: 0001d797 auipc a5,0x1d + 80002bc8: 61c78793 addi a5,a5,1564 # 800201e0 + 80002bcc: 0001e717 auipc a4,0x1e + 80002bd0: 87c70713 addi a4,a4,-1924 # 80020448 + 80002bd4: 2ae7b823 sd a4,688(a5) + bcache.head.next = &bcache.head; + 80002bd8: 2ae7bc23 sd a4,696(a5) + for(b = bcache.buf; b < bcache.buf+NBUF; b++){ + 80002bdc: 00015497 auipc s1,0x15 + 80002be0: 61c48493 addi s1,s1,1564 # 800181f8 + b->next = bcache.head.next; + 80002be4: 893e mv s2,a5 + b->prev = &bcache.head; + 80002be6: 89ba mv s3,a4 + initsleeplock(&b->lock, "buffer"); + 80002be8: 00004a17 auipc s4,0x4 + 80002bec: 7d0a0a13 addi s4,s4,2000 # 800073b8 + b->next = bcache.head.next; + 80002bf0: 2b893783 ld a5,696(s2) + 80002bf4: e8bc sd a5,80(s1) + b->prev = &bcache.head; + 80002bf6: 0534b423 sd s3,72(s1) + initsleeplock(&b->lock, "buffer"); + 80002bfa: 85d2 mv a1,s4 + 80002bfc: 01048513 addi a0,s1,16 + 80002c00: 322010ef jal 80003f22 + bcache.head.next->prev = b; + 80002c04: 2b893783 ld a5,696(s2) + 80002c08: e7a4 sd s1,72(a5) + bcache.head.next = b; + 80002c0a: 2a993c23 sd s1,696(s2) + for(b = bcache.buf; b < bcache.buf+NBUF; b++){ + 80002c0e: 45848493 addi s1,s1,1112 + 80002c12: fd349fe3 bne s1,s3,80002bf0 + } +} + 80002c16: 70a2 ld ra,40(sp) + 80002c18: 7402 ld s0,32(sp) + 80002c1a: 64e2 ld s1,24(sp) + 80002c1c: 6942 ld s2,16(sp) + 80002c1e: 69a2 ld s3,8(sp) + 80002c20: 6a02 ld s4,0(sp) + 80002c22: 6145 addi sp,sp,48 + 80002c24: 8082 ret + +0000000080002c26 : +} + +// Return a locked buf with the contents of the indicated block. +struct buf* +bread(uint dev, uint blockno) +{ + 80002c26: 7179 addi sp,sp,-48 + 80002c28: f406 sd ra,40(sp) + 80002c2a: f022 sd s0,32(sp) + 80002c2c: ec26 sd s1,24(sp) + 80002c2e: e84a sd s2,16(sp) + 80002c30: e44e sd s3,8(sp) + 80002c32: 1800 addi s0,sp,48 + 80002c34: 892a mv s2,a0 + 80002c36: 89ae mv s3,a1 + acquire(&bcache.lock); + 80002c38: 00015517 auipc a0,0x15 + 80002c3c: 5a850513 addi a0,a0,1448 # 800181e0 + 80002c40: f8ffd0ef jal 80000bce + for(b = bcache.head.next; b != &bcache.head; b = b->next){ + 80002c44: 0001e497 auipc s1,0x1e + 80002c48: 8544b483 ld s1,-1964(s1) # 80020498 + 80002c4c: 0001d797 auipc a5,0x1d + 80002c50: 7fc78793 addi a5,a5,2044 # 80020448 + 80002c54: 02f48b63 beq s1,a5,80002c8a + 80002c58: 873e mv a4,a5 + 80002c5a: a021 j 80002c62 + 80002c5c: 68a4 ld s1,80(s1) + 80002c5e: 02e48663 beq s1,a4,80002c8a + if(b->dev == dev && b->blockno == blockno){ + 80002c62: 449c lw a5,8(s1) + 80002c64: ff279ce3 bne a5,s2,80002c5c + 80002c68: 44dc lw a5,12(s1) + 80002c6a: ff3799e3 bne a5,s3,80002c5c + b->refcnt++; + 80002c6e: 40bc lw a5,64(s1) + 80002c70: 2785 addiw a5,a5,1 + 80002c72: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002c74: 00015517 auipc a0,0x15 + 80002c78: 56c50513 addi a0,a0,1388 # 800181e0 + 80002c7c: febfd0ef jal 80000c66 + acquiresleep(&b->lock); + 80002c80: 01048513 addi a0,s1,16 + 80002c84: 2d4010ef jal 80003f58 + return b; + 80002c88: a889 j 80002cda + for(b = bcache.head.prev; b != &bcache.head; b = b->prev){ + 80002c8a: 0001e497 auipc s1,0x1e + 80002c8e: 8064b483 ld s1,-2042(s1) # 80020490 + 80002c92: 0001d797 auipc a5,0x1d + 80002c96: 7b678793 addi a5,a5,1974 # 80020448 + 80002c9a: 00f48863 beq s1,a5,80002caa + 80002c9e: 873e mv a4,a5 + if(b->refcnt == 0) { + 80002ca0: 40bc lw a5,64(s1) + 80002ca2: cb91 beqz a5,80002cb6 + for(b = bcache.head.prev; b != &bcache.head; b = b->prev){ + 80002ca4: 64a4 ld s1,72(s1) + 80002ca6: fee49de3 bne s1,a4,80002ca0 + panic("bget: no buffers"); + 80002caa: 00004517 auipc a0,0x4 + 80002cae: 71650513 addi a0,a0,1814 # 800073c0 + 80002cb2: b2ffd0ef jal 800007e0 + b->dev = dev; + 80002cb6: 0124a423 sw s2,8(s1) + b->blockno = blockno; + 80002cba: 0134a623 sw s3,12(s1) + b->valid = 0; + 80002cbe: 0004a023 sw zero,0(s1) + b->refcnt = 1; + 80002cc2: 4785 li a5,1 + 80002cc4: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002cc6: 00015517 auipc a0,0x15 + 80002cca: 51a50513 addi a0,a0,1306 # 800181e0 + 80002cce: f99fd0ef jal 80000c66 + acquiresleep(&b->lock); + 80002cd2: 01048513 addi a0,s1,16 + 80002cd6: 282010ef jal 80003f58 + struct buf *b; + + b = bget(dev, blockno); + if(!b->valid) { + 80002cda: 409c lw a5,0(s1) + 80002cdc: cb89 beqz a5,80002cee + virtio_disk_rw(b, 0); + b->valid = 1; + } + return b; +} + 80002cde: 8526 mv a0,s1 + 80002ce0: 70a2 ld ra,40(sp) + 80002ce2: 7402 ld s0,32(sp) + 80002ce4: 64e2 ld s1,24(sp) + 80002ce6: 6942 ld s2,16(sp) + 80002ce8: 69a2 ld s3,8(sp) + 80002cea: 6145 addi sp,sp,48 + 80002cec: 8082 ret + virtio_disk_rw(b, 0); + 80002cee: 4581 li a1,0 + 80002cf0: 8526 mv a0,s1 + 80002cf2: 2cf020ef jal 800057c0 + b->valid = 1; + 80002cf6: 4785 li a5,1 + 80002cf8: c09c sw a5,0(s1) + return b; + 80002cfa: b7d5 j 80002cde + +0000000080002cfc : + +// Write b's contents to disk. Must be locked. +void +bwrite(struct buf *b) +{ + 80002cfc: 1101 addi sp,sp,-32 + 80002cfe: ec06 sd ra,24(sp) + 80002d00: e822 sd s0,16(sp) + 80002d02: e426 sd s1,8(sp) + 80002d04: 1000 addi s0,sp,32 + 80002d06: 84aa mv s1,a0 + if(!holdingsleep(&b->lock)) + 80002d08: 0541 addi a0,a0,16 + 80002d0a: 2cc010ef jal 80003fd6 + 80002d0e: c911 beqz a0,80002d22 + panic("bwrite"); + virtio_disk_rw(b, 1); + 80002d10: 4585 li a1,1 + 80002d12: 8526 mv a0,s1 + 80002d14: 2ad020ef jal 800057c0 +} + 80002d18: 60e2 ld ra,24(sp) + 80002d1a: 6442 ld s0,16(sp) + 80002d1c: 64a2 ld s1,8(sp) + 80002d1e: 6105 addi sp,sp,32 + 80002d20: 8082 ret + panic("bwrite"); + 80002d22: 00004517 auipc a0,0x4 + 80002d26: 6b650513 addi a0,a0,1718 # 800073d8 + 80002d2a: ab7fd0ef jal 800007e0 + +0000000080002d2e : + +// Release a locked buffer. +// Move to the head of the most-recently-used list. +void +brelse(struct buf *b) +{ + 80002d2e: 1101 addi sp,sp,-32 + 80002d30: ec06 sd ra,24(sp) + 80002d32: e822 sd s0,16(sp) + 80002d34: e426 sd s1,8(sp) + 80002d36: e04a sd s2,0(sp) + 80002d38: 1000 addi s0,sp,32 + 80002d3a: 84aa mv s1,a0 + if(!holdingsleep(&b->lock)) + 80002d3c: 01050913 addi s2,a0,16 + 80002d40: 854a mv a0,s2 + 80002d42: 294010ef jal 80003fd6 + 80002d46: c135 beqz a0,80002daa + panic("brelse"); + + releasesleep(&b->lock); + 80002d48: 854a mv a0,s2 + 80002d4a: 254010ef jal 80003f9e + + acquire(&bcache.lock); + 80002d4e: 00015517 auipc a0,0x15 + 80002d52: 49250513 addi a0,a0,1170 # 800181e0 + 80002d56: e79fd0ef jal 80000bce + b->refcnt--; + 80002d5a: 40bc lw a5,64(s1) + 80002d5c: 37fd addiw a5,a5,-1 + 80002d5e: 0007871b sext.w a4,a5 + 80002d62: c0bc sw a5,64(s1) + if (b->refcnt == 0) { + 80002d64: e71d bnez a4,80002d92 + // no one is waiting for it. + b->next->prev = b->prev; + 80002d66: 68b8 ld a4,80(s1) + 80002d68: 64bc ld a5,72(s1) + 80002d6a: e73c sd a5,72(a4) + b->prev->next = b->next; + 80002d6c: 68b8 ld a4,80(s1) + 80002d6e: ebb8 sd a4,80(a5) + b->next = bcache.head.next; + 80002d70: 0001d797 auipc a5,0x1d + 80002d74: 47078793 addi a5,a5,1136 # 800201e0 + 80002d78: 2b87b703 ld a4,696(a5) + 80002d7c: e8b8 sd a4,80(s1) + b->prev = &bcache.head; + 80002d7e: 0001d717 auipc a4,0x1d + 80002d82: 6ca70713 addi a4,a4,1738 # 80020448 + 80002d86: e4b8 sd a4,72(s1) + bcache.head.next->prev = b; + 80002d88: 2b87b703 ld a4,696(a5) + 80002d8c: e724 sd s1,72(a4) + bcache.head.next = b; + 80002d8e: 2a97bc23 sd s1,696(a5) + } + + release(&bcache.lock); + 80002d92: 00015517 auipc a0,0x15 + 80002d96: 44e50513 addi a0,a0,1102 # 800181e0 + 80002d9a: ecdfd0ef jal 80000c66 +} + 80002d9e: 60e2 ld ra,24(sp) + 80002da0: 6442 ld s0,16(sp) + 80002da2: 64a2 ld s1,8(sp) + 80002da4: 6902 ld s2,0(sp) + 80002da6: 6105 addi sp,sp,32 + 80002da8: 8082 ret + panic("brelse"); + 80002daa: 00004517 auipc a0,0x4 + 80002dae: 63650513 addi a0,a0,1590 # 800073e0 + 80002db2: a2ffd0ef jal 800007e0 + +0000000080002db6 : + +void +bpin(struct buf *b) { + 80002db6: 1101 addi sp,sp,-32 + 80002db8: ec06 sd ra,24(sp) + 80002dba: e822 sd s0,16(sp) + 80002dbc: e426 sd s1,8(sp) + 80002dbe: 1000 addi s0,sp,32 + 80002dc0: 84aa mv s1,a0 + acquire(&bcache.lock); + 80002dc2: 00015517 auipc a0,0x15 + 80002dc6: 41e50513 addi a0,a0,1054 # 800181e0 + 80002dca: e05fd0ef jal 80000bce + b->refcnt++; + 80002dce: 40bc lw a5,64(s1) + 80002dd0: 2785 addiw a5,a5,1 + 80002dd2: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002dd4: 00015517 auipc a0,0x15 + 80002dd8: 40c50513 addi a0,a0,1036 # 800181e0 + 80002ddc: e8bfd0ef jal 80000c66 +} + 80002de0: 60e2 ld ra,24(sp) + 80002de2: 6442 ld s0,16(sp) + 80002de4: 64a2 ld s1,8(sp) + 80002de6: 6105 addi sp,sp,32 + 80002de8: 8082 ret + +0000000080002dea : + +void +bunpin(struct buf *b) { + 80002dea: 1101 addi sp,sp,-32 + 80002dec: ec06 sd ra,24(sp) + 80002dee: e822 sd s0,16(sp) + 80002df0: e426 sd s1,8(sp) + 80002df2: 1000 addi s0,sp,32 + 80002df4: 84aa mv s1,a0 + acquire(&bcache.lock); + 80002df6: 00015517 auipc a0,0x15 + 80002dfa: 3ea50513 addi a0,a0,1002 # 800181e0 + 80002dfe: dd1fd0ef jal 80000bce + b->refcnt--; + 80002e02: 40bc lw a5,64(s1) + 80002e04: 37fd addiw a5,a5,-1 + 80002e06: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002e08: 00015517 auipc a0,0x15 + 80002e0c: 3d850513 addi a0,a0,984 # 800181e0 + 80002e10: e57fd0ef jal 80000c66 +} + 80002e14: 60e2 ld ra,24(sp) + 80002e16: 6442 ld s0,16(sp) + 80002e18: 64a2 ld s1,8(sp) + 80002e1a: 6105 addi sp,sp,32 + 80002e1c: 8082 ret + +0000000080002e1e : +} + +// Free a disk block. +static void +bfree(int dev, uint b) +{ + 80002e1e: 1101 addi sp,sp,-32 + 80002e20: ec06 sd ra,24(sp) + 80002e22: e822 sd s0,16(sp) + 80002e24: e426 sd s1,8(sp) + 80002e26: e04a sd s2,0(sp) + 80002e28: 1000 addi s0,sp,32 + 80002e2a: 84ae mv s1,a1 + struct buf *bp; + int bi, m; + + bp = bread(dev, BBLOCK(b, sb)); + 80002e2c: 00d5d59b srliw a1,a1,0xd + 80002e30: 0001e797 auipc a5,0x1e + 80002e34: a8c7a783 lw a5,-1396(a5) # 800208bc + 80002e38: 9dbd addw a1,a1,a5 + 80002e3a: dedff0ef jal 80002c26 + bi = b % BPB; + m = 1 << (bi % 8); + 80002e3e: 0074f713 andi a4,s1,7 + 80002e42: 4785 li a5,1 + 80002e44: 00e797bb sllw a5,a5,a4 + if((bp->data[bi/8] & m) == 0) + 80002e48: 14ce slli s1,s1,0x33 + 80002e4a: 90d9 srli s1,s1,0x36 + 80002e4c: 00950733 add a4,a0,s1 + 80002e50: 05874703 lbu a4,88(a4) + 80002e54: 00e7f6b3 and a3,a5,a4 + 80002e58: c29d beqz a3,80002e7e + 80002e5a: 892a mv s2,a0 + panic("freeing free block"); + bp->data[bi/8] &= ~m; + 80002e5c: 94aa add s1,s1,a0 + 80002e5e: fff7c793 not a5,a5 + 80002e62: 8f7d and a4,a4,a5 + 80002e64: 04e48c23 sb a4,88(s1) + log_write(bp); + 80002e68: 7f9000ef jal 80003e60 + brelse(bp); + 80002e6c: 854a mv a0,s2 + 80002e6e: ec1ff0ef jal 80002d2e +} + 80002e72: 60e2 ld ra,24(sp) + 80002e74: 6442 ld s0,16(sp) + 80002e76: 64a2 ld s1,8(sp) + 80002e78: 6902 ld s2,0(sp) + 80002e7a: 6105 addi sp,sp,32 + 80002e7c: 8082 ret + panic("freeing free block"); + 80002e7e: 00004517 auipc a0,0x4 + 80002e82: 56a50513 addi a0,a0,1386 # 800073e8 + 80002e86: 95bfd0ef jal 800007e0 + +0000000080002e8a : +{ + 80002e8a: 711d addi sp,sp,-96 + 80002e8c: ec86 sd ra,88(sp) + 80002e8e: e8a2 sd s0,80(sp) + 80002e90: e4a6 sd s1,72(sp) + 80002e92: 1080 addi s0,sp,96 + for(b = 0; b < sb.size; b += BPB){ + 80002e94: 0001e797 auipc a5,0x1e + 80002e98: a107a783 lw a5,-1520(a5) # 800208a4 + 80002e9c: 0e078f63 beqz a5,80002f9a + 80002ea0: e0ca sd s2,64(sp) + 80002ea2: fc4e sd s3,56(sp) + 80002ea4: f852 sd s4,48(sp) + 80002ea6: f456 sd s5,40(sp) + 80002ea8: f05a sd s6,32(sp) + 80002eaa: ec5e sd s7,24(sp) + 80002eac: e862 sd s8,16(sp) + 80002eae: e466 sd s9,8(sp) + 80002eb0: 8baa mv s7,a0 + 80002eb2: 4a81 li s5,0 + bp = bread(dev, BBLOCK(b, sb)); + 80002eb4: 0001eb17 auipc s6,0x1e + 80002eb8: 9ecb0b13 addi s6,s6,-1556 # 800208a0 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002ebc: 4c01 li s8,0 + m = 1 << (bi % 8); + 80002ebe: 4985 li s3,1 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002ec0: 6a09 lui s4,0x2 + for(b = 0; b < sb.size; b += BPB){ + 80002ec2: 6c89 lui s9,0x2 + 80002ec4: a0b5 j 80002f30 + bp->data[bi/8] |= m; // Mark block in use. + 80002ec6: 97ca add a5,a5,s2 + 80002ec8: 8e55 or a2,a2,a3 + 80002eca: 04c78c23 sb a2,88(a5) + log_write(bp); + 80002ece: 854a mv a0,s2 + 80002ed0: 791000ef jal 80003e60 + brelse(bp); + 80002ed4: 854a mv a0,s2 + 80002ed6: e59ff0ef jal 80002d2e + bp = bread(dev, bno); + 80002eda: 85a6 mv a1,s1 + 80002edc: 855e mv a0,s7 + 80002ede: d49ff0ef jal 80002c26 + 80002ee2: 892a mv s2,a0 + memset(bp->data, 0, BSIZE); + 80002ee4: 40000613 li a2,1024 + 80002ee8: 4581 li a1,0 + 80002eea: 05850513 addi a0,a0,88 + 80002eee: db5fd0ef jal 80000ca2 + log_write(bp); + 80002ef2: 854a mv a0,s2 + 80002ef4: 76d000ef jal 80003e60 + brelse(bp); + 80002ef8: 854a mv a0,s2 + 80002efa: e35ff0ef jal 80002d2e +} + 80002efe: 6906 ld s2,64(sp) + 80002f00: 79e2 ld s3,56(sp) + 80002f02: 7a42 ld s4,48(sp) + 80002f04: 7aa2 ld s5,40(sp) + 80002f06: 7b02 ld s6,32(sp) + 80002f08: 6be2 ld s7,24(sp) + 80002f0a: 6c42 ld s8,16(sp) + 80002f0c: 6ca2 ld s9,8(sp) +} + 80002f0e: 8526 mv a0,s1 + 80002f10: 60e6 ld ra,88(sp) + 80002f12: 6446 ld s0,80(sp) + 80002f14: 64a6 ld s1,72(sp) + 80002f16: 6125 addi sp,sp,96 + 80002f18: 8082 ret + brelse(bp); + 80002f1a: 854a mv a0,s2 + 80002f1c: e13ff0ef jal 80002d2e + for(b = 0; b < sb.size; b += BPB){ + 80002f20: 015c87bb addw a5,s9,s5 + 80002f24: 00078a9b sext.w s5,a5 + 80002f28: 004b2703 lw a4,4(s6) + 80002f2c: 04eaff63 bgeu s5,a4,80002f8a + bp = bread(dev, BBLOCK(b, sb)); + 80002f30: 41fad79b sraiw a5,s5,0x1f + 80002f34: 0137d79b srliw a5,a5,0x13 + 80002f38: 015787bb addw a5,a5,s5 + 80002f3c: 40d7d79b sraiw a5,a5,0xd + 80002f40: 01cb2583 lw a1,28(s6) + 80002f44: 9dbd addw a1,a1,a5 + 80002f46: 855e mv a0,s7 + 80002f48: cdfff0ef jal 80002c26 + 80002f4c: 892a mv s2,a0 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002f4e: 004b2503 lw a0,4(s6) + 80002f52: 000a849b sext.w s1,s5 + 80002f56: 8762 mv a4,s8 + 80002f58: fca4f1e3 bgeu s1,a0,80002f1a + m = 1 << (bi % 8); + 80002f5c: 00777693 andi a3,a4,7 + 80002f60: 00d996bb sllw a3,s3,a3 + if((bp->data[bi/8] & m) == 0){ // Is block free? + 80002f64: 41f7579b sraiw a5,a4,0x1f + 80002f68: 01d7d79b srliw a5,a5,0x1d + 80002f6c: 9fb9 addw a5,a5,a4 + 80002f6e: 4037d79b sraiw a5,a5,0x3 + 80002f72: 00f90633 add a2,s2,a5 + 80002f76: 05864603 lbu a2,88(a2) + 80002f7a: 00c6f5b3 and a1,a3,a2 + 80002f7e: d5a1 beqz a1,80002ec6 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002f80: 2705 addiw a4,a4,1 + 80002f82: 2485 addiw s1,s1,1 + 80002f84: fd471ae3 bne a4,s4,80002f58 + 80002f88: bf49 j 80002f1a + 80002f8a: 6906 ld s2,64(sp) + 80002f8c: 79e2 ld s3,56(sp) + 80002f8e: 7a42 ld s4,48(sp) + 80002f90: 7aa2 ld s5,40(sp) + 80002f92: 7b02 ld s6,32(sp) + 80002f94: 6be2 ld s7,24(sp) + 80002f96: 6c42 ld s8,16(sp) + 80002f98: 6ca2 ld s9,8(sp) + printf("balloc: out of blocks\n"); + 80002f9a: 00004517 auipc a0,0x4 + 80002f9e: 46650513 addi a0,a0,1126 # 80007400 + 80002fa2: d58fd0ef jal 800004fa + return 0; + 80002fa6: 4481 li s1,0 + 80002fa8: b79d j 80002f0e + +0000000080002faa : +// Return the disk block address of the nth block in inode ip. +// If there is no such block, bmap allocates one. +// returns 0 if out of disk space. +static uint +bmap(struct inode *ip, uint bn) +{ + 80002faa: 7179 addi sp,sp,-48 + 80002fac: f406 sd ra,40(sp) + 80002fae: f022 sd s0,32(sp) + 80002fb0: ec26 sd s1,24(sp) + 80002fb2: e84a sd s2,16(sp) + 80002fb4: e44e sd s3,8(sp) + 80002fb6: 1800 addi s0,sp,48 + 80002fb8: 89aa mv s3,a0 + uint addr, *a; + struct buf *bp; + + if(bn < NDIRECT){ + 80002fba: 47ad li a5,11 + 80002fbc: 02b7e663 bltu a5,a1,80002fe8 + if((addr = ip->addrs[bn]) == 0){ + 80002fc0: 02059793 slli a5,a1,0x20 + 80002fc4: 01e7d593 srli a1,a5,0x1e + 80002fc8: 00b504b3 add s1,a0,a1 + 80002fcc: 0504a903 lw s2,80(s1) + 80002fd0: 06091a63 bnez s2,80003044 + addr = balloc(ip->dev); + 80002fd4: 4108 lw a0,0(a0) + 80002fd6: eb5ff0ef jal 80002e8a + 80002fda: 0005091b sext.w s2,a0 + if(addr == 0) + 80002fde: 06090363 beqz s2,80003044 + return 0; + ip->addrs[bn] = addr; + 80002fe2: 0524a823 sw s2,80(s1) + 80002fe6: a8b9 j 80003044 + } + return addr; + } + bn -= NDIRECT; + 80002fe8: ff45849b addiw s1,a1,-12 + 80002fec: 0004871b sext.w a4,s1 + + if(bn < NINDIRECT){ + 80002ff0: 0ff00793 li a5,255 + 80002ff4: 06e7ee63 bltu a5,a4,80003070 + // Load indirect block, allocating if necessary. + if((addr = ip->addrs[NDIRECT]) == 0){ + 80002ff8: 08052903 lw s2,128(a0) + 80002ffc: 00091d63 bnez s2,80003016 + addr = balloc(ip->dev); + 80003000: 4108 lw a0,0(a0) + 80003002: e89ff0ef jal 80002e8a + 80003006: 0005091b sext.w s2,a0 + if(addr == 0) + 8000300a: 02090d63 beqz s2,80003044 + 8000300e: e052 sd s4,0(sp) + return 0; + ip->addrs[NDIRECT] = addr; + 80003010: 0929a023 sw s2,128(s3) + 80003014: a011 j 80003018 + 80003016: e052 sd s4,0(sp) + } + bp = bread(ip->dev, addr); + 80003018: 85ca mv a1,s2 + 8000301a: 0009a503 lw a0,0(s3) + 8000301e: c09ff0ef jal 80002c26 + 80003022: 8a2a mv s4,a0 + a = (uint*)bp->data; + 80003024: 05850793 addi a5,a0,88 + if((addr = a[bn]) == 0){ + 80003028: 02049713 slli a4,s1,0x20 + 8000302c: 01e75593 srli a1,a4,0x1e + 80003030: 00b784b3 add s1,a5,a1 + 80003034: 0004a903 lw s2,0(s1) + 80003038: 00090e63 beqz s2,80003054 + if(addr){ + a[bn] = addr; + log_write(bp); + } + } + brelse(bp); + 8000303c: 8552 mv a0,s4 + 8000303e: cf1ff0ef jal 80002d2e + return addr; + 80003042: 6a02 ld s4,0(sp) + } + + panic("bmap: out of range"); +} + 80003044: 854a mv a0,s2 + 80003046: 70a2 ld ra,40(sp) + 80003048: 7402 ld s0,32(sp) + 8000304a: 64e2 ld s1,24(sp) + 8000304c: 6942 ld s2,16(sp) + 8000304e: 69a2 ld s3,8(sp) + 80003050: 6145 addi sp,sp,48 + 80003052: 8082 ret + addr = balloc(ip->dev); + 80003054: 0009a503 lw a0,0(s3) + 80003058: e33ff0ef jal 80002e8a + 8000305c: 0005091b sext.w s2,a0 + if(addr){ + 80003060: fc090ee3 beqz s2,8000303c + a[bn] = addr; + 80003064: 0124a023 sw s2,0(s1) + log_write(bp); + 80003068: 8552 mv a0,s4 + 8000306a: 5f7000ef jal 80003e60 + 8000306e: b7f9 j 8000303c + 80003070: e052 sd s4,0(sp) + panic("bmap: out of range"); + 80003072: 00004517 auipc a0,0x4 + 80003076: 3a650513 addi a0,a0,934 # 80007418 + 8000307a: f66fd0ef jal 800007e0 + +000000008000307e : +{ + 8000307e: 7179 addi sp,sp,-48 + 80003080: f406 sd ra,40(sp) + 80003082: f022 sd s0,32(sp) + 80003084: ec26 sd s1,24(sp) + 80003086: e84a sd s2,16(sp) + 80003088: e44e sd s3,8(sp) + 8000308a: e052 sd s4,0(sp) + 8000308c: 1800 addi s0,sp,48 + 8000308e: 89aa mv s3,a0 + 80003090: 8a2e mv s4,a1 + acquire(&itable.lock); + 80003092: 0001e517 auipc a0,0x1e + 80003096: 82e50513 addi a0,a0,-2002 # 800208c0 + 8000309a: b35fd0ef jal 80000bce + empty = 0; + 8000309e: 4901 li s2,0 + for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){ + 800030a0: 0001e497 auipc s1,0x1e + 800030a4: 83848493 addi s1,s1,-1992 # 800208d8 + 800030a8: 0001f697 auipc a3,0x1f + 800030ac: 2c068693 addi a3,a3,704 # 80022368 + 800030b0: a039 j 800030be + if(empty == 0 && ip->ref == 0) // Remember empty slot. + 800030b2: 02090963 beqz s2,800030e4 + for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){ + 800030b6: 08848493 addi s1,s1,136 + 800030ba: 02d48863 beq s1,a3,800030ea + if(ip->ref > 0 && ip->dev == dev && ip->inum == inum){ + 800030be: 449c lw a5,8(s1) + 800030c0: fef059e3 blez a5,800030b2 + 800030c4: 4098 lw a4,0(s1) + 800030c6: ff3716e3 bne a4,s3,800030b2 + 800030ca: 40d8 lw a4,4(s1) + 800030cc: ff4713e3 bne a4,s4,800030b2 + ip->ref++; + 800030d0: 2785 addiw a5,a5,1 + 800030d2: c49c sw a5,8(s1) + release(&itable.lock); + 800030d4: 0001d517 auipc a0,0x1d + 800030d8: 7ec50513 addi a0,a0,2028 # 800208c0 + 800030dc: b8bfd0ef jal 80000c66 + return ip; + 800030e0: 8926 mv s2,s1 + 800030e2: a02d j 8000310c + if(empty == 0 && ip->ref == 0) // Remember empty slot. + 800030e4: fbe9 bnez a5,800030b6 + empty = ip; + 800030e6: 8926 mv s2,s1 + 800030e8: b7f9 j 800030b6 + if(empty == 0) + 800030ea: 02090a63 beqz s2,8000311e + ip->dev = dev; + 800030ee: 01392023 sw s3,0(s2) + ip->inum = inum; + 800030f2: 01492223 sw s4,4(s2) + ip->ref = 1; + 800030f6: 4785 li a5,1 + 800030f8: 00f92423 sw a5,8(s2) + ip->valid = 0; + 800030fc: 04092023 sw zero,64(s2) + release(&itable.lock); + 80003100: 0001d517 auipc a0,0x1d + 80003104: 7c050513 addi a0,a0,1984 # 800208c0 + 80003108: b5ffd0ef jal 80000c66 +} + 8000310c: 854a mv a0,s2 + 8000310e: 70a2 ld ra,40(sp) + 80003110: 7402 ld s0,32(sp) + 80003112: 64e2 ld s1,24(sp) + 80003114: 6942 ld s2,16(sp) + 80003116: 69a2 ld s3,8(sp) + 80003118: 6a02 ld s4,0(sp) + 8000311a: 6145 addi sp,sp,48 + 8000311c: 8082 ret + panic("iget: no inodes"); + 8000311e: 00004517 auipc a0,0x4 + 80003122: 31250513 addi a0,a0,786 # 80007430 + 80003126: ebafd0ef jal 800007e0 + +000000008000312a : +{ + 8000312a: 7179 addi sp,sp,-48 + 8000312c: f406 sd ra,40(sp) + 8000312e: f022 sd s0,32(sp) + 80003130: ec26 sd s1,24(sp) + 80003132: e84a sd s2,16(sp) + 80003134: e44e sd s3,8(sp) + 80003136: 1800 addi s0,sp,48 + initlock(&itable.lock, "itable"); + 80003138: 00004597 auipc a1,0x4 + 8000313c: 30858593 addi a1,a1,776 # 80007440 + 80003140: 0001d517 auipc a0,0x1d + 80003144: 78050513 addi a0,a0,1920 # 800208c0 + 80003148: a07fd0ef jal 80000b4e + for(i = 0; i < NINODE; i++) { + 8000314c: 0001d497 auipc s1,0x1d + 80003150: 79c48493 addi s1,s1,1948 # 800208e8 + 80003154: 0001f997 auipc s3,0x1f + 80003158: 22498993 addi s3,s3,548 # 80022378 + initsleeplock(&itable.inode[i].lock, "inode"); + 8000315c: 00004917 auipc s2,0x4 + 80003160: 2ec90913 addi s2,s2,748 # 80007448 + 80003164: 85ca mv a1,s2 + 80003166: 8526 mv a0,s1 + 80003168: 5bb000ef jal 80003f22 + for(i = 0; i < NINODE; i++) { + 8000316c: 08848493 addi s1,s1,136 + 80003170: ff349ae3 bne s1,s3,80003164 +} + 80003174: 70a2 ld ra,40(sp) + 80003176: 7402 ld s0,32(sp) + 80003178: 64e2 ld s1,24(sp) + 8000317a: 6942 ld s2,16(sp) + 8000317c: 69a2 ld s3,8(sp) + 8000317e: 6145 addi sp,sp,48 + 80003180: 8082 ret + +0000000080003182 : +{ + 80003182: 7139 addi sp,sp,-64 + 80003184: fc06 sd ra,56(sp) + 80003186: f822 sd s0,48(sp) + 80003188: 0080 addi s0,sp,64 + for(inum = 1; inum < sb.ninodes; inum++){ + 8000318a: 0001d717 auipc a4,0x1d + 8000318e: 72272703 lw a4,1826(a4) # 800208ac + 80003192: 4785 li a5,1 + 80003194: 06e7f063 bgeu a5,a4,800031f4 + 80003198: f426 sd s1,40(sp) + 8000319a: f04a sd s2,32(sp) + 8000319c: ec4e sd s3,24(sp) + 8000319e: e852 sd s4,16(sp) + 800031a0: e456 sd s5,8(sp) + 800031a2: e05a sd s6,0(sp) + 800031a4: 8aaa mv s5,a0 + 800031a6: 8b2e mv s6,a1 + 800031a8: 4905 li s2,1 + bp = bread(dev, IBLOCK(inum, sb)); + 800031aa: 0001da17 auipc s4,0x1d + 800031ae: 6f6a0a13 addi s4,s4,1782 # 800208a0 + 800031b2: 00495593 srli a1,s2,0x4 + 800031b6: 018a2783 lw a5,24(s4) + 800031ba: 9dbd addw a1,a1,a5 + 800031bc: 8556 mv a0,s5 + 800031be: a69ff0ef jal 80002c26 + 800031c2: 84aa mv s1,a0 + dip = (struct dinode*)bp->data + inum%IPB; + 800031c4: 05850993 addi s3,a0,88 + 800031c8: 00f97793 andi a5,s2,15 + 800031cc: 079a slli a5,a5,0x6 + 800031ce: 99be add s3,s3,a5 + if(dip->type == 0){ // a free inode + 800031d0: 00099783 lh a5,0(s3) + 800031d4: cb9d beqz a5,8000320a + brelse(bp); + 800031d6: b59ff0ef jal 80002d2e + for(inum = 1; inum < sb.ninodes; inum++){ + 800031da: 0905 addi s2,s2,1 + 800031dc: 00ca2703 lw a4,12(s4) + 800031e0: 0009079b sext.w a5,s2 + 800031e4: fce7e7e3 bltu a5,a4,800031b2 + 800031e8: 74a2 ld s1,40(sp) + 800031ea: 7902 ld s2,32(sp) + 800031ec: 69e2 ld s3,24(sp) + 800031ee: 6a42 ld s4,16(sp) + 800031f0: 6aa2 ld s5,8(sp) + 800031f2: 6b02 ld s6,0(sp) + printf("ialloc: no inodes\n"); + 800031f4: 00004517 auipc a0,0x4 + 800031f8: 25c50513 addi a0,a0,604 # 80007450 + 800031fc: afefd0ef jal 800004fa + return 0; + 80003200: 4501 li a0,0 +} + 80003202: 70e2 ld ra,56(sp) + 80003204: 7442 ld s0,48(sp) + 80003206: 6121 addi sp,sp,64 + 80003208: 8082 ret + memset(dip, 0, sizeof(*dip)); + 8000320a: 04000613 li a2,64 + 8000320e: 4581 li a1,0 + 80003210: 854e mv a0,s3 + 80003212: a91fd0ef jal 80000ca2 + dip->type = type; + 80003216: 01699023 sh s6,0(s3) + log_write(bp); // mark it allocated on the disk + 8000321a: 8526 mv a0,s1 + 8000321c: 445000ef jal 80003e60 + brelse(bp); + 80003220: 8526 mv a0,s1 + 80003222: b0dff0ef jal 80002d2e + return iget(dev, inum); + 80003226: 0009059b sext.w a1,s2 + 8000322a: 8556 mv a0,s5 + 8000322c: e53ff0ef jal 8000307e + 80003230: 74a2 ld s1,40(sp) + 80003232: 7902 ld s2,32(sp) + 80003234: 69e2 ld s3,24(sp) + 80003236: 6a42 ld s4,16(sp) + 80003238: 6aa2 ld s5,8(sp) + 8000323a: 6b02 ld s6,0(sp) + 8000323c: b7d9 j 80003202 + +000000008000323e : +{ + 8000323e: 1101 addi sp,sp,-32 + 80003240: ec06 sd ra,24(sp) + 80003242: e822 sd s0,16(sp) + 80003244: e426 sd s1,8(sp) + 80003246: e04a sd s2,0(sp) + 80003248: 1000 addi s0,sp,32 + 8000324a: 84aa mv s1,a0 + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); + 8000324c: 415c lw a5,4(a0) + 8000324e: 0047d79b srliw a5,a5,0x4 + 80003252: 0001d597 auipc a1,0x1d + 80003256: 6665a583 lw a1,1638(a1) # 800208b8 + 8000325a: 9dbd addw a1,a1,a5 + 8000325c: 4108 lw a0,0(a0) + 8000325e: 9c9ff0ef jal 80002c26 + 80003262: 892a mv s2,a0 + dip = (struct dinode*)bp->data + ip->inum%IPB; + 80003264: 05850793 addi a5,a0,88 + 80003268: 40d8 lw a4,4(s1) + 8000326a: 8b3d andi a4,a4,15 + 8000326c: 071a slli a4,a4,0x6 + 8000326e: 97ba add a5,a5,a4 + dip->type = ip->type; + 80003270: 04449703 lh a4,68(s1) + 80003274: 00e79023 sh a4,0(a5) + dip->major = ip->major; + 80003278: 04649703 lh a4,70(s1) + 8000327c: 00e79123 sh a4,2(a5) + dip->minor = ip->minor; + 80003280: 04849703 lh a4,72(s1) + 80003284: 00e79223 sh a4,4(a5) + dip->nlink = ip->nlink; + 80003288: 04a49703 lh a4,74(s1) + 8000328c: 00e79323 sh a4,6(a5) + dip->size = ip->size; + 80003290: 44f8 lw a4,76(s1) + 80003292: c798 sw a4,8(a5) + memmove(dip->addrs, ip->addrs, sizeof(ip->addrs)); + 80003294: 03400613 li a2,52 + 80003298: 05048593 addi a1,s1,80 + 8000329c: 00c78513 addi a0,a5,12 + 800032a0: a5ffd0ef jal 80000cfe + log_write(bp); + 800032a4: 854a mv a0,s2 + 800032a6: 3bb000ef jal 80003e60 + brelse(bp); + 800032aa: 854a mv a0,s2 + 800032ac: a83ff0ef jal 80002d2e +} + 800032b0: 60e2 ld ra,24(sp) + 800032b2: 6442 ld s0,16(sp) + 800032b4: 64a2 ld s1,8(sp) + 800032b6: 6902 ld s2,0(sp) + 800032b8: 6105 addi sp,sp,32 + 800032ba: 8082 ret + +00000000800032bc : +{ + 800032bc: 1101 addi sp,sp,-32 + 800032be: ec06 sd ra,24(sp) + 800032c0: e822 sd s0,16(sp) + 800032c2: e426 sd s1,8(sp) + 800032c4: 1000 addi s0,sp,32 + 800032c6: 84aa mv s1,a0 + acquire(&itable.lock); + 800032c8: 0001d517 auipc a0,0x1d + 800032cc: 5f850513 addi a0,a0,1528 # 800208c0 + 800032d0: 8fffd0ef jal 80000bce + ip->ref++; + 800032d4: 449c lw a5,8(s1) + 800032d6: 2785 addiw a5,a5,1 + 800032d8: c49c sw a5,8(s1) + release(&itable.lock); + 800032da: 0001d517 auipc a0,0x1d + 800032de: 5e650513 addi a0,a0,1510 # 800208c0 + 800032e2: 985fd0ef jal 80000c66 +} + 800032e6: 8526 mv a0,s1 + 800032e8: 60e2 ld ra,24(sp) + 800032ea: 6442 ld s0,16(sp) + 800032ec: 64a2 ld s1,8(sp) + 800032ee: 6105 addi sp,sp,32 + 800032f0: 8082 ret + +00000000800032f2 : +{ + 800032f2: 1101 addi sp,sp,-32 + 800032f4: ec06 sd ra,24(sp) + 800032f6: e822 sd s0,16(sp) + 800032f8: e426 sd s1,8(sp) + 800032fa: 1000 addi s0,sp,32 + if(ip == 0 || ip->ref < 1) + 800032fc: cd19 beqz a0,8000331a + 800032fe: 84aa mv s1,a0 + 80003300: 451c lw a5,8(a0) + 80003302: 00f05c63 blez a5,8000331a + acquiresleep(&ip->lock); + 80003306: 0541 addi a0,a0,16 + 80003308: 451000ef jal 80003f58 + if(ip->valid == 0){ + 8000330c: 40bc lw a5,64(s1) + 8000330e: cf89 beqz a5,80003328 +} + 80003310: 60e2 ld ra,24(sp) + 80003312: 6442 ld s0,16(sp) + 80003314: 64a2 ld s1,8(sp) + 80003316: 6105 addi sp,sp,32 + 80003318: 8082 ret + 8000331a: e04a sd s2,0(sp) + panic("ilock"); + 8000331c: 00004517 auipc a0,0x4 + 80003320: 14c50513 addi a0,a0,332 # 80007468 + 80003324: cbcfd0ef jal 800007e0 + 80003328: e04a sd s2,0(sp) + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); + 8000332a: 40dc lw a5,4(s1) + 8000332c: 0047d79b srliw a5,a5,0x4 + 80003330: 0001d597 auipc a1,0x1d + 80003334: 5885a583 lw a1,1416(a1) # 800208b8 + 80003338: 9dbd addw a1,a1,a5 + 8000333a: 4088 lw a0,0(s1) + 8000333c: 8ebff0ef jal 80002c26 + 80003340: 892a mv s2,a0 + dip = (struct dinode*)bp->data + ip->inum%IPB; + 80003342: 05850593 addi a1,a0,88 + 80003346: 40dc lw a5,4(s1) + 80003348: 8bbd andi a5,a5,15 + 8000334a: 079a slli a5,a5,0x6 + 8000334c: 95be add a1,a1,a5 + ip->type = dip->type; + 8000334e: 00059783 lh a5,0(a1) + 80003352: 04f49223 sh a5,68(s1) + ip->major = dip->major; + 80003356: 00259783 lh a5,2(a1) + 8000335a: 04f49323 sh a5,70(s1) + ip->minor = dip->minor; + 8000335e: 00459783 lh a5,4(a1) + 80003362: 04f49423 sh a5,72(s1) + ip->nlink = dip->nlink; + 80003366: 00659783 lh a5,6(a1) + 8000336a: 04f49523 sh a5,74(s1) + ip->size = dip->size; + 8000336e: 459c lw a5,8(a1) + 80003370: c4fc sw a5,76(s1) + memmove(ip->addrs, dip->addrs, sizeof(ip->addrs)); + 80003372: 03400613 li a2,52 + 80003376: 05b1 addi a1,a1,12 + 80003378: 05048513 addi a0,s1,80 + 8000337c: 983fd0ef jal 80000cfe + brelse(bp); + 80003380: 854a mv a0,s2 + 80003382: 9adff0ef jal 80002d2e + ip->valid = 1; + 80003386: 4785 li a5,1 + 80003388: c0bc sw a5,64(s1) + if(ip->type == 0) + 8000338a: 04449783 lh a5,68(s1) + 8000338e: c399 beqz a5,80003394 + 80003390: 6902 ld s2,0(sp) + 80003392: bfbd j 80003310 + panic("ilock: no type"); + 80003394: 00004517 auipc a0,0x4 + 80003398: 0dc50513 addi a0,a0,220 # 80007470 + 8000339c: c44fd0ef jal 800007e0 + +00000000800033a0 : +{ + 800033a0: 1101 addi sp,sp,-32 + 800033a2: ec06 sd ra,24(sp) + 800033a4: e822 sd s0,16(sp) + 800033a6: e426 sd s1,8(sp) + 800033a8: e04a sd s2,0(sp) + 800033aa: 1000 addi s0,sp,32 + if(ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) + 800033ac: c505 beqz a0,800033d4 + 800033ae: 84aa mv s1,a0 + 800033b0: 01050913 addi s2,a0,16 + 800033b4: 854a mv a0,s2 + 800033b6: 421000ef jal 80003fd6 + 800033ba: cd09 beqz a0,800033d4 + 800033bc: 449c lw a5,8(s1) + 800033be: 00f05b63 blez a5,800033d4 + releasesleep(&ip->lock); + 800033c2: 854a mv a0,s2 + 800033c4: 3db000ef jal 80003f9e +} + 800033c8: 60e2 ld ra,24(sp) + 800033ca: 6442 ld s0,16(sp) + 800033cc: 64a2 ld s1,8(sp) + 800033ce: 6902 ld s2,0(sp) + 800033d0: 6105 addi sp,sp,32 + 800033d2: 8082 ret + panic("iunlock"); + 800033d4: 00004517 auipc a0,0x4 + 800033d8: 0ac50513 addi a0,a0,172 # 80007480 + 800033dc: c04fd0ef jal 800007e0 + +00000000800033e0 : + +// Truncate inode (discard contents). +// Caller must hold ip->lock. +void +itrunc(struct inode *ip) +{ + 800033e0: 7179 addi sp,sp,-48 + 800033e2: f406 sd ra,40(sp) + 800033e4: f022 sd s0,32(sp) + 800033e6: ec26 sd s1,24(sp) + 800033e8: e84a sd s2,16(sp) + 800033ea: e44e sd s3,8(sp) + 800033ec: 1800 addi s0,sp,48 + 800033ee: 89aa mv s3,a0 + int i, j; + struct buf *bp; + uint *a; + + for(i = 0; i < NDIRECT; i++){ + 800033f0: 05050493 addi s1,a0,80 + 800033f4: 08050913 addi s2,a0,128 + 800033f8: a021 j 80003400 + 800033fa: 0491 addi s1,s1,4 + 800033fc: 01248b63 beq s1,s2,80003412 + if(ip->addrs[i]){ + 80003400: 408c lw a1,0(s1) + 80003402: dde5 beqz a1,800033fa + bfree(ip->dev, ip->addrs[i]); + 80003404: 0009a503 lw a0,0(s3) + 80003408: a17ff0ef jal 80002e1e + ip->addrs[i] = 0; + 8000340c: 0004a023 sw zero,0(s1) + 80003410: b7ed j 800033fa + } + } + + if(ip->addrs[NDIRECT]){ + 80003412: 0809a583 lw a1,128(s3) + 80003416: ed89 bnez a1,80003430 + brelse(bp); + bfree(ip->dev, ip->addrs[NDIRECT]); + ip->addrs[NDIRECT] = 0; + } + + ip->size = 0; + 80003418: 0409a623 sw zero,76(s3) + iupdate(ip); + 8000341c: 854e mv a0,s3 + 8000341e: e21ff0ef jal 8000323e +} + 80003422: 70a2 ld ra,40(sp) + 80003424: 7402 ld s0,32(sp) + 80003426: 64e2 ld s1,24(sp) + 80003428: 6942 ld s2,16(sp) + 8000342a: 69a2 ld s3,8(sp) + 8000342c: 6145 addi sp,sp,48 + 8000342e: 8082 ret + 80003430: e052 sd s4,0(sp) + bp = bread(ip->dev, ip->addrs[NDIRECT]); + 80003432: 0009a503 lw a0,0(s3) + 80003436: ff0ff0ef jal 80002c26 + 8000343a: 8a2a mv s4,a0 + for(j = 0; j < NINDIRECT; j++){ + 8000343c: 05850493 addi s1,a0,88 + 80003440: 45850913 addi s2,a0,1112 + 80003444: a021 j 8000344c + 80003446: 0491 addi s1,s1,4 + 80003448: 01248963 beq s1,s2,8000345a + if(a[j]) + 8000344c: 408c lw a1,0(s1) + 8000344e: dde5 beqz a1,80003446 + bfree(ip->dev, a[j]); + 80003450: 0009a503 lw a0,0(s3) + 80003454: 9cbff0ef jal 80002e1e + 80003458: b7fd j 80003446 + brelse(bp); + 8000345a: 8552 mv a0,s4 + 8000345c: 8d3ff0ef jal 80002d2e + bfree(ip->dev, ip->addrs[NDIRECT]); + 80003460: 0809a583 lw a1,128(s3) + 80003464: 0009a503 lw a0,0(s3) + 80003468: 9b7ff0ef jal 80002e1e + ip->addrs[NDIRECT] = 0; + 8000346c: 0809a023 sw zero,128(s3) + 80003470: 6a02 ld s4,0(sp) + 80003472: b75d j 80003418 + +0000000080003474 : +{ + 80003474: 1101 addi sp,sp,-32 + 80003476: ec06 sd ra,24(sp) + 80003478: e822 sd s0,16(sp) + 8000347a: e426 sd s1,8(sp) + 8000347c: 1000 addi s0,sp,32 + 8000347e: 84aa mv s1,a0 + acquire(&itable.lock); + 80003480: 0001d517 auipc a0,0x1d + 80003484: 44050513 addi a0,a0,1088 # 800208c0 + 80003488: f46fd0ef jal 80000bce + if(ip->ref == 1 && ip->valid && ip->nlink == 0){ + 8000348c: 4498 lw a4,8(s1) + 8000348e: 4785 li a5,1 + 80003490: 02f70063 beq a4,a5,800034b0 + ip->ref--; + 80003494: 449c lw a5,8(s1) + 80003496: 37fd addiw a5,a5,-1 + 80003498: c49c sw a5,8(s1) + release(&itable.lock); + 8000349a: 0001d517 auipc a0,0x1d + 8000349e: 42650513 addi a0,a0,1062 # 800208c0 + 800034a2: fc4fd0ef jal 80000c66 +} + 800034a6: 60e2 ld ra,24(sp) + 800034a8: 6442 ld s0,16(sp) + 800034aa: 64a2 ld s1,8(sp) + 800034ac: 6105 addi sp,sp,32 + 800034ae: 8082 ret + if(ip->ref == 1 && ip->valid && ip->nlink == 0){ + 800034b0: 40bc lw a5,64(s1) + 800034b2: d3ed beqz a5,80003494 + 800034b4: 04a49783 lh a5,74(s1) + 800034b8: fff1 bnez a5,80003494 + 800034ba: e04a sd s2,0(sp) + acquiresleep(&ip->lock); + 800034bc: 01048913 addi s2,s1,16 + 800034c0: 854a mv a0,s2 + 800034c2: 297000ef jal 80003f58 + release(&itable.lock); + 800034c6: 0001d517 auipc a0,0x1d + 800034ca: 3fa50513 addi a0,a0,1018 # 800208c0 + 800034ce: f98fd0ef jal 80000c66 + itrunc(ip); + 800034d2: 8526 mv a0,s1 + 800034d4: f0dff0ef jal 800033e0 + ip->type = 0; + 800034d8: 04049223 sh zero,68(s1) + iupdate(ip); + 800034dc: 8526 mv a0,s1 + 800034de: d61ff0ef jal 8000323e + ip->valid = 0; + 800034e2: 0404a023 sw zero,64(s1) + releasesleep(&ip->lock); + 800034e6: 854a mv a0,s2 + 800034e8: 2b7000ef jal 80003f9e + acquire(&itable.lock); + 800034ec: 0001d517 auipc a0,0x1d + 800034f0: 3d450513 addi a0,a0,980 # 800208c0 + 800034f4: edafd0ef jal 80000bce + 800034f8: 6902 ld s2,0(sp) + 800034fa: bf69 j 80003494 + +00000000800034fc : +{ + 800034fc: 1101 addi sp,sp,-32 + 800034fe: ec06 sd ra,24(sp) + 80003500: e822 sd s0,16(sp) + 80003502: e426 sd s1,8(sp) + 80003504: 1000 addi s0,sp,32 + 80003506: 84aa mv s1,a0 + iunlock(ip); + 80003508: e99ff0ef jal 800033a0 + iput(ip); + 8000350c: 8526 mv a0,s1 + 8000350e: f67ff0ef jal 80003474 +} + 80003512: 60e2 ld ra,24(sp) + 80003514: 6442 ld s0,16(sp) + 80003516: 64a2 ld s1,8(sp) + 80003518: 6105 addi sp,sp,32 + 8000351a: 8082 ret + +000000008000351c : + for (int inum = 1; inum < sb.ninodes; inum++) { + 8000351c: 0001d717 auipc a4,0x1d + 80003520: 39072703 lw a4,912(a4) # 800208ac + 80003524: 4785 li a5,1 + 80003526: 0ae7ff63 bgeu a5,a4,800035e4 +{ + 8000352a: 7139 addi sp,sp,-64 + 8000352c: fc06 sd ra,56(sp) + 8000352e: f822 sd s0,48(sp) + 80003530: f426 sd s1,40(sp) + 80003532: f04a sd s2,32(sp) + 80003534: ec4e sd s3,24(sp) + 80003536: e852 sd s4,16(sp) + 80003538: e456 sd s5,8(sp) + 8000353a: e05a sd s6,0(sp) + 8000353c: 0080 addi s0,sp,64 + for (int inum = 1; inum < sb.ninodes; inum++) { + 8000353e: 4485 li s1,1 + struct buf *bp = bread(dev, IBLOCK(inum, sb)); + 80003540: 00050a1b sext.w s4,a0 + 80003544: 0001da97 auipc s5,0x1d + 80003548: 35ca8a93 addi s5,s5,860 # 800208a0 + printf("ireclaim: orphaned inode %d\n", inum); + 8000354c: 00004b17 auipc s6,0x4 + 80003550: f3cb0b13 addi s6,s6,-196 # 80007488 + 80003554: a099 j 8000359a + 80003556: 85ce mv a1,s3 + 80003558: 855a mv a0,s6 + 8000355a: fa1fc0ef jal 800004fa + ip = iget(dev, inum); + 8000355e: 85ce mv a1,s3 + 80003560: 8552 mv a0,s4 + 80003562: b1dff0ef jal 8000307e + 80003566: 89aa mv s3,a0 + brelse(bp); + 80003568: 854a mv a0,s2 + 8000356a: fc4ff0ef jal 80002d2e + if (ip) { + 8000356e: 00098f63 beqz s3,8000358c + begin_op(); + 80003572: 76a000ef jal 80003cdc + ilock(ip); + 80003576: 854e mv a0,s3 + 80003578: d7bff0ef jal 800032f2 + iunlock(ip); + 8000357c: 854e mv a0,s3 + 8000357e: e23ff0ef jal 800033a0 + iput(ip); + 80003582: 854e mv a0,s3 + 80003584: ef1ff0ef jal 80003474 + end_op(); + 80003588: 7be000ef jal 80003d46 + for (int inum = 1; inum < sb.ninodes; inum++) { + 8000358c: 0485 addi s1,s1,1 + 8000358e: 00caa703 lw a4,12(s5) + 80003592: 0004879b sext.w a5,s1 + 80003596: 02e7fd63 bgeu a5,a4,800035d0 + 8000359a: 0004899b sext.w s3,s1 + struct buf *bp = bread(dev, IBLOCK(inum, sb)); + 8000359e: 0044d593 srli a1,s1,0x4 + 800035a2: 018aa783 lw a5,24(s5) + 800035a6: 9dbd addw a1,a1,a5 + 800035a8: 8552 mv a0,s4 + 800035aa: e7cff0ef jal 80002c26 + 800035ae: 892a mv s2,a0 + struct dinode *dip = (struct dinode *)bp->data + inum % IPB; + 800035b0: 05850793 addi a5,a0,88 + 800035b4: 00f9f713 andi a4,s3,15 + 800035b8: 071a slli a4,a4,0x6 + 800035ba: 97ba add a5,a5,a4 + if (dip->type != 0 && dip->nlink == 0) { // is an orphaned inode + 800035bc: 00079703 lh a4,0(a5) + 800035c0: c701 beqz a4,800035c8 + 800035c2: 00679783 lh a5,6(a5) + 800035c6: dbc1 beqz a5,80003556 + brelse(bp); + 800035c8: 854a mv a0,s2 + 800035ca: f64ff0ef jal 80002d2e + if (ip) { + 800035ce: bf7d j 8000358c +} + 800035d0: 70e2 ld ra,56(sp) + 800035d2: 7442 ld s0,48(sp) + 800035d4: 74a2 ld s1,40(sp) + 800035d6: 7902 ld s2,32(sp) + 800035d8: 69e2 ld s3,24(sp) + 800035da: 6a42 ld s4,16(sp) + 800035dc: 6aa2 ld s5,8(sp) + 800035de: 6b02 ld s6,0(sp) + 800035e0: 6121 addi sp,sp,64 + 800035e2: 8082 ret + 800035e4: 8082 ret + +00000000800035e6 : +fsinit(int dev) { + 800035e6: 7179 addi sp,sp,-48 + 800035e8: f406 sd ra,40(sp) + 800035ea: f022 sd s0,32(sp) + 800035ec: ec26 sd s1,24(sp) + 800035ee: e84a sd s2,16(sp) + 800035f0: e44e sd s3,8(sp) + 800035f2: 1800 addi s0,sp,48 + 800035f4: 84aa mv s1,a0 + bp = bread(dev, 1); + 800035f6: 4585 li a1,1 + 800035f8: e2eff0ef jal 80002c26 + 800035fc: 892a mv s2,a0 + memmove(sb, bp->data, sizeof(*sb)); + 800035fe: 0001d997 auipc s3,0x1d + 80003602: 2a298993 addi s3,s3,674 # 800208a0 + 80003606: 02000613 li a2,32 + 8000360a: 05850593 addi a1,a0,88 + 8000360e: 854e mv a0,s3 + 80003610: eeefd0ef jal 80000cfe + brelse(bp); + 80003614: 854a mv a0,s2 + 80003616: f18ff0ef jal 80002d2e + if(sb.magic != FSMAGIC) + 8000361a: 0009a703 lw a4,0(s3) + 8000361e: 102037b7 lui a5,0x10203 + 80003622: 04078793 addi a5,a5,64 # 10203040 <_entry-0x6fdfcfc0> + 80003626: 02f71363 bne a4,a5,8000364c + initlog(dev, &sb); + 8000362a: 0001d597 auipc a1,0x1d + 8000362e: 27658593 addi a1,a1,630 # 800208a0 + 80003632: 8526 mv a0,s1 + 80003634: 62a000ef jal 80003c5e + ireclaim(dev); + 80003638: 8526 mv a0,s1 + 8000363a: ee3ff0ef jal 8000351c +} + 8000363e: 70a2 ld ra,40(sp) + 80003640: 7402 ld s0,32(sp) + 80003642: 64e2 ld s1,24(sp) + 80003644: 6942 ld s2,16(sp) + 80003646: 69a2 ld s3,8(sp) + 80003648: 6145 addi sp,sp,48 + 8000364a: 8082 ret + panic("invalid file system"); + 8000364c: 00004517 auipc a0,0x4 + 80003650: e5c50513 addi a0,a0,-420 # 800074a8 + 80003654: 98cfd0ef jal 800007e0 + +0000000080003658 : + +// Copy stat information from inode. +// Caller must hold ip->lock. +void +stati(struct inode *ip, struct stat *st) +{ + 80003658: 1141 addi sp,sp,-16 + 8000365a: e422 sd s0,8(sp) + 8000365c: 0800 addi s0,sp,16 + st->dev = ip->dev; + 8000365e: 411c lw a5,0(a0) + 80003660: c19c sw a5,0(a1) + st->ino = ip->inum; + 80003662: 415c lw a5,4(a0) + 80003664: c1dc sw a5,4(a1) + st->type = ip->type; + 80003666: 04451783 lh a5,68(a0) + 8000366a: 00f59423 sh a5,8(a1) + st->nlink = ip->nlink; + 8000366e: 04a51783 lh a5,74(a0) + 80003672: 00f59523 sh a5,10(a1) + st->size = ip->size; + 80003676: 04c56783 lwu a5,76(a0) + 8000367a: e99c sd a5,16(a1) +} + 8000367c: 6422 ld s0,8(sp) + 8000367e: 0141 addi sp,sp,16 + 80003680: 8082 ret + +0000000080003682 : +readi(struct inode *ip, int user_dst, uint64 dst, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) + 80003682: 457c lw a5,76(a0) + 80003684: 0ed7eb63 bltu a5,a3,8000377a +{ + 80003688: 7159 addi sp,sp,-112 + 8000368a: f486 sd ra,104(sp) + 8000368c: f0a2 sd s0,96(sp) + 8000368e: eca6 sd s1,88(sp) + 80003690: e0d2 sd s4,64(sp) + 80003692: fc56 sd s5,56(sp) + 80003694: f85a sd s6,48(sp) + 80003696: f45e sd s7,40(sp) + 80003698: 1880 addi s0,sp,112 + 8000369a: 8b2a mv s6,a0 + 8000369c: 8bae mv s7,a1 + 8000369e: 8a32 mv s4,a2 + 800036a0: 84b6 mv s1,a3 + 800036a2: 8aba mv s5,a4 + if(off > ip->size || off + n < off) + 800036a4: 9f35 addw a4,a4,a3 + return 0; + 800036a6: 4501 li a0,0 + if(off > ip->size || off + n < off) + 800036a8: 0cd76063 bltu a4,a3,80003768 + 800036ac: e4ce sd s3,72(sp) + if(off + n > ip->size) + 800036ae: 00e7f463 bgeu a5,a4,800036b6 + n = ip->size - off; + 800036b2: 40d78abb subw s5,a5,a3 + + for(tot=0; tot + 800036ba: e8ca sd s2,80(sp) + 800036bc: f062 sd s8,32(sp) + 800036be: ec66 sd s9,24(sp) + 800036c0: e86a sd s10,16(sp) + 800036c2: e46e sd s11,8(sp) + 800036c4: 4981 li s3,0 + uint addr = bmap(ip, off/BSIZE); + if(addr == 0) + break; + bp = bread(ip->dev, addr); + m = min(n - tot, BSIZE - off%BSIZE); + 800036c6: 40000c93 li s9,1024 + if(either_copyout(user_dst, dst, bp->data + (off % BSIZE), m) == -1) { + 800036ca: 5c7d li s8,-1 + 800036cc: a80d j 800036fe + 800036ce: 020d1d93 slli s11,s10,0x20 + 800036d2: 020ddd93 srli s11,s11,0x20 + 800036d6: 05890613 addi a2,s2,88 + 800036da: 86ee mv a3,s11 + 800036dc: 963a add a2,a2,a4 + 800036de: 85d2 mv a1,s4 + 800036e0: 855e mv a0,s7 + 800036e2: b53fe0ef jal 80002234 + 800036e6: 05850763 beq a0,s8,80003734 + brelse(bp); + tot = -1; + break; + } + brelse(bp); + 800036ea: 854a mv a0,s2 + 800036ec: e42ff0ef jal 80002d2e + for(tot=0; tot + uint addr = bmap(ip, off/BSIZE); + 800036fe: 00a4d59b srliw a1,s1,0xa + 80003702: 855a mv a0,s6 + 80003704: 8a7ff0ef jal 80002faa + 80003708: 0005059b sext.w a1,a0 + if(addr == 0) + 8000370c: c5b1 beqz a1,80003758 + bp = bread(ip->dev, addr); + 8000370e: 000b2503 lw a0,0(s6) + 80003712: d14ff0ef jal 80002c26 + 80003716: 892a mv s2,a0 + m = min(n - tot, BSIZE - off%BSIZE); + 80003718: 3ff4f713 andi a4,s1,1023 + 8000371c: 40ec87bb subw a5,s9,a4 + 80003720: 413a86bb subw a3,s5,s3 + 80003724: 8d3e mv s10,a5 + 80003726: 2781 sext.w a5,a5 + 80003728: 0006861b sext.w a2,a3 + 8000372c: faf671e3 bgeu a2,a5,800036ce + 80003730: 8d36 mv s10,a3 + 80003732: bf71 j 800036ce + brelse(bp); + 80003734: 854a mv a0,s2 + 80003736: df8ff0ef jal 80002d2e + tot = -1; + 8000373a: 59fd li s3,-1 + break; + 8000373c: 6946 ld s2,80(sp) + 8000373e: 7c02 ld s8,32(sp) + 80003740: 6ce2 ld s9,24(sp) + 80003742: 6d42 ld s10,16(sp) + 80003744: 6da2 ld s11,8(sp) + 80003746: a831 j 80003762 + 80003748: 6946 ld s2,80(sp) + 8000374a: 7c02 ld s8,32(sp) + 8000374c: 6ce2 ld s9,24(sp) + 8000374e: 6d42 ld s10,16(sp) + 80003750: 6da2 ld s11,8(sp) + 80003752: a801 j 80003762 + for(tot=0; tot + 80003758: 6946 ld s2,80(sp) + 8000375a: 7c02 ld s8,32(sp) + 8000375c: 6ce2 ld s9,24(sp) + 8000375e: 6d42 ld s10,16(sp) + 80003760: 6da2 ld s11,8(sp) + } + return tot; + 80003762: 0009851b sext.w a0,s3 + 80003766: 69a6 ld s3,72(sp) +} + 80003768: 70a6 ld ra,104(sp) + 8000376a: 7406 ld s0,96(sp) + 8000376c: 64e6 ld s1,88(sp) + 8000376e: 6a06 ld s4,64(sp) + 80003770: 7ae2 ld s5,56(sp) + 80003772: 7b42 ld s6,48(sp) + 80003774: 7ba2 ld s7,40(sp) + 80003776: 6165 addi sp,sp,112 + 80003778: 8082 ret + return 0; + 8000377a: 4501 li a0,0 +} + 8000377c: 8082 ret + +000000008000377e : +writei(struct inode *ip, int user_src, uint64 src, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) + 8000377e: 457c lw a5,76(a0) + 80003780: 10d7e063 bltu a5,a3,80003880 +{ + 80003784: 7159 addi sp,sp,-112 + 80003786: f486 sd ra,104(sp) + 80003788: f0a2 sd s0,96(sp) + 8000378a: e8ca sd s2,80(sp) + 8000378c: e0d2 sd s4,64(sp) + 8000378e: fc56 sd s5,56(sp) + 80003790: f85a sd s6,48(sp) + 80003792: f45e sd s7,40(sp) + 80003794: 1880 addi s0,sp,112 + 80003796: 8aaa mv s5,a0 + 80003798: 8bae mv s7,a1 + 8000379a: 8a32 mv s4,a2 + 8000379c: 8936 mv s2,a3 + 8000379e: 8b3a mv s6,a4 + if(off > ip->size || off + n < off) + 800037a0: 00e687bb addw a5,a3,a4 + 800037a4: 0ed7e063 bltu a5,a3,80003884 + return -1; + if(off + n > MAXFILE*BSIZE) + 800037a8: 00043737 lui a4,0x43 + 800037ac: 0cf76e63 bltu a4,a5,80003888 + 800037b0: e4ce sd s3,72(sp) + return -1; + + for(tot=0; tot + 800037b6: eca6 sd s1,88(sp) + 800037b8: f062 sd s8,32(sp) + 800037ba: ec66 sd s9,24(sp) + 800037bc: e86a sd s10,16(sp) + 800037be: e46e sd s11,8(sp) + 800037c0: 4981 li s3,0 + uint addr = bmap(ip, off/BSIZE); + if(addr == 0) + break; + bp = bread(ip->dev, addr); + m = min(n - tot, BSIZE - off%BSIZE); + 800037c2: 40000c93 li s9,1024 + if(either_copyin(bp->data + (off % BSIZE), user_src, src, m) == -1) { + 800037c6: 5c7d li s8,-1 + 800037c8: a825 j 80003800 + 800037ca: 020d1d93 slli s11,s10,0x20 + 800037ce: 020ddd93 srli s11,s11,0x20 + 800037d2: 05848513 addi a0,s1,88 + 800037d6: 86ee mv a3,s11 + 800037d8: 8652 mv a2,s4 + 800037da: 85de mv a1,s7 + 800037dc: 953a add a0,a0,a4 + 800037de: aa1fe0ef jal 8000227e + 800037e2: 05850a63 beq a0,s8,80003836 + brelse(bp); + break; + } + log_write(bp); + 800037e6: 8526 mv a0,s1 + 800037e8: 678000ef jal 80003e60 + brelse(bp); + 800037ec: 8526 mv a0,s1 + 800037ee: d40ff0ef jal 80002d2e + for(tot=0; tot + uint addr = bmap(ip, off/BSIZE); + 80003800: 00a9559b srliw a1,s2,0xa + 80003804: 8556 mv a0,s5 + 80003806: fa4ff0ef jal 80002faa + 8000380a: 0005059b sext.w a1,a0 + if(addr == 0) + 8000380e: c59d beqz a1,8000383c + bp = bread(ip->dev, addr); + 80003810: 000aa503 lw a0,0(s5) + 80003814: c12ff0ef jal 80002c26 + 80003818: 84aa mv s1,a0 + m = min(n - tot, BSIZE - off%BSIZE); + 8000381a: 3ff97713 andi a4,s2,1023 + 8000381e: 40ec87bb subw a5,s9,a4 + 80003822: 413b06bb subw a3,s6,s3 + 80003826: 8d3e mv s10,a5 + 80003828: 2781 sext.w a5,a5 + 8000382a: 0006861b sext.w a2,a3 + 8000382e: f8f67ee3 bgeu a2,a5,800037ca + 80003832: 8d36 mv s10,a3 + 80003834: bf59 j 800037ca + brelse(bp); + 80003836: 8526 mv a0,s1 + 80003838: cf6ff0ef jal 80002d2e + } + + if(off > ip->size) + 8000383c: 04caa783 lw a5,76(s5) + 80003840: 0327fa63 bgeu a5,s2,80003874 + ip->size = off; + 80003844: 052aa623 sw s2,76(s5) + 80003848: 64e6 ld s1,88(sp) + 8000384a: 7c02 ld s8,32(sp) + 8000384c: 6ce2 ld s9,24(sp) + 8000384e: 6d42 ld s10,16(sp) + 80003850: 6da2 ld s11,8(sp) + + // write the i-node back to disk even if the size didn't change + // because the loop above might have called bmap() and added a new + // block to ip->addrs[]. + iupdate(ip); + 80003852: 8556 mv a0,s5 + 80003854: 9ebff0ef jal 8000323e + + return tot; + 80003858: 0009851b sext.w a0,s3 + 8000385c: 69a6 ld s3,72(sp) +} + 8000385e: 70a6 ld ra,104(sp) + 80003860: 7406 ld s0,96(sp) + 80003862: 6946 ld s2,80(sp) + 80003864: 6a06 ld s4,64(sp) + 80003866: 7ae2 ld s5,56(sp) + 80003868: 7b42 ld s6,48(sp) + 8000386a: 7ba2 ld s7,40(sp) + 8000386c: 6165 addi sp,sp,112 + 8000386e: 8082 ret + for(tot=0; tot + 80003874: 64e6 ld s1,88(sp) + 80003876: 7c02 ld s8,32(sp) + 80003878: 6ce2 ld s9,24(sp) + 8000387a: 6d42 ld s10,16(sp) + 8000387c: 6da2 ld s11,8(sp) + 8000387e: bfd1 j 80003852 + return -1; + 80003880: 557d li a0,-1 +} + 80003882: 8082 ret + return -1; + 80003884: 557d li a0,-1 + 80003886: bfe1 j 8000385e + return -1; + 80003888: 557d li a0,-1 + 8000388a: bfd1 j 8000385e + +000000008000388c : + +// Directories + +int +namecmp(const char *s, const char *t) +{ + 8000388c: 1141 addi sp,sp,-16 + 8000388e: e406 sd ra,8(sp) + 80003890: e022 sd s0,0(sp) + 80003892: 0800 addi s0,sp,16 + return strncmp(s, t, DIRSIZ); + 80003894: 4639 li a2,14 + 80003896: cd8fd0ef jal 80000d6e +} + 8000389a: 60a2 ld ra,8(sp) + 8000389c: 6402 ld s0,0(sp) + 8000389e: 0141 addi sp,sp,16 + 800038a0: 8082 ret + +00000000800038a2 : + +// Look for a directory entry in a directory. +// If found, set *poff to byte offset of entry. +struct inode* +dirlookup(struct inode *dp, char *name, uint *poff) +{ + 800038a2: 7139 addi sp,sp,-64 + 800038a4: fc06 sd ra,56(sp) + 800038a6: f822 sd s0,48(sp) + 800038a8: f426 sd s1,40(sp) + 800038aa: f04a sd s2,32(sp) + 800038ac: ec4e sd s3,24(sp) + 800038ae: e852 sd s4,16(sp) + 800038b0: 0080 addi s0,sp,64 + uint off, inum; + struct dirent de; + + if(dp->type != T_DIR) + 800038b2: 04451703 lh a4,68(a0) + 800038b6: 4785 li a5,1 + 800038b8: 00f71a63 bne a4,a5,800038cc + 800038bc: 892a mv s2,a0 + 800038be: 89ae mv s3,a1 + 800038c0: 8a32 mv s4,a2 + panic("dirlookup not DIR"); + + for(off = 0; off < dp->size; off += sizeof(de)){ + 800038c2: 457c lw a5,76(a0) + 800038c4: 4481 li s1,0 + inum = de.inum; + return iget(dp->dev, inum); + } + } + + return 0; + 800038c6: 4501 li a0,0 + for(off = 0; off < dp->size; off += sizeof(de)){ + 800038c8: e39d bnez a5,800038ee + 800038ca: a095 j 8000392e + panic("dirlookup not DIR"); + 800038cc: 00004517 auipc a0,0x4 + 800038d0: bf450513 addi a0,a0,-1036 # 800074c0 + 800038d4: f0dfc0ef jal 800007e0 + panic("dirlookup read"); + 800038d8: 00004517 auipc a0,0x4 + 800038dc: c0050513 addi a0,a0,-1024 # 800074d8 + 800038e0: f01fc0ef jal 800007e0 + for(off = 0; off < dp->size; off += sizeof(de)){ + 800038e4: 24c1 addiw s1,s1,16 + 800038e6: 04c92783 lw a5,76(s2) + 800038ea: 04f4f163 bgeu s1,a5,8000392c + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 800038ee: 4741 li a4,16 + 800038f0: 86a6 mv a3,s1 + 800038f2: fc040613 addi a2,s0,-64 + 800038f6: 4581 li a1,0 + 800038f8: 854a mv a0,s2 + 800038fa: d89ff0ef jal 80003682 + 800038fe: 47c1 li a5,16 + 80003900: fcf51ce3 bne a0,a5,800038d8 + if(de.inum == 0) + 80003904: fc045783 lhu a5,-64(s0) + 80003908: dff1 beqz a5,800038e4 + if(namecmp(name, de.name) == 0){ + 8000390a: fc240593 addi a1,s0,-62 + 8000390e: 854e mv a0,s3 + 80003910: f7dff0ef jal 8000388c + 80003914: f961 bnez a0,800038e4 + if(poff) + 80003916: 000a0463 beqz s4,8000391e + *poff = off; + 8000391a: 009a2023 sw s1,0(s4) + return iget(dp->dev, inum); + 8000391e: fc045583 lhu a1,-64(s0) + 80003922: 00092503 lw a0,0(s2) + 80003926: f58ff0ef jal 8000307e + 8000392a: a011 j 8000392e + return 0; + 8000392c: 4501 li a0,0 +} + 8000392e: 70e2 ld ra,56(sp) + 80003930: 7442 ld s0,48(sp) + 80003932: 74a2 ld s1,40(sp) + 80003934: 7902 ld s2,32(sp) + 80003936: 69e2 ld s3,24(sp) + 80003938: 6a42 ld s4,16(sp) + 8000393a: 6121 addi sp,sp,64 + 8000393c: 8082 ret + +000000008000393e : +// If parent != 0, return the inode for the parent and copy the final +// path element into name, which must have room for DIRSIZ bytes. +// Must be called inside a transaction since it calls iput(). +static struct inode* +namex(char *path, int nameiparent, char *name) +{ + 8000393e: 711d addi sp,sp,-96 + 80003940: ec86 sd ra,88(sp) + 80003942: e8a2 sd s0,80(sp) + 80003944: e4a6 sd s1,72(sp) + 80003946: e0ca sd s2,64(sp) + 80003948: fc4e sd s3,56(sp) + 8000394a: f852 sd s4,48(sp) + 8000394c: f456 sd s5,40(sp) + 8000394e: f05a sd s6,32(sp) + 80003950: ec5e sd s7,24(sp) + 80003952: e862 sd s8,16(sp) + 80003954: e466 sd s9,8(sp) + 80003956: 1080 addi s0,sp,96 + 80003958: 84aa mv s1,a0 + 8000395a: 8b2e mv s6,a1 + 8000395c: 8ab2 mv s5,a2 + struct inode *ip, *next; + + if(*path == '/') + 8000395e: 00054703 lbu a4,0(a0) + 80003962: 02f00793 li a5,47 + 80003966: 00f70e63 beq a4,a5,80003982 + ip = iget(ROOTDEV, ROOTINO); + else + ip = idup(myproc()->cwd); + 8000396a: f65fd0ef jal 800018ce + 8000396e: 15053503 ld a0,336(a0) + 80003972: 94bff0ef jal 800032bc + 80003976: 8a2a mv s4,a0 + while(*path == '/') + 80003978: 02f00913 li s2,47 + if(len >= DIRSIZ) + 8000397c: 4c35 li s8,13 + + while((path = skipelem(path, name)) != 0){ + ilock(ip); + if(ip->type != T_DIR){ + 8000397e: 4b85 li s7,1 + 80003980: a871 j 80003a1c + ip = iget(ROOTDEV, ROOTINO); + 80003982: 4585 li a1,1 + 80003984: 4505 li a0,1 + 80003986: ef8ff0ef jal 8000307e + 8000398a: 8a2a mv s4,a0 + 8000398c: b7f5 j 80003978 + iunlockput(ip); + 8000398e: 8552 mv a0,s4 + 80003990: b6dff0ef jal 800034fc + return 0; + 80003994: 4a01 li s4,0 + if(nameiparent){ + iput(ip); + return 0; + } + return ip; +} + 80003996: 8552 mv a0,s4 + 80003998: 60e6 ld ra,88(sp) + 8000399a: 6446 ld s0,80(sp) + 8000399c: 64a6 ld s1,72(sp) + 8000399e: 6906 ld s2,64(sp) + 800039a0: 79e2 ld s3,56(sp) + 800039a2: 7a42 ld s4,48(sp) + 800039a4: 7aa2 ld s5,40(sp) + 800039a6: 7b02 ld s6,32(sp) + 800039a8: 6be2 ld s7,24(sp) + 800039aa: 6c42 ld s8,16(sp) + 800039ac: 6ca2 ld s9,8(sp) + 800039ae: 6125 addi sp,sp,96 + 800039b0: 8082 ret + iunlock(ip); + 800039b2: 8552 mv a0,s4 + 800039b4: 9edff0ef jal 800033a0 + return ip; + 800039b8: bff9 j 80003996 + iunlockput(ip); + 800039ba: 8552 mv a0,s4 + 800039bc: b41ff0ef jal 800034fc + return 0; + 800039c0: 8a4e mv s4,s3 + 800039c2: bfd1 j 80003996 + len = path - s; + 800039c4: 40998633 sub a2,s3,s1 + 800039c8: 00060c9b sext.w s9,a2 + if(len >= DIRSIZ) + 800039cc: 099c5063 bge s8,s9,80003a4c + memmove(name, s, DIRSIZ); + 800039d0: 4639 li a2,14 + 800039d2: 85a6 mv a1,s1 + 800039d4: 8556 mv a0,s5 + 800039d6: b28fd0ef jal 80000cfe + 800039da: 84ce mv s1,s3 + while(*path == '/') + 800039dc: 0004c783 lbu a5,0(s1) + 800039e0: 01279763 bne a5,s2,800039ee + path++; + 800039e4: 0485 addi s1,s1,1 + while(*path == '/') + 800039e6: 0004c783 lbu a5,0(s1) + 800039ea: ff278de3 beq a5,s2,800039e4 + ilock(ip); + 800039ee: 8552 mv a0,s4 + 800039f0: 903ff0ef jal 800032f2 + if(ip->type != T_DIR){ + 800039f4: 044a1783 lh a5,68(s4) + 800039f8: f9779be3 bne a5,s7,8000398e + if(nameiparent && *path == '\0'){ + 800039fc: 000b0563 beqz s6,80003a06 + 80003a00: 0004c783 lbu a5,0(s1) + 80003a04: d7dd beqz a5,800039b2 + if((next = dirlookup(ip, name, 0)) == 0){ + 80003a06: 4601 li a2,0 + 80003a08: 85d6 mv a1,s5 + 80003a0a: 8552 mv a0,s4 + 80003a0c: e97ff0ef jal 800038a2 + 80003a10: 89aa mv s3,a0 + 80003a12: d545 beqz a0,800039ba + iunlockput(ip); + 80003a14: 8552 mv a0,s4 + 80003a16: ae7ff0ef jal 800034fc + ip = next; + 80003a1a: 8a4e mv s4,s3 + while(*path == '/') + 80003a1c: 0004c783 lbu a5,0(s1) + 80003a20: 01279763 bne a5,s2,80003a2e + path++; + 80003a24: 0485 addi s1,s1,1 + while(*path == '/') + 80003a26: 0004c783 lbu a5,0(s1) + 80003a2a: ff278de3 beq a5,s2,80003a24 + if(*path == 0) + 80003a2e: cb8d beqz a5,80003a60 + while(*path != '/' && *path != 0) + 80003a30: 0004c783 lbu a5,0(s1) + 80003a34: 89a6 mv s3,s1 + len = path - s; + 80003a36: 4c81 li s9,0 + 80003a38: 4601 li a2,0 + while(*path != '/' && *path != 0) + 80003a3a: 01278963 beq a5,s2,80003a4c + 80003a3e: d3d9 beqz a5,800039c4 + path++; + 80003a40: 0985 addi s3,s3,1 + while(*path != '/' && *path != 0) + 80003a42: 0009c783 lbu a5,0(s3) + 80003a46: ff279ce3 bne a5,s2,80003a3e + 80003a4a: bfad j 800039c4 + memmove(name, s, len); + 80003a4c: 2601 sext.w a2,a2 + 80003a4e: 85a6 mv a1,s1 + 80003a50: 8556 mv a0,s5 + 80003a52: aacfd0ef jal 80000cfe + name[len] = 0; + 80003a56: 9cd6 add s9,s9,s5 + 80003a58: 000c8023 sb zero,0(s9) # 2000 <_entry-0x7fffe000> + 80003a5c: 84ce mv s1,s3 + 80003a5e: bfbd j 800039dc + if(nameiparent){ + 80003a60: f20b0be3 beqz s6,80003996 + iput(ip); + 80003a64: 8552 mv a0,s4 + 80003a66: a0fff0ef jal 80003474 + return 0; + 80003a6a: 4a01 li s4,0 + 80003a6c: b72d j 80003996 + +0000000080003a6e : +{ + 80003a6e: 7139 addi sp,sp,-64 + 80003a70: fc06 sd ra,56(sp) + 80003a72: f822 sd s0,48(sp) + 80003a74: f04a sd s2,32(sp) + 80003a76: ec4e sd s3,24(sp) + 80003a78: e852 sd s4,16(sp) + 80003a7a: 0080 addi s0,sp,64 + 80003a7c: 892a mv s2,a0 + 80003a7e: 8a2e mv s4,a1 + 80003a80: 89b2 mv s3,a2 + if((ip = dirlookup(dp, name, 0)) != 0){ + 80003a82: 4601 li a2,0 + 80003a84: e1fff0ef jal 800038a2 + 80003a88: e535 bnez a0,80003af4 + 80003a8a: f426 sd s1,40(sp) + for(off = 0; off < dp->size; off += sizeof(de)){ + 80003a8c: 04c92483 lw s1,76(s2) + 80003a90: c48d beqz s1,80003aba + 80003a92: 4481 li s1,0 + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80003a94: 4741 li a4,16 + 80003a96: 86a6 mv a3,s1 + 80003a98: fc040613 addi a2,s0,-64 + 80003a9c: 4581 li a1,0 + 80003a9e: 854a mv a0,s2 + 80003aa0: be3ff0ef jal 80003682 + 80003aa4: 47c1 li a5,16 + 80003aa6: 04f51b63 bne a0,a5,80003afc + if(de.inum == 0) + 80003aaa: fc045783 lhu a5,-64(s0) + 80003aae: c791 beqz a5,80003aba + for(off = 0; off < dp->size; off += sizeof(de)){ + 80003ab0: 24c1 addiw s1,s1,16 + 80003ab2: 04c92783 lw a5,76(s2) + 80003ab6: fcf4efe3 bltu s1,a5,80003a94 + strncpy(de.name, name, DIRSIZ); + 80003aba: 4639 li a2,14 + 80003abc: 85d2 mv a1,s4 + 80003abe: fc240513 addi a0,s0,-62 + 80003ac2: ae2fd0ef jal 80000da4 + de.inum = inum; + 80003ac6: fd341023 sh s3,-64(s0) + if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80003aca: 4741 li a4,16 + 80003acc: 86a6 mv a3,s1 + 80003ace: fc040613 addi a2,s0,-64 + 80003ad2: 4581 li a1,0 + 80003ad4: 854a mv a0,s2 + 80003ad6: ca9ff0ef jal 8000377e + 80003ada: 1541 addi a0,a0,-16 + 80003adc: 00a03533 snez a0,a0 + 80003ae0: 40a00533 neg a0,a0 + 80003ae4: 74a2 ld s1,40(sp) +} + 80003ae6: 70e2 ld ra,56(sp) + 80003ae8: 7442 ld s0,48(sp) + 80003aea: 7902 ld s2,32(sp) + 80003aec: 69e2 ld s3,24(sp) + 80003aee: 6a42 ld s4,16(sp) + 80003af0: 6121 addi sp,sp,64 + 80003af2: 8082 ret + iput(ip); + 80003af4: 981ff0ef jal 80003474 + return -1; + 80003af8: 557d li a0,-1 + 80003afa: b7f5 j 80003ae6 + panic("dirlink read"); + 80003afc: 00004517 auipc a0,0x4 + 80003b00: 9ec50513 addi a0,a0,-1556 # 800074e8 + 80003b04: cddfc0ef jal 800007e0 + +0000000080003b08 : + +struct inode* +namei(char *path) +{ + 80003b08: 1101 addi sp,sp,-32 + 80003b0a: ec06 sd ra,24(sp) + 80003b0c: e822 sd s0,16(sp) + 80003b0e: 1000 addi s0,sp,32 + char name[DIRSIZ]; + return namex(path, 0, name); + 80003b10: fe040613 addi a2,s0,-32 + 80003b14: 4581 li a1,0 + 80003b16: e29ff0ef jal 8000393e +} + 80003b1a: 60e2 ld ra,24(sp) + 80003b1c: 6442 ld s0,16(sp) + 80003b1e: 6105 addi sp,sp,32 + 80003b20: 8082 ret + +0000000080003b22 : + +struct inode* +nameiparent(char *path, char *name) +{ + 80003b22: 1141 addi sp,sp,-16 + 80003b24: e406 sd ra,8(sp) + 80003b26: e022 sd s0,0(sp) + 80003b28: 0800 addi s0,sp,16 + 80003b2a: 862e mv a2,a1 + return namex(path, 1, name); + 80003b2c: 4585 li a1,1 + 80003b2e: e11ff0ef jal 8000393e +} + 80003b32: 60a2 ld ra,8(sp) + 80003b34: 6402 ld s0,0(sp) + 80003b36: 0141 addi sp,sp,16 + 80003b38: 8082 ret + +0000000080003b3a : +// Write in-memory log header to disk. +// This is the true point at which the +// current transaction commits. +static void +write_head(void) +{ + 80003b3a: 1101 addi sp,sp,-32 + 80003b3c: ec06 sd ra,24(sp) + 80003b3e: e822 sd s0,16(sp) + 80003b40: e426 sd s1,8(sp) + 80003b42: e04a sd s2,0(sp) + 80003b44: 1000 addi s0,sp,32 + struct buf *buf = bread(log.dev, log.start); + 80003b46: 0001f917 auipc s2,0x1f + 80003b4a: 82290913 addi s2,s2,-2014 # 80022368 + 80003b4e: 01892583 lw a1,24(s2) + 80003b52: 02492503 lw a0,36(s2) + 80003b56: 8d0ff0ef jal 80002c26 + 80003b5a: 84aa mv s1,a0 + struct logheader *hb = (struct logheader *) (buf->data); + int i; + hb->n = log.lh.n; + 80003b5c: 02892603 lw a2,40(s2) + 80003b60: cd30 sw a2,88(a0) + for (i = 0; i < log.lh.n; i++) { + 80003b62: 00c05f63 blez a2,80003b80 + 80003b66: 0001f717 auipc a4,0x1f + 80003b6a: 82e70713 addi a4,a4,-2002 # 80022394 + 80003b6e: 87aa mv a5,a0 + 80003b70: 060a slli a2,a2,0x2 + 80003b72: 962a add a2,a2,a0 + hb->block[i] = log.lh.block[i]; + 80003b74: 4314 lw a3,0(a4) + 80003b76: cff4 sw a3,92(a5) + for (i = 0; i < log.lh.n; i++) { + 80003b78: 0711 addi a4,a4,4 + 80003b7a: 0791 addi a5,a5,4 + 80003b7c: fec79ce3 bne a5,a2,80003b74 + } + bwrite(buf); + 80003b80: 8526 mv a0,s1 + 80003b82: 97aff0ef jal 80002cfc + brelse(buf); + 80003b86: 8526 mv a0,s1 + 80003b88: 9a6ff0ef jal 80002d2e +} + 80003b8c: 60e2 ld ra,24(sp) + 80003b8e: 6442 ld s0,16(sp) + 80003b90: 64a2 ld s1,8(sp) + 80003b92: 6902 ld s2,0(sp) + 80003b94: 6105 addi sp,sp,32 + 80003b96: 8082 ret + +0000000080003b98 : + for (tail = 0; tail < log.lh.n; tail++) { + 80003b98: 0001e797 auipc a5,0x1e + 80003b9c: 7f87a783 lw a5,2040(a5) # 80022390 + 80003ba0: 0af05e63 blez a5,80003c5c +{ + 80003ba4: 715d addi sp,sp,-80 + 80003ba6: e486 sd ra,72(sp) + 80003ba8: e0a2 sd s0,64(sp) + 80003baa: fc26 sd s1,56(sp) + 80003bac: f84a sd s2,48(sp) + 80003bae: f44e sd s3,40(sp) + 80003bb0: f052 sd s4,32(sp) + 80003bb2: ec56 sd s5,24(sp) + 80003bb4: e85a sd s6,16(sp) + 80003bb6: e45e sd s7,8(sp) + 80003bb8: 0880 addi s0,sp,80 + 80003bba: 8b2a mv s6,a0 + 80003bbc: 0001ea97 auipc s5,0x1e + 80003bc0: 7d8a8a93 addi s5,s5,2008 # 80022394 + for (tail = 0; tail < log.lh.n; tail++) { + 80003bc4: 4981 li s3,0 + printf("recovering tail %d dst %d\n", tail, log.lh.block[tail]); + 80003bc6: 00004b97 auipc s7,0x4 + 80003bca: 932b8b93 addi s7,s7,-1742 # 800074f8 + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block + 80003bce: 0001ea17 auipc s4,0x1e + 80003bd2: 79aa0a13 addi s4,s4,1946 # 80022368 + 80003bd6: a025 j 80003bfe + printf("recovering tail %d dst %d\n", tail, log.lh.block[tail]); + 80003bd8: 000aa603 lw a2,0(s5) + 80003bdc: 85ce mv a1,s3 + 80003bde: 855e mv a0,s7 + 80003be0: 91bfc0ef jal 800004fa + 80003be4: a839 j 80003c02 + brelse(lbuf); + 80003be6: 854a mv a0,s2 + 80003be8: 946ff0ef jal 80002d2e + brelse(dbuf); + 80003bec: 8526 mv a0,s1 + 80003bee: 940ff0ef jal 80002d2e + for (tail = 0; tail < log.lh.n; tail++) { + 80003bf2: 2985 addiw s3,s3,1 + 80003bf4: 0a91 addi s5,s5,4 + 80003bf6: 028a2783 lw a5,40(s4) + 80003bfa: 04f9d663 bge s3,a5,80003c46 + if(recovering) { + 80003bfe: fc0b1de3 bnez s6,80003bd8 + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block + 80003c02: 018a2583 lw a1,24(s4) + 80003c06: 013585bb addw a1,a1,s3 + 80003c0a: 2585 addiw a1,a1,1 + 80003c0c: 024a2503 lw a0,36(s4) + 80003c10: 816ff0ef jal 80002c26 + 80003c14: 892a mv s2,a0 + struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst + 80003c16: 000aa583 lw a1,0(s5) + 80003c1a: 024a2503 lw a0,36(s4) + 80003c1e: 808ff0ef jal 80002c26 + 80003c22: 84aa mv s1,a0 + memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst + 80003c24: 40000613 li a2,1024 + 80003c28: 05890593 addi a1,s2,88 + 80003c2c: 05850513 addi a0,a0,88 + 80003c30: 8cefd0ef jal 80000cfe + bwrite(dbuf); // write dst to disk + 80003c34: 8526 mv a0,s1 + 80003c36: 8c6ff0ef jal 80002cfc + if(recovering == 0) + 80003c3a: fa0b16e3 bnez s6,80003be6 + bunpin(dbuf); + 80003c3e: 8526 mv a0,s1 + 80003c40: 9aaff0ef jal 80002dea + 80003c44: b74d j 80003be6 +} + 80003c46: 60a6 ld ra,72(sp) + 80003c48: 6406 ld s0,64(sp) + 80003c4a: 74e2 ld s1,56(sp) + 80003c4c: 7942 ld s2,48(sp) + 80003c4e: 79a2 ld s3,40(sp) + 80003c50: 7a02 ld s4,32(sp) + 80003c52: 6ae2 ld s5,24(sp) + 80003c54: 6b42 ld s6,16(sp) + 80003c56: 6ba2 ld s7,8(sp) + 80003c58: 6161 addi sp,sp,80 + 80003c5a: 8082 ret + 80003c5c: 8082 ret + +0000000080003c5e : +{ + 80003c5e: 7179 addi sp,sp,-48 + 80003c60: f406 sd ra,40(sp) + 80003c62: f022 sd s0,32(sp) + 80003c64: ec26 sd s1,24(sp) + 80003c66: e84a sd s2,16(sp) + 80003c68: e44e sd s3,8(sp) + 80003c6a: 1800 addi s0,sp,48 + 80003c6c: 892a mv s2,a0 + 80003c6e: 89ae mv s3,a1 + initlock(&log.lock, "log"); + 80003c70: 0001e497 auipc s1,0x1e + 80003c74: 6f848493 addi s1,s1,1784 # 80022368 + 80003c78: 00004597 auipc a1,0x4 + 80003c7c: 8a058593 addi a1,a1,-1888 # 80007518 + 80003c80: 8526 mv a0,s1 + 80003c82: ecdfc0ef jal 80000b4e + log.start = sb->logstart; + 80003c86: 0149a583 lw a1,20(s3) + 80003c8a: cc8c sw a1,24(s1) + log.dev = dev; + 80003c8c: 0324a223 sw s2,36(s1) + struct buf *buf = bread(log.dev, log.start); + 80003c90: 854a mv a0,s2 + 80003c92: f95fe0ef jal 80002c26 + log.lh.n = lh->n; + 80003c96: 4d30 lw a2,88(a0) + 80003c98: d490 sw a2,40(s1) + for (i = 0; i < log.lh.n; i++) { + 80003c9a: 00c05f63 blez a2,80003cb8 + 80003c9e: 87aa mv a5,a0 + 80003ca0: 0001e717 auipc a4,0x1e + 80003ca4: 6f470713 addi a4,a4,1780 # 80022394 + 80003ca8: 060a slli a2,a2,0x2 + 80003caa: 962a add a2,a2,a0 + log.lh.block[i] = lh->block[i]; + 80003cac: 4ff4 lw a3,92(a5) + 80003cae: c314 sw a3,0(a4) + for (i = 0; i < log.lh.n; i++) { + 80003cb0: 0791 addi a5,a5,4 + 80003cb2: 0711 addi a4,a4,4 + 80003cb4: fec79ce3 bne a5,a2,80003cac + brelse(buf); + 80003cb8: 876ff0ef jal 80002d2e + +static void +recover_from_log(void) +{ + read_head(); + install_trans(1); // if committed, copy from log to disk + 80003cbc: 4505 li a0,1 + 80003cbe: edbff0ef jal 80003b98 + log.lh.n = 0; + 80003cc2: 0001e797 auipc a5,0x1e + 80003cc6: 6c07a723 sw zero,1742(a5) # 80022390 + write_head(); // clear the log + 80003cca: e71ff0ef jal 80003b3a +} + 80003cce: 70a2 ld ra,40(sp) + 80003cd0: 7402 ld s0,32(sp) + 80003cd2: 64e2 ld s1,24(sp) + 80003cd4: 6942 ld s2,16(sp) + 80003cd6: 69a2 ld s3,8(sp) + 80003cd8: 6145 addi sp,sp,48 + 80003cda: 8082 ret + +0000000080003cdc : +} + +// called at the start of each FS system call. +void +begin_op(void) +{ + 80003cdc: 1101 addi sp,sp,-32 + 80003cde: ec06 sd ra,24(sp) + 80003ce0: e822 sd s0,16(sp) + 80003ce2: e426 sd s1,8(sp) + 80003ce4: e04a sd s2,0(sp) + 80003ce6: 1000 addi s0,sp,32 + acquire(&log.lock); + 80003ce8: 0001e517 auipc a0,0x1e + 80003cec: 68050513 addi a0,a0,1664 # 80022368 + 80003cf0: edffc0ef jal 80000bce + while(1){ + if(log.committing){ + 80003cf4: 0001e497 auipc s1,0x1e + 80003cf8: 67448493 addi s1,s1,1652 # 80022368 + sleep(&log, &log.lock); + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGBLOCKS){ + 80003cfc: 4979 li s2,30 + 80003cfe: a029 j 80003d08 + sleep(&log, &log.lock); + 80003d00: 85a6 mv a1,s1 + 80003d02: 8526 mv a0,s1 + 80003d04: 9d4fe0ef jal 80001ed8 + if(log.committing){ + 80003d08: 509c lw a5,32(s1) + 80003d0a: fbfd bnez a5,80003d00 + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGBLOCKS){ + 80003d0c: 4cd8 lw a4,28(s1) + 80003d0e: 2705 addiw a4,a4,1 + 80003d10: 0027179b slliw a5,a4,0x2 + 80003d14: 9fb9 addw a5,a5,a4 + 80003d16: 0017979b slliw a5,a5,0x1 + 80003d1a: 5494 lw a3,40(s1) + 80003d1c: 9fb5 addw a5,a5,a3 + 80003d1e: 00f95763 bge s2,a5,80003d2c + // this op might exhaust log space; wait for commit. + sleep(&log, &log.lock); + 80003d22: 85a6 mv a1,s1 + 80003d24: 8526 mv a0,s1 + 80003d26: 9b2fe0ef jal 80001ed8 + 80003d2a: bff9 j 80003d08 + } else { + log.outstanding += 1; + 80003d2c: 0001e517 auipc a0,0x1e + 80003d30: 63c50513 addi a0,a0,1596 # 80022368 + 80003d34: cd58 sw a4,28(a0) + release(&log.lock); + 80003d36: f31fc0ef jal 80000c66 + break; + } + } +} + 80003d3a: 60e2 ld ra,24(sp) + 80003d3c: 6442 ld s0,16(sp) + 80003d3e: 64a2 ld s1,8(sp) + 80003d40: 6902 ld s2,0(sp) + 80003d42: 6105 addi sp,sp,32 + 80003d44: 8082 ret + +0000000080003d46 : + +// called at the end of each FS system call. +// commits if this was the last outstanding operation. +void +end_op(void) +{ + 80003d46: 7139 addi sp,sp,-64 + 80003d48: fc06 sd ra,56(sp) + 80003d4a: f822 sd s0,48(sp) + 80003d4c: f426 sd s1,40(sp) + 80003d4e: f04a sd s2,32(sp) + 80003d50: 0080 addi s0,sp,64 + int do_commit = 0; + + acquire(&log.lock); + 80003d52: 0001e497 auipc s1,0x1e + 80003d56: 61648493 addi s1,s1,1558 # 80022368 + 80003d5a: 8526 mv a0,s1 + 80003d5c: e73fc0ef jal 80000bce + log.outstanding -= 1; + 80003d60: 4cdc lw a5,28(s1) + 80003d62: 37fd addiw a5,a5,-1 + 80003d64: 0007891b sext.w s2,a5 + 80003d68: ccdc sw a5,28(s1) + if(log.committing) + 80003d6a: 509c lw a5,32(s1) + 80003d6c: ef9d bnez a5,80003daa + panic("log.committing"); + if(log.outstanding == 0){ + 80003d6e: 04091763 bnez s2,80003dbc + do_commit = 1; + log.committing = 1; + 80003d72: 0001e497 auipc s1,0x1e + 80003d76: 5f648493 addi s1,s1,1526 # 80022368 + 80003d7a: 4785 li a5,1 + 80003d7c: d09c sw a5,32(s1) + // begin_op() may be waiting for log space, + // and decrementing log.outstanding has decreased + // the amount of reserved space. + wakeup(&log); + } + release(&log.lock); + 80003d7e: 8526 mv a0,s1 + 80003d80: ee7fc0ef jal 80000c66 +} + +static void +commit() +{ + if (log.lh.n > 0) { + 80003d84: 549c lw a5,40(s1) + 80003d86: 04f04b63 bgtz a5,80003ddc + acquire(&log.lock); + 80003d8a: 0001e497 auipc s1,0x1e + 80003d8e: 5de48493 addi s1,s1,1502 # 80022368 + 80003d92: 8526 mv a0,s1 + 80003d94: e3bfc0ef jal 80000bce + log.committing = 0; + 80003d98: 0204a023 sw zero,32(s1) + wakeup(&log); + 80003d9c: 8526 mv a0,s1 + 80003d9e: 986fe0ef jal 80001f24 + release(&log.lock); + 80003da2: 8526 mv a0,s1 + 80003da4: ec3fc0ef jal 80000c66 +} + 80003da8: a025 j 80003dd0 + 80003daa: ec4e sd s3,24(sp) + 80003dac: e852 sd s4,16(sp) + 80003dae: e456 sd s5,8(sp) + panic("log.committing"); + 80003db0: 00003517 auipc a0,0x3 + 80003db4: 77050513 addi a0,a0,1904 # 80007520 + 80003db8: a29fc0ef jal 800007e0 + wakeup(&log); + 80003dbc: 0001e497 auipc s1,0x1e + 80003dc0: 5ac48493 addi s1,s1,1452 # 80022368 + 80003dc4: 8526 mv a0,s1 + 80003dc6: 95efe0ef jal 80001f24 + release(&log.lock); + 80003dca: 8526 mv a0,s1 + 80003dcc: e9bfc0ef jal 80000c66 +} + 80003dd0: 70e2 ld ra,56(sp) + 80003dd2: 7442 ld s0,48(sp) + 80003dd4: 74a2 ld s1,40(sp) + 80003dd6: 7902 ld s2,32(sp) + 80003dd8: 6121 addi sp,sp,64 + 80003dda: 8082 ret + 80003ddc: ec4e sd s3,24(sp) + 80003dde: e852 sd s4,16(sp) + 80003de0: e456 sd s5,8(sp) + for (tail = 0; tail < log.lh.n; tail++) { + 80003de2: 0001ea97 auipc s5,0x1e + 80003de6: 5b2a8a93 addi s5,s5,1458 # 80022394 + struct buf *to = bread(log.dev, log.start+tail+1); // log block + 80003dea: 0001ea17 auipc s4,0x1e + 80003dee: 57ea0a13 addi s4,s4,1406 # 80022368 + 80003df2: 018a2583 lw a1,24(s4) + 80003df6: 012585bb addw a1,a1,s2 + 80003dfa: 2585 addiw a1,a1,1 + 80003dfc: 024a2503 lw a0,36(s4) + 80003e00: e27fe0ef jal 80002c26 + 80003e04: 84aa mv s1,a0 + struct buf *from = bread(log.dev, log.lh.block[tail]); // cache block + 80003e06: 000aa583 lw a1,0(s5) + 80003e0a: 024a2503 lw a0,36(s4) + 80003e0e: e19fe0ef jal 80002c26 + 80003e12: 89aa mv s3,a0 + memmove(to->data, from->data, BSIZE); + 80003e14: 40000613 li a2,1024 + 80003e18: 05850593 addi a1,a0,88 + 80003e1c: 05848513 addi a0,s1,88 + 80003e20: edffc0ef jal 80000cfe + bwrite(to); // write the log + 80003e24: 8526 mv a0,s1 + 80003e26: ed7fe0ef jal 80002cfc + brelse(from); + 80003e2a: 854e mv a0,s3 + 80003e2c: f03fe0ef jal 80002d2e + brelse(to); + 80003e30: 8526 mv a0,s1 + 80003e32: efdfe0ef jal 80002d2e + for (tail = 0; tail < log.lh.n; tail++) { + 80003e36: 2905 addiw s2,s2,1 + 80003e38: 0a91 addi s5,s5,4 + 80003e3a: 028a2783 lw a5,40(s4) + 80003e3e: faf94ae3 blt s2,a5,80003df2 + write_log(); // Write modified blocks from cache to log + write_head(); // Write header to disk -- the real commit + 80003e42: cf9ff0ef jal 80003b3a + install_trans(0); // Now install writes to home locations + 80003e46: 4501 li a0,0 + 80003e48: d51ff0ef jal 80003b98 + log.lh.n = 0; + 80003e4c: 0001e797 auipc a5,0x1e + 80003e50: 5407a223 sw zero,1348(a5) # 80022390 + write_head(); // Erase the transaction from the log + 80003e54: ce7ff0ef jal 80003b3a + 80003e58: 69e2 ld s3,24(sp) + 80003e5a: 6a42 ld s4,16(sp) + 80003e5c: 6aa2 ld s5,8(sp) + 80003e5e: b735 j 80003d8a + +0000000080003e60 : +// modify bp->data[] +// log_write(bp) +// brelse(bp) +void +log_write(struct buf *b) +{ + 80003e60: 1101 addi sp,sp,-32 + 80003e62: ec06 sd ra,24(sp) + 80003e64: e822 sd s0,16(sp) + 80003e66: e426 sd s1,8(sp) + 80003e68: e04a sd s2,0(sp) + 80003e6a: 1000 addi s0,sp,32 + 80003e6c: 84aa mv s1,a0 + int i; + + acquire(&log.lock); + 80003e6e: 0001e917 auipc s2,0x1e + 80003e72: 4fa90913 addi s2,s2,1274 # 80022368 + 80003e76: 854a mv a0,s2 + 80003e78: d57fc0ef jal 80000bce + if (log.lh.n >= LOGBLOCKS) + 80003e7c: 02892603 lw a2,40(s2) + 80003e80: 47f5 li a5,29 + 80003e82: 04c7cc63 blt a5,a2,80003eda + panic("too big a transaction"); + if (log.outstanding < 1) + 80003e86: 0001e797 auipc a5,0x1e + 80003e8a: 4fe7a783 lw a5,1278(a5) # 80022384 + 80003e8e: 04f05c63 blez a5,80003ee6 + panic("log_write outside of trans"); + + for (i = 0; i < log.lh.n; i++) { + 80003e92: 4781 li a5,0 + 80003e94: 04c05f63 blez a2,80003ef2 + if (log.lh.block[i] == b->blockno) // log absorption + 80003e98: 44cc lw a1,12(s1) + 80003e9a: 0001e717 auipc a4,0x1e + 80003e9e: 4fa70713 addi a4,a4,1274 # 80022394 + for (i = 0; i < log.lh.n; i++) { + 80003ea2: 4781 li a5,0 + if (log.lh.block[i] == b->blockno) // log absorption + 80003ea4: 4314 lw a3,0(a4) + 80003ea6: 04b68663 beq a3,a1,80003ef2 + for (i = 0; i < log.lh.n; i++) { + 80003eaa: 2785 addiw a5,a5,1 + 80003eac: 0711 addi a4,a4,4 + 80003eae: fef61be3 bne a2,a5,80003ea4 + break; + } + log.lh.block[i] = b->blockno; + 80003eb2: 0621 addi a2,a2,8 + 80003eb4: 060a slli a2,a2,0x2 + 80003eb6: 0001e797 auipc a5,0x1e + 80003eba: 4b278793 addi a5,a5,1202 # 80022368 + 80003ebe: 97b2 add a5,a5,a2 + 80003ec0: 44d8 lw a4,12(s1) + 80003ec2: c7d8 sw a4,12(a5) + if (i == log.lh.n) { // Add new block to log? + bpin(b); + 80003ec4: 8526 mv a0,s1 + 80003ec6: ef1fe0ef jal 80002db6 + log.lh.n++; + 80003eca: 0001e717 auipc a4,0x1e + 80003ece: 49e70713 addi a4,a4,1182 # 80022368 + 80003ed2: 571c lw a5,40(a4) + 80003ed4: 2785 addiw a5,a5,1 + 80003ed6: d71c sw a5,40(a4) + 80003ed8: a80d j 80003f0a + panic("too big a transaction"); + 80003eda: 00003517 auipc a0,0x3 + 80003ede: 65650513 addi a0,a0,1622 # 80007530 + 80003ee2: 8fffc0ef jal 800007e0 + panic("log_write outside of trans"); + 80003ee6: 00003517 auipc a0,0x3 + 80003eea: 66250513 addi a0,a0,1634 # 80007548 + 80003eee: 8f3fc0ef jal 800007e0 + log.lh.block[i] = b->blockno; + 80003ef2: 00878693 addi a3,a5,8 + 80003ef6: 068a slli a3,a3,0x2 + 80003ef8: 0001e717 auipc a4,0x1e + 80003efc: 47070713 addi a4,a4,1136 # 80022368 + 80003f00: 9736 add a4,a4,a3 + 80003f02: 44d4 lw a3,12(s1) + 80003f04: c754 sw a3,12(a4) + if (i == log.lh.n) { // Add new block to log? + 80003f06: faf60fe3 beq a2,a5,80003ec4 + } + release(&log.lock); + 80003f0a: 0001e517 auipc a0,0x1e + 80003f0e: 45e50513 addi a0,a0,1118 # 80022368 + 80003f12: d55fc0ef jal 80000c66 +} + 80003f16: 60e2 ld ra,24(sp) + 80003f18: 6442 ld s0,16(sp) + 80003f1a: 64a2 ld s1,8(sp) + 80003f1c: 6902 ld s2,0(sp) + 80003f1e: 6105 addi sp,sp,32 + 80003f20: 8082 ret + +0000000080003f22 : +#include "proc.h" +#include "sleeplock.h" + +void +initsleeplock(struct sleeplock *lk, char *name) +{ + 80003f22: 1101 addi sp,sp,-32 + 80003f24: ec06 sd ra,24(sp) + 80003f26: e822 sd s0,16(sp) + 80003f28: e426 sd s1,8(sp) + 80003f2a: e04a sd s2,0(sp) + 80003f2c: 1000 addi s0,sp,32 + 80003f2e: 84aa mv s1,a0 + 80003f30: 892e mv s2,a1 + initlock(&lk->lk, "sleep lock"); + 80003f32: 00003597 auipc a1,0x3 + 80003f36: 63658593 addi a1,a1,1590 # 80007568 + 80003f3a: 0521 addi a0,a0,8 + 80003f3c: c13fc0ef jal 80000b4e + lk->name = name; + 80003f40: 0324b023 sd s2,32(s1) + lk->locked = 0; + 80003f44: 0004a023 sw zero,0(s1) + lk->pid = 0; + 80003f48: 0204a423 sw zero,40(s1) +} + 80003f4c: 60e2 ld ra,24(sp) + 80003f4e: 6442 ld s0,16(sp) + 80003f50: 64a2 ld s1,8(sp) + 80003f52: 6902 ld s2,0(sp) + 80003f54: 6105 addi sp,sp,32 + 80003f56: 8082 ret + +0000000080003f58 : + +void +acquiresleep(struct sleeplock *lk) +{ + 80003f58: 1101 addi sp,sp,-32 + 80003f5a: ec06 sd ra,24(sp) + 80003f5c: e822 sd s0,16(sp) + 80003f5e: e426 sd s1,8(sp) + 80003f60: e04a sd s2,0(sp) + 80003f62: 1000 addi s0,sp,32 + 80003f64: 84aa mv s1,a0 + acquire(&lk->lk); + 80003f66: 00850913 addi s2,a0,8 + 80003f6a: 854a mv a0,s2 + 80003f6c: c63fc0ef jal 80000bce + while (lk->locked) { + 80003f70: 409c lw a5,0(s1) + 80003f72: c799 beqz a5,80003f80 + sleep(lk, &lk->lk); + 80003f74: 85ca mv a1,s2 + 80003f76: 8526 mv a0,s1 + 80003f78: f61fd0ef jal 80001ed8 + while (lk->locked) { + 80003f7c: 409c lw a5,0(s1) + 80003f7e: fbfd bnez a5,80003f74 + } + lk->locked = 1; + 80003f80: 4785 li a5,1 + 80003f82: c09c sw a5,0(s1) + lk->pid = myproc()->pid; + 80003f84: 94bfd0ef jal 800018ce + 80003f88: 591c lw a5,48(a0) + 80003f8a: d49c sw a5,40(s1) + release(&lk->lk); + 80003f8c: 854a mv a0,s2 + 80003f8e: cd9fc0ef jal 80000c66 +} + 80003f92: 60e2 ld ra,24(sp) + 80003f94: 6442 ld s0,16(sp) + 80003f96: 64a2 ld s1,8(sp) + 80003f98: 6902 ld s2,0(sp) + 80003f9a: 6105 addi sp,sp,32 + 80003f9c: 8082 ret + +0000000080003f9e : + +void +releasesleep(struct sleeplock *lk) +{ + 80003f9e: 1101 addi sp,sp,-32 + 80003fa0: ec06 sd ra,24(sp) + 80003fa2: e822 sd s0,16(sp) + 80003fa4: e426 sd s1,8(sp) + 80003fa6: e04a sd s2,0(sp) + 80003fa8: 1000 addi s0,sp,32 + 80003faa: 84aa mv s1,a0 + acquire(&lk->lk); + 80003fac: 00850913 addi s2,a0,8 + 80003fb0: 854a mv a0,s2 + 80003fb2: c1dfc0ef jal 80000bce + lk->locked = 0; + 80003fb6: 0004a023 sw zero,0(s1) + lk->pid = 0; + 80003fba: 0204a423 sw zero,40(s1) + wakeup(lk); + 80003fbe: 8526 mv a0,s1 + 80003fc0: f65fd0ef jal 80001f24 + release(&lk->lk); + 80003fc4: 854a mv a0,s2 + 80003fc6: ca1fc0ef jal 80000c66 +} + 80003fca: 60e2 ld ra,24(sp) + 80003fcc: 6442 ld s0,16(sp) + 80003fce: 64a2 ld s1,8(sp) + 80003fd0: 6902 ld s2,0(sp) + 80003fd2: 6105 addi sp,sp,32 + 80003fd4: 8082 ret + +0000000080003fd6 : + +int +holdingsleep(struct sleeplock *lk) +{ + 80003fd6: 7179 addi sp,sp,-48 + 80003fd8: f406 sd ra,40(sp) + 80003fda: f022 sd s0,32(sp) + 80003fdc: ec26 sd s1,24(sp) + 80003fde: e84a sd s2,16(sp) + 80003fe0: 1800 addi s0,sp,48 + 80003fe2: 84aa mv s1,a0 + int r; + + acquire(&lk->lk); + 80003fe4: 00850913 addi s2,a0,8 + 80003fe8: 854a mv a0,s2 + 80003fea: be5fc0ef jal 80000bce + r = lk->locked && (lk->pid == myproc()->pid); + 80003fee: 409c lw a5,0(s1) + 80003ff0: ef81 bnez a5,80004008 + 80003ff2: 4481 li s1,0 + release(&lk->lk); + 80003ff4: 854a mv a0,s2 + 80003ff6: c71fc0ef jal 80000c66 + return r; +} + 80003ffa: 8526 mv a0,s1 + 80003ffc: 70a2 ld ra,40(sp) + 80003ffe: 7402 ld s0,32(sp) + 80004000: 64e2 ld s1,24(sp) + 80004002: 6942 ld s2,16(sp) + 80004004: 6145 addi sp,sp,48 + 80004006: 8082 ret + 80004008: e44e sd s3,8(sp) + r = lk->locked && (lk->pid == myproc()->pid); + 8000400a: 0284a983 lw s3,40(s1) + 8000400e: 8c1fd0ef jal 800018ce + 80004012: 5904 lw s1,48(a0) + 80004014: 413484b3 sub s1,s1,s3 + 80004018: 0014b493 seqz s1,s1 + 8000401c: 69a2 ld s3,8(sp) + 8000401e: bfd9 j 80003ff4 + +0000000080004020 : + struct file file[NFILE]; +} ftable; + +void +fileinit(void) +{ + 80004020: 1141 addi sp,sp,-16 + 80004022: e406 sd ra,8(sp) + 80004024: e022 sd s0,0(sp) + 80004026: 0800 addi s0,sp,16 + initlock(&ftable.lock, "ftable"); + 80004028: 00003597 auipc a1,0x3 + 8000402c: 55058593 addi a1,a1,1360 # 80007578 + 80004030: 0001e517 auipc a0,0x1e + 80004034: 48050513 addi a0,a0,1152 # 800224b0 + 80004038: b17fc0ef jal 80000b4e +} + 8000403c: 60a2 ld ra,8(sp) + 8000403e: 6402 ld s0,0(sp) + 80004040: 0141 addi sp,sp,16 + 80004042: 8082 ret + +0000000080004044 : + +// Allocate a file structure. +struct file* +filealloc(void) +{ + 80004044: 1101 addi sp,sp,-32 + 80004046: ec06 sd ra,24(sp) + 80004048: e822 sd s0,16(sp) + 8000404a: e426 sd s1,8(sp) + 8000404c: 1000 addi s0,sp,32 + struct file *f; + + acquire(&ftable.lock); + 8000404e: 0001e517 auipc a0,0x1e + 80004052: 46250513 addi a0,a0,1122 # 800224b0 + 80004056: b79fc0ef jal 80000bce + for(f = ftable.file; f < ftable.file + NFILE; f++){ + 8000405a: 0001e497 auipc s1,0x1e + 8000405e: 46e48493 addi s1,s1,1134 # 800224c8 + 80004062: 0001f717 auipc a4,0x1f + 80004066: 40670713 addi a4,a4,1030 # 80023468 + if(f->ref == 0){ + 8000406a: 40dc lw a5,4(s1) + 8000406c: cf89 beqz a5,80004086 + for(f = ftable.file; f < ftable.file + NFILE; f++){ + 8000406e: 02848493 addi s1,s1,40 + 80004072: fee49ce3 bne s1,a4,8000406a + f->ref = 1; + release(&ftable.lock); + return f; + } + } + release(&ftable.lock); + 80004076: 0001e517 auipc a0,0x1e + 8000407a: 43a50513 addi a0,a0,1082 # 800224b0 + 8000407e: be9fc0ef jal 80000c66 + return 0; + 80004082: 4481 li s1,0 + 80004084: a809 j 80004096 + f->ref = 1; + 80004086: 4785 li a5,1 + 80004088: c0dc sw a5,4(s1) + release(&ftable.lock); + 8000408a: 0001e517 auipc a0,0x1e + 8000408e: 42650513 addi a0,a0,1062 # 800224b0 + 80004092: bd5fc0ef jal 80000c66 +} + 80004096: 8526 mv a0,s1 + 80004098: 60e2 ld ra,24(sp) + 8000409a: 6442 ld s0,16(sp) + 8000409c: 64a2 ld s1,8(sp) + 8000409e: 6105 addi sp,sp,32 + 800040a0: 8082 ret + +00000000800040a2 : + +// Increment ref count for file f. +struct file* +filedup(struct file *f) +{ + 800040a2: 1101 addi sp,sp,-32 + 800040a4: ec06 sd ra,24(sp) + 800040a6: e822 sd s0,16(sp) + 800040a8: e426 sd s1,8(sp) + 800040aa: 1000 addi s0,sp,32 + 800040ac: 84aa mv s1,a0 + acquire(&ftable.lock); + 800040ae: 0001e517 auipc a0,0x1e + 800040b2: 40250513 addi a0,a0,1026 # 800224b0 + 800040b6: b19fc0ef jal 80000bce + if(f->ref < 1) + 800040ba: 40dc lw a5,4(s1) + 800040bc: 02f05063 blez a5,800040dc + panic("filedup"); + f->ref++; + 800040c0: 2785 addiw a5,a5,1 + 800040c2: c0dc sw a5,4(s1) + release(&ftable.lock); + 800040c4: 0001e517 auipc a0,0x1e + 800040c8: 3ec50513 addi a0,a0,1004 # 800224b0 + 800040cc: b9bfc0ef jal 80000c66 + return f; +} + 800040d0: 8526 mv a0,s1 + 800040d2: 60e2 ld ra,24(sp) + 800040d4: 6442 ld s0,16(sp) + 800040d6: 64a2 ld s1,8(sp) + 800040d8: 6105 addi sp,sp,32 + 800040da: 8082 ret + panic("filedup"); + 800040dc: 00003517 auipc a0,0x3 + 800040e0: 4a450513 addi a0,a0,1188 # 80007580 + 800040e4: efcfc0ef jal 800007e0 + +00000000800040e8 : + +// Close file f. (Decrement ref count, close when reaches 0.) +void +fileclose(struct file *f) +{ + 800040e8: 7139 addi sp,sp,-64 + 800040ea: fc06 sd ra,56(sp) + 800040ec: f822 sd s0,48(sp) + 800040ee: f426 sd s1,40(sp) + 800040f0: 0080 addi s0,sp,64 + 800040f2: 84aa mv s1,a0 + struct file ff; + + acquire(&ftable.lock); + 800040f4: 0001e517 auipc a0,0x1e + 800040f8: 3bc50513 addi a0,a0,956 # 800224b0 + 800040fc: ad3fc0ef jal 80000bce + if(f->ref < 1) + 80004100: 40dc lw a5,4(s1) + 80004102: 04f05a63 blez a5,80004156 + panic("fileclose"); + if(--f->ref > 0){ + 80004106: 37fd addiw a5,a5,-1 + 80004108: 0007871b sext.w a4,a5 + 8000410c: c0dc sw a5,4(s1) + 8000410e: 04e04e63 bgtz a4,8000416a + 80004112: f04a sd s2,32(sp) + 80004114: ec4e sd s3,24(sp) + 80004116: e852 sd s4,16(sp) + 80004118: e456 sd s5,8(sp) + release(&ftable.lock); + return; + } + ff = *f; + 8000411a: 0004a903 lw s2,0(s1) + 8000411e: 0094ca83 lbu s5,9(s1) + 80004122: 0104ba03 ld s4,16(s1) + 80004126: 0184b983 ld s3,24(s1) + f->ref = 0; + 8000412a: 0004a223 sw zero,4(s1) + f->type = FD_NONE; + 8000412e: 0004a023 sw zero,0(s1) + release(&ftable.lock); + 80004132: 0001e517 auipc a0,0x1e + 80004136: 37e50513 addi a0,a0,894 # 800224b0 + 8000413a: b2dfc0ef jal 80000c66 + + if(ff.type == FD_PIPE){ + 8000413e: 4785 li a5,1 + 80004140: 04f90063 beq s2,a5,80004180 + pipeclose(ff.pipe, ff.writable); + } else if(ff.type == FD_INODE || ff.type == FD_DEVICE){ + 80004144: 3979 addiw s2,s2,-2 + 80004146: 4785 li a5,1 + 80004148: 0527f563 bgeu a5,s2,80004192 + 8000414c: 7902 ld s2,32(sp) + 8000414e: 69e2 ld s3,24(sp) + 80004150: 6a42 ld s4,16(sp) + 80004152: 6aa2 ld s5,8(sp) + 80004154: a00d j 80004176 + 80004156: f04a sd s2,32(sp) + 80004158: ec4e sd s3,24(sp) + 8000415a: e852 sd s4,16(sp) + 8000415c: e456 sd s5,8(sp) + panic("fileclose"); + 8000415e: 00003517 auipc a0,0x3 + 80004162: 42a50513 addi a0,a0,1066 # 80007588 + 80004166: e7afc0ef jal 800007e0 + release(&ftable.lock); + 8000416a: 0001e517 auipc a0,0x1e + 8000416e: 34650513 addi a0,a0,838 # 800224b0 + 80004172: af5fc0ef jal 80000c66 + begin_op(); + iput(ff.ip); + end_op(); + } +} + 80004176: 70e2 ld ra,56(sp) + 80004178: 7442 ld s0,48(sp) + 8000417a: 74a2 ld s1,40(sp) + 8000417c: 6121 addi sp,sp,64 + 8000417e: 8082 ret + pipeclose(ff.pipe, ff.writable); + 80004180: 85d6 mv a1,s5 + 80004182: 8552 mv a0,s4 + 80004184: 336000ef jal 800044ba + 80004188: 7902 ld s2,32(sp) + 8000418a: 69e2 ld s3,24(sp) + 8000418c: 6a42 ld s4,16(sp) + 8000418e: 6aa2 ld s5,8(sp) + 80004190: b7dd j 80004176 + begin_op(); + 80004192: b4bff0ef jal 80003cdc + iput(ff.ip); + 80004196: 854e mv a0,s3 + 80004198: adcff0ef jal 80003474 + end_op(); + 8000419c: babff0ef jal 80003d46 + 800041a0: 7902 ld s2,32(sp) + 800041a2: 69e2 ld s3,24(sp) + 800041a4: 6a42 ld s4,16(sp) + 800041a6: 6aa2 ld s5,8(sp) + 800041a8: b7f9 j 80004176 + +00000000800041aa : + +// Get metadata about file f. +// addr is a user virtual address, pointing to a struct stat. +int +filestat(struct file *f, uint64 addr) +{ + 800041aa: 715d addi sp,sp,-80 + 800041ac: e486 sd ra,72(sp) + 800041ae: e0a2 sd s0,64(sp) + 800041b0: fc26 sd s1,56(sp) + 800041b2: f44e sd s3,40(sp) + 800041b4: 0880 addi s0,sp,80 + 800041b6: 84aa mv s1,a0 + 800041b8: 89ae mv s3,a1 + struct proc *p = myproc(); + 800041ba: f14fd0ef jal 800018ce + struct stat st; + + if(f->type == FD_INODE || f->type == FD_DEVICE){ + 800041be: 409c lw a5,0(s1) + 800041c0: 37f9 addiw a5,a5,-2 + 800041c2: 4705 li a4,1 + 800041c4: 04f76063 bltu a4,a5,80004204 + 800041c8: f84a sd s2,48(sp) + 800041ca: 892a mv s2,a0 + ilock(f->ip); + 800041cc: 6c88 ld a0,24(s1) + 800041ce: 924ff0ef jal 800032f2 + stati(f->ip, &st); + 800041d2: fb840593 addi a1,s0,-72 + 800041d6: 6c88 ld a0,24(s1) + 800041d8: c80ff0ef jal 80003658 + iunlock(f->ip); + 800041dc: 6c88 ld a0,24(s1) + 800041de: 9c2ff0ef jal 800033a0 + if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0) + 800041e2: 46e1 li a3,24 + 800041e4: fb840613 addi a2,s0,-72 + 800041e8: 85ce mv a1,s3 + 800041ea: 05093503 ld a0,80(s2) + 800041ee: bf4fd0ef jal 800015e2 + 800041f2: 41f5551b sraiw a0,a0,0x1f + 800041f6: 7942 ld s2,48(sp) + return -1; + return 0; + } + return -1; +} + 800041f8: 60a6 ld ra,72(sp) + 800041fa: 6406 ld s0,64(sp) + 800041fc: 74e2 ld s1,56(sp) + 800041fe: 79a2 ld s3,40(sp) + 80004200: 6161 addi sp,sp,80 + 80004202: 8082 ret + return -1; + 80004204: 557d li a0,-1 + 80004206: bfcd j 800041f8 + +0000000080004208 : + +// Read from file f. +// addr is a user virtual address. +int +fileread(struct file *f, uint64 addr, int n) +{ + 80004208: 7179 addi sp,sp,-48 + 8000420a: f406 sd ra,40(sp) + 8000420c: f022 sd s0,32(sp) + 8000420e: e84a sd s2,16(sp) + 80004210: 1800 addi s0,sp,48 + int r = 0; + + if(f->readable == 0) + 80004212: 00854783 lbu a5,8(a0) + 80004216: cfd1 beqz a5,800042b2 + 80004218: ec26 sd s1,24(sp) + 8000421a: e44e sd s3,8(sp) + 8000421c: 84aa mv s1,a0 + 8000421e: 89ae mv s3,a1 + 80004220: 8932 mv s2,a2 + return -1; + + if(f->type == FD_PIPE){ + 80004222: 411c lw a5,0(a0) + 80004224: 4705 li a4,1 + 80004226: 04e78363 beq a5,a4,8000426c + r = piperead(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ + 8000422a: 470d li a4,3 + 8000422c: 04e78763 beq a5,a4,8000427a + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read) + return -1; + r = devsw[f->major].read(1, addr, n); + } else if(f->type == FD_INODE){ + 80004230: 4709 li a4,2 + 80004232: 06e79a63 bne a5,a4,800042a6 + ilock(f->ip); + 80004236: 6d08 ld a0,24(a0) + 80004238: 8baff0ef jal 800032f2 + if((r = readi(f->ip, 1, addr, f->off, n)) > 0) + 8000423c: 874a mv a4,s2 + 8000423e: 5094 lw a3,32(s1) + 80004240: 864e mv a2,s3 + 80004242: 4585 li a1,1 + 80004244: 6c88 ld a0,24(s1) + 80004246: c3cff0ef jal 80003682 + 8000424a: 892a mv s2,a0 + 8000424c: 00a05563 blez a0,80004256 + f->off += r; + 80004250: 509c lw a5,32(s1) + 80004252: 9fa9 addw a5,a5,a0 + 80004254: d09c sw a5,32(s1) + iunlock(f->ip); + 80004256: 6c88 ld a0,24(s1) + 80004258: 948ff0ef jal 800033a0 + 8000425c: 64e2 ld s1,24(sp) + 8000425e: 69a2 ld s3,8(sp) + } else { + panic("fileread"); + } + + return r; +} + 80004260: 854a mv a0,s2 + 80004262: 70a2 ld ra,40(sp) + 80004264: 7402 ld s0,32(sp) + 80004266: 6942 ld s2,16(sp) + 80004268: 6145 addi sp,sp,48 + 8000426a: 8082 ret + r = piperead(f->pipe, addr, n); + 8000426c: 6908 ld a0,16(a0) + 8000426e: 388000ef jal 800045f6 + 80004272: 892a mv s2,a0 + 80004274: 64e2 ld s1,24(sp) + 80004276: 69a2 ld s3,8(sp) + 80004278: b7e5 j 80004260 + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read) + 8000427a: 02451783 lh a5,36(a0) + 8000427e: 03079693 slli a3,a5,0x30 + 80004282: 92c1 srli a3,a3,0x30 + 80004284: 4725 li a4,9 + 80004286: 02d76863 bltu a4,a3,800042b6 + 8000428a: 0792 slli a5,a5,0x4 + 8000428c: 0001e717 auipc a4,0x1e + 80004290: 18470713 addi a4,a4,388 # 80022410 + 80004294: 97ba add a5,a5,a4 + 80004296: 639c ld a5,0(a5) + 80004298: c39d beqz a5,800042be + r = devsw[f->major].read(1, addr, n); + 8000429a: 4505 li a0,1 + 8000429c: 9782 jalr a5 + 8000429e: 892a mv s2,a0 + 800042a0: 64e2 ld s1,24(sp) + 800042a2: 69a2 ld s3,8(sp) + 800042a4: bf75 j 80004260 + panic("fileread"); + 800042a6: 00003517 auipc a0,0x3 + 800042aa: 2f250513 addi a0,a0,754 # 80007598 + 800042ae: d32fc0ef jal 800007e0 + return -1; + 800042b2: 597d li s2,-1 + 800042b4: b775 j 80004260 + return -1; + 800042b6: 597d li s2,-1 + 800042b8: 64e2 ld s1,24(sp) + 800042ba: 69a2 ld s3,8(sp) + 800042bc: b755 j 80004260 + 800042be: 597d li s2,-1 + 800042c0: 64e2 ld s1,24(sp) + 800042c2: 69a2 ld s3,8(sp) + 800042c4: bf71 j 80004260 + +00000000800042c6 : +int +filewrite(struct file *f, uint64 addr, int n) +{ + int r, ret = 0; + + if(f->writable == 0) + 800042c6: 00954783 lbu a5,9(a0) + 800042ca: 10078b63 beqz a5,800043e0 +{ + 800042ce: 715d addi sp,sp,-80 + 800042d0: e486 sd ra,72(sp) + 800042d2: e0a2 sd s0,64(sp) + 800042d4: f84a sd s2,48(sp) + 800042d6: f052 sd s4,32(sp) + 800042d8: e85a sd s6,16(sp) + 800042da: 0880 addi s0,sp,80 + 800042dc: 892a mv s2,a0 + 800042de: 8b2e mv s6,a1 + 800042e0: 8a32 mv s4,a2 + return -1; + + if(f->type == FD_PIPE){ + 800042e2: 411c lw a5,0(a0) + 800042e4: 4705 li a4,1 + 800042e6: 02e78763 beq a5,a4,80004314 + ret = pipewrite(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ + 800042ea: 470d li a4,3 + 800042ec: 02e78863 beq a5,a4,8000431c + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write) + return -1; + ret = devsw[f->major].write(1, addr, n); + } else if(f->type == FD_INODE){ + 800042f0: 4709 li a4,2 + 800042f2: 0ce79c63 bne a5,a4,800043ca + 800042f6: f44e sd s3,40(sp) + // the maximum log transaction size, including + // i-node, indirect block, allocation blocks, + // and 2 blocks of slop for non-aligned writes. + int max = ((MAXOPBLOCKS-1-1-2) / 2) * BSIZE; + int i = 0; + while(i < n){ + 800042f8: 0ac05863 blez a2,800043a8 + 800042fc: fc26 sd s1,56(sp) + 800042fe: ec56 sd s5,24(sp) + 80004300: e45e sd s7,8(sp) + 80004302: e062 sd s8,0(sp) + int i = 0; + 80004304: 4981 li s3,0 + int n1 = n - i; + if(n1 > max) + 80004306: 6b85 lui s7,0x1 + 80004308: c00b8b93 addi s7,s7,-1024 # c00 <_entry-0x7ffff400> + 8000430c: 6c05 lui s8,0x1 + 8000430e: c00c0c1b addiw s8,s8,-1024 # c00 <_entry-0x7ffff400> + 80004312: a8b5 j 8000438e + ret = pipewrite(f->pipe, addr, n); + 80004314: 6908 ld a0,16(a0) + 80004316: 1fc000ef jal 80004512 + 8000431a: a04d j 800043bc + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write) + 8000431c: 02451783 lh a5,36(a0) + 80004320: 03079693 slli a3,a5,0x30 + 80004324: 92c1 srli a3,a3,0x30 + 80004326: 4725 li a4,9 + 80004328: 0ad76e63 bltu a4,a3,800043e4 + 8000432c: 0792 slli a5,a5,0x4 + 8000432e: 0001e717 auipc a4,0x1e + 80004332: 0e270713 addi a4,a4,226 # 80022410 + 80004336: 97ba add a5,a5,a4 + 80004338: 679c ld a5,8(a5) + 8000433a: c7dd beqz a5,800043e8 + ret = devsw[f->major].write(1, addr, n); + 8000433c: 4505 li a0,1 + 8000433e: 9782 jalr a5 + 80004340: a8b5 j 800043bc + if(n1 > max) + 80004342: 00048a9b sext.w s5,s1 + n1 = max; + + begin_op(); + 80004346: 997ff0ef jal 80003cdc + ilock(f->ip); + 8000434a: 01893503 ld a0,24(s2) + 8000434e: fa5fe0ef jal 800032f2 + if ((r = writei(f->ip, 1, addr + i, f->off, n1)) > 0) + 80004352: 8756 mv a4,s5 + 80004354: 02092683 lw a3,32(s2) + 80004358: 01698633 add a2,s3,s6 + 8000435c: 4585 li a1,1 + 8000435e: 01893503 ld a0,24(s2) + 80004362: c1cff0ef jal 8000377e + 80004366: 84aa mv s1,a0 + 80004368: 00a05763 blez a0,80004376 + f->off += r; + 8000436c: 02092783 lw a5,32(s2) + 80004370: 9fa9 addw a5,a5,a0 + 80004372: 02f92023 sw a5,32(s2) + iunlock(f->ip); + 80004376: 01893503 ld a0,24(s2) + 8000437a: 826ff0ef jal 800033a0 + end_op(); + 8000437e: 9c9ff0ef jal 80003d46 + + if(r != n1){ + 80004382: 029a9563 bne s5,s1,800043ac + // error from writei + break; + } + i += r; + 80004386: 013489bb addw s3,s1,s3 + while(i < n){ + 8000438a: 0149da63 bge s3,s4,8000439e + int n1 = n - i; + 8000438e: 413a04bb subw s1,s4,s3 + if(n1 > max) + 80004392: 0004879b sext.w a5,s1 + 80004396: fafbd6e3 bge s7,a5,80004342 + 8000439a: 84e2 mv s1,s8 + 8000439c: b75d j 80004342 + 8000439e: 74e2 ld s1,56(sp) + 800043a0: 6ae2 ld s5,24(sp) + 800043a2: 6ba2 ld s7,8(sp) + 800043a4: 6c02 ld s8,0(sp) + 800043a6: a039 j 800043b4 + int i = 0; + 800043a8: 4981 li s3,0 + 800043aa: a029 j 800043b4 + 800043ac: 74e2 ld s1,56(sp) + 800043ae: 6ae2 ld s5,24(sp) + 800043b0: 6ba2 ld s7,8(sp) + 800043b2: 6c02 ld s8,0(sp) + } + ret = (i == n ? n : -1); + 800043b4: 033a1c63 bne s4,s3,800043ec + 800043b8: 8552 mv a0,s4 + 800043ba: 79a2 ld s3,40(sp) + } else { + panic("filewrite"); + } + + return ret; +} + 800043bc: 60a6 ld ra,72(sp) + 800043be: 6406 ld s0,64(sp) + 800043c0: 7942 ld s2,48(sp) + 800043c2: 7a02 ld s4,32(sp) + 800043c4: 6b42 ld s6,16(sp) + 800043c6: 6161 addi sp,sp,80 + 800043c8: 8082 ret + 800043ca: fc26 sd s1,56(sp) + 800043cc: f44e sd s3,40(sp) + 800043ce: ec56 sd s5,24(sp) + 800043d0: e45e sd s7,8(sp) + 800043d2: e062 sd s8,0(sp) + panic("filewrite"); + 800043d4: 00003517 auipc a0,0x3 + 800043d8: 1d450513 addi a0,a0,468 # 800075a8 + 800043dc: c04fc0ef jal 800007e0 + return -1; + 800043e0: 557d li a0,-1 +} + 800043e2: 8082 ret + return -1; + 800043e4: 557d li a0,-1 + 800043e6: bfd9 j 800043bc + 800043e8: 557d li a0,-1 + 800043ea: bfc9 j 800043bc + ret = (i == n ? n : -1); + 800043ec: 557d li a0,-1 + 800043ee: 79a2 ld s3,40(sp) + 800043f0: b7f1 j 800043bc + +00000000800043f2 : + int writeopen; // write fd is still open +}; + +int +pipealloc(struct file **f0, struct file **f1) +{ + 800043f2: 7179 addi sp,sp,-48 + 800043f4: f406 sd ra,40(sp) + 800043f6: f022 sd s0,32(sp) + 800043f8: ec26 sd s1,24(sp) + 800043fa: e052 sd s4,0(sp) + 800043fc: 1800 addi s0,sp,48 + 800043fe: 84aa mv s1,a0 + 80004400: 8a2e mv s4,a1 + struct pipe *pi; + + pi = 0; + *f0 = *f1 = 0; + 80004402: 0005b023 sd zero,0(a1) + 80004406: 00053023 sd zero,0(a0) + if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0) + 8000440a: c3bff0ef jal 80004044 + 8000440e: e088 sd a0,0(s1) + 80004410: c549 beqz a0,8000449a + 80004412: c33ff0ef jal 80004044 + 80004416: 00aa3023 sd a0,0(s4) + 8000441a: cd25 beqz a0,80004492 + 8000441c: e84a sd s2,16(sp) + goto bad; + if((pi = (struct pipe*)kalloc()) == 0) + 8000441e: ee0fc0ef jal 80000afe + 80004422: 892a mv s2,a0 + 80004424: c12d beqz a0,80004486 + 80004426: e44e sd s3,8(sp) + goto bad; + pi->readopen = 1; + 80004428: 4985 li s3,1 + 8000442a: 23352023 sw s3,544(a0) + pi->writeopen = 1; + 8000442e: 23352223 sw s3,548(a0) + pi->nwrite = 0; + 80004432: 20052e23 sw zero,540(a0) + pi->nread = 0; + 80004436: 20052c23 sw zero,536(a0) + initlock(&pi->lock, "pipe"); + 8000443a: 00003597 auipc a1,0x3 + 8000443e: 17e58593 addi a1,a1,382 # 800075b8 + 80004442: f0cfc0ef jal 80000b4e + (*f0)->type = FD_PIPE; + 80004446: 609c ld a5,0(s1) + 80004448: 0137a023 sw s3,0(a5) + (*f0)->readable = 1; + 8000444c: 609c ld a5,0(s1) + 8000444e: 01378423 sb s3,8(a5) + (*f0)->writable = 0; + 80004452: 609c ld a5,0(s1) + 80004454: 000784a3 sb zero,9(a5) + (*f0)->pipe = pi; + 80004458: 609c ld a5,0(s1) + 8000445a: 0127b823 sd s2,16(a5) + (*f1)->type = FD_PIPE; + 8000445e: 000a3783 ld a5,0(s4) + 80004462: 0137a023 sw s3,0(a5) + (*f1)->readable = 0; + 80004466: 000a3783 ld a5,0(s4) + 8000446a: 00078423 sb zero,8(a5) + (*f1)->writable = 1; + 8000446e: 000a3783 ld a5,0(s4) + 80004472: 013784a3 sb s3,9(a5) + (*f1)->pipe = pi; + 80004476: 000a3783 ld a5,0(s4) + 8000447a: 0127b823 sd s2,16(a5) + return 0; + 8000447e: 4501 li a0,0 + 80004480: 6942 ld s2,16(sp) + 80004482: 69a2 ld s3,8(sp) + 80004484: a01d j 800044aa + + bad: + if(pi) + kfree((char*)pi); + if(*f0) + 80004486: 6088 ld a0,0(s1) + 80004488: c119 beqz a0,8000448e + 8000448a: 6942 ld s2,16(sp) + 8000448c: a029 j 80004496 + 8000448e: 6942 ld s2,16(sp) + 80004490: a029 j 8000449a + 80004492: 6088 ld a0,0(s1) + 80004494: c10d beqz a0,800044b6 + fileclose(*f0); + 80004496: c53ff0ef jal 800040e8 + if(*f1) + 8000449a: 000a3783 ld a5,0(s4) + fileclose(*f1); + return -1; + 8000449e: 557d li a0,-1 + if(*f1) + 800044a0: c789 beqz a5,800044aa + fileclose(*f1); + 800044a2: 853e mv a0,a5 + 800044a4: c45ff0ef jal 800040e8 + return -1; + 800044a8: 557d li a0,-1 +} + 800044aa: 70a2 ld ra,40(sp) + 800044ac: 7402 ld s0,32(sp) + 800044ae: 64e2 ld s1,24(sp) + 800044b0: 6a02 ld s4,0(sp) + 800044b2: 6145 addi sp,sp,48 + 800044b4: 8082 ret + return -1; + 800044b6: 557d li a0,-1 + 800044b8: bfcd j 800044aa + +00000000800044ba : + +void +pipeclose(struct pipe *pi, int writable) +{ + 800044ba: 1101 addi sp,sp,-32 + 800044bc: ec06 sd ra,24(sp) + 800044be: e822 sd s0,16(sp) + 800044c0: e426 sd s1,8(sp) + 800044c2: e04a sd s2,0(sp) + 800044c4: 1000 addi s0,sp,32 + 800044c6: 84aa mv s1,a0 + 800044c8: 892e mv s2,a1 + acquire(&pi->lock); + 800044ca: f04fc0ef jal 80000bce + if(writable){ + 800044ce: 02090763 beqz s2,800044fc + pi->writeopen = 0; + 800044d2: 2204a223 sw zero,548(s1) + wakeup(&pi->nread); + 800044d6: 21848513 addi a0,s1,536 + 800044da: a4bfd0ef jal 80001f24 + } else { + pi->readopen = 0; + wakeup(&pi->nwrite); + } + if(pi->readopen == 0 && pi->writeopen == 0){ + 800044de: 2204b783 ld a5,544(s1) + 800044e2: e785 bnez a5,8000450a + release(&pi->lock); + 800044e4: 8526 mv a0,s1 + 800044e6: f80fc0ef jal 80000c66 + kfree((char*)pi); + 800044ea: 8526 mv a0,s1 + 800044ec: d30fc0ef jal 80000a1c + } else + release(&pi->lock); +} + 800044f0: 60e2 ld ra,24(sp) + 800044f2: 6442 ld s0,16(sp) + 800044f4: 64a2 ld s1,8(sp) + 800044f6: 6902 ld s2,0(sp) + 800044f8: 6105 addi sp,sp,32 + 800044fa: 8082 ret + pi->readopen = 0; + 800044fc: 2204a023 sw zero,544(s1) + wakeup(&pi->nwrite); + 80004500: 21c48513 addi a0,s1,540 + 80004504: a21fd0ef jal 80001f24 + 80004508: bfd9 j 800044de + release(&pi->lock); + 8000450a: 8526 mv a0,s1 + 8000450c: f5afc0ef jal 80000c66 +} + 80004510: b7c5 j 800044f0 + +0000000080004512 : + +int +pipewrite(struct pipe *pi, uint64 addr, int n) +{ + 80004512: 711d addi sp,sp,-96 + 80004514: ec86 sd ra,88(sp) + 80004516: e8a2 sd s0,80(sp) + 80004518: e4a6 sd s1,72(sp) + 8000451a: e0ca sd s2,64(sp) + 8000451c: fc4e sd s3,56(sp) + 8000451e: f852 sd s4,48(sp) + 80004520: f456 sd s5,40(sp) + 80004522: 1080 addi s0,sp,96 + 80004524: 84aa mv s1,a0 + 80004526: 8aae mv s5,a1 + 80004528: 8a32 mv s4,a2 + int i = 0; + struct proc *pr = myproc(); + 8000452a: ba4fd0ef jal 800018ce + 8000452e: 89aa mv s3,a0 + + acquire(&pi->lock); + 80004530: 8526 mv a0,s1 + 80004532: e9cfc0ef jal 80000bce + while(i < n){ + 80004536: 0b405a63 blez s4,800045ea + 8000453a: f05a sd s6,32(sp) + 8000453c: ec5e sd s7,24(sp) + 8000453e: e862 sd s8,16(sp) + int i = 0; + 80004540: 4901 li s2,0 + if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full + wakeup(&pi->nread); + sleep(&pi->nwrite, &pi->lock); + } else { + char ch; + if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) + 80004542: 5b7d li s6,-1 + wakeup(&pi->nread); + 80004544: 21848c13 addi s8,s1,536 + sleep(&pi->nwrite, &pi->lock); + 80004548: 21c48b93 addi s7,s1,540 + 8000454c: a81d j 80004582 + release(&pi->lock); + 8000454e: 8526 mv a0,s1 + 80004550: f16fc0ef jal 80000c66 + return -1; + 80004554: 597d li s2,-1 + 80004556: 7b02 ld s6,32(sp) + 80004558: 6be2 ld s7,24(sp) + 8000455a: 6c42 ld s8,16(sp) + } + wakeup(&pi->nread); + release(&pi->lock); + + return i; +} + 8000455c: 854a mv a0,s2 + 8000455e: 60e6 ld ra,88(sp) + 80004560: 6446 ld s0,80(sp) + 80004562: 64a6 ld s1,72(sp) + 80004564: 6906 ld s2,64(sp) + 80004566: 79e2 ld s3,56(sp) + 80004568: 7a42 ld s4,48(sp) + 8000456a: 7aa2 ld s5,40(sp) + 8000456c: 6125 addi sp,sp,96 + 8000456e: 8082 ret + wakeup(&pi->nread); + 80004570: 8562 mv a0,s8 + 80004572: 9b3fd0ef jal 80001f24 + sleep(&pi->nwrite, &pi->lock); + 80004576: 85a6 mv a1,s1 + 80004578: 855e mv a0,s7 + 8000457a: 95ffd0ef jal 80001ed8 + while(i < n){ + 8000457e: 05495b63 bge s2,s4,800045d4 + if(pi->readopen == 0 || killed(pr)){ + 80004582: 2204a783 lw a5,544(s1) + 80004586: d7e1 beqz a5,8000454e + 80004588: 854e mv a0,s3 + 8000458a: b87fd0ef jal 80002110 + 8000458e: f161 bnez a0,8000454e + if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full + 80004590: 2184a783 lw a5,536(s1) + 80004594: 21c4a703 lw a4,540(s1) + 80004598: 2007879b addiw a5,a5,512 + 8000459c: fcf70ae3 beq a4,a5,80004570 + if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) + 800045a0: 4685 li a3,1 + 800045a2: 01590633 add a2,s2,s5 + 800045a6: faf40593 addi a1,s0,-81 + 800045aa: 0509b503 ld a0,80(s3) + 800045ae: 918fd0ef jal 800016c6 + 800045b2: 03650e63 beq a0,s6,800045ee + pi->data[pi->nwrite++ % PIPESIZE] = ch; + 800045b6: 21c4a783 lw a5,540(s1) + 800045ba: 0017871b addiw a4,a5,1 + 800045be: 20e4ae23 sw a4,540(s1) + 800045c2: 1ff7f793 andi a5,a5,511 + 800045c6: 97a6 add a5,a5,s1 + 800045c8: faf44703 lbu a4,-81(s0) + 800045cc: 00e78c23 sb a4,24(a5) + i++; + 800045d0: 2905 addiw s2,s2,1 + 800045d2: b775 j 8000457e + 800045d4: 7b02 ld s6,32(sp) + 800045d6: 6be2 ld s7,24(sp) + 800045d8: 6c42 ld s8,16(sp) + wakeup(&pi->nread); + 800045da: 21848513 addi a0,s1,536 + 800045de: 947fd0ef jal 80001f24 + release(&pi->lock); + 800045e2: 8526 mv a0,s1 + 800045e4: e82fc0ef jal 80000c66 + return i; + 800045e8: bf95 j 8000455c + int i = 0; + 800045ea: 4901 li s2,0 + 800045ec: b7fd j 800045da + 800045ee: 7b02 ld s6,32(sp) + 800045f0: 6be2 ld s7,24(sp) + 800045f2: 6c42 ld s8,16(sp) + 800045f4: b7dd j 800045da + +00000000800045f6 : + +int +piperead(struct pipe *pi, uint64 addr, int n) +{ + 800045f6: 715d addi sp,sp,-80 + 800045f8: e486 sd ra,72(sp) + 800045fa: e0a2 sd s0,64(sp) + 800045fc: fc26 sd s1,56(sp) + 800045fe: f84a sd s2,48(sp) + 80004600: f44e sd s3,40(sp) + 80004602: f052 sd s4,32(sp) + 80004604: ec56 sd s5,24(sp) + 80004606: 0880 addi s0,sp,80 + 80004608: 84aa mv s1,a0 + 8000460a: 892e mv s2,a1 + 8000460c: 8ab2 mv s5,a2 + int i; + struct proc *pr = myproc(); + 8000460e: ac0fd0ef jal 800018ce + 80004612: 8a2a mv s4,a0 + char ch; + + acquire(&pi->lock); + 80004614: 8526 mv a0,s1 + 80004616: db8fc0ef jal 80000bce + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + 8000461a: 2184a703 lw a4,536(s1) + 8000461e: 21c4a783 lw a5,540(s1) + if(killed(pr)){ + release(&pi->lock); + return -1; + } + sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep + 80004622: 21848993 addi s3,s1,536 + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + 80004626: 02f71563 bne a4,a5,80004650 + 8000462a: 2244a783 lw a5,548(s1) + 8000462e: cb85 beqz a5,8000465e + if(killed(pr)){ + 80004630: 8552 mv a0,s4 + 80004632: adffd0ef jal 80002110 + 80004636: ed19 bnez a0,80004654 + sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep + 80004638: 85a6 mv a1,s1 + 8000463a: 854e mv a0,s3 + 8000463c: 89dfd0ef jal 80001ed8 + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + 80004640: 2184a703 lw a4,536(s1) + 80004644: 21c4a783 lw a5,540(s1) + 80004648: fef701e3 beq a4,a5,8000462a + 8000464c: e85a sd s6,16(sp) + 8000464e: a809 j 80004660 + 80004650: e85a sd s6,16(sp) + 80004652: a039 j 80004660 + release(&pi->lock); + 80004654: 8526 mv a0,s1 + 80004656: e10fc0ef jal 80000c66 + return -1; + 8000465a: 59fd li s3,-1 + 8000465c: a8b9 j 800046ba + 8000465e: e85a sd s6,16(sp) + } + for(i = 0; i < n; i++){ //DOC: piperead-copy + 80004660: 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) { + 80004662: 5b7d li s6,-1 + for(i = 0; i < n; i++){ //DOC: piperead-copy + 80004664: 05505363 blez s5,800046aa + if(pi->nread == pi->nwrite) + 80004668: 2184a783 lw a5,536(s1) + 8000466c: 21c4a703 lw a4,540(s1) + 80004670: 02f70d63 beq a4,a5,800046aa + ch = pi->data[pi->nread % PIPESIZE]; + 80004674: 1ff7f793 andi a5,a5,511 + 80004678: 97a6 add a5,a5,s1 + 8000467a: 0187c783 lbu a5,24(a5) + 8000467e: faf40fa3 sb a5,-65(s0) + if(copyout(pr->pagetable, addr + i, &ch, 1) == -1) { + 80004682: 4685 li a3,1 + 80004684: fbf40613 addi a2,s0,-65 + 80004688: 85ca mv a1,s2 + 8000468a: 050a3503 ld a0,80(s4) + 8000468e: f55fc0ef jal 800015e2 + 80004692: 03650e63 beq a0,s6,800046ce + if(i == 0) + i = -1; + break; + } + pi->nread++; + 80004696: 2184a783 lw a5,536(s1) + 8000469a: 2785 addiw a5,a5,1 + 8000469c: 20f4ac23 sw a5,536(s1) + for(i = 0; i < n; i++){ //DOC: piperead-copy + 800046a0: 2985 addiw s3,s3,1 + 800046a2: 0905 addi s2,s2,1 + 800046a4: fd3a92e3 bne s5,s3,80004668 + 800046a8: 89d6 mv s3,s5 + } + wakeup(&pi->nwrite); //DOC: piperead-wakeup + 800046aa: 21c48513 addi a0,s1,540 + 800046ae: 877fd0ef jal 80001f24 + release(&pi->lock); + 800046b2: 8526 mv a0,s1 + 800046b4: db2fc0ef jal 80000c66 + 800046b8: 6b42 ld s6,16(sp) + return i; +} + 800046ba: 854e mv a0,s3 + 800046bc: 60a6 ld ra,72(sp) + 800046be: 6406 ld s0,64(sp) + 800046c0: 74e2 ld s1,56(sp) + 800046c2: 7942 ld s2,48(sp) + 800046c4: 79a2 ld s3,40(sp) + 800046c6: 7a02 ld s4,32(sp) + 800046c8: 6ae2 ld s5,24(sp) + 800046ca: 6161 addi sp,sp,80 + 800046cc: 8082 ret + if(i == 0) + 800046ce: fc099ee3 bnez s3,800046aa + i = -1; + 800046d2: 89aa mv s3,a0 + 800046d4: bfd9 j 800046aa + +00000000800046d6 : + +static int loadseg(pde_t *, uint64, struct inode *, uint, uint); + +// map ELF permissions to PTE permission bits. +int flags2perm(int flags) +{ + 800046d6: 1141 addi sp,sp,-16 + 800046d8: e422 sd s0,8(sp) + 800046da: 0800 addi s0,sp,16 + 800046dc: 87aa mv a5,a0 + int perm = 0; + if(flags & 0x1) + 800046de: 8905 andi a0,a0,1 + 800046e0: 050e slli a0,a0,0x3 + perm = PTE_X; + if(flags & 0x2) + 800046e2: 8b89 andi a5,a5,2 + 800046e4: c399 beqz a5,800046ea + perm |= PTE_W; + 800046e6: 00456513 ori a0,a0,4 + return perm; +} + 800046ea: 6422 ld s0,8(sp) + 800046ec: 0141 addi sp,sp,16 + 800046ee: 8082 ret + +00000000800046f0 : +// +// the implementation of the exec() system call +// +int +kexec(char *path, char **argv) +{ + 800046f0: df010113 addi sp,sp,-528 + 800046f4: 20113423 sd ra,520(sp) + 800046f8: 20813023 sd s0,512(sp) + 800046fc: ffa6 sd s1,504(sp) + 800046fe: fbca sd s2,496(sp) + 80004700: 0c00 addi s0,sp,528 + 80004702: 892a mv s2,a0 + 80004704: dea43c23 sd a0,-520(s0) + 80004708: e0b43023 sd a1,-512(s0) + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + struct elfhdr elf; + struct inode *ip; + struct proghdr ph; + pagetable_t pagetable = 0, oldpagetable; + struct proc *p = myproc(); + 8000470c: 9c2fd0ef jal 800018ce + 80004710: 84aa mv s1,a0 + + begin_op(); + 80004712: dcaff0ef jal 80003cdc + + // Open the executable file. + if((ip = namei(path)) == 0){ + 80004716: 854a mv a0,s2 + 80004718: bf0ff0ef jal 80003b08 + 8000471c: c931 beqz a0,80004770 + 8000471e: f3d2 sd s4,480(sp) + 80004720: 8a2a mv s4,a0 + end_op(); + return -1; + } + ilock(ip); + 80004722: bd1fe0ef jal 800032f2 + + // Read the ELF header. + if(readi(ip, 0, (uint64)&elf, 0, sizeof(elf)) != sizeof(elf)) + 80004726: 04000713 li a4,64 + 8000472a: 4681 li a3,0 + 8000472c: e5040613 addi a2,s0,-432 + 80004730: 4581 li a1,0 + 80004732: 8552 mv a0,s4 + 80004734: f4ffe0ef jal 80003682 + 80004738: 04000793 li a5,64 + 8000473c: 00f51a63 bne a0,a5,80004750 + goto bad; + + // Is this really an ELF file? + if(elf.magic != ELF_MAGIC) + 80004740: e5042703 lw a4,-432(s0) + 80004744: 464c47b7 lui a5,0x464c4 + 80004748: 57f78793 addi a5,a5,1407 # 464c457f <_entry-0x39b3ba81> + 8000474c: 02f70663 beq a4,a5,80004778 + + bad: + if(pagetable) + proc_freepagetable(pagetable, sz); + if(ip){ + iunlockput(ip); + 80004750: 8552 mv a0,s4 + 80004752: dabfe0ef jal 800034fc + end_op(); + 80004756: df0ff0ef jal 80003d46 + } + return -1; + 8000475a: 557d li a0,-1 + 8000475c: 7a1e ld s4,480(sp) +} + 8000475e: 20813083 ld ra,520(sp) + 80004762: 20013403 ld s0,512(sp) + 80004766: 74fe ld s1,504(sp) + 80004768: 795e ld s2,496(sp) + 8000476a: 21010113 addi sp,sp,528 + 8000476e: 8082 ret + end_op(); + 80004770: dd6ff0ef jal 80003d46 + return -1; + 80004774: 557d li a0,-1 + 80004776: b7e5 j 8000475e + 80004778: ebda sd s6,464(sp) + if((pagetable = proc_pagetable(p)) == 0) + 8000477a: 8526 mv a0,s1 + 8000477c: a58fd0ef jal 800019d4 + 80004780: 8b2a mv s6,a0 + 80004782: 2c050b63 beqz a0,80004a58 + 80004786: f7ce sd s3,488(sp) + 80004788: efd6 sd s5,472(sp) + 8000478a: e7de sd s7,456(sp) + 8000478c: e3e2 sd s8,448(sp) + 8000478e: ff66 sd s9,440(sp) + 80004790: fb6a sd s10,432(sp) + for(i=0, off=elf.phoff; i + 8000479e: f76e sd s11,424(sp) + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + 800047a0: 4901 li s2,0 + for(i=0, off=elf.phoff; i + 800047aa: def43823 sd a5,-528(s0) + + for(i = 0; i < sz; i += PGSIZE){ + pa = walkaddr(pagetable, va + i); + if(pa == 0) + panic("loadseg: address should exist"); + if(sz - i < PGSIZE) + 800047ae: 6a85 lui s5,0x1 + 800047b0: a085 j 80004810 + panic("loadseg: address should exist"); + 800047b2: 00003517 auipc a0,0x3 + 800047b6: e0e50513 addi a0,a0,-498 # 800075c0 + 800047ba: 826fc0ef jal 800007e0 + if(sz - i < PGSIZE) + 800047be: 2481 sext.w s1,s1 + n = sz - i; + else + n = PGSIZE; + if(readi(ip, 0, (uint64)pa, offset+i, n) != n) + 800047c0: 8726 mv a4,s1 + 800047c2: 012c06bb addw a3,s8,s2 + 800047c6: 4581 li a1,0 + 800047c8: 8552 mv a0,s4 + 800047ca: eb9fe0ef jal 80003682 + 800047ce: 2501 sext.w a0,a0 + 800047d0: 24a49a63 bne s1,a0,80004a24 + for(i = 0; i < sz; i += PGSIZE){ + 800047d4: 012a893b addw s2,s5,s2 + 800047d8: 03397363 bgeu s2,s3,800047fe + pa = walkaddr(pagetable, va + i); + 800047dc: 02091593 slli a1,s2,0x20 + 800047e0: 9181 srli a1,a1,0x20 + 800047e2: 95de add a1,a1,s7 + 800047e4: 855a mv a0,s6 + 800047e6: fcafc0ef jal 80000fb0 + 800047ea: 862a mv a2,a0 + if(pa == 0) + 800047ec: d179 beqz a0,800047b2 + if(sz - i < PGSIZE) + 800047ee: 412984bb subw s1,s3,s2 + 800047f2: 0004879b sext.w a5,s1 + 800047f6: fcfcf4e3 bgeu s9,a5,800047be + 800047fa: 84d6 mv s1,s5 + 800047fc: b7c9 j 800047be + sz = sz1; + 800047fe: e0843903 ld s2,-504(s0) + for(i=0, off=elf.phoff; i + 80004808: e8845783 lhu a5,-376(s0) + 8000480c: 08fdd063 bge s11,a5,8000488c + if(readi(ip, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph)) + 80004810: 2d01 sext.w s10,s10 + 80004812: 03800713 li a4,56 + 80004816: 86ea mv a3,s10 + 80004818: e1840613 addi a2,s0,-488 + 8000481c: 4581 li a1,0 + 8000481e: 8552 mv a0,s4 + 80004820: e63fe0ef jal 80003682 + 80004824: 03800793 li a5,56 + 80004828: 1cf51663 bne a0,a5,800049f4 + if(ph.type != ELF_PROG_LOAD) + 8000482c: e1842783 lw a5,-488(s0) + 80004830: 4705 li a4,1 + 80004832: fce798e3 bne a5,a4,80004802 + if(ph.memsz < ph.filesz) + 80004836: e4043483 ld s1,-448(s0) + 8000483a: e3843783 ld a5,-456(s0) + 8000483e: 1af4ef63 bltu s1,a5,800049fc + if(ph.vaddr + ph.memsz < ph.vaddr) + 80004842: e2843783 ld a5,-472(s0) + 80004846: 94be add s1,s1,a5 + 80004848: 1af4ee63 bltu s1,a5,80004a04 + if(ph.vaddr % PGSIZE != 0) + 8000484c: df043703 ld a4,-528(s0) + 80004850: 8ff9 and a5,a5,a4 + 80004852: 1a079d63 bnez a5,80004a0c + if((sz1 = uvmalloc(pagetable, sz, ph.vaddr + ph.memsz, flags2perm(ph.flags))) == 0) + 80004856: e1c42503 lw a0,-484(s0) + 8000485a: e7dff0ef jal 800046d6 + 8000485e: 86aa mv a3,a0 + 80004860: 8626 mv a2,s1 + 80004862: 85ca mv a1,s2 + 80004864: 855a mv a0,s6 + 80004866: a23fc0ef jal 80001288 + 8000486a: e0a43423 sd a0,-504(s0) + 8000486e: 1a050363 beqz a0,80004a14 + if(loadseg(pagetable, ph.vaddr, ip, ph.off, ph.filesz) < 0) + 80004872: e2843b83 ld s7,-472(s0) + 80004876: e2042c03 lw s8,-480(s0) + 8000487a: e3842983 lw s3,-456(s0) + for(i = 0; i < sz; i += PGSIZE){ + 8000487e: 00098463 beqz s3,80004886 + 80004882: 4901 li s2,0 + 80004884: bfa1 j 800047dc + sz = sz1; + 80004886: e0843903 ld s2,-504(s0) + 8000488a: bfa5 j 80004802 + 8000488c: 7dba ld s11,424(sp) + iunlockput(ip); + 8000488e: 8552 mv a0,s4 + 80004890: c6dfe0ef jal 800034fc + end_op(); + 80004894: cb2ff0ef jal 80003d46 + p = myproc(); + 80004898: 836fd0ef jal 800018ce + 8000489c: 8aaa mv s5,a0 + uint64 oldsz = p->sz; + 8000489e: 04853c83 ld s9,72(a0) + sz = PGROUNDUP(sz); + 800048a2: 6985 lui s3,0x1 + 800048a4: 19fd addi s3,s3,-1 # fff <_entry-0x7ffff001> + 800048a6: 99ca add s3,s3,s2 + 800048a8: 77fd lui a5,0xfffff + 800048aa: 00f9f9b3 and s3,s3,a5 + if((sz1 = uvmalloc(pagetable, sz, sz + (USERSTACK+1)*PGSIZE, PTE_W)) == 0) + 800048ae: 4691 li a3,4 + 800048b0: 6609 lui a2,0x2 + 800048b2: 964e add a2,a2,s3 + 800048b4: 85ce mv a1,s3 + 800048b6: 855a mv a0,s6 + 800048b8: 9d1fc0ef jal 80001288 + 800048bc: 892a mv s2,a0 + 800048be: e0a43423 sd a0,-504(s0) + 800048c2: e519 bnez a0,800048d0 + if(pagetable) + 800048c4: e1343423 sd s3,-504(s0) + 800048c8: 4a01 li s4,0 + 800048ca: aab1 j 80004a26 + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + 800048cc: 4901 li s2,0 + 800048ce: b7c1 j 8000488e + uvmclear(pagetable, sz-(USERSTACK+1)*PGSIZE); + 800048d0: 75f9 lui a1,0xffffe + 800048d2: 95aa add a1,a1,a0 + 800048d4: 855a mv a0,s6 + 800048d6: b89fc0ef jal 8000145e + stackbase = sp - USERSTACK*PGSIZE; + 800048da: 7bfd lui s7,0xfffff + 800048dc: 9bca add s7,s7,s2 + for(argc = 0; argv[argc]; argc++) { + 800048de: e0043783 ld a5,-512(s0) + 800048e2: 6388 ld a0,0(a5) + 800048e4: cd39 beqz a0,80004942 + 800048e6: e9040993 addi s3,s0,-368 + 800048ea: f9040c13 addi s8,s0,-112 + 800048ee: 4481 li s1,0 + sp -= strlen(argv[argc]) + 1; + 800048f0: d22fc0ef jal 80000e12 + 800048f4: 0015079b addiw a5,a0,1 + 800048f8: 40f907b3 sub a5,s2,a5 + sp -= sp % 16; // riscv sp must be 16-byte aligned + 800048fc: ff07f913 andi s2,a5,-16 + if(sp < stackbase) + 80004900: 11796e63 bltu s2,s7,80004a1c + if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0) + 80004904: e0043d03 ld s10,-512(s0) + 80004908: 000d3a03 ld s4,0(s10) + 8000490c: 8552 mv a0,s4 + 8000490e: d04fc0ef jal 80000e12 + 80004912: 0015069b addiw a3,a0,1 + 80004916: 8652 mv a2,s4 + 80004918: 85ca mv a1,s2 + 8000491a: 855a mv a0,s6 + 8000491c: cc7fc0ef jal 800015e2 + 80004920: 10054063 bltz a0,80004a20 + ustack[argc] = sp; + 80004924: 0129b023 sd s2,0(s3) + for(argc = 0; argv[argc]; argc++) { + 80004928: 0485 addi s1,s1,1 + 8000492a: 008d0793 addi a5,s10,8 + 8000492e: e0f43023 sd a5,-512(s0) + 80004932: 008d3503 ld a0,8(s10) + 80004936: c909 beqz a0,80004948 + if(argc >= MAXARG) + 80004938: 09a1 addi s3,s3,8 + 8000493a: fb899be3 bne s3,s8,800048f0 + ip = 0; + 8000493e: 4a01 li s4,0 + 80004940: a0dd j 80004a26 + sp = sz; + 80004942: e0843903 ld s2,-504(s0) + for(argc = 0; argv[argc]; argc++) { + 80004946: 4481 li s1,0 + ustack[argc] = 0; + 80004948: 00349793 slli a5,s1,0x3 + 8000494c: f9078793 addi a5,a5,-112 # ffffffffffffef90 + 80004950: 97a2 add a5,a5,s0 + 80004952: f007b023 sd zero,-256(a5) + sp -= (argc+1) * sizeof(uint64); + 80004956: 00148693 addi a3,s1,1 + 8000495a: 068e slli a3,a3,0x3 + 8000495c: 40d90933 sub s2,s2,a3 + sp -= sp % 16; + 80004960: ff097913 andi s2,s2,-16 + sz = sz1; + 80004964: e0843983 ld s3,-504(s0) + if(sp < stackbase) + 80004968: f5796ee3 bltu s2,s7,800048c4 + if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0) + 8000496c: e9040613 addi a2,s0,-368 + 80004970: 85ca mv a1,s2 + 80004972: 855a mv a0,s6 + 80004974: c6ffc0ef jal 800015e2 + 80004978: 0e054263 bltz a0,80004a5c + p->trapframe->a1 = sp; + 8000497c: 058ab783 ld a5,88(s5) # 1058 <_entry-0x7fffefa8> + 80004980: 0727bc23 sd s2,120(a5) + for(last=s=path; *s; s++) + 80004984: df843783 ld a5,-520(s0) + 80004988: 0007c703 lbu a4,0(a5) + 8000498c: cf11 beqz a4,800049a8 + 8000498e: 0785 addi a5,a5,1 + if(*s == '/') + 80004990: 02f00693 li a3,47 + 80004994: a039 j 800049a2 + last = s+1; + 80004996: def43c23 sd a5,-520(s0) + for(last=s=path; *s; s++) + 8000499a: 0785 addi a5,a5,1 + 8000499c: fff7c703 lbu a4,-1(a5) + 800049a0: c701 beqz a4,800049a8 + if(*s == '/') + 800049a2: fed71ce3 bne a4,a3,8000499a + 800049a6: bfc5 j 80004996 + safestrcpy(p->name, last, sizeof(p->name)); + 800049a8: 4641 li a2,16 + 800049aa: df843583 ld a1,-520(s0) + 800049ae: 158a8513 addi a0,s5,344 + 800049b2: c2efc0ef jal 80000de0 + oldpagetable = p->pagetable; + 800049b6: 050ab503 ld a0,80(s5) + p->pagetable = pagetable; + 800049ba: 056ab823 sd s6,80(s5) + p->sz = sz; + 800049be: e0843783 ld a5,-504(s0) + 800049c2: 04fab423 sd a5,72(s5) + p->trapframe->epc = elf.entry; // initial program counter = ulib.c:start() + 800049c6: 058ab783 ld a5,88(s5) + 800049ca: e6843703 ld a4,-408(s0) + 800049ce: ef98 sd a4,24(a5) + p->trapframe->sp = sp; // initial stack pointer + 800049d0: 058ab783 ld a5,88(s5) + 800049d4: 0327b823 sd s2,48(a5) + proc_freepagetable(oldpagetable, oldsz); + 800049d8: 85e6 mv a1,s9 + 800049da: 87efd0ef jal 80001a58 + return argc; // this ends up in a0, the first argument to main(argc, argv) + 800049de: 0004851b sext.w a0,s1 + 800049e2: 79be ld s3,488(sp) + 800049e4: 7a1e ld s4,480(sp) + 800049e6: 6afe ld s5,472(sp) + 800049e8: 6b5e ld s6,464(sp) + 800049ea: 6bbe ld s7,456(sp) + 800049ec: 6c1e ld s8,448(sp) + 800049ee: 7cfa ld s9,440(sp) + 800049f0: 7d5a ld s10,432(sp) + 800049f2: b3b5 j 8000475e + 800049f4: e1243423 sd s2,-504(s0) + 800049f8: 7dba ld s11,424(sp) + 800049fa: a035 j 80004a26 + 800049fc: e1243423 sd s2,-504(s0) + 80004a00: 7dba ld s11,424(sp) + 80004a02: a015 j 80004a26 + 80004a04: e1243423 sd s2,-504(s0) + 80004a08: 7dba ld s11,424(sp) + 80004a0a: a831 j 80004a26 + 80004a0c: e1243423 sd s2,-504(s0) + 80004a10: 7dba ld s11,424(sp) + 80004a12: a811 j 80004a26 + 80004a14: e1243423 sd s2,-504(s0) + 80004a18: 7dba ld s11,424(sp) + 80004a1a: a031 j 80004a26 + ip = 0; + 80004a1c: 4a01 li s4,0 + 80004a1e: a021 j 80004a26 + 80004a20: 4a01 li s4,0 + if(pagetable) + 80004a22: a011 j 80004a26 + 80004a24: 7dba ld s11,424(sp) + proc_freepagetable(pagetable, sz); + 80004a26: e0843583 ld a1,-504(s0) + 80004a2a: 855a mv a0,s6 + 80004a2c: 82cfd0ef jal 80001a58 + return -1; + 80004a30: 557d li a0,-1 + if(ip){ + 80004a32: 000a1b63 bnez s4,80004a48 + 80004a36: 79be ld s3,488(sp) + 80004a38: 7a1e ld s4,480(sp) + 80004a3a: 6afe ld s5,472(sp) + 80004a3c: 6b5e ld s6,464(sp) + 80004a3e: 6bbe ld s7,456(sp) + 80004a40: 6c1e ld s8,448(sp) + 80004a42: 7cfa ld s9,440(sp) + 80004a44: 7d5a ld s10,432(sp) + 80004a46: bb21 j 8000475e + 80004a48: 79be ld s3,488(sp) + 80004a4a: 6afe ld s5,472(sp) + 80004a4c: 6b5e ld s6,464(sp) + 80004a4e: 6bbe ld s7,456(sp) + 80004a50: 6c1e ld s8,448(sp) + 80004a52: 7cfa ld s9,440(sp) + 80004a54: 7d5a ld s10,432(sp) + 80004a56: b9ed j 80004750 + 80004a58: 6b5e ld s6,464(sp) + 80004a5a: b9dd j 80004750 + sz = sz1; + 80004a5c: e0843983 ld s3,-504(s0) + 80004a60: b595 j 800048c4 + +0000000080004a62 : + +// 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) +{ + 80004a62: 7179 addi sp,sp,-48 + 80004a64: f406 sd ra,40(sp) + 80004a66: f022 sd s0,32(sp) + 80004a68: ec26 sd s1,24(sp) + 80004a6a: e84a sd s2,16(sp) + 80004a6c: 1800 addi s0,sp,48 + 80004a6e: 892e mv s2,a1 + 80004a70: 84b2 mv s1,a2 + int fd; + struct file *f; + + argint(n, &fd); + 80004a72: fdc40593 addi a1,s0,-36 + 80004a76: d67fd0ef jal 800027dc + if(fd < 0 || fd >= NOFILE || (f=myproc()->ofile[fd]) == 0) + 80004a7a: fdc42703 lw a4,-36(s0) + 80004a7e: 47bd li a5,15 + 80004a80: 02e7e963 bltu a5,a4,80004ab2 + 80004a84: e4bfc0ef jal 800018ce + 80004a88: fdc42703 lw a4,-36(s0) + 80004a8c: 01a70793 addi a5,a4,26 + 80004a90: 078e slli a5,a5,0x3 + 80004a92: 953e add a0,a0,a5 + 80004a94: 611c ld a5,0(a0) + 80004a96: c385 beqz a5,80004ab6 + return -1; + if(pfd) + 80004a98: 00090463 beqz s2,80004aa0 + *pfd = fd; + 80004a9c: 00e92023 sw a4,0(s2) + if(pf) + *pf = f; + return 0; + 80004aa0: 4501 li a0,0 + if(pf) + 80004aa2: c091 beqz s1,80004aa6 + *pf = f; + 80004aa4: e09c sd a5,0(s1) +} + 80004aa6: 70a2 ld ra,40(sp) + 80004aa8: 7402 ld s0,32(sp) + 80004aaa: 64e2 ld s1,24(sp) + 80004aac: 6942 ld s2,16(sp) + 80004aae: 6145 addi sp,sp,48 + 80004ab0: 8082 ret + return -1; + 80004ab2: 557d li a0,-1 + 80004ab4: bfcd j 80004aa6 + 80004ab6: 557d li a0,-1 + 80004ab8: b7fd j 80004aa6 + +0000000080004aba : + +// Allocate a file descriptor for the given file. +// Takes over file reference from caller on success. +static int +fdalloc(struct file *f) +{ + 80004aba: 1101 addi sp,sp,-32 + 80004abc: ec06 sd ra,24(sp) + 80004abe: e822 sd s0,16(sp) + 80004ac0: e426 sd s1,8(sp) + 80004ac2: 1000 addi s0,sp,32 + 80004ac4: 84aa mv s1,a0 + int fd; + struct proc *p = myproc(); + 80004ac6: e09fc0ef jal 800018ce + 80004aca: 862a mv a2,a0 + + for(fd = 0; fd < NOFILE; fd++){ + 80004acc: 0d050793 addi a5,a0,208 + 80004ad0: 4501 li a0,0 + 80004ad2: 46c1 li a3,16 + if(p->ofile[fd] == 0){ + 80004ad4: 6398 ld a4,0(a5) + 80004ad6: cb19 beqz a4,80004aec + for(fd = 0; fd < NOFILE; fd++){ + 80004ad8: 2505 addiw a0,a0,1 + 80004ada: 07a1 addi a5,a5,8 + 80004adc: fed51ce3 bne a0,a3,80004ad4 + p->ofile[fd] = f; + return fd; + } + } + return -1; + 80004ae0: 557d li a0,-1 +} + 80004ae2: 60e2 ld ra,24(sp) + 80004ae4: 6442 ld s0,16(sp) + 80004ae6: 64a2 ld s1,8(sp) + 80004ae8: 6105 addi sp,sp,32 + 80004aea: 8082 ret + p->ofile[fd] = f; + 80004aec: 01a50793 addi a5,a0,26 + 80004af0: 078e slli a5,a5,0x3 + 80004af2: 963e add a2,a2,a5 + 80004af4: e204 sd s1,0(a2) + return fd; + 80004af6: b7f5 j 80004ae2 + +0000000080004af8 : + return -1; +} + +static struct inode* +create(char *path, short type, short major, short minor) +{ + 80004af8: 715d addi sp,sp,-80 + 80004afa: e486 sd ra,72(sp) + 80004afc: e0a2 sd s0,64(sp) + 80004afe: fc26 sd s1,56(sp) + 80004b00: f84a sd s2,48(sp) + 80004b02: f44e sd s3,40(sp) + 80004b04: ec56 sd s5,24(sp) + 80004b06: e85a sd s6,16(sp) + 80004b08: 0880 addi s0,sp,80 + 80004b0a: 8b2e mv s6,a1 + 80004b0c: 89b2 mv s3,a2 + 80004b0e: 8936 mv s2,a3 + struct inode *ip, *dp; + char name[DIRSIZ]; + + if((dp = nameiparent(path, name)) == 0) + 80004b10: fb040593 addi a1,s0,-80 + 80004b14: 80eff0ef jal 80003b22 + 80004b18: 84aa mv s1,a0 + 80004b1a: 10050a63 beqz a0,80004c2e + return 0; + + ilock(dp); + 80004b1e: fd4fe0ef jal 800032f2 + + if((ip = dirlookup(dp, name, 0)) != 0){ + 80004b22: 4601 li a2,0 + 80004b24: fb040593 addi a1,s0,-80 + 80004b28: 8526 mv a0,s1 + 80004b2a: d79fe0ef jal 800038a2 + 80004b2e: 8aaa mv s5,a0 + 80004b30: c129 beqz a0,80004b72 + iunlockput(dp); + 80004b32: 8526 mv a0,s1 + 80004b34: 9c9fe0ef jal 800034fc + ilock(ip); + 80004b38: 8556 mv a0,s5 + 80004b3a: fb8fe0ef jal 800032f2 + if(type == T_FILE && (ip->type == T_FILE || ip->type == T_DEVICE)) + 80004b3e: 4789 li a5,2 + 80004b40: 02fb1463 bne s6,a5,80004b68 + 80004b44: 044ad783 lhu a5,68(s5) + 80004b48: 37f9 addiw a5,a5,-2 + 80004b4a: 17c2 slli a5,a5,0x30 + 80004b4c: 93c1 srli a5,a5,0x30 + 80004b4e: 4705 li a4,1 + 80004b50: 00f76c63 bltu a4,a5,80004b68 + ip->nlink = 0; + iupdate(ip); + iunlockput(ip); + iunlockput(dp); + return 0; +} + 80004b54: 8556 mv a0,s5 + 80004b56: 60a6 ld ra,72(sp) + 80004b58: 6406 ld s0,64(sp) + 80004b5a: 74e2 ld s1,56(sp) + 80004b5c: 7942 ld s2,48(sp) + 80004b5e: 79a2 ld s3,40(sp) + 80004b60: 6ae2 ld s5,24(sp) + 80004b62: 6b42 ld s6,16(sp) + 80004b64: 6161 addi sp,sp,80 + 80004b66: 8082 ret + iunlockput(ip); + 80004b68: 8556 mv a0,s5 + 80004b6a: 993fe0ef jal 800034fc + return 0; + 80004b6e: 4a81 li s5,0 + 80004b70: b7d5 j 80004b54 + 80004b72: f052 sd s4,32(sp) + if((ip = ialloc(dp->dev, type)) == 0){ + 80004b74: 85da mv a1,s6 + 80004b76: 4088 lw a0,0(s1) + 80004b78: e0afe0ef jal 80003182 + 80004b7c: 8a2a mv s4,a0 + 80004b7e: cd15 beqz a0,80004bba + ilock(ip); + 80004b80: f72fe0ef jal 800032f2 + ip->major = major; + 80004b84: 053a1323 sh s3,70(s4) + ip->minor = minor; + 80004b88: 052a1423 sh s2,72(s4) + ip->nlink = 1; + 80004b8c: 4905 li s2,1 + 80004b8e: 052a1523 sh s2,74(s4) + iupdate(ip); + 80004b92: 8552 mv a0,s4 + 80004b94: eaafe0ef jal 8000323e + if(type == T_DIR){ // Create . and .. entries. + 80004b98: 032b0763 beq s6,s2,80004bc6 + if(dirlink(dp, name, ip->inum) < 0) + 80004b9c: 004a2603 lw a2,4(s4) + 80004ba0: fb040593 addi a1,s0,-80 + 80004ba4: 8526 mv a0,s1 + 80004ba6: ec9fe0ef jal 80003a6e + 80004baa: 06054563 bltz a0,80004c14 + iunlockput(dp); + 80004bae: 8526 mv a0,s1 + 80004bb0: 94dfe0ef jal 800034fc + return ip; + 80004bb4: 8ad2 mv s5,s4 + 80004bb6: 7a02 ld s4,32(sp) + 80004bb8: bf71 j 80004b54 + iunlockput(dp); + 80004bba: 8526 mv a0,s1 + 80004bbc: 941fe0ef jal 800034fc + return 0; + 80004bc0: 8ad2 mv s5,s4 + 80004bc2: 7a02 ld s4,32(sp) + 80004bc4: bf41 j 80004b54 + if(dirlink(ip, ".", ip->inum) < 0 || dirlink(ip, "..", dp->inum) < 0) + 80004bc6: 004a2603 lw a2,4(s4) + 80004bca: 00003597 auipc a1,0x3 + 80004bce: a1658593 addi a1,a1,-1514 # 800075e0 + 80004bd2: 8552 mv a0,s4 + 80004bd4: e9bfe0ef jal 80003a6e + 80004bd8: 02054e63 bltz a0,80004c14 + 80004bdc: 40d0 lw a2,4(s1) + 80004bde: 00003597 auipc a1,0x3 + 80004be2: a0a58593 addi a1,a1,-1526 # 800075e8 + 80004be6: 8552 mv a0,s4 + 80004be8: e87fe0ef jal 80003a6e + 80004bec: 02054463 bltz a0,80004c14 + if(dirlink(dp, name, ip->inum) < 0) + 80004bf0: 004a2603 lw a2,4(s4) + 80004bf4: fb040593 addi a1,s0,-80 + 80004bf8: 8526 mv a0,s1 + 80004bfa: e75fe0ef jal 80003a6e + 80004bfe: 00054b63 bltz a0,80004c14 + dp->nlink++; // for ".." + 80004c02: 04a4d783 lhu a5,74(s1) + 80004c06: 2785 addiw a5,a5,1 + 80004c08: 04f49523 sh a5,74(s1) + iupdate(dp); + 80004c0c: 8526 mv a0,s1 + 80004c0e: e30fe0ef jal 8000323e + 80004c12: bf71 j 80004bae + ip->nlink = 0; + 80004c14: 040a1523 sh zero,74(s4) + iupdate(ip); + 80004c18: 8552 mv a0,s4 + 80004c1a: e24fe0ef jal 8000323e + iunlockput(ip); + 80004c1e: 8552 mv a0,s4 + 80004c20: 8ddfe0ef jal 800034fc + iunlockput(dp); + 80004c24: 8526 mv a0,s1 + 80004c26: 8d7fe0ef jal 800034fc + return 0; + 80004c2a: 7a02 ld s4,32(sp) + 80004c2c: b725 j 80004b54 + return 0; + 80004c2e: 8aaa mv s5,a0 + 80004c30: b715 j 80004b54 + +0000000080004c32 : +{ + 80004c32: 7179 addi sp,sp,-48 + 80004c34: f406 sd ra,40(sp) + 80004c36: f022 sd s0,32(sp) + 80004c38: 1800 addi s0,sp,48 + if(argfd(0, 0, &f) < 0) + 80004c3a: fd840613 addi a2,s0,-40 + 80004c3e: 4581 li a1,0 + 80004c40: 4501 li a0,0 + 80004c42: e21ff0ef jal 80004a62 + return -1; + 80004c46: 57fd li a5,-1 + if(argfd(0, 0, &f) < 0) + 80004c48: 02054363 bltz a0,80004c6e + 80004c4c: ec26 sd s1,24(sp) + 80004c4e: e84a sd s2,16(sp) + if((fd=fdalloc(f)) < 0) + 80004c50: fd843903 ld s2,-40(s0) + 80004c54: 854a mv a0,s2 + 80004c56: e65ff0ef jal 80004aba + 80004c5a: 84aa mv s1,a0 + return -1; + 80004c5c: 57fd li a5,-1 + if((fd=fdalloc(f)) < 0) + 80004c5e: 00054d63 bltz a0,80004c78 + filedup(f); + 80004c62: 854a mv a0,s2 + 80004c64: c3eff0ef jal 800040a2 + return fd; + 80004c68: 87a6 mv a5,s1 + 80004c6a: 64e2 ld s1,24(sp) + 80004c6c: 6942 ld s2,16(sp) +} + 80004c6e: 853e mv a0,a5 + 80004c70: 70a2 ld ra,40(sp) + 80004c72: 7402 ld s0,32(sp) + 80004c74: 6145 addi sp,sp,48 + 80004c76: 8082 ret + 80004c78: 64e2 ld s1,24(sp) + 80004c7a: 6942 ld s2,16(sp) + 80004c7c: bfcd j 80004c6e + +0000000080004c7e : +{ + 80004c7e: 7179 addi sp,sp,-48 + 80004c80: f406 sd ra,40(sp) + 80004c82: f022 sd s0,32(sp) + 80004c84: 1800 addi s0,sp,48 + argaddr(1, &p); + 80004c86: fd840593 addi a1,s0,-40 + 80004c8a: 4505 li a0,1 + 80004c8c: b6dfd0ef jal 800027f8 + argint(2, &n); + 80004c90: fe440593 addi a1,s0,-28 + 80004c94: 4509 li a0,2 + 80004c96: b47fd0ef jal 800027dc + if(argfd(0, 0, &f) < 0) + 80004c9a: fe840613 addi a2,s0,-24 + 80004c9e: 4581 li a1,0 + 80004ca0: 4501 li a0,0 + 80004ca2: dc1ff0ef jal 80004a62 + 80004ca6: 87aa mv a5,a0 + return -1; + 80004ca8: 557d li a0,-1 + if(argfd(0, 0, &f) < 0) + 80004caa: 0007ca63 bltz a5,80004cbe + return fileread(f, p, n); + 80004cae: fe442603 lw a2,-28(s0) + 80004cb2: fd843583 ld a1,-40(s0) + 80004cb6: fe843503 ld a0,-24(s0) + 80004cba: d4eff0ef jal 80004208 +} + 80004cbe: 70a2 ld ra,40(sp) + 80004cc0: 7402 ld s0,32(sp) + 80004cc2: 6145 addi sp,sp,48 + 80004cc4: 8082 ret + +0000000080004cc6 : +{ + 80004cc6: 7179 addi sp,sp,-48 + 80004cc8: f406 sd ra,40(sp) + 80004cca: f022 sd s0,32(sp) + 80004ccc: 1800 addi s0,sp,48 + argaddr(1, &p); + 80004cce: fd840593 addi a1,s0,-40 + 80004cd2: 4505 li a0,1 + 80004cd4: b25fd0ef jal 800027f8 + argint(2, &n); + 80004cd8: fe440593 addi a1,s0,-28 + 80004cdc: 4509 li a0,2 + 80004cde: afffd0ef jal 800027dc + if(argfd(0, 0, &f) < 0) + 80004ce2: fe840613 addi a2,s0,-24 + 80004ce6: 4581 li a1,0 + 80004ce8: 4501 li a0,0 + 80004cea: d79ff0ef jal 80004a62 + 80004cee: 87aa mv a5,a0 + return -1; + 80004cf0: 557d li a0,-1 + if(argfd(0, 0, &f) < 0) + 80004cf2: 0007ca63 bltz a5,80004d06 + return filewrite(f, p, n); + 80004cf6: fe442603 lw a2,-28(s0) + 80004cfa: fd843583 ld a1,-40(s0) + 80004cfe: fe843503 ld a0,-24(s0) + 80004d02: dc4ff0ef jal 800042c6 +} + 80004d06: 70a2 ld ra,40(sp) + 80004d08: 7402 ld s0,32(sp) + 80004d0a: 6145 addi sp,sp,48 + 80004d0c: 8082 ret + +0000000080004d0e : +{ + 80004d0e: 1101 addi sp,sp,-32 + 80004d10: ec06 sd ra,24(sp) + 80004d12: e822 sd s0,16(sp) + 80004d14: 1000 addi s0,sp,32 + if(argfd(0, &fd, &f) < 0) + 80004d16: fe040613 addi a2,s0,-32 + 80004d1a: fec40593 addi a1,s0,-20 + 80004d1e: 4501 li a0,0 + 80004d20: d43ff0ef jal 80004a62 + return -1; + 80004d24: 57fd li a5,-1 + if(argfd(0, &fd, &f) < 0) + 80004d26: 02054063 bltz a0,80004d46 + myproc()->ofile[fd] = 0; + 80004d2a: ba5fc0ef jal 800018ce + 80004d2e: fec42783 lw a5,-20(s0) + 80004d32: 07e9 addi a5,a5,26 + 80004d34: 078e slli a5,a5,0x3 + 80004d36: 953e add a0,a0,a5 + 80004d38: 00053023 sd zero,0(a0) + fileclose(f); + 80004d3c: fe043503 ld a0,-32(s0) + 80004d40: ba8ff0ef jal 800040e8 + return 0; + 80004d44: 4781 li a5,0 +} + 80004d46: 853e mv a0,a5 + 80004d48: 60e2 ld ra,24(sp) + 80004d4a: 6442 ld s0,16(sp) + 80004d4c: 6105 addi sp,sp,32 + 80004d4e: 8082 ret + +0000000080004d50 : +{ + 80004d50: 1101 addi sp,sp,-32 + 80004d52: ec06 sd ra,24(sp) + 80004d54: e822 sd s0,16(sp) + 80004d56: 1000 addi s0,sp,32 + argaddr(1, &st); + 80004d58: fe040593 addi a1,s0,-32 + 80004d5c: 4505 li a0,1 + 80004d5e: a9bfd0ef jal 800027f8 + if(argfd(0, 0, &f) < 0) + 80004d62: fe840613 addi a2,s0,-24 + 80004d66: 4581 li a1,0 + 80004d68: 4501 li a0,0 + 80004d6a: cf9ff0ef jal 80004a62 + 80004d6e: 87aa mv a5,a0 + return -1; + 80004d70: 557d li a0,-1 + if(argfd(0, 0, &f) < 0) + 80004d72: 0007c863 bltz a5,80004d82 + return filestat(f, st); + 80004d76: fe043583 ld a1,-32(s0) + 80004d7a: fe843503 ld a0,-24(s0) + 80004d7e: c2cff0ef jal 800041aa +} + 80004d82: 60e2 ld ra,24(sp) + 80004d84: 6442 ld s0,16(sp) + 80004d86: 6105 addi sp,sp,32 + 80004d88: 8082 ret + +0000000080004d8a : +{ + 80004d8a: 7169 addi sp,sp,-304 + 80004d8c: f606 sd ra,296(sp) + 80004d8e: f222 sd s0,288(sp) + 80004d90: 1a00 addi s0,sp,304 + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + 80004d92: 08000613 li a2,128 + 80004d96: ed040593 addi a1,s0,-304 + 80004d9a: 4501 li a0,0 + 80004d9c: a79fd0ef jal 80002814 + return -1; + 80004da0: 57fd li a5,-1 + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + 80004da2: 0c054e63 bltz a0,80004e7e + 80004da6: 08000613 li a2,128 + 80004daa: f5040593 addi a1,s0,-176 + 80004dae: 4505 li a0,1 + 80004db0: a65fd0ef jal 80002814 + return -1; + 80004db4: 57fd li a5,-1 + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + 80004db6: 0c054463 bltz a0,80004e7e + 80004dba: ee26 sd s1,280(sp) + begin_op(); + 80004dbc: f21fe0ef jal 80003cdc + if((ip = namei(old)) == 0){ + 80004dc0: ed040513 addi a0,s0,-304 + 80004dc4: d45fe0ef jal 80003b08 + 80004dc8: 84aa mv s1,a0 + 80004dca: c53d beqz a0,80004e38 + ilock(ip); + 80004dcc: d26fe0ef jal 800032f2 + if(ip->type == T_DIR){ + 80004dd0: 04449703 lh a4,68(s1) + 80004dd4: 4785 li a5,1 + 80004dd6: 06f70663 beq a4,a5,80004e42 + 80004dda: ea4a sd s2,272(sp) + ip->nlink++; + 80004ddc: 04a4d783 lhu a5,74(s1) + 80004de0: 2785 addiw a5,a5,1 + 80004de2: 04f49523 sh a5,74(s1) + iupdate(ip); + 80004de6: 8526 mv a0,s1 + 80004de8: c56fe0ef jal 8000323e + iunlock(ip); + 80004dec: 8526 mv a0,s1 + 80004dee: db2fe0ef jal 800033a0 + if((dp = nameiparent(new, name)) == 0) + 80004df2: fd040593 addi a1,s0,-48 + 80004df6: f5040513 addi a0,s0,-176 + 80004dfa: d29fe0ef jal 80003b22 + 80004dfe: 892a mv s2,a0 + 80004e00: cd21 beqz a0,80004e58 + ilock(dp); + 80004e02: cf0fe0ef jal 800032f2 + if(dp->dev != ip->dev || dirlink(dp, name, ip->inum) < 0){ + 80004e06: 00092703 lw a4,0(s2) + 80004e0a: 409c lw a5,0(s1) + 80004e0c: 04f71363 bne a4,a5,80004e52 + 80004e10: 40d0 lw a2,4(s1) + 80004e12: fd040593 addi a1,s0,-48 + 80004e16: 854a mv a0,s2 + 80004e18: c57fe0ef jal 80003a6e + 80004e1c: 02054b63 bltz a0,80004e52 + iunlockput(dp); + 80004e20: 854a mv a0,s2 + 80004e22: edafe0ef jal 800034fc + iput(ip); + 80004e26: 8526 mv a0,s1 + 80004e28: e4cfe0ef jal 80003474 + end_op(); + 80004e2c: f1bfe0ef jal 80003d46 + return 0; + 80004e30: 4781 li a5,0 + 80004e32: 64f2 ld s1,280(sp) + 80004e34: 6952 ld s2,272(sp) + 80004e36: a0a1 j 80004e7e + end_op(); + 80004e38: f0ffe0ef jal 80003d46 + return -1; + 80004e3c: 57fd li a5,-1 + 80004e3e: 64f2 ld s1,280(sp) + 80004e40: a83d j 80004e7e + iunlockput(ip); + 80004e42: 8526 mv a0,s1 + 80004e44: eb8fe0ef jal 800034fc + end_op(); + 80004e48: efffe0ef jal 80003d46 + return -1; + 80004e4c: 57fd li a5,-1 + 80004e4e: 64f2 ld s1,280(sp) + 80004e50: a03d j 80004e7e + iunlockput(dp); + 80004e52: 854a mv a0,s2 + 80004e54: ea8fe0ef jal 800034fc + ilock(ip); + 80004e58: 8526 mv a0,s1 + 80004e5a: c98fe0ef jal 800032f2 + ip->nlink--; + 80004e5e: 04a4d783 lhu a5,74(s1) + 80004e62: 37fd addiw a5,a5,-1 + 80004e64: 04f49523 sh a5,74(s1) + iupdate(ip); + 80004e68: 8526 mv a0,s1 + 80004e6a: bd4fe0ef jal 8000323e + iunlockput(ip); + 80004e6e: 8526 mv a0,s1 + 80004e70: e8cfe0ef jal 800034fc + end_op(); + 80004e74: ed3fe0ef jal 80003d46 + return -1; + 80004e78: 57fd li a5,-1 + 80004e7a: 64f2 ld s1,280(sp) + 80004e7c: 6952 ld s2,272(sp) +} + 80004e7e: 853e mv a0,a5 + 80004e80: 70b2 ld ra,296(sp) + 80004e82: 7412 ld s0,288(sp) + 80004e84: 6155 addi sp,sp,304 + 80004e86: 8082 ret + +0000000080004e88 : +{ + 80004e88: 7151 addi sp,sp,-240 + 80004e8a: f586 sd ra,232(sp) + 80004e8c: f1a2 sd s0,224(sp) + 80004e8e: 1980 addi s0,sp,240 + if(argstr(0, path, MAXPATH) < 0) + 80004e90: 08000613 li a2,128 + 80004e94: f3040593 addi a1,s0,-208 + 80004e98: 4501 li a0,0 + 80004e9a: 97bfd0ef jal 80002814 + 80004e9e: 16054063 bltz a0,80004ffe + 80004ea2: eda6 sd s1,216(sp) + begin_op(); + 80004ea4: e39fe0ef jal 80003cdc + if((dp = nameiparent(path, name)) == 0){ + 80004ea8: fb040593 addi a1,s0,-80 + 80004eac: f3040513 addi a0,s0,-208 + 80004eb0: c73fe0ef jal 80003b22 + 80004eb4: 84aa mv s1,a0 + 80004eb6: c945 beqz a0,80004f66 + ilock(dp); + 80004eb8: c3afe0ef jal 800032f2 + if(namecmp(name, ".") == 0 || namecmp(name, "..") == 0) + 80004ebc: 00002597 auipc a1,0x2 + 80004ec0: 72458593 addi a1,a1,1828 # 800075e0 + 80004ec4: fb040513 addi a0,s0,-80 + 80004ec8: 9c5fe0ef jal 8000388c + 80004ecc: 10050e63 beqz a0,80004fe8 + 80004ed0: 00002597 auipc a1,0x2 + 80004ed4: 71858593 addi a1,a1,1816 # 800075e8 + 80004ed8: fb040513 addi a0,s0,-80 + 80004edc: 9b1fe0ef jal 8000388c + 80004ee0: 10050463 beqz a0,80004fe8 + 80004ee4: e9ca sd s2,208(sp) + if((ip = dirlookup(dp, name, &off)) == 0) + 80004ee6: f2c40613 addi a2,s0,-212 + 80004eea: fb040593 addi a1,s0,-80 + 80004eee: 8526 mv a0,s1 + 80004ef0: 9b3fe0ef jal 800038a2 + 80004ef4: 892a mv s2,a0 + 80004ef6: 0e050863 beqz a0,80004fe6 + ilock(ip); + 80004efa: bf8fe0ef jal 800032f2 + if(ip->nlink < 1) + 80004efe: 04a91783 lh a5,74(s2) + 80004f02: 06f05763 blez a5,80004f70 + if(ip->type == T_DIR && !isdirempty(ip)){ + 80004f06: 04491703 lh a4,68(s2) + 80004f0a: 4785 li a5,1 + 80004f0c: 06f70963 beq a4,a5,80004f7e + memset(&de, 0, sizeof(de)); + 80004f10: 4641 li a2,16 + 80004f12: 4581 li a1,0 + 80004f14: fc040513 addi a0,s0,-64 + 80004f18: d8bfb0ef jal 80000ca2 + if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80004f1c: 4741 li a4,16 + 80004f1e: f2c42683 lw a3,-212(s0) + 80004f22: fc040613 addi a2,s0,-64 + 80004f26: 4581 li a1,0 + 80004f28: 8526 mv a0,s1 + 80004f2a: 855fe0ef jal 8000377e + 80004f2e: 47c1 li a5,16 + 80004f30: 08f51b63 bne a0,a5,80004fc6 + if(ip->type == T_DIR){ + 80004f34: 04491703 lh a4,68(s2) + 80004f38: 4785 li a5,1 + 80004f3a: 08f70d63 beq a4,a5,80004fd4 + iunlockput(dp); + 80004f3e: 8526 mv a0,s1 + 80004f40: dbcfe0ef jal 800034fc + ip->nlink--; + 80004f44: 04a95783 lhu a5,74(s2) + 80004f48: 37fd addiw a5,a5,-1 + 80004f4a: 04f91523 sh a5,74(s2) + iupdate(ip); + 80004f4e: 854a mv a0,s2 + 80004f50: aeefe0ef jal 8000323e + iunlockput(ip); + 80004f54: 854a mv a0,s2 + 80004f56: da6fe0ef jal 800034fc + end_op(); + 80004f5a: dedfe0ef jal 80003d46 + return 0; + 80004f5e: 4501 li a0,0 + 80004f60: 64ee ld s1,216(sp) + 80004f62: 694e ld s2,208(sp) + 80004f64: a849 j 80004ff6 + end_op(); + 80004f66: de1fe0ef jal 80003d46 + return -1; + 80004f6a: 557d li a0,-1 + 80004f6c: 64ee ld s1,216(sp) + 80004f6e: a061 j 80004ff6 + 80004f70: e5ce sd s3,200(sp) + panic("unlink: nlink < 1"); + 80004f72: 00002517 auipc a0,0x2 + 80004f76: 67e50513 addi a0,a0,1662 # 800075f0 + 80004f7a: 867fb0ef jal 800007e0 + for(off=2*sizeof(de); offsize; off+=sizeof(de)){ + 80004f7e: 04c92703 lw a4,76(s2) + 80004f82: 02000793 li a5,32 + 80004f86: f8e7f5e3 bgeu a5,a4,80004f10 + 80004f8a: e5ce sd s3,200(sp) + 80004f8c: 02000993 li s3,32 + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80004f90: 4741 li a4,16 + 80004f92: 86ce mv a3,s3 + 80004f94: f1840613 addi a2,s0,-232 + 80004f98: 4581 li a1,0 + 80004f9a: 854a mv a0,s2 + 80004f9c: ee6fe0ef jal 80003682 + 80004fa0: 47c1 li a5,16 + 80004fa2: 00f51c63 bne a0,a5,80004fba + if(de.inum != 0) + 80004fa6: f1845783 lhu a5,-232(s0) + 80004faa: efa1 bnez a5,80005002 + for(off=2*sizeof(de); offsize; off+=sizeof(de)){ + 80004fac: 29c1 addiw s3,s3,16 + 80004fae: 04c92783 lw a5,76(s2) + 80004fb2: fcf9efe3 bltu s3,a5,80004f90 + 80004fb6: 69ae ld s3,200(sp) + 80004fb8: bfa1 j 80004f10 + panic("isdirempty: readi"); + 80004fba: 00002517 auipc a0,0x2 + 80004fbe: 64e50513 addi a0,a0,1614 # 80007608 + 80004fc2: 81ffb0ef jal 800007e0 + 80004fc6: e5ce sd s3,200(sp) + panic("unlink: writei"); + 80004fc8: 00002517 auipc a0,0x2 + 80004fcc: 65850513 addi a0,a0,1624 # 80007620 + 80004fd0: 811fb0ef jal 800007e0 + dp->nlink--; + 80004fd4: 04a4d783 lhu a5,74(s1) + 80004fd8: 37fd addiw a5,a5,-1 + 80004fda: 04f49523 sh a5,74(s1) + iupdate(dp); + 80004fde: 8526 mv a0,s1 + 80004fe0: a5efe0ef jal 8000323e + 80004fe4: bfa9 j 80004f3e + 80004fe6: 694e ld s2,208(sp) + iunlockput(dp); + 80004fe8: 8526 mv a0,s1 + 80004fea: d12fe0ef jal 800034fc + end_op(); + 80004fee: d59fe0ef jal 80003d46 + return -1; + 80004ff2: 557d li a0,-1 + 80004ff4: 64ee ld s1,216(sp) +} + 80004ff6: 70ae ld ra,232(sp) + 80004ff8: 740e ld s0,224(sp) + 80004ffa: 616d addi sp,sp,240 + 80004ffc: 8082 ret + return -1; + 80004ffe: 557d li a0,-1 + 80005000: bfdd j 80004ff6 + iunlockput(ip); + 80005002: 854a mv a0,s2 + 80005004: cf8fe0ef jal 800034fc + goto bad; + 80005008: 694e ld s2,208(sp) + 8000500a: 69ae ld s3,200(sp) + 8000500c: bff1 j 80004fe8 + +000000008000500e : + +uint64 +sys_open(void) +{ + 8000500e: 7131 addi sp,sp,-192 + 80005010: fd06 sd ra,184(sp) + 80005012: f922 sd s0,176(sp) + 80005014: 0180 addi s0,sp,192 + int fd, omode; + struct file *f; + struct inode *ip; + int n; + + argint(1, &omode); + 80005016: f4c40593 addi a1,s0,-180 + 8000501a: 4505 li a0,1 + 8000501c: fc0fd0ef jal 800027dc + if((n = argstr(0, path, MAXPATH)) < 0) + 80005020: 08000613 li a2,128 + 80005024: f5040593 addi a1,s0,-176 + 80005028: 4501 li a0,0 + 8000502a: feafd0ef jal 80002814 + 8000502e: 87aa mv a5,a0 + return -1; + 80005030: 557d li a0,-1 + if((n = argstr(0, path, MAXPATH)) < 0) + 80005032: 0a07c263 bltz a5,800050d6 + 80005036: f526 sd s1,168(sp) + + begin_op(); + 80005038: ca5fe0ef jal 80003cdc + + if(omode & O_CREATE){ + 8000503c: f4c42783 lw a5,-180(s0) + 80005040: 2007f793 andi a5,a5,512 + 80005044: c3d5 beqz a5,800050e8 + ip = create(path, T_FILE, 0, 0); + 80005046: 4681 li a3,0 + 80005048: 4601 li a2,0 + 8000504a: 4589 li a1,2 + 8000504c: f5040513 addi a0,s0,-176 + 80005050: aa9ff0ef jal 80004af8 + 80005054: 84aa mv s1,a0 + if(ip == 0){ + 80005056: c541 beqz a0,800050de + end_op(); + return -1; + } + } + + if(ip->type == T_DEVICE && (ip->major < 0 || ip->major >= NDEV)){ + 80005058: 04449703 lh a4,68(s1) + 8000505c: 478d li a5,3 + 8000505e: 00f71763 bne a4,a5,8000506c + 80005062: 0464d703 lhu a4,70(s1) + 80005066: 47a5 li a5,9 + 80005068: 0ae7ed63 bltu a5,a4,80005122 + 8000506c: f14a sd s2,160(sp) + iunlockput(ip); + end_op(); + return -1; + } + + if((f = filealloc()) == 0 || (fd = fdalloc(f)) < 0){ + 8000506e: fd7fe0ef jal 80004044 + 80005072: 892a mv s2,a0 + 80005074: c179 beqz a0,8000513a + 80005076: ed4e sd s3,152(sp) + 80005078: a43ff0ef jal 80004aba + 8000507c: 89aa mv s3,a0 + 8000507e: 0a054a63 bltz a0,80005132 + iunlockput(ip); + end_op(); + return -1; + } + + if(ip->type == T_DEVICE){ + 80005082: 04449703 lh a4,68(s1) + 80005086: 478d li a5,3 + 80005088: 0cf70263 beq a4,a5,8000514c + f->type = FD_DEVICE; + f->major = ip->major; + } else { + f->type = FD_INODE; + 8000508c: 4789 li a5,2 + 8000508e: 00f92023 sw a5,0(s2) + f->off = 0; + 80005092: 02092023 sw zero,32(s2) + } + f->ip = ip; + 80005096: 00993c23 sd s1,24(s2) + f->readable = !(omode & O_WRONLY); + 8000509a: f4c42783 lw a5,-180(s0) + 8000509e: 0017c713 xori a4,a5,1 + 800050a2: 8b05 andi a4,a4,1 + 800050a4: 00e90423 sb a4,8(s2) + f->writable = (omode & O_WRONLY) || (omode & O_RDWR); + 800050a8: 0037f713 andi a4,a5,3 + 800050ac: 00e03733 snez a4,a4 + 800050b0: 00e904a3 sb a4,9(s2) + + if((omode & O_TRUNC) && ip->type == T_FILE){ + 800050b4: 4007f793 andi a5,a5,1024 + 800050b8: c791 beqz a5,800050c4 + 800050ba: 04449703 lh a4,68(s1) + 800050be: 4789 li a5,2 + 800050c0: 08f70d63 beq a4,a5,8000515a + itrunc(ip); + } + + iunlock(ip); + 800050c4: 8526 mv a0,s1 + 800050c6: adafe0ef jal 800033a0 + end_op(); + 800050ca: c7dfe0ef jal 80003d46 + + return fd; + 800050ce: 854e mv a0,s3 + 800050d0: 74aa ld s1,168(sp) + 800050d2: 790a ld s2,160(sp) + 800050d4: 69ea ld s3,152(sp) +} + 800050d6: 70ea ld ra,184(sp) + 800050d8: 744a ld s0,176(sp) + 800050da: 6129 addi sp,sp,192 + 800050dc: 8082 ret + end_op(); + 800050de: c69fe0ef jal 80003d46 + return -1; + 800050e2: 557d li a0,-1 + 800050e4: 74aa ld s1,168(sp) + 800050e6: bfc5 j 800050d6 + if((ip = namei(path)) == 0){ + 800050e8: f5040513 addi a0,s0,-176 + 800050ec: a1dfe0ef jal 80003b08 + 800050f0: 84aa mv s1,a0 + 800050f2: c11d beqz a0,80005118 + ilock(ip); + 800050f4: 9fefe0ef jal 800032f2 + if(ip->type == T_DIR && omode != O_RDONLY){ + 800050f8: 04449703 lh a4,68(s1) + 800050fc: 4785 li a5,1 + 800050fe: f4f71de3 bne a4,a5,80005058 + 80005102: f4c42783 lw a5,-180(s0) + 80005106: d3bd beqz a5,8000506c + iunlockput(ip); + 80005108: 8526 mv a0,s1 + 8000510a: bf2fe0ef jal 800034fc + end_op(); + 8000510e: c39fe0ef jal 80003d46 + return -1; + 80005112: 557d li a0,-1 + 80005114: 74aa ld s1,168(sp) + 80005116: b7c1 j 800050d6 + end_op(); + 80005118: c2ffe0ef jal 80003d46 + return -1; + 8000511c: 557d li a0,-1 + 8000511e: 74aa ld s1,168(sp) + 80005120: bf5d j 800050d6 + iunlockput(ip); + 80005122: 8526 mv a0,s1 + 80005124: bd8fe0ef jal 800034fc + end_op(); + 80005128: c1ffe0ef jal 80003d46 + return -1; + 8000512c: 557d li a0,-1 + 8000512e: 74aa ld s1,168(sp) + 80005130: b75d j 800050d6 + fileclose(f); + 80005132: 854a mv a0,s2 + 80005134: fb5fe0ef jal 800040e8 + 80005138: 69ea ld s3,152(sp) + iunlockput(ip); + 8000513a: 8526 mv a0,s1 + 8000513c: bc0fe0ef jal 800034fc + end_op(); + 80005140: c07fe0ef jal 80003d46 + return -1; + 80005144: 557d li a0,-1 + 80005146: 74aa ld s1,168(sp) + 80005148: 790a ld s2,160(sp) + 8000514a: b771 j 800050d6 + f->type = FD_DEVICE; + 8000514c: 00f92023 sw a5,0(s2) + f->major = ip->major; + 80005150: 04649783 lh a5,70(s1) + 80005154: 02f91223 sh a5,36(s2) + 80005158: bf3d j 80005096 + itrunc(ip); + 8000515a: 8526 mv a0,s1 + 8000515c: a84fe0ef jal 800033e0 + 80005160: b795 j 800050c4 + +0000000080005162 : + +uint64 +sys_mkdir(void) +{ + 80005162: 7175 addi sp,sp,-144 + 80005164: e506 sd ra,136(sp) + 80005166: e122 sd s0,128(sp) + 80005168: 0900 addi s0,sp,144 + char path[MAXPATH]; + struct inode *ip; + + begin_op(); + 8000516a: b73fe0ef jal 80003cdc + if(argstr(0, path, MAXPATH) < 0 || (ip = create(path, T_DIR, 0, 0)) == 0){ + 8000516e: 08000613 li a2,128 + 80005172: f7040593 addi a1,s0,-144 + 80005176: 4501 li a0,0 + 80005178: e9cfd0ef jal 80002814 + 8000517c: 02054363 bltz a0,800051a2 + 80005180: 4681 li a3,0 + 80005182: 4601 li a2,0 + 80005184: 4585 li a1,1 + 80005186: f7040513 addi a0,s0,-144 + 8000518a: 96fff0ef jal 80004af8 + 8000518e: c911 beqz a0,800051a2 + end_op(); + return -1; + } + iunlockput(ip); + 80005190: b6cfe0ef jal 800034fc + end_op(); + 80005194: bb3fe0ef jal 80003d46 + return 0; + 80005198: 4501 li a0,0 +} + 8000519a: 60aa ld ra,136(sp) + 8000519c: 640a ld s0,128(sp) + 8000519e: 6149 addi sp,sp,144 + 800051a0: 8082 ret + end_op(); + 800051a2: ba5fe0ef jal 80003d46 + return -1; + 800051a6: 557d li a0,-1 + 800051a8: bfcd j 8000519a + +00000000800051aa : + +uint64 +sys_mknod(void) +{ + 800051aa: 7135 addi sp,sp,-160 + 800051ac: ed06 sd ra,152(sp) + 800051ae: e922 sd s0,144(sp) + 800051b0: 1100 addi s0,sp,160 + struct inode *ip; + char path[MAXPATH]; + int major, minor; + + begin_op(); + 800051b2: b2bfe0ef jal 80003cdc + argint(1, &major); + 800051b6: f6c40593 addi a1,s0,-148 + 800051ba: 4505 li a0,1 + 800051bc: e20fd0ef jal 800027dc + argint(2, &minor); + 800051c0: f6840593 addi a1,s0,-152 + 800051c4: 4509 li a0,2 + 800051c6: e16fd0ef jal 800027dc + if((argstr(0, path, MAXPATH)) < 0 || + 800051ca: 08000613 li a2,128 + 800051ce: f7040593 addi a1,s0,-144 + 800051d2: 4501 li a0,0 + 800051d4: e40fd0ef jal 80002814 + 800051d8: 02054563 bltz a0,80005202 + (ip = create(path, T_DEVICE, major, minor)) == 0){ + 800051dc: f6841683 lh a3,-152(s0) + 800051e0: f6c41603 lh a2,-148(s0) + 800051e4: 458d li a1,3 + 800051e6: f7040513 addi a0,s0,-144 + 800051ea: 90fff0ef jal 80004af8 + if((argstr(0, path, MAXPATH)) < 0 || + 800051ee: c911 beqz a0,80005202 + end_op(); + return -1; + } + iunlockput(ip); + 800051f0: b0cfe0ef jal 800034fc + end_op(); + 800051f4: b53fe0ef jal 80003d46 + return 0; + 800051f8: 4501 li a0,0 +} + 800051fa: 60ea ld ra,152(sp) + 800051fc: 644a ld s0,144(sp) + 800051fe: 610d addi sp,sp,160 + 80005200: 8082 ret + end_op(); + 80005202: b45fe0ef jal 80003d46 + return -1; + 80005206: 557d li a0,-1 + 80005208: bfcd j 800051fa + +000000008000520a : + +uint64 +sys_chdir(void) +{ + 8000520a: 7135 addi sp,sp,-160 + 8000520c: ed06 sd ra,152(sp) + 8000520e: e922 sd s0,144(sp) + 80005210: e14a sd s2,128(sp) + 80005212: 1100 addi s0,sp,160 + char path[MAXPATH]; + struct inode *ip; + struct proc *p = myproc(); + 80005214: ebafc0ef jal 800018ce + 80005218: 892a mv s2,a0 + + begin_op(); + 8000521a: ac3fe0ef jal 80003cdc + if(argstr(0, path, MAXPATH) < 0 || (ip = namei(path)) == 0){ + 8000521e: 08000613 li a2,128 + 80005222: f6040593 addi a1,s0,-160 + 80005226: 4501 li a0,0 + 80005228: decfd0ef jal 80002814 + 8000522c: 04054363 bltz a0,80005272 + 80005230: e526 sd s1,136(sp) + 80005232: f6040513 addi a0,s0,-160 + 80005236: 8d3fe0ef jal 80003b08 + 8000523a: 84aa mv s1,a0 + 8000523c: c915 beqz a0,80005270 + end_op(); + return -1; + } + ilock(ip); + 8000523e: 8b4fe0ef jal 800032f2 + if(ip->type != T_DIR){ + 80005242: 04449703 lh a4,68(s1) + 80005246: 4785 li a5,1 + 80005248: 02f71963 bne a4,a5,8000527a + iunlockput(ip); + end_op(); + return -1; + } + iunlock(ip); + 8000524c: 8526 mv a0,s1 + 8000524e: 952fe0ef jal 800033a0 + iput(p->cwd); + 80005252: 15093503 ld a0,336(s2) + 80005256: a1efe0ef jal 80003474 + end_op(); + 8000525a: aedfe0ef jal 80003d46 + p->cwd = ip; + 8000525e: 14993823 sd s1,336(s2) + return 0; + 80005262: 4501 li a0,0 + 80005264: 64aa ld s1,136(sp) +} + 80005266: 60ea ld ra,152(sp) + 80005268: 644a ld s0,144(sp) + 8000526a: 690a ld s2,128(sp) + 8000526c: 610d addi sp,sp,160 + 8000526e: 8082 ret + 80005270: 64aa ld s1,136(sp) + end_op(); + 80005272: ad5fe0ef jal 80003d46 + return -1; + 80005276: 557d li a0,-1 + 80005278: b7fd j 80005266 + iunlockput(ip); + 8000527a: 8526 mv a0,s1 + 8000527c: a80fe0ef jal 800034fc + end_op(); + 80005280: ac7fe0ef jal 80003d46 + return -1; + 80005284: 557d li a0,-1 + 80005286: 64aa ld s1,136(sp) + 80005288: bff9 j 80005266 + +000000008000528a : + +uint64 +sys_exec(void) +{ + 8000528a: 7121 addi sp,sp,-448 + 8000528c: ff06 sd ra,440(sp) + 8000528e: fb22 sd s0,432(sp) + 80005290: 0380 addi s0,sp,448 + char path[MAXPATH], *argv[MAXARG]; + int i; + uint64 uargv, uarg; + + argaddr(1, &uargv); + 80005292: e4840593 addi a1,s0,-440 + 80005296: 4505 li a0,1 + 80005298: d60fd0ef jal 800027f8 + if(argstr(0, path, MAXPATH) < 0) { + 8000529c: 08000613 li a2,128 + 800052a0: f5040593 addi a1,s0,-176 + 800052a4: 4501 li a0,0 + 800052a6: d6efd0ef jal 80002814 + 800052aa: 87aa mv a5,a0 + return -1; + 800052ac: 557d li a0,-1 + if(argstr(0, path, MAXPATH) < 0) { + 800052ae: 0c07c463 bltz a5,80005376 + 800052b2: f726 sd s1,424(sp) + 800052b4: f34a sd s2,416(sp) + 800052b6: ef4e sd s3,408(sp) + 800052b8: eb52 sd s4,400(sp) + } + memset(argv, 0, sizeof(argv)); + 800052ba: 10000613 li a2,256 + 800052be: 4581 li a1,0 + 800052c0: e5040513 addi a0,s0,-432 + 800052c4: 9dffb0ef jal 80000ca2 + for(i=0;; i++){ + if(i >= NELEM(argv)){ + 800052c8: e5040493 addi s1,s0,-432 + memset(argv, 0, sizeof(argv)); + 800052cc: 89a6 mv s3,s1 + 800052ce: 4901 li s2,0 + if(i >= NELEM(argv)){ + 800052d0: 02000a13 li s4,32 + goto bad; + } + if(fetchaddr(uargv+sizeof(uint64)*i, (uint64*)&uarg) < 0){ + 800052d4: 00391513 slli a0,s2,0x3 + 800052d8: e4040593 addi a1,s0,-448 + 800052dc: e4843783 ld a5,-440(s0) + 800052e0: 953e add a0,a0,a5 + 800052e2: c70fd0ef jal 80002752 + 800052e6: 02054663 bltz a0,80005312 + goto bad; + } + if(uarg == 0){ + 800052ea: e4043783 ld a5,-448(s0) + 800052ee: c3a9 beqz a5,80005330 + argv[i] = 0; + break; + } + argv[i] = kalloc(); + 800052f0: 80ffb0ef jal 80000afe + 800052f4: 85aa mv a1,a0 + 800052f6: 00a9b023 sd a0,0(s3) + if(argv[i] == 0) + 800052fa: cd01 beqz a0,80005312 + goto bad; + if(fetchstr(uarg, argv[i], PGSIZE) < 0) + 800052fc: 6605 lui a2,0x1 + 800052fe: e4043503 ld a0,-448(s0) + 80005302: c9afd0ef jal 8000279c + 80005306: 00054663 bltz a0,80005312 + if(i >= NELEM(argv)){ + 8000530a: 0905 addi s2,s2,1 + 8000530c: 09a1 addi s3,s3,8 + 8000530e: fd4913e3 bne s2,s4,800052d4 + kfree(argv[i]); + + return ret; + + bad: + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 80005312: f5040913 addi s2,s0,-176 + 80005316: 6088 ld a0,0(s1) + 80005318: c931 beqz a0,8000536c + kfree(argv[i]); + 8000531a: f02fb0ef jal 80000a1c + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 8000531e: 04a1 addi s1,s1,8 + 80005320: ff249be3 bne s1,s2,80005316 + return -1; + 80005324: 557d li a0,-1 + 80005326: 74ba ld s1,424(sp) + 80005328: 791a ld s2,416(sp) + 8000532a: 69fa ld s3,408(sp) + 8000532c: 6a5a ld s4,400(sp) + 8000532e: a0a1 j 80005376 + argv[i] = 0; + 80005330: 0009079b sext.w a5,s2 + 80005334: 078e slli a5,a5,0x3 + 80005336: fd078793 addi a5,a5,-48 + 8000533a: 97a2 add a5,a5,s0 + 8000533c: e807b023 sd zero,-384(a5) + int ret = kexec(path, argv); + 80005340: e5040593 addi a1,s0,-432 + 80005344: f5040513 addi a0,s0,-176 + 80005348: ba8ff0ef jal 800046f0 + 8000534c: 892a mv s2,a0 + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 8000534e: f5040993 addi s3,s0,-176 + 80005352: 6088 ld a0,0(s1) + 80005354: c511 beqz a0,80005360 + kfree(argv[i]); + 80005356: ec6fb0ef jal 80000a1c + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 8000535a: 04a1 addi s1,s1,8 + 8000535c: ff349be3 bne s1,s3,80005352 + return ret; + 80005360: 854a mv a0,s2 + 80005362: 74ba ld s1,424(sp) + 80005364: 791a ld s2,416(sp) + 80005366: 69fa ld s3,408(sp) + 80005368: 6a5a ld s4,400(sp) + 8000536a: a031 j 80005376 + return -1; + 8000536c: 557d li a0,-1 + 8000536e: 74ba ld s1,424(sp) + 80005370: 791a ld s2,416(sp) + 80005372: 69fa ld s3,408(sp) + 80005374: 6a5a ld s4,400(sp) +} + 80005376: 70fa ld ra,440(sp) + 80005378: 745a ld s0,432(sp) + 8000537a: 6139 addi sp,sp,448 + 8000537c: 8082 ret + +000000008000537e : + +uint64 +sys_pipe(void) +{ + 8000537e: 7139 addi sp,sp,-64 + 80005380: fc06 sd ra,56(sp) + 80005382: f822 sd s0,48(sp) + 80005384: f426 sd s1,40(sp) + 80005386: 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(); + 80005388: d46fc0ef jal 800018ce + 8000538c: 84aa mv s1,a0 + + argaddr(0, &fdarray); + 8000538e: fd840593 addi a1,s0,-40 + 80005392: 4501 li a0,0 + 80005394: c64fd0ef jal 800027f8 + if(pipealloc(&rf, &wf) < 0) + 80005398: fc840593 addi a1,s0,-56 + 8000539c: fd040513 addi a0,s0,-48 + 800053a0: 852ff0ef jal 800043f2 + return -1; + 800053a4: 57fd li a5,-1 + if(pipealloc(&rf, &wf) < 0) + 800053a6: 0a054463 bltz a0,8000544e + fd0 = -1; + 800053aa: fcf42223 sw a5,-60(s0) + if((fd0 = fdalloc(rf)) < 0 || (fd1 = fdalloc(wf)) < 0){ + 800053ae: fd043503 ld a0,-48(s0) + 800053b2: f08ff0ef jal 80004aba + 800053b6: fca42223 sw a0,-60(s0) + 800053ba: 08054163 bltz a0,8000543c + 800053be: fc843503 ld a0,-56(s0) + 800053c2: ef8ff0ef jal 80004aba + 800053c6: fca42023 sw a0,-64(s0) + 800053ca: 06054063 bltz a0,8000542a + p->ofile[fd0] = 0; + fileclose(rf); + fileclose(wf); + return -1; + } + if(copyout(p->pagetable, fdarray, (char*)&fd0, sizeof(fd0)) < 0 || + 800053ce: 4691 li a3,4 + 800053d0: fc440613 addi a2,s0,-60 + 800053d4: fd843583 ld a1,-40(s0) + 800053d8: 68a8 ld a0,80(s1) + 800053da: a08fc0ef jal 800015e2 + 800053de: 00054e63 bltz a0,800053fa + copyout(p->pagetable, fdarray+sizeof(fd0), (char *)&fd1, sizeof(fd1)) < 0){ + 800053e2: 4691 li a3,4 + 800053e4: fc040613 addi a2,s0,-64 + 800053e8: fd843583 ld a1,-40(s0) + 800053ec: 0591 addi a1,a1,4 + 800053ee: 68a8 ld a0,80(s1) + 800053f0: 9f2fc0ef jal 800015e2 + p->ofile[fd1] = 0; + fileclose(rf); + fileclose(wf); + return -1; + } + return 0; + 800053f4: 4781 li a5,0 + if(copyout(p->pagetable, fdarray, (char*)&fd0, sizeof(fd0)) < 0 || + 800053f6: 04055c63 bgez a0,8000544e + p->ofile[fd0] = 0; + 800053fa: fc442783 lw a5,-60(s0) + 800053fe: 07e9 addi a5,a5,26 + 80005400: 078e slli a5,a5,0x3 + 80005402: 97a6 add a5,a5,s1 + 80005404: 0007b023 sd zero,0(a5) + p->ofile[fd1] = 0; + 80005408: fc042783 lw a5,-64(s0) + 8000540c: 07e9 addi a5,a5,26 + 8000540e: 078e slli a5,a5,0x3 + 80005410: 94be add s1,s1,a5 + 80005412: 0004b023 sd zero,0(s1) + fileclose(rf); + 80005416: fd043503 ld a0,-48(s0) + 8000541a: ccffe0ef jal 800040e8 + fileclose(wf); + 8000541e: fc843503 ld a0,-56(s0) + 80005422: cc7fe0ef jal 800040e8 + return -1; + 80005426: 57fd li a5,-1 + 80005428: a01d j 8000544e + if(fd0 >= 0) + 8000542a: fc442783 lw a5,-60(s0) + 8000542e: 0007c763 bltz a5,8000543c + p->ofile[fd0] = 0; + 80005432: 07e9 addi a5,a5,26 + 80005434: 078e slli a5,a5,0x3 + 80005436: 97a6 add a5,a5,s1 + 80005438: 0007b023 sd zero,0(a5) + fileclose(rf); + 8000543c: fd043503 ld a0,-48(s0) + 80005440: ca9fe0ef jal 800040e8 + fileclose(wf); + 80005444: fc843503 ld a0,-56(s0) + 80005448: ca1fe0ef jal 800040e8 + return -1; + 8000544c: 57fd li a5,-1 +} + 8000544e: 853e mv a0,a5 + 80005450: 70e2 ld ra,56(sp) + 80005452: 7442 ld s0,48(sp) + 80005454: 74a2 ld s1,40(sp) + 80005456: 6121 addi sp,sp,64 + 80005458: 8082 ret + 8000545a: 0000 unimp + 8000545c: 0000 unimp + ... + +0000000080005460 : +.globl kerneltrap +.globl kernelvec +.align 4 +kernelvec: + # make room to save registers. + addi sp, sp, -256 + 80005460: 7111 addi sp,sp,-256 + + # save caller-saved registers. + sd ra, 0(sp) + 80005462: e006 sd ra,0(sp) + # sd sp, 8(sp) + sd gp, 16(sp) + 80005464: e80e sd gp,16(sp) + sd tp, 24(sp) + 80005466: ec12 sd tp,24(sp) + sd t0, 32(sp) + 80005468: f016 sd t0,32(sp) + sd t1, 40(sp) + 8000546a: f41a sd t1,40(sp) + sd t2, 48(sp) + 8000546c: f81e sd t2,48(sp) + sd a0, 72(sp) + 8000546e: e4aa sd a0,72(sp) + sd a1, 80(sp) + 80005470: e8ae sd a1,80(sp) + sd a2, 88(sp) + 80005472: ecb2 sd a2,88(sp) + sd a3, 96(sp) + 80005474: f0b6 sd a3,96(sp) + sd a4, 104(sp) + 80005476: f4ba sd a4,104(sp) + sd a5, 112(sp) + 80005478: f8be sd a5,112(sp) + sd a6, 120(sp) + 8000547a: fcc2 sd a6,120(sp) + sd a7, 128(sp) + 8000547c: e146 sd a7,128(sp) + sd t3, 216(sp) + 8000547e: edf2 sd t3,216(sp) + sd t4, 224(sp) + 80005480: f1f6 sd t4,224(sp) + sd t5, 232(sp) + 80005482: f5fa sd t5,232(sp) + sd t6, 240(sp) + 80005484: f9fe sd t6,240(sp) + + # call the C trap handler in trap.c + call kerneltrap + 80005486: 9dcfd0ef jal 80002662 + + # restore registers. + ld ra, 0(sp) + 8000548a: 6082 ld ra,0(sp) + # ld sp, 8(sp) + ld gp, 16(sp) + 8000548c: 61c2 ld gp,16(sp) + # not tp (contains hartid), in case we moved CPUs + ld t0, 32(sp) + 8000548e: 7282 ld t0,32(sp) + ld t1, 40(sp) + 80005490: 7322 ld t1,40(sp) + ld t2, 48(sp) + 80005492: 73c2 ld t2,48(sp) + ld a0, 72(sp) + 80005494: 6526 ld a0,72(sp) + ld a1, 80(sp) + 80005496: 65c6 ld a1,80(sp) + ld a2, 88(sp) + 80005498: 6666 ld a2,88(sp) + ld a3, 96(sp) + 8000549a: 7686 ld a3,96(sp) + ld a4, 104(sp) + 8000549c: 7726 ld a4,104(sp) + ld a5, 112(sp) + 8000549e: 77c6 ld a5,112(sp) + ld a6, 120(sp) + 800054a0: 7866 ld a6,120(sp) + ld a7, 128(sp) + 800054a2: 688a ld a7,128(sp) + ld t3, 216(sp) + 800054a4: 6e6e ld t3,216(sp) + ld t4, 224(sp) + 800054a6: 7e8e ld t4,224(sp) + ld t5, 232(sp) + 800054a8: 7f2e ld t5,232(sp) + ld t6, 240(sp) + 800054aa: 7fce ld t6,240(sp) + + addi sp, sp, 256 + 800054ac: 6111 addi sp,sp,256 + + # return to whatever we were doing in the kernel. + sret + 800054ae: 10200073 sret + ... + +00000000800054be : +// the riscv Platform Level Interrupt Controller (PLIC). +// + +void +plicinit(void) +{ + 800054be: 1141 addi sp,sp,-16 + 800054c0: e422 sd s0,8(sp) + 800054c2: 0800 addi s0,sp,16 + // set desired IRQ priorities non-zero (otherwise disabled). + *(uint32*)(PLIC + UART0_IRQ*4) = 1; + 800054c4: 0c0007b7 lui a5,0xc000 + 800054c8: 4705 li a4,1 + 800054ca: d798 sw a4,40(a5) + *(uint32*)(PLIC + VIRTIO0_IRQ*4) = 1; + 800054cc: 0c0007b7 lui a5,0xc000 + 800054d0: c3d8 sw a4,4(a5) +} + 800054d2: 6422 ld s0,8(sp) + 800054d4: 0141 addi sp,sp,16 + 800054d6: 8082 ret + +00000000800054d8 : + +void +plicinithart(void) +{ + 800054d8: 1141 addi sp,sp,-16 + 800054da: e406 sd ra,8(sp) + 800054dc: e022 sd s0,0(sp) + 800054de: 0800 addi s0,sp,16 + int hart = cpuid(); + 800054e0: bc2fc0ef jal 800018a2 + + // set enable bits for this hart's S-mode + // for the uart and virtio disk. + *(uint32*)PLIC_SENABLE(hart) = (1 << UART0_IRQ) | (1 << VIRTIO0_IRQ); + 800054e4: 0085171b slliw a4,a0,0x8 + 800054e8: 0c0027b7 lui a5,0xc002 + 800054ec: 97ba add a5,a5,a4 + 800054ee: 40200713 li a4,1026 + 800054f2: 08e7a023 sw a4,128(a5) # c002080 <_entry-0x73ffdf80> + + // set this hart's S-mode priority threshold to 0. + *(uint32*)PLIC_SPRIORITY(hart) = 0; + 800054f6: 00d5151b slliw a0,a0,0xd + 800054fa: 0c2017b7 lui a5,0xc201 + 800054fe: 97aa add a5,a5,a0 + 80005500: 0007a023 sw zero,0(a5) # c201000 <_entry-0x73dff000> +} + 80005504: 60a2 ld ra,8(sp) + 80005506: 6402 ld s0,0(sp) + 80005508: 0141 addi sp,sp,16 + 8000550a: 8082 ret + +000000008000550c : + +// ask the PLIC what interrupt we should serve. +int +plic_claim(void) +{ + 8000550c: 1141 addi sp,sp,-16 + 8000550e: e406 sd ra,8(sp) + 80005510: e022 sd s0,0(sp) + 80005512: 0800 addi s0,sp,16 + int hart = cpuid(); + 80005514: b8efc0ef jal 800018a2 + int irq = *(uint32*)PLIC_SCLAIM(hart); + 80005518: 00d5151b slliw a0,a0,0xd + 8000551c: 0c2017b7 lui a5,0xc201 + 80005520: 97aa add a5,a5,a0 + return irq; +} + 80005522: 43c8 lw a0,4(a5) + 80005524: 60a2 ld ra,8(sp) + 80005526: 6402 ld s0,0(sp) + 80005528: 0141 addi sp,sp,16 + 8000552a: 8082 ret + +000000008000552c : + +// tell the PLIC we've served this IRQ. +void +plic_complete(int irq) +{ + 8000552c: 1101 addi sp,sp,-32 + 8000552e: ec06 sd ra,24(sp) + 80005530: e822 sd s0,16(sp) + 80005532: e426 sd s1,8(sp) + 80005534: 1000 addi s0,sp,32 + 80005536: 84aa mv s1,a0 + int hart = cpuid(); + 80005538: b6afc0ef jal 800018a2 + *(uint32*)PLIC_SCLAIM(hart) = irq; + 8000553c: 00d5151b slliw a0,a0,0xd + 80005540: 0c2017b7 lui a5,0xc201 + 80005544: 97aa add a5,a5,a0 + 80005546: c3c4 sw s1,4(a5) +} + 80005548: 60e2 ld ra,24(sp) + 8000554a: 6442 ld s0,16(sp) + 8000554c: 64a2 ld s1,8(sp) + 8000554e: 6105 addi sp,sp,32 + 80005550: 8082 ret + +0000000080005552 : +} + +// mark a descriptor as free. +static void +free_desc(int i) +{ + 80005552: 1141 addi sp,sp,-16 + 80005554: e406 sd ra,8(sp) + 80005556: e022 sd s0,0(sp) + 80005558: 0800 addi s0,sp,16 + if(i >= NUM) + 8000555a: 479d li a5,7 + 8000555c: 04a7ca63 blt a5,a0,800055b0 + panic("free_desc 1"); + if(disk.free[i]) + 80005560: 0001e797 auipc a5,0x1e + 80005564: f0878793 addi a5,a5,-248 # 80023468 + 80005568: 97aa add a5,a5,a0 + 8000556a: 0187c783 lbu a5,24(a5) + 8000556e: e7b9 bnez a5,800055bc + panic("free_desc 2"); + disk.desc[i].addr = 0; + 80005570: 00451693 slli a3,a0,0x4 + 80005574: 0001e797 auipc a5,0x1e + 80005578: ef478793 addi a5,a5,-268 # 80023468 + 8000557c: 6398 ld a4,0(a5) + 8000557e: 9736 add a4,a4,a3 + 80005580: 00073023 sd zero,0(a4) + disk.desc[i].len = 0; + 80005584: 6398 ld a4,0(a5) + 80005586: 9736 add a4,a4,a3 + 80005588: 00072423 sw zero,8(a4) + disk.desc[i].flags = 0; + 8000558c: 00071623 sh zero,12(a4) + disk.desc[i].next = 0; + 80005590: 00071723 sh zero,14(a4) + disk.free[i] = 1; + 80005594: 97aa add a5,a5,a0 + 80005596: 4705 li a4,1 + 80005598: 00e78c23 sb a4,24(a5) + wakeup(&disk.free[0]); + 8000559c: 0001e517 auipc a0,0x1e + 800055a0: ee450513 addi a0,a0,-284 # 80023480 + 800055a4: 981fc0ef jal 80001f24 +} + 800055a8: 60a2 ld ra,8(sp) + 800055aa: 6402 ld s0,0(sp) + 800055ac: 0141 addi sp,sp,16 + 800055ae: 8082 ret + panic("free_desc 1"); + 800055b0: 00002517 auipc a0,0x2 + 800055b4: 08050513 addi a0,a0,128 # 80007630 + 800055b8: a28fb0ef jal 800007e0 + panic("free_desc 2"); + 800055bc: 00002517 auipc a0,0x2 + 800055c0: 08450513 addi a0,a0,132 # 80007640 + 800055c4: a1cfb0ef jal 800007e0 + +00000000800055c8 : +{ + 800055c8: 1101 addi sp,sp,-32 + 800055ca: ec06 sd ra,24(sp) + 800055cc: e822 sd s0,16(sp) + 800055ce: e426 sd s1,8(sp) + 800055d0: e04a sd s2,0(sp) + 800055d2: 1000 addi s0,sp,32 + initlock(&disk.vdisk_lock, "virtio_disk"); + 800055d4: 00002597 auipc a1,0x2 + 800055d8: 07c58593 addi a1,a1,124 # 80007650 + 800055dc: 0001e517 auipc a0,0x1e + 800055e0: fb450513 addi a0,a0,-76 # 80023590 + 800055e4: d6afb0ef jal 80000b4e + if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 || + 800055e8: 100017b7 lui a5,0x10001 + 800055ec: 4398 lw a4,0(a5) + 800055ee: 2701 sext.w a4,a4 + 800055f0: 747277b7 lui a5,0x74727 + 800055f4: 97678793 addi a5,a5,-1674 # 74726976 <_entry-0xb8d968a> + 800055f8: 18f71063 bne a4,a5,80005778 + *R(VIRTIO_MMIO_VERSION) != 2 || + 800055fc: 100017b7 lui a5,0x10001 + 80005600: 0791 addi a5,a5,4 # 10001004 <_entry-0x6fffeffc> + 80005602: 439c lw a5,0(a5) + 80005604: 2781 sext.w a5,a5 + if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 || + 80005606: 4709 li a4,2 + 80005608: 16e79863 bne a5,a4,80005778 + *R(VIRTIO_MMIO_DEVICE_ID) != 2 || + 8000560c: 100017b7 lui a5,0x10001 + 80005610: 07a1 addi a5,a5,8 # 10001008 <_entry-0x6fffeff8> + 80005612: 439c lw a5,0(a5) + 80005614: 2781 sext.w a5,a5 + *R(VIRTIO_MMIO_VERSION) != 2 || + 80005616: 16e79163 bne a5,a4,80005778 + *R(VIRTIO_MMIO_VENDOR_ID) != 0x554d4551){ + 8000561a: 100017b7 lui a5,0x10001 + 8000561e: 47d8 lw a4,12(a5) + 80005620: 2701 sext.w a4,a4 + *R(VIRTIO_MMIO_DEVICE_ID) != 2 || + 80005622: 554d47b7 lui a5,0x554d4 + 80005626: 55178793 addi a5,a5,1361 # 554d4551 <_entry-0x2ab2baaf> + 8000562a: 14f71763 bne a4,a5,80005778 + *R(VIRTIO_MMIO_STATUS) = status; + 8000562e: 100017b7 lui a5,0x10001 + 80005632: 0607a823 sw zero,112(a5) # 10001070 <_entry-0x6fffef90> + *R(VIRTIO_MMIO_STATUS) = status; + 80005636: 4705 li a4,1 + 80005638: dbb8 sw a4,112(a5) + *R(VIRTIO_MMIO_STATUS) = status; + 8000563a: 470d li a4,3 + 8000563c: dbb8 sw a4,112(a5) + uint64 features = *R(VIRTIO_MMIO_DEVICE_FEATURES); + 8000563e: 10001737 lui a4,0x10001 + 80005642: 4b14 lw a3,16(a4) + features &= ~(1 << VIRTIO_RING_F_INDIRECT_DESC); + 80005644: c7ffe737 lui a4,0xc7ffe + 80005648: 75f70713 addi a4,a4,1887 # ffffffffc7ffe75f + *R(VIRTIO_MMIO_DRIVER_FEATURES) = features; + 8000564c: 8ef9 and a3,a3,a4 + 8000564e: 10001737 lui a4,0x10001 + 80005652: d314 sw a3,32(a4) + *R(VIRTIO_MMIO_STATUS) = status; + 80005654: 472d li a4,11 + 80005656: dbb8 sw a4,112(a5) + *R(VIRTIO_MMIO_STATUS) = status; + 80005658: 07078793 addi a5,a5,112 + status = *R(VIRTIO_MMIO_STATUS); + 8000565c: 439c lw a5,0(a5) + 8000565e: 0007891b sext.w s2,a5 + if(!(status & VIRTIO_CONFIG_S_FEATURES_OK)) + 80005662: 8ba1 andi a5,a5,8 + 80005664: 12078063 beqz a5,80005784 + *R(VIRTIO_MMIO_QUEUE_SEL) = 0; + 80005668: 100017b7 lui a5,0x10001 + 8000566c: 0207a823 sw zero,48(a5) # 10001030 <_entry-0x6fffefd0> + if(*R(VIRTIO_MMIO_QUEUE_READY)) + 80005670: 100017b7 lui a5,0x10001 + 80005674: 04478793 addi a5,a5,68 # 10001044 <_entry-0x6fffefbc> + 80005678: 439c lw a5,0(a5) + 8000567a: 2781 sext.w a5,a5 + 8000567c: 10079a63 bnez a5,80005790 + uint32 max = *R(VIRTIO_MMIO_QUEUE_NUM_MAX); + 80005680: 100017b7 lui a5,0x10001 + 80005684: 03478793 addi a5,a5,52 # 10001034 <_entry-0x6fffefcc> + 80005688: 439c lw a5,0(a5) + 8000568a: 2781 sext.w a5,a5 + if(max == 0) + 8000568c: 10078863 beqz a5,8000579c + if(max < NUM) + 80005690: 471d li a4,7 + 80005692: 10f77b63 bgeu a4,a5,800057a8 + disk.desc = kalloc(); + 80005696: c68fb0ef jal 80000afe + 8000569a: 0001e497 auipc s1,0x1e + 8000569e: dce48493 addi s1,s1,-562 # 80023468 + 800056a2: e088 sd a0,0(s1) + disk.avail = kalloc(); + 800056a4: c5afb0ef jal 80000afe + 800056a8: e488 sd a0,8(s1) + disk.used = kalloc(); + 800056aa: c54fb0ef jal 80000afe + 800056ae: 87aa mv a5,a0 + 800056b0: e888 sd a0,16(s1) + if(!disk.desc || !disk.avail || !disk.used) + 800056b2: 6088 ld a0,0(s1) + 800056b4: 10050063 beqz a0,800057b4 + 800056b8: 0001e717 auipc a4,0x1e + 800056bc: db873703 ld a4,-584(a4) # 80023470 + 800056c0: 0e070a63 beqz a4,800057b4 + 800056c4: 0e078863 beqz a5,800057b4 + memset(disk.desc, 0, PGSIZE); + 800056c8: 6605 lui a2,0x1 + 800056ca: 4581 li a1,0 + 800056cc: dd6fb0ef jal 80000ca2 + memset(disk.avail, 0, PGSIZE); + 800056d0: 0001e497 auipc s1,0x1e + 800056d4: d9848493 addi s1,s1,-616 # 80023468 + 800056d8: 6605 lui a2,0x1 + 800056da: 4581 li a1,0 + 800056dc: 6488 ld a0,8(s1) + 800056de: dc4fb0ef jal 80000ca2 + memset(disk.used, 0, PGSIZE); + 800056e2: 6605 lui a2,0x1 + 800056e4: 4581 li a1,0 + 800056e6: 6888 ld a0,16(s1) + 800056e8: dbafb0ef jal 80000ca2 + *R(VIRTIO_MMIO_QUEUE_NUM) = NUM; + 800056ec: 100017b7 lui a5,0x10001 + 800056f0: 4721 li a4,8 + 800056f2: df98 sw a4,56(a5) + *R(VIRTIO_MMIO_QUEUE_DESC_LOW) = (uint64)disk.desc; + 800056f4: 4098 lw a4,0(s1) + 800056f6: 100017b7 lui a5,0x10001 + 800056fa: 08e7a023 sw a4,128(a5) # 10001080 <_entry-0x6fffef80> + *R(VIRTIO_MMIO_QUEUE_DESC_HIGH) = (uint64)disk.desc >> 32; + 800056fe: 40d8 lw a4,4(s1) + 80005700: 100017b7 lui a5,0x10001 + 80005704: 08e7a223 sw a4,132(a5) # 10001084 <_entry-0x6fffef7c> + *R(VIRTIO_MMIO_DRIVER_DESC_LOW) = (uint64)disk.avail; + 80005708: 649c ld a5,8(s1) + 8000570a: 0007869b sext.w a3,a5 + 8000570e: 10001737 lui a4,0x10001 + 80005712: 08d72823 sw a3,144(a4) # 10001090 <_entry-0x6fffef70> + *R(VIRTIO_MMIO_DRIVER_DESC_HIGH) = (uint64)disk.avail >> 32; + 80005716: 9781 srai a5,a5,0x20 + 80005718: 10001737 lui a4,0x10001 + 8000571c: 08f72a23 sw a5,148(a4) # 10001094 <_entry-0x6fffef6c> + *R(VIRTIO_MMIO_DEVICE_DESC_LOW) = (uint64)disk.used; + 80005720: 689c ld a5,16(s1) + 80005722: 0007869b sext.w a3,a5 + 80005726: 10001737 lui a4,0x10001 + 8000572a: 0ad72023 sw a3,160(a4) # 100010a0 <_entry-0x6fffef60> + *R(VIRTIO_MMIO_DEVICE_DESC_HIGH) = (uint64)disk.used >> 32; + 8000572e: 9781 srai a5,a5,0x20 + 80005730: 10001737 lui a4,0x10001 + 80005734: 0af72223 sw a5,164(a4) # 100010a4 <_entry-0x6fffef5c> + *R(VIRTIO_MMIO_QUEUE_READY) = 0x1; + 80005738: 10001737 lui a4,0x10001 + 8000573c: 4785 li a5,1 + 8000573e: c37c sw a5,68(a4) + disk.free[i] = 1; + 80005740: 00f48c23 sb a5,24(s1) + 80005744: 00f48ca3 sb a5,25(s1) + 80005748: 00f48d23 sb a5,26(s1) + 8000574c: 00f48da3 sb a5,27(s1) + 80005750: 00f48e23 sb a5,28(s1) + 80005754: 00f48ea3 sb a5,29(s1) + 80005758: 00f48f23 sb a5,30(s1) + 8000575c: 00f48fa3 sb a5,31(s1) + status |= VIRTIO_CONFIG_S_DRIVER_OK; + 80005760: 00496913 ori s2,s2,4 + *R(VIRTIO_MMIO_STATUS) = status; + 80005764: 100017b7 lui a5,0x10001 + 80005768: 0727a823 sw s2,112(a5) # 10001070 <_entry-0x6fffef90> +} + 8000576c: 60e2 ld ra,24(sp) + 8000576e: 6442 ld s0,16(sp) + 80005770: 64a2 ld s1,8(sp) + 80005772: 6902 ld s2,0(sp) + 80005774: 6105 addi sp,sp,32 + 80005776: 8082 ret + panic("could not find virtio disk"); + 80005778: 00002517 auipc a0,0x2 + 8000577c: ee850513 addi a0,a0,-280 # 80007660 + 80005780: 860fb0ef jal 800007e0 + panic("virtio disk FEATURES_OK unset"); + 80005784: 00002517 auipc a0,0x2 + 80005788: efc50513 addi a0,a0,-260 # 80007680 + 8000578c: 854fb0ef jal 800007e0 + panic("virtio disk should not be ready"); + 80005790: 00002517 auipc a0,0x2 + 80005794: f1050513 addi a0,a0,-240 # 800076a0 + 80005798: 848fb0ef jal 800007e0 + panic("virtio disk has no queue 0"); + 8000579c: 00002517 auipc a0,0x2 + 800057a0: f2450513 addi a0,a0,-220 # 800076c0 + 800057a4: 83cfb0ef jal 800007e0 + panic("virtio disk max queue too short"); + 800057a8: 00002517 auipc a0,0x2 + 800057ac: f3850513 addi a0,a0,-200 # 800076e0 + 800057b0: 830fb0ef jal 800007e0 + panic("virtio disk kalloc"); + 800057b4: 00002517 auipc a0,0x2 + 800057b8: f4c50513 addi a0,a0,-180 # 80007700 + 800057bc: 824fb0ef jal 800007e0 + +00000000800057c0 : + return 0; +} + +void +virtio_disk_rw(struct buf *b, int write) +{ + 800057c0: 7159 addi sp,sp,-112 + 800057c2: f486 sd ra,104(sp) + 800057c4: f0a2 sd s0,96(sp) + 800057c6: eca6 sd s1,88(sp) + 800057c8: e8ca sd s2,80(sp) + 800057ca: e4ce sd s3,72(sp) + 800057cc: e0d2 sd s4,64(sp) + 800057ce: fc56 sd s5,56(sp) + 800057d0: f85a sd s6,48(sp) + 800057d2: f45e sd s7,40(sp) + 800057d4: f062 sd s8,32(sp) + 800057d6: ec66 sd s9,24(sp) + 800057d8: 1880 addi s0,sp,112 + 800057da: 8a2a mv s4,a0 + 800057dc: 8bae mv s7,a1 + uint64 sector = b->blockno * (BSIZE / 512); + 800057de: 00c52c83 lw s9,12(a0) + 800057e2: 001c9c9b slliw s9,s9,0x1 + 800057e6: 1c82 slli s9,s9,0x20 + 800057e8: 020cdc93 srli s9,s9,0x20 + + acquire(&disk.vdisk_lock); + 800057ec: 0001e517 auipc a0,0x1e + 800057f0: da450513 addi a0,a0,-604 # 80023590 + 800057f4: bdafb0ef jal 80000bce + for(int i = 0; i < 3; i++){ + 800057f8: 4981 li s3,0 + for(int i = 0; i < NUM; i++){ + 800057fa: 44a1 li s1,8 + disk.free[i] = 0; + 800057fc: 0001eb17 auipc s6,0x1e + 80005800: c6cb0b13 addi s6,s6,-916 # 80023468 + for(int i = 0; i < 3; i++){ + 80005804: 4a8d li s5,3 + int idx[3]; + while(1){ + if(alloc3_desc(idx) == 0) { + break; + } + sleep(&disk.free[0], &disk.vdisk_lock); + 80005806: 0001ec17 auipc s8,0x1e + 8000580a: d8ac0c13 addi s8,s8,-630 # 80023590 + 8000580e: a8b9 j 8000586c + disk.free[i] = 0; + 80005810: 00fb0733 add a4,s6,a5 + 80005814: 00070c23 sb zero,24(a4) # 10001018 <_entry-0x6fffefe8> + idx[i] = alloc_desc(); + 80005818: c19c sw a5,0(a1) + if(idx[i] < 0){ + 8000581a: 0207c563 bltz a5,80005844 + for(int i = 0; i < 3; i++){ + 8000581e: 2905 addiw s2,s2,1 + 80005820: 0611 addi a2,a2,4 # 1004 <_entry-0x7fffeffc> + 80005822: 05590963 beq s2,s5,80005874 + idx[i] = alloc_desc(); + 80005826: 85b2 mv a1,a2 + for(int i = 0; i < NUM; i++){ + 80005828: 0001e717 auipc a4,0x1e + 8000582c: c4070713 addi a4,a4,-960 # 80023468 + 80005830: 87ce mv a5,s3 + if(disk.free[i]){ + 80005832: 01874683 lbu a3,24(a4) + 80005836: fee9 bnez a3,80005810 + for(int i = 0; i < NUM; i++){ + 80005838: 2785 addiw a5,a5,1 + 8000583a: 0705 addi a4,a4,1 + 8000583c: fe979be3 bne a5,s1,80005832 + idx[i] = alloc_desc(); + 80005840: 57fd li a5,-1 + 80005842: c19c sw a5,0(a1) + for(int j = 0; j < i; j++) + 80005844: 01205d63 blez s2,8000585e + free_desc(idx[j]); + 80005848: f9042503 lw a0,-112(s0) + 8000584c: d07ff0ef jal 80005552 + for(int j = 0; j < i; j++) + 80005850: 4785 li a5,1 + 80005852: 0127d663 bge a5,s2,8000585e + free_desc(idx[j]); + 80005856: f9442503 lw a0,-108(s0) + 8000585a: cf9ff0ef jal 80005552 + sleep(&disk.free[0], &disk.vdisk_lock); + 8000585e: 85e2 mv a1,s8 + 80005860: 0001e517 auipc a0,0x1e + 80005864: c2050513 addi a0,a0,-992 # 80023480 + 80005868: e70fc0ef jal 80001ed8 + for(int i = 0; i < 3; i++){ + 8000586c: f9040613 addi a2,s0,-112 + 80005870: 894e mv s2,s3 + 80005872: bf55 j 80005826 + } + + // format the three descriptors. + // qemu's virtio-blk.c reads them. + + struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; + 80005874: f9042503 lw a0,-112(s0) + 80005878: 00451693 slli a3,a0,0x4 + + if(write) + 8000587c: 0001e797 auipc a5,0x1e + 80005880: bec78793 addi a5,a5,-1044 # 80023468 + 80005884: 00a50713 addi a4,a0,10 + 80005888: 0712 slli a4,a4,0x4 + 8000588a: 973e add a4,a4,a5 + 8000588c: 01703633 snez a2,s7 + 80005890: c710 sw a2,8(a4) + buf0->type = VIRTIO_BLK_T_OUT; // write the disk + else + buf0->type = VIRTIO_BLK_T_IN; // read the disk + buf0->reserved = 0; + 80005892: 00072623 sw zero,12(a4) + buf0->sector = sector; + 80005896: 01973823 sd s9,16(a4) + + disk.desc[idx[0]].addr = (uint64) buf0; + 8000589a: 6398 ld a4,0(a5) + 8000589c: 9736 add a4,a4,a3 + struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; + 8000589e: 0a868613 addi a2,a3,168 + 800058a2: 963e add a2,a2,a5 + disk.desc[idx[0]].addr = (uint64) buf0; + 800058a4: e310 sd a2,0(a4) + disk.desc[idx[0]].len = sizeof(struct virtio_blk_req); + 800058a6: 6390 ld a2,0(a5) + 800058a8: 00d605b3 add a1,a2,a3 + 800058ac: 4741 li a4,16 + 800058ae: c598 sw a4,8(a1) + disk.desc[idx[0]].flags = VRING_DESC_F_NEXT; + 800058b0: 4805 li a6,1 + 800058b2: 01059623 sh a6,12(a1) + disk.desc[idx[0]].next = idx[1]; + 800058b6: f9442703 lw a4,-108(s0) + 800058ba: 00e59723 sh a4,14(a1) + + disk.desc[idx[1]].addr = (uint64) b->data; + 800058be: 0712 slli a4,a4,0x4 + 800058c0: 963a add a2,a2,a4 + 800058c2: 058a0593 addi a1,s4,88 + 800058c6: e20c sd a1,0(a2) + disk.desc[idx[1]].len = BSIZE; + 800058c8: 0007b883 ld a7,0(a5) + 800058cc: 9746 add a4,a4,a7 + 800058ce: 40000613 li a2,1024 + 800058d2: c710 sw a2,8(a4) + if(write) + 800058d4: 001bb613 seqz a2,s7 + 800058d8: 0016161b slliw a2,a2,0x1 + disk.desc[idx[1]].flags = 0; // device reads b->data + else + disk.desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data + disk.desc[idx[1]].flags |= VRING_DESC_F_NEXT; + 800058dc: 00166613 ori a2,a2,1 + 800058e0: 00c71623 sh a2,12(a4) + disk.desc[idx[1]].next = idx[2]; + 800058e4: f9842583 lw a1,-104(s0) + 800058e8: 00b71723 sh a1,14(a4) + + disk.info[idx[0]].status = 0xff; // device writes 0 on success + 800058ec: 00250613 addi a2,a0,2 + 800058f0: 0612 slli a2,a2,0x4 + 800058f2: 963e add a2,a2,a5 + 800058f4: 577d li a4,-1 + 800058f6: 00e60823 sb a4,16(a2) + disk.desc[idx[2]].addr = (uint64) &disk.info[idx[0]].status; + 800058fa: 0592 slli a1,a1,0x4 + 800058fc: 98ae add a7,a7,a1 + 800058fe: 03068713 addi a4,a3,48 + 80005902: 973e add a4,a4,a5 + 80005904: 00e8b023 sd a4,0(a7) + disk.desc[idx[2]].len = 1; + 80005908: 6398 ld a4,0(a5) + 8000590a: 972e add a4,a4,a1 + 8000590c: 01072423 sw a6,8(a4) + disk.desc[idx[2]].flags = VRING_DESC_F_WRITE; // device writes the status + 80005910: 4689 li a3,2 + 80005912: 00d71623 sh a3,12(a4) + disk.desc[idx[2]].next = 0; + 80005916: 00071723 sh zero,14(a4) + + // record struct buf for virtio_disk_intr(). + b->disk = 1; + 8000591a: 010a2223 sw a6,4(s4) + disk.info[idx[0]].b = b; + 8000591e: 01463423 sd s4,8(a2) + + // tell the device the first index in our chain of descriptors. + disk.avail->ring[disk.avail->idx % NUM] = idx[0]; + 80005922: 6794 ld a3,8(a5) + 80005924: 0026d703 lhu a4,2(a3) + 80005928: 8b1d andi a4,a4,7 + 8000592a: 0706 slli a4,a4,0x1 + 8000592c: 96ba add a3,a3,a4 + 8000592e: 00a69223 sh a0,4(a3) + + __sync_synchronize(); + 80005932: 0330000f fence rw,rw + + // tell the device another avail ring entry is available. + disk.avail->idx += 1; // not % NUM ... + 80005936: 6798 ld a4,8(a5) + 80005938: 00275783 lhu a5,2(a4) + 8000593c: 2785 addiw a5,a5,1 + 8000593e: 00f71123 sh a5,2(a4) + + __sync_synchronize(); + 80005942: 0330000f fence rw,rw + + *R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number + 80005946: 100017b7 lui a5,0x10001 + 8000594a: 0407a823 sw zero,80(a5) # 10001050 <_entry-0x6fffefb0> + + // Wait for virtio_disk_intr() to say request has finished. + while(b->disk == 1) { + 8000594e: 004a2783 lw a5,4(s4) + sleep(b, &disk.vdisk_lock); + 80005952: 0001e917 auipc s2,0x1e + 80005956: c3e90913 addi s2,s2,-962 # 80023590 + while(b->disk == 1) { + 8000595a: 4485 li s1,1 + 8000595c: 01079a63 bne a5,a6,80005970 + sleep(b, &disk.vdisk_lock); + 80005960: 85ca mv a1,s2 + 80005962: 8552 mv a0,s4 + 80005964: d74fc0ef jal 80001ed8 + while(b->disk == 1) { + 80005968: 004a2783 lw a5,4(s4) + 8000596c: fe978ae3 beq a5,s1,80005960 + } + + disk.info[idx[0]].b = 0; + 80005970: f9042903 lw s2,-112(s0) + 80005974: 00290713 addi a4,s2,2 + 80005978: 0712 slli a4,a4,0x4 + 8000597a: 0001e797 auipc a5,0x1e + 8000597e: aee78793 addi a5,a5,-1298 # 80023468 + 80005982: 97ba add a5,a5,a4 + 80005984: 0007b423 sd zero,8(a5) + int flag = disk.desc[i].flags; + 80005988: 0001e997 auipc s3,0x1e + 8000598c: ae098993 addi s3,s3,-1312 # 80023468 + 80005990: 00491713 slli a4,s2,0x4 + 80005994: 0009b783 ld a5,0(s3) + 80005998: 97ba add a5,a5,a4 + 8000599a: 00c7d483 lhu s1,12(a5) + int nxt = disk.desc[i].next; + 8000599e: 854a mv a0,s2 + 800059a0: 00e7d903 lhu s2,14(a5) + free_desc(i); + 800059a4: bafff0ef jal 80005552 + if(flag & VRING_DESC_F_NEXT) + 800059a8: 8885 andi s1,s1,1 + 800059aa: f0fd bnez s1,80005990 + free_chain(idx[0]); + + release(&disk.vdisk_lock); + 800059ac: 0001e517 auipc a0,0x1e + 800059b0: be450513 addi a0,a0,-1052 # 80023590 + 800059b4: ab2fb0ef jal 80000c66 +} + 800059b8: 70a6 ld ra,104(sp) + 800059ba: 7406 ld s0,96(sp) + 800059bc: 64e6 ld s1,88(sp) + 800059be: 6946 ld s2,80(sp) + 800059c0: 69a6 ld s3,72(sp) + 800059c2: 6a06 ld s4,64(sp) + 800059c4: 7ae2 ld s5,56(sp) + 800059c6: 7b42 ld s6,48(sp) + 800059c8: 7ba2 ld s7,40(sp) + 800059ca: 7c02 ld s8,32(sp) + 800059cc: 6ce2 ld s9,24(sp) + 800059ce: 6165 addi sp,sp,112 + 800059d0: 8082 ret + +00000000800059d2 : + +void +virtio_disk_intr() +{ + 800059d2: 1101 addi sp,sp,-32 + 800059d4: ec06 sd ra,24(sp) + 800059d6: e822 sd s0,16(sp) + 800059d8: e426 sd s1,8(sp) + 800059da: 1000 addi s0,sp,32 + acquire(&disk.vdisk_lock); + 800059dc: 0001e497 auipc s1,0x1e + 800059e0: a8c48493 addi s1,s1,-1396 # 80023468 + 800059e4: 0001e517 auipc a0,0x1e + 800059e8: bac50513 addi a0,a0,-1108 # 80023590 + 800059ec: 9e2fb0ef jal 80000bce + // we've seen this interrupt, which the following line does. + // this may race with the device writing new entries to + // the "used" ring, in which case we may process the new + // completion entries in this interrupt, and have nothing to do + // in the next interrupt, which is harmless. + *R(VIRTIO_MMIO_INTERRUPT_ACK) = *R(VIRTIO_MMIO_INTERRUPT_STATUS) & 0x3; + 800059f0: 100017b7 lui a5,0x10001 + 800059f4: 53b8 lw a4,96(a5) + 800059f6: 8b0d andi a4,a4,3 + 800059f8: 100017b7 lui a5,0x10001 + 800059fc: d3f8 sw a4,100(a5) + + __sync_synchronize(); + 800059fe: 0330000f fence rw,rw + + // the device increments disk.used->idx when it + // adds an entry to the used ring. + + while(disk.used_idx != disk.used->idx){ + 80005a02: 689c ld a5,16(s1) + 80005a04: 0204d703 lhu a4,32(s1) + 80005a08: 0027d783 lhu a5,2(a5) # 10001002 <_entry-0x6fffeffe> + 80005a0c: 04f70663 beq a4,a5,80005a58 + __sync_synchronize(); + 80005a10: 0330000f fence rw,rw + int id = disk.used->ring[disk.used_idx % NUM].id; + 80005a14: 6898 ld a4,16(s1) + 80005a16: 0204d783 lhu a5,32(s1) + 80005a1a: 8b9d andi a5,a5,7 + 80005a1c: 078e slli a5,a5,0x3 + 80005a1e: 97ba add a5,a5,a4 + 80005a20: 43dc lw a5,4(a5) + + if(disk.info[id].status != 0) + 80005a22: 00278713 addi a4,a5,2 + 80005a26: 0712 slli a4,a4,0x4 + 80005a28: 9726 add a4,a4,s1 + 80005a2a: 01074703 lbu a4,16(a4) + 80005a2e: e321 bnez a4,80005a6e + panic("virtio_disk_intr status"); + + struct buf *b = disk.info[id].b; + 80005a30: 0789 addi a5,a5,2 + 80005a32: 0792 slli a5,a5,0x4 + 80005a34: 97a6 add a5,a5,s1 + 80005a36: 6788 ld a0,8(a5) + b->disk = 0; // disk is done with buf + 80005a38: 00052223 sw zero,4(a0) + wakeup(b); + 80005a3c: ce8fc0ef jal 80001f24 + + disk.used_idx += 1; + 80005a40: 0204d783 lhu a5,32(s1) + 80005a44: 2785 addiw a5,a5,1 + 80005a46: 17c2 slli a5,a5,0x30 + 80005a48: 93c1 srli a5,a5,0x30 + 80005a4a: 02f49023 sh a5,32(s1) + while(disk.used_idx != disk.used->idx){ + 80005a4e: 6898 ld a4,16(s1) + 80005a50: 00275703 lhu a4,2(a4) + 80005a54: faf71ee3 bne a4,a5,80005a10 + } + + release(&disk.vdisk_lock); + 80005a58: 0001e517 auipc a0,0x1e + 80005a5c: b3850513 addi a0,a0,-1224 # 80023590 + 80005a60: a06fb0ef jal 80000c66 +} + 80005a64: 60e2 ld ra,24(sp) + 80005a66: 6442 ld s0,16(sp) + 80005a68: 64a2 ld s1,8(sp) + 80005a6a: 6105 addi sp,sp,32 + 80005a6c: 8082 ret + panic("virtio_disk_intr status"); + 80005a6e: 00002517 auipc a0,0x2 + 80005a72: caa50513 addi a0,a0,-854 # 80007718 + 80005a76: d6bfa0ef jal 800007e0 + ... + +0000000080006000 <_trampoline>: + 80006000: 14051073 csrw sscratch,a0 + 80006004: 02000537 lui a0,0x2000 + 80006008: 357d addiw a0,a0,-1 # 1ffffff <_entry-0x7e000001> + 8000600a: 0536 slli a0,a0,0xd + 8000600c: 02153423 sd ra,40(a0) + 80006010: 02253823 sd sp,48(a0) + 80006014: 02353c23 sd gp,56(a0) + 80006018: 04453023 sd tp,64(a0) + 8000601c: 04553423 sd t0,72(a0) + 80006020: 04653823 sd t1,80(a0) + 80006024: 04753c23 sd t2,88(a0) + 80006028: f120 sd s0,96(a0) + 8000602a: f524 sd s1,104(a0) + 8000602c: fd2c sd a1,120(a0) + 8000602e: e150 sd a2,128(a0) + 80006030: e554 sd a3,136(a0) + 80006032: e958 sd a4,144(a0) + 80006034: ed5c sd a5,152(a0) + 80006036: 0b053023 sd a6,160(a0) + 8000603a: 0b153423 sd a7,168(a0) + 8000603e: 0b253823 sd s2,176(a0) + 80006042: 0b353c23 sd s3,184(a0) + 80006046: 0d453023 sd s4,192(a0) + 8000604a: 0d553423 sd s5,200(a0) + 8000604e: 0d653823 sd s6,208(a0) + 80006052: 0d753c23 sd s7,216(a0) + 80006056: 0f853023 sd s8,224(a0) + 8000605a: 0f953423 sd s9,232(a0) + 8000605e: 0fa53823 sd s10,240(a0) + 80006062: 0fb53c23 sd s11,248(a0) + 80006066: 11c53023 sd t3,256(a0) + 8000606a: 11d53423 sd t4,264(a0) + 8000606e: 11e53823 sd t5,272(a0) + 80006072: 11f53c23 sd t6,280(a0) + 80006076: 140022f3 csrr t0,sscratch + 8000607a: 06553823 sd t0,112(a0) + 8000607e: 00853103 ld sp,8(a0) + 80006082: 02053203 ld tp,32(a0) + 80006086: 01053283 ld t0,16(a0) + 8000608a: 00053303 ld t1,0(a0) + 8000608e: 12000073 sfence.vma + 80006092: 18031073 csrw satp,t1 + 80006096: 12000073 sfence.vma + 8000609a: 9282 jalr t0 + +000000008000609c : + 8000609c: 12000073 sfence.vma + 800060a0: 18051073 csrw satp,a0 + 800060a4: 12000073 sfence.vma + 800060a8: 02000537 lui a0,0x2000 + 800060ac: 357d addiw a0,a0,-1 # 1ffffff <_entry-0x7e000001> + 800060ae: 0536 slli a0,a0,0xd + 800060b0: 02853083 ld ra,40(a0) + 800060b4: 03053103 ld sp,48(a0) + 800060b8: 03853183 ld gp,56(a0) + 800060bc: 04053203 ld tp,64(a0) + 800060c0: 04853283 ld t0,72(a0) + 800060c4: 05053303 ld t1,80(a0) + 800060c8: 05853383 ld t2,88(a0) + 800060cc: 7120 ld s0,96(a0) + 800060ce: 7524 ld s1,104(a0) + 800060d0: 7d2c ld a1,120(a0) + 800060d2: 6150 ld a2,128(a0) + 800060d4: 6554 ld a3,136(a0) + 800060d6: 6958 ld a4,144(a0) + 800060d8: 6d5c ld a5,152(a0) + 800060da: 0a053803 ld a6,160(a0) + 800060de: 0a853883 ld a7,168(a0) + 800060e2: 0b053903 ld s2,176(a0) + 800060e6: 0b853983 ld s3,184(a0) + 800060ea: 0c053a03 ld s4,192(a0) + 800060ee: 0c853a83 ld s5,200(a0) + 800060f2: 0d053b03 ld s6,208(a0) + 800060f6: 0d853b83 ld s7,216(a0) + 800060fa: 0e053c03 ld s8,224(a0) + 800060fe: 0e853c83 ld s9,232(a0) + 80006102: 0f053d03 ld s10,240(a0) + 80006106: 0f853d83 ld s11,248(a0) + 8000610a: 10053e03 ld t3,256(a0) + 8000610e: 10853e83 ld t4,264(a0) + 80006112: 11053f03 ld t5,272(a0) + 80006116: 11853f83 ld t6,280(a0) + 8000611a: 7928 ld a0,112(a0) + 8000611c: 10200073 sret + ... diff --git a/kernel/kernel.ld b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel.ld similarity index 100% rename from kernel/kernel.ld rename to G12_Project1_xv6CustomizeSystemCalls/kernel/kernel.ld diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel.sym b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel.sym new file mode 100644 index 0000000000..5b30ce5d94 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernel.sym @@ -0,0 +1,269 @@ +0000000080000000 .text +0000000080007000 .rodata +0000000080007858 .eh_frame +000000008000a238 .data +000000008000a250 .got +000000008000a260 .got.plt +000000008000a270 .bss +0000000000000000 .riscv.attributes +0000000000000000 .comment +0000000000000000 .debug_line +0000000000000000 .debug_line_str +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_aranges +0000000000000000 .debug_str +0000000000000000 .debug_loc +0000000000000000 .debug_ranges +0000000000000000 entry.o +000000008000001a spin +0000000000000000 start.c +0000000000000000 console.c +0000000000000000 printf.c +0000000080000468 printint +0000000080007730 digits +0000000080012348 pr +0000000000000000 uart.c +000000008000a27c tx_busy +000000008000a278 tx_chan +0000000080012360 tx_lock +0000000000000000 kalloc.c +0000000000000000 spinlock.c +0000000000000000 string.c +0000000000000000 main.c +000000008000a280 started +0000000000000000 vm.c +0000000000000000 proc.c +000000008000a240 first.1 +0000000080001a9e freeproc +0000000080001aee allocproc +0000000080007748 states.0 +0000000000000000 swtch.o +0000000000000000 trap.c +0000000000000000 syscall.c +00000000800026f2 argraw +0000000080007790 syscalls +0000000000000000 sysproc.c +0000000000000000 bio.c +0000000000000000 fs.c +0000000080002e1e bfree +0000000080002e8a balloc +0000000080002faa bmap +000000008000307e iget +000000008000393e namex +0000000000000000 log.c +0000000080003b3a write_head +0000000080003b98 install_trans +0000000000000000 sleeplock.c +0000000000000000 file.c +0000000000000000 pipe.c +0000000000000000 exec.c +0000000000000000 sysfile.c +0000000080004a62 argfd +0000000080004aba fdalloc +0000000080004af8 create +0000000000000000 kernelvec.o +0000000000000000 plic.c +0000000000000000 virtio_disk.c +0000000080005552 free_desc +0000000080023468 disk +000000008000a250 _GLOBAL_OFFSET_TABLE_ +0000000080002994 sys_pause +0000000080000fee mappages +0000000080001488 copyinstr +000000008000016e consoleread +0000000080000de0 safestrcpy +0000000080004d0e sys_close +0000000080001eac yield +0000000080022368 log +0000000080012378 kmem +0000000080000840 uartinit +0000000080002234 either_copyout +000000008000001c timerinit +00000000800127c8 proc +0000000080004208 fileread +00000000800004fa printf +0000000080002918 sys_sbrk +0000000080006000 trampoline +000000008000a270 panicked +000000008000550c plic_claim +00000000800054be plicinit +000000008000213a kwait +000000008000552c plic_complete +0000000080001df2 sched +0000000080000cfe memmove +0000000080002844 syscall +00000000800018a2 cpuid +000000008000377e writei +00000000800028e2 sys_fork +00000000800181e0 bcache +0000000080005162 sys_mkdir +00000000800011ba uvmunmap +000000008000388c namecmp +00000000800054d8 plicinithart +0000000080001f8e reparent +0000000080002a90 sys_getprocsinfo +0000000080002814 argstr +0000000080001244 uvmdealloc +00000000800040a2 filedup +0000000080003b08 namei +0000000080002ba0 binit +000000008000145e uvmclear +0000000080004c7e sys_read +00000000800046f0 kexec +00000000800035e6 fsinit +0000000080000d5a memcpy +000000008000109e kvmmap +0000000080000a1c kfree +00000000800018b2 mycpu +0000000080003474 iput +00000000800010c6 kvmmake +00000000800024e0 devintr +000000008000a244 nextpid +0000000080004020 fileinit +000000008000609c userret +0000000080000b4e initlock +00000000800015e2 copyout +0000000080001ed8 sleep +0000000080005460 kernelvec +000000008000351c ireclaim +0000000080003658 stati +00000000800123b0 wait_lock +0000000080002a34 sys_kill +00000000800044ba pipeclose +0000000080004d50 sys_fstat +00000000800000d0 consolewrite +0000000080003d46 end_op +0000000080000a82 freerange +0000000080000eee kvminithart +0000000080001288 uvmalloc +00000000800013c0 uvmcopy +000000008000a290 initproc +0000000080001a58 proc_freepagetable +0000000080001540 ismapped +00000000800033a0 iunlock +00000000800019d4 proc_pagetable +000000008000a2a0 stack0 +0000000080004d8a sys_link +0000000080004044 filealloc +0000000080001f24 wakeup +00000000800055c8 virtio_disk_init +00000000800018ce myproc +00000000800032bc idup +0000000080000f16 walk +000000008000500e sys_open +0000000080000898 uartwrite +0000000080003682 readi +00000000800002aa consoleintr +0000000080000278 consputc +0000000080001996 allocpid +0000000080003182 ialloc +0000000080001fe4 kexit +00000000800009b0 uartintr +00000000800016c6 copyin +00000000800023d6 trapinit +000000008000138e uvmfree +00000000800235a8 end +00000000800033e0 itrunc +00000000800042c6 filewrite +00000000800027dc argint +0000000080007000 etext +0000000080004cc6 sys_write +0000000080000c66 release +000000008000279c fetchstr +0000000080001d40 scheduler +0000000080006000 _trampoline +00000000800038a2 dirlookup +0000000080003cdc begin_op +00000000800040e8 fileclose +0000000080002554 usertrap +0000000080000d6e strncmp +00000000800181c8 tickslock +0000000080004512 pipewrite +0000000080000da4 strncpy +00000000800224b0 ftable +0000000080002b08 sys_sleep2 +00000000800059d2 virtio_disk_intr +0000000080004c32 sys_dup +00000000800007e0 panic +00000000800018fe forkret +0000000080000aca kinit +0000000080000cc4 memcmp +000000008000227e either_copyin +000000008000248c clockintr +00000000800123c8 cpus +0000000080003f9e releasesleep +0000000080000000 _entry +0000000080000b64 holding +00000000800208a0 sb +0000000080000bce acquire +0000000080003b22 nameiparent +00000000800023fa trapinithart +000000008000323e iupdate +0000000080000ca2 memset +0000000080000e3c main +00000000800020ec setkilled +0000000080002086 kkill +0000000080003e60 log_write +0000000080003f58 acquiresleep +0000000080004e88 sys_unlink +0000000080006000 uservec +0000000080001178 kvminit +0000000080002dea bunpin +00000000800027f8 argaddr +0000000080002412 prepare_return +0000000080002a56 sys_uptime +000000008000098a uartgetc +000000008000081c printfinit +0000000080001194 uvmcreate +0000000080001bd0 growproc +0000000080003fd6 holdingsleep +0000000080002110 killed +0000000080001b94 userinit +0000000080002c26 bread +00000000800045f6 piperead +000000008000a298 ticks +0000000080000424 consoleinit +0000000080000fb0 walkaddr +0000000080001560 vmfault +00000000800022c8 procdump +0000000080002d2e brelse +00000000800032f2 ilock +000000008000528a sys_exec +000000008000236c swtch +00000000800034fc iunlockput +0000000080000b8e push_off +00000000800046d6 flags2perm +0000000080000c12 pop_off +0000000080002cfc bwrite +0000000080001c32 kfork +000000008000092c uartputc_sync +000000008000a274 panicking +000000008000132e freewalk +00000000800028f6 sys_wait +00000000800028a8 sys_exit +0000000080003a6e dirlink +0000000080003f22 initsleeplock +0000000080000060 start +000000008000a288 kernel_pagetable +00000000800057c0 virtio_disk_rw +0000000080000e12 strlen +000000008000537e sys_pipe +000000008000312a iinit +0000000080003c5e initlog +00000000800122a0 cons +0000000080000afe kalloc +0000000080002752 fetchaddr +0000000080022410 devsw +00000000800028cc sys_getpid +00000000800043f2 pipealloc +0000000080002aec sys_getppid +000000008000520a sys_chdir +0000000080001754 proc_mapstacks +0000000080002662 kerneltrap +0000000080002db6 bpin +00000000800017ec procinit +00000000800208c0 itable +00000000800051aa sys_mknod +00000000800041aa filestat +0000000080012398 pid_lock diff --git a/kernel/kernelvec.S b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernelvec.S similarity index 100% rename from kernel/kernelvec.S rename to G12_Project1_xv6CustomizeSystemCalls/kernel/kernelvec.S diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/kernelvec.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernelvec.o new file mode 100644 index 0000000000..72f5222db1 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/kernelvec.o differ diff --git a/kernel/log.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/log.c similarity index 100% rename from kernel/log.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/log.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/log.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/log.d new file mode 100644 index 0000000000..38eddde698 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/log.d @@ -0,0 +1,3 @@ +kernel/log.o: kernel/log.c kernel/types.h kernel/riscv.h kernel/defs.h \ + kernel/param.h kernel/spinlock.h kernel/sleeplock.h kernel/fs.h \ + kernel/buf.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/log.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/log.o new file mode 100644 index 0000000000..dd9c107179 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/log.o differ diff --git a/kernel/main.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/main.c similarity index 100% rename from kernel/main.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/main.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/main.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/main.d new file mode 100644 index 0000000000..07e22ffd6b --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/main.d @@ -0,0 +1,2 @@ +kernel/main.o: kernel/main.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/defs.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/main.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/main.o new file mode 100644 index 0000000000..fb4e6a236b Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/main.o differ diff --git a/kernel/memlayout.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/memlayout.h similarity index 100% rename from kernel/memlayout.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/memlayout.h diff --git a/kernel/param.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/param.h similarity index 100% rename from kernel/param.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/param.h diff --git a/kernel/pipe.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/pipe.c similarity index 100% rename from kernel/pipe.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/pipe.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/pipe.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/pipe.d new file mode 100644 index 0000000000..80adcde1d6 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/pipe.d @@ -0,0 +1,3 @@ +kernel/pipe.o: kernel/pipe.c kernel/types.h kernel/riscv.h kernel/defs.h \ + kernel/param.h kernel/spinlock.h kernel/proc.h kernel/fs.h \ + kernel/sleeplock.h kernel/file.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/pipe.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/pipe.o new file mode 100644 index 0000000000..aaf9089c6c Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/pipe.o differ diff --git a/kernel/plic.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/plic.c similarity index 100% rename from kernel/plic.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/plic.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/plic.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/plic.d new file mode 100644 index 0000000000..6063823174 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/plic.d @@ -0,0 +1,2 @@ +kernel/plic.o: kernel/plic.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/defs.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/plic.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/plic.o new file mode 100644 index 0000000000..520dcecc9a Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/plic.o differ diff --git a/kernel/printf.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/printf.c similarity index 100% rename from kernel/printf.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/printf.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/printf.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/printf.d new file mode 100644 index 0000000000..4463314fce --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/printf.d @@ -0,0 +1,5 @@ +kernel/printf.o: kernel/printf.c \ + /usr/lib/gcc-cross/riscv64-linux-gnu/13/include/stdarg.h kernel/types.h \ + kernel/param.h kernel/spinlock.h kernel/sleeplock.h kernel/fs.h \ + kernel/file.h kernel/memlayout.h kernel/riscv.h kernel/defs.h \ + kernel/proc.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/printf.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/printf.o new file mode 100644 index 0000000000..0a17b66acf Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/printf.o differ diff --git a/kernel/proc.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/proc.c similarity index 100% rename from kernel/proc.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/proc.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/proc.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/proc.d new file mode 100644 index 0000000000..ee2200efcf --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/proc.d @@ -0,0 +1,3 @@ +kernel/proc.o: kernel/proc.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/defs.h diff --git a/kernel/proc.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/proc.h similarity index 100% rename from kernel/proc.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/proc.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/proc.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/proc.o new file mode 100644 index 0000000000..d8beb85fa5 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/proc.o differ diff --git a/kernel/riscv.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/riscv.h similarity index 100% rename from kernel/riscv.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/riscv.h diff --git a/kernel/sleeplock.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.c similarity index 100% rename from kernel/sleeplock.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.d new file mode 100644 index 0000000000..437cb5df5c --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.d @@ -0,0 +1,3 @@ +kernel/sleeplock.o: kernel/sleeplock.c kernel/types.h kernel/riscv.h \ + kernel/defs.h kernel/param.h kernel/memlayout.h kernel/spinlock.h \ + kernel/proc.h kernel/sleeplock.h diff --git a/kernel/sleeplock.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.h similarity index 100% rename from kernel/sleeplock.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.o new file mode 100644 index 0000000000..ba679b0378 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/sleeplock.o differ diff --git a/kernel/spinlock.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.c similarity index 100% rename from kernel/spinlock.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.d new file mode 100644 index 0000000000..65193d6bc6 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.d @@ -0,0 +1,3 @@ +kernel/spinlock.o: kernel/spinlock.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/spinlock.h kernel/riscv.h kernel/proc.h \ + kernel/defs.h diff --git a/kernel/spinlock.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.h similarity index 100% rename from kernel/spinlock.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.o new file mode 100644 index 0000000000..a9b8382a68 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/spinlock.o differ diff --git a/kernel/start.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/start.c similarity index 100% rename from kernel/start.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/start.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/start.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/start.d new file mode 100644 index 0000000000..203c529b61 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/start.d @@ -0,0 +1,2 @@ +kernel/start.o: kernel/start.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/defs.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/start.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/start.o new file mode 100644 index 0000000000..e301690d08 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/start.o differ diff --git a/kernel/stat.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/stat.h similarity index 100% rename from kernel/stat.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/stat.h diff --git a/kernel/string.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/string.c similarity index 100% rename from kernel/string.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/string.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/string.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/string.d new file mode 100644 index 0000000000..f119f610a7 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/string.d @@ -0,0 +1 @@ +kernel/string.o: kernel/string.c kernel/types.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/string.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/string.o new file mode 100644 index 0000000000..c7e511de13 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/string.o differ diff --git a/kernel/swtch.S b/G12_Project1_xv6CustomizeSystemCalls/kernel/swtch.S similarity index 100% rename from kernel/swtch.S rename to G12_Project1_xv6CustomizeSystemCalls/kernel/swtch.S diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/swtch.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/swtch.o new file mode 100644 index 0000000000..fd92baa095 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/swtch.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.c new file mode 100644 index 0000000000..2d22c904b4 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.c @@ -0,0 +1,152 @@ +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "riscv.h" +#include "spinlock.h" +#include "proc.h" +#include "syscall.h" +#include "defs.h" +extern uint64 sys_getprocsinfo(void); +extern uint64 sys_getppid(void); +extern uint64 sys_sleep2(void); +// Fetch the uint64 at addr from the current process. +int +fetchaddr(uint64 addr, uint64 *ip) +{ + struct proc *p = myproc(); + if(addr >= p->sz || addr+sizeof(uint64) > p->sz) // both tests needed, in case of overflow + return -1; + if(copyin(p->pagetable, (char *)ip, addr, sizeof(*ip)) != 0) + return -1; + return 0; +} + +// Fetch the nul-terminated string at addr from the current process. +// Returns length of string, not including nul, or -1 for error. +int +fetchstr(uint64 addr, char *buf, int max) +{ + struct proc *p = myproc(); + if(copyinstr(p->pagetable, buf, addr, max) < 0) + return -1; + return strlen(buf); +} + +static uint64 +argraw(int n) +{ + struct proc *p = myproc(); + switch (n) { + case 0: + return p->trapframe->a0; + case 1: + return p->trapframe->a1; + case 2: + return p->trapframe->a2; + case 3: + return p->trapframe->a3; + case 4: + return p->trapframe->a4; + case 5: + return p->trapframe->a5; + } + panic("argraw"); + return -1; +} + +// Fetch the nth 32-bit system call argument. +void +argint(int n, int *ip) +{ + *ip = argraw(n); +} + +// Retrieve an argument as a pointer. +// Doesn't check for legality, since +// copyin/copyout will do that. +void +argaddr(int n, uint64 *ip) +{ + *ip = argraw(n); +} + +// Fetch the nth word-sized system call argument as a null-terminated string. +// Copies into buf, at most max. +// Returns string length if OK (including nul), -1 if error. +int +argstr(int n, char *buf, int max) +{ + uint64 addr; + argaddr(n, &addr); + return fetchstr(addr, buf, max); +} + +// Prototypes for the functions that handle system calls. +extern uint64 sys_fork(void); +extern uint64 sys_exit(void); +extern uint64 sys_wait(void); +extern uint64 sys_pipe(void); +extern uint64 sys_read(void); +extern uint64 sys_kill(void); +extern uint64 sys_exec(void); +extern uint64 sys_fstat(void); +extern uint64 sys_chdir(void); +extern uint64 sys_dup(void); +extern uint64 sys_getpid(void); +extern uint64 sys_sbrk(void); +extern uint64 sys_pause(void); +extern uint64 sys_uptime(void); +extern uint64 sys_open(void); +extern uint64 sys_write(void); +extern uint64 sys_mknod(void); +extern uint64 sys_unlink(void); +extern uint64 sys_link(void); +extern uint64 sys_mkdir(void); +extern uint64 sys_close(void); + +// An array mapping syscall numbers from syscall.h +// to the function that handles the system call. +static uint64 (*syscalls[])(void) = { +[SYS_fork] sys_fork, +[SYS_exit] sys_exit, +[SYS_wait] sys_wait, +[SYS_pipe] sys_pipe, +[SYS_read] sys_read, +[SYS_kill] sys_kill, +[SYS_exec] sys_exec, +[SYS_fstat] sys_fstat, +[SYS_chdir] sys_chdir, +[SYS_dup] sys_dup, +[SYS_getpid] sys_getpid, +[SYS_sbrk] sys_sbrk, +[SYS_pause] sys_pause, +[SYS_uptime] sys_uptime, +[SYS_open] sys_open, +[SYS_write] sys_write, +[SYS_mknod] sys_mknod, +[SYS_unlink] sys_unlink, +[SYS_link] sys_link, +[SYS_mkdir] sys_mkdir, +[SYS_close] sys_close, +[SYS_getprocsinfo] sys_getprocsinfo, +[SYS_getppid] sys_getppid, +[SYS_sleep2] sys_sleep2, +}; + +void +syscall(void) +{ + int num; + struct proc *p = myproc(); + + num = p->trapframe->a7; + if(num > 0 && num < NELEM(syscalls) && syscalls[num]) { + // Use num to lookup the system call function for num, call it, + // and store its return value in p->trapframe->a0 + p->trapframe->a0 = syscalls[num](); + } else { + printf("%d %s: unknown sys call %d\n", + p->pid, p->name, num); + p->trapframe->a0 = -1; + } +} diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.d new file mode 100644 index 0000000000..9c762756c4 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.d @@ -0,0 +1,3 @@ +kernel/syscall.o: kernel/syscall.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/syscall.h kernel/defs.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.h new file mode 100644 index 0000000000..3f6fe58c5f --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.h @@ -0,0 +1,25 @@ +// System call numbers +#define SYS_fork 1 +#define SYS_exit 2 +#define SYS_wait 3 +#define SYS_pipe 4 +#define SYS_read 5 +#define SYS_kill 6 +#define SYS_exec 7 +#define SYS_fstat 8 +#define SYS_chdir 9 +#define SYS_dup 10 +#define SYS_getpid 11 +#define SYS_sbrk 12 +#define SYS_pause 13 +#define SYS_uptime 14 +#define SYS_open 15 +#define SYS_write 16 +#define SYS_mknod 17 +#define SYS_unlink 18 +#define SYS_link 19 +#define SYS_mkdir 20 +#define SYS_close 21 +#define SYS_getprocsinfo 22 +#define SYS_getppid 23 +#define SYS_sleep2 24 diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.o new file mode 100644 index 0000000000..1fbe399541 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/syscall.o differ diff --git a/kernel/sysfile.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysfile.c similarity index 100% rename from kernel/sysfile.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/sysfile.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/sysfile.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysfile.d new file mode 100644 index 0000000000..382ec062ec --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysfile.d @@ -0,0 +1,4 @@ +kernel/sysfile.o: kernel/sysfile.c kernel/types.h kernel/riscv.h \ + kernel/defs.h kernel/param.h kernel/stat.h kernel/spinlock.h \ + kernel/proc.h kernel/fs.h kernel/sleeplock.h kernel/file.h \ + kernel/fcntl.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/sysfile.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysfile.o new file mode 100644 index 0000000000..95ed364680 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysfile.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/sysproc.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysproc.c new file mode 100644 index 0000000000..b1e702925f --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysproc.c @@ -0,0 +1,156 @@ +#include "types.h" +#include "riscv.h" +#include "defs.h" +#include "param.h" +#include "memlayout.h" +#include "spinlock.h" +#include "proc.h" +#include "vm.h" +uint64 +sys_exit(void) +{ + int n; + argint(0, &n); + kexit(n); + return 0; // not reached +} + +uint64 +sys_getpid(void) +{ + return myproc()->pid; +} + +uint64 +sys_fork(void) +{ + return kfork(); +} + +uint64 +sys_wait(void) +{ + uint64 p; + argaddr(0, &p); + return kwait(p); +} + +uint64 +sys_sbrk(void) +{ + uint64 addr; + int t; + int n; + + argint(0, &n); + argint(1, &t); + addr = myproc()->sz; + + if(t == SBRK_EAGER || n < 0) { + if(growproc(n) < 0) { + return -1; + } + } else { + // Lazily allocate memory for this process: increase its memory + // size but don't allocate memory. If the processes uses the + // memory, vmfault() will allocate it. + if(addr + n < addr) + return -1; + if(addr + n > TRAPFRAME) + return -1; + myproc()->sz += n; + } + return addr; +} + +uint64 +sys_pause(void) +{ + int n; + uint ticks0; + + argint(0, &n); + if(n < 0) + n = 0; + acquire(&tickslock); + ticks0 = ticks; + while(ticks - ticks0 < n){ + if(killed(myproc())){ + release(&tickslock); + return -1; + } + sleep(&ticks, &tickslock); + } + release(&tickslock); + return 0; +} + +uint64 +sys_kill(void) +{ + int pid; + + argint(0, &pid); + return kkill(pid); +} + +// return how many clock tick interrupts have occurred +// since start. +uint64 +sys_uptime(void) +{ + uint xticks; + + acquire(&tickslock); + xticks = ticks; + release(&tickslock); + return xticks; +} + +extern struct proc proc[NPROC]; + +uint64 +sys_getprocsinfo(void) +{ + struct proc *p; + + printf("PID\tSTATE\tSIZE\n"); + + for(p = proc; p < &proc[NPROC]; p++){ + if(p->state != UNUSED){ + printf("%d\t%d\t%ld\n", p->pid, p->state, p->sz); + } + } + + return 0; +} +uint64 +sys_getppid(void) +{ + struct proc *p = myproc(); + if(p->parent) + return p->parent->pid; + return -1; +} +uint64 +sys_sleep2(void) +{ + int n; + argint(0, &n); + + struct proc *p = myproc(); + + acquire(&tickslock); + uint ticks0 = ticks; + + while(ticks - ticks0 < n){ + if(p->killed){ + release(&tickslock); + return -1; + } + sleep(&ticks, &tickslock); + } + + release(&tickslock); + return 0; +} diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/sysproc.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysproc.d new file mode 100644 index 0000000000..6dedac4c87 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysproc.d @@ -0,0 +1,3 @@ +kernel/sysproc.o: kernel/sysproc.c kernel/types.h kernel/riscv.h \ + kernel/defs.h kernel/param.h kernel/memlayout.h kernel/spinlock.h \ + kernel/proc.h kernel/vm.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/sysproc.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysproc.o new file mode 100644 index 0000000000..40aaa7a60f Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/sysproc.o differ diff --git a/kernel/trampoline.S b/G12_Project1_xv6CustomizeSystemCalls/kernel/trampoline.S similarity index 100% rename from kernel/trampoline.S rename to G12_Project1_xv6CustomizeSystemCalls/kernel/trampoline.S diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/trampoline.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/trampoline.o new file mode 100644 index 0000000000..cb4652542f Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/trampoline.o differ diff --git a/kernel/trap.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/trap.c similarity index 100% rename from kernel/trap.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/trap.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/trap.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/trap.d new file mode 100644 index 0000000000..068f358680 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/trap.d @@ -0,0 +1,3 @@ +kernel/trap.o: kernel/trap.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/defs.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/trap.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/trap.o new file mode 100644 index 0000000000..4c53a2564c Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/trap.o differ diff --git a/kernel/types.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/types.h similarity index 100% rename from kernel/types.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/types.h diff --git a/kernel/uart.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/uart.c similarity index 100% rename from kernel/uart.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/uart.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/uart.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/uart.d new file mode 100644 index 0000000000..da94ef2e0d --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/uart.d @@ -0,0 +1,3 @@ +kernel/uart.o: kernel/uart.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/defs.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/uart.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/uart.o new file mode 100644 index 0000000000..a77fb7353b Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/uart.o differ diff --git a/kernel/virtio.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/virtio.h similarity index 100% rename from kernel/virtio.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/virtio.h diff --git a/kernel/virtio_disk.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/virtio_disk.c similarity index 100% rename from kernel/virtio_disk.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/virtio_disk.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/virtio_disk.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/virtio_disk.d new file mode 100644 index 0000000000..1ed6176dfa --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/virtio_disk.d @@ -0,0 +1,3 @@ +kernel/virtio_disk.o: kernel/virtio_disk.c kernel/types.h kernel/riscv.h \ + kernel/defs.h kernel/param.h kernel/memlayout.h kernel/spinlock.h \ + kernel/sleeplock.h kernel/fs.h kernel/buf.h kernel/virtio.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/virtio_disk.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/virtio_disk.o new file mode 100644 index 0000000000..a82e060715 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/virtio_disk.o differ diff --git a/kernel/vm.c b/G12_Project1_xv6CustomizeSystemCalls/kernel/vm.c similarity index 100% rename from kernel/vm.c rename to G12_Project1_xv6CustomizeSystemCalls/kernel/vm.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/vm.d b/G12_Project1_xv6CustomizeSystemCalls/kernel/vm.d new file mode 100644 index 0000000000..4b73decb4c --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/kernel/vm.d @@ -0,0 +1,3 @@ +kernel/vm.o: kernel/vm.c kernel/param.h kernel/types.h kernel/memlayout.h \ + kernel/elf.h kernel/riscv.h kernel/defs.h kernel/spinlock.h \ + kernel/proc.h kernel/fs.h diff --git a/kernel/vm.h b/G12_Project1_xv6CustomizeSystemCalls/kernel/vm.h similarity index 100% rename from kernel/vm.h rename to G12_Project1_xv6CustomizeSystemCalls/kernel/vm.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/kernel/vm.o b/G12_Project1_xv6CustomizeSystemCalls/kernel/vm.o new file mode 100644 index 0000000000..5b0fcbdc69 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/kernel/vm.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/mkfs/mkfs b/G12_Project1_xv6CustomizeSystemCalls/mkfs/mkfs new file mode 100755 index 0000000000..86ca58cd2b Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/mkfs/mkfs differ diff --git a/mkfs/mkfs.c b/G12_Project1_xv6CustomizeSystemCalls/mkfs/mkfs.c similarity index 100% rename from mkfs/mkfs.c rename to G12_Project1_xv6CustomizeSystemCalls/mkfs/mkfs.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/python3 b/G12_Project1_xv6CustomizeSystemCalls/python3 new file mode 100644 index 0000000000..b6641c5473 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/python3 @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +import subprocess +import time +import os + +# Start xv6 +proc = subprocess.Popen( + ["make", "qemu"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT +) + +def send(cmd): + proc.stdin.write((cmd + "\n").encode()) + proc.stdin.flush() + +def read_output(seconds=2): + time.sleep(seconds) + try: + output = os.read(proc.stdout.fileno(), 4096).decode() + print(output) + except: + pass + +# wait for xv6 to boot +time.sleep(2) + +print("Running getppid...") +send("test_getppid") +read_output() + +print("Running sleep2...") +send("test_sleep2") +read_output(3) + +print("Running procs...") +send("test_procs") +read_output() + +# stop xv6 +proc.terminate() diff --git a/G12_Project1_xv6CustomizeSystemCalls/syscalls.pdf b/G12_Project1_xv6CustomizeSystemCalls/syscalls.pdf new file mode 100755 index 0000000000..653b50a691 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/syscalls.pdf differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/test-xv6.py b/G12_Project1_xv6CustomizeSystemCalls/test-xv6.py new file mode 100755 index 0000000000..6733860431 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/test-xv6.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 + +# +# python script that tests xv6 without having to boot it and type to its shell +# +# ./test-xv6.py usertests (runs usertests) +# ./test-xv6.py -q usertests (runs the quick tests of usertests) +#!/usr/bin/env python3 + +import subprocess +import time +import os + +# Start xv6 +proc = subprocess.Popen( + ["make", "qemu"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT +) + +def send(cmd): + proc.stdin.write((cmd + "\n").encode()) + proc.stdin.flush() + +def read_output(seconds=2): + time.sleep(seconds) + try: + output = os.read(proc.stdout.fileno(), 4096).decode() + print(output) + except: + pass + +# wait for xv6 to boot +time.sleep(2) + +print("Running getppid...") +send("test_getppid") +read_output() + +print("Running sleep2...") +send("test_sleep2") +read_output(3) + +print("Running procs...") +send("test_procs") +read_output() + +# stop xv6 +proc.terminate() diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_cat b/G12_Project1_xv6CustomizeSystemCalls/user/_cat new file mode 100755 index 0000000000..81b0d10df7 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_cat differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_dorphan b/G12_Project1_xv6CustomizeSystemCalls/user/_dorphan new file mode 100755 index 0000000000..02d45309b7 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_dorphan differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_echo b/G12_Project1_xv6CustomizeSystemCalls/user/_echo new file mode 100755 index 0000000000..47109e91b2 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_echo differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_forktest b/G12_Project1_xv6CustomizeSystemCalls/user/_forktest new file mode 100755 index 0000000000..8e4dd84e59 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_forktest differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_forphan b/G12_Project1_xv6CustomizeSystemCalls/user/_forphan new file mode 100755 index 0000000000..13a3d061e3 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_forphan differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_grep b/G12_Project1_xv6CustomizeSystemCalls/user/_grep new file mode 100755 index 0000000000..4054a63c5f Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_grep differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_grind b/G12_Project1_xv6CustomizeSystemCalls/user/_grind new file mode 100755 index 0000000000..6400503012 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_grind differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_init b/G12_Project1_xv6CustomizeSystemCalls/user/_init new file mode 100755 index 0000000000..07d0a3aa32 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_init differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_kill b/G12_Project1_xv6CustomizeSystemCalls/user/_kill new file mode 100755 index 0000000000..4785d53c9c Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_kill differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_ln b/G12_Project1_xv6CustomizeSystemCalls/user/_ln new file mode 100755 index 0000000000..c00414aacc Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_ln differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_logstress b/G12_Project1_xv6CustomizeSystemCalls/user/_logstress new file mode 100755 index 0000000000..f74d9eeb7c Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_logstress differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_ls b/G12_Project1_xv6CustomizeSystemCalls/user/_ls new file mode 100755 index 0000000000..653b546d90 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_ls differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_mkdir b/G12_Project1_xv6CustomizeSystemCalls/user/_mkdir new file mode 100755 index 0000000000..867b4c91ea Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_mkdir differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_rm b/G12_Project1_xv6CustomizeSystemCalls/user/_rm new file mode 100755 index 0000000000..862692f4a6 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_rm differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_sh b/G12_Project1_xv6CustomizeSystemCalls/user/_sh new file mode 100755 index 0000000000..945052d136 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_sh differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_stressfs b/G12_Project1_xv6CustomizeSystemCalls/user/_stressfs new file mode 100755 index 0000000000..03070224d6 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_stressfs differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_test_getppid b/G12_Project1_xv6CustomizeSystemCalls/user/_test_getppid new file mode 100755 index 0000000000..0257405acb Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_test_getppid differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_test_procs b/G12_Project1_xv6CustomizeSystemCalls/user/_test_procs new file mode 100755 index 0000000000..8bf590b083 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_test_procs differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_test_sleep2 b/G12_Project1_xv6CustomizeSystemCalls/user/_test_sleep2 new file mode 100755 index 0000000000..5791594597 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_test_sleep2 differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_usertests b/G12_Project1_xv6CustomizeSystemCalls/user/_usertests new file mode 100755 index 0000000000..bf3201a56d Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_usertests differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_wc b/G12_Project1_xv6CustomizeSystemCalls/user/_wc new file mode 100755 index 0000000000..eca151322b Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_wc differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/_zombie b/G12_Project1_xv6CustomizeSystemCalls/user/_zombie new file mode 100755 index 0000000000..97f78f6f78 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/_zombie differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/cat.asm b/G12_Project1_xv6CustomizeSystemCalls/user/cat.asm new file mode 100644 index 0000000000..a8311e0016 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/cat.asm @@ -0,0 +1,1610 @@ + +user/_cat: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + +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: 00090913 mv s2,s2 + 18: 20000613 li a2,512 + 1c: 85ca mv a1,s2 + 1e: 854e mv a0,s3 + 20: 376000ef jal 396 + 24: 84aa mv s1,a0 + 26: 02a05363 blez a0,4c + if (write(1, buf, n) != n) { + 2a: 8626 mv a2,s1 + 2c: 85ca mv a1,s2 + 2e: 4505 li a0,1 + 30: 36e000ef jal 39e + 34: fe9502e3 beq a0,s1,18 + fprintf(2, "cat: write error\n"); + 38: 00001597 auipc a1,0x1 + 3c: 93858593 addi a1,a1,-1736 # 970 + 40: 4509 li a0,2 + 42: 752000ef jal 794 + exit(1); + 46: 4505 li a0,1 + 48: 336000ef jal 37e + } + } + if(n < 0){ + 4c: 00054963 bltz a0,5e + fprintf(2, "cat: read error\n"); + exit(1); + } +} + 50: 70a2 ld ra,40(sp) + 52: 7402 ld s0,32(sp) + 54: 64e2 ld s1,24(sp) + 56: 6942 ld s2,16(sp) + 58: 69a2 ld s3,8(sp) + 5a: 6145 addi sp,sp,48 + 5c: 8082 ret + fprintf(2, "cat: read error\n"); + 5e: 00001597 auipc a1,0x1 + 62: 92a58593 addi a1,a1,-1750 # 988 + 66: 4509 li a0,2 + 68: 72c000ef jal 794 + exit(1); + 6c: 4505 li a0,1 + 6e: 310000ef jal 37e + +0000000000000072
: + +int +main(int argc, char *argv[]) +{ + 72: 7179 addi sp,sp,-48 + 74: f406 sd ra,40(sp) + 76: f022 sd s0,32(sp) + 78: 1800 addi s0,sp,48 + int fd, i; + + if(argc <= 1){ + 7a: 4785 li a5,1 + 7c: 04a7d263 bge a5,a0,c0 + 80: ec26 sd s1,24(sp) + 82: e84a sd s2,16(sp) + 84: e44e sd s3,8(sp) + 86: 00858913 addi s2,a1,8 + 8a: ffe5099b addiw s3,a0,-2 + 8e: 02099793 slli a5,s3,0x20 + 92: 01d7d993 srli s3,a5,0x1d + 96: 05c1 addi a1,a1,16 + 98: 99ae add s3,s3,a1 + cat(0); + exit(0); + } + + for(i = 1; i < argc; i++){ + if((fd = open(argv[i], O_RDONLY)) < 0){ + 9a: 4581 li a1,0 + 9c: 00093503 ld a0,0(s2) # 1010 + a0: 31e000ef jal 3be + a4: 84aa mv s1,a0 + a6: 02054663 bltz a0,d2 + fprintf(2, "cat: cannot open %s\n", argv[i]); + exit(1); + } + cat(fd); + aa: f57ff0ef jal 0 + close(fd); + ae: 8526 mv a0,s1 + b0: 2f6000ef jal 3a6 + for(i = 1; i < argc; i++){ + b4: 0921 addi s2,s2,8 + b6: ff3912e3 bne s2,s3,9a + } + exit(0); + ba: 4501 li a0,0 + bc: 2c2000ef jal 37e + c0: ec26 sd s1,24(sp) + c2: e84a sd s2,16(sp) + c4: e44e sd s3,8(sp) + cat(0); + c6: 4501 li a0,0 + c8: f39ff0ef jal 0 + exit(0); + cc: 4501 li a0,0 + ce: 2b0000ef jal 37e + fprintf(2, "cat: cannot open %s\n", argv[i]); + d2: 00093603 ld a2,0(s2) + d6: 00001597 auipc a1,0x1 + da: 8ca58593 addi a1,a1,-1846 # 9a0 + de: 4509 li a0,2 + e0: 6b4000ef jal 794 + exit(1); + e4: 4505 li a0,1 + e6: 298000ef jal 37e + +00000000000000ea : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + ea: 1141 addi sp,sp,-16 + ec: e406 sd ra,8(sp) + ee: e022 sd s0,0(sp) + f0: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + f2: f81ff0ef jal 72
+ exit(r); + f6: 288000ef jal 37e + +00000000000000fa : +} + +char* +strcpy(char *s, const char *t) +{ + fa: 1141 addi sp,sp,-16 + fc: e422 sd s0,8(sp) + fe: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 100: 87aa mv a5,a0 + 102: 0585 addi a1,a1,1 + 104: 0785 addi a5,a5,1 + 106: fff5c703 lbu a4,-1(a1) + 10a: fee78fa3 sb a4,-1(a5) + 10e: fb75 bnez a4,102 + ; + return os; +} + 110: 6422 ld s0,8(sp) + 112: 0141 addi sp,sp,16 + 114: 8082 ret + +0000000000000116 : + +int +strcmp(const char *p, const char *q) +{ + 116: 1141 addi sp,sp,-16 + 118: e422 sd s0,8(sp) + 11a: 0800 addi s0,sp,16 + while(*p && *p == *q) + 11c: 00054783 lbu a5,0(a0) + 120: cb91 beqz a5,134 + 122: 0005c703 lbu a4,0(a1) + 126: 00f71763 bne a4,a5,134 + p++, q++; + 12a: 0505 addi a0,a0,1 + 12c: 0585 addi a1,a1,1 + while(*p && *p == *q) + 12e: 00054783 lbu a5,0(a0) + 132: fbe5 bnez a5,122 + return (uchar)*p - (uchar)*q; + 134: 0005c503 lbu a0,0(a1) +} + 138: 40a7853b subw a0,a5,a0 + 13c: 6422 ld s0,8(sp) + 13e: 0141 addi sp,sp,16 + 140: 8082 ret + +0000000000000142 : + +uint +strlen(const char *s) +{ + 142: 1141 addi sp,sp,-16 + 144: e422 sd s0,8(sp) + 146: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 148: 00054783 lbu a5,0(a0) + 14c: cf91 beqz a5,168 + 14e: 0505 addi a0,a0,1 + 150: 87aa mv a5,a0 + 152: 86be mv a3,a5 + 154: 0785 addi a5,a5,1 + 156: fff7c703 lbu a4,-1(a5) + 15a: ff65 bnez a4,152 + 15c: 40a6853b subw a0,a3,a0 + 160: 2505 addiw a0,a0,1 + ; + return n; +} + 162: 6422 ld s0,8(sp) + 164: 0141 addi sp,sp,16 + 166: 8082 ret + for(n = 0; s[n]; n++) + 168: 4501 li a0,0 + 16a: bfe5 j 162 + +000000000000016c : + +void* +memset(void *dst, int c, uint n) +{ + 16c: 1141 addi sp,sp,-16 + 16e: e422 sd s0,8(sp) + 170: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 172: ca19 beqz a2,188 + 174: 87aa mv a5,a0 + 176: 1602 slli a2,a2,0x20 + 178: 9201 srli a2,a2,0x20 + 17a: 00a60733 add a4,a2,a0 + cdst[i] = c; + 17e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 182: 0785 addi a5,a5,1 + 184: fee79de3 bne a5,a4,17e + } + return dst; +} + 188: 6422 ld s0,8(sp) + 18a: 0141 addi sp,sp,16 + 18c: 8082 ret + +000000000000018e : + +char* +strchr(const char *s, char c) +{ + 18e: 1141 addi sp,sp,-16 + 190: e422 sd s0,8(sp) + 192: 0800 addi s0,sp,16 + for(; *s; s++) + 194: 00054783 lbu a5,0(a0) + 198: cb99 beqz a5,1ae + if(*s == c) + 19a: 00f58763 beq a1,a5,1a8 + for(; *s; s++) + 19e: 0505 addi a0,a0,1 + 1a0: 00054783 lbu a5,0(a0) + 1a4: fbfd bnez a5,19a + return (char*)s; + return 0; + 1a6: 4501 li a0,0 +} + 1a8: 6422 ld s0,8(sp) + 1aa: 0141 addi sp,sp,16 + 1ac: 8082 ret + return 0; + 1ae: 4501 li a0,0 + 1b0: bfe5 j 1a8 + +00000000000001b2 : + +char* +gets(char *buf, int max) +{ + 1b2: 711d addi sp,sp,-96 + 1b4: ec86 sd ra,88(sp) + 1b6: e8a2 sd s0,80(sp) + 1b8: e4a6 sd s1,72(sp) + 1ba: e0ca sd s2,64(sp) + 1bc: fc4e sd s3,56(sp) + 1be: f852 sd s4,48(sp) + 1c0: f456 sd s5,40(sp) + 1c2: f05a sd s6,32(sp) + 1c4: ec5e sd s7,24(sp) + 1c6: 1080 addi s0,sp,96 + 1c8: 8baa mv s7,a0 + 1ca: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1cc: 892a mv s2,a0 + 1ce: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1d0: 4aa9 li s5,10 + 1d2: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1d4: 89a6 mv s3,s1 + 1d6: 2485 addiw s1,s1,1 + 1d8: 0344d663 bge s1,s4,204 + cc = read(0, &c, 1); + 1dc: 4605 li a2,1 + 1de: faf40593 addi a1,s0,-81 + 1e2: 4501 li a0,0 + 1e4: 1b2000ef jal 396 + if(cc < 1) + 1e8: 00a05e63 blez a0,204 + buf[i++] = c; + 1ec: faf44783 lbu a5,-81(s0) + 1f0: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1f4: 01578763 beq a5,s5,202 + 1f8: 0905 addi s2,s2,1 + 1fa: fd679de3 bne a5,s6,1d4 + buf[i++] = c; + 1fe: 89a6 mv s3,s1 + 200: a011 j 204 + 202: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 204: 99de add s3,s3,s7 + 206: 00098023 sb zero,0(s3) + return buf; +} + 20a: 855e mv a0,s7 + 20c: 60e6 ld ra,88(sp) + 20e: 6446 ld s0,80(sp) + 210: 64a6 ld s1,72(sp) + 212: 6906 ld s2,64(sp) + 214: 79e2 ld s3,56(sp) + 216: 7a42 ld s4,48(sp) + 218: 7aa2 ld s5,40(sp) + 21a: 7b02 ld s6,32(sp) + 21c: 6be2 ld s7,24(sp) + 21e: 6125 addi sp,sp,96 + 220: 8082 ret + +0000000000000222 : + +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: e04a sd s2,0(sp) + 22a: 1000 addi s0,sp,32 + 22c: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 22e: 4581 li a1,0 + 230: 18e000ef jal 3be + if(fd < 0) + 234: 02054263 bltz a0,258 + 238: e426 sd s1,8(sp) + 23a: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 23c: 85ca mv a1,s2 + 23e: 198000ef jal 3d6 + 242: 892a mv s2,a0 + close(fd); + 244: 8526 mv a0,s1 + 246: 160000ef jal 3a6 + return r; + 24a: 64a2 ld s1,8(sp) +} + 24c: 854a mv a0,s2 + 24e: 60e2 ld ra,24(sp) + 250: 6442 ld s0,16(sp) + 252: 6902 ld s2,0(sp) + 254: 6105 addi sp,sp,32 + 256: 8082 ret + return -1; + 258: 597d li s2,-1 + 25a: bfcd j 24c + +000000000000025c : + +int +atoi(const char *s) +{ + 25c: 1141 addi sp,sp,-16 + 25e: e422 sd s0,8(sp) + 260: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 262: 00054683 lbu a3,0(a0) + 266: fd06879b addiw a5,a3,-48 + 26a: 0ff7f793 zext.b a5,a5 + 26e: 4625 li a2,9 + 270: 02f66863 bltu a2,a5,2a0 + 274: 872a mv a4,a0 + n = 0; + 276: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 278: 0705 addi a4,a4,1 + 27a: 0025179b slliw a5,a0,0x2 + 27e: 9fa9 addw a5,a5,a0 + 280: 0017979b slliw a5,a5,0x1 + 284: 9fb5 addw a5,a5,a3 + 286: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 28a: 00074683 lbu a3,0(a4) + 28e: fd06879b addiw a5,a3,-48 + 292: 0ff7f793 zext.b a5,a5 + 296: fef671e3 bgeu a2,a5,278 + return n; +} + 29a: 6422 ld s0,8(sp) + 29c: 0141 addi sp,sp,16 + 29e: 8082 ret + n = 0; + 2a0: 4501 li a0,0 + 2a2: bfe5 j 29a + +00000000000002a4 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 2a4: 1141 addi sp,sp,-16 + 2a6: e422 sd s0,8(sp) + 2a8: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 2aa: 02b57463 bgeu a0,a1,2d2 + while(n-- > 0) + 2ae: 00c05f63 blez a2,2cc + 2b2: 1602 slli a2,a2,0x20 + 2b4: 9201 srli a2,a2,0x20 + 2b6: 00c507b3 add a5,a0,a2 + dst = vdst; + 2ba: 872a mv a4,a0 + *dst++ = *src++; + 2bc: 0585 addi a1,a1,1 + 2be: 0705 addi a4,a4,1 + 2c0: fff5c683 lbu a3,-1(a1) + 2c4: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2c8: fef71ae3 bne a4,a5,2bc + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2cc: 6422 ld s0,8(sp) + 2ce: 0141 addi sp,sp,16 + 2d0: 8082 ret + dst += n; + 2d2: 00c50733 add a4,a0,a2 + src += n; + 2d6: 95b2 add a1,a1,a2 + while(n-- > 0) + 2d8: fec05ae3 blez a2,2cc + 2dc: fff6079b addiw a5,a2,-1 + 2e0: 1782 slli a5,a5,0x20 + 2e2: 9381 srli a5,a5,0x20 + 2e4: fff7c793 not a5,a5 + 2e8: 97ba add a5,a5,a4 + *--dst = *--src; + 2ea: 15fd addi a1,a1,-1 + 2ec: 177d addi a4,a4,-1 + 2ee: 0005c683 lbu a3,0(a1) + 2f2: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2f6: fee79ae3 bne a5,a4,2ea + 2fa: bfc9 j 2cc + +00000000000002fc : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2fc: 1141 addi sp,sp,-16 + 2fe: e422 sd s0,8(sp) + 300: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 302: ca05 beqz a2,332 + 304: fff6069b addiw a3,a2,-1 + 308: 1682 slli a3,a3,0x20 + 30a: 9281 srli a3,a3,0x20 + 30c: 0685 addi a3,a3,1 + 30e: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 310: 00054783 lbu a5,0(a0) + 314: 0005c703 lbu a4,0(a1) + 318: 00e79863 bne a5,a4,328 + return *p1 - *p2; + } + p1++; + 31c: 0505 addi a0,a0,1 + p2++; + 31e: 0585 addi a1,a1,1 + while (n-- > 0) { + 320: fed518e3 bne a0,a3,310 + } + return 0; + 324: 4501 li a0,0 + 326: a019 j 32c + return *p1 - *p2; + 328: 40e7853b subw a0,a5,a4 +} + 32c: 6422 ld s0,8(sp) + 32e: 0141 addi sp,sp,16 + 330: 8082 ret + return 0; + 332: 4501 li a0,0 + 334: bfe5 j 32c + +0000000000000336 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 336: 1141 addi sp,sp,-16 + 338: e406 sd ra,8(sp) + 33a: e022 sd s0,0(sp) + 33c: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 33e: f67ff0ef jal 2a4 +} + 342: 60a2 ld ra,8(sp) + 344: 6402 ld s0,0(sp) + 346: 0141 addi sp,sp,16 + 348: 8082 ret + +000000000000034a : + +char * +sbrk(int n) { + 34a: 1141 addi sp,sp,-16 + 34c: e406 sd ra,8(sp) + 34e: e022 sd s0,0(sp) + 350: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 352: 4585 li a1,1 + 354: 0b2000ef jal 406 +} + 358: 60a2 ld ra,8(sp) + 35a: 6402 ld s0,0(sp) + 35c: 0141 addi sp,sp,16 + 35e: 8082 ret + +0000000000000360 : + +char * +sbrklazy(int n) { + 360: 1141 addi sp,sp,-16 + 362: e406 sd ra,8(sp) + 364: e022 sd s0,0(sp) + 366: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 368: 4589 li a1,2 + 36a: 09c000ef jal 406 +} + 36e: 60a2 ld ra,8(sp) + 370: 6402 ld s0,0(sp) + 372: 0141 addi sp,sp,16 + 374: 8082 ret + +0000000000000376 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 376: 4885 li a7,1 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e : +.global exit +exit: + li a7, SYS_exit + 37e: 4889 li a7,2 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 : +.global wait +wait: + li a7, SYS_wait + 386: 488d li a7,3 + ecall + 388: 00000073 ecall + ret + 38c: 8082 ret + +000000000000038e : +.global pipe +pipe: + li a7, SYS_pipe + 38e: 4891 li a7,4 + ecall + 390: 00000073 ecall + ret + 394: 8082 ret + +0000000000000396 : +.global read +read: + li a7, SYS_read + 396: 4895 li a7,5 + ecall + 398: 00000073 ecall + ret + 39c: 8082 ret + +000000000000039e : +.global write +write: + li a7, SYS_write + 39e: 48c1 li a7,16 + ecall + 3a0: 00000073 ecall + ret + 3a4: 8082 ret + +00000000000003a6 : +.global close +close: + li a7, SYS_close + 3a6: 48d5 li a7,21 + ecall + 3a8: 00000073 ecall + ret + 3ac: 8082 ret + +00000000000003ae : +.global kill +kill: + li a7, SYS_kill + 3ae: 4899 li a7,6 + ecall + 3b0: 00000073 ecall + ret + 3b4: 8082 ret + +00000000000003b6 : +.global exec +exec: + li a7, SYS_exec + 3b6: 489d li a7,7 + ecall + 3b8: 00000073 ecall + ret + 3bc: 8082 ret + +00000000000003be : +.global open +open: + li a7, SYS_open + 3be: 48bd li a7,15 + ecall + 3c0: 00000073 ecall + ret + 3c4: 8082 ret + +00000000000003c6 : +.global mknod +mknod: + li a7, SYS_mknod + 3c6: 48c5 li a7,17 + ecall + 3c8: 00000073 ecall + ret + 3cc: 8082 ret + +00000000000003ce : +.global unlink +unlink: + li a7, SYS_unlink + 3ce: 48c9 li a7,18 + ecall + 3d0: 00000073 ecall + ret + 3d4: 8082 ret + +00000000000003d6 : +.global fstat +fstat: + li a7, SYS_fstat + 3d6: 48a1 li a7,8 + ecall + 3d8: 00000073 ecall + ret + 3dc: 8082 ret + +00000000000003de : +.global link +link: + li a7, SYS_link + 3de: 48cd li a7,19 + ecall + 3e0: 00000073 ecall + ret + 3e4: 8082 ret + +00000000000003e6 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3e6: 48d1 li a7,20 + ecall + 3e8: 00000073 ecall + ret + 3ec: 8082 ret + +00000000000003ee : +.global chdir +chdir: + li a7, SYS_chdir + 3ee: 48a5 li a7,9 + ecall + 3f0: 00000073 ecall + ret + 3f4: 8082 ret + +00000000000003f6 : +.global dup +dup: + li a7, SYS_dup + 3f6: 48a9 li a7,10 + ecall + 3f8: 00000073 ecall + ret + 3fc: 8082 ret + +00000000000003fe : +.global getpid +getpid: + li a7, SYS_getpid + 3fe: 48ad li a7,11 + ecall + 400: 00000073 ecall + ret + 404: 8082 ret + +0000000000000406 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 406: 48b1 li a7,12 + ecall + 408: 00000073 ecall + ret + 40c: 8082 ret + +000000000000040e : +.global pause +pause: + li a7, SYS_pause + 40e: 48b5 li a7,13 + ecall + 410: 00000073 ecall + ret + 414: 8082 ret + +0000000000000416 : +.global uptime +uptime: + li a7, SYS_uptime + 416: 48b9 li a7,14 + ecall + 418: 00000073 ecall + ret + 41c: 8082 ret + +000000000000041e : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 41e: 48d9 li a7,22 + ecall + 420: 00000073 ecall + ret + 424: 8082 ret + +0000000000000426 : +.global getppid +getppid: + li a7, SYS_getppid + 426: 48dd li a7,23 + ecall + 428: 00000073 ecall + ret + 42c: 8082 ret + +000000000000042e : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 42e: 48e1 li a7,24 + ecall + 430: 00000073 ecall + ret + 434: 8082 ret + +0000000000000436 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 436: 1101 addi sp,sp,-32 + 438: ec06 sd ra,24(sp) + 43a: e822 sd s0,16(sp) + 43c: 1000 addi s0,sp,32 + 43e: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 442: 4605 li a2,1 + 444: fef40593 addi a1,s0,-17 + 448: f57ff0ef jal 39e +} + 44c: 60e2 ld ra,24(sp) + 44e: 6442 ld s0,16(sp) + 450: 6105 addi sp,sp,32 + 452: 8082 ret + +0000000000000454 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 454: 715d addi sp,sp,-80 + 456: e486 sd ra,72(sp) + 458: e0a2 sd s0,64(sp) + 45a: f84a sd s2,48(sp) + 45c: 0880 addi s0,sp,80 + 45e: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 460: c299 beqz a3,466 + 462: 0805c363 bltz a1,4e8 + neg = 0; + 466: 4881 li a7,0 + 468: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 46c: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 46e: 00000517 auipc a0,0x0 + 472: 55250513 addi a0,a0,1362 # 9c0 + 476: 883e mv a6,a5 + 478: 2785 addiw a5,a5,1 + 47a: 02c5f733 remu a4,a1,a2 + 47e: 972a add a4,a4,a0 + 480: 00074703 lbu a4,0(a4) + 484: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 488: 872e mv a4,a1 + 48a: 02c5d5b3 divu a1,a1,a2 + 48e: 0685 addi a3,a3,1 + 490: fec773e3 bgeu a4,a2,476 + if(neg) + 494: 00088b63 beqz a7,4aa + buf[i++] = '-'; + 498: fd078793 addi a5,a5,-48 + 49c: 97a2 add a5,a5,s0 + 49e: 02d00713 li a4,45 + 4a2: fee78423 sb a4,-24(a5) + 4a6: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 4aa: 02f05a63 blez a5,4de + 4ae: fc26 sd s1,56(sp) + 4b0: f44e sd s3,40(sp) + 4b2: fb840713 addi a4,s0,-72 + 4b6: 00f704b3 add s1,a4,a5 + 4ba: fff70993 addi s3,a4,-1 + 4be: 99be add s3,s3,a5 + 4c0: 37fd addiw a5,a5,-1 + 4c2: 1782 slli a5,a5,0x20 + 4c4: 9381 srli a5,a5,0x20 + 4c6: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 4ca: fff4c583 lbu a1,-1(s1) + 4ce: 854a mv a0,s2 + 4d0: f67ff0ef jal 436 + while(--i >= 0) + 4d4: 14fd addi s1,s1,-1 + 4d6: ff349ae3 bne s1,s3,4ca + 4da: 74e2 ld s1,56(sp) + 4dc: 79a2 ld s3,40(sp) +} + 4de: 60a6 ld ra,72(sp) + 4e0: 6406 ld s0,64(sp) + 4e2: 7942 ld s2,48(sp) + 4e4: 6161 addi sp,sp,80 + 4e6: 8082 ret + x = -xx; + 4e8: 40b005b3 neg a1,a1 + neg = 1; + 4ec: 4885 li a7,1 + x = -xx; + 4ee: bfad j 468 + +00000000000004f0 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4f0: 711d addi sp,sp,-96 + 4f2: ec86 sd ra,88(sp) + 4f4: e8a2 sd s0,80(sp) + 4f6: e0ca sd s2,64(sp) + 4f8: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4fa: 0005c903 lbu s2,0(a1) + 4fe: 28090663 beqz s2,78a + 502: e4a6 sd s1,72(sp) + 504: fc4e sd s3,56(sp) + 506: f852 sd s4,48(sp) + 508: f456 sd s5,40(sp) + 50a: f05a sd s6,32(sp) + 50c: ec5e sd s7,24(sp) + 50e: e862 sd s8,16(sp) + 510: e466 sd s9,8(sp) + 512: 8b2a mv s6,a0 + 514: 8a2e mv s4,a1 + 516: 8bb2 mv s7,a2 + state = 0; + 518: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 51a: 4481 li s1,0 + 51c: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 51e: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 522: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 526: 06c00c93 li s9,108 + 52a: a005 j 54a + putc(fd, c0); + 52c: 85ca mv a1,s2 + 52e: 855a mv a0,s6 + 530: f07ff0ef jal 436 + 534: a019 j 53a + } else if(state == '%'){ + 536: 03598263 beq s3,s5,55a + for(i = 0; fmt[i]; i++){ + 53a: 2485 addiw s1,s1,1 + 53c: 8726 mv a4,s1 + 53e: 009a07b3 add a5,s4,s1 + 542: 0007c903 lbu s2,0(a5) + 546: 22090a63 beqz s2,77a + c0 = fmt[i] & 0xff; + 54a: 0009079b sext.w a5,s2 + if(state == 0){ + 54e: fe0994e3 bnez s3,536 + if(c0 == '%'){ + 552: fd579de3 bne a5,s5,52c + state = '%'; + 556: 89be mv s3,a5 + 558: b7cd j 53a + if(c0) c1 = fmt[i+1] & 0xff; + 55a: 00ea06b3 add a3,s4,a4 + 55e: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 562: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 564: c681 beqz a3,56c + 566: 9752 add a4,a4,s4 + 568: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 56c: 05878363 beq a5,s8,5b2 + } else if(c0 == 'l' && c1 == 'd'){ + 570: 05978d63 beq a5,s9,5ca + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 574: 07500713 li a4,117 + 578: 0ee78763 beq a5,a4,666 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 57c: 07800713 li a4,120 + 580: 12e78963 beq a5,a4,6b2 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 584: 07000713 li a4,112 + 588: 14e78e63 beq a5,a4,6e4 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 58c: 06300713 li a4,99 + 590: 18e78e63 beq a5,a4,72c + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 594: 07300713 li a4,115 + 598: 1ae78463 beq a5,a4,740 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 59c: 02500713 li a4,37 + 5a0: 04e79563 bne a5,a4,5ea + putc(fd, '%'); + 5a4: 02500593 li a1,37 + 5a8: 855a mv a0,s6 + 5aa: e8dff0ef jal 436 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 5ae: 4981 li s3,0 + 5b0: b769 j 53a + printint(fd, va_arg(ap, int), 10, 1); + 5b2: 008b8913 addi s2,s7,8 + 5b6: 4685 li a3,1 + 5b8: 4629 li a2,10 + 5ba: 000ba583 lw a1,0(s7) + 5be: 855a mv a0,s6 + 5c0: e95ff0ef jal 454 + 5c4: 8bca mv s7,s2 + state = 0; + 5c6: 4981 li s3,0 + 5c8: bf8d j 53a + } else if(c0 == 'l' && c1 == 'd'){ + 5ca: 06400793 li a5,100 + 5ce: 02f68963 beq a3,a5,600 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5d2: 06c00793 li a5,108 + 5d6: 04f68263 beq a3,a5,61a + } else if(c0 == 'l' && c1 == 'u'){ + 5da: 07500793 li a5,117 + 5de: 0af68063 beq a3,a5,67e + } else if(c0 == 'l' && c1 == 'x'){ + 5e2: 07800793 li a5,120 + 5e6: 0ef68263 beq a3,a5,6ca + putc(fd, '%'); + 5ea: 02500593 li a1,37 + 5ee: 855a mv a0,s6 + 5f0: e47ff0ef jal 436 + putc(fd, c0); + 5f4: 85ca mv a1,s2 + 5f6: 855a mv a0,s6 + 5f8: e3fff0ef jal 436 + state = 0; + 5fc: 4981 li s3,0 + 5fe: bf35 j 53a + printint(fd, va_arg(ap, uint64), 10, 1); + 600: 008b8913 addi s2,s7,8 + 604: 4685 li a3,1 + 606: 4629 li a2,10 + 608: 000bb583 ld a1,0(s7) + 60c: 855a mv a0,s6 + 60e: e47ff0ef jal 454 + i += 1; + 612: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 614: 8bca mv s7,s2 + state = 0; + 616: 4981 li s3,0 + i += 1; + 618: b70d j 53a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 61a: 06400793 li a5,100 + 61e: 02f60763 beq a2,a5,64c + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 622: 07500793 li a5,117 + 626: 06f60963 beq a2,a5,698 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 62a: 07800793 li a5,120 + 62e: faf61ee3 bne a2,a5,5ea + printint(fd, va_arg(ap, uint64), 16, 0); + 632: 008b8913 addi s2,s7,8 + 636: 4681 li a3,0 + 638: 4641 li a2,16 + 63a: 000bb583 ld a1,0(s7) + 63e: 855a mv a0,s6 + 640: e15ff0ef jal 454 + i += 2; + 644: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 646: 8bca mv s7,s2 + state = 0; + 648: 4981 li s3,0 + i += 2; + 64a: bdc5 j 53a + printint(fd, va_arg(ap, uint64), 10, 1); + 64c: 008b8913 addi s2,s7,8 + 650: 4685 li a3,1 + 652: 4629 li a2,10 + 654: 000bb583 ld a1,0(s7) + 658: 855a mv a0,s6 + 65a: dfbff0ef jal 454 + i += 2; + 65e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 660: 8bca mv s7,s2 + state = 0; + 662: 4981 li s3,0 + i += 2; + 664: bdd9 j 53a + printint(fd, va_arg(ap, uint32), 10, 0); + 666: 008b8913 addi s2,s7,8 + 66a: 4681 li a3,0 + 66c: 4629 li a2,10 + 66e: 000be583 lwu a1,0(s7) + 672: 855a mv a0,s6 + 674: de1ff0ef jal 454 + 678: 8bca mv s7,s2 + state = 0; + 67a: 4981 li s3,0 + 67c: bd7d j 53a + printint(fd, va_arg(ap, uint64), 10, 0); + 67e: 008b8913 addi s2,s7,8 + 682: 4681 li a3,0 + 684: 4629 li a2,10 + 686: 000bb583 ld a1,0(s7) + 68a: 855a mv a0,s6 + 68c: dc9ff0ef jal 454 + i += 1; + 690: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 692: 8bca mv s7,s2 + state = 0; + 694: 4981 li s3,0 + i += 1; + 696: b555 j 53a + printint(fd, va_arg(ap, uint64), 10, 0); + 698: 008b8913 addi s2,s7,8 + 69c: 4681 li a3,0 + 69e: 4629 li a2,10 + 6a0: 000bb583 ld a1,0(s7) + 6a4: 855a mv a0,s6 + 6a6: dafff0ef jal 454 + i += 2; + 6aa: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 6ac: 8bca mv s7,s2 + state = 0; + 6ae: 4981 li s3,0 + i += 2; + 6b0: b569 j 53a + printint(fd, va_arg(ap, uint32), 16, 0); + 6b2: 008b8913 addi s2,s7,8 + 6b6: 4681 li a3,0 + 6b8: 4641 li a2,16 + 6ba: 000be583 lwu a1,0(s7) + 6be: 855a mv a0,s6 + 6c0: d95ff0ef jal 454 + 6c4: 8bca mv s7,s2 + state = 0; + 6c6: 4981 li s3,0 + 6c8: bd8d j 53a + printint(fd, va_arg(ap, uint64), 16, 0); + 6ca: 008b8913 addi s2,s7,8 + 6ce: 4681 li a3,0 + 6d0: 4641 li a2,16 + 6d2: 000bb583 ld a1,0(s7) + 6d6: 855a mv a0,s6 + 6d8: d7dff0ef jal 454 + i += 1; + 6dc: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6de: 8bca mv s7,s2 + state = 0; + 6e0: 4981 li s3,0 + i += 1; + 6e2: bda1 j 53a + 6e4: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 6e6: 008b8d13 addi s10,s7,8 + 6ea: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6ee: 03000593 li a1,48 + 6f2: 855a mv a0,s6 + 6f4: d43ff0ef jal 436 + putc(fd, 'x'); + 6f8: 07800593 li a1,120 + 6fc: 855a mv a0,s6 + 6fe: d39ff0ef jal 436 + 702: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 704: 00000b97 auipc s7,0x0 + 708: 2bcb8b93 addi s7,s7,700 # 9c0 + 70c: 03c9d793 srli a5,s3,0x3c + 710: 97de add a5,a5,s7 + 712: 0007c583 lbu a1,0(a5) + 716: 855a mv a0,s6 + 718: d1fff0ef jal 436 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 71c: 0992 slli s3,s3,0x4 + 71e: 397d addiw s2,s2,-1 + 720: fe0916e3 bnez s2,70c + printptr(fd, va_arg(ap, uint64)); + 724: 8bea mv s7,s10 + state = 0; + 726: 4981 li s3,0 + 728: 6d02 ld s10,0(sp) + 72a: bd01 j 53a + putc(fd, va_arg(ap, uint32)); + 72c: 008b8913 addi s2,s7,8 + 730: 000bc583 lbu a1,0(s7) + 734: 855a mv a0,s6 + 736: d01ff0ef jal 436 + 73a: 8bca mv s7,s2 + state = 0; + 73c: 4981 li s3,0 + 73e: bbf5 j 53a + if((s = va_arg(ap, char*)) == 0) + 740: 008b8993 addi s3,s7,8 + 744: 000bb903 ld s2,0(s7) + 748: 00090f63 beqz s2,766 + for(; *s; s++) + 74c: 00094583 lbu a1,0(s2) + 750: c195 beqz a1,774 + putc(fd, *s); + 752: 855a mv a0,s6 + 754: ce3ff0ef jal 436 + for(; *s; s++) + 758: 0905 addi s2,s2,1 + 75a: 00094583 lbu a1,0(s2) + 75e: f9f5 bnez a1,752 + if((s = va_arg(ap, char*)) == 0) + 760: 8bce mv s7,s3 + state = 0; + 762: 4981 li s3,0 + 764: bbd9 j 53a + s = "(null)"; + 766: 00000917 auipc s2,0x0 + 76a: 25290913 addi s2,s2,594 # 9b8 + for(; *s; s++) + 76e: 02800593 li a1,40 + 772: b7c5 j 752 + if((s = va_arg(ap, char*)) == 0) + 774: 8bce mv s7,s3 + state = 0; + 776: 4981 li s3,0 + 778: b3c9 j 53a + 77a: 64a6 ld s1,72(sp) + 77c: 79e2 ld s3,56(sp) + 77e: 7a42 ld s4,48(sp) + 780: 7aa2 ld s5,40(sp) + 782: 7b02 ld s6,32(sp) + 784: 6be2 ld s7,24(sp) + 786: 6c42 ld s8,16(sp) + 788: 6ca2 ld s9,8(sp) + } + } +} + 78a: 60e6 ld ra,88(sp) + 78c: 6446 ld s0,80(sp) + 78e: 6906 ld s2,64(sp) + 790: 6125 addi sp,sp,96 + 792: 8082 ret + +0000000000000794 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 794: 715d addi sp,sp,-80 + 796: ec06 sd ra,24(sp) + 798: e822 sd s0,16(sp) + 79a: 1000 addi s0,sp,32 + 79c: e010 sd a2,0(s0) + 79e: e414 sd a3,8(s0) + 7a0: e818 sd a4,16(s0) + 7a2: ec1c sd a5,24(s0) + 7a4: 03043023 sd a6,32(s0) + 7a8: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 7ac: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 7b0: 8622 mv a2,s0 + 7b2: d3fff0ef jal 4f0 +} + 7b6: 60e2 ld ra,24(sp) + 7b8: 6442 ld s0,16(sp) + 7ba: 6161 addi sp,sp,80 + 7bc: 8082 ret + +00000000000007be : + +void +printf(const char *fmt, ...) +{ + 7be: 711d addi sp,sp,-96 + 7c0: ec06 sd ra,24(sp) + 7c2: e822 sd s0,16(sp) + 7c4: 1000 addi s0,sp,32 + 7c6: e40c sd a1,8(s0) + 7c8: e810 sd a2,16(s0) + 7ca: ec14 sd a3,24(s0) + 7cc: f018 sd a4,32(s0) + 7ce: f41c sd a5,40(s0) + 7d0: 03043823 sd a6,48(s0) + 7d4: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 7d8: 00840613 addi a2,s0,8 + 7dc: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 7e0: 85aa mv a1,a0 + 7e2: 4505 li a0,1 + 7e4: d0dff0ef jal 4f0 +} + 7e8: 60e2 ld ra,24(sp) + 7ea: 6442 ld s0,16(sp) + 7ec: 6125 addi sp,sp,96 + 7ee: 8082 ret + +00000000000007f0 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7f0: 1141 addi sp,sp,-16 + 7f2: e422 sd s0,8(sp) + 7f4: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7f6: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7fa: 00001797 auipc a5,0x1 + 7fe: 8067b783 ld a5,-2042(a5) # 1000 + 802: a02d j 82c + 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; + 804: 4618 lw a4,8(a2) + 806: 9f2d addw a4,a4,a1 + 808: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 80c: 6398 ld a4,0(a5) + 80e: 6310 ld a2,0(a4) + 810: a83d j 84e + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 812: ff852703 lw a4,-8(a0) + 816: 9f31 addw a4,a4,a2 + 818: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 81a: ff053683 ld a3,-16(a0) + 81e: a091 j 862 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 820: 6398 ld a4,0(a5) + 822: 00e7e463 bltu a5,a4,82a + 826: 00e6ea63 bltu a3,a4,83a +{ + 82a: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 82c: fed7fae3 bgeu a5,a3,820 + 830: 6398 ld a4,0(a5) + 832: 00e6e463 bltu a3,a4,83a + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 836: fee7eae3 bltu a5,a4,82a + if(bp + bp->s.size == p->s.ptr){ + 83a: ff852583 lw a1,-8(a0) + 83e: 6390 ld a2,0(a5) + 840: 02059813 slli a6,a1,0x20 + 844: 01c85713 srli a4,a6,0x1c + 848: 9736 add a4,a4,a3 + 84a: fae60de3 beq a2,a4,804 + bp->s.ptr = p->s.ptr->s.ptr; + 84e: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 852: 4790 lw a2,8(a5) + 854: 02061593 slli a1,a2,0x20 + 858: 01c5d713 srli a4,a1,0x1c + 85c: 973e add a4,a4,a5 + 85e: fae68ae3 beq a3,a4,812 + p->s.ptr = bp->s.ptr; + 862: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 864: 00000717 auipc a4,0x0 + 868: 78f73e23 sd a5,1948(a4) # 1000 +} + 86c: 6422 ld s0,8(sp) + 86e: 0141 addi sp,sp,16 + 870: 8082 ret + +0000000000000872 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 872: 7139 addi sp,sp,-64 + 874: fc06 sd ra,56(sp) + 876: f822 sd s0,48(sp) + 878: f426 sd s1,40(sp) + 87a: ec4e sd s3,24(sp) + 87c: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 87e: 02051493 slli s1,a0,0x20 + 882: 9081 srli s1,s1,0x20 + 884: 04bd addi s1,s1,15 + 886: 8091 srli s1,s1,0x4 + 888: 0014899b addiw s3,s1,1 + 88c: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 88e: 00000517 auipc a0,0x0 + 892: 77253503 ld a0,1906(a0) # 1000 + 896: c915 beqz a0,8ca + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 898: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 89a: 4798 lw a4,8(a5) + 89c: 08977a63 bgeu a4,s1,930 + 8a0: f04a sd s2,32(sp) + 8a2: e852 sd s4,16(sp) + 8a4: e456 sd s5,8(sp) + 8a6: e05a sd s6,0(sp) + if(nu < 4096) + 8a8: 8a4e mv s4,s3 + 8aa: 0009871b sext.w a4,s3 + 8ae: 6685 lui a3,0x1 + 8b0: 00d77363 bgeu a4,a3,8b6 + 8b4: 6a05 lui s4,0x1 + 8b6: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 8ba: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 8be: 00000917 auipc s2,0x0 + 8c2: 74290913 addi s2,s2,1858 # 1000 + if(p == SBRK_ERROR) + 8c6: 5afd li s5,-1 + 8c8: a081 j 908 + 8ca: f04a sd s2,32(sp) + 8cc: e852 sd s4,16(sp) + 8ce: e456 sd s5,8(sp) + 8d0: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 8d2: 00001797 auipc a5,0x1 + 8d6: 93e78793 addi a5,a5,-1730 # 1210 + 8da: 00000717 auipc a4,0x0 + 8de: 72f73323 sd a5,1830(a4) # 1000 + 8e2: e39c sd a5,0(a5) + base.s.size = 0; + 8e4: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 8e8: b7c1 j 8a8 + prevp->s.ptr = p->s.ptr; + 8ea: 6398 ld a4,0(a5) + 8ec: e118 sd a4,0(a0) + 8ee: a8a9 j 948 + hp->s.size = nu; + 8f0: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8f4: 0541 addi a0,a0,16 + 8f6: efbff0ef jal 7f0 + return freep; + 8fa: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8fe: c12d beqz a0,960 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 900: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 902: 4798 lw a4,8(a5) + 904: 02977263 bgeu a4,s1,928 + if(p == freep) + 908: 00093703 ld a4,0(s2) + 90c: 853e mv a0,a5 + 90e: fef719e3 bne a4,a5,900 + p = sbrk(nu * sizeof(Header)); + 912: 8552 mv a0,s4 + 914: a37ff0ef jal 34a + if(p == SBRK_ERROR) + 918: fd551ce3 bne a0,s5,8f0 + return 0; + 91c: 4501 li a0,0 + 91e: 7902 ld s2,32(sp) + 920: 6a42 ld s4,16(sp) + 922: 6aa2 ld s5,8(sp) + 924: 6b02 ld s6,0(sp) + 926: a03d j 954 + 928: 7902 ld s2,32(sp) + 92a: 6a42 ld s4,16(sp) + 92c: 6aa2 ld s5,8(sp) + 92e: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 930: fae48de3 beq s1,a4,8ea + p->s.size -= nunits; + 934: 4137073b subw a4,a4,s3 + 938: c798 sw a4,8(a5) + p += p->s.size; + 93a: 02071693 slli a3,a4,0x20 + 93e: 01c6d713 srli a4,a3,0x1c + 942: 97ba add a5,a5,a4 + p->s.size = nunits; + 944: 0137a423 sw s3,8(a5) + freep = prevp; + 948: 00000717 auipc a4,0x0 + 94c: 6aa73c23 sd a0,1720(a4) # 1000 + return (void*)(p + 1); + 950: 01078513 addi a0,a5,16 + } +} + 954: 70e2 ld ra,56(sp) + 956: 7442 ld s0,48(sp) + 958: 74a2 ld s1,40(sp) + 95a: 69e2 ld s3,24(sp) + 95c: 6121 addi sp,sp,64 + 95e: 8082 ret + 960: 7902 ld s2,32(sp) + 962: 6a42 ld s4,16(sp) + 964: 6aa2 ld s5,8(sp) + 966: 6b02 ld s6,0(sp) + 968: b7f5 j 954 diff --git a/user/cat.c b/G12_Project1_xv6CustomizeSystemCalls/user/cat.c similarity index 100% rename from user/cat.c rename to G12_Project1_xv6CustomizeSystemCalls/user/cat.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/cat.d b/G12_Project1_xv6CustomizeSystemCalls/user/cat.d new file mode 100644 index 0000000000..ae5d22ae47 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/cat.d @@ -0,0 +1 @@ +user/cat.o: user/cat.c kernel/types.h kernel/fcntl.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/cat.o b/G12_Project1_xv6CustomizeSystemCalls/user/cat.o new file mode 100644 index 0000000000..411cddfa00 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/cat.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/cat.sym b/G12_Project1_xv6CustomizeSystemCalls/user/cat.sym new file mode 100644 index 0000000000..6121185c02 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/cat.sym @@ -0,0 +1,70 @@ +0000000000000000 .text +0000000000000970 .rodata +00000000000009d8 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 cat.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000436 putc +0000000000000454 printint +00000000000009c0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001210 base +00000000000000fa strcpy +000000000000040e pause +00000000000007be printf +0000000000000406 sys_sbrk +00000000000002a4 memmove +00000000000003c6 mknod +00000000000001b2 gets +00000000000003fe getpid +0000000000000336 memcpy +0000000000000000 cat +0000000000000872 malloc +0000000000000360 sbrklazy +000000000000038e pipe +000000000000039e write +00000000000003d6 fstat +0000000000000794 fprintf +00000000000003ae kill +00000000000004f0 vprintf +00000000000003ee chdir +00000000000003b6 exec +0000000000000386 wait +000000000000041e getprocsinfo +0000000000000396 read +00000000000003ce unlink +00000000000002fc memcmp +0000000000000376 fork +000000000000034a sbrk +0000000000000416 uptime +000000000000016c memset +0000000000000072 main +0000000000000426 getppid +0000000000000116 strcmp +00000000000003f6 dup +0000000000001010 buf +0000000000000222 stat +000000000000042e sleep2 +00000000000003de link +000000000000037e exit +00000000000000ea start +000000000000025c atoi +0000000000000142 strlen +00000000000003be open +000000000000018e strchr +00000000000003e6 mkdir +00000000000003a6 close +00000000000007f0 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.asm b/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.asm new file mode 100644 index 0000000000..c04cc1bc47 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.asm @@ -0,0 +1,1549 @@ + +user/_dorphan: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: + +char buf[BUFSZ]; + +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: 1000 addi s0,sp,32 + char *s = argv[0]; + a: 6184 ld s1,0(a1) + + if(mkdir("dd") != 0){ + c: 00001517 auipc a0,0x1 + 10: 90450513 addi a0,a0,-1788 # 910 + 14: 372000ef jal 386 + 18: c919 beqz a0,2e + printf("%s: mkdir dd failed\n", s); + 1a: 85a6 mv a1,s1 + 1c: 00001517 auipc a0,0x1 + 20: 8fc50513 addi a0,a0,-1796 # 918 + 24: 73a000ef jal 75e + exit(1); + 28: 4505 li a0,1 + 2a: 2f4000ef jal 31e + } + + if(chdir("dd") != 0){ + 2e: 00001517 auipc a0,0x1 + 32: 8e250513 addi a0,a0,-1822 # 910 + 36: 358000ef jal 38e + 3a: c919 beqz a0,50 + printf("%s: chdir dd failed\n", s); + 3c: 85a6 mv a1,s1 + 3e: 00001517 auipc a0,0x1 + 42: 8f250513 addi a0,a0,-1806 # 930 + 46: 718000ef jal 75e + exit(1); + 4a: 4505 li a0,1 + 4c: 2d2000ef jal 31e + } + + if (unlink("../dd") < 0) { + 50: 00001517 auipc a0,0x1 + 54: 8f850513 addi a0,a0,-1800 # 948 + 58: 316000ef jal 36e + 5c: 00054d63 bltz a0,76 + printf("%s: unlink failed\n", s); + exit(1); + } + printf("wait for kill and reclaim\n"); + 60: 00001517 auipc a0,0x1 + 64: 90850513 addi a0,a0,-1784 # 968 + 68: 6f6000ef jal 75e + // sit around until killed + for(;;) pause(1000); + 6c: 3e800513 li a0,1000 + 70: 33e000ef jal 3ae + 74: bfe5 j 6c + printf("%s: unlink failed\n", s); + 76: 85a6 mv a1,s1 + 78: 00001517 auipc a0,0x1 + 7c: 8d850513 addi a0,a0,-1832 # 950 + 80: 6de000ef jal 75e + exit(1); + 84: 4505 li a0,1 + 86: 298000ef jal 31e + +000000000000008a : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 8a: 1141 addi sp,sp,-16 + 8c: e406 sd ra,8(sp) + 8e: e022 sd s0,0(sp) + 90: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 92: f6fff0ef jal 0
+ exit(r); + 96: 288000ef jal 31e + +000000000000009a : +} + +char* +strcpy(char *s, const char *t) +{ + 9a: 1141 addi sp,sp,-16 + 9c: e422 sd s0,8(sp) + 9e: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + a0: 87aa mv a5,a0 + a2: 0585 addi a1,a1,1 + a4: 0785 addi a5,a5,1 + a6: fff5c703 lbu a4,-1(a1) + aa: fee78fa3 sb a4,-1(a5) + ae: fb75 bnez a4,a2 + ; + return os; +} + b0: 6422 ld s0,8(sp) + b2: 0141 addi sp,sp,16 + b4: 8082 ret + +00000000000000b6 : + +int +strcmp(const char *p, const char *q) +{ + b6: 1141 addi sp,sp,-16 + b8: e422 sd s0,8(sp) + ba: 0800 addi s0,sp,16 + while(*p && *p == *q) + bc: 00054783 lbu a5,0(a0) + c0: cb91 beqz a5,d4 + c2: 0005c703 lbu a4,0(a1) + c6: 00f71763 bne a4,a5,d4 + p++, q++; + ca: 0505 addi a0,a0,1 + cc: 0585 addi a1,a1,1 + while(*p && *p == *q) + ce: 00054783 lbu a5,0(a0) + d2: fbe5 bnez a5,c2 + return (uchar)*p - (uchar)*q; + d4: 0005c503 lbu a0,0(a1) +} + d8: 40a7853b subw a0,a5,a0 + dc: 6422 ld s0,8(sp) + de: 0141 addi sp,sp,16 + e0: 8082 ret + +00000000000000e2 : + +uint +strlen(const char *s) +{ + e2: 1141 addi sp,sp,-16 + e4: e422 sd s0,8(sp) + e6: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + e8: 00054783 lbu a5,0(a0) + ec: cf91 beqz a5,108 + ee: 0505 addi a0,a0,1 + f0: 87aa mv a5,a0 + f2: 86be mv a3,a5 + f4: 0785 addi a5,a5,1 + f6: fff7c703 lbu a4,-1(a5) + fa: ff65 bnez a4,f2 + fc: 40a6853b subw a0,a3,a0 + 100: 2505 addiw a0,a0,1 + ; + return n; +} + 102: 6422 ld s0,8(sp) + 104: 0141 addi sp,sp,16 + 106: 8082 ret + for(n = 0; s[n]; n++) + 108: 4501 li a0,0 + 10a: bfe5 j 102 + +000000000000010c : + +void* +memset(void *dst, int c, uint n) +{ + 10c: 1141 addi sp,sp,-16 + 10e: e422 sd s0,8(sp) + 110: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 112: ca19 beqz a2,128 + 114: 87aa mv a5,a0 + 116: 1602 slli a2,a2,0x20 + 118: 9201 srli a2,a2,0x20 + 11a: 00a60733 add a4,a2,a0 + cdst[i] = c; + 11e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 122: 0785 addi a5,a5,1 + 124: fee79de3 bne a5,a4,11e + } + return dst; +} + 128: 6422 ld s0,8(sp) + 12a: 0141 addi sp,sp,16 + 12c: 8082 ret + +000000000000012e : + +char* +strchr(const char *s, char c) +{ + 12e: 1141 addi sp,sp,-16 + 130: e422 sd s0,8(sp) + 132: 0800 addi s0,sp,16 + for(; *s; s++) + 134: 00054783 lbu a5,0(a0) + 138: cb99 beqz a5,14e + if(*s == c) + 13a: 00f58763 beq a1,a5,148 + for(; *s; s++) + 13e: 0505 addi a0,a0,1 + 140: 00054783 lbu a5,0(a0) + 144: fbfd bnez a5,13a + return (char*)s; + return 0; + 146: 4501 li a0,0 +} + 148: 6422 ld s0,8(sp) + 14a: 0141 addi sp,sp,16 + 14c: 8082 ret + return 0; + 14e: 4501 li a0,0 + 150: bfe5 j 148 + +0000000000000152 : + +char* +gets(char *buf, int max) +{ + 152: 711d addi sp,sp,-96 + 154: ec86 sd ra,88(sp) + 156: e8a2 sd s0,80(sp) + 158: e4a6 sd s1,72(sp) + 15a: e0ca sd s2,64(sp) + 15c: fc4e sd s3,56(sp) + 15e: f852 sd s4,48(sp) + 160: f456 sd s5,40(sp) + 162: f05a sd s6,32(sp) + 164: ec5e sd s7,24(sp) + 166: 1080 addi s0,sp,96 + 168: 8baa mv s7,a0 + 16a: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 16c: 892a mv s2,a0 + 16e: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 170: 4aa9 li s5,10 + 172: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 174: 89a6 mv s3,s1 + 176: 2485 addiw s1,s1,1 + 178: 0344d663 bge s1,s4,1a4 + cc = read(0, &c, 1); + 17c: 4605 li a2,1 + 17e: faf40593 addi a1,s0,-81 + 182: 4501 li a0,0 + 184: 1b2000ef jal 336 + if(cc < 1) + 188: 00a05e63 blez a0,1a4 + buf[i++] = c; + 18c: faf44783 lbu a5,-81(s0) + 190: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 194: 01578763 beq a5,s5,1a2 + 198: 0905 addi s2,s2,1 + 19a: fd679de3 bne a5,s6,174 + buf[i++] = c; + 19e: 89a6 mv s3,s1 + 1a0: a011 j 1a4 + 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: 6125 addi sp,sp,96 + 1c0: 8082 ret + +00000000000001c2 : + +int +stat(const char *n, struct stat *st) +{ + 1c2: 1101 addi sp,sp,-32 + 1c4: ec06 sd ra,24(sp) + 1c6: e822 sd s0,16(sp) + 1c8: e04a sd s2,0(sp) + 1ca: 1000 addi s0,sp,32 + 1cc: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1ce: 4581 li a1,0 + 1d0: 18e000ef jal 35e + if(fd < 0) + 1d4: 02054263 bltz a0,1f8 + 1d8: e426 sd s1,8(sp) + 1da: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1dc: 85ca mv a1,s2 + 1de: 198000ef jal 376 + 1e2: 892a mv s2,a0 + close(fd); + 1e4: 8526 mv a0,s1 + 1e6: 160000ef jal 346 + return r; + 1ea: 64a2 ld s1,8(sp) +} + 1ec: 854a mv a0,s2 + 1ee: 60e2 ld ra,24(sp) + 1f0: 6442 ld s0,16(sp) + 1f2: 6902 ld s2,0(sp) + 1f4: 6105 addi sp,sp,32 + 1f6: 8082 ret + return -1; + 1f8: 597d li s2,-1 + 1fa: bfcd j 1ec + +00000000000001fc : + +int +atoi(const char *s) +{ + 1fc: 1141 addi sp,sp,-16 + 1fe: e422 sd s0,8(sp) + 200: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 202: 00054683 lbu a3,0(a0) + 206: fd06879b addiw a5,a3,-48 + 20a: 0ff7f793 zext.b a5,a5 + 20e: 4625 li a2,9 + 210: 02f66863 bltu a2,a5,240 + 214: 872a mv a4,a0 + n = 0; + 216: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 218: 0705 addi a4,a4,1 + 21a: 0025179b slliw a5,a0,0x2 + 21e: 9fa9 addw a5,a5,a0 + 220: 0017979b slliw a5,a5,0x1 + 224: 9fb5 addw a5,a5,a3 + 226: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 22a: 00074683 lbu a3,0(a4) + 22e: fd06879b addiw a5,a3,-48 + 232: 0ff7f793 zext.b a5,a5 + 236: fef671e3 bgeu a2,a5,218 + return n; +} + 23a: 6422 ld s0,8(sp) + 23c: 0141 addi sp,sp,16 + 23e: 8082 ret + n = 0; + 240: 4501 li a0,0 + 242: bfe5 j 23a + +0000000000000244 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 244: 1141 addi sp,sp,-16 + 246: e422 sd s0,8(sp) + 248: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 24a: 02b57463 bgeu a0,a1,272 + while(n-- > 0) + 24e: 00c05f63 blez a2,26c + 252: 1602 slli a2,a2,0x20 + 254: 9201 srli a2,a2,0x20 + 256: 00c507b3 add a5,a0,a2 + dst = vdst; + 25a: 872a mv a4,a0 + *dst++ = *src++; + 25c: 0585 addi a1,a1,1 + 25e: 0705 addi a4,a4,1 + 260: fff5c683 lbu a3,-1(a1) + 264: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 268: fef71ae3 bne a4,a5,25c + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 26c: 6422 ld s0,8(sp) + 26e: 0141 addi sp,sp,16 + 270: 8082 ret + dst += n; + 272: 00c50733 add a4,a0,a2 + src += n; + 276: 95b2 add a1,a1,a2 + while(n-- > 0) + 278: fec05ae3 blez a2,26c + 27c: fff6079b addiw a5,a2,-1 + 280: 1782 slli a5,a5,0x20 + 282: 9381 srli a5,a5,0x20 + 284: fff7c793 not a5,a5 + 288: 97ba add a5,a5,a4 + *--dst = *--src; + 28a: 15fd addi a1,a1,-1 + 28c: 177d addi a4,a4,-1 + 28e: 0005c683 lbu a3,0(a1) + 292: 00d70023 sb a3,0(a4) + while(n-- > 0) + 296: fee79ae3 bne a5,a4,28a + 29a: bfc9 j 26c + +000000000000029c : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 29c: 1141 addi sp,sp,-16 + 29e: e422 sd s0,8(sp) + 2a0: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2a2: ca05 beqz a2,2d2 + 2a4: fff6069b addiw a3,a2,-1 + 2a8: 1682 slli a3,a3,0x20 + 2aa: 9281 srli a3,a3,0x20 + 2ac: 0685 addi a3,a3,1 + 2ae: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2b0: 00054783 lbu a5,0(a0) + 2b4: 0005c703 lbu a4,0(a1) + 2b8: 00e79863 bne a5,a4,2c8 + return *p1 - *p2; + } + p1++; + 2bc: 0505 addi a0,a0,1 + p2++; + 2be: 0585 addi a1,a1,1 + while (n-- > 0) { + 2c0: fed518e3 bne a0,a3,2b0 + } + return 0; + 2c4: 4501 li a0,0 + 2c6: a019 j 2cc + return *p1 - *p2; + 2c8: 40e7853b subw a0,a5,a4 +} + 2cc: 6422 ld s0,8(sp) + 2ce: 0141 addi sp,sp,16 + 2d0: 8082 ret + return 0; + 2d2: 4501 li a0,0 + 2d4: bfe5 j 2cc + +00000000000002d6 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2d6: 1141 addi sp,sp,-16 + 2d8: e406 sd ra,8(sp) + 2da: e022 sd s0,0(sp) + 2dc: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2de: f67ff0ef jal 244 +} + 2e2: 60a2 ld ra,8(sp) + 2e4: 6402 ld s0,0(sp) + 2e6: 0141 addi sp,sp,16 + 2e8: 8082 ret + +00000000000002ea : + +char * +sbrk(int n) { + 2ea: 1141 addi sp,sp,-16 + 2ec: e406 sd ra,8(sp) + 2ee: e022 sd s0,0(sp) + 2f0: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2f2: 4585 li a1,1 + 2f4: 0b2000ef jal 3a6 +} + 2f8: 60a2 ld ra,8(sp) + 2fa: 6402 ld s0,0(sp) + 2fc: 0141 addi sp,sp,16 + 2fe: 8082 ret + +0000000000000300 : + +char * +sbrklazy(int n) { + 300: 1141 addi sp,sp,-16 + 302: e406 sd ra,8(sp) + 304: e022 sd s0,0(sp) + 306: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 308: 4589 li a1,2 + 30a: 09c000ef jal 3a6 +} + 30e: 60a2 ld ra,8(sp) + 310: 6402 ld s0,0(sp) + 312: 0141 addi sp,sp,16 + 314: 8082 ret + +0000000000000316 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 316: 4885 li a7,1 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e : +.global exit +exit: + li a7, SYS_exit + 31e: 4889 li a7,2 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 : +.global wait +wait: + li a7, SYS_wait + 326: 488d li a7,3 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e : +.global pipe +pipe: + li a7, SYS_pipe + 32e: 4891 li a7,4 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 : +.global read +read: + li a7, SYS_read + 336: 4895 li a7,5 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e : +.global write +write: + li a7, SYS_write + 33e: 48c1 li a7,16 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 : +.global close +close: + li a7, SYS_close + 346: 48d5 li a7,21 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e : +.global kill +kill: + li a7, SYS_kill + 34e: 4899 li a7,6 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 : +.global exec +exec: + li a7, SYS_exec + 356: 489d li a7,7 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e : +.global open +open: + li a7, SYS_open + 35e: 48bd li a7,15 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 : +.global mknod +mknod: + li a7, SYS_mknod + 366: 48c5 li a7,17 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e : +.global unlink +unlink: + li a7, SYS_unlink + 36e: 48c9 li a7,18 + ecall + 370: 00000073 ecall + ret + 374: 8082 ret + +0000000000000376 : +.global fstat +fstat: + li a7, SYS_fstat + 376: 48a1 li a7,8 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e : +.global link +link: + li a7, SYS_link + 37e: 48cd li a7,19 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 386: 48d1 li a7,20 + ecall + 388: 00000073 ecall + ret + 38c: 8082 ret + +000000000000038e : +.global chdir +chdir: + li a7, SYS_chdir + 38e: 48a5 li a7,9 + ecall + 390: 00000073 ecall + ret + 394: 8082 ret + +0000000000000396 : +.global dup +dup: + li a7, SYS_dup + 396: 48a9 li a7,10 + ecall + 398: 00000073 ecall + ret + 39c: 8082 ret + +000000000000039e : +.global getpid +getpid: + li a7, SYS_getpid + 39e: 48ad li a7,11 + ecall + 3a0: 00000073 ecall + ret + 3a4: 8082 ret + +00000000000003a6 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3a6: 48b1 li a7,12 + ecall + 3a8: 00000073 ecall + ret + 3ac: 8082 ret + +00000000000003ae : +.global pause +pause: + li a7, SYS_pause + 3ae: 48b5 li a7,13 + ecall + 3b0: 00000073 ecall + ret + 3b4: 8082 ret + +00000000000003b6 : +.global uptime +uptime: + li a7, SYS_uptime + 3b6: 48b9 li a7,14 + ecall + 3b8: 00000073 ecall + ret + 3bc: 8082 ret + +00000000000003be : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 3be: 48d9 li a7,22 + ecall + 3c0: 00000073 ecall + ret + 3c4: 8082 ret + +00000000000003c6 : +.global getppid +getppid: + li a7, SYS_getppid + 3c6: 48dd li a7,23 + ecall + 3c8: 00000073 ecall + ret + 3cc: 8082 ret + +00000000000003ce : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 3ce: 48e1 li a7,24 + ecall + 3d0: 00000073 ecall + ret + 3d4: 8082 ret + +00000000000003d6 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3d6: 1101 addi sp,sp,-32 + 3d8: ec06 sd ra,24(sp) + 3da: e822 sd s0,16(sp) + 3dc: 1000 addi s0,sp,32 + 3de: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3e2: 4605 li a2,1 + 3e4: fef40593 addi a1,s0,-17 + 3e8: f57ff0ef jal 33e +} + 3ec: 60e2 ld ra,24(sp) + 3ee: 6442 ld s0,16(sp) + 3f0: 6105 addi sp,sp,32 + 3f2: 8082 ret + +00000000000003f4 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3f4: 715d addi sp,sp,-80 + 3f6: e486 sd ra,72(sp) + 3f8: e0a2 sd s0,64(sp) + 3fa: f84a sd s2,48(sp) + 3fc: 0880 addi s0,sp,80 + 3fe: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 400: c299 beqz a3,406 + 402: 0805c363 bltz a1,488 + neg = 0; + 406: 4881 li a7,0 + 408: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 40c: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 40e: 00000517 auipc a0,0x0 + 412: 58250513 addi a0,a0,1410 # 990 + 416: 883e mv a6,a5 + 418: 2785 addiw a5,a5,1 + 41a: 02c5f733 remu a4,a1,a2 + 41e: 972a add a4,a4,a0 + 420: 00074703 lbu a4,0(a4) + 424: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 428: 872e mv a4,a1 + 42a: 02c5d5b3 divu a1,a1,a2 + 42e: 0685 addi a3,a3,1 + 430: fec773e3 bgeu a4,a2,416 + if(neg) + 434: 00088b63 beqz a7,44a + buf[i++] = '-'; + 438: fd078793 addi a5,a5,-48 + 43c: 97a2 add a5,a5,s0 + 43e: 02d00713 li a4,45 + 442: fee78423 sb a4,-24(a5) + 446: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 44a: 02f05a63 blez a5,47e + 44e: fc26 sd s1,56(sp) + 450: f44e sd s3,40(sp) + 452: fb840713 addi a4,s0,-72 + 456: 00f704b3 add s1,a4,a5 + 45a: fff70993 addi s3,a4,-1 + 45e: 99be add s3,s3,a5 + 460: 37fd addiw a5,a5,-1 + 462: 1782 slli a5,a5,0x20 + 464: 9381 srli a5,a5,0x20 + 466: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 46a: fff4c583 lbu a1,-1(s1) + 46e: 854a mv a0,s2 + 470: f67ff0ef jal 3d6 + while(--i >= 0) + 474: 14fd addi s1,s1,-1 + 476: ff349ae3 bne s1,s3,46a + 47a: 74e2 ld s1,56(sp) + 47c: 79a2 ld s3,40(sp) +} + 47e: 60a6 ld ra,72(sp) + 480: 6406 ld s0,64(sp) + 482: 7942 ld s2,48(sp) + 484: 6161 addi sp,sp,80 + 486: 8082 ret + x = -xx; + 488: 40b005b3 neg a1,a1 + neg = 1; + 48c: 4885 li a7,1 + x = -xx; + 48e: bfad j 408 + +0000000000000490 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 490: 711d addi sp,sp,-96 + 492: ec86 sd ra,88(sp) + 494: e8a2 sd s0,80(sp) + 496: e0ca sd s2,64(sp) + 498: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 49a: 0005c903 lbu s2,0(a1) + 49e: 28090663 beqz s2,72a + 4a2: e4a6 sd s1,72(sp) + 4a4: fc4e sd s3,56(sp) + 4a6: f852 sd s4,48(sp) + 4a8: f456 sd s5,40(sp) + 4aa: f05a sd s6,32(sp) + 4ac: ec5e sd s7,24(sp) + 4ae: e862 sd s8,16(sp) + 4b0: e466 sd s9,8(sp) + 4b2: 8b2a mv s6,a0 + 4b4: 8a2e mv s4,a1 + 4b6: 8bb2 mv s7,a2 + state = 0; + 4b8: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4ba: 4481 li s1,0 + 4bc: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4be: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4c2: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4c6: 06c00c93 li s9,108 + 4ca: a005 j 4ea + putc(fd, c0); + 4cc: 85ca mv a1,s2 + 4ce: 855a mv a0,s6 + 4d0: f07ff0ef jal 3d6 + 4d4: a019 j 4da + } else if(state == '%'){ + 4d6: 03598263 beq s3,s5,4fa + for(i = 0; fmt[i]; i++){ + 4da: 2485 addiw s1,s1,1 + 4dc: 8726 mv a4,s1 + 4de: 009a07b3 add a5,s4,s1 + 4e2: 0007c903 lbu s2,0(a5) + 4e6: 22090a63 beqz s2,71a + c0 = fmt[i] & 0xff; + 4ea: 0009079b sext.w a5,s2 + if(state == 0){ + 4ee: fe0994e3 bnez s3,4d6 + if(c0 == '%'){ + 4f2: fd579de3 bne a5,s5,4cc + state = '%'; + 4f6: 89be mv s3,a5 + 4f8: b7cd j 4da + if(c0) c1 = fmt[i+1] & 0xff; + 4fa: 00ea06b3 add a3,s4,a4 + 4fe: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 502: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 504: c681 beqz a3,50c + 506: 9752 add a4,a4,s4 + 508: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 50c: 05878363 beq a5,s8,552 + } else if(c0 == 'l' && c1 == 'd'){ + 510: 05978d63 beq a5,s9,56a + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 514: 07500713 li a4,117 + 518: 0ee78763 beq a5,a4,606 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 51c: 07800713 li a4,120 + 520: 12e78963 beq a5,a4,652 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 524: 07000713 li a4,112 + 528: 14e78e63 beq a5,a4,684 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 52c: 06300713 li a4,99 + 530: 18e78e63 beq a5,a4,6cc + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 534: 07300713 li a4,115 + 538: 1ae78463 beq a5,a4,6e0 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 53c: 02500713 li a4,37 + 540: 04e79563 bne a5,a4,58a + putc(fd, '%'); + 544: 02500593 li a1,37 + 548: 855a mv a0,s6 + 54a: e8dff0ef jal 3d6 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 54e: 4981 li s3,0 + 550: b769 j 4da + printint(fd, va_arg(ap, int), 10, 1); + 552: 008b8913 addi s2,s7,8 + 556: 4685 li a3,1 + 558: 4629 li a2,10 + 55a: 000ba583 lw a1,0(s7) + 55e: 855a mv a0,s6 + 560: e95ff0ef jal 3f4 + 564: 8bca mv s7,s2 + state = 0; + 566: 4981 li s3,0 + 568: bf8d j 4da + } else if(c0 == 'l' && c1 == 'd'){ + 56a: 06400793 li a5,100 + 56e: 02f68963 beq a3,a5,5a0 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 572: 06c00793 li a5,108 + 576: 04f68263 beq a3,a5,5ba + } else if(c0 == 'l' && c1 == 'u'){ + 57a: 07500793 li a5,117 + 57e: 0af68063 beq a3,a5,61e + } else if(c0 == 'l' && c1 == 'x'){ + 582: 07800793 li a5,120 + 586: 0ef68263 beq a3,a5,66a + putc(fd, '%'); + 58a: 02500593 li a1,37 + 58e: 855a mv a0,s6 + 590: e47ff0ef jal 3d6 + putc(fd, c0); + 594: 85ca mv a1,s2 + 596: 855a mv a0,s6 + 598: e3fff0ef jal 3d6 + state = 0; + 59c: 4981 li s3,0 + 59e: bf35 j 4da + printint(fd, va_arg(ap, uint64), 10, 1); + 5a0: 008b8913 addi s2,s7,8 + 5a4: 4685 li a3,1 + 5a6: 4629 li a2,10 + 5a8: 000bb583 ld a1,0(s7) + 5ac: 855a mv a0,s6 + 5ae: e47ff0ef jal 3f4 + i += 1; + 5b2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5b4: 8bca mv s7,s2 + state = 0; + 5b6: 4981 li s3,0 + i += 1; + 5b8: b70d j 4da + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5ba: 06400793 li a5,100 + 5be: 02f60763 beq a2,a5,5ec + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5c2: 07500793 li a5,117 + 5c6: 06f60963 beq a2,a5,638 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5ca: 07800793 li a5,120 + 5ce: faf61ee3 bne a2,a5,58a + printint(fd, va_arg(ap, uint64), 16, 0); + 5d2: 008b8913 addi s2,s7,8 + 5d6: 4681 li a3,0 + 5d8: 4641 li a2,16 + 5da: 000bb583 ld a1,0(s7) + 5de: 855a mv a0,s6 + 5e0: e15ff0ef jal 3f4 + i += 2; + 5e4: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5e6: 8bca mv s7,s2 + state = 0; + 5e8: 4981 li s3,0 + i += 2; + 5ea: bdc5 j 4da + printint(fd, va_arg(ap, uint64), 10, 1); + 5ec: 008b8913 addi s2,s7,8 + 5f0: 4685 li a3,1 + 5f2: 4629 li a2,10 + 5f4: 000bb583 ld a1,0(s7) + 5f8: 855a mv a0,s6 + 5fa: dfbff0ef jal 3f4 + i += 2; + 5fe: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 600: 8bca mv s7,s2 + state = 0; + 602: 4981 li s3,0 + i += 2; + 604: bdd9 j 4da + printint(fd, va_arg(ap, uint32), 10, 0); + 606: 008b8913 addi s2,s7,8 + 60a: 4681 li a3,0 + 60c: 4629 li a2,10 + 60e: 000be583 lwu a1,0(s7) + 612: 855a mv a0,s6 + 614: de1ff0ef jal 3f4 + 618: 8bca mv s7,s2 + state = 0; + 61a: 4981 li s3,0 + 61c: bd7d j 4da + printint(fd, va_arg(ap, uint64), 10, 0); + 61e: 008b8913 addi s2,s7,8 + 622: 4681 li a3,0 + 624: 4629 li a2,10 + 626: 000bb583 ld a1,0(s7) + 62a: 855a mv a0,s6 + 62c: dc9ff0ef jal 3f4 + i += 1; + 630: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 632: 8bca mv s7,s2 + state = 0; + 634: 4981 li s3,0 + i += 1; + 636: b555 j 4da + printint(fd, va_arg(ap, uint64), 10, 0); + 638: 008b8913 addi s2,s7,8 + 63c: 4681 li a3,0 + 63e: 4629 li a2,10 + 640: 000bb583 ld a1,0(s7) + 644: 855a mv a0,s6 + 646: dafff0ef jal 3f4 + i += 2; + 64a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 64c: 8bca mv s7,s2 + state = 0; + 64e: 4981 li s3,0 + i += 2; + 650: b569 j 4da + printint(fd, va_arg(ap, uint32), 16, 0); + 652: 008b8913 addi s2,s7,8 + 656: 4681 li a3,0 + 658: 4641 li a2,16 + 65a: 000be583 lwu a1,0(s7) + 65e: 855a mv a0,s6 + 660: d95ff0ef jal 3f4 + 664: 8bca mv s7,s2 + state = 0; + 666: 4981 li s3,0 + 668: bd8d j 4da + printint(fd, va_arg(ap, uint64), 16, 0); + 66a: 008b8913 addi s2,s7,8 + 66e: 4681 li a3,0 + 670: 4641 li a2,16 + 672: 000bb583 ld a1,0(s7) + 676: 855a mv a0,s6 + 678: d7dff0ef jal 3f4 + i += 1; + 67c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 67e: 8bca mv s7,s2 + state = 0; + 680: 4981 li s3,0 + i += 1; + 682: bda1 j 4da + 684: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 686: 008b8d13 addi s10,s7,8 + 68a: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 68e: 03000593 li a1,48 + 692: 855a mv a0,s6 + 694: d43ff0ef jal 3d6 + putc(fd, 'x'); + 698: 07800593 li a1,120 + 69c: 855a mv a0,s6 + 69e: d39ff0ef jal 3d6 + 6a2: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6a4: 00000b97 auipc s7,0x0 + 6a8: 2ecb8b93 addi s7,s7,748 # 990 + 6ac: 03c9d793 srli a5,s3,0x3c + 6b0: 97de add a5,a5,s7 + 6b2: 0007c583 lbu a1,0(a5) + 6b6: 855a mv a0,s6 + 6b8: d1fff0ef jal 3d6 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6bc: 0992 slli s3,s3,0x4 + 6be: 397d addiw s2,s2,-1 + 6c0: fe0916e3 bnez s2,6ac + printptr(fd, va_arg(ap, uint64)); + 6c4: 8bea mv s7,s10 + state = 0; + 6c6: 4981 li s3,0 + 6c8: 6d02 ld s10,0(sp) + 6ca: bd01 j 4da + putc(fd, va_arg(ap, uint32)); + 6cc: 008b8913 addi s2,s7,8 + 6d0: 000bc583 lbu a1,0(s7) + 6d4: 855a mv a0,s6 + 6d6: d01ff0ef jal 3d6 + 6da: 8bca mv s7,s2 + state = 0; + 6dc: 4981 li s3,0 + 6de: bbf5 j 4da + if((s = va_arg(ap, char*)) == 0) + 6e0: 008b8993 addi s3,s7,8 + 6e4: 000bb903 ld s2,0(s7) + 6e8: 00090f63 beqz s2,706 + for(; *s; s++) + 6ec: 00094583 lbu a1,0(s2) + 6f0: c195 beqz a1,714 + putc(fd, *s); + 6f2: 855a mv a0,s6 + 6f4: ce3ff0ef jal 3d6 + for(; *s; s++) + 6f8: 0905 addi s2,s2,1 + 6fa: 00094583 lbu a1,0(s2) + 6fe: f9f5 bnez a1,6f2 + if((s = va_arg(ap, char*)) == 0) + 700: 8bce mv s7,s3 + state = 0; + 702: 4981 li s3,0 + 704: bbd9 j 4da + s = "(null)"; + 706: 00000917 auipc s2,0x0 + 70a: 28290913 addi s2,s2,642 # 988 + for(; *s; s++) + 70e: 02800593 li a1,40 + 712: b7c5 j 6f2 + if((s = va_arg(ap, char*)) == 0) + 714: 8bce mv s7,s3 + state = 0; + 716: 4981 li s3,0 + 718: b3c9 j 4da + 71a: 64a6 ld s1,72(sp) + 71c: 79e2 ld s3,56(sp) + 71e: 7a42 ld s4,48(sp) + 720: 7aa2 ld s5,40(sp) + 722: 7b02 ld s6,32(sp) + 724: 6be2 ld s7,24(sp) + 726: 6c42 ld s8,16(sp) + 728: 6ca2 ld s9,8(sp) + } + } +} + 72a: 60e6 ld ra,88(sp) + 72c: 6446 ld s0,80(sp) + 72e: 6906 ld s2,64(sp) + 730: 6125 addi sp,sp,96 + 732: 8082 ret + +0000000000000734 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 734: 715d addi sp,sp,-80 + 736: ec06 sd ra,24(sp) + 738: e822 sd s0,16(sp) + 73a: 1000 addi s0,sp,32 + 73c: e010 sd a2,0(s0) + 73e: e414 sd a3,8(s0) + 740: e818 sd a4,16(s0) + 742: ec1c sd a5,24(s0) + 744: 03043023 sd a6,32(s0) + 748: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 74c: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 750: 8622 mv a2,s0 + 752: d3fff0ef jal 490 +} + 756: 60e2 ld ra,24(sp) + 758: 6442 ld s0,16(sp) + 75a: 6161 addi sp,sp,80 + 75c: 8082 ret + +000000000000075e : + +void +printf(const char *fmt, ...) +{ + 75e: 711d addi sp,sp,-96 + 760: ec06 sd ra,24(sp) + 762: e822 sd s0,16(sp) + 764: 1000 addi s0,sp,32 + 766: e40c sd a1,8(s0) + 768: e810 sd a2,16(s0) + 76a: ec14 sd a3,24(s0) + 76c: f018 sd a4,32(s0) + 76e: f41c sd a5,40(s0) + 770: 03043823 sd a6,48(s0) + 774: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 778: 00840613 addi a2,s0,8 + 77c: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 780: 85aa mv a1,a0 + 782: 4505 li a0,1 + 784: d0dff0ef jal 490 +} + 788: 60e2 ld ra,24(sp) + 78a: 6442 ld s0,16(sp) + 78c: 6125 addi sp,sp,96 + 78e: 8082 ret + +0000000000000790 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 790: 1141 addi sp,sp,-16 + 792: e422 sd s0,8(sp) + 794: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 796: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 79a: 00001797 auipc a5,0x1 + 79e: 8667b783 ld a5,-1946(a5) # 1000 + 7a2: a02d j 7cc + 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; + 7a4: 4618 lw a4,8(a2) + 7a6: 9f2d addw a4,a4,a1 + 7a8: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7ac: 6398 ld a4,0(a5) + 7ae: 6310 ld a2,0(a4) + 7b0: a83d j 7ee + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7b2: ff852703 lw a4,-8(a0) + 7b6: 9f31 addw a4,a4,a2 + 7b8: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7ba: ff053683 ld a3,-16(a0) + 7be: a091 j 802 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7c0: 6398 ld a4,0(a5) + 7c2: 00e7e463 bltu a5,a4,7ca + 7c6: 00e6ea63 bltu a3,a4,7da +{ + 7ca: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7cc: fed7fae3 bgeu a5,a3,7c0 + 7d0: 6398 ld a4,0(a5) + 7d2: 00e6e463 bltu a3,a4,7da + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7d6: fee7eae3 bltu a5,a4,7ca + if(bp + bp->s.size == p->s.ptr){ + 7da: ff852583 lw a1,-8(a0) + 7de: 6390 ld a2,0(a5) + 7e0: 02059813 slli a6,a1,0x20 + 7e4: 01c85713 srli a4,a6,0x1c + 7e8: 9736 add a4,a4,a3 + 7ea: fae60de3 beq a2,a4,7a4 + bp->s.ptr = p->s.ptr->s.ptr; + 7ee: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7f2: 4790 lw a2,8(a5) + 7f4: 02061593 slli a1,a2,0x20 + 7f8: 01c5d713 srli a4,a1,0x1c + 7fc: 973e add a4,a4,a5 + 7fe: fae68ae3 beq a3,a4,7b2 + p->s.ptr = bp->s.ptr; + 802: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 804: 00000717 auipc a4,0x0 + 808: 7ef73e23 sd a5,2044(a4) # 1000 +} + 80c: 6422 ld s0,8(sp) + 80e: 0141 addi sp,sp,16 + 810: 8082 ret + +0000000000000812 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 812: 7139 addi sp,sp,-64 + 814: fc06 sd ra,56(sp) + 816: f822 sd s0,48(sp) + 818: f426 sd s1,40(sp) + 81a: ec4e sd s3,24(sp) + 81c: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 81e: 02051493 slli s1,a0,0x20 + 822: 9081 srli s1,s1,0x20 + 824: 04bd addi s1,s1,15 + 826: 8091 srli s1,s1,0x4 + 828: 0014899b addiw s3,s1,1 + 82c: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 82e: 00000517 auipc a0,0x0 + 832: 7d253503 ld a0,2002(a0) # 1000 + 836: c915 beqz a0,86a + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 838: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 83a: 4798 lw a4,8(a5) + 83c: 08977a63 bgeu a4,s1,8d0 + 840: f04a sd s2,32(sp) + 842: e852 sd s4,16(sp) + 844: e456 sd s5,8(sp) + 846: e05a sd s6,0(sp) + if(nu < 4096) + 848: 8a4e mv s4,s3 + 84a: 0009871b sext.w a4,s3 + 84e: 6685 lui a3,0x1 + 850: 00d77363 bgeu a4,a3,856 + 854: 6a05 lui s4,0x1 + 856: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 85a: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 85e: 00000917 auipc s2,0x0 + 862: 7a290913 addi s2,s2,1954 # 1000 + if(p == SBRK_ERROR) + 866: 5afd li s5,-1 + 868: a081 j 8a8 + 86a: f04a sd s2,32(sp) + 86c: e852 sd s4,16(sp) + 86e: e456 sd s5,8(sp) + 870: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 872: 00001797 auipc a5,0x1 + 876: 99678793 addi a5,a5,-1642 # 1208 + 87a: 00000717 auipc a4,0x0 + 87e: 78f73323 sd a5,1926(a4) # 1000 + 882: e39c sd a5,0(a5) + base.s.size = 0; + 884: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 888: b7c1 j 848 + prevp->s.ptr = p->s.ptr; + 88a: 6398 ld a4,0(a5) + 88c: e118 sd a4,0(a0) + 88e: a8a9 j 8e8 + hp->s.size = nu; + 890: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 894: 0541 addi a0,a0,16 + 896: efbff0ef jal 790 + return freep; + 89a: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 89e: c12d beqz a0,900 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8a0: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8a2: 4798 lw a4,8(a5) + 8a4: 02977263 bgeu a4,s1,8c8 + if(p == freep) + 8a8: 00093703 ld a4,0(s2) + 8ac: 853e mv a0,a5 + 8ae: fef719e3 bne a4,a5,8a0 + p = sbrk(nu * sizeof(Header)); + 8b2: 8552 mv a0,s4 + 8b4: a37ff0ef jal 2ea + if(p == SBRK_ERROR) + 8b8: fd551ce3 bne a0,s5,890 + return 0; + 8bc: 4501 li a0,0 + 8be: 7902 ld s2,32(sp) + 8c0: 6a42 ld s4,16(sp) + 8c2: 6aa2 ld s5,8(sp) + 8c4: 6b02 ld s6,0(sp) + 8c6: a03d j 8f4 + 8c8: 7902 ld s2,32(sp) + 8ca: 6a42 ld s4,16(sp) + 8cc: 6aa2 ld s5,8(sp) + 8ce: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 8d0: fae48de3 beq s1,a4,88a + p->s.size -= nunits; + 8d4: 4137073b subw a4,a4,s3 + 8d8: c798 sw a4,8(a5) + p += p->s.size; + 8da: 02071693 slli a3,a4,0x20 + 8de: 01c6d713 srli a4,a3,0x1c + 8e2: 97ba add a5,a5,a4 + p->s.size = nunits; + 8e4: 0137a423 sw s3,8(a5) + freep = prevp; + 8e8: 00000717 auipc a4,0x0 + 8ec: 70a73c23 sd a0,1816(a4) # 1000 + return (void*)(p + 1); + 8f0: 01078513 addi a0,a5,16 + } +} + 8f4: 70e2 ld ra,56(sp) + 8f6: 7442 ld s0,48(sp) + 8f8: 74a2 ld s1,40(sp) + 8fa: 69e2 ld s3,24(sp) + 8fc: 6121 addi sp,sp,64 + 8fe: 8082 ret + 900: 7902 ld s2,32(sp) + 902: 6a42 ld s4,16(sp) + 904: 6aa2 ld s5,8(sp) + 906: 6b02 ld s6,0(sp) + 908: b7f5 j 8f4 diff --git a/user/dorphan.c b/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.c similarity index 100% rename from user/dorphan.c rename to G12_Project1_xv6CustomizeSystemCalls/user/dorphan.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.d b/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.d new file mode 100644 index 0000000000..e4a1607984 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.d @@ -0,0 +1,2 @@ +user/dorphan.o: user/dorphan.c kernel/types.h kernel/stat.h \ + kernel/fcntl.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.o b/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.o new file mode 100644 index 0000000000..b599ab6068 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.sym b/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.sym new file mode 100644 index 0000000000..1a914ca825 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/dorphan.sym @@ -0,0 +1,69 @@ +0000000000000000 .text +0000000000000910 .rodata +00000000000009a8 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 dorphan.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003d6 putc +00000000000003f4 printint +0000000000000990 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001208 base +000000000000009a strcpy +00000000000003ae pause +000000000000075e printf +00000000000003a6 sys_sbrk +0000000000000244 memmove +0000000000000366 mknod +0000000000000152 gets +000000000000039e getpid +00000000000002d6 memcpy +0000000000000812 malloc +0000000000000300 sbrklazy +000000000000032e pipe +000000000000033e write +0000000000000376 fstat +0000000000000734 fprintf +000000000000034e kill +0000000000000490 vprintf +000000000000038e chdir +0000000000000356 exec +0000000000000326 wait +00000000000003be getprocsinfo +0000000000000336 read +000000000000036e unlink +000000000000029c memcmp +0000000000000316 fork +00000000000002ea sbrk +00000000000003b6 uptime +000000000000010c memset +0000000000000000 main +00000000000003c6 getppid +00000000000000b6 strcmp +0000000000000396 dup +0000000000001010 buf +00000000000001c2 stat +00000000000003ce sleep2 +000000000000037e link +000000000000031e exit +000000000000008a start +00000000000001fc atoi +00000000000000e2 strlen +000000000000035e open +000000000000012e strchr +0000000000000386 mkdir +0000000000000346 close +0000000000000790 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/echo.asm b/G12_Project1_xv6CustomizeSystemCalls/user/echo.asm new file mode 100644 index 0000000000..e357c957d0 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/echo.asm @@ -0,0 +1,1542 @@ + +user/_echo: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(int argc, char *argv[]) +{ + 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 + int i; + + for(i = 1; i < argc; i++){ + 12: 4785 li a5,1 + 14: 06a7d063 bge a5,a0,74 + 18: 00858493 addi s1,a1,8 + 1c: 3579 addiw a0,a0,-2 + 1e: 02051793 slli a5,a0,0x20 + 22: 01d7d513 srli a0,a5,0x1d + 26: 00a48a33 add s4,s1,a0 + 2a: 05c1 addi a1,a1,16 + 2c: 00a589b3 add s3,a1,a0 + write(1, argv[i], strlen(argv[i])); + if(i + 1 < argc){ + write(1, " ", 1); + 30: 00001a97 auipc s5,0x1 + 34: 8d0a8a93 addi s5,s5,-1840 # 900 + 38: a809 j 4a + 3a: 4605 li a2,1 + 3c: 85d6 mv a1,s5 + 3e: 4505 li a0,1 + 40: 2ee000ef jal 32e + for(i = 1; i < argc; i++){ + 44: 04a1 addi s1,s1,8 + 46: 03348763 beq s1,s3,74 + write(1, argv[i], strlen(argv[i])); + 4a: 0004b903 ld s2,0(s1) + 4e: 854a mv a0,s2 + 50: 082000ef jal d2 + 54: 0005061b sext.w a2,a0 + 58: 85ca mv a1,s2 + 5a: 4505 li a0,1 + 5c: 2d2000ef jal 32e + if(i + 1 < argc){ + 60: fd449de3 bne s1,s4,3a + } else { + write(1, "\n", 1); + 64: 4605 li a2,1 + 66: 00001597 auipc a1,0x1 + 6a: 8a258593 addi a1,a1,-1886 # 908 + 6e: 4505 li a0,1 + 70: 2be000ef jal 32e + } + } + exit(0); + 74: 4501 li a0,0 + 76: 298000ef jal 30e + +000000000000007a : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 7a: 1141 addi sp,sp,-16 + 7c: e406 sd ra,8(sp) + 7e: e022 sd s0,0(sp) + 80: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 82: f7fff0ef jal 0
+ exit(r); + 86: 288000ef jal 30e + +000000000000008a : +} + +char* +strcpy(char *s, const char *t) +{ + 8a: 1141 addi sp,sp,-16 + 8c: e422 sd s0,8(sp) + 8e: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 90: 87aa mv a5,a0 + 92: 0585 addi a1,a1,1 + 94: 0785 addi a5,a5,1 + 96: fff5c703 lbu a4,-1(a1) + 9a: fee78fa3 sb a4,-1(a5) + 9e: fb75 bnez a4,92 + ; + return os; +} + a0: 6422 ld s0,8(sp) + a2: 0141 addi sp,sp,16 + a4: 8082 ret + +00000000000000a6 : + +int +strcmp(const char *p, const char *q) +{ + a6: 1141 addi sp,sp,-16 + a8: e422 sd s0,8(sp) + aa: 0800 addi s0,sp,16 + while(*p && *p == *q) + ac: 00054783 lbu a5,0(a0) + b0: cb91 beqz a5,c4 + b2: 0005c703 lbu a4,0(a1) + b6: 00f71763 bne a4,a5,c4 + p++, q++; + ba: 0505 addi a0,a0,1 + bc: 0585 addi a1,a1,1 + while(*p && *p == *q) + be: 00054783 lbu a5,0(a0) + c2: fbe5 bnez a5,b2 + return (uchar)*p - (uchar)*q; + c4: 0005c503 lbu a0,0(a1) +} + c8: 40a7853b subw a0,a5,a0 + cc: 6422 ld s0,8(sp) + ce: 0141 addi sp,sp,16 + d0: 8082 ret + +00000000000000d2 : + +uint +strlen(const char *s) +{ + d2: 1141 addi sp,sp,-16 + d4: e422 sd s0,8(sp) + d6: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + d8: 00054783 lbu a5,0(a0) + dc: cf91 beqz a5,f8 + de: 0505 addi a0,a0,1 + e0: 87aa mv a5,a0 + e2: 86be mv a3,a5 + e4: 0785 addi a5,a5,1 + e6: fff7c703 lbu a4,-1(a5) + ea: ff65 bnez a4,e2 + ec: 40a6853b subw a0,a3,a0 + f0: 2505 addiw a0,a0,1 + ; + return n; +} + f2: 6422 ld s0,8(sp) + f4: 0141 addi sp,sp,16 + f6: 8082 ret + for(n = 0; s[n]; n++) + f8: 4501 li a0,0 + fa: bfe5 j f2 + +00000000000000fc : + +void* +memset(void *dst, int c, uint n) +{ + fc: 1141 addi sp,sp,-16 + fe: e422 sd s0,8(sp) + 100: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 102: ca19 beqz a2,118 + 104: 87aa mv a5,a0 + 106: 1602 slli a2,a2,0x20 + 108: 9201 srli a2,a2,0x20 + 10a: 00a60733 add a4,a2,a0 + cdst[i] = c; + 10e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 112: 0785 addi a5,a5,1 + 114: fee79de3 bne a5,a4,10e + } + return dst; +} + 118: 6422 ld s0,8(sp) + 11a: 0141 addi sp,sp,16 + 11c: 8082 ret + +000000000000011e : + +char* +strchr(const char *s, char c) +{ + 11e: 1141 addi sp,sp,-16 + 120: e422 sd s0,8(sp) + 122: 0800 addi s0,sp,16 + for(; *s; s++) + 124: 00054783 lbu a5,0(a0) + 128: cb99 beqz a5,13e + if(*s == c) + 12a: 00f58763 beq a1,a5,138 + for(; *s; s++) + 12e: 0505 addi a0,a0,1 + 130: 00054783 lbu a5,0(a0) + 134: fbfd bnez a5,12a + return (char*)s; + return 0; + 136: 4501 li a0,0 +} + 138: 6422 ld s0,8(sp) + 13a: 0141 addi sp,sp,16 + 13c: 8082 ret + return 0; + 13e: 4501 li a0,0 + 140: bfe5 j 138 + +0000000000000142 : + +char* +gets(char *buf, int max) +{ + 142: 711d addi sp,sp,-96 + 144: ec86 sd ra,88(sp) + 146: e8a2 sd s0,80(sp) + 148: e4a6 sd s1,72(sp) + 14a: e0ca sd s2,64(sp) + 14c: fc4e sd s3,56(sp) + 14e: f852 sd s4,48(sp) + 150: f456 sd s5,40(sp) + 152: f05a sd s6,32(sp) + 154: ec5e sd s7,24(sp) + 156: 1080 addi s0,sp,96 + 158: 8baa mv s7,a0 + 15a: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 15c: 892a mv s2,a0 + 15e: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 160: 4aa9 li s5,10 + 162: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 164: 89a6 mv s3,s1 + 166: 2485 addiw s1,s1,1 + 168: 0344d663 bge s1,s4,194 + cc = read(0, &c, 1); + 16c: 4605 li a2,1 + 16e: faf40593 addi a1,s0,-81 + 172: 4501 li a0,0 + 174: 1b2000ef jal 326 + if(cc < 1) + 178: 00a05e63 blez a0,194 + buf[i++] = c; + 17c: faf44783 lbu a5,-81(s0) + 180: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 184: 01578763 beq a5,s5,192 + 188: 0905 addi s2,s2,1 + 18a: fd679de3 bne a5,s6,164 + buf[i++] = c; + 18e: 89a6 mv s3,s1 + 190: a011 j 194 + 192: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 194: 99de add s3,s3,s7 + 196: 00098023 sb zero,0(s3) + return buf; +} + 19a: 855e mv a0,s7 + 19c: 60e6 ld ra,88(sp) + 19e: 6446 ld s0,80(sp) + 1a0: 64a6 ld s1,72(sp) + 1a2: 6906 ld s2,64(sp) + 1a4: 79e2 ld s3,56(sp) + 1a6: 7a42 ld s4,48(sp) + 1a8: 7aa2 ld s5,40(sp) + 1aa: 7b02 ld s6,32(sp) + 1ac: 6be2 ld s7,24(sp) + 1ae: 6125 addi sp,sp,96 + 1b0: 8082 ret + +00000000000001b2 : + +int +stat(const char *n, struct stat *st) +{ + 1b2: 1101 addi sp,sp,-32 + 1b4: ec06 sd ra,24(sp) + 1b6: e822 sd s0,16(sp) + 1b8: e04a sd s2,0(sp) + 1ba: 1000 addi s0,sp,32 + 1bc: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1be: 4581 li a1,0 + 1c0: 18e000ef jal 34e + if(fd < 0) + 1c4: 02054263 bltz a0,1e8 + 1c8: e426 sd s1,8(sp) + 1ca: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1cc: 85ca mv a1,s2 + 1ce: 198000ef jal 366 + 1d2: 892a mv s2,a0 + close(fd); + 1d4: 8526 mv a0,s1 + 1d6: 160000ef jal 336 + return r; + 1da: 64a2 ld s1,8(sp) +} + 1dc: 854a mv a0,s2 + 1de: 60e2 ld ra,24(sp) + 1e0: 6442 ld s0,16(sp) + 1e2: 6902 ld s2,0(sp) + 1e4: 6105 addi sp,sp,32 + 1e6: 8082 ret + return -1; + 1e8: 597d li s2,-1 + 1ea: bfcd j 1dc + +00000000000001ec : + +int +atoi(const char *s) +{ + 1ec: 1141 addi sp,sp,-16 + 1ee: e422 sd s0,8(sp) + 1f0: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1f2: 00054683 lbu a3,0(a0) + 1f6: fd06879b addiw a5,a3,-48 + 1fa: 0ff7f793 zext.b a5,a5 + 1fe: 4625 li a2,9 + 200: 02f66863 bltu a2,a5,230 + 204: 872a mv a4,a0 + n = 0; + 206: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 208: 0705 addi a4,a4,1 + 20a: 0025179b slliw a5,a0,0x2 + 20e: 9fa9 addw a5,a5,a0 + 210: 0017979b slliw a5,a5,0x1 + 214: 9fb5 addw a5,a5,a3 + 216: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 21a: 00074683 lbu a3,0(a4) + 21e: fd06879b addiw a5,a3,-48 + 222: 0ff7f793 zext.b a5,a5 + 226: fef671e3 bgeu a2,a5,208 + return n; +} + 22a: 6422 ld s0,8(sp) + 22c: 0141 addi sp,sp,16 + 22e: 8082 ret + n = 0; + 230: 4501 li a0,0 + 232: bfe5 j 22a + +0000000000000234 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 234: 1141 addi sp,sp,-16 + 236: e422 sd s0,8(sp) + 238: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 23a: 02b57463 bgeu a0,a1,262 + while(n-- > 0) + 23e: 00c05f63 blez a2,25c + 242: 1602 slli a2,a2,0x20 + 244: 9201 srli a2,a2,0x20 + 246: 00c507b3 add a5,a0,a2 + dst = vdst; + 24a: 872a mv a4,a0 + *dst++ = *src++; + 24c: 0585 addi a1,a1,1 + 24e: 0705 addi a4,a4,1 + 250: fff5c683 lbu a3,-1(a1) + 254: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 258: fef71ae3 bne a4,a5,24c + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 25c: 6422 ld s0,8(sp) + 25e: 0141 addi sp,sp,16 + 260: 8082 ret + dst += n; + 262: 00c50733 add a4,a0,a2 + src += n; + 266: 95b2 add a1,a1,a2 + while(n-- > 0) + 268: fec05ae3 blez a2,25c + 26c: fff6079b addiw a5,a2,-1 + 270: 1782 slli a5,a5,0x20 + 272: 9381 srli a5,a5,0x20 + 274: fff7c793 not a5,a5 + 278: 97ba add a5,a5,a4 + *--dst = *--src; + 27a: 15fd addi a1,a1,-1 + 27c: 177d addi a4,a4,-1 + 27e: 0005c683 lbu a3,0(a1) + 282: 00d70023 sb a3,0(a4) + while(n-- > 0) + 286: fee79ae3 bne a5,a4,27a + 28a: bfc9 j 25c + +000000000000028c : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 28c: 1141 addi sp,sp,-16 + 28e: e422 sd s0,8(sp) + 290: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 292: ca05 beqz a2,2c2 + 294: fff6069b addiw a3,a2,-1 + 298: 1682 slli a3,a3,0x20 + 29a: 9281 srli a3,a3,0x20 + 29c: 0685 addi a3,a3,1 + 29e: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2a0: 00054783 lbu a5,0(a0) + 2a4: 0005c703 lbu a4,0(a1) + 2a8: 00e79863 bne a5,a4,2b8 + return *p1 - *p2; + } + p1++; + 2ac: 0505 addi a0,a0,1 + p2++; + 2ae: 0585 addi a1,a1,1 + while (n-- > 0) { + 2b0: fed518e3 bne a0,a3,2a0 + } + return 0; + 2b4: 4501 li a0,0 + 2b6: a019 j 2bc + return *p1 - *p2; + 2b8: 40e7853b subw a0,a5,a4 +} + 2bc: 6422 ld s0,8(sp) + 2be: 0141 addi sp,sp,16 + 2c0: 8082 ret + return 0; + 2c2: 4501 li a0,0 + 2c4: bfe5 j 2bc + +00000000000002c6 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2c6: 1141 addi sp,sp,-16 + 2c8: e406 sd ra,8(sp) + 2ca: e022 sd s0,0(sp) + 2cc: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2ce: f67ff0ef jal 234 +} + 2d2: 60a2 ld ra,8(sp) + 2d4: 6402 ld s0,0(sp) + 2d6: 0141 addi sp,sp,16 + 2d8: 8082 ret + +00000000000002da : + +char * +sbrk(int n) { + 2da: 1141 addi sp,sp,-16 + 2dc: e406 sd ra,8(sp) + 2de: e022 sd s0,0(sp) + 2e0: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2e2: 4585 li a1,1 + 2e4: 0b2000ef jal 396 +} + 2e8: 60a2 ld ra,8(sp) + 2ea: 6402 ld s0,0(sp) + 2ec: 0141 addi sp,sp,16 + 2ee: 8082 ret + +00000000000002f0 : + +char * +sbrklazy(int 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 sys_sbrk(n, SBRK_LAZY); + 2f8: 4589 li a1,2 + 2fa: 09c000ef jal 396 +} + 2fe: 60a2 ld ra,8(sp) + 300: 6402 ld s0,0(sp) + 302: 0141 addi sp,sp,16 + 304: 8082 ret + +0000000000000306 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 306: 4885 li a7,1 + ecall + 308: 00000073 ecall + ret + 30c: 8082 ret + +000000000000030e : +.global exit +exit: + li a7, SYS_exit + 30e: 4889 li a7,2 + ecall + 310: 00000073 ecall + ret + 314: 8082 ret + +0000000000000316 : +.global wait +wait: + li a7, SYS_wait + 316: 488d li a7,3 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e : +.global pipe +pipe: + li a7, SYS_pipe + 31e: 4891 li a7,4 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 : +.global read +read: + li a7, SYS_read + 326: 4895 li a7,5 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e : +.global write +write: + li a7, SYS_write + 32e: 48c1 li a7,16 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 : +.global close +close: + li a7, SYS_close + 336: 48d5 li a7,21 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e : +.global kill +kill: + li a7, SYS_kill + 33e: 4899 li a7,6 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 : +.global exec +exec: + li a7, SYS_exec + 346: 489d li a7,7 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e : +.global open +open: + li a7, SYS_open + 34e: 48bd li a7,15 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 : +.global mknod +mknod: + li a7, SYS_mknod + 356: 48c5 li a7,17 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e : +.global unlink +unlink: + li a7, SYS_unlink + 35e: 48c9 li a7,18 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 : +.global fstat +fstat: + li a7, SYS_fstat + 366: 48a1 li a7,8 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e : +.global link +link: + li a7, SYS_link + 36e: 48cd li a7,19 + ecall + 370: 00000073 ecall + ret + 374: 8082 ret + +0000000000000376 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 376: 48d1 li a7,20 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e : +.global chdir +chdir: + li a7, SYS_chdir + 37e: 48a5 li a7,9 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 : +.global dup +dup: + li a7, SYS_dup + 386: 48a9 li a7,10 + ecall + 388: 00000073 ecall + ret + 38c: 8082 ret + +000000000000038e : +.global getpid +getpid: + li a7, SYS_getpid + 38e: 48ad li a7,11 + ecall + 390: 00000073 ecall + ret + 394: 8082 ret + +0000000000000396 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 396: 48b1 li a7,12 + ecall + 398: 00000073 ecall + ret + 39c: 8082 ret + +000000000000039e : +.global pause +pause: + li a7, SYS_pause + 39e: 48b5 li a7,13 + ecall + 3a0: 00000073 ecall + ret + 3a4: 8082 ret + +00000000000003a6 : +.global uptime +uptime: + li a7, SYS_uptime + 3a6: 48b9 li a7,14 + ecall + 3a8: 00000073 ecall + ret + 3ac: 8082 ret + +00000000000003ae : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 3ae: 48d9 li a7,22 + ecall + 3b0: 00000073 ecall + ret + 3b4: 8082 ret + +00000000000003b6 : +.global getppid +getppid: + li a7, SYS_getppid + 3b6: 48dd li a7,23 + ecall + 3b8: 00000073 ecall + ret + 3bc: 8082 ret + +00000000000003be : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 3be: 48e1 li a7,24 + ecall + 3c0: 00000073 ecall + ret + 3c4: 8082 ret + +00000000000003c6 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3c6: 1101 addi sp,sp,-32 + 3c8: ec06 sd ra,24(sp) + 3ca: e822 sd s0,16(sp) + 3cc: 1000 addi s0,sp,32 + 3ce: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3d2: 4605 li a2,1 + 3d4: fef40593 addi a1,s0,-17 + 3d8: f57ff0ef jal 32e +} + 3dc: 60e2 ld ra,24(sp) + 3de: 6442 ld s0,16(sp) + 3e0: 6105 addi sp,sp,32 + 3e2: 8082 ret + +00000000000003e4 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3e4: 715d addi sp,sp,-80 + 3e6: e486 sd ra,72(sp) + 3e8: e0a2 sd s0,64(sp) + 3ea: f84a sd s2,48(sp) + 3ec: 0880 addi s0,sp,80 + 3ee: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3f0: c299 beqz a3,3f6 + 3f2: 0805c363 bltz a1,478 + neg = 0; + 3f6: 4881 li a7,0 + 3f8: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3fc: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3fe: 00000517 auipc a0,0x0 + 402: 51a50513 addi a0,a0,1306 # 918 + 406: 883e mv a6,a5 + 408: 2785 addiw a5,a5,1 + 40a: 02c5f733 remu a4,a1,a2 + 40e: 972a add a4,a4,a0 + 410: 00074703 lbu a4,0(a4) + 414: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 418: 872e mv a4,a1 + 41a: 02c5d5b3 divu a1,a1,a2 + 41e: 0685 addi a3,a3,1 + 420: fec773e3 bgeu a4,a2,406 + if(neg) + 424: 00088b63 beqz a7,43a + buf[i++] = '-'; + 428: fd078793 addi a5,a5,-48 + 42c: 97a2 add a5,a5,s0 + 42e: 02d00713 li a4,45 + 432: fee78423 sb a4,-24(a5) + 436: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 43a: 02f05a63 blez a5,46e + 43e: fc26 sd s1,56(sp) + 440: f44e sd s3,40(sp) + 442: fb840713 addi a4,s0,-72 + 446: 00f704b3 add s1,a4,a5 + 44a: fff70993 addi s3,a4,-1 + 44e: 99be add s3,s3,a5 + 450: 37fd addiw a5,a5,-1 + 452: 1782 slli a5,a5,0x20 + 454: 9381 srli a5,a5,0x20 + 456: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 45a: fff4c583 lbu a1,-1(s1) + 45e: 854a mv a0,s2 + 460: f67ff0ef jal 3c6 + while(--i >= 0) + 464: 14fd addi s1,s1,-1 + 466: ff349ae3 bne s1,s3,45a + 46a: 74e2 ld s1,56(sp) + 46c: 79a2 ld s3,40(sp) +} + 46e: 60a6 ld ra,72(sp) + 470: 6406 ld s0,64(sp) + 472: 7942 ld s2,48(sp) + 474: 6161 addi sp,sp,80 + 476: 8082 ret + x = -xx; + 478: 40b005b3 neg a1,a1 + neg = 1; + 47c: 4885 li a7,1 + x = -xx; + 47e: bfad j 3f8 + +0000000000000480 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 480: 711d addi sp,sp,-96 + 482: ec86 sd ra,88(sp) + 484: e8a2 sd s0,80(sp) + 486: e0ca sd s2,64(sp) + 488: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 48a: 0005c903 lbu s2,0(a1) + 48e: 28090663 beqz s2,71a + 492: e4a6 sd s1,72(sp) + 494: fc4e sd s3,56(sp) + 496: f852 sd s4,48(sp) + 498: f456 sd s5,40(sp) + 49a: f05a sd s6,32(sp) + 49c: ec5e sd s7,24(sp) + 49e: e862 sd s8,16(sp) + 4a0: e466 sd s9,8(sp) + 4a2: 8b2a mv s6,a0 + 4a4: 8a2e mv s4,a1 + 4a6: 8bb2 mv s7,a2 + state = 0; + 4a8: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4aa: 4481 li s1,0 + 4ac: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4ae: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4b2: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4b6: 06c00c93 li s9,108 + 4ba: a005 j 4da + putc(fd, c0); + 4bc: 85ca mv a1,s2 + 4be: 855a mv a0,s6 + 4c0: f07ff0ef jal 3c6 + 4c4: a019 j 4ca + } else if(state == '%'){ + 4c6: 03598263 beq s3,s5,4ea + for(i = 0; fmt[i]; i++){ + 4ca: 2485 addiw s1,s1,1 + 4cc: 8726 mv a4,s1 + 4ce: 009a07b3 add a5,s4,s1 + 4d2: 0007c903 lbu s2,0(a5) + 4d6: 22090a63 beqz s2,70a + c0 = fmt[i] & 0xff; + 4da: 0009079b sext.w a5,s2 + if(state == 0){ + 4de: fe0994e3 bnez s3,4c6 + if(c0 == '%'){ + 4e2: fd579de3 bne a5,s5,4bc + state = '%'; + 4e6: 89be mv s3,a5 + 4e8: b7cd j 4ca + if(c0) c1 = fmt[i+1] & 0xff; + 4ea: 00ea06b3 add a3,s4,a4 + 4ee: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4f2: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4f4: c681 beqz a3,4fc + 4f6: 9752 add a4,a4,s4 + 4f8: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4fc: 05878363 beq a5,s8,542 + } else if(c0 == 'l' && c1 == 'd'){ + 500: 05978d63 beq a5,s9,55a + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 504: 07500713 li a4,117 + 508: 0ee78763 beq a5,a4,5f6 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 50c: 07800713 li a4,120 + 510: 12e78963 beq a5,a4,642 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 514: 07000713 li a4,112 + 518: 14e78e63 beq a5,a4,674 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 51c: 06300713 li a4,99 + 520: 18e78e63 beq a5,a4,6bc + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 524: 07300713 li a4,115 + 528: 1ae78463 beq a5,a4,6d0 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 52c: 02500713 li a4,37 + 530: 04e79563 bne a5,a4,57a + putc(fd, '%'); + 534: 02500593 li a1,37 + 538: 855a mv a0,s6 + 53a: e8dff0ef jal 3c6 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 53e: 4981 li s3,0 + 540: b769 j 4ca + printint(fd, va_arg(ap, int), 10, 1); + 542: 008b8913 addi s2,s7,8 + 546: 4685 li a3,1 + 548: 4629 li a2,10 + 54a: 000ba583 lw a1,0(s7) + 54e: 855a mv a0,s6 + 550: e95ff0ef jal 3e4 + 554: 8bca mv s7,s2 + state = 0; + 556: 4981 li s3,0 + 558: bf8d j 4ca + } else if(c0 == 'l' && c1 == 'd'){ + 55a: 06400793 li a5,100 + 55e: 02f68963 beq a3,a5,590 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 562: 06c00793 li a5,108 + 566: 04f68263 beq a3,a5,5aa + } else if(c0 == 'l' && c1 == 'u'){ + 56a: 07500793 li a5,117 + 56e: 0af68063 beq a3,a5,60e + } else if(c0 == 'l' && c1 == 'x'){ + 572: 07800793 li a5,120 + 576: 0ef68263 beq a3,a5,65a + putc(fd, '%'); + 57a: 02500593 li a1,37 + 57e: 855a mv a0,s6 + 580: e47ff0ef jal 3c6 + putc(fd, c0); + 584: 85ca mv a1,s2 + 586: 855a mv a0,s6 + 588: e3fff0ef jal 3c6 + state = 0; + 58c: 4981 li s3,0 + 58e: bf35 j 4ca + printint(fd, va_arg(ap, uint64), 10, 1); + 590: 008b8913 addi s2,s7,8 + 594: 4685 li a3,1 + 596: 4629 li a2,10 + 598: 000bb583 ld a1,0(s7) + 59c: 855a mv a0,s6 + 59e: e47ff0ef jal 3e4 + i += 1; + 5a2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5a4: 8bca mv s7,s2 + state = 0; + 5a6: 4981 li s3,0 + i += 1; + 5a8: b70d j 4ca + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5aa: 06400793 li a5,100 + 5ae: 02f60763 beq a2,a5,5dc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5b2: 07500793 li a5,117 + 5b6: 06f60963 beq a2,a5,628 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5ba: 07800793 li a5,120 + 5be: faf61ee3 bne a2,a5,57a + printint(fd, va_arg(ap, uint64), 16, 0); + 5c2: 008b8913 addi s2,s7,8 + 5c6: 4681 li a3,0 + 5c8: 4641 li a2,16 + 5ca: 000bb583 ld a1,0(s7) + 5ce: 855a mv a0,s6 + 5d0: e15ff0ef jal 3e4 + i += 2; + 5d4: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5d6: 8bca mv s7,s2 + state = 0; + 5d8: 4981 li s3,0 + i += 2; + 5da: bdc5 j 4ca + printint(fd, va_arg(ap, uint64), 10, 1); + 5dc: 008b8913 addi s2,s7,8 + 5e0: 4685 li a3,1 + 5e2: 4629 li a2,10 + 5e4: 000bb583 ld a1,0(s7) + 5e8: 855a mv a0,s6 + 5ea: dfbff0ef jal 3e4 + i += 2; + 5ee: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5f0: 8bca mv s7,s2 + state = 0; + 5f2: 4981 li s3,0 + i += 2; + 5f4: bdd9 j 4ca + printint(fd, va_arg(ap, uint32), 10, 0); + 5f6: 008b8913 addi s2,s7,8 + 5fa: 4681 li a3,0 + 5fc: 4629 li a2,10 + 5fe: 000be583 lwu a1,0(s7) + 602: 855a mv a0,s6 + 604: de1ff0ef jal 3e4 + 608: 8bca mv s7,s2 + state = 0; + 60a: 4981 li s3,0 + 60c: bd7d j 4ca + printint(fd, va_arg(ap, uint64), 10, 0); + 60e: 008b8913 addi s2,s7,8 + 612: 4681 li a3,0 + 614: 4629 li a2,10 + 616: 000bb583 ld a1,0(s7) + 61a: 855a mv a0,s6 + 61c: dc9ff0ef jal 3e4 + i += 1; + 620: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 622: 8bca mv s7,s2 + state = 0; + 624: 4981 li s3,0 + i += 1; + 626: b555 j 4ca + printint(fd, va_arg(ap, uint64), 10, 0); + 628: 008b8913 addi s2,s7,8 + 62c: 4681 li a3,0 + 62e: 4629 li a2,10 + 630: 000bb583 ld a1,0(s7) + 634: 855a mv a0,s6 + 636: dafff0ef jal 3e4 + i += 2; + 63a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 63c: 8bca mv s7,s2 + state = 0; + 63e: 4981 li s3,0 + i += 2; + 640: b569 j 4ca + printint(fd, va_arg(ap, uint32), 16, 0); + 642: 008b8913 addi s2,s7,8 + 646: 4681 li a3,0 + 648: 4641 li a2,16 + 64a: 000be583 lwu a1,0(s7) + 64e: 855a mv a0,s6 + 650: d95ff0ef jal 3e4 + 654: 8bca mv s7,s2 + state = 0; + 656: 4981 li s3,0 + 658: bd8d j 4ca + printint(fd, va_arg(ap, uint64), 16, 0); + 65a: 008b8913 addi s2,s7,8 + 65e: 4681 li a3,0 + 660: 4641 li a2,16 + 662: 000bb583 ld a1,0(s7) + 666: 855a mv a0,s6 + 668: d7dff0ef jal 3e4 + i += 1; + 66c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 66e: 8bca mv s7,s2 + state = 0; + 670: 4981 li s3,0 + i += 1; + 672: bda1 j 4ca + 674: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 676: 008b8d13 addi s10,s7,8 + 67a: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 67e: 03000593 li a1,48 + 682: 855a mv a0,s6 + 684: d43ff0ef jal 3c6 + putc(fd, 'x'); + 688: 07800593 li a1,120 + 68c: 855a mv a0,s6 + 68e: d39ff0ef jal 3c6 + 692: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 694: 00000b97 auipc s7,0x0 + 698: 284b8b93 addi s7,s7,644 # 918 + 69c: 03c9d793 srli a5,s3,0x3c + 6a0: 97de add a5,a5,s7 + 6a2: 0007c583 lbu a1,0(a5) + 6a6: 855a mv a0,s6 + 6a8: d1fff0ef jal 3c6 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6ac: 0992 slli s3,s3,0x4 + 6ae: 397d addiw s2,s2,-1 + 6b0: fe0916e3 bnez s2,69c + printptr(fd, va_arg(ap, uint64)); + 6b4: 8bea mv s7,s10 + state = 0; + 6b6: 4981 li s3,0 + 6b8: 6d02 ld s10,0(sp) + 6ba: bd01 j 4ca + putc(fd, va_arg(ap, uint32)); + 6bc: 008b8913 addi s2,s7,8 + 6c0: 000bc583 lbu a1,0(s7) + 6c4: 855a mv a0,s6 + 6c6: d01ff0ef jal 3c6 + 6ca: 8bca mv s7,s2 + state = 0; + 6cc: 4981 li s3,0 + 6ce: bbf5 j 4ca + if((s = va_arg(ap, char*)) == 0) + 6d0: 008b8993 addi s3,s7,8 + 6d4: 000bb903 ld s2,0(s7) + 6d8: 00090f63 beqz s2,6f6 + for(; *s; s++) + 6dc: 00094583 lbu a1,0(s2) + 6e0: c195 beqz a1,704 + putc(fd, *s); + 6e2: 855a mv a0,s6 + 6e4: ce3ff0ef jal 3c6 + for(; *s; s++) + 6e8: 0905 addi s2,s2,1 + 6ea: 00094583 lbu a1,0(s2) + 6ee: f9f5 bnez a1,6e2 + if((s = va_arg(ap, char*)) == 0) + 6f0: 8bce mv s7,s3 + state = 0; + 6f2: 4981 li s3,0 + 6f4: bbd9 j 4ca + s = "(null)"; + 6f6: 00000917 auipc s2,0x0 + 6fa: 21a90913 addi s2,s2,538 # 910 + for(; *s; s++) + 6fe: 02800593 li a1,40 + 702: b7c5 j 6e2 + if((s = va_arg(ap, char*)) == 0) + 704: 8bce mv s7,s3 + state = 0; + 706: 4981 li s3,0 + 708: b3c9 j 4ca + 70a: 64a6 ld s1,72(sp) + 70c: 79e2 ld s3,56(sp) + 70e: 7a42 ld s4,48(sp) + 710: 7aa2 ld s5,40(sp) + 712: 7b02 ld s6,32(sp) + 714: 6be2 ld s7,24(sp) + 716: 6c42 ld s8,16(sp) + 718: 6ca2 ld s9,8(sp) + } + } +} + 71a: 60e6 ld ra,88(sp) + 71c: 6446 ld s0,80(sp) + 71e: 6906 ld s2,64(sp) + 720: 6125 addi sp,sp,96 + 722: 8082 ret + +0000000000000724 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 724: 715d addi sp,sp,-80 + 726: ec06 sd ra,24(sp) + 728: e822 sd s0,16(sp) + 72a: 1000 addi s0,sp,32 + 72c: e010 sd a2,0(s0) + 72e: e414 sd a3,8(s0) + 730: e818 sd a4,16(s0) + 732: ec1c sd a5,24(s0) + 734: 03043023 sd a6,32(s0) + 738: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 73c: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 740: 8622 mv a2,s0 + 742: d3fff0ef jal 480 +} + 746: 60e2 ld ra,24(sp) + 748: 6442 ld s0,16(sp) + 74a: 6161 addi sp,sp,80 + 74c: 8082 ret + +000000000000074e : + +void +printf(const char *fmt, ...) +{ + 74e: 711d addi sp,sp,-96 + 750: ec06 sd ra,24(sp) + 752: e822 sd s0,16(sp) + 754: 1000 addi s0,sp,32 + 756: e40c sd a1,8(s0) + 758: e810 sd a2,16(s0) + 75a: ec14 sd a3,24(s0) + 75c: f018 sd a4,32(s0) + 75e: f41c sd a5,40(s0) + 760: 03043823 sd a6,48(s0) + 764: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 768: 00840613 addi a2,s0,8 + 76c: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 770: 85aa mv a1,a0 + 772: 4505 li a0,1 + 774: d0dff0ef jal 480 +} + 778: 60e2 ld ra,24(sp) + 77a: 6442 ld s0,16(sp) + 77c: 6125 addi sp,sp,96 + 77e: 8082 ret + +0000000000000780 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 780: 1141 addi sp,sp,-16 + 782: e422 sd s0,8(sp) + 784: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 786: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 78a: 00001797 auipc a5,0x1 + 78e: 8767b783 ld a5,-1930(a5) # 1000 + 792: a02d j 7bc + 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; + 794: 4618 lw a4,8(a2) + 796: 9f2d addw a4,a4,a1 + 798: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 79c: 6398 ld a4,0(a5) + 79e: 6310 ld a2,0(a4) + 7a0: a83d j 7de + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7a2: ff852703 lw a4,-8(a0) + 7a6: 9f31 addw a4,a4,a2 + 7a8: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7aa: ff053683 ld a3,-16(a0) + 7ae: a091 j 7f2 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7b0: 6398 ld a4,0(a5) + 7b2: 00e7e463 bltu a5,a4,7ba + 7b6: 00e6ea63 bltu a3,a4,7ca +{ + 7ba: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7bc: fed7fae3 bgeu a5,a3,7b0 + 7c0: 6398 ld a4,0(a5) + 7c2: 00e6e463 bltu a3,a4,7ca + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7c6: fee7eae3 bltu a5,a4,7ba + if(bp + bp->s.size == p->s.ptr){ + 7ca: ff852583 lw a1,-8(a0) + 7ce: 6390 ld a2,0(a5) + 7d0: 02059813 slli a6,a1,0x20 + 7d4: 01c85713 srli a4,a6,0x1c + 7d8: 9736 add a4,a4,a3 + 7da: fae60de3 beq a2,a4,794 + bp->s.ptr = p->s.ptr->s.ptr; + 7de: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7e2: 4790 lw a2,8(a5) + 7e4: 02061593 slli a1,a2,0x20 + 7e8: 01c5d713 srli a4,a1,0x1c + 7ec: 973e add a4,a4,a5 + 7ee: fae68ae3 beq a3,a4,7a2 + p->s.ptr = bp->s.ptr; + 7f2: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7f4: 00001717 auipc a4,0x1 + 7f8: 80f73623 sd a5,-2036(a4) # 1000 +} + 7fc: 6422 ld s0,8(sp) + 7fe: 0141 addi sp,sp,16 + 800: 8082 ret + +0000000000000802 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 802: 7139 addi sp,sp,-64 + 804: fc06 sd ra,56(sp) + 806: f822 sd s0,48(sp) + 808: f426 sd s1,40(sp) + 80a: ec4e sd s3,24(sp) + 80c: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 80e: 02051493 slli s1,a0,0x20 + 812: 9081 srli s1,s1,0x20 + 814: 04bd addi s1,s1,15 + 816: 8091 srli s1,s1,0x4 + 818: 0014899b addiw s3,s1,1 + 81c: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 81e: 00000517 auipc a0,0x0 + 822: 7e253503 ld a0,2018(a0) # 1000 + 826: c915 beqz a0,85a + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 828: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 82a: 4798 lw a4,8(a5) + 82c: 08977a63 bgeu a4,s1,8c0 + 830: f04a sd s2,32(sp) + 832: e852 sd s4,16(sp) + 834: e456 sd s5,8(sp) + 836: e05a sd s6,0(sp) + if(nu < 4096) + 838: 8a4e mv s4,s3 + 83a: 0009871b sext.w a4,s3 + 83e: 6685 lui a3,0x1 + 840: 00d77363 bgeu a4,a3,846 + 844: 6a05 lui s4,0x1 + 846: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 84a: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 84e: 00000917 auipc s2,0x0 + 852: 7b290913 addi s2,s2,1970 # 1000 + if(p == SBRK_ERROR) + 856: 5afd li s5,-1 + 858: a081 j 898 + 85a: f04a sd s2,32(sp) + 85c: e852 sd s4,16(sp) + 85e: e456 sd s5,8(sp) + 860: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 862: 00000797 auipc a5,0x0 + 866: 7ae78793 addi a5,a5,1966 # 1010 + 86a: 00000717 auipc a4,0x0 + 86e: 78f73b23 sd a5,1942(a4) # 1000 + 872: e39c sd a5,0(a5) + base.s.size = 0; + 874: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 878: b7c1 j 838 + prevp->s.ptr = p->s.ptr; + 87a: 6398 ld a4,0(a5) + 87c: e118 sd a4,0(a0) + 87e: a8a9 j 8d8 + hp->s.size = nu; + 880: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 884: 0541 addi a0,a0,16 + 886: efbff0ef jal 780 + return freep; + 88a: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 88e: c12d beqz a0,8f0 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 890: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 892: 4798 lw a4,8(a5) + 894: 02977263 bgeu a4,s1,8b8 + if(p == freep) + 898: 00093703 ld a4,0(s2) + 89c: 853e mv a0,a5 + 89e: fef719e3 bne a4,a5,890 + p = sbrk(nu * sizeof(Header)); + 8a2: 8552 mv a0,s4 + 8a4: a37ff0ef jal 2da + if(p == SBRK_ERROR) + 8a8: fd551ce3 bne a0,s5,880 + return 0; + 8ac: 4501 li a0,0 + 8ae: 7902 ld s2,32(sp) + 8b0: 6a42 ld s4,16(sp) + 8b2: 6aa2 ld s5,8(sp) + 8b4: 6b02 ld s6,0(sp) + 8b6: a03d j 8e4 + 8b8: 7902 ld s2,32(sp) + 8ba: 6a42 ld s4,16(sp) + 8bc: 6aa2 ld s5,8(sp) + 8be: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 8c0: fae48de3 beq s1,a4,87a + p->s.size -= nunits; + 8c4: 4137073b subw a4,a4,s3 + 8c8: c798 sw a4,8(a5) + p += p->s.size; + 8ca: 02071693 slli a3,a4,0x20 + 8ce: 01c6d713 srli a4,a3,0x1c + 8d2: 97ba add a5,a5,a4 + p->s.size = nunits; + 8d4: 0137a423 sw s3,8(a5) + freep = prevp; + 8d8: 00000717 auipc a4,0x0 + 8dc: 72a73423 sd a0,1832(a4) # 1000 + return (void*)(p + 1); + 8e0: 01078513 addi a0,a5,16 + } +} + 8e4: 70e2 ld ra,56(sp) + 8e6: 7442 ld s0,48(sp) + 8e8: 74a2 ld s1,40(sp) + 8ea: 69e2 ld s3,24(sp) + 8ec: 6121 addi sp,sp,64 + 8ee: 8082 ret + 8f0: 7902 ld s2,32(sp) + 8f2: 6a42 ld s4,16(sp) + 8f4: 6aa2 ld s5,8(sp) + 8f6: 6b02 ld s6,0(sp) + 8f8: b7f5 j 8e4 diff --git a/user/echo.c b/G12_Project1_xv6CustomizeSystemCalls/user/echo.c similarity index 100% rename from user/echo.c rename to G12_Project1_xv6CustomizeSystemCalls/user/echo.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/echo.d b/G12_Project1_xv6CustomizeSystemCalls/user/echo.d new file mode 100644 index 0000000000..ccfe98413c --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/echo.d @@ -0,0 +1 @@ +user/echo.o: user/echo.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/echo.o b/G12_Project1_xv6CustomizeSystemCalls/user/echo.o new file mode 100644 index 0000000000..cdf901afb3 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/echo.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/echo.sym b/G12_Project1_xv6CustomizeSystemCalls/user/echo.sym new file mode 100644 index 0000000000..375e92dcc7 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/echo.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +0000000000000900 .rodata +0000000000000930 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 echo.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003c6 putc +00000000000003e4 printint +0000000000000918 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +000000000000008a strcpy +000000000000039e pause +000000000000074e printf +0000000000000396 sys_sbrk +0000000000000234 memmove +0000000000000356 mknod +0000000000000142 gets +000000000000038e getpid +00000000000002c6 memcpy +0000000000000802 malloc +00000000000002f0 sbrklazy +000000000000031e pipe +000000000000032e write +0000000000000366 fstat +0000000000000724 fprintf +000000000000033e kill +0000000000000480 vprintf +000000000000037e chdir +0000000000000346 exec +0000000000000316 wait +00000000000003ae getprocsinfo +0000000000000326 read +000000000000035e unlink +000000000000028c memcmp +0000000000000306 fork +00000000000002da sbrk +00000000000003a6 uptime +00000000000000fc memset +0000000000000000 main +00000000000003b6 getppid +00000000000000a6 strcmp +0000000000000386 dup +00000000000001b2 stat +00000000000003be sleep2 +000000000000036e link +000000000000030e exit +000000000000007a start +00000000000001ec atoi +00000000000000d2 strlen +000000000000034e open +000000000000011e strchr +0000000000000376 mkdir +0000000000000336 close +0000000000000780 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/forktest.asm b/G12_Project1_xv6CustomizeSystemCalls/user/forktest.asm new file mode 100644 index 0000000000..f4470e9ebb --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/forktest.asm @@ -0,0 +1,847 @@ + +user/_forktest: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + +#define N 1000 + +void +print(const char *s) +{ + 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: 1000 addi s0,sp,32 + a: 84aa mv s1,a0 + write(1, s, strlen(s)); + c: 122000ef jal 12e + 10: 0005061b sext.w a2,a0 + 14: 85a6 mv a1,s1 + 16: 4505 li a0,1 + 18: 372000ef jal 38a +} + 1c: 60e2 ld ra,24(sp) + 1e: 6442 ld s0,16(sp) + 20: 64a2 ld s1,8(sp) + 22: 6105 addi sp,sp,32 + 24: 8082 ret + +0000000000000026 : + +void +forktest(void) +{ + 26: 1101 addi sp,sp,-32 + 28: ec06 sd ra,24(sp) + 2a: e822 sd s0,16(sp) + 2c: e426 sd s1,8(sp) + 2e: e04a sd s2,0(sp) + 30: 1000 addi s0,sp,32 + int n, pid; + + print("fork test\n"); + 32: 00000517 auipc a0,0x0 + 36: 3f650513 addi a0,a0,1014 # 428 + 3a: fc7ff0ef jal 0 + + for(n=0; n + if(pid < 0) + 48: 04054363 bltz a0,8e + break; + if(pid == 0) + 4c: cd09 beqz a0,66 + for(n=0; n + exit(0); + } + + if(n == N){ + print("fork claimed to work N times!\n"); + 54: 00000517 auipc a0,0x0 + 58: 42450513 addi a0,a0,1060 # 478 + 5c: fa5ff0ef jal 0 + exit(1); + 60: 4505 li a0,1 + 62: 308000ef jal 36a + exit(0); + 66: 304000ef jal 36a + } + + for(; n > 0; n--){ + if(wait(0) < 0){ + print("wait stopped early\n"); + 6a: 00000517 auipc a0,0x0 + 6e: 3ce50513 addi a0,a0,974 # 438 + 72: f8fff0ef jal 0 + exit(1); + 76: 4505 li a0,1 + 78: 2f2000ef jal 36a + } + } + + if(wait(0) != -1){ + print("wait got too many\n"); + 7c: 00000517 auipc a0,0x0 + 80: 3d450513 addi a0,a0,980 # 450 + 84: f7dff0ef jal 0 + exit(1); + 88: 4505 li a0,1 + 8a: 2e0000ef jal 36a + for(; n > 0; n--){ + 8e: 00905963 blez s1,a0 + if(wait(0) < 0){ + 92: 4501 li a0,0 + 94: 2de000ef jal 372 + 98: fc0549e3 bltz a0,6a + for(; n > 0; n--){ + 9c: 34fd addiw s1,s1,-1 + 9e: f8f5 bnez s1,92 + if(wait(0) != -1){ + a0: 4501 li a0,0 + a2: 2d0000ef jal 372 + a6: 57fd li a5,-1 + a8: fcf51ae3 bne a0,a5,7c + } + + print("fork test OK\n"); + ac: 00000517 auipc a0,0x0 + b0: 3bc50513 addi a0,a0,956 # 468 + b4: f4dff0ef jal 0 +} + b8: 60e2 ld ra,24(sp) + ba: 6442 ld s0,16(sp) + bc: 64a2 ld s1,8(sp) + be: 6902 ld s2,0(sp) + c0: 6105 addi sp,sp,32 + c2: 8082 ret + +00000000000000c4
: + +int +main(void) +{ + c4: 1141 addi sp,sp,-16 + c6: e406 sd ra,8(sp) + c8: e022 sd s0,0(sp) + ca: 0800 addi s0,sp,16 + forktest(); + cc: f5bff0ef jal 26 + exit(0); + d0: 4501 li a0,0 + d2: 298000ef jal 36a + +00000000000000d6 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + d6: 1141 addi sp,sp,-16 + d8: e406 sd ra,8(sp) + da: e022 sd s0,0(sp) + dc: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + de: fe7ff0ef jal c4
+ exit(r); + e2: 288000ef jal 36a + +00000000000000e6 : +} + +char* +strcpy(char *s, const char *t) +{ + e6: 1141 addi sp,sp,-16 + e8: e422 sd s0,8(sp) + ea: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + ec: 87aa mv a5,a0 + ee: 0585 addi a1,a1,1 + f0: 0785 addi a5,a5,1 + f2: fff5c703 lbu a4,-1(a1) + f6: fee78fa3 sb a4,-1(a5) + fa: fb75 bnez a4,ee + ; + return os; +} + fc: 6422 ld s0,8(sp) + fe: 0141 addi sp,sp,16 + 100: 8082 ret + +0000000000000102 : + +int +strcmp(const char *p, const char *q) +{ + 102: 1141 addi sp,sp,-16 + 104: e422 sd s0,8(sp) + 106: 0800 addi s0,sp,16 + while(*p && *p == *q) + 108: 00054783 lbu a5,0(a0) + 10c: cb91 beqz a5,120 + 10e: 0005c703 lbu a4,0(a1) + 112: 00f71763 bne a4,a5,120 + p++, q++; + 116: 0505 addi a0,a0,1 + 118: 0585 addi a1,a1,1 + while(*p && *p == *q) + 11a: 00054783 lbu a5,0(a0) + 11e: fbe5 bnez a5,10e + return (uchar)*p - (uchar)*q; + 120: 0005c503 lbu a0,0(a1) +} + 124: 40a7853b subw a0,a5,a0 + 128: 6422 ld s0,8(sp) + 12a: 0141 addi sp,sp,16 + 12c: 8082 ret + +000000000000012e : + +uint +strlen(const char *s) +{ + 12e: 1141 addi sp,sp,-16 + 130: e422 sd s0,8(sp) + 132: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 134: 00054783 lbu a5,0(a0) + 138: cf91 beqz a5,154 + 13a: 0505 addi a0,a0,1 + 13c: 87aa mv a5,a0 + 13e: 86be mv a3,a5 + 140: 0785 addi a5,a5,1 + 142: fff7c703 lbu a4,-1(a5) + 146: ff65 bnez a4,13e + 148: 40a6853b subw a0,a3,a0 + 14c: 2505 addiw a0,a0,1 + ; + return n; +} + 14e: 6422 ld s0,8(sp) + 150: 0141 addi sp,sp,16 + 152: 8082 ret + for(n = 0; s[n]; n++) + 154: 4501 li a0,0 + 156: bfe5 j 14e + +0000000000000158 : + +void* +memset(void *dst, int c, uint n) +{ + 158: 1141 addi sp,sp,-16 + 15a: e422 sd s0,8(sp) + 15c: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 15e: ca19 beqz a2,174 + 160: 87aa mv a5,a0 + 162: 1602 slli a2,a2,0x20 + 164: 9201 srli a2,a2,0x20 + 166: 00a60733 add a4,a2,a0 + cdst[i] = c; + 16a: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 16e: 0785 addi a5,a5,1 + 170: fee79de3 bne a5,a4,16a + } + return dst; +} + 174: 6422 ld s0,8(sp) + 176: 0141 addi sp,sp,16 + 178: 8082 ret + +000000000000017a : + +char* +strchr(const char *s, char c) +{ + 17a: 1141 addi sp,sp,-16 + 17c: e422 sd s0,8(sp) + 17e: 0800 addi s0,sp,16 + for(; *s; s++) + 180: 00054783 lbu a5,0(a0) + 184: cb99 beqz a5,19a + if(*s == c) + 186: 00f58763 beq a1,a5,194 + for(; *s; s++) + 18a: 0505 addi a0,a0,1 + 18c: 00054783 lbu a5,0(a0) + 190: fbfd bnez a5,186 + return (char*)s; + return 0; + 192: 4501 li a0,0 +} + 194: 6422 ld s0,8(sp) + 196: 0141 addi sp,sp,16 + 198: 8082 ret + return 0; + 19a: 4501 li a0,0 + 19c: bfe5 j 194 + +000000000000019e : + +char* +gets(char *buf, int max) +{ + 19e: 711d addi sp,sp,-96 + 1a0: ec86 sd ra,88(sp) + 1a2: e8a2 sd s0,80(sp) + 1a4: e4a6 sd s1,72(sp) + 1a6: e0ca sd s2,64(sp) + 1a8: fc4e sd s3,56(sp) + 1aa: f852 sd s4,48(sp) + 1ac: f456 sd s5,40(sp) + 1ae: f05a sd s6,32(sp) + 1b0: ec5e sd s7,24(sp) + 1b2: 1080 addi s0,sp,96 + 1b4: 8baa mv s7,a0 + 1b6: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1b8: 892a mv s2,a0 + 1ba: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1bc: 4aa9 li s5,10 + 1be: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1c0: 89a6 mv s3,s1 + 1c2: 2485 addiw s1,s1,1 + 1c4: 0344d663 bge s1,s4,1f0 + cc = read(0, &c, 1); + 1c8: 4605 li a2,1 + 1ca: faf40593 addi a1,s0,-81 + 1ce: 4501 li a0,0 + 1d0: 1b2000ef jal 382 + if(cc < 1) + 1d4: 00a05e63 blez a0,1f0 + buf[i++] = c; + 1d8: faf44783 lbu a5,-81(s0) + 1dc: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1e0: 01578763 beq a5,s5,1ee + 1e4: 0905 addi s2,s2,1 + 1e6: fd679de3 bne a5,s6,1c0 + buf[i++] = c; + 1ea: 89a6 mv s3,s1 + 1ec: a011 j 1f0 + 1ee: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1f0: 99de add s3,s3,s7 + 1f2: 00098023 sb zero,0(s3) + return buf; +} + 1f6: 855e mv a0,s7 + 1f8: 60e6 ld ra,88(sp) + 1fa: 6446 ld s0,80(sp) + 1fc: 64a6 ld s1,72(sp) + 1fe: 6906 ld s2,64(sp) + 200: 79e2 ld s3,56(sp) + 202: 7a42 ld s4,48(sp) + 204: 7aa2 ld s5,40(sp) + 206: 7b02 ld s6,32(sp) + 208: 6be2 ld s7,24(sp) + 20a: 6125 addi sp,sp,96 + 20c: 8082 ret + +000000000000020e : + +int +stat(const char *n, struct stat *st) +{ + 20e: 1101 addi sp,sp,-32 + 210: ec06 sd ra,24(sp) + 212: e822 sd s0,16(sp) + 214: e04a sd s2,0(sp) + 216: 1000 addi s0,sp,32 + 218: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 21a: 4581 li a1,0 + 21c: 18e000ef jal 3aa + if(fd < 0) + 220: 02054263 bltz a0,244 + 224: e426 sd s1,8(sp) + 226: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 228: 85ca mv a1,s2 + 22a: 198000ef jal 3c2 + 22e: 892a mv s2,a0 + close(fd); + 230: 8526 mv a0,s1 + 232: 160000ef jal 392 + return r; + 236: 64a2 ld s1,8(sp) +} + 238: 854a mv a0,s2 + 23a: 60e2 ld ra,24(sp) + 23c: 6442 ld s0,16(sp) + 23e: 6902 ld s2,0(sp) + 240: 6105 addi sp,sp,32 + 242: 8082 ret + return -1; + 244: 597d li s2,-1 + 246: bfcd j 238 + +0000000000000248 : + +int +atoi(const char *s) +{ + 248: 1141 addi sp,sp,-16 + 24a: e422 sd s0,8(sp) + 24c: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 24e: 00054683 lbu a3,0(a0) + 252: fd06879b addiw a5,a3,-48 + 256: 0ff7f793 zext.b a5,a5 + 25a: 4625 li a2,9 + 25c: 02f66863 bltu a2,a5,28c + 260: 872a mv a4,a0 + n = 0; + 262: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 264: 0705 addi a4,a4,1 + 266: 0025179b slliw a5,a0,0x2 + 26a: 9fa9 addw a5,a5,a0 + 26c: 0017979b slliw a5,a5,0x1 + 270: 9fb5 addw a5,a5,a3 + 272: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 276: 00074683 lbu a3,0(a4) + 27a: fd06879b addiw a5,a3,-48 + 27e: 0ff7f793 zext.b a5,a5 + 282: fef671e3 bgeu a2,a5,264 + return n; +} + 286: 6422 ld s0,8(sp) + 288: 0141 addi sp,sp,16 + 28a: 8082 ret + n = 0; + 28c: 4501 li a0,0 + 28e: bfe5 j 286 + +0000000000000290 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 290: 1141 addi sp,sp,-16 + 292: e422 sd s0,8(sp) + 294: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 296: 02b57463 bgeu a0,a1,2be + while(n-- > 0) + 29a: 00c05f63 blez a2,2b8 + 29e: 1602 slli a2,a2,0x20 + 2a0: 9201 srli a2,a2,0x20 + 2a2: 00c507b3 add a5,a0,a2 + dst = vdst; + 2a6: 872a mv a4,a0 + *dst++ = *src++; + 2a8: 0585 addi a1,a1,1 + 2aa: 0705 addi a4,a4,1 + 2ac: fff5c683 lbu a3,-1(a1) + 2b0: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2b4: fef71ae3 bne a4,a5,2a8 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2b8: 6422 ld s0,8(sp) + 2ba: 0141 addi sp,sp,16 + 2bc: 8082 ret + dst += n; + 2be: 00c50733 add a4,a0,a2 + src += n; + 2c2: 95b2 add a1,a1,a2 + while(n-- > 0) + 2c4: fec05ae3 blez a2,2b8 + 2c8: fff6079b addiw a5,a2,-1 + 2cc: 1782 slli a5,a5,0x20 + 2ce: 9381 srli a5,a5,0x20 + 2d0: fff7c793 not a5,a5 + 2d4: 97ba add a5,a5,a4 + *--dst = *--src; + 2d6: 15fd addi a1,a1,-1 + 2d8: 177d addi a4,a4,-1 + 2da: 0005c683 lbu a3,0(a1) + 2de: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2e2: fee79ae3 bne a5,a4,2d6 + 2e6: bfc9 j 2b8 + +00000000000002e8 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2e8: 1141 addi sp,sp,-16 + 2ea: e422 sd s0,8(sp) + 2ec: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2ee: ca05 beqz a2,31e + 2f0: fff6069b addiw a3,a2,-1 + 2f4: 1682 slli a3,a3,0x20 + 2f6: 9281 srli a3,a3,0x20 + 2f8: 0685 addi a3,a3,1 + 2fa: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2fc: 00054783 lbu a5,0(a0) + 300: 0005c703 lbu a4,0(a1) + 304: 00e79863 bne a5,a4,314 + return *p1 - *p2; + } + p1++; + 308: 0505 addi a0,a0,1 + p2++; + 30a: 0585 addi a1,a1,1 + while (n-- > 0) { + 30c: fed518e3 bne a0,a3,2fc + } + return 0; + 310: 4501 li a0,0 + 312: a019 j 318 + return *p1 - *p2; + 314: 40e7853b subw a0,a5,a4 +} + 318: 6422 ld s0,8(sp) + 31a: 0141 addi sp,sp,16 + 31c: 8082 ret + return 0; + 31e: 4501 li a0,0 + 320: bfe5 j 318 + +0000000000000322 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 322: 1141 addi sp,sp,-16 + 324: e406 sd ra,8(sp) + 326: e022 sd s0,0(sp) + 328: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 32a: f67ff0ef jal 290 +} + 32e: 60a2 ld ra,8(sp) + 330: 6402 ld s0,0(sp) + 332: 0141 addi sp,sp,16 + 334: 8082 ret + +0000000000000336 : + +char * +sbrk(int n) { + 336: 1141 addi sp,sp,-16 + 338: e406 sd ra,8(sp) + 33a: e022 sd s0,0(sp) + 33c: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 33e: 4585 li a1,1 + 340: 0b2000ef jal 3f2 +} + 344: 60a2 ld ra,8(sp) + 346: 6402 ld s0,0(sp) + 348: 0141 addi sp,sp,16 + 34a: 8082 ret + +000000000000034c : + +char * +sbrklazy(int n) { + 34c: 1141 addi sp,sp,-16 + 34e: e406 sd ra,8(sp) + 350: e022 sd s0,0(sp) + 352: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 354: 4589 li a1,2 + 356: 09c000ef jal 3f2 +} + 35a: 60a2 ld ra,8(sp) + 35c: 6402 ld s0,0(sp) + 35e: 0141 addi sp,sp,16 + 360: 8082 ret + +0000000000000362 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 362: 4885 li a7,1 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : +.global exit +exit: + li a7, SYS_exit + 36a: 4889 li a7,2 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 : +.global wait +wait: + li a7, SYS_wait + 372: 488d li a7,3 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a : +.global pipe +pipe: + li a7, SYS_pipe + 37a: 4891 li a7,4 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 : +.global read +read: + li a7, SYS_read + 382: 4895 li a7,5 + ecall + 384: 00000073 ecall + ret + 388: 8082 ret + +000000000000038a : +.global write +write: + li a7, SYS_write + 38a: 48c1 li a7,16 + ecall + 38c: 00000073 ecall + ret + 390: 8082 ret + +0000000000000392 : +.global close +close: + li a7, SYS_close + 392: 48d5 li a7,21 + ecall + 394: 00000073 ecall + ret + 398: 8082 ret + +000000000000039a : +.global kill +kill: + li a7, SYS_kill + 39a: 4899 li a7,6 + ecall + 39c: 00000073 ecall + ret + 3a0: 8082 ret + +00000000000003a2 : +.global exec +exec: + li a7, SYS_exec + 3a2: 489d li a7,7 + ecall + 3a4: 00000073 ecall + ret + 3a8: 8082 ret + +00000000000003aa : +.global open +open: + li a7, SYS_open + 3aa: 48bd li a7,15 + ecall + 3ac: 00000073 ecall + ret + 3b0: 8082 ret + +00000000000003b2 : +.global mknod +mknod: + li a7, SYS_mknod + 3b2: 48c5 li a7,17 + ecall + 3b4: 00000073 ecall + ret + 3b8: 8082 ret + +00000000000003ba : +.global unlink +unlink: + li a7, SYS_unlink + 3ba: 48c9 li a7,18 + ecall + 3bc: 00000073 ecall + ret + 3c0: 8082 ret + +00000000000003c2 : +.global fstat +fstat: + li a7, SYS_fstat + 3c2: 48a1 li a7,8 + ecall + 3c4: 00000073 ecall + ret + 3c8: 8082 ret + +00000000000003ca : +.global link +link: + li a7, SYS_link + 3ca: 48cd li a7,19 + ecall + 3cc: 00000073 ecall + ret + 3d0: 8082 ret + +00000000000003d2 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3d2: 48d1 li a7,20 + ecall + 3d4: 00000073 ecall + ret + 3d8: 8082 ret + +00000000000003da : +.global chdir +chdir: + li a7, SYS_chdir + 3da: 48a5 li a7,9 + ecall + 3dc: 00000073 ecall + ret + 3e0: 8082 ret + +00000000000003e2 : +.global dup +dup: + li a7, SYS_dup + 3e2: 48a9 li a7,10 + ecall + 3e4: 00000073 ecall + ret + 3e8: 8082 ret + +00000000000003ea : +.global getpid +getpid: + li a7, SYS_getpid + 3ea: 48ad li a7,11 + ecall + 3ec: 00000073 ecall + ret + 3f0: 8082 ret + +00000000000003f2 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3f2: 48b1 li a7,12 + ecall + 3f4: 00000073 ecall + ret + 3f8: 8082 ret + +00000000000003fa : +.global pause +pause: + li a7, SYS_pause + 3fa: 48b5 li a7,13 + ecall + 3fc: 00000073 ecall + ret + 400: 8082 ret + +0000000000000402 : +.global uptime +uptime: + li a7, SYS_uptime + 402: 48b9 li a7,14 + ecall + 404: 00000073 ecall + ret + 408: 8082 ret + +000000000000040a : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 40a: 48d9 li a7,22 + ecall + 40c: 00000073 ecall + ret + 410: 8082 ret + +0000000000000412 : +.global getppid +getppid: + li a7, SYS_getppid + 412: 48dd li a7,23 + ecall + 414: 00000073 ecall + ret + 418: 8082 ret + +000000000000041a : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 41a: 48e1 li a7,24 + ecall + 41c: 00000073 ecall + ret + 420: 8082 ret diff --git a/user/forktest.c b/G12_Project1_xv6CustomizeSystemCalls/user/forktest.c similarity index 100% rename from user/forktest.c rename to G12_Project1_xv6CustomizeSystemCalls/user/forktest.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/forktest.d b/G12_Project1_xv6CustomizeSystemCalls/user/forktest.d new file mode 100644 index 0000000000..74309946e4 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/forktest.d @@ -0,0 +1 @@ +user/forktest.o: user/forktest.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/forktest.o b/G12_Project1_xv6CustomizeSystemCalls/user/forktest.o new file mode 100644 index 0000000000..c94203f203 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/forktest.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/forphan.asm b/G12_Project1_xv6CustomizeSystemCalls/user/forphan.asm new file mode 100644 index 0000000000..625dd3d731 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/forphan.asm @@ -0,0 +1,1574 @@ + +user/_forphan: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: + +char buf[BUFSZ]; + +int +main(int argc, char **argv) +{ + 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: 0080 addi s0,sp,64 + int fd = 0; + char *s = argv[0]; + a: 6184 ld s1,0(a1) + struct stat st; + char *ff = "file0"; + + if ((fd = open(ff, O_CREATE|O_WRONLY)) < 0) { + c: 20100593 li a1,513 + 10: 00001517 auipc a0,0x1 + 14: 94050513 addi a0,a0,-1728 # 950 + 18: 380000ef jal 398 + 1c: 04054463 bltz a0,64 + printf("%s: open failed\n", s); + exit(1); + } + if(fstat(fd, &st) < 0){ + 20: fc840593 addi a1,s0,-56 + 24: 38c000ef jal 3b0 + 28: 04054863 bltz a0,78 + fprintf(2, "%s: cannot stat %s\n", s, "ff"); + exit(1); + } + if (unlink(ff) < 0) { + 2c: 00001517 auipc a0,0x1 + 30: 92450513 addi a0,a0,-1756 # 950 + 34: 374000ef jal 3a8 + 38: 04054f63 bltz a0,96 + printf("%s: unlink failed\n", s); + exit(1); + } + if (open(ff, O_RDONLY) != -1) { + 3c: 4581 li a1,0 + 3e: 00001517 auipc a0,0x1 + 42: 91250513 addi a0,a0,-1774 # 950 + 46: 352000ef jal 398 + 4a: 57fd li a5,-1 + 4c: 04f50f63 beq a0,a5,aa + printf("%s: open successed\n", s); + 50: 85a6 mv a1,s1 + 52: 00001517 auipc a0,0x1 + 56: 95e50513 addi a0,a0,-1698 # 9b0 + 5a: 73e000ef jal 798 + exit(1); + 5e: 4505 li a0,1 + 60: 2f8000ef jal 358 + printf("%s: open failed\n", s); + 64: 85a6 mv a1,s1 + 66: 00001517 auipc a0,0x1 + 6a: 8fa50513 addi a0,a0,-1798 # 960 + 6e: 72a000ef jal 798 + exit(1); + 72: 4505 li a0,1 + 74: 2e4000ef jal 358 + fprintf(2, "%s: cannot stat %s\n", s, "ff"); + 78: 00001697 auipc a3,0x1 + 7c: 90068693 addi a3,a3,-1792 # 978 + 80: 8626 mv a2,s1 + 82: 00001597 auipc a1,0x1 + 86: 8fe58593 addi a1,a1,-1794 # 980 + 8a: 4509 li a0,2 + 8c: 6e2000ef jal 76e + exit(1); + 90: 4505 li a0,1 + 92: 2c6000ef jal 358 + printf("%s: unlink failed\n", s); + 96: 85a6 mv a1,s1 + 98: 00001517 auipc a0,0x1 + 9c: 90050513 addi a0,a0,-1792 # 998 + a0: 6f8000ef jal 798 + exit(1); + a4: 4505 li a0,1 + a6: 2b2000ef jal 358 + } + printf("wait for kill and reclaim %d\n", st.ino); + aa: fcc42583 lw a1,-52(s0) + ae: 00001517 auipc a0,0x1 + b2: 91a50513 addi a0,a0,-1766 # 9c8 + b6: 6e2000ef jal 798 + // sit around until killed + for(;;) pause(1000); + ba: 3e800513 li a0,1000 + be: 32a000ef jal 3e8 + c2: bfe5 j ba + +00000000000000c4 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + c4: 1141 addi sp,sp,-16 + c6: e406 sd ra,8(sp) + c8: e022 sd s0,0(sp) + ca: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + cc: f35ff0ef jal 0
+ exit(r); + d0: 288000ef jal 358 + +00000000000000d4 : +} + +char* +strcpy(char *s, const char *t) +{ + d4: 1141 addi sp,sp,-16 + d6: e422 sd s0,8(sp) + d8: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + da: 87aa mv a5,a0 + dc: 0585 addi a1,a1,1 + de: 0785 addi a5,a5,1 + e0: fff5c703 lbu a4,-1(a1) + e4: fee78fa3 sb a4,-1(a5) + e8: fb75 bnez a4,dc + ; + return os; +} + ea: 6422 ld s0,8(sp) + ec: 0141 addi sp,sp,16 + ee: 8082 ret + +00000000000000f0 : + +int +strcmp(const char *p, const char *q) +{ + f0: 1141 addi sp,sp,-16 + f2: e422 sd s0,8(sp) + f4: 0800 addi s0,sp,16 + while(*p && *p == *q) + f6: 00054783 lbu a5,0(a0) + fa: cb91 beqz a5,10e + fc: 0005c703 lbu a4,0(a1) + 100: 00f71763 bne a4,a5,10e + p++, q++; + 104: 0505 addi a0,a0,1 + 106: 0585 addi a1,a1,1 + while(*p && *p == *q) + 108: 00054783 lbu a5,0(a0) + 10c: fbe5 bnez a5,fc + return (uchar)*p - (uchar)*q; + 10e: 0005c503 lbu a0,0(a1) +} + 112: 40a7853b subw a0,a5,a0 + 116: 6422 ld s0,8(sp) + 118: 0141 addi sp,sp,16 + 11a: 8082 ret + +000000000000011c : + +uint +strlen(const char *s) +{ + 11c: 1141 addi sp,sp,-16 + 11e: e422 sd s0,8(sp) + 120: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 122: 00054783 lbu a5,0(a0) + 126: cf91 beqz a5,142 + 128: 0505 addi a0,a0,1 + 12a: 87aa mv a5,a0 + 12c: 86be mv a3,a5 + 12e: 0785 addi a5,a5,1 + 130: fff7c703 lbu a4,-1(a5) + 134: ff65 bnez a4,12c + 136: 40a6853b subw a0,a3,a0 + 13a: 2505 addiw a0,a0,1 + ; + return n; +} + 13c: 6422 ld s0,8(sp) + 13e: 0141 addi sp,sp,16 + 140: 8082 ret + for(n = 0; s[n]; n++) + 142: 4501 li a0,0 + 144: bfe5 j 13c + +0000000000000146 : + +void* +memset(void *dst, int c, uint n) +{ + 146: 1141 addi sp,sp,-16 + 148: e422 sd s0,8(sp) + 14a: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 14c: ca19 beqz a2,162 + 14e: 87aa mv a5,a0 + 150: 1602 slli a2,a2,0x20 + 152: 9201 srli a2,a2,0x20 + 154: 00a60733 add a4,a2,a0 + cdst[i] = c; + 158: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 15c: 0785 addi a5,a5,1 + 15e: fee79de3 bne a5,a4,158 + } + return dst; +} + 162: 6422 ld s0,8(sp) + 164: 0141 addi sp,sp,16 + 166: 8082 ret + +0000000000000168 : + +char* +strchr(const char *s, char c) +{ + 168: 1141 addi sp,sp,-16 + 16a: e422 sd s0,8(sp) + 16c: 0800 addi s0,sp,16 + for(; *s; s++) + 16e: 00054783 lbu a5,0(a0) + 172: cb99 beqz a5,188 + if(*s == c) + 174: 00f58763 beq a1,a5,182 + for(; *s; s++) + 178: 0505 addi a0,a0,1 + 17a: 00054783 lbu a5,0(a0) + 17e: fbfd bnez a5,174 + return (char*)s; + return 0; + 180: 4501 li a0,0 +} + 182: 6422 ld s0,8(sp) + 184: 0141 addi sp,sp,16 + 186: 8082 ret + return 0; + 188: 4501 li a0,0 + 18a: bfe5 j 182 + +000000000000018c : + +char* +gets(char *buf, int max) +{ + 18c: 711d addi sp,sp,-96 + 18e: ec86 sd ra,88(sp) + 190: e8a2 sd s0,80(sp) + 192: e4a6 sd s1,72(sp) + 194: e0ca sd s2,64(sp) + 196: fc4e sd s3,56(sp) + 198: f852 sd s4,48(sp) + 19a: f456 sd s5,40(sp) + 19c: f05a sd s6,32(sp) + 19e: ec5e sd s7,24(sp) + 1a0: 1080 addi s0,sp,96 + 1a2: 8baa mv s7,a0 + 1a4: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1a6: 892a mv s2,a0 + 1a8: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1aa: 4aa9 li s5,10 + 1ac: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1ae: 89a6 mv s3,s1 + 1b0: 2485 addiw s1,s1,1 + 1b2: 0344d663 bge s1,s4,1de + cc = read(0, &c, 1); + 1b6: 4605 li a2,1 + 1b8: faf40593 addi a1,s0,-81 + 1bc: 4501 li a0,0 + 1be: 1b2000ef jal 370 + if(cc < 1) + 1c2: 00a05e63 blez a0,1de + buf[i++] = c; + 1c6: faf44783 lbu a5,-81(s0) + 1ca: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1ce: 01578763 beq a5,s5,1dc + 1d2: 0905 addi s2,s2,1 + 1d4: fd679de3 bne a5,s6,1ae + buf[i++] = c; + 1d8: 89a6 mv s3,s1 + 1da: a011 j 1de + 1dc: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1de: 99de add s3,s3,s7 + 1e0: 00098023 sb zero,0(s3) + return buf; +} + 1e4: 855e mv a0,s7 + 1e6: 60e6 ld ra,88(sp) + 1e8: 6446 ld s0,80(sp) + 1ea: 64a6 ld s1,72(sp) + 1ec: 6906 ld s2,64(sp) + 1ee: 79e2 ld s3,56(sp) + 1f0: 7a42 ld s4,48(sp) + 1f2: 7aa2 ld s5,40(sp) + 1f4: 7b02 ld s6,32(sp) + 1f6: 6be2 ld s7,24(sp) + 1f8: 6125 addi sp,sp,96 + 1fa: 8082 ret + +00000000000001fc : + +int +stat(const char *n, struct stat *st) +{ + 1fc: 1101 addi sp,sp,-32 + 1fe: ec06 sd ra,24(sp) + 200: e822 sd s0,16(sp) + 202: e04a sd s2,0(sp) + 204: 1000 addi s0,sp,32 + 206: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 208: 4581 li a1,0 + 20a: 18e000ef jal 398 + if(fd < 0) + 20e: 02054263 bltz a0,232 + 212: e426 sd s1,8(sp) + 214: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 216: 85ca mv a1,s2 + 218: 198000ef jal 3b0 + 21c: 892a mv s2,a0 + close(fd); + 21e: 8526 mv a0,s1 + 220: 160000ef jal 380 + return r; + 224: 64a2 ld s1,8(sp) +} + 226: 854a mv a0,s2 + 228: 60e2 ld ra,24(sp) + 22a: 6442 ld s0,16(sp) + 22c: 6902 ld s2,0(sp) + 22e: 6105 addi sp,sp,32 + 230: 8082 ret + return -1; + 232: 597d li s2,-1 + 234: bfcd j 226 + +0000000000000236 : + +int +atoi(const char *s) +{ + 236: 1141 addi sp,sp,-16 + 238: e422 sd s0,8(sp) + 23a: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 23c: 00054683 lbu a3,0(a0) + 240: fd06879b addiw a5,a3,-48 + 244: 0ff7f793 zext.b a5,a5 + 248: 4625 li a2,9 + 24a: 02f66863 bltu a2,a5,27a + 24e: 872a mv a4,a0 + n = 0; + 250: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 252: 0705 addi a4,a4,1 + 254: 0025179b slliw a5,a0,0x2 + 258: 9fa9 addw a5,a5,a0 + 25a: 0017979b slliw a5,a5,0x1 + 25e: 9fb5 addw a5,a5,a3 + 260: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 264: 00074683 lbu a3,0(a4) + 268: fd06879b addiw a5,a3,-48 + 26c: 0ff7f793 zext.b a5,a5 + 270: fef671e3 bgeu a2,a5,252 + return n; +} + 274: 6422 ld s0,8(sp) + 276: 0141 addi sp,sp,16 + 278: 8082 ret + n = 0; + 27a: 4501 li a0,0 + 27c: bfe5 j 274 + +000000000000027e : + +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 + while(n-- > 0) + 288: 00c05f63 blez a2,2a6 + 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: fef71ae3 bne a4,a5,296 + 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 + 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 + 2d4: bfc9 j 2a6 + +00000000000002d6 : + +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 + 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 + 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 + } + return 0; + 2fe: 4501 li a0,0 + 300: a019 j 306 + 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 + +0000000000000310 : + +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: f67ff0ef jal 27e +} + 31c: 60a2 ld ra,8(sp) + 31e: 6402 ld s0,0(sp) + 320: 0141 addi sp,sp,16 + 322: 8082 ret + +0000000000000324 : + +char * +sbrk(int n) { + 324: 1141 addi sp,sp,-16 + 326: e406 sd ra,8(sp) + 328: e022 sd s0,0(sp) + 32a: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 32c: 4585 li a1,1 + 32e: 0b2000ef jal 3e0 +} + 332: 60a2 ld ra,8(sp) + 334: 6402 ld s0,0(sp) + 336: 0141 addi sp,sp,16 + 338: 8082 ret + +000000000000033a : + +char * +sbrklazy(int n) { + 33a: 1141 addi sp,sp,-16 + 33c: e406 sd ra,8(sp) + 33e: e022 sd s0,0(sp) + 340: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 342: 4589 li a1,2 + 344: 09c000ef jal 3e0 +} + 348: 60a2 ld ra,8(sp) + 34a: 6402 ld s0,0(sp) + 34c: 0141 addi sp,sp,16 + 34e: 8082 ret + +0000000000000350 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 350: 4885 li a7,1 + ecall + 352: 00000073 ecall + ret + 356: 8082 ret + +0000000000000358 : +.global exit +exit: + li a7, SYS_exit + 358: 4889 li a7,2 + ecall + 35a: 00000073 ecall + ret + 35e: 8082 ret + +0000000000000360 : +.global wait +wait: + li a7, SYS_wait + 360: 488d li a7,3 + ecall + 362: 00000073 ecall + ret + 366: 8082 ret + +0000000000000368 : +.global pipe +pipe: + li a7, SYS_pipe + 368: 4891 li a7,4 + ecall + 36a: 00000073 ecall + ret + 36e: 8082 ret + +0000000000000370 : +.global read +read: + li a7, SYS_read + 370: 4895 li a7,5 + ecall + 372: 00000073 ecall + ret + 376: 8082 ret + +0000000000000378 : +.global write +write: + li a7, SYS_write + 378: 48c1 li a7,16 + ecall + 37a: 00000073 ecall + ret + 37e: 8082 ret + +0000000000000380 : +.global close +close: + li a7, SYS_close + 380: 48d5 li a7,21 + ecall + 382: 00000073 ecall + ret + 386: 8082 ret + +0000000000000388 : +.global kill +kill: + li a7, SYS_kill + 388: 4899 li a7,6 + ecall + 38a: 00000073 ecall + ret + 38e: 8082 ret + +0000000000000390 : +.global exec +exec: + li a7, SYS_exec + 390: 489d li a7,7 + ecall + 392: 00000073 ecall + ret + 396: 8082 ret + +0000000000000398 : +.global open +open: + li a7, SYS_open + 398: 48bd li a7,15 + ecall + 39a: 00000073 ecall + ret + 39e: 8082 ret + +00000000000003a0 : +.global mknod +mknod: + li a7, SYS_mknod + 3a0: 48c5 li a7,17 + ecall + 3a2: 00000073 ecall + ret + 3a6: 8082 ret + +00000000000003a8 : +.global unlink +unlink: + li a7, SYS_unlink + 3a8: 48c9 li a7,18 + ecall + 3aa: 00000073 ecall + ret + 3ae: 8082 ret + +00000000000003b0 : +.global fstat +fstat: + li a7, SYS_fstat + 3b0: 48a1 li a7,8 + ecall + 3b2: 00000073 ecall + ret + 3b6: 8082 ret + +00000000000003b8 : +.global link +link: + li a7, SYS_link + 3b8: 48cd li a7,19 + ecall + 3ba: 00000073 ecall + ret + 3be: 8082 ret + +00000000000003c0 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3c0: 48d1 li a7,20 + ecall + 3c2: 00000073 ecall + ret + 3c6: 8082 ret + +00000000000003c8 : +.global chdir +chdir: + li a7, SYS_chdir + 3c8: 48a5 li a7,9 + ecall + 3ca: 00000073 ecall + ret + 3ce: 8082 ret + +00000000000003d0 : +.global dup +dup: + li a7, SYS_dup + 3d0: 48a9 li a7,10 + ecall + 3d2: 00000073 ecall + ret + 3d6: 8082 ret + +00000000000003d8 : +.global getpid +getpid: + li a7, SYS_getpid + 3d8: 48ad li a7,11 + ecall + 3da: 00000073 ecall + ret + 3de: 8082 ret + +00000000000003e0 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3e0: 48b1 li a7,12 + ecall + 3e2: 00000073 ecall + ret + 3e6: 8082 ret + +00000000000003e8 : +.global pause +pause: + li a7, SYS_pause + 3e8: 48b5 li a7,13 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 : +.global uptime +uptime: + li a7, SYS_uptime + 3f0: 48b9 li a7,14 + ecall + 3f2: 00000073 ecall + ret + 3f6: 8082 ret + +00000000000003f8 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 3f8: 48d9 li a7,22 + ecall + 3fa: 00000073 ecall + ret + 3fe: 8082 ret + +0000000000000400 : +.global getppid +getppid: + li a7, SYS_getppid + 400: 48dd li a7,23 + ecall + 402: 00000073 ecall + ret + 406: 8082 ret + +0000000000000408 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 408: 48e1 li a7,24 + ecall + 40a: 00000073 ecall + ret + 40e: 8082 ret + +0000000000000410 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 410: 1101 addi sp,sp,-32 + 412: ec06 sd ra,24(sp) + 414: e822 sd s0,16(sp) + 416: 1000 addi s0,sp,32 + 418: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 41c: 4605 li a2,1 + 41e: fef40593 addi a1,s0,-17 + 422: f57ff0ef jal 378 +} + 426: 60e2 ld ra,24(sp) + 428: 6442 ld s0,16(sp) + 42a: 6105 addi sp,sp,32 + 42c: 8082 ret + +000000000000042e : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 42e: 715d addi sp,sp,-80 + 430: e486 sd ra,72(sp) + 432: e0a2 sd s0,64(sp) + 434: f84a sd s2,48(sp) + 436: 0880 addi s0,sp,80 + 438: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 43a: c299 beqz a3,440 + 43c: 0805c363 bltz a1,4c2 + neg = 0; + 440: 4881 li a7,0 + 442: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 446: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 448: 00000517 auipc a0,0x0 + 44c: 5a850513 addi a0,a0,1448 # 9f0 + 450: 883e mv a6,a5 + 452: 2785 addiw a5,a5,1 + 454: 02c5f733 remu a4,a1,a2 + 458: 972a add a4,a4,a0 + 45a: 00074703 lbu a4,0(a4) + 45e: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 462: 872e mv a4,a1 + 464: 02c5d5b3 divu a1,a1,a2 + 468: 0685 addi a3,a3,1 + 46a: fec773e3 bgeu a4,a2,450 + if(neg) + 46e: 00088b63 beqz a7,484 + buf[i++] = '-'; + 472: fd078793 addi a5,a5,-48 + 476: 97a2 add a5,a5,s0 + 478: 02d00713 li a4,45 + 47c: fee78423 sb a4,-24(a5) + 480: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 484: 02f05a63 blez a5,4b8 + 488: fc26 sd s1,56(sp) + 48a: f44e sd s3,40(sp) + 48c: fb840713 addi a4,s0,-72 + 490: 00f704b3 add s1,a4,a5 + 494: fff70993 addi s3,a4,-1 + 498: 99be add s3,s3,a5 + 49a: 37fd addiw a5,a5,-1 + 49c: 1782 slli a5,a5,0x20 + 49e: 9381 srli a5,a5,0x20 + 4a0: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 4a4: fff4c583 lbu a1,-1(s1) + 4a8: 854a mv a0,s2 + 4aa: f67ff0ef jal 410 + while(--i >= 0) + 4ae: 14fd addi s1,s1,-1 + 4b0: ff349ae3 bne s1,s3,4a4 + 4b4: 74e2 ld s1,56(sp) + 4b6: 79a2 ld s3,40(sp) +} + 4b8: 60a6 ld ra,72(sp) + 4ba: 6406 ld s0,64(sp) + 4bc: 7942 ld s2,48(sp) + 4be: 6161 addi sp,sp,80 + 4c0: 8082 ret + x = -xx; + 4c2: 40b005b3 neg a1,a1 + neg = 1; + 4c6: 4885 li a7,1 + x = -xx; + 4c8: bfad j 442 + +00000000000004ca : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4ca: 711d addi sp,sp,-96 + 4cc: ec86 sd ra,88(sp) + 4ce: e8a2 sd s0,80(sp) + 4d0: e0ca sd s2,64(sp) + 4d2: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4d4: 0005c903 lbu s2,0(a1) + 4d8: 28090663 beqz s2,764 + 4dc: e4a6 sd s1,72(sp) + 4de: fc4e sd s3,56(sp) + 4e0: f852 sd s4,48(sp) + 4e2: f456 sd s5,40(sp) + 4e4: f05a sd s6,32(sp) + 4e6: ec5e sd s7,24(sp) + 4e8: e862 sd s8,16(sp) + 4ea: e466 sd s9,8(sp) + 4ec: 8b2a mv s6,a0 + 4ee: 8a2e mv s4,a1 + 4f0: 8bb2 mv s7,a2 + state = 0; + 4f2: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4f4: 4481 li s1,0 + 4f6: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4f8: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4fc: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 500: 06c00c93 li s9,108 + 504: a005 j 524 + putc(fd, c0); + 506: 85ca mv a1,s2 + 508: 855a mv a0,s6 + 50a: f07ff0ef jal 410 + 50e: a019 j 514 + } else if(state == '%'){ + 510: 03598263 beq s3,s5,534 + for(i = 0; fmt[i]; i++){ + 514: 2485 addiw s1,s1,1 + 516: 8726 mv a4,s1 + 518: 009a07b3 add a5,s4,s1 + 51c: 0007c903 lbu s2,0(a5) + 520: 22090a63 beqz s2,754 + c0 = fmt[i] & 0xff; + 524: 0009079b sext.w a5,s2 + if(state == 0){ + 528: fe0994e3 bnez s3,510 + if(c0 == '%'){ + 52c: fd579de3 bne a5,s5,506 + state = '%'; + 530: 89be mv s3,a5 + 532: b7cd j 514 + if(c0) c1 = fmt[i+1] & 0xff; + 534: 00ea06b3 add a3,s4,a4 + 538: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 53c: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 53e: c681 beqz a3,546 + 540: 9752 add a4,a4,s4 + 542: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 546: 05878363 beq a5,s8,58c + } else if(c0 == 'l' && c1 == 'd'){ + 54a: 05978d63 beq a5,s9,5a4 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 54e: 07500713 li a4,117 + 552: 0ee78763 beq a5,a4,640 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 556: 07800713 li a4,120 + 55a: 12e78963 beq a5,a4,68c + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 55e: 07000713 li a4,112 + 562: 14e78e63 beq a5,a4,6be + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 566: 06300713 li a4,99 + 56a: 18e78e63 beq a5,a4,706 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 56e: 07300713 li a4,115 + 572: 1ae78463 beq a5,a4,71a + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 576: 02500713 li a4,37 + 57a: 04e79563 bne a5,a4,5c4 + putc(fd, '%'); + 57e: 02500593 li a1,37 + 582: 855a mv a0,s6 + 584: e8dff0ef jal 410 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 588: 4981 li s3,0 + 58a: b769 j 514 + printint(fd, va_arg(ap, int), 10, 1); + 58c: 008b8913 addi s2,s7,8 + 590: 4685 li a3,1 + 592: 4629 li a2,10 + 594: 000ba583 lw a1,0(s7) + 598: 855a mv a0,s6 + 59a: e95ff0ef jal 42e + 59e: 8bca mv s7,s2 + state = 0; + 5a0: 4981 li s3,0 + 5a2: bf8d j 514 + } else if(c0 == 'l' && c1 == 'd'){ + 5a4: 06400793 li a5,100 + 5a8: 02f68963 beq a3,a5,5da + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5ac: 06c00793 li a5,108 + 5b0: 04f68263 beq a3,a5,5f4 + } else if(c0 == 'l' && c1 == 'u'){ + 5b4: 07500793 li a5,117 + 5b8: 0af68063 beq a3,a5,658 + } else if(c0 == 'l' && c1 == 'x'){ + 5bc: 07800793 li a5,120 + 5c0: 0ef68263 beq a3,a5,6a4 + putc(fd, '%'); + 5c4: 02500593 li a1,37 + 5c8: 855a mv a0,s6 + 5ca: e47ff0ef jal 410 + putc(fd, c0); + 5ce: 85ca mv a1,s2 + 5d0: 855a mv a0,s6 + 5d2: e3fff0ef jal 410 + state = 0; + 5d6: 4981 li s3,0 + 5d8: bf35 j 514 + printint(fd, va_arg(ap, uint64), 10, 1); + 5da: 008b8913 addi s2,s7,8 + 5de: 4685 li a3,1 + 5e0: 4629 li a2,10 + 5e2: 000bb583 ld a1,0(s7) + 5e6: 855a mv a0,s6 + 5e8: e47ff0ef jal 42e + i += 1; + 5ec: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5ee: 8bca mv s7,s2 + state = 0; + 5f0: 4981 li s3,0 + i += 1; + 5f2: b70d j 514 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5f4: 06400793 li a5,100 + 5f8: 02f60763 beq a2,a5,626 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5fc: 07500793 li a5,117 + 600: 06f60963 beq a2,a5,672 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 604: 07800793 li a5,120 + 608: faf61ee3 bne a2,a5,5c4 + printint(fd, va_arg(ap, uint64), 16, 0); + 60c: 008b8913 addi s2,s7,8 + 610: 4681 li a3,0 + 612: 4641 li a2,16 + 614: 000bb583 ld a1,0(s7) + 618: 855a mv a0,s6 + 61a: e15ff0ef jal 42e + i += 2; + 61e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 620: 8bca mv s7,s2 + state = 0; + 622: 4981 li s3,0 + i += 2; + 624: bdc5 j 514 + printint(fd, va_arg(ap, uint64), 10, 1); + 626: 008b8913 addi s2,s7,8 + 62a: 4685 li a3,1 + 62c: 4629 li a2,10 + 62e: 000bb583 ld a1,0(s7) + 632: 855a mv a0,s6 + 634: dfbff0ef jal 42e + i += 2; + 638: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 63a: 8bca mv s7,s2 + state = 0; + 63c: 4981 li s3,0 + i += 2; + 63e: bdd9 j 514 + printint(fd, va_arg(ap, uint32), 10, 0); + 640: 008b8913 addi s2,s7,8 + 644: 4681 li a3,0 + 646: 4629 li a2,10 + 648: 000be583 lwu a1,0(s7) + 64c: 855a mv a0,s6 + 64e: de1ff0ef jal 42e + 652: 8bca mv s7,s2 + state = 0; + 654: 4981 li s3,0 + 656: bd7d j 514 + printint(fd, va_arg(ap, uint64), 10, 0); + 658: 008b8913 addi s2,s7,8 + 65c: 4681 li a3,0 + 65e: 4629 li a2,10 + 660: 000bb583 ld a1,0(s7) + 664: 855a mv a0,s6 + 666: dc9ff0ef jal 42e + i += 1; + 66a: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 66c: 8bca mv s7,s2 + state = 0; + 66e: 4981 li s3,0 + i += 1; + 670: b555 j 514 + printint(fd, va_arg(ap, uint64), 10, 0); + 672: 008b8913 addi s2,s7,8 + 676: 4681 li a3,0 + 678: 4629 li a2,10 + 67a: 000bb583 ld a1,0(s7) + 67e: 855a mv a0,s6 + 680: dafff0ef jal 42e + i += 2; + 684: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 686: 8bca mv s7,s2 + state = 0; + 688: 4981 li s3,0 + i += 2; + 68a: b569 j 514 + printint(fd, va_arg(ap, uint32), 16, 0); + 68c: 008b8913 addi s2,s7,8 + 690: 4681 li a3,0 + 692: 4641 li a2,16 + 694: 000be583 lwu a1,0(s7) + 698: 855a mv a0,s6 + 69a: d95ff0ef jal 42e + 69e: 8bca mv s7,s2 + state = 0; + 6a0: 4981 li s3,0 + 6a2: bd8d j 514 + printint(fd, va_arg(ap, uint64), 16, 0); + 6a4: 008b8913 addi s2,s7,8 + 6a8: 4681 li a3,0 + 6aa: 4641 li a2,16 + 6ac: 000bb583 ld a1,0(s7) + 6b0: 855a mv a0,s6 + 6b2: d7dff0ef jal 42e + i += 1; + 6b6: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6b8: 8bca mv s7,s2 + state = 0; + 6ba: 4981 li s3,0 + i += 1; + 6bc: bda1 j 514 + 6be: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 6c0: 008b8d13 addi s10,s7,8 + 6c4: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6c8: 03000593 li a1,48 + 6cc: 855a mv a0,s6 + 6ce: d43ff0ef jal 410 + putc(fd, 'x'); + 6d2: 07800593 li a1,120 + 6d6: 855a mv a0,s6 + 6d8: d39ff0ef jal 410 + 6dc: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6de: 00000b97 auipc s7,0x0 + 6e2: 312b8b93 addi s7,s7,786 # 9f0 + 6e6: 03c9d793 srli a5,s3,0x3c + 6ea: 97de add a5,a5,s7 + 6ec: 0007c583 lbu a1,0(a5) + 6f0: 855a mv a0,s6 + 6f2: d1fff0ef jal 410 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6f6: 0992 slli s3,s3,0x4 + 6f8: 397d addiw s2,s2,-1 + 6fa: fe0916e3 bnez s2,6e6 + printptr(fd, va_arg(ap, uint64)); + 6fe: 8bea mv s7,s10 + state = 0; + 700: 4981 li s3,0 + 702: 6d02 ld s10,0(sp) + 704: bd01 j 514 + putc(fd, va_arg(ap, uint32)); + 706: 008b8913 addi s2,s7,8 + 70a: 000bc583 lbu a1,0(s7) + 70e: 855a mv a0,s6 + 710: d01ff0ef jal 410 + 714: 8bca mv s7,s2 + state = 0; + 716: 4981 li s3,0 + 718: bbf5 j 514 + if((s = va_arg(ap, char*)) == 0) + 71a: 008b8993 addi s3,s7,8 + 71e: 000bb903 ld s2,0(s7) + 722: 00090f63 beqz s2,740 + for(; *s; s++) + 726: 00094583 lbu a1,0(s2) + 72a: c195 beqz a1,74e + putc(fd, *s); + 72c: 855a mv a0,s6 + 72e: ce3ff0ef jal 410 + for(; *s; s++) + 732: 0905 addi s2,s2,1 + 734: 00094583 lbu a1,0(s2) + 738: f9f5 bnez a1,72c + if((s = va_arg(ap, char*)) == 0) + 73a: 8bce mv s7,s3 + state = 0; + 73c: 4981 li s3,0 + 73e: bbd9 j 514 + s = "(null)"; + 740: 00000917 auipc s2,0x0 + 744: 2a890913 addi s2,s2,680 # 9e8 + for(; *s; s++) + 748: 02800593 li a1,40 + 74c: b7c5 j 72c + if((s = va_arg(ap, char*)) == 0) + 74e: 8bce mv s7,s3 + state = 0; + 750: 4981 li s3,0 + 752: b3c9 j 514 + 754: 64a6 ld s1,72(sp) + 756: 79e2 ld s3,56(sp) + 758: 7a42 ld s4,48(sp) + 75a: 7aa2 ld s5,40(sp) + 75c: 7b02 ld s6,32(sp) + 75e: 6be2 ld s7,24(sp) + 760: 6c42 ld s8,16(sp) + 762: 6ca2 ld s9,8(sp) + } + } +} + 764: 60e6 ld ra,88(sp) + 766: 6446 ld s0,80(sp) + 768: 6906 ld s2,64(sp) + 76a: 6125 addi sp,sp,96 + 76c: 8082 ret + +000000000000076e : + +void +fprintf(int fd, const char *fmt, ...) +{ + 76e: 715d addi sp,sp,-80 + 770: ec06 sd ra,24(sp) + 772: e822 sd s0,16(sp) + 774: 1000 addi s0,sp,32 + 776: e010 sd a2,0(s0) + 778: e414 sd a3,8(s0) + 77a: e818 sd a4,16(s0) + 77c: ec1c sd a5,24(s0) + 77e: 03043023 sd a6,32(s0) + 782: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 786: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 78a: 8622 mv a2,s0 + 78c: d3fff0ef jal 4ca +} + 790: 60e2 ld ra,24(sp) + 792: 6442 ld s0,16(sp) + 794: 6161 addi sp,sp,80 + 796: 8082 ret + +0000000000000798 : + +void +printf(const char *fmt, ...) +{ + 798: 711d addi sp,sp,-96 + 79a: ec06 sd ra,24(sp) + 79c: e822 sd s0,16(sp) + 79e: 1000 addi s0,sp,32 + 7a0: e40c sd a1,8(s0) + 7a2: e810 sd a2,16(s0) + 7a4: ec14 sd a3,24(s0) + 7a6: f018 sd a4,32(s0) + 7a8: f41c sd a5,40(s0) + 7aa: 03043823 sd a6,48(s0) + 7ae: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 7b2: 00840613 addi a2,s0,8 + 7b6: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 7ba: 85aa mv a1,a0 + 7bc: 4505 li a0,1 + 7be: d0dff0ef jal 4ca +} + 7c2: 60e2 ld ra,24(sp) + 7c4: 6442 ld s0,16(sp) + 7c6: 6125 addi sp,sp,96 + 7c8: 8082 ret + +00000000000007ca : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7ca: 1141 addi sp,sp,-16 + 7cc: e422 sd s0,8(sp) + 7ce: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7d0: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7d4: 00001797 auipc a5,0x1 + 7d8: 82c7b783 ld a5,-2004(a5) # 1000 + 7dc: a02d j 806 + 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; + 7de: 4618 lw a4,8(a2) + 7e0: 9f2d addw a4,a4,a1 + 7e2: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7e6: 6398 ld a4,0(a5) + 7e8: 6310 ld a2,0(a4) + 7ea: a83d j 828 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7ec: ff852703 lw a4,-8(a0) + 7f0: 9f31 addw a4,a4,a2 + 7f2: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7f4: ff053683 ld a3,-16(a0) + 7f8: a091 j 83c + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7fa: 6398 ld a4,0(a5) + 7fc: 00e7e463 bltu a5,a4,804 + 800: 00e6ea63 bltu a3,a4,814 +{ + 804: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 806: fed7fae3 bgeu a5,a3,7fa + 80a: 6398 ld a4,0(a5) + 80c: 00e6e463 bltu a3,a4,814 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 810: fee7eae3 bltu a5,a4,804 + if(bp + bp->s.size == p->s.ptr){ + 814: ff852583 lw a1,-8(a0) + 818: 6390 ld a2,0(a5) + 81a: 02059813 slli a6,a1,0x20 + 81e: 01c85713 srli a4,a6,0x1c + 822: 9736 add a4,a4,a3 + 824: fae60de3 beq a2,a4,7de + bp->s.ptr = p->s.ptr->s.ptr; + 828: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 82c: 4790 lw a2,8(a5) + 82e: 02061593 slli a1,a2,0x20 + 832: 01c5d713 srli a4,a1,0x1c + 836: 973e add a4,a4,a5 + 838: fae68ae3 beq a3,a4,7ec + p->s.ptr = bp->s.ptr; + 83c: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 83e: 00000717 auipc a4,0x0 + 842: 7cf73123 sd a5,1986(a4) # 1000 +} + 846: 6422 ld s0,8(sp) + 848: 0141 addi sp,sp,16 + 84a: 8082 ret + +000000000000084c : + return freep; +} + +void* +malloc(uint nbytes) +{ + 84c: 7139 addi sp,sp,-64 + 84e: fc06 sd ra,56(sp) + 850: f822 sd s0,48(sp) + 852: f426 sd s1,40(sp) + 854: ec4e sd s3,24(sp) + 856: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 858: 02051493 slli s1,a0,0x20 + 85c: 9081 srli s1,s1,0x20 + 85e: 04bd addi s1,s1,15 + 860: 8091 srli s1,s1,0x4 + 862: 0014899b addiw s3,s1,1 + 866: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 868: 00000517 auipc a0,0x0 + 86c: 79853503 ld a0,1944(a0) # 1000 + 870: c915 beqz a0,8a4 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + 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: 08977a63 bgeu a4,s1,90a + 87a: f04a sd s2,32(sp) + 87c: e852 sd s4,16(sp) + 87e: e456 sd s5,8(sp) + 880: e05a sd s6,0(sp) + if(nu < 4096) + 882: 8a4e mv s4,s3 + 884: 0009871b sext.w a4,s3 + 888: 6685 lui a3,0x1 + 88a: 00d77363 bgeu a4,a3,890 + 88e: 6a05 lui s4,0x1 + 890: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 894: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 898: 00000917 auipc s2,0x0 + 89c: 76890913 addi s2,s2,1896 # 1000 + if(p == SBRK_ERROR) + 8a0: 5afd li s5,-1 + 8a2: a081 j 8e2 + 8a4: f04a sd s2,32(sp) + 8a6: e852 sd s4,16(sp) + 8a8: e456 sd s5,8(sp) + 8aa: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 8ac: 00001797 auipc a5,0x1 + 8b0: 95c78793 addi a5,a5,-1700 # 1208 + 8b4: 00000717 auipc a4,0x0 + 8b8: 74f73623 sd a5,1868(a4) # 1000 + 8bc: e39c sd a5,0(a5) + base.s.size = 0; + 8be: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 8c2: b7c1 j 882 + prevp->s.ptr = p->s.ptr; + 8c4: 6398 ld a4,0(a5) + 8c6: e118 sd a4,0(a0) + 8c8: a8a9 j 922 + hp->s.size = nu; + 8ca: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8ce: 0541 addi a0,a0,16 + 8d0: efbff0ef jal 7ca + return freep; + 8d4: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8d8: c12d beqz a0,93a + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8da: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8dc: 4798 lw a4,8(a5) + 8de: 02977263 bgeu a4,s1,902 + if(p == freep) + 8e2: 00093703 ld a4,0(s2) + 8e6: 853e mv a0,a5 + 8e8: fef719e3 bne a4,a5,8da + p = sbrk(nu * sizeof(Header)); + 8ec: 8552 mv a0,s4 + 8ee: a37ff0ef jal 324 + if(p == SBRK_ERROR) + 8f2: fd551ce3 bne a0,s5,8ca + return 0; + 8f6: 4501 li a0,0 + 8f8: 7902 ld s2,32(sp) + 8fa: 6a42 ld s4,16(sp) + 8fc: 6aa2 ld s5,8(sp) + 8fe: 6b02 ld s6,0(sp) + 900: a03d j 92e + 902: 7902 ld s2,32(sp) + 904: 6a42 ld s4,16(sp) + 906: 6aa2 ld s5,8(sp) + 908: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 90a: fae48de3 beq s1,a4,8c4 + p->s.size -= nunits; + 90e: 4137073b subw a4,a4,s3 + 912: c798 sw a4,8(a5) + p += p->s.size; + 914: 02071693 slli a3,a4,0x20 + 918: 01c6d713 srli a4,a3,0x1c + 91c: 97ba add a5,a5,a4 + p->s.size = nunits; + 91e: 0137a423 sw s3,8(a5) + freep = prevp; + 922: 00000717 auipc a4,0x0 + 926: 6ca73f23 sd a0,1758(a4) # 1000 + return (void*)(p + 1); + 92a: 01078513 addi a0,a5,16 + } +} + 92e: 70e2 ld ra,56(sp) + 930: 7442 ld s0,48(sp) + 932: 74a2 ld s1,40(sp) + 934: 69e2 ld s3,24(sp) + 936: 6121 addi sp,sp,64 + 938: 8082 ret + 93a: 7902 ld s2,32(sp) + 93c: 6a42 ld s4,16(sp) + 93e: 6aa2 ld s5,8(sp) + 940: 6b02 ld s6,0(sp) + 942: b7f5 j 92e diff --git a/user/forphan.c b/G12_Project1_xv6CustomizeSystemCalls/user/forphan.c similarity index 100% rename from user/forphan.c rename to G12_Project1_xv6CustomizeSystemCalls/user/forphan.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/forphan.d b/G12_Project1_xv6CustomizeSystemCalls/user/forphan.d new file mode 100644 index 0000000000..83769a0ab8 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/forphan.d @@ -0,0 +1,2 @@ +user/forphan.o: user/forphan.c kernel/types.h kernel/stat.h \ + kernel/fcntl.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/forphan.o b/G12_Project1_xv6CustomizeSystemCalls/user/forphan.o new file mode 100644 index 0000000000..40acd0482a Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/forphan.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/forphan.sym b/G12_Project1_xv6CustomizeSystemCalls/user/forphan.sym new file mode 100644 index 0000000000..fa45eaa234 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/forphan.sym @@ -0,0 +1,69 @@ +0000000000000000 .text +0000000000000948 .rodata +0000000000000a08 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 forphan.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000410 putc +000000000000042e printint +00000000000009f0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001208 base +00000000000000d4 strcpy +00000000000003e8 pause +0000000000000798 printf +00000000000003e0 sys_sbrk +000000000000027e memmove +00000000000003a0 mknod +000000000000018c gets +00000000000003d8 getpid +0000000000000310 memcpy +000000000000084c malloc +000000000000033a sbrklazy +0000000000000368 pipe +0000000000000378 write +00000000000003b0 fstat +000000000000076e fprintf +0000000000000388 kill +00000000000004ca vprintf +00000000000003c8 chdir +0000000000000390 exec +0000000000000360 wait +00000000000003f8 getprocsinfo +0000000000000370 read +00000000000003a8 unlink +00000000000002d6 memcmp +0000000000000350 fork +0000000000000324 sbrk +00000000000003f0 uptime +0000000000000146 memset +0000000000000000 main +0000000000000400 getppid +00000000000000f0 strcmp +00000000000003d0 dup +0000000000001010 buf +00000000000001fc stat +0000000000000408 sleep2 +00000000000003b8 link +0000000000000358 exit +00000000000000c4 start +0000000000000236 atoi +000000000000011c strlen +0000000000000398 open +0000000000000168 strchr +00000000000003c0 mkdir +0000000000000380 close +00000000000007ca free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/grep.asm b/G12_Project1_xv6CustomizeSystemCalls/user/grep.asm new file mode 100644 index 0000000000..8fd82c19a3 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/grep.asm @@ -0,0 +1,1784 @@ + +user/_grep: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + 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: 02c000ef jal 4a + 22: e919 bnez a0,38 + }while(*text!='\0' && (*text++==c || c=='.')); + 24: 0004c783 lbu a5,0(s1) + 28: cb89 beqz a5,3a + 2a: 0485 addi s1,s1,1 + 2c: 2781 sext.w a5,a5 + 2e: ff2786e3 beq a5,s2,1a + 32: ff4904e3 beq s2,s4,1a + 36: a011 j 3a + return 1; + 38: 4505 li a0,1 + return 0; +} + 3a: 70a2 ld ra,40(sp) + 3c: 7402 ld s0,32(sp) + 3e: 64e2 ld s1,24(sp) + 40: 6942 ld s2,16(sp) + 42: 69a2 ld s3,8(sp) + 44: 6a02 ld s4,0(sp) + 46: 6145 addi sp,sp,48 + 48: 8082 ret + +000000000000004a : + if(re[0] == '\0') + 4a: 00054703 lbu a4,0(a0) + 4e: c73d beqz a4,bc +{ + 50: 1141 addi sp,sp,-16 + 52: e406 sd ra,8(sp) + 54: e022 sd s0,0(sp) + 56: 0800 addi s0,sp,16 + 58: 87aa mv a5,a0 + if(re[1] == '*') + 5a: 00154683 lbu a3,1(a0) + 5e: 02a00613 li a2,42 + 62: 02c68563 beq a3,a2,8c + if(re[0] == '$' && re[1] == '\0') + 66: 02400613 li a2,36 + 6a: 02c70863 beq a4,a2,9a + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 6e: 0005c683 lbu a3,0(a1) + return 0; + 72: 4501 li a0,0 + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 74: ca81 beqz a3,84 + 76: 02e00613 li a2,46 + 7a: 02c70b63 beq a4,a2,b0 + return 0; + 7e: 4501 li a0,0 + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 80: 02d70863 beq a4,a3,b0 +} + 84: 60a2 ld ra,8(sp) + 86: 6402 ld s0,0(sp) + 88: 0141 addi sp,sp,16 + 8a: 8082 ret + return matchstar(re[0], re+2, text); + 8c: 862e mv a2,a1 + 8e: 00250593 addi a1,a0,2 + 92: 853a mv a0,a4 + 94: f6dff0ef jal 0 + 98: b7f5 j 84 + if(re[0] == '$' && re[1] == '\0') + 9a: c691 beqz a3,a6 + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 9c: 0005c683 lbu a3,0(a1) + a0: fef9 bnez a3,7e + return 0; + a2: 4501 li a0,0 + a4: b7c5 j 84 + return *text == '\0'; + a6: 0005c503 lbu a0,0(a1) + aa: 00153513 seqz a0,a0 + ae: bfd9 j 84 + return matchhere(re+1, text+1); + b0: 0585 addi a1,a1,1 + b2: 00178513 addi a0,a5,1 + b6: f95ff0ef jal 4a + ba: b7e9 j 84 + return 1; + bc: 4505 li a0,1 +} + be: 8082 ret + +00000000000000c0 : +{ + c0: 1101 addi sp,sp,-32 + c2: ec06 sd ra,24(sp) + c4: e822 sd s0,16(sp) + c6: e426 sd s1,8(sp) + c8: e04a sd s2,0(sp) + ca: 1000 addi s0,sp,32 + cc: 892a mv s2,a0 + ce: 84ae mv s1,a1 + if(re[0] == '^') + d0: 00054703 lbu a4,0(a0) + d4: 05e00793 li a5,94 + d8: 00f70c63 beq a4,a5,f0 + if(matchhere(re, text)) + dc: 85a6 mv a1,s1 + de: 854a mv a0,s2 + e0: f6bff0ef jal 4a + e4: e911 bnez a0,f8 + }while(*text++ != '\0'); + e6: 0485 addi s1,s1,1 + e8: fff4c783 lbu a5,-1(s1) + ec: fbe5 bnez a5,dc + ee: a031 j fa + return matchhere(re+1, text); + f0: 0505 addi a0,a0,1 + f2: f59ff0ef jal 4a + f6: a011 j fa + return 1; + f8: 4505 li a0,1 +} + fa: 60e2 ld ra,24(sp) + fc: 6442 ld s0,16(sp) + fe: 64a2 ld s1,8(sp) + 100: 6902 ld s2,0(sp) + 102: 6105 addi sp,sp,32 + 104: 8082 ret + +0000000000000106 : +{ + 106: 715d addi sp,sp,-80 + 108: e486 sd ra,72(sp) + 10a: e0a2 sd s0,64(sp) + 10c: fc26 sd s1,56(sp) + 10e: f84a sd s2,48(sp) + 110: f44e sd s3,40(sp) + 112: f052 sd s4,32(sp) + 114: ec56 sd s5,24(sp) + 116: e85a sd s6,16(sp) + 118: e45e sd s7,8(sp) + 11a: e062 sd s8,0(sp) + 11c: 0880 addi s0,sp,80 + 11e: 89aa mv s3,a0 + 120: 8b2e mv s6,a1 + m = 0; + 122: 4a01 li s4,0 + while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){ + 124: 3ff00b93 li s7,1023 + 128: 00002a97 auipc s5,0x2 + 12c: ee8a8a93 addi s5,s5,-280 # 2010 + 130: a835 j 16c + p = q+1; + 132: 00148913 addi s2,s1,1 + while((q = strchr(p, '\n')) != 0){ + 136: 45a9 li a1,10 + 138: 854a mv a0,s2 + 13a: 1c4000ef jal 2fe + 13e: 84aa mv s1,a0 + 140: c505 beqz a0,168 + *q = 0; + 142: 00048023 sb zero,0(s1) + if(match(pattern, p)){ + 146: 85ca mv a1,s2 + 148: 854e mv a0,s3 + 14a: f77ff0ef jal c0 + 14e: d175 beqz a0,132 + *q = '\n'; + 150: 47a9 li a5,10 + 152: 00f48023 sb a5,0(s1) + write(1, p, q+1 - p); + 156: 00148613 addi a2,s1,1 + 15a: 4126063b subw a2,a2,s2 + 15e: 85ca mv a1,s2 + 160: 4505 li a0,1 + 162: 3ac000ef jal 50e + 166: b7f1 j 132 + if(m > 0){ + 168: 03404563 bgtz s4,192 + while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){ + 16c: 414b863b subw a2,s7,s4 + 170: 014a85b3 add a1,s5,s4 + 174: 855a mv a0,s6 + 176: 390000ef jal 506 + 17a: 02a05963 blez a0,1ac + m += n; + 17e: 00aa0c3b addw s8,s4,a0 + 182: 000c0a1b sext.w s4,s8 + buf[m] = '\0'; + 186: 014a87b3 add a5,s5,s4 + 18a: 00078023 sb zero,0(a5) + p = buf; + 18e: 8956 mv s2,s5 + while((q = strchr(p, '\n')) != 0){ + 190: b75d j 136 + m -= p - buf; + 192: 00002517 auipc a0,0x2 + 196: e7e50513 addi a0,a0,-386 # 2010 + 19a: 40a90a33 sub s4,s2,a0 + 19e: 414c0a3b subw s4,s8,s4 + memmove(buf, p, m); + 1a2: 8652 mv a2,s4 + 1a4: 85ca mv a1,s2 + 1a6: 26e000ef jal 414 + 1aa: b7c9 j 16c +} + 1ac: 60a6 ld ra,72(sp) + 1ae: 6406 ld s0,64(sp) + 1b0: 74e2 ld s1,56(sp) + 1b2: 7942 ld s2,48(sp) + 1b4: 79a2 ld s3,40(sp) + 1b6: 7a02 ld s4,32(sp) + 1b8: 6ae2 ld s5,24(sp) + 1ba: 6b42 ld s6,16(sp) + 1bc: 6ba2 ld s7,8(sp) + 1be: 6c02 ld s8,0(sp) + 1c0: 6161 addi sp,sp,80 + 1c2: 8082 ret + +00000000000001c4
: +{ + 1c4: 7179 addi sp,sp,-48 + 1c6: f406 sd ra,40(sp) + 1c8: f022 sd s0,32(sp) + 1ca: ec26 sd s1,24(sp) + 1cc: e84a sd s2,16(sp) + 1ce: e44e sd s3,8(sp) + 1d0: e052 sd s4,0(sp) + 1d2: 1800 addi s0,sp,48 + if(argc <= 1){ + 1d4: 4785 li a5,1 + 1d6: 04a7d663 bge a5,a0,222 + pattern = argv[1]; + 1da: 0085ba03 ld s4,8(a1) + if(argc <= 2){ + 1de: 4789 li a5,2 + 1e0: 04a7db63 bge a5,a0,236 + 1e4: 01058913 addi s2,a1,16 + 1e8: ffd5099b addiw s3,a0,-3 + 1ec: 02099793 slli a5,s3,0x20 + 1f0: 01d7d993 srli s3,a5,0x1d + 1f4: 05e1 addi a1,a1,24 + 1f6: 99ae add s3,s3,a1 + if((fd = open(argv[i], O_RDONLY)) < 0){ + 1f8: 4581 li a1,0 + 1fa: 00093503 ld a0,0(s2) + 1fe: 330000ef jal 52e + 202: 84aa mv s1,a0 + 204: 04054063 bltz a0,244 + grep(pattern, fd); + 208: 85aa mv a1,a0 + 20a: 8552 mv a0,s4 + 20c: efbff0ef jal 106 + close(fd); + 210: 8526 mv a0,s1 + 212: 304000ef jal 516 + for(i = 2; i < argc; i++){ + 216: 0921 addi s2,s2,8 + 218: ff3910e3 bne s2,s3,1f8 + exit(0); + 21c: 4501 li a0,0 + 21e: 2d0000ef jal 4ee + fprintf(2, "usage: grep pattern [file ...]\n"); + 222: 00001597 auipc a1,0x1 + 226: 8be58593 addi a1,a1,-1858 # ae0 + 22a: 4509 li a0,2 + 22c: 6d8000ef jal 904 + exit(1); + 230: 4505 li a0,1 + 232: 2bc000ef jal 4ee + grep(pattern, 0); + 236: 4581 li a1,0 + 238: 8552 mv a0,s4 + 23a: ecdff0ef jal 106 + exit(0); + 23e: 4501 li a0,0 + 240: 2ae000ef jal 4ee + printf("grep: cannot open %s\n", argv[i]); + 244: 00093583 ld a1,0(s2) + 248: 00001517 auipc a0,0x1 + 24c: 8b850513 addi a0,a0,-1864 # b00 + 250: 6de000ef jal 92e + exit(1); + 254: 4505 li a0,1 + 256: 298000ef jal 4ee + +000000000000025a : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 25a: 1141 addi sp,sp,-16 + 25c: e406 sd ra,8(sp) + 25e: e022 sd s0,0(sp) + 260: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 262: f63ff0ef jal 1c4
+ exit(r); + 266: 288000ef jal 4ee + +000000000000026a : +} + +char* +strcpy(char *s, const char *t) +{ + 26a: 1141 addi sp,sp,-16 + 26c: e422 sd s0,8(sp) + 26e: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 270: 87aa mv a5,a0 + 272: 0585 addi a1,a1,1 + 274: 0785 addi a5,a5,1 + 276: fff5c703 lbu a4,-1(a1) + 27a: fee78fa3 sb a4,-1(a5) + 27e: fb75 bnez a4,272 + ; + return os; +} + 280: 6422 ld s0,8(sp) + 282: 0141 addi sp,sp,16 + 284: 8082 ret + +0000000000000286 : + +int +strcmp(const char *p, const char *q) +{ + 286: 1141 addi sp,sp,-16 + 288: e422 sd s0,8(sp) + 28a: 0800 addi s0,sp,16 + while(*p && *p == *q) + 28c: 00054783 lbu a5,0(a0) + 290: cb91 beqz a5,2a4 + 292: 0005c703 lbu a4,0(a1) + 296: 00f71763 bne a4,a5,2a4 + p++, q++; + 29a: 0505 addi a0,a0,1 + 29c: 0585 addi a1,a1,1 + while(*p && *p == *q) + 29e: 00054783 lbu a5,0(a0) + 2a2: fbe5 bnez a5,292 + return (uchar)*p - (uchar)*q; + 2a4: 0005c503 lbu a0,0(a1) +} + 2a8: 40a7853b subw a0,a5,a0 + 2ac: 6422 ld s0,8(sp) + 2ae: 0141 addi sp,sp,16 + 2b0: 8082 ret + +00000000000002b2 : + +uint +strlen(const char *s) +{ + 2b2: 1141 addi sp,sp,-16 + 2b4: e422 sd s0,8(sp) + 2b6: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 2b8: 00054783 lbu a5,0(a0) + 2bc: cf91 beqz a5,2d8 + 2be: 0505 addi a0,a0,1 + 2c0: 87aa mv a5,a0 + 2c2: 86be mv a3,a5 + 2c4: 0785 addi a5,a5,1 + 2c6: fff7c703 lbu a4,-1(a5) + 2ca: ff65 bnez a4,2c2 + 2cc: 40a6853b subw a0,a3,a0 + 2d0: 2505 addiw a0,a0,1 + ; + return n; +} + 2d2: 6422 ld s0,8(sp) + 2d4: 0141 addi sp,sp,16 + 2d6: 8082 ret + for(n = 0; s[n]; n++) + 2d8: 4501 li a0,0 + 2da: bfe5 j 2d2 + +00000000000002dc : + +void* +memset(void *dst, int c, uint n) +{ + 2dc: 1141 addi sp,sp,-16 + 2de: e422 sd s0,8(sp) + 2e0: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 2e2: ca19 beqz a2,2f8 + 2e4: 87aa mv a5,a0 + 2e6: 1602 slli a2,a2,0x20 + 2e8: 9201 srli a2,a2,0x20 + 2ea: 00a60733 add a4,a2,a0 + cdst[i] = c; + 2ee: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 2f2: 0785 addi a5,a5,1 + 2f4: fee79de3 bne a5,a4,2ee + } + return dst; +} + 2f8: 6422 ld s0,8(sp) + 2fa: 0141 addi sp,sp,16 + 2fc: 8082 ret + +00000000000002fe : + +char* +strchr(const char *s, char c) +{ + 2fe: 1141 addi sp,sp,-16 + 300: e422 sd s0,8(sp) + 302: 0800 addi s0,sp,16 + for(; *s; s++) + 304: 00054783 lbu a5,0(a0) + 308: cb99 beqz a5,31e + if(*s == c) + 30a: 00f58763 beq a1,a5,318 + for(; *s; s++) + 30e: 0505 addi a0,a0,1 + 310: 00054783 lbu a5,0(a0) + 314: fbfd bnez a5,30a + return (char*)s; + return 0; + 316: 4501 li a0,0 +} + 318: 6422 ld s0,8(sp) + 31a: 0141 addi sp,sp,16 + 31c: 8082 ret + return 0; + 31e: 4501 li a0,0 + 320: bfe5 j 318 + +0000000000000322 : + +char* +gets(char *buf, int max) +{ + 322: 711d addi sp,sp,-96 + 324: ec86 sd ra,88(sp) + 326: e8a2 sd s0,80(sp) + 328: e4a6 sd s1,72(sp) + 32a: e0ca sd s2,64(sp) + 32c: fc4e sd s3,56(sp) + 32e: f852 sd s4,48(sp) + 330: f456 sd s5,40(sp) + 332: f05a sd s6,32(sp) + 334: ec5e sd s7,24(sp) + 336: 1080 addi s0,sp,96 + 338: 8baa mv s7,a0 + 33a: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 33c: 892a mv s2,a0 + 33e: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 340: 4aa9 li s5,10 + 342: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 344: 89a6 mv s3,s1 + 346: 2485 addiw s1,s1,1 + 348: 0344d663 bge s1,s4,374 + cc = read(0, &c, 1); + 34c: 4605 li a2,1 + 34e: faf40593 addi a1,s0,-81 + 352: 4501 li a0,0 + 354: 1b2000ef jal 506 + if(cc < 1) + 358: 00a05e63 blez a0,374 + buf[i++] = c; + 35c: faf44783 lbu a5,-81(s0) + 360: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 364: 01578763 beq a5,s5,372 + 368: 0905 addi s2,s2,1 + 36a: fd679de3 bne a5,s6,344 + buf[i++] = c; + 36e: 89a6 mv s3,s1 + 370: a011 j 374 + 372: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 374: 99de add s3,s3,s7 + 376: 00098023 sb zero,0(s3) + return buf; +} + 37a: 855e mv a0,s7 + 37c: 60e6 ld ra,88(sp) + 37e: 6446 ld s0,80(sp) + 380: 64a6 ld s1,72(sp) + 382: 6906 ld s2,64(sp) + 384: 79e2 ld s3,56(sp) + 386: 7a42 ld s4,48(sp) + 388: 7aa2 ld s5,40(sp) + 38a: 7b02 ld s6,32(sp) + 38c: 6be2 ld s7,24(sp) + 38e: 6125 addi sp,sp,96 + 390: 8082 ret + +0000000000000392 : + +int +stat(const char *n, struct stat *st) +{ + 392: 1101 addi sp,sp,-32 + 394: ec06 sd ra,24(sp) + 396: e822 sd s0,16(sp) + 398: e04a sd s2,0(sp) + 39a: 1000 addi s0,sp,32 + 39c: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 39e: 4581 li a1,0 + 3a0: 18e000ef jal 52e + if(fd < 0) + 3a4: 02054263 bltz a0,3c8 + 3a8: e426 sd s1,8(sp) + 3aa: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 3ac: 85ca mv a1,s2 + 3ae: 198000ef jal 546 + 3b2: 892a mv s2,a0 + close(fd); + 3b4: 8526 mv a0,s1 + 3b6: 160000ef jal 516 + return r; + 3ba: 64a2 ld s1,8(sp) +} + 3bc: 854a mv a0,s2 + 3be: 60e2 ld ra,24(sp) + 3c0: 6442 ld s0,16(sp) + 3c2: 6902 ld s2,0(sp) + 3c4: 6105 addi sp,sp,32 + 3c6: 8082 ret + return -1; + 3c8: 597d li s2,-1 + 3ca: bfcd j 3bc + +00000000000003cc : + +int +atoi(const char *s) +{ + 3cc: 1141 addi sp,sp,-16 + 3ce: e422 sd s0,8(sp) + 3d0: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 3d2: 00054683 lbu a3,0(a0) + 3d6: fd06879b addiw a5,a3,-48 + 3da: 0ff7f793 zext.b a5,a5 + 3de: 4625 li a2,9 + 3e0: 02f66863 bltu a2,a5,410 + 3e4: 872a mv a4,a0 + n = 0; + 3e6: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 3e8: 0705 addi a4,a4,1 + 3ea: 0025179b slliw a5,a0,0x2 + 3ee: 9fa9 addw a5,a5,a0 + 3f0: 0017979b slliw a5,a5,0x1 + 3f4: 9fb5 addw a5,a5,a3 + 3f6: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 3fa: 00074683 lbu a3,0(a4) + 3fe: fd06879b addiw a5,a3,-48 + 402: 0ff7f793 zext.b a5,a5 + 406: fef671e3 bgeu a2,a5,3e8 + return n; +} + 40a: 6422 ld s0,8(sp) + 40c: 0141 addi sp,sp,16 + 40e: 8082 ret + n = 0; + 410: 4501 li a0,0 + 412: bfe5 j 40a + +0000000000000414 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 414: 1141 addi sp,sp,-16 + 416: e422 sd s0,8(sp) + 418: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 41a: 02b57463 bgeu a0,a1,442 + while(n-- > 0) + 41e: 00c05f63 blez a2,43c + 422: 1602 slli a2,a2,0x20 + 424: 9201 srli a2,a2,0x20 + 426: 00c507b3 add a5,a0,a2 + dst = vdst; + 42a: 872a mv a4,a0 + *dst++ = *src++; + 42c: 0585 addi a1,a1,1 + 42e: 0705 addi a4,a4,1 + 430: fff5c683 lbu a3,-1(a1) + 434: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 438: fef71ae3 bne a4,a5,42c + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 43c: 6422 ld s0,8(sp) + 43e: 0141 addi sp,sp,16 + 440: 8082 ret + dst += n; + 442: 00c50733 add a4,a0,a2 + src += n; + 446: 95b2 add a1,a1,a2 + while(n-- > 0) + 448: fec05ae3 blez a2,43c + 44c: fff6079b addiw a5,a2,-1 + 450: 1782 slli a5,a5,0x20 + 452: 9381 srli a5,a5,0x20 + 454: fff7c793 not a5,a5 + 458: 97ba add a5,a5,a4 + *--dst = *--src; + 45a: 15fd addi a1,a1,-1 + 45c: 177d addi a4,a4,-1 + 45e: 0005c683 lbu a3,0(a1) + 462: 00d70023 sb a3,0(a4) + while(n-- > 0) + 466: fee79ae3 bne a5,a4,45a + 46a: bfc9 j 43c + +000000000000046c : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 46c: 1141 addi sp,sp,-16 + 46e: e422 sd s0,8(sp) + 470: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 472: ca05 beqz a2,4a2 + 474: fff6069b addiw a3,a2,-1 + 478: 1682 slli a3,a3,0x20 + 47a: 9281 srli a3,a3,0x20 + 47c: 0685 addi a3,a3,1 + 47e: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 480: 00054783 lbu a5,0(a0) + 484: 0005c703 lbu a4,0(a1) + 488: 00e79863 bne a5,a4,498 + return *p1 - *p2; + } + p1++; + 48c: 0505 addi a0,a0,1 + p2++; + 48e: 0585 addi a1,a1,1 + while (n-- > 0) { + 490: fed518e3 bne a0,a3,480 + } + return 0; + 494: 4501 li a0,0 + 496: a019 j 49c + return *p1 - *p2; + 498: 40e7853b subw a0,a5,a4 +} + 49c: 6422 ld s0,8(sp) + 49e: 0141 addi sp,sp,16 + 4a0: 8082 ret + return 0; + 4a2: 4501 li a0,0 + 4a4: bfe5 j 49c + +00000000000004a6 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 4a6: 1141 addi sp,sp,-16 + 4a8: e406 sd ra,8(sp) + 4aa: e022 sd s0,0(sp) + 4ac: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 4ae: f67ff0ef jal 414 +} + 4b2: 60a2 ld ra,8(sp) + 4b4: 6402 ld s0,0(sp) + 4b6: 0141 addi sp,sp,16 + 4b8: 8082 ret + +00000000000004ba : + +char * +sbrk(int n) { + 4ba: 1141 addi sp,sp,-16 + 4bc: e406 sd ra,8(sp) + 4be: e022 sd s0,0(sp) + 4c0: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 4c2: 4585 li a1,1 + 4c4: 0b2000ef jal 576 +} + 4c8: 60a2 ld ra,8(sp) + 4ca: 6402 ld s0,0(sp) + 4cc: 0141 addi sp,sp,16 + 4ce: 8082 ret + +00000000000004d0 : + +char * +sbrklazy(int n) { + 4d0: 1141 addi sp,sp,-16 + 4d2: e406 sd ra,8(sp) + 4d4: e022 sd s0,0(sp) + 4d6: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 4d8: 4589 li a1,2 + 4da: 09c000ef jal 576 +} + 4de: 60a2 ld ra,8(sp) + 4e0: 6402 ld s0,0(sp) + 4e2: 0141 addi sp,sp,16 + 4e4: 8082 ret + +00000000000004e6 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 4e6: 4885 li a7,1 + ecall + 4e8: 00000073 ecall + ret + 4ec: 8082 ret + +00000000000004ee : +.global exit +exit: + li a7, SYS_exit + 4ee: 4889 li a7,2 + ecall + 4f0: 00000073 ecall + ret + 4f4: 8082 ret + +00000000000004f6 : +.global wait +wait: + li a7, SYS_wait + 4f6: 488d li a7,3 + ecall + 4f8: 00000073 ecall + ret + 4fc: 8082 ret + +00000000000004fe : +.global pipe +pipe: + li a7, SYS_pipe + 4fe: 4891 li a7,4 + ecall + 500: 00000073 ecall + ret + 504: 8082 ret + +0000000000000506 : +.global read +read: + li a7, SYS_read + 506: 4895 li a7,5 + ecall + 508: 00000073 ecall + ret + 50c: 8082 ret + +000000000000050e : +.global write +write: + li a7, SYS_write + 50e: 48c1 li a7,16 + ecall + 510: 00000073 ecall + ret + 514: 8082 ret + +0000000000000516 : +.global close +close: + li a7, SYS_close + 516: 48d5 li a7,21 + ecall + 518: 00000073 ecall + ret + 51c: 8082 ret + +000000000000051e : +.global kill +kill: + li a7, SYS_kill + 51e: 4899 li a7,6 + ecall + 520: 00000073 ecall + ret + 524: 8082 ret + +0000000000000526 : +.global exec +exec: + li a7, SYS_exec + 526: 489d li a7,7 + ecall + 528: 00000073 ecall + ret + 52c: 8082 ret + +000000000000052e : +.global open +open: + li a7, SYS_open + 52e: 48bd li a7,15 + ecall + 530: 00000073 ecall + ret + 534: 8082 ret + +0000000000000536 : +.global mknod +mknod: + li a7, SYS_mknod + 536: 48c5 li a7,17 + ecall + 538: 00000073 ecall + ret + 53c: 8082 ret + +000000000000053e : +.global unlink +unlink: + li a7, SYS_unlink + 53e: 48c9 li a7,18 + ecall + 540: 00000073 ecall + ret + 544: 8082 ret + +0000000000000546 : +.global fstat +fstat: + li a7, SYS_fstat + 546: 48a1 li a7,8 + ecall + 548: 00000073 ecall + ret + 54c: 8082 ret + +000000000000054e : +.global link +link: + li a7, SYS_link + 54e: 48cd li a7,19 + ecall + 550: 00000073 ecall + ret + 554: 8082 ret + +0000000000000556 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 556: 48d1 li a7,20 + ecall + 558: 00000073 ecall + ret + 55c: 8082 ret + +000000000000055e : +.global chdir +chdir: + li a7, SYS_chdir + 55e: 48a5 li a7,9 + ecall + 560: 00000073 ecall + ret + 564: 8082 ret + +0000000000000566 : +.global dup +dup: + li a7, SYS_dup + 566: 48a9 li a7,10 + ecall + 568: 00000073 ecall + ret + 56c: 8082 ret + +000000000000056e : +.global getpid +getpid: + li a7, SYS_getpid + 56e: 48ad li a7,11 + ecall + 570: 00000073 ecall + ret + 574: 8082 ret + +0000000000000576 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 576: 48b1 li a7,12 + ecall + 578: 00000073 ecall + ret + 57c: 8082 ret + +000000000000057e : +.global pause +pause: + li a7, SYS_pause + 57e: 48b5 li a7,13 + ecall + 580: 00000073 ecall + ret + 584: 8082 ret + +0000000000000586 : +.global uptime +uptime: + li a7, SYS_uptime + 586: 48b9 li a7,14 + ecall + 588: 00000073 ecall + ret + 58c: 8082 ret + +000000000000058e : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 58e: 48d9 li a7,22 + ecall + 590: 00000073 ecall + ret + 594: 8082 ret + +0000000000000596 : +.global getppid +getppid: + li a7, SYS_getppid + 596: 48dd li a7,23 + ecall + 598: 00000073 ecall + ret + 59c: 8082 ret + +000000000000059e : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 59e: 48e1 li a7,24 + ecall + 5a0: 00000073 ecall + ret + 5a4: 8082 ret + +00000000000005a6 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 5a6: 1101 addi sp,sp,-32 + 5a8: ec06 sd ra,24(sp) + 5aa: e822 sd s0,16(sp) + 5ac: 1000 addi s0,sp,32 + 5ae: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 5b2: 4605 li a2,1 + 5b4: fef40593 addi a1,s0,-17 + 5b8: f57ff0ef jal 50e +} + 5bc: 60e2 ld ra,24(sp) + 5be: 6442 ld s0,16(sp) + 5c0: 6105 addi sp,sp,32 + 5c2: 8082 ret + +00000000000005c4 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 5c4: 715d addi sp,sp,-80 + 5c6: e486 sd ra,72(sp) + 5c8: e0a2 sd s0,64(sp) + 5ca: f84a sd s2,48(sp) + 5cc: 0880 addi s0,sp,80 + 5ce: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 5d0: c299 beqz a3,5d6 + 5d2: 0805c363 bltz a1,658 + neg = 0; + 5d6: 4881 li a7,0 + 5d8: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 5dc: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 5de: 00000517 auipc a0,0x0 + 5e2: 54250513 addi a0,a0,1346 # b20 + 5e6: 883e mv a6,a5 + 5e8: 2785 addiw a5,a5,1 + 5ea: 02c5f733 remu a4,a1,a2 + 5ee: 972a add a4,a4,a0 + 5f0: 00074703 lbu a4,0(a4) + 5f4: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 5f8: 872e mv a4,a1 + 5fa: 02c5d5b3 divu a1,a1,a2 + 5fe: 0685 addi a3,a3,1 + 600: fec773e3 bgeu a4,a2,5e6 + if(neg) + 604: 00088b63 beqz a7,61a + buf[i++] = '-'; + 608: fd078793 addi a5,a5,-48 + 60c: 97a2 add a5,a5,s0 + 60e: 02d00713 li a4,45 + 612: fee78423 sb a4,-24(a5) + 616: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 61a: 02f05a63 blez a5,64e + 61e: fc26 sd s1,56(sp) + 620: f44e sd s3,40(sp) + 622: fb840713 addi a4,s0,-72 + 626: 00f704b3 add s1,a4,a5 + 62a: fff70993 addi s3,a4,-1 + 62e: 99be add s3,s3,a5 + 630: 37fd addiw a5,a5,-1 + 632: 1782 slli a5,a5,0x20 + 634: 9381 srli a5,a5,0x20 + 636: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 63a: fff4c583 lbu a1,-1(s1) + 63e: 854a mv a0,s2 + 640: f67ff0ef jal 5a6 + while(--i >= 0) + 644: 14fd addi s1,s1,-1 + 646: ff349ae3 bne s1,s3,63a + 64a: 74e2 ld s1,56(sp) + 64c: 79a2 ld s3,40(sp) +} + 64e: 60a6 ld ra,72(sp) + 650: 6406 ld s0,64(sp) + 652: 7942 ld s2,48(sp) + 654: 6161 addi sp,sp,80 + 656: 8082 ret + x = -xx; + 658: 40b005b3 neg a1,a1 + neg = 1; + 65c: 4885 li a7,1 + x = -xx; + 65e: bfad j 5d8 + +0000000000000660 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 660: 711d addi sp,sp,-96 + 662: ec86 sd ra,88(sp) + 664: e8a2 sd s0,80(sp) + 666: e0ca sd s2,64(sp) + 668: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 66a: 0005c903 lbu s2,0(a1) + 66e: 28090663 beqz s2,8fa + 672: e4a6 sd s1,72(sp) + 674: fc4e sd s3,56(sp) + 676: f852 sd s4,48(sp) + 678: f456 sd s5,40(sp) + 67a: f05a sd s6,32(sp) + 67c: ec5e sd s7,24(sp) + 67e: e862 sd s8,16(sp) + 680: e466 sd s9,8(sp) + 682: 8b2a mv s6,a0 + 684: 8a2e mv s4,a1 + 686: 8bb2 mv s7,a2 + state = 0; + 688: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 68a: 4481 li s1,0 + 68c: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 68e: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 692: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 696: 06c00c93 li s9,108 + 69a: a005 j 6ba + putc(fd, c0); + 69c: 85ca mv a1,s2 + 69e: 855a mv a0,s6 + 6a0: f07ff0ef jal 5a6 + 6a4: a019 j 6aa + } else if(state == '%'){ + 6a6: 03598263 beq s3,s5,6ca + for(i = 0; fmt[i]; i++){ + 6aa: 2485 addiw s1,s1,1 + 6ac: 8726 mv a4,s1 + 6ae: 009a07b3 add a5,s4,s1 + 6b2: 0007c903 lbu s2,0(a5) + 6b6: 22090a63 beqz s2,8ea + c0 = fmt[i] & 0xff; + 6ba: 0009079b sext.w a5,s2 + if(state == 0){ + 6be: fe0994e3 bnez s3,6a6 + if(c0 == '%'){ + 6c2: fd579de3 bne a5,s5,69c + state = '%'; + 6c6: 89be mv s3,a5 + 6c8: b7cd j 6aa + if(c0) c1 = fmt[i+1] & 0xff; + 6ca: 00ea06b3 add a3,s4,a4 + 6ce: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 6d2: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 6d4: c681 beqz a3,6dc + 6d6: 9752 add a4,a4,s4 + 6d8: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 6dc: 05878363 beq a5,s8,722 + } else if(c0 == 'l' && c1 == 'd'){ + 6e0: 05978d63 beq a5,s9,73a + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 6e4: 07500713 li a4,117 + 6e8: 0ee78763 beq a5,a4,7d6 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 6ec: 07800713 li a4,120 + 6f0: 12e78963 beq a5,a4,822 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 6f4: 07000713 li a4,112 + 6f8: 14e78e63 beq a5,a4,854 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 6fc: 06300713 li a4,99 + 700: 18e78e63 beq a5,a4,89c + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 704: 07300713 li a4,115 + 708: 1ae78463 beq a5,a4,8b0 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 70c: 02500713 li a4,37 + 710: 04e79563 bne a5,a4,75a + putc(fd, '%'); + 714: 02500593 li a1,37 + 718: 855a mv a0,s6 + 71a: e8dff0ef jal 5a6 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 71e: 4981 li s3,0 + 720: b769 j 6aa + printint(fd, va_arg(ap, int), 10, 1); + 722: 008b8913 addi s2,s7,8 + 726: 4685 li a3,1 + 728: 4629 li a2,10 + 72a: 000ba583 lw a1,0(s7) + 72e: 855a mv a0,s6 + 730: e95ff0ef jal 5c4 + 734: 8bca mv s7,s2 + state = 0; + 736: 4981 li s3,0 + 738: bf8d j 6aa + } else if(c0 == 'l' && c1 == 'd'){ + 73a: 06400793 li a5,100 + 73e: 02f68963 beq a3,a5,770 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 742: 06c00793 li a5,108 + 746: 04f68263 beq a3,a5,78a + } else if(c0 == 'l' && c1 == 'u'){ + 74a: 07500793 li a5,117 + 74e: 0af68063 beq a3,a5,7ee + } else if(c0 == 'l' && c1 == 'x'){ + 752: 07800793 li a5,120 + 756: 0ef68263 beq a3,a5,83a + putc(fd, '%'); + 75a: 02500593 li a1,37 + 75e: 855a mv a0,s6 + 760: e47ff0ef jal 5a6 + putc(fd, c0); + 764: 85ca mv a1,s2 + 766: 855a mv a0,s6 + 768: e3fff0ef jal 5a6 + state = 0; + 76c: 4981 li s3,0 + 76e: bf35 j 6aa + printint(fd, va_arg(ap, uint64), 10, 1); + 770: 008b8913 addi s2,s7,8 + 774: 4685 li a3,1 + 776: 4629 li a2,10 + 778: 000bb583 ld a1,0(s7) + 77c: 855a mv a0,s6 + 77e: e47ff0ef jal 5c4 + i += 1; + 782: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 784: 8bca mv s7,s2 + state = 0; + 786: 4981 li s3,0 + i += 1; + 788: b70d j 6aa + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 78a: 06400793 li a5,100 + 78e: 02f60763 beq a2,a5,7bc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 792: 07500793 li a5,117 + 796: 06f60963 beq a2,a5,808 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 79a: 07800793 li a5,120 + 79e: faf61ee3 bne a2,a5,75a + printint(fd, va_arg(ap, uint64), 16, 0); + 7a2: 008b8913 addi s2,s7,8 + 7a6: 4681 li a3,0 + 7a8: 4641 li a2,16 + 7aa: 000bb583 ld a1,0(s7) + 7ae: 855a mv a0,s6 + 7b0: e15ff0ef jal 5c4 + i += 2; + 7b4: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 7b6: 8bca mv s7,s2 + state = 0; + 7b8: 4981 li s3,0 + i += 2; + 7ba: bdc5 j 6aa + printint(fd, va_arg(ap, uint64), 10, 1); + 7bc: 008b8913 addi s2,s7,8 + 7c0: 4685 li a3,1 + 7c2: 4629 li a2,10 + 7c4: 000bb583 ld a1,0(s7) + 7c8: 855a mv a0,s6 + 7ca: dfbff0ef jal 5c4 + i += 2; + 7ce: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 7d0: 8bca mv s7,s2 + state = 0; + 7d2: 4981 li s3,0 + i += 2; + 7d4: bdd9 j 6aa + printint(fd, va_arg(ap, uint32), 10, 0); + 7d6: 008b8913 addi s2,s7,8 + 7da: 4681 li a3,0 + 7dc: 4629 li a2,10 + 7de: 000be583 lwu a1,0(s7) + 7e2: 855a mv a0,s6 + 7e4: de1ff0ef jal 5c4 + 7e8: 8bca mv s7,s2 + state = 0; + 7ea: 4981 li s3,0 + 7ec: bd7d j 6aa + printint(fd, va_arg(ap, uint64), 10, 0); + 7ee: 008b8913 addi s2,s7,8 + 7f2: 4681 li a3,0 + 7f4: 4629 li a2,10 + 7f6: 000bb583 ld a1,0(s7) + 7fa: 855a mv a0,s6 + 7fc: dc9ff0ef jal 5c4 + i += 1; + 800: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 802: 8bca mv s7,s2 + state = 0; + 804: 4981 li s3,0 + i += 1; + 806: b555 j 6aa + printint(fd, va_arg(ap, uint64), 10, 0); + 808: 008b8913 addi s2,s7,8 + 80c: 4681 li a3,0 + 80e: 4629 li a2,10 + 810: 000bb583 ld a1,0(s7) + 814: 855a mv a0,s6 + 816: dafff0ef jal 5c4 + i += 2; + 81a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 81c: 8bca mv s7,s2 + state = 0; + 81e: 4981 li s3,0 + i += 2; + 820: b569 j 6aa + printint(fd, va_arg(ap, uint32), 16, 0); + 822: 008b8913 addi s2,s7,8 + 826: 4681 li a3,0 + 828: 4641 li a2,16 + 82a: 000be583 lwu a1,0(s7) + 82e: 855a mv a0,s6 + 830: d95ff0ef jal 5c4 + 834: 8bca mv s7,s2 + state = 0; + 836: 4981 li s3,0 + 838: bd8d j 6aa + printint(fd, va_arg(ap, uint64), 16, 0); + 83a: 008b8913 addi s2,s7,8 + 83e: 4681 li a3,0 + 840: 4641 li a2,16 + 842: 000bb583 ld a1,0(s7) + 846: 855a mv a0,s6 + 848: d7dff0ef jal 5c4 + i += 1; + 84c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 84e: 8bca mv s7,s2 + state = 0; + 850: 4981 li s3,0 + i += 1; + 852: bda1 j 6aa + 854: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 856: 008b8d13 addi s10,s7,8 + 85a: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 85e: 03000593 li a1,48 + 862: 855a mv a0,s6 + 864: d43ff0ef jal 5a6 + putc(fd, 'x'); + 868: 07800593 li a1,120 + 86c: 855a mv a0,s6 + 86e: d39ff0ef jal 5a6 + 872: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 874: 00000b97 auipc s7,0x0 + 878: 2acb8b93 addi s7,s7,684 # b20 + 87c: 03c9d793 srli a5,s3,0x3c + 880: 97de add a5,a5,s7 + 882: 0007c583 lbu a1,0(a5) + 886: 855a mv a0,s6 + 888: d1fff0ef jal 5a6 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 88c: 0992 slli s3,s3,0x4 + 88e: 397d addiw s2,s2,-1 + 890: fe0916e3 bnez s2,87c + printptr(fd, va_arg(ap, uint64)); + 894: 8bea mv s7,s10 + state = 0; + 896: 4981 li s3,0 + 898: 6d02 ld s10,0(sp) + 89a: bd01 j 6aa + putc(fd, va_arg(ap, uint32)); + 89c: 008b8913 addi s2,s7,8 + 8a0: 000bc583 lbu a1,0(s7) + 8a4: 855a mv a0,s6 + 8a6: d01ff0ef jal 5a6 + 8aa: 8bca mv s7,s2 + state = 0; + 8ac: 4981 li s3,0 + 8ae: bbf5 j 6aa + if((s = va_arg(ap, char*)) == 0) + 8b0: 008b8993 addi s3,s7,8 + 8b4: 000bb903 ld s2,0(s7) + 8b8: 00090f63 beqz s2,8d6 + for(; *s; s++) + 8bc: 00094583 lbu a1,0(s2) + 8c0: c195 beqz a1,8e4 + putc(fd, *s); + 8c2: 855a mv a0,s6 + 8c4: ce3ff0ef jal 5a6 + for(; *s; s++) + 8c8: 0905 addi s2,s2,1 + 8ca: 00094583 lbu a1,0(s2) + 8ce: f9f5 bnez a1,8c2 + if((s = va_arg(ap, char*)) == 0) + 8d0: 8bce mv s7,s3 + state = 0; + 8d2: 4981 li s3,0 + 8d4: bbd9 j 6aa + s = "(null)"; + 8d6: 00000917 auipc s2,0x0 + 8da: 24290913 addi s2,s2,578 # b18 + for(; *s; s++) + 8de: 02800593 li a1,40 + 8e2: b7c5 j 8c2 + if((s = va_arg(ap, char*)) == 0) + 8e4: 8bce mv s7,s3 + state = 0; + 8e6: 4981 li s3,0 + 8e8: b3c9 j 6aa + 8ea: 64a6 ld s1,72(sp) + 8ec: 79e2 ld s3,56(sp) + 8ee: 7a42 ld s4,48(sp) + 8f0: 7aa2 ld s5,40(sp) + 8f2: 7b02 ld s6,32(sp) + 8f4: 6be2 ld s7,24(sp) + 8f6: 6c42 ld s8,16(sp) + 8f8: 6ca2 ld s9,8(sp) + } + } +} + 8fa: 60e6 ld ra,88(sp) + 8fc: 6446 ld s0,80(sp) + 8fe: 6906 ld s2,64(sp) + 900: 6125 addi sp,sp,96 + 902: 8082 ret + +0000000000000904 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 904: 715d addi sp,sp,-80 + 906: ec06 sd ra,24(sp) + 908: e822 sd s0,16(sp) + 90a: 1000 addi s0,sp,32 + 90c: e010 sd a2,0(s0) + 90e: e414 sd a3,8(s0) + 910: e818 sd a4,16(s0) + 912: ec1c sd a5,24(s0) + 914: 03043023 sd a6,32(s0) + 918: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 91c: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 920: 8622 mv a2,s0 + 922: d3fff0ef jal 660 +} + 926: 60e2 ld ra,24(sp) + 928: 6442 ld s0,16(sp) + 92a: 6161 addi sp,sp,80 + 92c: 8082 ret + +000000000000092e : + +void +printf(const char *fmt, ...) +{ + 92e: 711d addi sp,sp,-96 + 930: ec06 sd ra,24(sp) + 932: e822 sd s0,16(sp) + 934: 1000 addi s0,sp,32 + 936: e40c sd a1,8(s0) + 938: e810 sd a2,16(s0) + 93a: ec14 sd a3,24(s0) + 93c: f018 sd a4,32(s0) + 93e: f41c sd a5,40(s0) + 940: 03043823 sd a6,48(s0) + 944: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 948: 00840613 addi a2,s0,8 + 94c: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 950: 85aa mv a1,a0 + 952: 4505 li a0,1 + 954: d0dff0ef jal 660 +} + 958: 60e2 ld ra,24(sp) + 95a: 6442 ld s0,16(sp) + 95c: 6125 addi sp,sp,96 + 95e: 8082 ret + +0000000000000960 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 960: 1141 addi sp,sp,-16 + 962: e422 sd s0,8(sp) + 964: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 966: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 96a: 00001797 auipc a5,0x1 + 96e: 6967b783 ld a5,1686(a5) # 2000 + 972: a02d j 99c + 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; + 974: 4618 lw a4,8(a2) + 976: 9f2d addw a4,a4,a1 + 978: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 97c: 6398 ld a4,0(a5) + 97e: 6310 ld a2,0(a4) + 980: a83d j 9be + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 982: ff852703 lw a4,-8(a0) + 986: 9f31 addw a4,a4,a2 + 988: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 98a: ff053683 ld a3,-16(a0) + 98e: a091 j 9d2 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 990: 6398 ld a4,0(a5) + 992: 00e7e463 bltu a5,a4,99a + 996: 00e6ea63 bltu a3,a4,9aa +{ + 99a: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 99c: fed7fae3 bgeu a5,a3,990 + 9a0: 6398 ld a4,0(a5) + 9a2: 00e6e463 bltu a3,a4,9aa + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 9a6: fee7eae3 bltu a5,a4,99a + if(bp + bp->s.size == p->s.ptr){ + 9aa: ff852583 lw a1,-8(a0) + 9ae: 6390 ld a2,0(a5) + 9b0: 02059813 slli a6,a1,0x20 + 9b4: 01c85713 srli a4,a6,0x1c + 9b8: 9736 add a4,a4,a3 + 9ba: fae60de3 beq a2,a4,974 + bp->s.ptr = p->s.ptr->s.ptr; + 9be: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 9c2: 4790 lw a2,8(a5) + 9c4: 02061593 slli a1,a2,0x20 + 9c8: 01c5d713 srli a4,a1,0x1c + 9cc: 973e add a4,a4,a5 + 9ce: fae68ae3 beq a3,a4,982 + p->s.ptr = bp->s.ptr; + 9d2: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 9d4: 00001717 auipc a4,0x1 + 9d8: 62f73623 sd a5,1580(a4) # 2000 +} + 9dc: 6422 ld s0,8(sp) + 9de: 0141 addi sp,sp,16 + 9e0: 8082 ret + +00000000000009e2 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 9e2: 7139 addi sp,sp,-64 + 9e4: fc06 sd ra,56(sp) + 9e6: f822 sd s0,48(sp) + 9e8: f426 sd s1,40(sp) + 9ea: ec4e sd s3,24(sp) + 9ec: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 9ee: 02051493 slli s1,a0,0x20 + 9f2: 9081 srli s1,s1,0x20 + 9f4: 04bd addi s1,s1,15 + 9f6: 8091 srli s1,s1,0x4 + 9f8: 0014899b addiw s3,s1,1 + 9fc: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 9fe: 00001517 auipc a0,0x1 + a02: 60253503 ld a0,1538(a0) # 2000 + a06: c915 beqz a0,a3a + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + a08: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + a0a: 4798 lw a4,8(a5) + a0c: 08977a63 bgeu a4,s1,aa0 + a10: f04a sd s2,32(sp) + a12: e852 sd s4,16(sp) + a14: e456 sd s5,8(sp) + a16: e05a sd s6,0(sp) + if(nu < 4096) + a18: 8a4e mv s4,s3 + a1a: 0009871b sext.w a4,s3 + a1e: 6685 lui a3,0x1 + a20: 00d77363 bgeu a4,a3,a26 + a24: 6a05 lui s4,0x1 + a26: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + a2a: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + a2e: 00001917 auipc s2,0x1 + a32: 5d290913 addi s2,s2,1490 # 2000 + if(p == SBRK_ERROR) + a36: 5afd li s5,-1 + a38: a081 j a78 + a3a: f04a sd s2,32(sp) + a3c: e852 sd s4,16(sp) + a3e: e456 sd s5,8(sp) + a40: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + a42: 00002797 auipc a5,0x2 + a46: 9ce78793 addi a5,a5,-1586 # 2410 + a4a: 00001717 auipc a4,0x1 + a4e: 5af73b23 sd a5,1462(a4) # 2000 + a52: e39c sd a5,0(a5) + base.s.size = 0; + a54: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + a58: b7c1 j a18 + prevp->s.ptr = p->s.ptr; + a5a: 6398 ld a4,0(a5) + a5c: e118 sd a4,0(a0) + a5e: a8a9 j ab8 + hp->s.size = nu; + a60: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + a64: 0541 addi a0,a0,16 + a66: efbff0ef jal 960 + return freep; + a6a: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + a6e: c12d beqz a0,ad0 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + a70: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + a72: 4798 lw a4,8(a5) + a74: 02977263 bgeu a4,s1,a98 + if(p == freep) + a78: 00093703 ld a4,0(s2) + a7c: 853e mv a0,a5 + a7e: fef719e3 bne a4,a5,a70 + p = sbrk(nu * sizeof(Header)); + a82: 8552 mv a0,s4 + a84: a37ff0ef jal 4ba + if(p == SBRK_ERROR) + a88: fd551ce3 bne a0,s5,a60 + return 0; + a8c: 4501 li a0,0 + a8e: 7902 ld s2,32(sp) + a90: 6a42 ld s4,16(sp) + a92: 6aa2 ld s5,8(sp) + a94: 6b02 ld s6,0(sp) + a96: a03d j ac4 + a98: 7902 ld s2,32(sp) + a9a: 6a42 ld s4,16(sp) + a9c: 6aa2 ld s5,8(sp) + a9e: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + aa0: fae48de3 beq s1,a4,a5a + p->s.size -= nunits; + aa4: 4137073b subw a4,a4,s3 + aa8: c798 sw a4,8(a5) + p += p->s.size; + aaa: 02071693 slli a3,a4,0x20 + aae: 01c6d713 srli a4,a3,0x1c + ab2: 97ba add a5,a5,a4 + p->s.size = nunits; + ab4: 0137a423 sw s3,8(a5) + freep = prevp; + ab8: 00001717 auipc a4,0x1 + abc: 54a73423 sd a0,1352(a4) # 2000 + return (void*)(p + 1); + ac0: 01078513 addi a0,a5,16 + } +} + ac4: 70e2 ld ra,56(sp) + ac6: 7442 ld s0,48(sp) + ac8: 74a2 ld s1,40(sp) + aca: 69e2 ld s3,24(sp) + acc: 6121 addi sp,sp,64 + ace: 8082 ret + ad0: 7902 ld s2,32(sp) + ad2: 6a42 ld s4,16(sp) + ad4: 6aa2 ld s5,8(sp) + ad6: 6b02 ld s6,0(sp) + ad8: b7f5 j ac4 diff --git a/user/grep.c b/G12_Project1_xv6CustomizeSystemCalls/user/grep.c similarity index 100% rename from user/grep.c rename to G12_Project1_xv6CustomizeSystemCalls/user/grep.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/grep.d b/G12_Project1_xv6CustomizeSystemCalls/user/grep.d new file mode 100644 index 0000000000..18243b4007 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/grep.d @@ -0,0 +1,2 @@ +user/grep.o: user/grep.c kernel/types.h kernel/stat.h kernel/fcntl.h \ + user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/grep.o b/G12_Project1_xv6CustomizeSystemCalls/user/grep.o new file mode 100644 index 0000000000..a1e8b93075 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/grep.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/grep.sym b/G12_Project1_xv6CustomizeSystemCalls/user/grep.sym new file mode 100644 index 0000000000..e732515aeb --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/grep.sym @@ -0,0 +1,73 @@ +0000000000000000 .text +0000000000000ae0 .rodata +0000000000000b38 .eh_frame +0000000000002000 .data +0000000000002000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 grep.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000005a6 putc +00000000000005c4 printint +0000000000000b20 digits +0000000000000000 umalloc.c +0000000000002000 freep +0000000000002410 base +000000000000026a strcpy +000000000000057e pause +000000000000092e printf +0000000000000576 sys_sbrk +0000000000000414 memmove +000000000000004a matchhere +0000000000000536 mknod +0000000000000322 gets +000000000000056e getpid +00000000000004a6 memcpy +0000000000000106 grep +00000000000009e2 malloc +00000000000004d0 sbrklazy +00000000000004fe pipe +000000000000050e write +0000000000000546 fstat +0000000000000904 fprintf +000000000000051e kill +0000000000000660 vprintf +000000000000055e chdir +0000000000000526 exec +00000000000004f6 wait +000000000000058e getprocsinfo +0000000000000506 read +000000000000053e unlink +000000000000046c memcmp +00000000000004e6 fork +00000000000004ba sbrk +0000000000000586 uptime +00000000000002dc memset +00000000000001c4 main +0000000000000596 getppid +0000000000000000 matchstar +0000000000000286 strcmp +0000000000000566 dup +0000000000002010 buf +0000000000000392 stat +000000000000059e sleep2 +00000000000000c0 match +000000000000054e link +00000000000004ee exit +000000000000025a start +00000000000003cc atoi +00000000000002b2 strlen +000000000000052e open +00000000000002fe strchr +0000000000000556 mkdir +0000000000000516 close +0000000000000960 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/grind.asm b/G12_Project1_xv6CustomizeSystemCalls/user/grind.asm new file mode 100644 index 0000000000..3735630384 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/grind.asm @@ -0,0 +1,2564 @@ + +user/_grind: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : +#include "kernel/riscv.h" + +// from FreeBSD. +int +do_rand(unsigned long *ctx) +{ + 0: 1141 addi sp,sp,-16 + 2: e422 sd s0,8(sp) + 4: 0800 addi s0,sp,16 + * October 1988, p. 1195. + */ + long hi, lo, x; + + /* Transform to [1, 0x7ffffffe] range. */ + x = (*ctx % 0x7ffffffe) + 1; + 6: 611c ld a5,0(a0) + 8: 80000737 lui a4,0x80000 + c: ffe74713 xori a4,a4,-2 + 10: 02e7f7b3 remu a5,a5,a4 + 14: 0785 addi a5,a5,1 + hi = x / 127773; + lo = x % 127773; + 16: 66fd lui a3,0x1f + 18: 31d68693 addi a3,a3,797 # 1f31d + 1c: 02d7e733 rem a4,a5,a3 + x = 16807 * lo - 2836 * hi; + 20: 6611 lui a2,0x4 + 22: 1a760613 addi a2,a2,423 # 41a7 + 26: 02c70733 mul a4,a4,a2 + hi = x / 127773; + 2a: 02d7c7b3 div a5,a5,a3 + x = 16807 * lo - 2836 * hi; + 2e: 76fd lui a3,0xfffff + 30: 4ec68693 addi a3,a3,1260 # fffffffffffff4ec + 34: 02d787b3 mul a5,a5,a3 + 38: 97ba add a5,a5,a4 + if (x < 0) + 3a: 0007c963 bltz a5,4c + x += 0x7fffffff; + /* Transform to [0, 0x7ffffffd] range. */ + x--; + 3e: 17fd addi a5,a5,-1 + *ctx = x; + 40: e11c sd a5,0(a0) + return (x); +} + 42: 0007851b sext.w a0,a5 + 46: 6422 ld s0,8(sp) + 48: 0141 addi sp,sp,16 + 4a: 8082 ret + x += 0x7fffffff; + 4c: 80000737 lui a4,0x80000 + 50: fff74713 not a4,a4 + 54: 97ba add a5,a5,a4 + 56: b7e5 j 3e + +0000000000000058 : + +unsigned long rand_next = 1; + +int +rand(void) +{ + 58: 1141 addi sp,sp,-16 + 5a: e406 sd ra,8(sp) + 5c: e022 sd s0,0(sp) + 5e: 0800 addi s0,sp,16 + return (do_rand(&rand_next)); + 60: 00002517 auipc a0,0x2 + 64: fa050513 addi a0,a0,-96 # 2000 + 68: f99ff0ef jal 0 +} + 6c: 60a2 ld ra,8(sp) + 6e: 6402 ld s0,0(sp) + 70: 0141 addi sp,sp,16 + 72: 8082 ret + +0000000000000074 : + +void +go(int which_child) +{ + 74: 7159 addi sp,sp,-112 + 76: f486 sd ra,104(sp) + 78: f0a2 sd s0,96(sp) + 7a: eca6 sd s1,88(sp) + 7c: fc56 sd s5,56(sp) + 7e: 1880 addi s0,sp,112 + 80: 84aa mv s1,a0 + int fd = -1; + static char buf[999]; + char *break0 = sbrk(0); + 82: 4501 li a0,0 + 84: 2bb000ef jal b3e + 88: 8aaa mv s5,a0 + uint64 iters = 0; + + mkdir("grindir"); + 8a: 00001517 auipc a0,0x1 + 8e: 0d650513 addi a0,a0,214 # 1160 + 92: 349000ef jal bda + if(chdir("grindir") != 0){ + 96: 00001517 auipc a0,0x1 + 9a: 0ca50513 addi a0,a0,202 # 1160 + 9e: 345000ef jal be2 + a2: cd11 beqz a0,be + a4: e8ca sd s2,80(sp) + a6: e4ce sd s3,72(sp) + a8: e0d2 sd s4,64(sp) + aa: f85a sd s6,48(sp) + printf("grind: chdir grindir failed\n"); + ac: 00001517 auipc a0,0x1 + b0: 0bc50513 addi a0,a0,188 # 1168 + b4: 6ff000ef jal fb2 + exit(1); + b8: 4505 li a0,1 + ba: 2b9000ef jal b72 + be: e8ca sd s2,80(sp) + c0: e4ce sd s3,72(sp) + c2: e0d2 sd s4,64(sp) + c4: f85a sd s6,48(sp) + } + chdir("/"); + c6: 00001517 auipc a0,0x1 + ca: 0ca50513 addi a0,a0,202 # 1190 + ce: 315000ef jal be2 + d2: 00001997 auipc s3,0x1 + d6: 0ce98993 addi s3,s3,206 # 11a0 + da: c489 beqz s1,e4 + dc: 00001997 auipc s3,0x1 + e0: 0bc98993 addi s3,s3,188 # 1198 + uint64 iters = 0; + e4: 4481 li s1,0 + int fd = -1; + e6: 5a7d li s4,-1 + e8: 00001917 auipc s2,0x1 + ec: 38890913 addi s2,s2,904 # 1470 + f0: a819 j 106 + 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)); + f2: 20200593 li a1,514 + f6: 00001517 auipc a0,0x1 + fa: 0b250513 addi a0,a0,178 # 11a8 + fe: 2b5000ef jal bb2 + 102: 299000ef jal b9a + iters++; + 106: 0485 addi s1,s1,1 + if((iters % 500) == 0) + 108: 1f400793 li a5,500 + 10c: 02f4f7b3 remu a5,s1,a5 + 110: e791 bnez a5,11c + write(1, which_child?"B":"A", 1); + 112: 4605 li a2,1 + 114: 85ce mv a1,s3 + 116: 4505 li a0,1 + 118: 27b000ef jal b92 + int what = rand() % 23; + 11c: f3dff0ef jal 58 + 120: 47dd li a5,23 + 122: 02f5653b remw a0,a0,a5 + 126: 0005071b sext.w a4,a0 + 12a: 47d9 li a5,22 + 12c: fce7ede3 bltu a5,a4,106 + 130: 02051793 slli a5,a0,0x20 + 134: 01e7d513 srli a0,a5,0x1e + 138: 954a add a0,a0,s2 + 13a: 411c lw a5,0(a0) + 13c: 97ca add a5,a5,s2 + 13e: 8782 jr a5 + } else if(what == 2){ + close(open("grindir/../grindir/../b", O_CREATE|O_RDWR)); + 140: 20200593 li a1,514 + 144: 00001517 auipc a0,0x1 + 148: 07450513 addi a0,a0,116 # 11b8 + 14c: 267000ef jal bb2 + 150: 24b000ef jal b9a + 154: bf4d j 106 + } else if(what == 3){ + unlink("grindir/../a"); + 156: 00001517 auipc a0,0x1 + 15a: 05250513 addi a0,a0,82 # 11a8 + 15e: 265000ef jal bc2 + 162: b755 j 106 + } else if(what == 4){ + if(chdir("grindir") != 0){ + 164: 00001517 auipc a0,0x1 + 168: ffc50513 addi a0,a0,-4 # 1160 + 16c: 277000ef jal be2 + 170: ed11 bnez a0,18c + printf("grind: chdir grindir failed\n"); + exit(1); + } + unlink("../b"); + 172: 00001517 auipc a0,0x1 + 176: 05e50513 addi a0,a0,94 # 11d0 + 17a: 249000ef jal bc2 + chdir("/"); + 17e: 00001517 auipc a0,0x1 + 182: 01250513 addi a0,a0,18 # 1190 + 186: 25d000ef jal be2 + 18a: bfb5 j 106 + printf("grind: chdir grindir failed\n"); + 18c: 00001517 auipc a0,0x1 + 190: fdc50513 addi a0,a0,-36 # 1168 + 194: 61f000ef jal fb2 + exit(1); + 198: 4505 li a0,1 + 19a: 1d9000ef jal b72 + } else if(what == 5){ + close(fd); + 19e: 8552 mv a0,s4 + 1a0: 1fb000ef jal b9a + fd = open("/grindir/../a", O_CREATE|O_RDWR); + 1a4: 20200593 li a1,514 + 1a8: 00001517 auipc a0,0x1 + 1ac: 03050513 addi a0,a0,48 # 11d8 + 1b0: 203000ef jal bb2 + 1b4: 8a2a mv s4,a0 + 1b6: bf81 j 106 + } else if(what == 6){ + close(fd); + 1b8: 8552 mv a0,s4 + 1ba: 1e1000ef jal b9a + fd = open("/./grindir/./../b", O_CREATE|O_RDWR); + 1be: 20200593 li a1,514 + 1c2: 00001517 auipc a0,0x1 + 1c6: 02650513 addi a0,a0,38 # 11e8 + 1ca: 1e9000ef jal bb2 + 1ce: 8a2a mv s4,a0 + 1d0: bf1d j 106 + } else if(what == 7){ + write(fd, buf, sizeof(buf)); + 1d2: 3e700613 li a2,999 + 1d6: 00002597 auipc a1,0x2 + 1da: e4a58593 addi a1,a1,-438 # 2020 + 1de: 8552 mv a0,s4 + 1e0: 1b3000ef jal b92 + 1e4: b70d j 106 + } else if(what == 8){ + read(fd, buf, sizeof(buf)); + 1e6: 3e700613 li a2,999 + 1ea: 00002597 auipc a1,0x2 + 1ee: e3658593 addi a1,a1,-458 # 2020 + 1f2: 8552 mv a0,s4 + 1f4: 197000ef jal b8a + 1f8: b739 j 106 + } else if(what == 9){ + mkdir("grindir/../a"); + 1fa: 00001517 auipc a0,0x1 + 1fe: fae50513 addi a0,a0,-82 # 11a8 + 202: 1d9000ef jal bda + close(open("a/../a/./a", O_CREATE|O_RDWR)); + 206: 20200593 li a1,514 + 20a: 00001517 auipc a0,0x1 + 20e: ff650513 addi a0,a0,-10 # 1200 + 212: 1a1000ef jal bb2 + 216: 185000ef jal b9a + unlink("a/a"); + 21a: 00001517 auipc a0,0x1 + 21e: ff650513 addi a0,a0,-10 # 1210 + 222: 1a1000ef jal bc2 + 226: b5c5 j 106 + } else if(what == 10){ + mkdir("/../b"); + 228: 00001517 auipc a0,0x1 + 22c: ff050513 addi a0,a0,-16 # 1218 + 230: 1ab000ef jal bda + close(open("grindir/../b/b", O_CREATE|O_RDWR)); + 234: 20200593 li a1,514 + 238: 00001517 auipc a0,0x1 + 23c: fe850513 addi a0,a0,-24 # 1220 + 240: 173000ef jal bb2 + 244: 157000ef jal b9a + unlink("b/b"); + 248: 00001517 auipc a0,0x1 + 24c: fe850513 addi a0,a0,-24 # 1230 + 250: 173000ef jal bc2 + 254: bd4d j 106 + } else if(what == 11){ + unlink("b"); + 256: 00001517 auipc a0,0x1 + 25a: fe250513 addi a0,a0,-30 # 1238 + 25e: 165000ef jal bc2 + link("../grindir/./../a", "../b"); + 262: 00001597 auipc a1,0x1 + 266: f6e58593 addi a1,a1,-146 # 11d0 + 26a: 00001517 auipc a0,0x1 + 26e: fd650513 addi a0,a0,-42 # 1240 + 272: 161000ef jal bd2 + 276: bd41 j 106 + } else if(what == 12){ + unlink("../grindir/../a"); + 278: 00001517 auipc a0,0x1 + 27c: fe050513 addi a0,a0,-32 # 1258 + 280: 143000ef jal bc2 + link(".././b", "/grindir/../a"); + 284: 00001597 auipc a1,0x1 + 288: f5458593 addi a1,a1,-172 # 11d8 + 28c: 00001517 auipc a0,0x1 + 290: fdc50513 addi a0,a0,-36 # 1268 + 294: 13f000ef jal bd2 + 298: b5bd j 106 + } else if(what == 13){ + int pid = fork(); + 29a: 0d1000ef jal b6a + if(pid == 0){ + 29e: c519 beqz a0,2ac + exit(0); + } else if(pid < 0){ + 2a0: 00054863 bltz a0,2b0 + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 2a4: 4501 li a0,0 + 2a6: 0d5000ef jal b7a + 2aa: bdb1 j 106 + exit(0); + 2ac: 0c7000ef jal b72 + printf("grind: fork failed\n"); + 2b0: 00001517 auipc a0,0x1 + 2b4: fc050513 addi a0,a0,-64 # 1270 + 2b8: 4fb000ef jal fb2 + exit(1); + 2bc: 4505 li a0,1 + 2be: 0b5000ef jal b72 + } else if(what == 14){ + int pid = fork(); + 2c2: 0a9000ef jal b6a + if(pid == 0){ + 2c6: c519 beqz a0,2d4 + fork(); + fork(); + exit(0); + } else if(pid < 0){ + 2c8: 00054d63 bltz a0,2e2 + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 2cc: 4501 li a0,0 + 2ce: 0ad000ef jal b7a + 2d2: bd15 j 106 + fork(); + 2d4: 097000ef jal b6a + fork(); + 2d8: 093000ef jal b6a + exit(0); + 2dc: 4501 li a0,0 + 2de: 095000ef jal b72 + printf("grind: fork failed\n"); + 2e2: 00001517 auipc a0,0x1 + 2e6: f8e50513 addi a0,a0,-114 # 1270 + 2ea: 4c9000ef jal fb2 + exit(1); + 2ee: 4505 li a0,1 + 2f0: 083000ef jal b72 + } else if(what == 15){ + sbrk(6011); + 2f4: 6505 lui a0,0x1 + 2f6: 77b50513 addi a0,a0,1915 # 177b + 2fa: 045000ef jal b3e + 2fe: b521 j 106 + } else if(what == 16){ + if(sbrk(0) > break0) + 300: 4501 li a0,0 + 302: 03d000ef jal b3e + 306: e0aaf0e3 bgeu s5,a0,106 + sbrk(-(sbrk(0) - break0)); + 30a: 4501 li a0,0 + 30c: 033000ef jal b3e + 310: 40aa853b subw a0,s5,a0 + 314: 02b000ef jal b3e + 318: b3fd j 106 + } else if(what == 17){ + int pid = fork(); + 31a: 051000ef jal b6a + 31e: 8b2a mv s6,a0 + if(pid == 0){ + 320: c10d beqz a0,342 + close(open("a", O_CREATE|O_RDWR)); + exit(0); + } else if(pid < 0){ + 322: 02054d63 bltz a0,35c + printf("grind: fork failed\n"); + exit(1); + } + if(chdir("../grindir/..") != 0){ + 326: 00001517 auipc a0,0x1 + 32a: f6a50513 addi a0,a0,-150 # 1290 + 32e: 0b5000ef jal be2 + 332: ed15 bnez a0,36e + printf("grind: chdir failed\n"); + exit(1); + } + kill(pid); + 334: 855a mv a0,s6 + 336: 06d000ef jal ba2 + wait(0); + 33a: 4501 li a0,0 + 33c: 03f000ef jal b7a + 340: b3d9 j 106 + close(open("a", O_CREATE|O_RDWR)); + 342: 20200593 li a1,514 + 346: 00001517 auipc a0,0x1 + 34a: f4250513 addi a0,a0,-190 # 1288 + 34e: 065000ef jal bb2 + 352: 049000ef jal b9a + exit(0); + 356: 4501 li a0,0 + 358: 01b000ef jal b72 + printf("grind: fork failed\n"); + 35c: 00001517 auipc a0,0x1 + 360: f1450513 addi a0,a0,-236 # 1270 + 364: 44f000ef jal fb2 + exit(1); + 368: 4505 li a0,1 + 36a: 009000ef jal b72 + printf("grind: chdir failed\n"); + 36e: 00001517 auipc a0,0x1 + 372: f3250513 addi a0,a0,-206 # 12a0 + 376: 43d000ef jal fb2 + exit(1); + 37a: 4505 li a0,1 + 37c: 7f6000ef jal b72 + } else if(what == 18){ + int pid = fork(); + 380: 7ea000ef jal b6a + if(pid == 0){ + 384: c519 beqz a0,392 + kill(getpid()); + exit(0); + } else if(pid < 0){ + 386: 00054d63 bltz a0,3a0 + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 38a: 4501 li a0,0 + 38c: 7ee000ef jal b7a + 390: bb9d j 106 + kill(getpid()); + 392: 061000ef jal bf2 + 396: 00d000ef jal ba2 + exit(0); + 39a: 4501 li a0,0 + 39c: 7d6000ef jal b72 + printf("grind: fork failed\n"); + 3a0: 00001517 auipc a0,0x1 + 3a4: ed050513 addi a0,a0,-304 # 1270 + 3a8: 40b000ef jal fb2 + exit(1); + 3ac: 4505 li a0,1 + 3ae: 7c4000ef jal b72 + } else if(what == 19){ + int fds[2]; + if(pipe(fds) < 0){ + 3b2: fa840513 addi a0,s0,-88 + 3b6: 7cc000ef jal b82 + 3ba: 02054363 bltz a0,3e0 + printf("grind: pipe failed\n"); + exit(1); + } + int pid = fork(); + 3be: 7ac000ef jal b6a + if(pid == 0){ + 3c2: c905 beqz a0,3f2 + 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){ + 3c4: 08054263 bltz a0,448 + printf("grind: fork failed\n"); + exit(1); + } + close(fds[0]); + 3c8: fa842503 lw a0,-88(s0) + 3cc: 7ce000ef jal b9a + close(fds[1]); + 3d0: fac42503 lw a0,-84(s0) + 3d4: 7c6000ef jal b9a + wait(0); + 3d8: 4501 li a0,0 + 3da: 7a0000ef jal b7a + 3de: b325 j 106 + printf("grind: pipe failed\n"); + 3e0: 00001517 auipc a0,0x1 + 3e4: ed850513 addi a0,a0,-296 # 12b8 + 3e8: 3cb000ef jal fb2 + exit(1); + 3ec: 4505 li a0,1 + 3ee: 784000ef jal b72 + fork(); + 3f2: 778000ef jal b6a + fork(); + 3f6: 774000ef jal b6a + if(write(fds[1], "x", 1) != 1) + 3fa: 4605 li a2,1 + 3fc: 00001597 auipc a1,0x1 + 400: ed458593 addi a1,a1,-300 # 12d0 + 404: fac42503 lw a0,-84(s0) + 408: 78a000ef jal b92 + 40c: 4785 li a5,1 + 40e: 00f51f63 bne a0,a5,42c + if(read(fds[0], &c, 1) != 1) + 412: 4605 li a2,1 + 414: fa040593 addi a1,s0,-96 + 418: fa842503 lw a0,-88(s0) + 41c: 76e000ef jal b8a + 420: 4785 li a5,1 + 422: 00f51c63 bne a0,a5,43a + exit(0); + 426: 4501 li a0,0 + 428: 74a000ef jal b72 + printf("grind: pipe write failed\n"); + 42c: 00001517 auipc a0,0x1 + 430: eac50513 addi a0,a0,-340 # 12d8 + 434: 37f000ef jal fb2 + 438: bfe9 j 412 + printf("grind: pipe read failed\n"); + 43a: 00001517 auipc a0,0x1 + 43e: ebe50513 addi a0,a0,-322 # 12f8 + 442: 371000ef jal fb2 + 446: b7c5 j 426 + printf("grind: fork failed\n"); + 448: 00001517 auipc a0,0x1 + 44c: e2850513 addi a0,a0,-472 # 1270 + 450: 363000ef jal fb2 + exit(1); + 454: 4505 li a0,1 + 456: 71c000ef jal b72 + } else if(what == 20){ + int pid = fork(); + 45a: 710000ef jal b6a + if(pid == 0){ + 45e: c519 beqz a0,46c + chdir("a"); + unlink("../a"); + fd = open("x", O_CREATE|O_RDWR); + unlink("x"); + exit(0); + } else if(pid < 0){ + 460: 04054f63 bltz a0,4be + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 464: 4501 li a0,0 + 466: 714000ef jal b7a + 46a: b971 j 106 + unlink("a"); + 46c: 00001517 auipc a0,0x1 + 470: e1c50513 addi a0,a0,-484 # 1288 + 474: 74e000ef jal bc2 + mkdir("a"); + 478: 00001517 auipc a0,0x1 + 47c: e1050513 addi a0,a0,-496 # 1288 + 480: 75a000ef jal bda + chdir("a"); + 484: 00001517 auipc a0,0x1 + 488: e0450513 addi a0,a0,-508 # 1288 + 48c: 756000ef jal be2 + unlink("../a"); + 490: 00001517 auipc a0,0x1 + 494: e8850513 addi a0,a0,-376 # 1318 + 498: 72a000ef jal bc2 + fd = open("x", O_CREATE|O_RDWR); + 49c: 20200593 li a1,514 + 4a0: 00001517 auipc a0,0x1 + 4a4: e3050513 addi a0,a0,-464 # 12d0 + 4a8: 70a000ef jal bb2 + unlink("x"); + 4ac: 00001517 auipc a0,0x1 + 4b0: e2450513 addi a0,a0,-476 # 12d0 + 4b4: 70e000ef jal bc2 + exit(0); + 4b8: 4501 li a0,0 + 4ba: 6b8000ef jal b72 + printf("grind: fork failed\n"); + 4be: 00001517 auipc a0,0x1 + 4c2: db250513 addi a0,a0,-590 # 1270 + 4c6: 2ed000ef jal fb2 + exit(1); + 4ca: 4505 li a0,1 + 4cc: 6a6000ef jal b72 + } else if(what == 21){ + unlink("c"); + 4d0: 00001517 auipc a0,0x1 + 4d4: e5050513 addi a0,a0,-432 # 1320 + 4d8: 6ea000ef jal bc2 + // should always succeed. check that there are free i-nodes, + // file descriptors, blocks. + int fd1 = open("c", O_CREATE|O_RDWR); + 4dc: 20200593 li a1,514 + 4e0: 00001517 auipc a0,0x1 + 4e4: e4050513 addi a0,a0,-448 # 1320 + 4e8: 6ca000ef jal bb2 + 4ec: 8b2a mv s6,a0 + if(fd1 < 0){ + 4ee: 04054763 bltz a0,53c + printf("grind: create c failed\n"); + exit(1); + } + if(write(fd1, "x", 1) != 1){ + 4f2: 4605 li a2,1 + 4f4: 00001597 auipc a1,0x1 + 4f8: ddc58593 addi a1,a1,-548 # 12d0 + 4fc: 696000ef jal b92 + 500: 4785 li a5,1 + 502: 04f51663 bne a0,a5,54e + printf("grind: write c failed\n"); + exit(1); + } + struct stat st; + if(fstat(fd1, &st) != 0){ + 506: fa840593 addi a1,s0,-88 + 50a: 855a mv a0,s6 + 50c: 6be000ef jal bca + 510: e921 bnez a0,560 + printf("grind: fstat failed\n"); + exit(1); + } + if(st.size != 1){ + 512: fb843583 ld a1,-72(s0) + 516: 4785 li a5,1 + 518: 04f59d63 bne a1,a5,572 + printf("grind: fstat reports wrong size %d\n", (int)st.size); + exit(1); + } + if(st.ino > 200){ + 51c: fac42583 lw a1,-84(s0) + 520: 0c800793 li a5,200 + 524: 06b7e163 bltu a5,a1,586 + printf("grind: fstat reports crazy i-number %d\n", st.ino); + exit(1); + } + close(fd1); + 528: 855a mv a0,s6 + 52a: 670000ef jal b9a + unlink("c"); + 52e: 00001517 auipc a0,0x1 + 532: df250513 addi a0,a0,-526 # 1320 + 536: 68c000ef jal bc2 + 53a: b6f1 j 106 + printf("grind: create c failed\n"); + 53c: 00001517 auipc a0,0x1 + 540: dec50513 addi a0,a0,-532 # 1328 + 544: 26f000ef jal fb2 + exit(1); + 548: 4505 li a0,1 + 54a: 628000ef jal b72 + printf("grind: write c failed\n"); + 54e: 00001517 auipc a0,0x1 + 552: df250513 addi a0,a0,-526 # 1340 + 556: 25d000ef jal fb2 + exit(1); + 55a: 4505 li a0,1 + 55c: 616000ef jal b72 + printf("grind: fstat failed\n"); + 560: 00001517 auipc a0,0x1 + 564: df850513 addi a0,a0,-520 # 1358 + 568: 24b000ef jal fb2 + exit(1); + 56c: 4505 li a0,1 + 56e: 604000ef jal b72 + printf("grind: fstat reports wrong size %d\n", (int)st.size); + 572: 2581 sext.w a1,a1 + 574: 00001517 auipc a0,0x1 + 578: dfc50513 addi a0,a0,-516 # 1370 + 57c: 237000ef jal fb2 + exit(1); + 580: 4505 li a0,1 + 582: 5f0000ef jal b72 + printf("grind: fstat reports crazy i-number %d\n", st.ino); + 586: 00001517 auipc a0,0x1 + 58a: e1250513 addi a0,a0,-494 # 1398 + 58e: 225000ef jal fb2 + exit(1); + 592: 4505 li a0,1 + 594: 5de000ef jal b72 + } else if(what == 22){ + // echo hi | cat + int aa[2], bb[2]; + if(pipe(aa) < 0){ + 598: f9840513 addi a0,s0,-104 + 59c: 5e6000ef jal b82 + 5a0: 0c054263 bltz a0,664 + fprintf(2, "grind: pipe failed\n"); + exit(1); + } + if(pipe(bb) < 0){ + 5a4: fa040513 addi a0,s0,-96 + 5a8: 5da000ef jal b82 + 5ac: 0c054663 bltz a0,678 + fprintf(2, "grind: pipe failed\n"); + exit(1); + } + int pid1 = fork(); + 5b0: 5ba000ef jal b6a + if(pid1 == 0){ + 5b4: 0c050c63 beqz a0,68c + close(aa[1]); + char *args[3] = { "echo", "hi", 0 }; + exec("grindir/../echo", args); + fprintf(2, "grind: echo: not found\n"); + exit(2); + } else if(pid1 < 0){ + 5b8: 14054e63 bltz a0,714 + fprintf(2, "grind: fork failed\n"); + exit(3); + } + int pid2 = fork(); + 5bc: 5ae000ef jal b6a + if(pid2 == 0){ + 5c0: 16050463 beqz a0,728 + close(bb[1]); + char *args[2] = { "cat", 0 }; + exec("/cat", args); + fprintf(2, "grind: cat: not found\n"); + exit(6); + } else if(pid2 < 0){ + 5c4: 20054263 bltz a0,7c8 + fprintf(2, "grind: fork failed\n"); + exit(7); + } + close(aa[0]); + 5c8: f9842503 lw a0,-104(s0) + 5cc: 5ce000ef jal b9a + close(aa[1]); + 5d0: f9c42503 lw a0,-100(s0) + 5d4: 5c6000ef jal b9a + close(bb[1]); + 5d8: fa442503 lw a0,-92(s0) + 5dc: 5be000ef jal b9a + char buf[4] = { 0, 0, 0, 0 }; + 5e0: f8042823 sw zero,-112(s0) + read(bb[0], buf+0, 1); + 5e4: 4605 li a2,1 + 5e6: f9040593 addi a1,s0,-112 + 5ea: fa042503 lw a0,-96(s0) + 5ee: 59c000ef jal b8a + read(bb[0], buf+1, 1); + 5f2: 4605 li a2,1 + 5f4: f9140593 addi a1,s0,-111 + 5f8: fa042503 lw a0,-96(s0) + 5fc: 58e000ef jal b8a + read(bb[0], buf+2, 1); + 600: 4605 li a2,1 + 602: f9240593 addi a1,s0,-110 + 606: fa042503 lw a0,-96(s0) + 60a: 580000ef jal b8a + close(bb[0]); + 60e: fa042503 lw a0,-96(s0) + 612: 588000ef jal b9a + int st1, st2; + wait(&st1); + 616: f9440513 addi a0,s0,-108 + 61a: 560000ef jal b7a + wait(&st2); + 61e: fa840513 addi a0,s0,-88 + 622: 558000ef jal b7a + if(st1 != 0 || st2 != 0 || strcmp(buf, "hi\n") != 0){ + 626: f9442783 lw a5,-108(s0) + 62a: fa842703 lw a4,-88(s0) + 62e: 8fd9 or a5,a5,a4 + 630: eb99 bnez a5,646 + 632: 00001597 auipc a1,0x1 + 636: e0658593 addi a1,a1,-506 # 1438 + 63a: f9040513 addi a0,s0,-112 + 63e: 2cc000ef jal 90a + 642: ac0502e3 beqz a0,106 + printf("grind: exec pipeline failed %d %d \"%s\"\n", st1, st2, buf); + 646: f9040693 addi a3,s0,-112 + 64a: fa842603 lw a2,-88(s0) + 64e: f9442583 lw a1,-108(s0) + 652: 00001517 auipc a0,0x1 + 656: dee50513 addi a0,a0,-530 # 1440 + 65a: 159000ef jal fb2 + exit(1); + 65e: 4505 li a0,1 + 660: 512000ef jal b72 + fprintf(2, "grind: pipe failed\n"); + 664: 00001597 auipc a1,0x1 + 668: c5458593 addi a1,a1,-940 # 12b8 + 66c: 4509 li a0,2 + 66e: 11b000ef jal f88 + exit(1); + 672: 4505 li a0,1 + 674: 4fe000ef jal b72 + fprintf(2, "grind: pipe failed\n"); + 678: 00001597 auipc a1,0x1 + 67c: c4058593 addi a1,a1,-960 # 12b8 + 680: 4509 li a0,2 + 682: 107000ef jal f88 + exit(1); + 686: 4505 li a0,1 + 688: 4ea000ef jal b72 + close(bb[0]); + 68c: fa042503 lw a0,-96(s0) + 690: 50a000ef jal b9a + close(bb[1]); + 694: fa442503 lw a0,-92(s0) + 698: 502000ef jal b9a + close(aa[0]); + 69c: f9842503 lw a0,-104(s0) + 6a0: 4fa000ef jal b9a + close(1); + 6a4: 4505 li a0,1 + 6a6: 4f4000ef jal b9a + if(dup(aa[1]) != 1){ + 6aa: f9c42503 lw a0,-100(s0) + 6ae: 53c000ef jal bea + 6b2: 4785 li a5,1 + 6b4: 00f50c63 beq a0,a5,6cc + fprintf(2, "grind: dup failed\n"); + 6b8: 00001597 auipc a1,0x1 + 6bc: d0858593 addi a1,a1,-760 # 13c0 + 6c0: 4509 li a0,2 + 6c2: 0c7000ef jal f88 + exit(1); + 6c6: 4505 li a0,1 + 6c8: 4aa000ef jal b72 + close(aa[1]); + 6cc: f9c42503 lw a0,-100(s0) + 6d0: 4ca000ef jal b9a + char *args[3] = { "echo", "hi", 0 }; + 6d4: 00001797 auipc a5,0x1 + 6d8: d0478793 addi a5,a5,-764 # 13d8 + 6dc: faf43423 sd a5,-88(s0) + 6e0: 00001797 auipc a5,0x1 + 6e4: d0078793 addi a5,a5,-768 # 13e0 + 6e8: faf43823 sd a5,-80(s0) + 6ec: fa043c23 sd zero,-72(s0) + exec("grindir/../echo", args); + 6f0: fa840593 addi a1,s0,-88 + 6f4: 00001517 auipc a0,0x1 + 6f8: cf450513 addi a0,a0,-780 # 13e8 + 6fc: 4ae000ef jal baa + fprintf(2, "grind: echo: not found\n"); + 700: 00001597 auipc a1,0x1 + 704: cf858593 addi a1,a1,-776 # 13f8 + 708: 4509 li a0,2 + 70a: 07f000ef jal f88 + exit(2); + 70e: 4509 li a0,2 + 710: 462000ef jal b72 + fprintf(2, "grind: fork failed\n"); + 714: 00001597 auipc a1,0x1 + 718: b5c58593 addi a1,a1,-1188 # 1270 + 71c: 4509 li a0,2 + 71e: 06b000ef jal f88 + exit(3); + 722: 450d li a0,3 + 724: 44e000ef jal b72 + close(aa[1]); + 728: f9c42503 lw a0,-100(s0) + 72c: 46e000ef jal b9a + close(bb[0]); + 730: fa042503 lw a0,-96(s0) + 734: 466000ef jal b9a + close(0); + 738: 4501 li a0,0 + 73a: 460000ef jal b9a + if(dup(aa[0]) != 0){ + 73e: f9842503 lw a0,-104(s0) + 742: 4a8000ef jal bea + 746: c919 beqz a0,75c + fprintf(2, "grind: dup failed\n"); + 748: 00001597 auipc a1,0x1 + 74c: c7858593 addi a1,a1,-904 # 13c0 + 750: 4509 li a0,2 + 752: 037000ef jal f88 + exit(4); + 756: 4511 li a0,4 + 758: 41a000ef jal b72 + close(aa[0]); + 75c: f9842503 lw a0,-104(s0) + 760: 43a000ef jal b9a + close(1); + 764: 4505 li a0,1 + 766: 434000ef jal b9a + if(dup(bb[1]) != 1){ + 76a: fa442503 lw a0,-92(s0) + 76e: 47c000ef jal bea + 772: 4785 li a5,1 + 774: 00f50c63 beq a0,a5,78c + fprintf(2, "grind: dup failed\n"); + 778: 00001597 auipc a1,0x1 + 77c: c4858593 addi a1,a1,-952 # 13c0 + 780: 4509 li a0,2 + 782: 007000ef jal f88 + exit(5); + 786: 4515 li a0,5 + 788: 3ea000ef jal b72 + close(bb[1]); + 78c: fa442503 lw a0,-92(s0) + 790: 40a000ef jal b9a + char *args[2] = { "cat", 0 }; + 794: 00001797 auipc a5,0x1 + 798: c7c78793 addi a5,a5,-900 # 1410 + 79c: faf43423 sd a5,-88(s0) + 7a0: fa043823 sd zero,-80(s0) + exec("/cat", args); + 7a4: fa840593 addi a1,s0,-88 + 7a8: 00001517 auipc a0,0x1 + 7ac: c7050513 addi a0,a0,-912 # 1418 + 7b0: 3fa000ef jal baa + fprintf(2, "grind: cat: not found\n"); + 7b4: 00001597 auipc a1,0x1 + 7b8: c6c58593 addi a1,a1,-916 # 1420 + 7bc: 4509 li a0,2 + 7be: 7ca000ef jal f88 + exit(6); + 7c2: 4519 li a0,6 + 7c4: 3ae000ef jal b72 + fprintf(2, "grind: fork failed\n"); + 7c8: 00001597 auipc a1,0x1 + 7cc: aa858593 addi a1,a1,-1368 # 1270 + 7d0: 4509 li a0,2 + 7d2: 7b6000ef jal f88 + exit(7); + 7d6: 451d li a0,7 + 7d8: 39a000ef jal b72 + +00000000000007dc : + } +} + +void +iter() +{ + 7dc: 7179 addi sp,sp,-48 + 7de: f406 sd ra,40(sp) + 7e0: f022 sd s0,32(sp) + 7e2: 1800 addi s0,sp,48 + unlink("a"); + 7e4: 00001517 auipc a0,0x1 + 7e8: aa450513 addi a0,a0,-1372 # 1288 + 7ec: 3d6000ef jal bc2 + unlink("b"); + 7f0: 00001517 auipc a0,0x1 + 7f4: a4850513 addi a0,a0,-1464 # 1238 + 7f8: 3ca000ef jal bc2 + + int pid1 = fork(); + 7fc: 36e000ef jal b6a + if(pid1 < 0){ + 800: 02054163 bltz a0,822 + 804: ec26 sd s1,24(sp) + 806: 84aa mv s1,a0 + printf("grind: fork failed\n"); + exit(1); + } + if(pid1 == 0){ + 808: e905 bnez a0,838 + 80a: e84a sd s2,16(sp) + rand_next ^= 31; + 80c: 00001717 auipc a4,0x1 + 810: 7f470713 addi a4,a4,2036 # 2000 + 814: 631c ld a5,0(a4) + 816: 01f7c793 xori a5,a5,31 + 81a: e31c sd a5,0(a4) + go(0); + 81c: 4501 li a0,0 + 81e: 857ff0ef jal 74 + 822: ec26 sd s1,24(sp) + 824: e84a sd s2,16(sp) + printf("grind: fork failed\n"); + 826: 00001517 auipc a0,0x1 + 82a: a4a50513 addi a0,a0,-1462 # 1270 + 82e: 784000ef jal fb2 + exit(1); + 832: 4505 li a0,1 + 834: 33e000ef jal b72 + 838: e84a sd s2,16(sp) + exit(0); + } + + int pid2 = fork(); + 83a: 330000ef jal b6a + 83e: 892a mv s2,a0 + if(pid2 < 0){ + 840: 02054063 bltz a0,860 + printf("grind: fork failed\n"); + exit(1); + } + if(pid2 == 0){ + 844: e51d bnez a0,872 + rand_next ^= 7177; + 846: 00001697 auipc a3,0x1 + 84a: 7ba68693 addi a3,a3,1978 # 2000 + 84e: 629c ld a5,0(a3) + 850: 6709 lui a4,0x2 + 852: c0970713 addi a4,a4,-1015 # 1c09 + 856: 8fb9 xor a5,a5,a4 + 858: e29c sd a5,0(a3) + go(1); + 85a: 4505 li a0,1 + 85c: 819ff0ef jal 74 + printf("grind: fork failed\n"); + 860: 00001517 auipc a0,0x1 + 864: a1050513 addi a0,a0,-1520 # 1270 + 868: 74a000ef jal fb2 + exit(1); + 86c: 4505 li a0,1 + 86e: 304000ef jal b72 + exit(0); + } + + int st1 = -1; + 872: 57fd li a5,-1 + 874: fcf42e23 sw a5,-36(s0) + wait(&st1); + 878: fdc40513 addi a0,s0,-36 + 87c: 2fe000ef jal b7a + if(st1 != 0){ + 880: fdc42783 lw a5,-36(s0) + 884: eb99 bnez a5,89a + kill(pid1); + kill(pid2); + } + int st2 = -1; + 886: 57fd li a5,-1 + 888: fcf42c23 sw a5,-40(s0) + wait(&st2); + 88c: fd840513 addi a0,s0,-40 + 890: 2ea000ef jal b7a + + exit(0); + 894: 4501 li a0,0 + 896: 2dc000ef jal b72 + kill(pid1); + 89a: 8526 mv a0,s1 + 89c: 306000ef jal ba2 + kill(pid2); + 8a0: 854a mv a0,s2 + 8a2: 300000ef jal ba2 + 8a6: b7c5 j 886 + +00000000000008a8
: +} + +int +main() +{ + 8a8: 1101 addi sp,sp,-32 + 8aa: ec06 sd ra,24(sp) + 8ac: e822 sd s0,16(sp) + 8ae: e426 sd s1,8(sp) + 8b0: 1000 addi s0,sp,32 + } + if(pid > 0){ + wait(0); + } + pause(20); + rand_next += 1; + 8b2: 00001497 auipc s1,0x1 + 8b6: 74e48493 addi s1,s1,1870 # 2000 + 8ba: a809 j 8cc + iter(); + 8bc: f21ff0ef jal 7dc + pause(20); + 8c0: 4551 li a0,20 + 8c2: 340000ef jal c02 + rand_next += 1; + 8c6: 609c ld a5,0(s1) + 8c8: 0785 addi a5,a5,1 + 8ca: e09c sd a5,0(s1) + int pid = fork(); + 8cc: 29e000ef jal b6a + if(pid == 0){ + 8d0: d575 beqz a0,8bc + if(pid > 0){ + 8d2: fea057e3 blez a0,8c0 + wait(0); + 8d6: 4501 li a0,0 + 8d8: 2a2000ef jal b7a + 8dc: b7d5 j 8c0 + +00000000000008de : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 8de: 1141 addi sp,sp,-16 + 8e0: e406 sd ra,8(sp) + 8e2: e022 sd s0,0(sp) + 8e4: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 8e6: fc3ff0ef jal 8a8
+ exit(r); + 8ea: 288000ef jal b72 + +00000000000008ee : +} + +char* +strcpy(char *s, const char *t) +{ + 8ee: 1141 addi sp,sp,-16 + 8f0: e422 sd s0,8(sp) + 8f2: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 8f4: 87aa mv a5,a0 + 8f6: 0585 addi a1,a1,1 + 8f8: 0785 addi a5,a5,1 + 8fa: fff5c703 lbu a4,-1(a1) + 8fe: fee78fa3 sb a4,-1(a5) + 902: fb75 bnez a4,8f6 + ; + return os; +} + 904: 6422 ld s0,8(sp) + 906: 0141 addi sp,sp,16 + 908: 8082 ret + +000000000000090a : + +int +strcmp(const char *p, const char *q) +{ + 90a: 1141 addi sp,sp,-16 + 90c: e422 sd s0,8(sp) + 90e: 0800 addi s0,sp,16 + while(*p && *p == *q) + 910: 00054783 lbu a5,0(a0) + 914: cb91 beqz a5,928 + 916: 0005c703 lbu a4,0(a1) + 91a: 00f71763 bne a4,a5,928 + p++, q++; + 91e: 0505 addi a0,a0,1 + 920: 0585 addi a1,a1,1 + while(*p && *p == *q) + 922: 00054783 lbu a5,0(a0) + 926: fbe5 bnez a5,916 + return (uchar)*p - (uchar)*q; + 928: 0005c503 lbu a0,0(a1) +} + 92c: 40a7853b subw a0,a5,a0 + 930: 6422 ld s0,8(sp) + 932: 0141 addi sp,sp,16 + 934: 8082 ret + +0000000000000936 : + +uint +strlen(const char *s) +{ + 936: 1141 addi sp,sp,-16 + 938: e422 sd s0,8(sp) + 93a: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 93c: 00054783 lbu a5,0(a0) + 940: cf91 beqz a5,95c + 942: 0505 addi a0,a0,1 + 944: 87aa mv a5,a0 + 946: 86be mv a3,a5 + 948: 0785 addi a5,a5,1 + 94a: fff7c703 lbu a4,-1(a5) + 94e: ff65 bnez a4,946 + 950: 40a6853b subw a0,a3,a0 + 954: 2505 addiw a0,a0,1 + ; + return n; +} + 956: 6422 ld s0,8(sp) + 958: 0141 addi sp,sp,16 + 95a: 8082 ret + for(n = 0; s[n]; n++) + 95c: 4501 li a0,0 + 95e: bfe5 j 956 + +0000000000000960 : + +void* +memset(void *dst, int c, uint n) +{ + 960: 1141 addi sp,sp,-16 + 962: e422 sd s0,8(sp) + 964: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 966: ca19 beqz a2,97c + 968: 87aa mv a5,a0 + 96a: 1602 slli a2,a2,0x20 + 96c: 9201 srli a2,a2,0x20 + 96e: 00a60733 add a4,a2,a0 + cdst[i] = c; + 972: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 976: 0785 addi a5,a5,1 + 978: fee79de3 bne a5,a4,972 + } + return dst; +} + 97c: 6422 ld s0,8(sp) + 97e: 0141 addi sp,sp,16 + 980: 8082 ret + +0000000000000982 : + +char* +strchr(const char *s, char c) +{ + 982: 1141 addi sp,sp,-16 + 984: e422 sd s0,8(sp) + 986: 0800 addi s0,sp,16 + for(; *s; s++) + 988: 00054783 lbu a5,0(a0) + 98c: cb99 beqz a5,9a2 + if(*s == c) + 98e: 00f58763 beq a1,a5,99c + for(; *s; s++) + 992: 0505 addi a0,a0,1 + 994: 00054783 lbu a5,0(a0) + 998: fbfd bnez a5,98e + return (char*)s; + return 0; + 99a: 4501 li a0,0 +} + 99c: 6422 ld s0,8(sp) + 99e: 0141 addi sp,sp,16 + 9a0: 8082 ret + return 0; + 9a2: 4501 li a0,0 + 9a4: bfe5 j 99c + +00000000000009a6 : + +char* +gets(char *buf, int max) +{ + 9a6: 711d addi sp,sp,-96 + 9a8: ec86 sd ra,88(sp) + 9aa: e8a2 sd s0,80(sp) + 9ac: e4a6 sd s1,72(sp) + 9ae: e0ca sd s2,64(sp) + 9b0: fc4e sd s3,56(sp) + 9b2: f852 sd s4,48(sp) + 9b4: f456 sd s5,40(sp) + 9b6: f05a sd s6,32(sp) + 9b8: ec5e sd s7,24(sp) + 9ba: 1080 addi s0,sp,96 + 9bc: 8baa mv s7,a0 + 9be: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 9c0: 892a mv s2,a0 + 9c2: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 9c4: 4aa9 li s5,10 + 9c6: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 9c8: 89a6 mv s3,s1 + 9ca: 2485 addiw s1,s1,1 + 9cc: 0344d663 bge s1,s4,9f8 + cc = read(0, &c, 1); + 9d0: 4605 li a2,1 + 9d2: faf40593 addi a1,s0,-81 + 9d6: 4501 li a0,0 + 9d8: 1b2000ef jal b8a + if(cc < 1) + 9dc: 00a05e63 blez a0,9f8 + buf[i++] = c; + 9e0: faf44783 lbu a5,-81(s0) + 9e4: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 9e8: 01578763 beq a5,s5,9f6 + 9ec: 0905 addi s2,s2,1 + 9ee: fd679de3 bne a5,s6,9c8 + buf[i++] = c; + 9f2: 89a6 mv s3,s1 + 9f4: a011 j 9f8 + 9f6: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 9f8: 99de add s3,s3,s7 + 9fa: 00098023 sb zero,0(s3) + return buf; +} + 9fe: 855e mv a0,s7 + a00: 60e6 ld ra,88(sp) + a02: 6446 ld s0,80(sp) + a04: 64a6 ld s1,72(sp) + a06: 6906 ld s2,64(sp) + a08: 79e2 ld s3,56(sp) + a0a: 7a42 ld s4,48(sp) + a0c: 7aa2 ld s5,40(sp) + a0e: 7b02 ld s6,32(sp) + a10: 6be2 ld s7,24(sp) + a12: 6125 addi sp,sp,96 + a14: 8082 ret + +0000000000000a16 : + +int +stat(const char *n, struct stat *st) +{ + a16: 1101 addi sp,sp,-32 + a18: ec06 sd ra,24(sp) + a1a: e822 sd s0,16(sp) + a1c: e04a sd s2,0(sp) + a1e: 1000 addi s0,sp,32 + a20: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + a22: 4581 li a1,0 + a24: 18e000ef jal bb2 + if(fd < 0) + a28: 02054263 bltz a0,a4c + a2c: e426 sd s1,8(sp) + a2e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + a30: 85ca mv a1,s2 + a32: 198000ef jal bca + a36: 892a mv s2,a0 + close(fd); + a38: 8526 mv a0,s1 + a3a: 160000ef jal b9a + return r; + a3e: 64a2 ld s1,8(sp) +} + a40: 854a mv a0,s2 + a42: 60e2 ld ra,24(sp) + a44: 6442 ld s0,16(sp) + a46: 6902 ld s2,0(sp) + a48: 6105 addi sp,sp,32 + a4a: 8082 ret + return -1; + a4c: 597d li s2,-1 + a4e: bfcd j a40 + +0000000000000a50 : + +int +atoi(const char *s) +{ + a50: 1141 addi sp,sp,-16 + a52: e422 sd s0,8(sp) + a54: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + a56: 00054683 lbu a3,0(a0) + a5a: fd06879b addiw a5,a3,-48 + a5e: 0ff7f793 zext.b a5,a5 + a62: 4625 li a2,9 + a64: 02f66863 bltu a2,a5,a94 + a68: 872a mv a4,a0 + n = 0; + a6a: 4501 li a0,0 + n = n*10 + *s++ - '0'; + a6c: 0705 addi a4,a4,1 + a6e: 0025179b slliw a5,a0,0x2 + a72: 9fa9 addw a5,a5,a0 + a74: 0017979b slliw a5,a5,0x1 + a78: 9fb5 addw a5,a5,a3 + a7a: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + a7e: 00074683 lbu a3,0(a4) + a82: fd06879b addiw a5,a3,-48 + a86: 0ff7f793 zext.b a5,a5 + a8a: fef671e3 bgeu a2,a5,a6c + return n; +} + a8e: 6422 ld s0,8(sp) + a90: 0141 addi sp,sp,16 + a92: 8082 ret + n = 0; + a94: 4501 li a0,0 + a96: bfe5 j a8e + +0000000000000a98 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + a98: 1141 addi sp,sp,-16 + a9a: e422 sd s0,8(sp) + a9c: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + a9e: 02b57463 bgeu a0,a1,ac6 + while(n-- > 0) + aa2: 00c05f63 blez a2,ac0 + aa6: 1602 slli a2,a2,0x20 + aa8: 9201 srli a2,a2,0x20 + aaa: 00c507b3 add a5,a0,a2 + dst = vdst; + aae: 872a mv a4,a0 + *dst++ = *src++; + ab0: 0585 addi a1,a1,1 + ab2: 0705 addi a4,a4,1 + ab4: fff5c683 lbu a3,-1(a1) + ab8: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + abc: fef71ae3 bne a4,a5,ab0 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + ac0: 6422 ld s0,8(sp) + ac2: 0141 addi sp,sp,16 + ac4: 8082 ret + dst += n; + ac6: 00c50733 add a4,a0,a2 + src += n; + aca: 95b2 add a1,a1,a2 + while(n-- > 0) + acc: fec05ae3 blez a2,ac0 + ad0: fff6079b addiw a5,a2,-1 + ad4: 1782 slli a5,a5,0x20 + ad6: 9381 srli a5,a5,0x20 + ad8: fff7c793 not a5,a5 + adc: 97ba add a5,a5,a4 + *--dst = *--src; + ade: 15fd addi a1,a1,-1 + ae0: 177d addi a4,a4,-1 + ae2: 0005c683 lbu a3,0(a1) + ae6: 00d70023 sb a3,0(a4) + while(n-- > 0) + aea: fee79ae3 bne a5,a4,ade + aee: bfc9 j ac0 + +0000000000000af0 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + af0: 1141 addi sp,sp,-16 + af2: e422 sd s0,8(sp) + af4: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + af6: ca05 beqz a2,b26 + af8: fff6069b addiw a3,a2,-1 + afc: 1682 slli a3,a3,0x20 + afe: 9281 srli a3,a3,0x20 + b00: 0685 addi a3,a3,1 + b02: 96aa add a3,a3,a0 + if (*p1 != *p2) { + b04: 00054783 lbu a5,0(a0) + b08: 0005c703 lbu a4,0(a1) + b0c: 00e79863 bne a5,a4,b1c + return *p1 - *p2; + } + p1++; + b10: 0505 addi a0,a0,1 + p2++; + b12: 0585 addi a1,a1,1 + while (n-- > 0) { + b14: fed518e3 bne a0,a3,b04 + } + return 0; + b18: 4501 li a0,0 + b1a: a019 j b20 + return *p1 - *p2; + b1c: 40e7853b subw a0,a5,a4 +} + b20: 6422 ld s0,8(sp) + b22: 0141 addi sp,sp,16 + b24: 8082 ret + return 0; + b26: 4501 li a0,0 + b28: bfe5 j b20 + +0000000000000b2a : + +void * +memcpy(void *dst, const void *src, uint n) +{ + b2a: 1141 addi sp,sp,-16 + b2c: e406 sd ra,8(sp) + b2e: e022 sd s0,0(sp) + b30: 0800 addi s0,sp,16 + return memmove(dst, src, n); + b32: f67ff0ef jal a98 +} + b36: 60a2 ld ra,8(sp) + b38: 6402 ld s0,0(sp) + b3a: 0141 addi sp,sp,16 + b3c: 8082 ret + +0000000000000b3e : + +char * +sbrk(int n) { + b3e: 1141 addi sp,sp,-16 + b40: e406 sd ra,8(sp) + b42: e022 sd s0,0(sp) + b44: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + b46: 4585 li a1,1 + b48: 0b2000ef jal bfa +} + b4c: 60a2 ld ra,8(sp) + b4e: 6402 ld s0,0(sp) + b50: 0141 addi sp,sp,16 + b52: 8082 ret + +0000000000000b54 : + +char * +sbrklazy(int n) { + b54: 1141 addi sp,sp,-16 + b56: e406 sd ra,8(sp) + b58: e022 sd s0,0(sp) + b5a: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + b5c: 4589 li a1,2 + b5e: 09c000ef jal bfa +} + b62: 60a2 ld ra,8(sp) + b64: 6402 ld s0,0(sp) + b66: 0141 addi sp,sp,16 + b68: 8082 ret + +0000000000000b6a : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + b6a: 4885 li a7,1 + ecall + b6c: 00000073 ecall + ret + b70: 8082 ret + +0000000000000b72 : +.global exit +exit: + li a7, SYS_exit + b72: 4889 li a7,2 + ecall + b74: 00000073 ecall + ret + b78: 8082 ret + +0000000000000b7a : +.global wait +wait: + li a7, SYS_wait + b7a: 488d li a7,3 + ecall + b7c: 00000073 ecall + ret + b80: 8082 ret + +0000000000000b82 : +.global pipe +pipe: + li a7, SYS_pipe + b82: 4891 li a7,4 + ecall + b84: 00000073 ecall + ret + b88: 8082 ret + +0000000000000b8a : +.global read +read: + li a7, SYS_read + b8a: 4895 li a7,5 + ecall + b8c: 00000073 ecall + ret + b90: 8082 ret + +0000000000000b92 : +.global write +write: + li a7, SYS_write + b92: 48c1 li a7,16 + ecall + b94: 00000073 ecall + ret + b98: 8082 ret + +0000000000000b9a : +.global close +close: + li a7, SYS_close + b9a: 48d5 li a7,21 + ecall + b9c: 00000073 ecall + ret + ba0: 8082 ret + +0000000000000ba2 : +.global kill +kill: + li a7, SYS_kill + ba2: 4899 li a7,6 + ecall + ba4: 00000073 ecall + ret + ba8: 8082 ret + +0000000000000baa : +.global exec +exec: + li a7, SYS_exec + baa: 489d li a7,7 + ecall + bac: 00000073 ecall + ret + bb0: 8082 ret + +0000000000000bb2 : +.global open +open: + li a7, SYS_open + bb2: 48bd li a7,15 + ecall + bb4: 00000073 ecall + ret + bb8: 8082 ret + +0000000000000bba : +.global mknod +mknod: + li a7, SYS_mknod + bba: 48c5 li a7,17 + ecall + bbc: 00000073 ecall + ret + bc0: 8082 ret + +0000000000000bc2 : +.global unlink +unlink: + li a7, SYS_unlink + bc2: 48c9 li a7,18 + ecall + bc4: 00000073 ecall + ret + bc8: 8082 ret + +0000000000000bca : +.global fstat +fstat: + li a7, SYS_fstat + bca: 48a1 li a7,8 + ecall + bcc: 00000073 ecall + ret + bd0: 8082 ret + +0000000000000bd2 : +.global link +link: + li a7, SYS_link + bd2: 48cd li a7,19 + ecall + bd4: 00000073 ecall + ret + bd8: 8082 ret + +0000000000000bda : +.global mkdir +mkdir: + li a7, SYS_mkdir + bda: 48d1 li a7,20 + ecall + bdc: 00000073 ecall + ret + be0: 8082 ret + +0000000000000be2 : +.global chdir +chdir: + li a7, SYS_chdir + be2: 48a5 li a7,9 + ecall + be4: 00000073 ecall + ret + be8: 8082 ret + +0000000000000bea : +.global dup +dup: + li a7, SYS_dup + bea: 48a9 li a7,10 + ecall + bec: 00000073 ecall + ret + bf0: 8082 ret + +0000000000000bf2 : +.global getpid +getpid: + li a7, SYS_getpid + bf2: 48ad li a7,11 + ecall + bf4: 00000073 ecall + ret + bf8: 8082 ret + +0000000000000bfa : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + bfa: 48b1 li a7,12 + ecall + bfc: 00000073 ecall + ret + c00: 8082 ret + +0000000000000c02 : +.global pause +pause: + li a7, SYS_pause + c02: 48b5 li a7,13 + ecall + c04: 00000073 ecall + ret + c08: 8082 ret + +0000000000000c0a : +.global uptime +uptime: + li a7, SYS_uptime + c0a: 48b9 li a7,14 + ecall + c0c: 00000073 ecall + ret + c10: 8082 ret + +0000000000000c12 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + c12: 48d9 li a7,22 + ecall + c14: 00000073 ecall + ret + c18: 8082 ret + +0000000000000c1a : +.global getppid +getppid: + li a7, SYS_getppid + c1a: 48dd li a7,23 + ecall + c1c: 00000073 ecall + ret + c20: 8082 ret + +0000000000000c22 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + c22: 48e1 li a7,24 + ecall + c24: 00000073 ecall + ret + c28: 8082 ret + +0000000000000c2a : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + c2a: 1101 addi sp,sp,-32 + c2c: ec06 sd ra,24(sp) + c2e: e822 sd s0,16(sp) + c30: 1000 addi s0,sp,32 + c32: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + c36: 4605 li a2,1 + c38: fef40593 addi a1,s0,-17 + c3c: f57ff0ef jal b92 +} + c40: 60e2 ld ra,24(sp) + c42: 6442 ld s0,16(sp) + c44: 6105 addi sp,sp,32 + c46: 8082 ret + +0000000000000c48 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + c48: 715d addi sp,sp,-80 + c4a: e486 sd ra,72(sp) + c4c: e0a2 sd s0,64(sp) + c4e: f84a sd s2,48(sp) + c50: 0880 addi s0,sp,80 + c52: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + c54: c299 beqz a3,c5a + c56: 0805c363 bltz a1,cdc + neg = 0; + c5a: 4881 li a7,0 + c5c: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + c60: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + c62: 00001517 auipc a0,0x1 + c66: 86e50513 addi a0,a0,-1938 # 14d0 + c6a: 883e mv a6,a5 + c6c: 2785 addiw a5,a5,1 + c6e: 02c5f733 remu a4,a1,a2 + c72: 972a add a4,a4,a0 + c74: 00074703 lbu a4,0(a4) + c78: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + c7c: 872e mv a4,a1 + c7e: 02c5d5b3 divu a1,a1,a2 + c82: 0685 addi a3,a3,1 + c84: fec773e3 bgeu a4,a2,c6a + if(neg) + c88: 00088b63 beqz a7,c9e + buf[i++] = '-'; + c8c: fd078793 addi a5,a5,-48 + c90: 97a2 add a5,a5,s0 + c92: 02d00713 li a4,45 + c96: fee78423 sb a4,-24(a5) + c9a: 0028079b addiw a5,a6,2 + + while(--i >= 0) + c9e: 02f05a63 blez a5,cd2 + ca2: fc26 sd s1,56(sp) + ca4: f44e sd s3,40(sp) + ca6: fb840713 addi a4,s0,-72 + caa: 00f704b3 add s1,a4,a5 + cae: fff70993 addi s3,a4,-1 + cb2: 99be add s3,s3,a5 + cb4: 37fd addiw a5,a5,-1 + cb6: 1782 slli a5,a5,0x20 + cb8: 9381 srli a5,a5,0x20 + cba: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + cbe: fff4c583 lbu a1,-1(s1) + cc2: 854a mv a0,s2 + cc4: f67ff0ef jal c2a + while(--i >= 0) + cc8: 14fd addi s1,s1,-1 + cca: ff349ae3 bne s1,s3,cbe + cce: 74e2 ld s1,56(sp) + cd0: 79a2 ld s3,40(sp) +} + cd2: 60a6 ld ra,72(sp) + cd4: 6406 ld s0,64(sp) + cd6: 7942 ld s2,48(sp) + cd8: 6161 addi sp,sp,80 + cda: 8082 ret + x = -xx; + cdc: 40b005b3 neg a1,a1 + neg = 1; + ce0: 4885 li a7,1 + x = -xx; + ce2: bfad j c5c + +0000000000000ce4 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + ce4: 711d addi sp,sp,-96 + ce6: ec86 sd ra,88(sp) + ce8: e8a2 sd s0,80(sp) + cea: e0ca sd s2,64(sp) + cec: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + cee: 0005c903 lbu s2,0(a1) + cf2: 28090663 beqz s2,f7e + cf6: e4a6 sd s1,72(sp) + cf8: fc4e sd s3,56(sp) + cfa: f852 sd s4,48(sp) + cfc: f456 sd s5,40(sp) + cfe: f05a sd s6,32(sp) + d00: ec5e sd s7,24(sp) + d02: e862 sd s8,16(sp) + d04: e466 sd s9,8(sp) + d06: 8b2a mv s6,a0 + d08: 8a2e mv s4,a1 + d0a: 8bb2 mv s7,a2 + state = 0; + d0c: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + d0e: 4481 li s1,0 + d10: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + d12: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + d16: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + d1a: 06c00c93 li s9,108 + d1e: a005 j d3e + putc(fd, c0); + d20: 85ca mv a1,s2 + d22: 855a mv a0,s6 + d24: f07ff0ef jal c2a + d28: a019 j d2e + } else if(state == '%'){ + d2a: 03598263 beq s3,s5,d4e + for(i = 0; fmt[i]; i++){ + d2e: 2485 addiw s1,s1,1 + d30: 8726 mv a4,s1 + d32: 009a07b3 add a5,s4,s1 + d36: 0007c903 lbu s2,0(a5) + d3a: 22090a63 beqz s2,f6e + c0 = fmt[i] & 0xff; + d3e: 0009079b sext.w a5,s2 + if(state == 0){ + d42: fe0994e3 bnez s3,d2a + if(c0 == '%'){ + d46: fd579de3 bne a5,s5,d20 + state = '%'; + d4a: 89be mv s3,a5 + d4c: b7cd j d2e + if(c0) c1 = fmt[i+1] & 0xff; + d4e: 00ea06b3 add a3,s4,a4 + d52: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + d56: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + d58: c681 beqz a3,d60 + d5a: 9752 add a4,a4,s4 + d5c: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + d60: 05878363 beq a5,s8,da6 + } else if(c0 == 'l' && c1 == 'd'){ + d64: 05978d63 beq a5,s9,dbe + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + d68: 07500713 li a4,117 + d6c: 0ee78763 beq a5,a4,e5a + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + d70: 07800713 li a4,120 + d74: 12e78963 beq a5,a4,ea6 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + d78: 07000713 li a4,112 + d7c: 14e78e63 beq a5,a4,ed8 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + d80: 06300713 li a4,99 + d84: 18e78e63 beq a5,a4,f20 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + d88: 07300713 li a4,115 + d8c: 1ae78463 beq a5,a4,f34 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + d90: 02500713 li a4,37 + d94: 04e79563 bne a5,a4,dde + putc(fd, '%'); + d98: 02500593 li a1,37 + d9c: 855a mv a0,s6 + d9e: e8dff0ef jal c2a + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + da2: 4981 li s3,0 + da4: b769 j d2e + printint(fd, va_arg(ap, int), 10, 1); + da6: 008b8913 addi s2,s7,8 + daa: 4685 li a3,1 + dac: 4629 li a2,10 + dae: 000ba583 lw a1,0(s7) + db2: 855a mv a0,s6 + db4: e95ff0ef jal c48 + db8: 8bca mv s7,s2 + state = 0; + dba: 4981 li s3,0 + dbc: bf8d j d2e + } else if(c0 == 'l' && c1 == 'd'){ + dbe: 06400793 li a5,100 + dc2: 02f68963 beq a3,a5,df4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + dc6: 06c00793 li a5,108 + dca: 04f68263 beq a3,a5,e0e + } else if(c0 == 'l' && c1 == 'u'){ + dce: 07500793 li a5,117 + dd2: 0af68063 beq a3,a5,e72 + } else if(c0 == 'l' && c1 == 'x'){ + dd6: 07800793 li a5,120 + dda: 0ef68263 beq a3,a5,ebe + putc(fd, '%'); + dde: 02500593 li a1,37 + de2: 855a mv a0,s6 + de4: e47ff0ef jal c2a + putc(fd, c0); + de8: 85ca mv a1,s2 + dea: 855a mv a0,s6 + dec: e3fff0ef jal c2a + state = 0; + df0: 4981 li s3,0 + df2: bf35 j d2e + printint(fd, va_arg(ap, uint64), 10, 1); + df4: 008b8913 addi s2,s7,8 + df8: 4685 li a3,1 + dfa: 4629 li a2,10 + dfc: 000bb583 ld a1,0(s7) + e00: 855a mv a0,s6 + e02: e47ff0ef jal c48 + i += 1; + e06: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + e08: 8bca mv s7,s2 + state = 0; + e0a: 4981 li s3,0 + i += 1; + e0c: b70d j d2e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + e0e: 06400793 li a5,100 + e12: 02f60763 beq a2,a5,e40 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + e16: 07500793 li a5,117 + e1a: 06f60963 beq a2,a5,e8c + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + e1e: 07800793 li a5,120 + e22: faf61ee3 bne a2,a5,dde + printint(fd, va_arg(ap, uint64), 16, 0); + e26: 008b8913 addi s2,s7,8 + e2a: 4681 li a3,0 + e2c: 4641 li a2,16 + e2e: 000bb583 ld a1,0(s7) + e32: 855a mv a0,s6 + e34: e15ff0ef jal c48 + i += 2; + e38: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + e3a: 8bca mv s7,s2 + state = 0; + e3c: 4981 li s3,0 + i += 2; + e3e: bdc5 j d2e + printint(fd, va_arg(ap, uint64), 10, 1); + e40: 008b8913 addi s2,s7,8 + e44: 4685 li a3,1 + e46: 4629 li a2,10 + e48: 000bb583 ld a1,0(s7) + e4c: 855a mv a0,s6 + e4e: dfbff0ef jal c48 + i += 2; + e52: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + e54: 8bca mv s7,s2 + state = 0; + e56: 4981 li s3,0 + i += 2; + e58: bdd9 j d2e + printint(fd, va_arg(ap, uint32), 10, 0); + e5a: 008b8913 addi s2,s7,8 + e5e: 4681 li a3,0 + e60: 4629 li a2,10 + e62: 000be583 lwu a1,0(s7) + e66: 855a mv a0,s6 + e68: de1ff0ef jal c48 + e6c: 8bca mv s7,s2 + state = 0; + e6e: 4981 li s3,0 + e70: bd7d j d2e + printint(fd, va_arg(ap, uint64), 10, 0); + e72: 008b8913 addi s2,s7,8 + e76: 4681 li a3,0 + e78: 4629 li a2,10 + e7a: 000bb583 ld a1,0(s7) + e7e: 855a mv a0,s6 + e80: dc9ff0ef jal c48 + i += 1; + e84: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + e86: 8bca mv s7,s2 + state = 0; + e88: 4981 li s3,0 + i += 1; + e8a: b555 j d2e + printint(fd, va_arg(ap, uint64), 10, 0); + e8c: 008b8913 addi s2,s7,8 + e90: 4681 li a3,0 + e92: 4629 li a2,10 + e94: 000bb583 ld a1,0(s7) + e98: 855a mv a0,s6 + e9a: dafff0ef jal c48 + i += 2; + e9e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + ea0: 8bca mv s7,s2 + state = 0; + ea2: 4981 li s3,0 + i += 2; + ea4: b569 j d2e + printint(fd, va_arg(ap, uint32), 16, 0); + ea6: 008b8913 addi s2,s7,8 + eaa: 4681 li a3,0 + eac: 4641 li a2,16 + eae: 000be583 lwu a1,0(s7) + eb2: 855a mv a0,s6 + eb4: d95ff0ef jal c48 + eb8: 8bca mv s7,s2 + state = 0; + eba: 4981 li s3,0 + ebc: bd8d j d2e + printint(fd, va_arg(ap, uint64), 16, 0); + ebe: 008b8913 addi s2,s7,8 + ec2: 4681 li a3,0 + ec4: 4641 li a2,16 + ec6: 000bb583 ld a1,0(s7) + eca: 855a mv a0,s6 + ecc: d7dff0ef jal c48 + i += 1; + ed0: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + ed2: 8bca mv s7,s2 + state = 0; + ed4: 4981 li s3,0 + i += 1; + ed6: bda1 j d2e + ed8: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + eda: 008b8d13 addi s10,s7,8 + ede: 000bb983 ld s3,0(s7) + putc(fd, '0'); + ee2: 03000593 li a1,48 + ee6: 855a mv a0,s6 + ee8: d43ff0ef jal c2a + putc(fd, 'x'); + eec: 07800593 li a1,120 + ef0: 855a mv a0,s6 + ef2: d39ff0ef jal c2a + ef6: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + ef8: 00000b97 auipc s7,0x0 + efc: 5d8b8b93 addi s7,s7,1496 # 14d0 + f00: 03c9d793 srli a5,s3,0x3c + f04: 97de add a5,a5,s7 + f06: 0007c583 lbu a1,0(a5) + f0a: 855a mv a0,s6 + f0c: d1fff0ef jal c2a + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + f10: 0992 slli s3,s3,0x4 + f12: 397d addiw s2,s2,-1 + f14: fe0916e3 bnez s2,f00 + printptr(fd, va_arg(ap, uint64)); + f18: 8bea mv s7,s10 + state = 0; + f1a: 4981 li s3,0 + f1c: 6d02 ld s10,0(sp) + f1e: bd01 j d2e + putc(fd, va_arg(ap, uint32)); + f20: 008b8913 addi s2,s7,8 + f24: 000bc583 lbu a1,0(s7) + f28: 855a mv a0,s6 + f2a: d01ff0ef jal c2a + f2e: 8bca mv s7,s2 + state = 0; + f30: 4981 li s3,0 + f32: bbf5 j d2e + if((s = va_arg(ap, char*)) == 0) + f34: 008b8993 addi s3,s7,8 + f38: 000bb903 ld s2,0(s7) + f3c: 00090f63 beqz s2,f5a + for(; *s; s++) + f40: 00094583 lbu a1,0(s2) + f44: c195 beqz a1,f68 + putc(fd, *s); + f46: 855a mv a0,s6 + f48: ce3ff0ef jal c2a + for(; *s; s++) + f4c: 0905 addi s2,s2,1 + f4e: 00094583 lbu a1,0(s2) + f52: f9f5 bnez a1,f46 + if((s = va_arg(ap, char*)) == 0) + f54: 8bce mv s7,s3 + state = 0; + f56: 4981 li s3,0 + f58: bbd9 j d2e + s = "(null)"; + f5a: 00000917 auipc s2,0x0 + f5e: 50e90913 addi s2,s2,1294 # 1468 + for(; *s; s++) + f62: 02800593 li a1,40 + f66: b7c5 j f46 + if((s = va_arg(ap, char*)) == 0) + f68: 8bce mv s7,s3 + state = 0; + f6a: 4981 li s3,0 + f6c: b3c9 j d2e + f6e: 64a6 ld s1,72(sp) + f70: 79e2 ld s3,56(sp) + f72: 7a42 ld s4,48(sp) + f74: 7aa2 ld s5,40(sp) + f76: 7b02 ld s6,32(sp) + f78: 6be2 ld s7,24(sp) + f7a: 6c42 ld s8,16(sp) + f7c: 6ca2 ld s9,8(sp) + } + } +} + f7e: 60e6 ld ra,88(sp) + f80: 6446 ld s0,80(sp) + f82: 6906 ld s2,64(sp) + f84: 6125 addi sp,sp,96 + f86: 8082 ret + +0000000000000f88 : + +void +fprintf(int fd, const char *fmt, ...) +{ + f88: 715d addi sp,sp,-80 + f8a: ec06 sd ra,24(sp) + f8c: e822 sd s0,16(sp) + f8e: 1000 addi s0,sp,32 + f90: e010 sd a2,0(s0) + f92: e414 sd a3,8(s0) + f94: e818 sd a4,16(s0) + f96: ec1c sd a5,24(s0) + f98: 03043023 sd a6,32(s0) + f9c: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + fa0: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + fa4: 8622 mv a2,s0 + fa6: d3fff0ef jal ce4 +} + faa: 60e2 ld ra,24(sp) + fac: 6442 ld s0,16(sp) + fae: 6161 addi sp,sp,80 + fb0: 8082 ret + +0000000000000fb2 : + +void +printf(const char *fmt, ...) +{ + fb2: 711d addi sp,sp,-96 + fb4: ec06 sd ra,24(sp) + fb6: e822 sd s0,16(sp) + fb8: 1000 addi s0,sp,32 + fba: e40c sd a1,8(s0) + fbc: e810 sd a2,16(s0) + fbe: ec14 sd a3,24(s0) + fc0: f018 sd a4,32(s0) + fc2: f41c sd a5,40(s0) + fc4: 03043823 sd a6,48(s0) + fc8: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + fcc: 00840613 addi a2,s0,8 + fd0: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + fd4: 85aa mv a1,a0 + fd6: 4505 li a0,1 + fd8: d0dff0ef jal ce4 +} + fdc: 60e2 ld ra,24(sp) + fde: 6442 ld s0,16(sp) + fe0: 6125 addi sp,sp,96 + fe2: 8082 ret + +0000000000000fe4 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + fe4: 1141 addi sp,sp,-16 + fe6: e422 sd s0,8(sp) + fe8: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + fea: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + fee: 00001797 auipc a5,0x1 + ff2: 0227b783 ld a5,34(a5) # 2010 + ff6: a02d j 1020 + 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; + ff8: 4618 lw a4,8(a2) + ffa: 9f2d addw a4,a4,a1 + ffc: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 1000: 6398 ld a4,0(a5) + 1002: 6310 ld a2,0(a4) + 1004: a83d j 1042 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 1006: ff852703 lw a4,-8(a0) + 100a: 9f31 addw a4,a4,a2 + 100c: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 100e: ff053683 ld a3,-16(a0) + 1012: a091 j 1056 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 1014: 6398 ld a4,0(a5) + 1016: 00e7e463 bltu a5,a4,101e + 101a: 00e6ea63 bltu a3,a4,102e +{ + 101e: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 1020: fed7fae3 bgeu a5,a3,1014 + 1024: 6398 ld a4,0(a5) + 1026: 00e6e463 bltu a3,a4,102e + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 102a: fee7eae3 bltu a5,a4,101e + if(bp + bp->s.size == p->s.ptr){ + 102e: ff852583 lw a1,-8(a0) + 1032: 6390 ld a2,0(a5) + 1034: 02059813 slli a6,a1,0x20 + 1038: 01c85713 srli a4,a6,0x1c + 103c: 9736 add a4,a4,a3 + 103e: fae60de3 beq a2,a4,ff8 + bp->s.ptr = p->s.ptr->s.ptr; + 1042: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 1046: 4790 lw a2,8(a5) + 1048: 02061593 slli a1,a2,0x20 + 104c: 01c5d713 srli a4,a1,0x1c + 1050: 973e add a4,a4,a5 + 1052: fae68ae3 beq a3,a4,1006 + p->s.ptr = bp->s.ptr; + 1056: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 1058: 00001717 auipc a4,0x1 + 105c: faf73c23 sd a5,-72(a4) # 2010 +} + 1060: 6422 ld s0,8(sp) + 1062: 0141 addi sp,sp,16 + 1064: 8082 ret + +0000000000001066 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 1066: 7139 addi sp,sp,-64 + 1068: fc06 sd ra,56(sp) + 106a: f822 sd s0,48(sp) + 106c: f426 sd s1,40(sp) + 106e: ec4e sd s3,24(sp) + 1070: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 1072: 02051493 slli s1,a0,0x20 + 1076: 9081 srli s1,s1,0x20 + 1078: 04bd addi s1,s1,15 + 107a: 8091 srli s1,s1,0x4 + 107c: 0014899b addiw s3,s1,1 + 1080: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 1082: 00001517 auipc a0,0x1 + 1086: f8e53503 ld a0,-114(a0) # 2010 + 108a: c915 beqz a0,10be + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 108c: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 108e: 4798 lw a4,8(a5) + 1090: 08977a63 bgeu a4,s1,1124 + 1094: f04a sd s2,32(sp) + 1096: e852 sd s4,16(sp) + 1098: e456 sd s5,8(sp) + 109a: e05a sd s6,0(sp) + if(nu < 4096) + 109c: 8a4e mv s4,s3 + 109e: 0009871b sext.w a4,s3 + 10a2: 6685 lui a3,0x1 + 10a4: 00d77363 bgeu a4,a3,10aa + 10a8: 6a05 lui s4,0x1 + 10aa: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 10ae: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 10b2: 00001917 auipc s2,0x1 + 10b6: f5e90913 addi s2,s2,-162 # 2010 + if(p == SBRK_ERROR) + 10ba: 5afd li s5,-1 + 10bc: a081 j 10fc + 10be: f04a sd s2,32(sp) + 10c0: e852 sd s4,16(sp) + 10c2: e456 sd s5,8(sp) + 10c4: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 10c6: 00001797 auipc a5,0x1 + 10ca: 34278793 addi a5,a5,834 # 2408 + 10ce: 00001717 auipc a4,0x1 + 10d2: f4f73123 sd a5,-190(a4) # 2010 + 10d6: e39c sd a5,0(a5) + base.s.size = 0; + 10d8: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 10dc: b7c1 j 109c + prevp->s.ptr = p->s.ptr; + 10de: 6398 ld a4,0(a5) + 10e0: e118 sd a4,0(a0) + 10e2: a8a9 j 113c + hp->s.size = nu; + 10e4: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 10e8: 0541 addi a0,a0,16 + 10ea: efbff0ef jal fe4 + return freep; + 10ee: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 10f2: c12d beqz a0,1154 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 10f4: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 10f6: 4798 lw a4,8(a5) + 10f8: 02977263 bgeu a4,s1,111c + if(p == freep) + 10fc: 00093703 ld a4,0(s2) + 1100: 853e mv a0,a5 + 1102: fef719e3 bne a4,a5,10f4 + p = sbrk(nu * sizeof(Header)); + 1106: 8552 mv a0,s4 + 1108: a37ff0ef jal b3e + if(p == SBRK_ERROR) + 110c: fd551ce3 bne a0,s5,10e4 + return 0; + 1110: 4501 li a0,0 + 1112: 7902 ld s2,32(sp) + 1114: 6a42 ld s4,16(sp) + 1116: 6aa2 ld s5,8(sp) + 1118: 6b02 ld s6,0(sp) + 111a: a03d j 1148 + 111c: 7902 ld s2,32(sp) + 111e: 6a42 ld s4,16(sp) + 1120: 6aa2 ld s5,8(sp) + 1122: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 1124: fae48de3 beq s1,a4,10de + p->s.size -= nunits; + 1128: 4137073b subw a4,a4,s3 + 112c: c798 sw a4,8(a5) + p += p->s.size; + 112e: 02071693 slli a3,a4,0x20 + 1132: 01c6d713 srli a4,a3,0x1c + 1136: 97ba add a5,a5,a4 + p->s.size = nunits; + 1138: 0137a423 sw s3,8(a5) + freep = prevp; + 113c: 00001717 auipc a4,0x1 + 1140: eca73a23 sd a0,-300(a4) # 2010 + return (void*)(p + 1); + 1144: 01078513 addi a0,a5,16 + } +} + 1148: 70e2 ld ra,56(sp) + 114a: 7442 ld s0,48(sp) + 114c: 74a2 ld s1,40(sp) + 114e: 69e2 ld s3,24(sp) + 1150: 6121 addi sp,sp,64 + 1152: 8082 ret + 1154: 7902 ld s2,32(sp) + 1156: 6a42 ld s4,16(sp) + 1158: 6aa2 ld s5,8(sp) + 115a: 6b02 ld s6,0(sp) + 115c: b7f5 j 1148 diff --git a/user/grind.c b/G12_Project1_xv6CustomizeSystemCalls/user/grind.c similarity index 100% rename from user/grind.c rename to G12_Project1_xv6CustomizeSystemCalls/user/grind.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/grind.d b/G12_Project1_xv6CustomizeSystemCalls/user/grind.d new file mode 100644 index 0000000000..2b8914bc0b --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/grind.d @@ -0,0 +1,3 @@ +user/grind.o: user/grind.c kernel/param.h kernel/types.h kernel/stat.h \ + user/user.h kernel/fs.h kernel/fcntl.h kernel/syscall.h \ + kernel/memlayout.h kernel/riscv.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/grind.o b/G12_Project1_xv6CustomizeSystemCalls/user/grind.o new file mode 100644 index 0000000000..6ef37e47c6 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/grind.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/grind.sym b/G12_Project1_xv6CustomizeSystemCalls/user/grind.sym new file mode 100644 index 0000000000..0f839421aa --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/grind.sym @@ -0,0 +1,74 @@ +0000000000000000 .text +0000000000001160 .rodata +00000000000014e8 .eh_frame +0000000000002000 .data +0000000000002010 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 grind.c +0000000000002020 buf.0 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000c2a putc +0000000000000c48 printint +00000000000014d0 digits +0000000000000000 umalloc.c +0000000000002010 freep +0000000000002408 base +00000000000008ee strcpy +0000000000000c02 pause +0000000000000fb2 printf +0000000000000bfa sys_sbrk +0000000000000000 do_rand +0000000000000a98 memmove +0000000000000bba mknod +00000000000009a6 gets +0000000000000bf2 getpid +0000000000000b2a memcpy +0000000000001066 malloc +0000000000000b54 sbrklazy +0000000000000b82 pipe +0000000000000074 go +00000000000007dc iter +0000000000000b92 write +0000000000000bca fstat +0000000000000f88 fprintf +0000000000000ba2 kill +0000000000000ce4 vprintf +0000000000000be2 chdir +0000000000000baa exec +0000000000000b7a wait +0000000000000c12 getprocsinfo +0000000000000058 rand +0000000000000b8a read +0000000000000bc2 unlink +0000000000000af0 memcmp +0000000000000b6a fork +0000000000002000 rand_next +0000000000000b3e sbrk +0000000000000c0a uptime +0000000000000960 memset +00000000000008a8 main +0000000000000c1a getppid +000000000000090a strcmp +0000000000000bea dup +0000000000000a16 stat +0000000000000c22 sleep2 +0000000000000bd2 link +0000000000000b72 exit +00000000000008de start +0000000000000a50 atoi +0000000000000936 strlen +0000000000000bb2 open +0000000000000982 strchr +0000000000000bda mkdir +0000000000000b9a close +0000000000000fe4 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/init.asm b/G12_Project1_xv6CustomizeSystemCalls/user/init.asm new file mode 100644 index 0000000000..4eb5707d3b --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/init.asm @@ -0,0 +1,1579 @@ + +user/_init: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: + +char *argv[] = { "sh", 0 }; + +int +main(void) +{ + 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 pid, wpid; + + if(open("console", O_RDWR) < 0){ + c: 4589 li a1,2 + e: 00001517 auipc a0,0x1 + 12: 93250513 addi a0,a0,-1742 # 940 + 16: 37a000ef jal 390 + 1a: 04054563 bltz a0,64 + mknod("console", CONSOLE, 0); + open("console", O_RDWR); + } + dup(0); // stdout + 1e: 4501 li a0,0 + 20: 3a8000ef jal 3c8 + dup(0); // stderr + 24: 4501 li a0,0 + 26: 3a2000ef jal 3c8 + + for(;;){ + printf("init: starting sh\n"); + 2a: 00001917 auipc s2,0x1 + 2e: 91e90913 addi s2,s2,-1762 # 948 + 32: 854a mv a0,s2 + 34: 75c000ef jal 790 + pid = fork(); + 38: 310000ef jal 348 + 3c: 84aa mv s1,a0 + if(pid < 0){ + 3e: 04054363 bltz a0,84 + printf("init: fork failed\n"); + exit(1); + } + if(pid == 0){ + 42: c931 beqz a0,96 + } + + for(;;){ + // this call to wait() returns if the shell exits, + // or if a parentless process exits. + wpid = wait((int *) 0); + 44: 4501 li a0,0 + 46: 312000ef jal 358 + if(wpid == pid){ + 4a: fea484e3 beq s1,a0,32 + // the shell exited; restart it. + break; + } else if(wpid < 0){ + 4e: fe055be3 bgez a0,44 + printf("init: wait returned an error\n"); + 52: 00001517 auipc a0,0x1 + 56: 94650513 addi a0,a0,-1722 # 998 + 5a: 736000ef jal 790 + exit(1); + 5e: 4505 li a0,1 + 60: 2f0000ef jal 350 + mknod("console", CONSOLE, 0); + 64: 4601 li a2,0 + 66: 4585 li a1,1 + 68: 00001517 auipc a0,0x1 + 6c: 8d850513 addi a0,a0,-1832 # 940 + 70: 328000ef jal 398 + open("console", O_RDWR); + 74: 4589 li a1,2 + 76: 00001517 auipc a0,0x1 + 7a: 8ca50513 addi a0,a0,-1846 # 940 + 7e: 312000ef jal 390 + 82: bf71 j 1e + printf("init: fork failed\n"); + 84: 00001517 auipc a0,0x1 + 88: 8dc50513 addi a0,a0,-1828 # 960 + 8c: 704000ef jal 790 + exit(1); + 90: 4505 li a0,1 + 92: 2be000ef jal 350 + exec("sh", argv); + 96: 00001597 auipc a1,0x1 + 9a: f6a58593 addi a1,a1,-150 # 1000 + 9e: 00001517 auipc a0,0x1 + a2: 8da50513 addi a0,a0,-1830 # 978 + a6: 2e2000ef jal 388 + printf("init: exec sh failed\n"); + aa: 00001517 auipc a0,0x1 + ae: 8d650513 addi a0,a0,-1834 # 980 + b2: 6de000ef jal 790 + exit(1); + b6: 4505 li a0,1 + b8: 298000ef jal 350 + +00000000000000bc : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + bc: 1141 addi sp,sp,-16 + be: e406 sd ra,8(sp) + c0: e022 sd s0,0(sp) + c2: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + c4: f3dff0ef jal 0
+ exit(r); + c8: 288000ef jal 350 + +00000000000000cc : +} + +char* +strcpy(char *s, const char *t) +{ + cc: 1141 addi sp,sp,-16 + ce: e422 sd s0,8(sp) + d0: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + d2: 87aa mv a5,a0 + d4: 0585 addi a1,a1,1 + d6: 0785 addi a5,a5,1 + d8: fff5c703 lbu a4,-1(a1) + dc: fee78fa3 sb a4,-1(a5) + e0: fb75 bnez a4,d4 + ; + return os; +} + e2: 6422 ld s0,8(sp) + e4: 0141 addi sp,sp,16 + e6: 8082 ret + +00000000000000e8 : + +int +strcmp(const char *p, const char *q) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + while(*p && *p == *q) + ee: 00054783 lbu a5,0(a0) + f2: cb91 beqz a5,106 + f4: 0005c703 lbu a4,0(a1) + f8: 00f71763 bne a4,a5,106 + p++, q++; + fc: 0505 addi a0,a0,1 + fe: 0585 addi a1,a1,1 + while(*p && *p == *q) + 100: 00054783 lbu a5,0(a0) + 104: fbe5 bnez a5,f4 + return (uchar)*p - (uchar)*q; + 106: 0005c503 lbu a0,0(a1) +} + 10a: 40a7853b subw a0,a5,a0 + 10e: 6422 ld s0,8(sp) + 110: 0141 addi sp,sp,16 + 112: 8082 ret + +0000000000000114 : + +uint +strlen(const char *s) +{ + 114: 1141 addi sp,sp,-16 + 116: e422 sd s0,8(sp) + 118: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 11a: 00054783 lbu a5,0(a0) + 11e: cf91 beqz a5,13a + 120: 0505 addi a0,a0,1 + 122: 87aa mv a5,a0 + 124: 86be mv a3,a5 + 126: 0785 addi a5,a5,1 + 128: fff7c703 lbu a4,-1(a5) + 12c: ff65 bnez a4,124 + 12e: 40a6853b subw a0,a3,a0 + 132: 2505 addiw a0,a0,1 + ; + return n; +} + 134: 6422 ld s0,8(sp) + 136: 0141 addi sp,sp,16 + 138: 8082 ret + for(n = 0; s[n]; n++) + 13a: 4501 li a0,0 + 13c: bfe5 j 134 + +000000000000013e : + +void* +memset(void *dst, int c, uint n) +{ + 13e: 1141 addi sp,sp,-16 + 140: e422 sd s0,8(sp) + 142: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 144: ca19 beqz a2,15a + 146: 87aa mv a5,a0 + 148: 1602 slli a2,a2,0x20 + 14a: 9201 srli a2,a2,0x20 + 14c: 00a60733 add a4,a2,a0 + cdst[i] = c; + 150: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 154: 0785 addi a5,a5,1 + 156: fee79de3 bne a5,a4,150 + } + return dst; +} + 15a: 6422 ld s0,8(sp) + 15c: 0141 addi sp,sp,16 + 15e: 8082 ret + +0000000000000160 : + +char* +strchr(const char *s, char c) +{ + 160: 1141 addi sp,sp,-16 + 162: e422 sd s0,8(sp) + 164: 0800 addi s0,sp,16 + for(; *s; s++) + 166: 00054783 lbu a5,0(a0) + 16a: cb99 beqz a5,180 + if(*s == c) + 16c: 00f58763 beq a1,a5,17a + for(; *s; s++) + 170: 0505 addi a0,a0,1 + 172: 00054783 lbu a5,0(a0) + 176: fbfd bnez a5,16c + return (char*)s; + return 0; + 178: 4501 li a0,0 +} + 17a: 6422 ld s0,8(sp) + 17c: 0141 addi sp,sp,16 + 17e: 8082 ret + return 0; + 180: 4501 li a0,0 + 182: bfe5 j 17a + +0000000000000184 : + +char* +gets(char *buf, int max) +{ + 184: 711d addi sp,sp,-96 + 186: ec86 sd ra,88(sp) + 188: e8a2 sd s0,80(sp) + 18a: e4a6 sd s1,72(sp) + 18c: e0ca sd s2,64(sp) + 18e: fc4e sd s3,56(sp) + 190: f852 sd s4,48(sp) + 192: f456 sd s5,40(sp) + 194: f05a sd s6,32(sp) + 196: ec5e sd s7,24(sp) + 198: 1080 addi s0,sp,96 + 19a: 8baa mv s7,a0 + 19c: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 19e: 892a mv s2,a0 + 1a0: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1a2: 4aa9 li s5,10 + 1a4: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1a6: 89a6 mv s3,s1 + 1a8: 2485 addiw s1,s1,1 + 1aa: 0344d663 bge s1,s4,1d6 + cc = read(0, &c, 1); + 1ae: 4605 li a2,1 + 1b0: faf40593 addi a1,s0,-81 + 1b4: 4501 li a0,0 + 1b6: 1b2000ef jal 368 + if(cc < 1) + 1ba: 00a05e63 blez a0,1d6 + buf[i++] = c; + 1be: faf44783 lbu a5,-81(s0) + 1c2: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1c6: 01578763 beq a5,s5,1d4 + 1ca: 0905 addi s2,s2,1 + 1cc: fd679de3 bne a5,s6,1a6 + buf[i++] = c; + 1d0: 89a6 mv s3,s1 + 1d2: a011 j 1d6 + 1d4: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1d6: 99de add s3,s3,s7 + 1d8: 00098023 sb zero,0(s3) + return buf; +} + 1dc: 855e mv a0,s7 + 1de: 60e6 ld ra,88(sp) + 1e0: 6446 ld s0,80(sp) + 1e2: 64a6 ld s1,72(sp) + 1e4: 6906 ld s2,64(sp) + 1e6: 79e2 ld s3,56(sp) + 1e8: 7a42 ld s4,48(sp) + 1ea: 7aa2 ld s5,40(sp) + 1ec: 7b02 ld s6,32(sp) + 1ee: 6be2 ld s7,24(sp) + 1f0: 6125 addi sp,sp,96 + 1f2: 8082 ret + +00000000000001f4 : + +int +stat(const char *n, struct stat *st) +{ + 1f4: 1101 addi sp,sp,-32 + 1f6: ec06 sd ra,24(sp) + 1f8: e822 sd s0,16(sp) + 1fa: e04a sd s2,0(sp) + 1fc: 1000 addi s0,sp,32 + 1fe: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 200: 4581 li a1,0 + 202: 18e000ef jal 390 + if(fd < 0) + 206: 02054263 bltz a0,22a + 20a: e426 sd s1,8(sp) + 20c: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 20e: 85ca mv a1,s2 + 210: 198000ef jal 3a8 + 214: 892a mv s2,a0 + close(fd); + 216: 8526 mv a0,s1 + 218: 160000ef jal 378 + return r; + 21c: 64a2 ld s1,8(sp) +} + 21e: 854a mv a0,s2 + 220: 60e2 ld ra,24(sp) + 222: 6442 ld s0,16(sp) + 224: 6902 ld s2,0(sp) + 226: 6105 addi sp,sp,32 + 228: 8082 ret + return -1; + 22a: 597d li s2,-1 + 22c: bfcd j 21e + +000000000000022e : + +int +atoi(const char *s) +{ + 22e: 1141 addi sp,sp,-16 + 230: e422 sd s0,8(sp) + 232: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 234: 00054683 lbu a3,0(a0) + 238: fd06879b addiw a5,a3,-48 + 23c: 0ff7f793 zext.b a5,a5 + 240: 4625 li a2,9 + 242: 02f66863 bltu a2,a5,272 + 246: 872a mv a4,a0 + n = 0; + 248: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 24a: 0705 addi a4,a4,1 + 24c: 0025179b slliw a5,a0,0x2 + 250: 9fa9 addw a5,a5,a0 + 252: 0017979b slliw a5,a5,0x1 + 256: 9fb5 addw a5,a5,a3 + 258: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 25c: 00074683 lbu a3,0(a4) + 260: fd06879b addiw a5,a3,-48 + 264: 0ff7f793 zext.b a5,a5 + 268: fef671e3 bgeu a2,a5,24a + return n; +} + 26c: 6422 ld s0,8(sp) + 26e: 0141 addi sp,sp,16 + 270: 8082 ret + n = 0; + 272: 4501 li a0,0 + 274: bfe5 j 26c + +0000000000000276 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 276: 1141 addi sp,sp,-16 + 278: e422 sd s0,8(sp) + 27a: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 27c: 02b57463 bgeu a0,a1,2a4 + while(n-- > 0) + 280: 00c05f63 blez a2,29e + 284: 1602 slli a2,a2,0x20 + 286: 9201 srli a2,a2,0x20 + 288: 00c507b3 add a5,a0,a2 + dst = vdst; + 28c: 872a mv a4,a0 + *dst++ = *src++; + 28e: 0585 addi a1,a1,1 + 290: 0705 addi a4,a4,1 + 292: fff5c683 lbu a3,-1(a1) + 296: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 29a: fef71ae3 bne a4,a5,28e + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 29e: 6422 ld s0,8(sp) + 2a0: 0141 addi sp,sp,16 + 2a2: 8082 ret + dst += n; + 2a4: 00c50733 add a4,a0,a2 + src += n; + 2a8: 95b2 add a1,a1,a2 + while(n-- > 0) + 2aa: fec05ae3 blez a2,29e + 2ae: fff6079b addiw a5,a2,-1 + 2b2: 1782 slli a5,a5,0x20 + 2b4: 9381 srli a5,a5,0x20 + 2b6: fff7c793 not a5,a5 + 2ba: 97ba add a5,a5,a4 + *--dst = *--src; + 2bc: 15fd addi a1,a1,-1 + 2be: 177d addi a4,a4,-1 + 2c0: 0005c683 lbu a3,0(a1) + 2c4: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2c8: fee79ae3 bne a5,a4,2bc + 2cc: bfc9 j 29e + +00000000000002ce : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2ce: 1141 addi sp,sp,-16 + 2d0: e422 sd s0,8(sp) + 2d2: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2d4: ca05 beqz a2,304 + 2d6: fff6069b addiw a3,a2,-1 + 2da: 1682 slli a3,a3,0x20 + 2dc: 9281 srli a3,a3,0x20 + 2de: 0685 addi a3,a3,1 + 2e0: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2e2: 00054783 lbu a5,0(a0) + 2e6: 0005c703 lbu a4,0(a1) + 2ea: 00e79863 bne a5,a4,2fa + return *p1 - *p2; + } + p1++; + 2ee: 0505 addi a0,a0,1 + p2++; + 2f0: 0585 addi a1,a1,1 + while (n-- > 0) { + 2f2: fed518e3 bne a0,a3,2e2 + } + return 0; + 2f6: 4501 li a0,0 + 2f8: a019 j 2fe + return *p1 - *p2; + 2fa: 40e7853b subw a0,a5,a4 +} + 2fe: 6422 ld s0,8(sp) + 300: 0141 addi sp,sp,16 + 302: 8082 ret + return 0; + 304: 4501 li a0,0 + 306: bfe5 j 2fe + +0000000000000308 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 308: 1141 addi sp,sp,-16 + 30a: e406 sd ra,8(sp) + 30c: e022 sd s0,0(sp) + 30e: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 310: f67ff0ef jal 276 +} + 314: 60a2 ld ra,8(sp) + 316: 6402 ld s0,0(sp) + 318: 0141 addi sp,sp,16 + 31a: 8082 ret + +000000000000031c : + +char * +sbrk(int 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 sys_sbrk(n, SBRK_EAGER); + 324: 4585 li a1,1 + 326: 0b2000ef jal 3d8 +} + 32a: 60a2 ld ra,8(sp) + 32c: 6402 ld s0,0(sp) + 32e: 0141 addi sp,sp,16 + 330: 8082 ret + +0000000000000332 : + +char * +sbrklazy(int n) { + 332: 1141 addi sp,sp,-16 + 334: e406 sd ra,8(sp) + 336: e022 sd s0,0(sp) + 338: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 33a: 4589 li a1,2 + 33c: 09c000ef jal 3d8 +} + 340: 60a2 ld ra,8(sp) + 342: 6402 ld s0,0(sp) + 344: 0141 addi sp,sp,16 + 346: 8082 ret + +0000000000000348 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 348: 4885 li a7,1 + ecall + 34a: 00000073 ecall + ret + 34e: 8082 ret + +0000000000000350 : +.global exit +exit: + li a7, SYS_exit + 350: 4889 li a7,2 + ecall + 352: 00000073 ecall + ret + 356: 8082 ret + +0000000000000358 : +.global wait +wait: + li a7, SYS_wait + 358: 488d li a7,3 + ecall + 35a: 00000073 ecall + ret + 35e: 8082 ret + +0000000000000360 : +.global pipe +pipe: + li a7, SYS_pipe + 360: 4891 li a7,4 + ecall + 362: 00000073 ecall + ret + 366: 8082 ret + +0000000000000368 : +.global read +read: + li a7, SYS_read + 368: 4895 li a7,5 + ecall + 36a: 00000073 ecall + ret + 36e: 8082 ret + +0000000000000370 : +.global write +write: + li a7, SYS_write + 370: 48c1 li a7,16 + ecall + 372: 00000073 ecall + ret + 376: 8082 ret + +0000000000000378 : +.global close +close: + li a7, SYS_close + 378: 48d5 li a7,21 + ecall + 37a: 00000073 ecall + ret + 37e: 8082 ret + +0000000000000380 : +.global kill +kill: + li a7, SYS_kill + 380: 4899 li a7,6 + ecall + 382: 00000073 ecall + ret + 386: 8082 ret + +0000000000000388 : +.global exec +exec: + li a7, SYS_exec + 388: 489d li a7,7 + ecall + 38a: 00000073 ecall + ret + 38e: 8082 ret + +0000000000000390 : +.global open +open: + li a7, SYS_open + 390: 48bd li a7,15 + ecall + 392: 00000073 ecall + ret + 396: 8082 ret + +0000000000000398 : +.global mknod +mknod: + li a7, SYS_mknod + 398: 48c5 li a7,17 + ecall + 39a: 00000073 ecall + ret + 39e: 8082 ret + +00000000000003a0 : +.global unlink +unlink: + li a7, SYS_unlink + 3a0: 48c9 li a7,18 + ecall + 3a2: 00000073 ecall + ret + 3a6: 8082 ret + +00000000000003a8 : +.global fstat +fstat: + li a7, SYS_fstat + 3a8: 48a1 li a7,8 + ecall + 3aa: 00000073 ecall + ret + 3ae: 8082 ret + +00000000000003b0 : +.global link +link: + li a7, SYS_link + 3b0: 48cd li a7,19 + ecall + 3b2: 00000073 ecall + ret + 3b6: 8082 ret + +00000000000003b8 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3b8: 48d1 li a7,20 + ecall + 3ba: 00000073 ecall + ret + 3be: 8082 ret + +00000000000003c0 : +.global chdir +chdir: + li a7, SYS_chdir + 3c0: 48a5 li a7,9 + ecall + 3c2: 00000073 ecall + ret + 3c6: 8082 ret + +00000000000003c8 : +.global dup +dup: + li a7, SYS_dup + 3c8: 48a9 li a7,10 + ecall + 3ca: 00000073 ecall + ret + 3ce: 8082 ret + +00000000000003d0 : +.global getpid +getpid: + li a7, SYS_getpid + 3d0: 48ad li a7,11 + ecall + 3d2: 00000073 ecall + ret + 3d6: 8082 ret + +00000000000003d8 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3d8: 48b1 li a7,12 + ecall + 3da: 00000073 ecall + ret + 3de: 8082 ret + +00000000000003e0 : +.global pause +pause: + li a7, SYS_pause + 3e0: 48b5 li a7,13 + ecall + 3e2: 00000073 ecall + ret + 3e6: 8082 ret + +00000000000003e8 : +.global uptime +uptime: + li a7, SYS_uptime + 3e8: 48b9 li a7,14 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 3f0: 48d9 li a7,22 + ecall + 3f2: 00000073 ecall + ret + 3f6: 8082 ret + +00000000000003f8 : +.global getppid +getppid: + li a7, SYS_getppid + 3f8: 48dd li a7,23 + ecall + 3fa: 00000073 ecall + ret + 3fe: 8082 ret + +0000000000000400 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 400: 48e1 li a7,24 + ecall + 402: 00000073 ecall + ret + 406: 8082 ret + +0000000000000408 : + +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: f57ff0ef jal 370 +} + 41e: 60e2 ld ra,24(sp) + 420: 6442 ld s0,16(sp) + 422: 6105 addi sp,sp,32 + 424: 8082 ret + +0000000000000426 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 426: 715d addi sp,sp,-80 + 428: e486 sd ra,72(sp) + 42a: e0a2 sd s0,64(sp) + 42c: f84a sd s2,48(sp) + 42e: 0880 addi s0,sp,80 + 430: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 432: c299 beqz a3,438 + 434: 0805c363 bltz a1,4ba + neg = 0; + 438: 4881 li a7,0 + 43a: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 43e: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 440: 00000517 auipc a0,0x0 + 444: 58050513 addi a0,a0,1408 # 9c0 + 448: 883e mv a6,a5 + 44a: 2785 addiw a5,a5,1 + 44c: 02c5f733 remu a4,a1,a2 + 450: 972a add a4,a4,a0 + 452: 00074703 lbu a4,0(a4) + 456: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 45a: 872e mv a4,a1 + 45c: 02c5d5b3 divu a1,a1,a2 + 460: 0685 addi a3,a3,1 + 462: fec773e3 bgeu a4,a2,448 + if(neg) + 466: 00088b63 beqz a7,47c + buf[i++] = '-'; + 46a: fd078793 addi a5,a5,-48 + 46e: 97a2 add a5,a5,s0 + 470: 02d00713 li a4,45 + 474: fee78423 sb a4,-24(a5) + 478: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 47c: 02f05a63 blez a5,4b0 + 480: fc26 sd s1,56(sp) + 482: f44e sd s3,40(sp) + 484: fb840713 addi a4,s0,-72 + 488: 00f704b3 add s1,a4,a5 + 48c: fff70993 addi s3,a4,-1 + 490: 99be add s3,s3,a5 + 492: 37fd addiw a5,a5,-1 + 494: 1782 slli a5,a5,0x20 + 496: 9381 srli a5,a5,0x20 + 498: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 49c: fff4c583 lbu a1,-1(s1) + 4a0: 854a mv a0,s2 + 4a2: f67ff0ef jal 408 + while(--i >= 0) + 4a6: 14fd addi s1,s1,-1 + 4a8: ff349ae3 bne s1,s3,49c + 4ac: 74e2 ld s1,56(sp) + 4ae: 79a2 ld s3,40(sp) +} + 4b0: 60a6 ld ra,72(sp) + 4b2: 6406 ld s0,64(sp) + 4b4: 7942 ld s2,48(sp) + 4b6: 6161 addi sp,sp,80 + 4b8: 8082 ret + x = -xx; + 4ba: 40b005b3 neg a1,a1 + neg = 1; + 4be: 4885 li a7,1 + x = -xx; + 4c0: bfad j 43a + +00000000000004c2 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4c2: 711d addi sp,sp,-96 + 4c4: ec86 sd ra,88(sp) + 4c6: e8a2 sd s0,80(sp) + 4c8: e0ca sd s2,64(sp) + 4ca: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4cc: 0005c903 lbu s2,0(a1) + 4d0: 28090663 beqz s2,75c + 4d4: e4a6 sd s1,72(sp) + 4d6: fc4e sd s3,56(sp) + 4d8: f852 sd s4,48(sp) + 4da: f456 sd s5,40(sp) + 4dc: f05a sd s6,32(sp) + 4de: ec5e sd s7,24(sp) + 4e0: e862 sd s8,16(sp) + 4e2: e466 sd s9,8(sp) + 4e4: 8b2a mv s6,a0 + 4e6: 8a2e mv s4,a1 + 4e8: 8bb2 mv s7,a2 + state = 0; + 4ea: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4ec: 4481 li s1,0 + 4ee: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4f0: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4f4: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4f8: 06c00c93 li s9,108 + 4fc: a005 j 51c + putc(fd, c0); + 4fe: 85ca mv a1,s2 + 500: 855a mv a0,s6 + 502: f07ff0ef jal 408 + 506: a019 j 50c + } else if(state == '%'){ + 508: 03598263 beq s3,s5,52c + for(i = 0; fmt[i]; i++){ + 50c: 2485 addiw s1,s1,1 + 50e: 8726 mv a4,s1 + 510: 009a07b3 add a5,s4,s1 + 514: 0007c903 lbu s2,0(a5) + 518: 22090a63 beqz s2,74c + c0 = fmt[i] & 0xff; + 51c: 0009079b sext.w a5,s2 + if(state == 0){ + 520: fe0994e3 bnez s3,508 + if(c0 == '%'){ + 524: fd579de3 bne a5,s5,4fe + state = '%'; + 528: 89be mv s3,a5 + 52a: b7cd j 50c + if(c0) c1 = fmt[i+1] & 0xff; + 52c: 00ea06b3 add a3,s4,a4 + 530: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 534: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 536: c681 beqz a3,53e + 538: 9752 add a4,a4,s4 + 53a: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 53e: 05878363 beq a5,s8,584 + } else if(c0 == 'l' && c1 == 'd'){ + 542: 05978d63 beq a5,s9,59c + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 546: 07500713 li a4,117 + 54a: 0ee78763 beq a5,a4,638 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 54e: 07800713 li a4,120 + 552: 12e78963 beq a5,a4,684 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 556: 07000713 li a4,112 + 55a: 14e78e63 beq a5,a4,6b6 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 55e: 06300713 li a4,99 + 562: 18e78e63 beq a5,a4,6fe + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 566: 07300713 li a4,115 + 56a: 1ae78463 beq a5,a4,712 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 56e: 02500713 li a4,37 + 572: 04e79563 bne a5,a4,5bc + putc(fd, '%'); + 576: 02500593 li a1,37 + 57a: 855a mv a0,s6 + 57c: e8dff0ef jal 408 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 580: 4981 li s3,0 + 582: b769 j 50c + printint(fd, va_arg(ap, int), 10, 1); + 584: 008b8913 addi s2,s7,8 + 588: 4685 li a3,1 + 58a: 4629 li a2,10 + 58c: 000ba583 lw a1,0(s7) + 590: 855a mv a0,s6 + 592: e95ff0ef jal 426 + 596: 8bca mv s7,s2 + state = 0; + 598: 4981 li s3,0 + 59a: bf8d j 50c + } else if(c0 == 'l' && c1 == 'd'){ + 59c: 06400793 li a5,100 + 5a0: 02f68963 beq a3,a5,5d2 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5a4: 06c00793 li a5,108 + 5a8: 04f68263 beq a3,a5,5ec + } else if(c0 == 'l' && c1 == 'u'){ + 5ac: 07500793 li a5,117 + 5b0: 0af68063 beq a3,a5,650 + } else if(c0 == 'l' && c1 == 'x'){ + 5b4: 07800793 li a5,120 + 5b8: 0ef68263 beq a3,a5,69c + putc(fd, '%'); + 5bc: 02500593 li a1,37 + 5c0: 855a mv a0,s6 + 5c2: e47ff0ef jal 408 + putc(fd, c0); + 5c6: 85ca mv a1,s2 + 5c8: 855a mv a0,s6 + 5ca: e3fff0ef jal 408 + state = 0; + 5ce: 4981 li s3,0 + 5d0: bf35 j 50c + printint(fd, va_arg(ap, uint64), 10, 1); + 5d2: 008b8913 addi s2,s7,8 + 5d6: 4685 li a3,1 + 5d8: 4629 li a2,10 + 5da: 000bb583 ld a1,0(s7) + 5de: 855a mv a0,s6 + 5e0: e47ff0ef jal 426 + i += 1; + 5e4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5e6: 8bca mv s7,s2 + state = 0; + 5e8: 4981 li s3,0 + i += 1; + 5ea: b70d j 50c + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5ec: 06400793 li a5,100 + 5f0: 02f60763 beq a2,a5,61e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5f4: 07500793 li a5,117 + 5f8: 06f60963 beq a2,a5,66a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5fc: 07800793 li a5,120 + 600: faf61ee3 bne a2,a5,5bc + printint(fd, va_arg(ap, uint64), 16, 0); + 604: 008b8913 addi s2,s7,8 + 608: 4681 li a3,0 + 60a: 4641 li a2,16 + 60c: 000bb583 ld a1,0(s7) + 610: 855a mv a0,s6 + 612: e15ff0ef jal 426 + i += 2; + 616: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 618: 8bca mv s7,s2 + state = 0; + 61a: 4981 li s3,0 + i += 2; + 61c: bdc5 j 50c + printint(fd, va_arg(ap, uint64), 10, 1); + 61e: 008b8913 addi s2,s7,8 + 622: 4685 li a3,1 + 624: 4629 li a2,10 + 626: 000bb583 ld a1,0(s7) + 62a: 855a mv a0,s6 + 62c: dfbff0ef jal 426 + i += 2; + 630: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 632: 8bca mv s7,s2 + state = 0; + 634: 4981 li s3,0 + i += 2; + 636: bdd9 j 50c + printint(fd, va_arg(ap, uint32), 10, 0); + 638: 008b8913 addi s2,s7,8 + 63c: 4681 li a3,0 + 63e: 4629 li a2,10 + 640: 000be583 lwu a1,0(s7) + 644: 855a mv a0,s6 + 646: de1ff0ef jal 426 + 64a: 8bca mv s7,s2 + state = 0; + 64c: 4981 li s3,0 + 64e: bd7d j 50c + printint(fd, va_arg(ap, uint64), 10, 0); + 650: 008b8913 addi s2,s7,8 + 654: 4681 li a3,0 + 656: 4629 li a2,10 + 658: 000bb583 ld a1,0(s7) + 65c: 855a mv a0,s6 + 65e: dc9ff0ef jal 426 + i += 1; + 662: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 664: 8bca mv s7,s2 + state = 0; + 666: 4981 li s3,0 + i += 1; + 668: b555 j 50c + printint(fd, va_arg(ap, uint64), 10, 0); + 66a: 008b8913 addi s2,s7,8 + 66e: 4681 li a3,0 + 670: 4629 li a2,10 + 672: 000bb583 ld a1,0(s7) + 676: 855a mv a0,s6 + 678: dafff0ef jal 426 + i += 2; + 67c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 67e: 8bca mv s7,s2 + state = 0; + 680: 4981 li s3,0 + i += 2; + 682: b569 j 50c + printint(fd, va_arg(ap, uint32), 16, 0); + 684: 008b8913 addi s2,s7,8 + 688: 4681 li a3,0 + 68a: 4641 li a2,16 + 68c: 000be583 lwu a1,0(s7) + 690: 855a mv a0,s6 + 692: d95ff0ef jal 426 + 696: 8bca mv s7,s2 + state = 0; + 698: 4981 li s3,0 + 69a: bd8d j 50c + printint(fd, va_arg(ap, uint64), 16, 0); + 69c: 008b8913 addi s2,s7,8 + 6a0: 4681 li a3,0 + 6a2: 4641 li a2,16 + 6a4: 000bb583 ld a1,0(s7) + 6a8: 855a mv a0,s6 + 6aa: d7dff0ef jal 426 + i += 1; + 6ae: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6b0: 8bca mv s7,s2 + state = 0; + 6b2: 4981 li s3,0 + i += 1; + 6b4: bda1 j 50c + 6b6: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 6b8: 008b8d13 addi s10,s7,8 + 6bc: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6c0: 03000593 li a1,48 + 6c4: 855a mv a0,s6 + 6c6: d43ff0ef jal 408 + putc(fd, 'x'); + 6ca: 07800593 li a1,120 + 6ce: 855a mv a0,s6 + 6d0: d39ff0ef jal 408 + 6d4: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6d6: 00000b97 auipc s7,0x0 + 6da: 2eab8b93 addi s7,s7,746 # 9c0 + 6de: 03c9d793 srli a5,s3,0x3c + 6e2: 97de add a5,a5,s7 + 6e4: 0007c583 lbu a1,0(a5) + 6e8: 855a mv a0,s6 + 6ea: d1fff0ef jal 408 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6ee: 0992 slli s3,s3,0x4 + 6f0: 397d addiw s2,s2,-1 + 6f2: fe0916e3 bnez s2,6de + printptr(fd, va_arg(ap, uint64)); + 6f6: 8bea mv s7,s10 + state = 0; + 6f8: 4981 li s3,0 + 6fa: 6d02 ld s10,0(sp) + 6fc: bd01 j 50c + putc(fd, va_arg(ap, uint32)); + 6fe: 008b8913 addi s2,s7,8 + 702: 000bc583 lbu a1,0(s7) + 706: 855a mv a0,s6 + 708: d01ff0ef jal 408 + 70c: 8bca mv s7,s2 + state = 0; + 70e: 4981 li s3,0 + 710: bbf5 j 50c + if((s = va_arg(ap, char*)) == 0) + 712: 008b8993 addi s3,s7,8 + 716: 000bb903 ld s2,0(s7) + 71a: 00090f63 beqz s2,738 + for(; *s; s++) + 71e: 00094583 lbu a1,0(s2) + 722: c195 beqz a1,746 + putc(fd, *s); + 724: 855a mv a0,s6 + 726: ce3ff0ef jal 408 + for(; *s; s++) + 72a: 0905 addi s2,s2,1 + 72c: 00094583 lbu a1,0(s2) + 730: f9f5 bnez a1,724 + if((s = va_arg(ap, char*)) == 0) + 732: 8bce mv s7,s3 + state = 0; + 734: 4981 li s3,0 + 736: bbd9 j 50c + s = "(null)"; + 738: 00000917 auipc s2,0x0 + 73c: 28090913 addi s2,s2,640 # 9b8 + for(; *s; s++) + 740: 02800593 li a1,40 + 744: b7c5 j 724 + if((s = va_arg(ap, char*)) == 0) + 746: 8bce mv s7,s3 + state = 0; + 748: 4981 li s3,0 + 74a: b3c9 j 50c + 74c: 64a6 ld s1,72(sp) + 74e: 79e2 ld s3,56(sp) + 750: 7a42 ld s4,48(sp) + 752: 7aa2 ld s5,40(sp) + 754: 7b02 ld s6,32(sp) + 756: 6be2 ld s7,24(sp) + 758: 6c42 ld s8,16(sp) + 75a: 6ca2 ld s9,8(sp) + } + } +} + 75c: 60e6 ld ra,88(sp) + 75e: 6446 ld s0,80(sp) + 760: 6906 ld s2,64(sp) + 762: 6125 addi sp,sp,96 + 764: 8082 ret + +0000000000000766 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 766: 715d addi sp,sp,-80 + 768: ec06 sd ra,24(sp) + 76a: e822 sd s0,16(sp) + 76c: 1000 addi s0,sp,32 + 76e: e010 sd a2,0(s0) + 770: e414 sd a3,8(s0) + 772: e818 sd a4,16(s0) + 774: ec1c sd a5,24(s0) + 776: 03043023 sd a6,32(s0) + 77a: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 77e: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 782: 8622 mv a2,s0 + 784: d3fff0ef jal 4c2 +} + 788: 60e2 ld ra,24(sp) + 78a: 6442 ld s0,16(sp) + 78c: 6161 addi sp,sp,80 + 78e: 8082 ret + +0000000000000790 : + +void +printf(const char *fmt, ...) +{ + 790: 711d addi sp,sp,-96 + 792: ec06 sd ra,24(sp) + 794: e822 sd s0,16(sp) + 796: 1000 addi s0,sp,32 + 798: e40c sd a1,8(s0) + 79a: e810 sd a2,16(s0) + 79c: ec14 sd a3,24(s0) + 79e: f018 sd a4,32(s0) + 7a0: f41c sd a5,40(s0) + 7a2: 03043823 sd a6,48(s0) + 7a6: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 7aa: 00840613 addi a2,s0,8 + 7ae: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 7b2: 85aa mv a1,a0 + 7b4: 4505 li a0,1 + 7b6: d0dff0ef jal 4c2 +} + 7ba: 60e2 ld ra,24(sp) + 7bc: 6442 ld s0,16(sp) + 7be: 6125 addi sp,sp,96 + 7c0: 8082 ret + +00000000000007c2 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7c2: 1141 addi sp,sp,-16 + 7c4: e422 sd s0,8(sp) + 7c6: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7c8: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7cc: 00001797 auipc a5,0x1 + 7d0: 8447b783 ld a5,-1980(a5) # 1010 + 7d4: a02d j 7fe + 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; + 7d6: 4618 lw a4,8(a2) + 7d8: 9f2d addw a4,a4,a1 + 7da: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7de: 6398 ld a4,0(a5) + 7e0: 6310 ld a2,0(a4) + 7e2: a83d j 820 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7e4: ff852703 lw a4,-8(a0) + 7e8: 9f31 addw a4,a4,a2 + 7ea: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7ec: ff053683 ld a3,-16(a0) + 7f0: a091 j 834 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7f2: 6398 ld a4,0(a5) + 7f4: 00e7e463 bltu a5,a4,7fc + 7f8: 00e6ea63 bltu a3,a4,80c +{ + 7fc: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7fe: fed7fae3 bgeu a5,a3,7f2 + 802: 6398 ld a4,0(a5) + 804: 00e6e463 bltu a3,a4,80c + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 808: fee7eae3 bltu a5,a4,7fc + if(bp + bp->s.size == p->s.ptr){ + 80c: ff852583 lw a1,-8(a0) + 810: 6390 ld a2,0(a5) + 812: 02059813 slli a6,a1,0x20 + 816: 01c85713 srli a4,a6,0x1c + 81a: 9736 add a4,a4,a3 + 81c: fae60de3 beq a2,a4,7d6 + bp->s.ptr = p->s.ptr->s.ptr; + 820: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 824: 4790 lw a2,8(a5) + 826: 02061593 slli a1,a2,0x20 + 82a: 01c5d713 srli a4,a1,0x1c + 82e: 973e add a4,a4,a5 + 830: fae68ae3 beq a3,a4,7e4 + p->s.ptr = bp->s.ptr; + 834: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 836: 00000717 auipc a4,0x0 + 83a: 7cf73d23 sd a5,2010(a4) # 1010 +} + 83e: 6422 ld s0,8(sp) + 840: 0141 addi sp,sp,16 + 842: 8082 ret + +0000000000000844 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 844: 7139 addi sp,sp,-64 + 846: fc06 sd ra,56(sp) + 848: f822 sd s0,48(sp) + 84a: f426 sd s1,40(sp) + 84c: ec4e sd s3,24(sp) + 84e: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 850: 02051493 slli s1,a0,0x20 + 854: 9081 srli s1,s1,0x20 + 856: 04bd addi s1,s1,15 + 858: 8091 srli s1,s1,0x4 + 85a: 0014899b addiw s3,s1,1 + 85e: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 860: 00000517 auipc a0,0x0 + 864: 7b053503 ld a0,1968(a0) # 1010 + 868: c915 beqz a0,89c + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 86a: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 86c: 4798 lw a4,8(a5) + 86e: 08977a63 bgeu a4,s1,902 + 872: f04a sd s2,32(sp) + 874: e852 sd s4,16(sp) + 876: e456 sd s5,8(sp) + 878: e05a sd s6,0(sp) + if(nu < 4096) + 87a: 8a4e mv s4,s3 + 87c: 0009871b sext.w a4,s3 + 880: 6685 lui a3,0x1 + 882: 00d77363 bgeu a4,a3,888 + 886: 6a05 lui s4,0x1 + 888: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 88c: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 890: 00000917 auipc s2,0x0 + 894: 78090913 addi s2,s2,1920 # 1010 + if(p == SBRK_ERROR) + 898: 5afd li s5,-1 + 89a: a081 j 8da + 89c: f04a sd s2,32(sp) + 89e: e852 sd s4,16(sp) + 8a0: e456 sd s5,8(sp) + 8a2: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 8a4: 00000797 auipc a5,0x0 + 8a8: 77c78793 addi a5,a5,1916 # 1020 + 8ac: 00000717 auipc a4,0x0 + 8b0: 76f73223 sd a5,1892(a4) # 1010 + 8b4: e39c sd a5,0(a5) + base.s.size = 0; + 8b6: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 8ba: b7c1 j 87a + prevp->s.ptr = p->s.ptr; + 8bc: 6398 ld a4,0(a5) + 8be: e118 sd a4,0(a0) + 8c0: a8a9 j 91a + hp->s.size = nu; + 8c2: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8c6: 0541 addi a0,a0,16 + 8c8: efbff0ef jal 7c2 + return freep; + 8cc: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8d0: c12d beqz a0,932 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8d2: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8d4: 4798 lw a4,8(a5) + 8d6: 02977263 bgeu a4,s1,8fa + if(p == freep) + 8da: 00093703 ld a4,0(s2) + 8de: 853e mv a0,a5 + 8e0: fef719e3 bne a4,a5,8d2 + p = sbrk(nu * sizeof(Header)); + 8e4: 8552 mv a0,s4 + 8e6: a37ff0ef jal 31c + if(p == SBRK_ERROR) + 8ea: fd551ce3 bne a0,s5,8c2 + return 0; + 8ee: 4501 li a0,0 + 8f0: 7902 ld s2,32(sp) + 8f2: 6a42 ld s4,16(sp) + 8f4: 6aa2 ld s5,8(sp) + 8f6: 6b02 ld s6,0(sp) + 8f8: a03d j 926 + 8fa: 7902 ld s2,32(sp) + 8fc: 6a42 ld s4,16(sp) + 8fe: 6aa2 ld s5,8(sp) + 900: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 902: fae48de3 beq s1,a4,8bc + p->s.size -= nunits; + 906: 4137073b subw a4,a4,s3 + 90a: c798 sw a4,8(a5) + p += p->s.size; + 90c: 02071693 slli a3,a4,0x20 + 910: 01c6d713 srli a4,a3,0x1c + 914: 97ba add a5,a5,a4 + p->s.size = nunits; + 916: 0137a423 sw s3,8(a5) + freep = prevp; + 91a: 00000717 auipc a4,0x0 + 91e: 6ea73b23 sd a0,1782(a4) # 1010 + return (void*)(p + 1); + 922: 01078513 addi a0,a5,16 + } +} + 926: 70e2 ld ra,56(sp) + 928: 7442 ld s0,48(sp) + 92a: 74a2 ld s1,40(sp) + 92c: 69e2 ld s3,24(sp) + 92e: 6121 addi sp,sp,64 + 930: 8082 ret + 932: 7902 ld s2,32(sp) + 934: 6a42 ld s4,16(sp) + 936: 6aa2 ld s5,8(sp) + 938: 6b02 ld s6,0(sp) + 93a: b7f5 j 926 diff --git a/user/init.c b/G12_Project1_xv6CustomizeSystemCalls/user/init.c similarity index 100% rename from user/init.c rename to G12_Project1_xv6CustomizeSystemCalls/user/init.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/init.d b/G12_Project1_xv6CustomizeSystemCalls/user/init.d new file mode 100644 index 0000000000..82d3c33fd5 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/init.d @@ -0,0 +1,2 @@ +user/init.o: user/init.c kernel/types.h kernel/stat.h kernel/spinlock.h \ + kernel/sleeplock.h kernel/fs.h kernel/file.h user/user.h kernel/fcntl.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/init.o b/G12_Project1_xv6CustomizeSystemCalls/user/init.o new file mode 100644 index 0000000000..dd36cbab1a Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/init.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/init.sym b/G12_Project1_xv6CustomizeSystemCalls/user/init.sym new file mode 100644 index 0000000000..5407c898a0 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/init.sym @@ -0,0 +1,69 @@ +0000000000000000 .text +0000000000000940 .rodata +00000000000009d8 .eh_frame +0000000000001000 .data +0000000000001010 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 init.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000408 putc +0000000000000426 printint +00000000000009c0 digits +0000000000000000 umalloc.c +0000000000001010 freep +0000000000001020 base +00000000000000cc strcpy +00000000000003e0 pause +0000000000000790 printf +00000000000003d8 sys_sbrk +0000000000001000 argv +0000000000000276 memmove +0000000000000398 mknod +0000000000000184 gets +00000000000003d0 getpid +0000000000000308 memcpy +0000000000000844 malloc +0000000000000332 sbrklazy +0000000000000360 pipe +0000000000000370 write +00000000000003a8 fstat +0000000000000766 fprintf +0000000000000380 kill +00000000000004c2 vprintf +00000000000003c0 chdir +0000000000000388 exec +0000000000000358 wait +00000000000003f0 getprocsinfo +0000000000000368 read +00000000000003a0 unlink +00000000000002ce memcmp +0000000000000348 fork +000000000000031c sbrk +00000000000003e8 uptime +000000000000013e memset +0000000000000000 main +00000000000003f8 getppid +00000000000000e8 strcmp +00000000000003c8 dup +00000000000001f4 stat +0000000000000400 sleep2 +00000000000003b0 link +0000000000000350 exit +00000000000000bc start +000000000000022e atoi +0000000000000114 strlen +0000000000000390 open +0000000000000160 strchr +00000000000003b8 mkdir +0000000000000378 close +00000000000007c2 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/kill.asm b/G12_Project1_xv6CustomizeSystemCalls/user/kill.asm new file mode 100644 index 0000000000..4f6c0769f4 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/kill.asm @@ -0,0 +1,1527 @@ + +user/_kill: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/stat.h" +#include "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: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + 8: 4785 li a5,1 + a: 02a7d963 bge a5,a0,3c + e: e426 sd s1,8(sp) + 10: e04a sd s2,0(sp) + 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 + 2c: 2ec000ef jal 318 + for(i=1; i + exit(0); + 36: 4501 li a0,0 + 38: 2b0000ef jal 2e8 + 3c: e426 sd s1,8(sp) + 3e: e04a sd s2,0(sp) + fprintf(2, "usage: kill pid...\n"); + 40: 00001597 auipc a1,0x1 + 44: 8a058593 addi a1,a1,-1888 # 8e0 + 48: 4509 li a0,2 + 4a: 6b4000ef jal 6fe + exit(1); + 4e: 4505 li a0,1 + 50: 298000ef jal 2e8 + +0000000000000054 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 54: 1141 addi sp,sp,-16 + 56: e406 sd ra,8(sp) + 58: e022 sd s0,0(sp) + 5a: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 5c: fa5ff0ef jal 0
+ exit(r); + 60: 288000ef jal 2e8 + +0000000000000064 : +} + +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 + ; + return os; +} + 7a: 6422 ld s0,8(sp) + 7c: 0141 addi sp,sp,16 + 7e: 8082 ret + +0000000000000080 : + +int +strcmp(const char *p, const char *q) +{ + 80: 1141 addi sp,sp,-16 + 82: e422 sd s0,8(sp) + 84: 0800 addi s0,sp,16 + while(*p && *p == *q) + 86: 00054783 lbu a5,0(a0) + 8a: cb91 beqz a5,9e + 8c: 0005c703 lbu a4,0(a1) + 90: 00f71763 bne a4,a5,9e + p++, q++; + 94: 0505 addi a0,a0,1 + 96: 0585 addi a1,a1,1 + while(*p && *p == *q) + 98: 00054783 lbu a5,0(a0) + 9c: fbe5 bnez a5,8c + return (uchar)*p - (uchar)*q; + 9e: 0005c503 lbu a0,0(a1) +} + a2: 40a7853b subw a0,a5,a0 + a6: 6422 ld s0,8(sp) + a8: 0141 addi sp,sp,16 + aa: 8082 ret + +00000000000000ac : + +uint +strlen(const char *s) +{ + ac: 1141 addi sp,sp,-16 + ae: e422 sd s0,8(sp) + b0: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + b2: 00054783 lbu a5,0(a0) + b6: cf91 beqz a5,d2 + b8: 0505 addi a0,a0,1 + ba: 87aa mv a5,a0 + bc: 86be mv a3,a5 + be: 0785 addi a5,a5,1 + c0: fff7c703 lbu a4,-1(a5) + c4: ff65 bnez a4,bc + c6: 40a6853b subw a0,a3,a0 + ca: 2505 addiw a0,a0,1 + ; + return n; +} + cc: 6422 ld s0,8(sp) + ce: 0141 addi sp,sp,16 + d0: 8082 ret + for(n = 0; s[n]; n++) + d2: 4501 li a0,0 + d4: bfe5 j cc + +00000000000000d6 : + +void* +memset(void *dst, int c, uint n) +{ + d6: 1141 addi sp,sp,-16 + d8: e422 sd s0,8(sp) + da: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + dc: ca19 beqz a2,f2 + de: 87aa mv a5,a0 + e0: 1602 slli a2,a2,0x20 + e2: 9201 srli a2,a2,0x20 + e4: 00a60733 add a4,a2,a0 + cdst[i] = c; + e8: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + ec: 0785 addi a5,a5,1 + ee: fee79de3 bne a5,a4,e8 + } + return dst; +} + f2: 6422 ld s0,8(sp) + f4: 0141 addi sp,sp,16 + f6: 8082 ret + +00000000000000f8 : + +char* +strchr(const char *s, char c) +{ + f8: 1141 addi sp,sp,-16 + fa: e422 sd s0,8(sp) + fc: 0800 addi s0,sp,16 + for(; *s; s++) + fe: 00054783 lbu a5,0(a0) + 102: cb99 beqz a5,118 + if(*s == c) + 104: 00f58763 beq a1,a5,112 + for(; *s; s++) + 108: 0505 addi a0,a0,1 + 10a: 00054783 lbu a5,0(a0) + 10e: fbfd bnez a5,104 + return (char*)s; + return 0; + 110: 4501 li a0,0 +} + 112: 6422 ld s0,8(sp) + 114: 0141 addi sp,sp,16 + 116: 8082 ret + return 0; + 118: 4501 li a0,0 + 11a: bfe5 j 112 + +000000000000011c : + +char* +gets(char *buf, int max) +{ + 11c: 711d addi sp,sp,-96 + 11e: ec86 sd ra,88(sp) + 120: e8a2 sd s0,80(sp) + 122: e4a6 sd s1,72(sp) + 124: e0ca sd s2,64(sp) + 126: fc4e sd s3,56(sp) + 128: f852 sd s4,48(sp) + 12a: f456 sd s5,40(sp) + 12c: f05a sd s6,32(sp) + 12e: ec5e sd s7,24(sp) + 130: 1080 addi s0,sp,96 + 132: 8baa mv s7,a0 + 134: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 136: 892a mv s2,a0 + 138: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 13a: 4aa9 li s5,10 + 13c: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 13e: 89a6 mv s3,s1 + 140: 2485 addiw s1,s1,1 + 142: 0344d663 bge s1,s4,16e + cc = read(0, &c, 1); + 146: 4605 li a2,1 + 148: faf40593 addi a1,s0,-81 + 14c: 4501 li a0,0 + 14e: 1b2000ef jal 300 + if(cc < 1) + 152: 00a05e63 blez a0,16e + buf[i++] = c; + 156: faf44783 lbu a5,-81(s0) + 15a: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 15e: 01578763 beq a5,s5,16c + 162: 0905 addi s2,s2,1 + 164: fd679de3 bne a5,s6,13e + buf[i++] = c; + 168: 89a6 mv s3,s1 + 16a: a011 j 16e + 16c: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 16e: 99de add s3,s3,s7 + 170: 00098023 sb zero,0(s3) + return buf; +} + 174: 855e mv a0,s7 + 176: 60e6 ld ra,88(sp) + 178: 6446 ld s0,80(sp) + 17a: 64a6 ld s1,72(sp) + 17c: 6906 ld s2,64(sp) + 17e: 79e2 ld s3,56(sp) + 180: 7a42 ld s4,48(sp) + 182: 7aa2 ld s5,40(sp) + 184: 7b02 ld s6,32(sp) + 186: 6be2 ld s7,24(sp) + 188: 6125 addi sp,sp,96 + 18a: 8082 ret + +000000000000018c : + +int +stat(const char *n, struct stat *st) +{ + 18c: 1101 addi sp,sp,-32 + 18e: ec06 sd ra,24(sp) + 190: e822 sd s0,16(sp) + 192: e04a sd s2,0(sp) + 194: 1000 addi s0,sp,32 + 196: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 198: 4581 li a1,0 + 19a: 18e000ef jal 328 + if(fd < 0) + 19e: 02054263 bltz a0,1c2 + 1a2: e426 sd s1,8(sp) + 1a4: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1a6: 85ca mv a1,s2 + 1a8: 198000ef jal 340 + 1ac: 892a mv s2,a0 + close(fd); + 1ae: 8526 mv a0,s1 + 1b0: 160000ef jal 310 + return r; + 1b4: 64a2 ld s1,8(sp) +} + 1b6: 854a mv a0,s2 + 1b8: 60e2 ld ra,24(sp) + 1ba: 6442 ld s0,16(sp) + 1bc: 6902 ld s2,0(sp) + 1be: 6105 addi sp,sp,32 + 1c0: 8082 ret + return -1; + 1c2: 597d li s2,-1 + 1c4: bfcd j 1b6 + +00000000000001c6 : + +int +atoi(const char *s) +{ + 1c6: 1141 addi sp,sp,-16 + 1c8: e422 sd s0,8(sp) + 1ca: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1cc: 00054683 lbu a3,0(a0) + 1d0: fd06879b addiw a5,a3,-48 + 1d4: 0ff7f793 zext.b a5,a5 + 1d8: 4625 li a2,9 + 1da: 02f66863 bltu a2,a5,20a + 1de: 872a mv a4,a0 + n = 0; + 1e0: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1e2: 0705 addi a4,a4,1 + 1e4: 0025179b slliw a5,a0,0x2 + 1e8: 9fa9 addw a5,a5,a0 + 1ea: 0017979b slliw a5,a5,0x1 + 1ee: 9fb5 addw a5,a5,a3 + 1f0: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1f4: 00074683 lbu a3,0(a4) + 1f8: fd06879b addiw a5,a3,-48 + 1fc: 0ff7f793 zext.b a5,a5 + 200: fef671e3 bgeu a2,a5,1e2 + return n; +} + 204: 6422 ld s0,8(sp) + 206: 0141 addi sp,sp,16 + 208: 8082 ret + n = 0; + 20a: 4501 li a0,0 + 20c: bfe5 j 204 + +000000000000020e : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 20e: 1141 addi sp,sp,-16 + 210: e422 sd s0,8(sp) + 212: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 214: 02b57463 bgeu a0,a1,23c + while(n-- > 0) + 218: 00c05f63 blez a2,236 + 21c: 1602 slli a2,a2,0x20 + 21e: 9201 srli a2,a2,0x20 + 220: 00c507b3 add a5,a0,a2 + dst = vdst; + 224: 872a mv a4,a0 + *dst++ = *src++; + 226: 0585 addi a1,a1,1 + 228: 0705 addi a4,a4,1 + 22a: fff5c683 lbu a3,-1(a1) + 22e: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 232: fef71ae3 bne a4,a5,226 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 236: 6422 ld s0,8(sp) + 238: 0141 addi sp,sp,16 + 23a: 8082 ret + dst += n; + 23c: 00c50733 add a4,a0,a2 + src += n; + 240: 95b2 add a1,a1,a2 + while(n-- > 0) + 242: fec05ae3 blez a2,236 + 246: fff6079b addiw a5,a2,-1 + 24a: 1782 slli a5,a5,0x20 + 24c: 9381 srli a5,a5,0x20 + 24e: fff7c793 not a5,a5 + 252: 97ba add a5,a5,a4 + *--dst = *--src; + 254: 15fd addi a1,a1,-1 + 256: 177d addi a4,a4,-1 + 258: 0005c683 lbu a3,0(a1) + 25c: 00d70023 sb a3,0(a4) + while(n-- > 0) + 260: fee79ae3 bne a5,a4,254 + 264: bfc9 j 236 + +0000000000000266 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 266: 1141 addi sp,sp,-16 + 268: e422 sd s0,8(sp) + 26a: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 26c: ca05 beqz a2,29c + 26e: fff6069b addiw a3,a2,-1 + 272: 1682 slli a3,a3,0x20 + 274: 9281 srli a3,a3,0x20 + 276: 0685 addi a3,a3,1 + 278: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 27a: 00054783 lbu a5,0(a0) + 27e: 0005c703 lbu a4,0(a1) + 282: 00e79863 bne a5,a4,292 + return *p1 - *p2; + } + p1++; + 286: 0505 addi a0,a0,1 + p2++; + 288: 0585 addi a1,a1,1 + while (n-- > 0) { + 28a: fed518e3 bne a0,a3,27a + } + return 0; + 28e: 4501 li a0,0 + 290: a019 j 296 + return *p1 - *p2; + 292: 40e7853b subw a0,a5,a4 +} + 296: 6422 ld s0,8(sp) + 298: 0141 addi sp,sp,16 + 29a: 8082 ret + return 0; + 29c: 4501 li a0,0 + 29e: bfe5 j 296 + +00000000000002a0 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2a0: 1141 addi sp,sp,-16 + 2a2: e406 sd ra,8(sp) + 2a4: e022 sd s0,0(sp) + 2a6: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2a8: f67ff0ef jal 20e +} + 2ac: 60a2 ld ra,8(sp) + 2ae: 6402 ld s0,0(sp) + 2b0: 0141 addi sp,sp,16 + 2b2: 8082 ret + +00000000000002b4 : + +char * +sbrk(int n) { + 2b4: 1141 addi sp,sp,-16 + 2b6: e406 sd ra,8(sp) + 2b8: e022 sd s0,0(sp) + 2ba: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2bc: 4585 li a1,1 + 2be: 0b2000ef jal 370 +} + 2c2: 60a2 ld ra,8(sp) + 2c4: 6402 ld s0,0(sp) + 2c6: 0141 addi sp,sp,16 + 2c8: 8082 ret + +00000000000002ca : + +char * +sbrklazy(int n) { + 2ca: 1141 addi sp,sp,-16 + 2cc: e406 sd ra,8(sp) + 2ce: e022 sd s0,0(sp) + 2d0: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2d2: 4589 li a1,2 + 2d4: 09c000ef jal 370 +} + 2d8: 60a2 ld ra,8(sp) + 2da: 6402 ld s0,0(sp) + 2dc: 0141 addi sp,sp,16 + 2de: 8082 ret + +00000000000002e0 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2e0: 4885 li a7,1 + ecall + 2e2: 00000073 ecall + ret + 2e6: 8082 ret + +00000000000002e8 : +.global exit +exit: + li a7, SYS_exit + 2e8: 4889 li a7,2 + ecall + 2ea: 00000073 ecall + ret + 2ee: 8082 ret + +00000000000002f0 : +.global wait +wait: + li a7, SYS_wait + 2f0: 488d li a7,3 + ecall + 2f2: 00000073 ecall + ret + 2f6: 8082 ret + +00000000000002f8 : +.global pipe +pipe: + li a7, SYS_pipe + 2f8: 4891 li a7,4 + ecall + 2fa: 00000073 ecall + ret + 2fe: 8082 ret + +0000000000000300 : +.global read +read: + li a7, SYS_read + 300: 4895 li a7,5 + ecall + 302: 00000073 ecall + ret + 306: 8082 ret + +0000000000000308 : +.global write +write: + li a7, SYS_write + 308: 48c1 li a7,16 + ecall + 30a: 00000073 ecall + ret + 30e: 8082 ret + +0000000000000310 : +.global close +close: + li a7, SYS_close + 310: 48d5 li a7,21 + ecall + 312: 00000073 ecall + ret + 316: 8082 ret + +0000000000000318 : +.global kill +kill: + li a7, SYS_kill + 318: 4899 li a7,6 + ecall + 31a: 00000073 ecall + ret + 31e: 8082 ret + +0000000000000320 : +.global exec +exec: + li a7, SYS_exec + 320: 489d li a7,7 + ecall + 322: 00000073 ecall + ret + 326: 8082 ret + +0000000000000328 : +.global open +open: + li a7, SYS_open + 328: 48bd li a7,15 + ecall + 32a: 00000073 ecall + ret + 32e: 8082 ret + +0000000000000330 : +.global mknod +mknod: + li a7, SYS_mknod + 330: 48c5 li a7,17 + ecall + 332: 00000073 ecall + ret + 336: 8082 ret + +0000000000000338 : +.global unlink +unlink: + li a7, SYS_unlink + 338: 48c9 li a7,18 + ecall + 33a: 00000073 ecall + ret + 33e: 8082 ret + +0000000000000340 : +.global fstat +fstat: + li a7, SYS_fstat + 340: 48a1 li a7,8 + ecall + 342: 00000073 ecall + ret + 346: 8082 ret + +0000000000000348 : +.global link +link: + li a7, SYS_link + 348: 48cd li a7,19 + ecall + 34a: 00000073 ecall + ret + 34e: 8082 ret + +0000000000000350 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 350: 48d1 li a7,20 + ecall + 352: 00000073 ecall + ret + 356: 8082 ret + +0000000000000358 : +.global chdir +chdir: + li a7, SYS_chdir + 358: 48a5 li a7,9 + ecall + 35a: 00000073 ecall + ret + 35e: 8082 ret + +0000000000000360 : +.global dup +dup: + li a7, SYS_dup + 360: 48a9 li a7,10 + ecall + 362: 00000073 ecall + ret + 366: 8082 ret + +0000000000000368 : +.global getpid +getpid: + li a7, SYS_getpid + 368: 48ad li a7,11 + ecall + 36a: 00000073 ecall + ret + 36e: 8082 ret + +0000000000000370 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 370: 48b1 li a7,12 + ecall + 372: 00000073 ecall + ret + 376: 8082 ret + +0000000000000378 : +.global pause +pause: + li a7, SYS_pause + 378: 48b5 li a7,13 + ecall + 37a: 00000073 ecall + ret + 37e: 8082 ret + +0000000000000380 : +.global uptime +uptime: + li a7, SYS_uptime + 380: 48b9 li a7,14 + ecall + 382: 00000073 ecall + ret + 386: 8082 ret + +0000000000000388 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 388: 48d9 li a7,22 + ecall + 38a: 00000073 ecall + ret + 38e: 8082 ret + +0000000000000390 : +.global getppid +getppid: + li a7, SYS_getppid + 390: 48dd li a7,23 + ecall + 392: 00000073 ecall + ret + 396: 8082 ret + +0000000000000398 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 398: 48e1 li a7,24 + ecall + 39a: 00000073 ecall + ret + 39e: 8082 ret + +00000000000003a0 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3a0: 1101 addi sp,sp,-32 + 3a2: ec06 sd ra,24(sp) + 3a4: e822 sd s0,16(sp) + 3a6: 1000 addi s0,sp,32 + 3a8: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3ac: 4605 li a2,1 + 3ae: fef40593 addi a1,s0,-17 + 3b2: f57ff0ef jal 308 +} + 3b6: 60e2 ld ra,24(sp) + 3b8: 6442 ld s0,16(sp) + 3ba: 6105 addi sp,sp,32 + 3bc: 8082 ret + +00000000000003be : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3be: 715d addi sp,sp,-80 + 3c0: e486 sd ra,72(sp) + 3c2: e0a2 sd s0,64(sp) + 3c4: f84a sd s2,48(sp) + 3c6: 0880 addi s0,sp,80 + 3c8: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3ca: c299 beqz a3,3d0 + 3cc: 0805c363 bltz a1,452 + neg = 0; + 3d0: 4881 li a7,0 + 3d2: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3d6: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3d8: 00000517 auipc a0,0x0 + 3dc: 52850513 addi a0,a0,1320 # 900 + 3e0: 883e mv a6,a5 + 3e2: 2785 addiw a5,a5,1 + 3e4: 02c5f733 remu a4,a1,a2 + 3e8: 972a add a4,a4,a0 + 3ea: 00074703 lbu a4,0(a4) + 3ee: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3f2: 872e mv a4,a1 + 3f4: 02c5d5b3 divu a1,a1,a2 + 3f8: 0685 addi a3,a3,1 + 3fa: fec773e3 bgeu a4,a2,3e0 + if(neg) + 3fe: 00088b63 beqz a7,414 + buf[i++] = '-'; + 402: fd078793 addi a5,a5,-48 + 406: 97a2 add a5,a5,s0 + 408: 02d00713 li a4,45 + 40c: fee78423 sb a4,-24(a5) + 410: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 414: 02f05a63 blez a5,448 + 418: fc26 sd s1,56(sp) + 41a: f44e sd s3,40(sp) + 41c: fb840713 addi a4,s0,-72 + 420: 00f704b3 add s1,a4,a5 + 424: fff70993 addi s3,a4,-1 + 428: 99be add s3,s3,a5 + 42a: 37fd addiw a5,a5,-1 + 42c: 1782 slli a5,a5,0x20 + 42e: 9381 srli a5,a5,0x20 + 430: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 434: fff4c583 lbu a1,-1(s1) + 438: 854a mv a0,s2 + 43a: f67ff0ef jal 3a0 + while(--i >= 0) + 43e: 14fd addi s1,s1,-1 + 440: ff349ae3 bne s1,s3,434 + 444: 74e2 ld s1,56(sp) + 446: 79a2 ld s3,40(sp) +} + 448: 60a6 ld ra,72(sp) + 44a: 6406 ld s0,64(sp) + 44c: 7942 ld s2,48(sp) + 44e: 6161 addi sp,sp,80 + 450: 8082 ret + x = -xx; + 452: 40b005b3 neg a1,a1 + neg = 1; + 456: 4885 li a7,1 + x = -xx; + 458: bfad j 3d2 + +000000000000045a : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 45a: 711d addi sp,sp,-96 + 45c: ec86 sd ra,88(sp) + 45e: e8a2 sd s0,80(sp) + 460: e0ca sd s2,64(sp) + 462: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 464: 0005c903 lbu s2,0(a1) + 468: 28090663 beqz s2,6f4 + 46c: e4a6 sd s1,72(sp) + 46e: fc4e sd s3,56(sp) + 470: f852 sd s4,48(sp) + 472: f456 sd s5,40(sp) + 474: f05a sd s6,32(sp) + 476: ec5e sd s7,24(sp) + 478: e862 sd s8,16(sp) + 47a: e466 sd s9,8(sp) + 47c: 8b2a mv s6,a0 + 47e: 8a2e mv s4,a1 + 480: 8bb2 mv s7,a2 + state = 0; + 482: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 484: 4481 li s1,0 + 486: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 488: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 48c: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 490: 06c00c93 li s9,108 + 494: a005 j 4b4 + putc(fd, c0); + 496: 85ca mv a1,s2 + 498: 855a mv a0,s6 + 49a: f07ff0ef jal 3a0 + 49e: a019 j 4a4 + } else if(state == '%'){ + 4a0: 03598263 beq s3,s5,4c4 + for(i = 0; fmt[i]; i++){ + 4a4: 2485 addiw s1,s1,1 + 4a6: 8726 mv a4,s1 + 4a8: 009a07b3 add a5,s4,s1 + 4ac: 0007c903 lbu s2,0(a5) + 4b0: 22090a63 beqz s2,6e4 + c0 = fmt[i] & 0xff; + 4b4: 0009079b sext.w a5,s2 + if(state == 0){ + 4b8: fe0994e3 bnez s3,4a0 + if(c0 == '%'){ + 4bc: fd579de3 bne a5,s5,496 + state = '%'; + 4c0: 89be mv s3,a5 + 4c2: b7cd j 4a4 + if(c0) c1 = fmt[i+1] & 0xff; + 4c4: 00ea06b3 add a3,s4,a4 + 4c8: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4cc: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4ce: c681 beqz a3,4d6 + 4d0: 9752 add a4,a4,s4 + 4d2: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4d6: 05878363 beq a5,s8,51c + } else if(c0 == 'l' && c1 == 'd'){ + 4da: 05978d63 beq a5,s9,534 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4de: 07500713 li a4,117 + 4e2: 0ee78763 beq a5,a4,5d0 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4e6: 07800713 li a4,120 + 4ea: 12e78963 beq a5,a4,61c + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4ee: 07000713 li a4,112 + 4f2: 14e78e63 beq a5,a4,64e + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4f6: 06300713 li a4,99 + 4fa: 18e78e63 beq a5,a4,696 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4fe: 07300713 li a4,115 + 502: 1ae78463 beq a5,a4,6aa + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 506: 02500713 li a4,37 + 50a: 04e79563 bne a5,a4,554 + putc(fd, '%'); + 50e: 02500593 li a1,37 + 512: 855a mv a0,s6 + 514: e8dff0ef jal 3a0 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 518: 4981 li s3,0 + 51a: b769 j 4a4 + printint(fd, va_arg(ap, int), 10, 1); + 51c: 008b8913 addi s2,s7,8 + 520: 4685 li a3,1 + 522: 4629 li a2,10 + 524: 000ba583 lw a1,0(s7) + 528: 855a mv a0,s6 + 52a: e95ff0ef jal 3be + 52e: 8bca mv s7,s2 + state = 0; + 530: 4981 li s3,0 + 532: bf8d j 4a4 + } else if(c0 == 'l' && c1 == 'd'){ + 534: 06400793 li a5,100 + 538: 02f68963 beq a3,a5,56a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 53c: 06c00793 li a5,108 + 540: 04f68263 beq a3,a5,584 + } else if(c0 == 'l' && c1 == 'u'){ + 544: 07500793 li a5,117 + 548: 0af68063 beq a3,a5,5e8 + } else if(c0 == 'l' && c1 == 'x'){ + 54c: 07800793 li a5,120 + 550: 0ef68263 beq a3,a5,634 + putc(fd, '%'); + 554: 02500593 li a1,37 + 558: 855a mv a0,s6 + 55a: e47ff0ef jal 3a0 + putc(fd, c0); + 55e: 85ca mv a1,s2 + 560: 855a mv a0,s6 + 562: e3fff0ef jal 3a0 + state = 0; + 566: 4981 li s3,0 + 568: bf35 j 4a4 + printint(fd, va_arg(ap, uint64), 10, 1); + 56a: 008b8913 addi s2,s7,8 + 56e: 4685 li a3,1 + 570: 4629 li a2,10 + 572: 000bb583 ld a1,0(s7) + 576: 855a mv a0,s6 + 578: e47ff0ef jal 3be + i += 1; + 57c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 57e: 8bca mv s7,s2 + state = 0; + 580: 4981 li s3,0 + i += 1; + 582: b70d j 4a4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 584: 06400793 li a5,100 + 588: 02f60763 beq a2,a5,5b6 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 58c: 07500793 li a5,117 + 590: 06f60963 beq a2,a5,602 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 594: 07800793 li a5,120 + 598: faf61ee3 bne a2,a5,554 + printint(fd, va_arg(ap, uint64), 16, 0); + 59c: 008b8913 addi s2,s7,8 + 5a0: 4681 li a3,0 + 5a2: 4641 li a2,16 + 5a4: 000bb583 ld a1,0(s7) + 5a8: 855a mv a0,s6 + 5aa: e15ff0ef jal 3be + i += 2; + 5ae: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5b0: 8bca mv s7,s2 + state = 0; + 5b2: 4981 li s3,0 + i += 2; + 5b4: bdc5 j 4a4 + printint(fd, va_arg(ap, uint64), 10, 1); + 5b6: 008b8913 addi s2,s7,8 + 5ba: 4685 li a3,1 + 5bc: 4629 li a2,10 + 5be: 000bb583 ld a1,0(s7) + 5c2: 855a mv a0,s6 + 5c4: dfbff0ef jal 3be + i += 2; + 5c8: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5ca: 8bca mv s7,s2 + state = 0; + 5cc: 4981 li s3,0 + i += 2; + 5ce: bdd9 j 4a4 + printint(fd, va_arg(ap, uint32), 10, 0); + 5d0: 008b8913 addi s2,s7,8 + 5d4: 4681 li a3,0 + 5d6: 4629 li a2,10 + 5d8: 000be583 lwu a1,0(s7) + 5dc: 855a mv a0,s6 + 5de: de1ff0ef jal 3be + 5e2: 8bca mv s7,s2 + state = 0; + 5e4: 4981 li s3,0 + 5e6: bd7d j 4a4 + printint(fd, va_arg(ap, uint64), 10, 0); + 5e8: 008b8913 addi s2,s7,8 + 5ec: 4681 li a3,0 + 5ee: 4629 li a2,10 + 5f0: 000bb583 ld a1,0(s7) + 5f4: 855a mv a0,s6 + 5f6: dc9ff0ef jal 3be + i += 1; + 5fa: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5fc: 8bca mv s7,s2 + state = 0; + 5fe: 4981 li s3,0 + i += 1; + 600: b555 j 4a4 + printint(fd, va_arg(ap, uint64), 10, 0); + 602: 008b8913 addi s2,s7,8 + 606: 4681 li a3,0 + 608: 4629 li a2,10 + 60a: 000bb583 ld a1,0(s7) + 60e: 855a mv a0,s6 + 610: dafff0ef jal 3be + i += 2; + 614: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 616: 8bca mv s7,s2 + state = 0; + 618: 4981 li s3,0 + i += 2; + 61a: b569 j 4a4 + printint(fd, va_arg(ap, uint32), 16, 0); + 61c: 008b8913 addi s2,s7,8 + 620: 4681 li a3,0 + 622: 4641 li a2,16 + 624: 000be583 lwu a1,0(s7) + 628: 855a mv a0,s6 + 62a: d95ff0ef jal 3be + 62e: 8bca mv s7,s2 + state = 0; + 630: 4981 li s3,0 + 632: bd8d j 4a4 + printint(fd, va_arg(ap, uint64), 16, 0); + 634: 008b8913 addi s2,s7,8 + 638: 4681 li a3,0 + 63a: 4641 li a2,16 + 63c: 000bb583 ld a1,0(s7) + 640: 855a mv a0,s6 + 642: d7dff0ef jal 3be + i += 1; + 646: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 648: 8bca mv s7,s2 + state = 0; + 64a: 4981 li s3,0 + i += 1; + 64c: bda1 j 4a4 + 64e: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 650: 008b8d13 addi s10,s7,8 + 654: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 658: 03000593 li a1,48 + 65c: 855a mv a0,s6 + 65e: d43ff0ef jal 3a0 + putc(fd, 'x'); + 662: 07800593 li a1,120 + 666: 855a mv a0,s6 + 668: d39ff0ef jal 3a0 + 66c: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 66e: 00000b97 auipc s7,0x0 + 672: 292b8b93 addi s7,s7,658 # 900 + 676: 03c9d793 srli a5,s3,0x3c + 67a: 97de add a5,a5,s7 + 67c: 0007c583 lbu a1,0(a5) + 680: 855a mv a0,s6 + 682: d1fff0ef jal 3a0 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 686: 0992 slli s3,s3,0x4 + 688: 397d addiw s2,s2,-1 + 68a: fe0916e3 bnez s2,676 + printptr(fd, va_arg(ap, uint64)); + 68e: 8bea mv s7,s10 + state = 0; + 690: 4981 li s3,0 + 692: 6d02 ld s10,0(sp) + 694: bd01 j 4a4 + putc(fd, va_arg(ap, uint32)); + 696: 008b8913 addi s2,s7,8 + 69a: 000bc583 lbu a1,0(s7) + 69e: 855a mv a0,s6 + 6a0: d01ff0ef jal 3a0 + 6a4: 8bca mv s7,s2 + state = 0; + 6a6: 4981 li s3,0 + 6a8: bbf5 j 4a4 + if((s = va_arg(ap, char*)) == 0) + 6aa: 008b8993 addi s3,s7,8 + 6ae: 000bb903 ld s2,0(s7) + 6b2: 00090f63 beqz s2,6d0 + for(; *s; s++) + 6b6: 00094583 lbu a1,0(s2) + 6ba: c195 beqz a1,6de + putc(fd, *s); + 6bc: 855a mv a0,s6 + 6be: ce3ff0ef jal 3a0 + for(; *s; s++) + 6c2: 0905 addi s2,s2,1 + 6c4: 00094583 lbu a1,0(s2) + 6c8: f9f5 bnez a1,6bc + if((s = va_arg(ap, char*)) == 0) + 6ca: 8bce mv s7,s3 + state = 0; + 6cc: 4981 li s3,0 + 6ce: bbd9 j 4a4 + s = "(null)"; + 6d0: 00000917 auipc s2,0x0 + 6d4: 22890913 addi s2,s2,552 # 8f8 + for(; *s; s++) + 6d8: 02800593 li a1,40 + 6dc: b7c5 j 6bc + if((s = va_arg(ap, char*)) == 0) + 6de: 8bce mv s7,s3 + state = 0; + 6e0: 4981 li s3,0 + 6e2: b3c9 j 4a4 + 6e4: 64a6 ld s1,72(sp) + 6e6: 79e2 ld s3,56(sp) + 6e8: 7a42 ld s4,48(sp) + 6ea: 7aa2 ld s5,40(sp) + 6ec: 7b02 ld s6,32(sp) + 6ee: 6be2 ld s7,24(sp) + 6f0: 6c42 ld s8,16(sp) + 6f2: 6ca2 ld s9,8(sp) + } + } +} + 6f4: 60e6 ld ra,88(sp) + 6f6: 6446 ld s0,80(sp) + 6f8: 6906 ld s2,64(sp) + 6fa: 6125 addi sp,sp,96 + 6fc: 8082 ret + +00000000000006fe : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6fe: 715d addi sp,sp,-80 + 700: ec06 sd ra,24(sp) + 702: e822 sd s0,16(sp) + 704: 1000 addi s0,sp,32 + 706: e010 sd a2,0(s0) + 708: e414 sd a3,8(s0) + 70a: e818 sd a4,16(s0) + 70c: ec1c sd a5,24(s0) + 70e: 03043023 sd a6,32(s0) + 712: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 716: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 71a: 8622 mv a2,s0 + 71c: d3fff0ef jal 45a +} + 720: 60e2 ld ra,24(sp) + 722: 6442 ld s0,16(sp) + 724: 6161 addi sp,sp,80 + 726: 8082 ret + +0000000000000728 : + +void +printf(const char *fmt, ...) +{ + 728: 711d addi sp,sp,-96 + 72a: ec06 sd ra,24(sp) + 72c: e822 sd s0,16(sp) + 72e: 1000 addi s0,sp,32 + 730: e40c sd a1,8(s0) + 732: e810 sd a2,16(s0) + 734: ec14 sd a3,24(s0) + 736: f018 sd a4,32(s0) + 738: f41c sd a5,40(s0) + 73a: 03043823 sd a6,48(s0) + 73e: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 742: 00840613 addi a2,s0,8 + 746: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 74a: 85aa mv a1,a0 + 74c: 4505 li a0,1 + 74e: d0dff0ef jal 45a +} + 752: 60e2 ld ra,24(sp) + 754: 6442 ld s0,16(sp) + 756: 6125 addi sp,sp,96 + 758: 8082 ret + +000000000000075a : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 75a: 1141 addi sp,sp,-16 + 75c: e422 sd s0,8(sp) + 75e: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 760: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 764: 00001797 auipc a5,0x1 + 768: 89c7b783 ld a5,-1892(a5) # 1000 + 76c: a02d j 796 + 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; + 76e: 4618 lw a4,8(a2) + 770: 9f2d addw a4,a4,a1 + 772: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 776: 6398 ld a4,0(a5) + 778: 6310 ld a2,0(a4) + 77a: a83d j 7b8 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 77c: ff852703 lw a4,-8(a0) + 780: 9f31 addw a4,a4,a2 + 782: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 784: ff053683 ld a3,-16(a0) + 788: a091 j 7cc + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 78a: 6398 ld a4,0(a5) + 78c: 00e7e463 bltu a5,a4,794 + 790: 00e6ea63 bltu a3,a4,7a4 +{ + 794: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 796: fed7fae3 bgeu a5,a3,78a + 79a: 6398 ld a4,0(a5) + 79c: 00e6e463 bltu a3,a4,7a4 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7a0: fee7eae3 bltu a5,a4,794 + if(bp + bp->s.size == p->s.ptr){ + 7a4: ff852583 lw a1,-8(a0) + 7a8: 6390 ld a2,0(a5) + 7aa: 02059813 slli a6,a1,0x20 + 7ae: 01c85713 srli a4,a6,0x1c + 7b2: 9736 add a4,a4,a3 + 7b4: fae60de3 beq a2,a4,76e + bp->s.ptr = p->s.ptr->s.ptr; + 7b8: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7bc: 4790 lw a2,8(a5) + 7be: 02061593 slli a1,a2,0x20 + 7c2: 01c5d713 srli a4,a1,0x1c + 7c6: 973e add a4,a4,a5 + 7c8: fae68ae3 beq a3,a4,77c + p->s.ptr = bp->s.ptr; + 7cc: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7ce: 00001717 auipc a4,0x1 + 7d2: 82f73923 sd a5,-1998(a4) # 1000 +} + 7d6: 6422 ld s0,8(sp) + 7d8: 0141 addi sp,sp,16 + 7da: 8082 ret + +00000000000007dc : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7dc: 7139 addi sp,sp,-64 + 7de: fc06 sd ra,56(sp) + 7e0: f822 sd s0,48(sp) + 7e2: f426 sd s1,40(sp) + 7e4: ec4e sd s3,24(sp) + 7e6: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7e8: 02051493 slli s1,a0,0x20 + 7ec: 9081 srli s1,s1,0x20 + 7ee: 04bd addi s1,s1,15 + 7f0: 8091 srli s1,s1,0x4 + 7f2: 0014899b addiw s3,s1,1 + 7f6: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7f8: 00001517 auipc a0,0x1 + 7fc: 80853503 ld a0,-2040(a0) # 1000 + 800: c915 beqz a0,834 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 802: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 804: 4798 lw a4,8(a5) + 806: 08977a63 bgeu a4,s1,89a + 80a: f04a sd s2,32(sp) + 80c: e852 sd s4,16(sp) + 80e: e456 sd s5,8(sp) + 810: e05a sd s6,0(sp) + if(nu < 4096) + 812: 8a4e mv s4,s3 + 814: 0009871b sext.w a4,s3 + 818: 6685 lui a3,0x1 + 81a: 00d77363 bgeu a4,a3,820 + 81e: 6a05 lui s4,0x1 + 820: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 824: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 828: 00000917 auipc s2,0x0 + 82c: 7d890913 addi s2,s2,2008 # 1000 + if(p == SBRK_ERROR) + 830: 5afd li s5,-1 + 832: a081 j 872 + 834: f04a sd s2,32(sp) + 836: e852 sd s4,16(sp) + 838: e456 sd s5,8(sp) + 83a: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 83c: 00000797 auipc a5,0x0 + 840: 7d478793 addi a5,a5,2004 # 1010 + 844: 00000717 auipc a4,0x0 + 848: 7af73e23 sd a5,1980(a4) # 1000 + 84c: e39c sd a5,0(a5) + base.s.size = 0; + 84e: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 852: b7c1 j 812 + prevp->s.ptr = p->s.ptr; + 854: 6398 ld a4,0(a5) + 856: e118 sd a4,0(a0) + 858: a8a9 j 8b2 + hp->s.size = nu; + 85a: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 85e: 0541 addi a0,a0,16 + 860: efbff0ef jal 75a + return freep; + 864: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 868: c12d beqz a0,8ca + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 86a: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 86c: 4798 lw a4,8(a5) + 86e: 02977263 bgeu a4,s1,892 + if(p == freep) + 872: 00093703 ld a4,0(s2) + 876: 853e mv a0,a5 + 878: fef719e3 bne a4,a5,86a + p = sbrk(nu * sizeof(Header)); + 87c: 8552 mv a0,s4 + 87e: a37ff0ef jal 2b4 + if(p == SBRK_ERROR) + 882: fd551ce3 bne a0,s5,85a + return 0; + 886: 4501 li a0,0 + 888: 7902 ld s2,32(sp) + 88a: 6a42 ld s4,16(sp) + 88c: 6aa2 ld s5,8(sp) + 88e: 6b02 ld s6,0(sp) + 890: a03d j 8be + 892: 7902 ld s2,32(sp) + 894: 6a42 ld s4,16(sp) + 896: 6aa2 ld s5,8(sp) + 898: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 89a: fae48de3 beq s1,a4,854 + p->s.size -= nunits; + 89e: 4137073b subw a4,a4,s3 + 8a2: c798 sw a4,8(a5) + p += p->s.size; + 8a4: 02071693 slli a3,a4,0x20 + 8a8: 01c6d713 srli a4,a3,0x1c + 8ac: 97ba add a5,a5,a4 + p->s.size = nunits; + 8ae: 0137a423 sw s3,8(a5) + freep = prevp; + 8b2: 00000717 auipc a4,0x0 + 8b6: 74a73723 sd a0,1870(a4) # 1000 + return (void*)(p + 1); + 8ba: 01078513 addi a0,a5,16 + } +} + 8be: 70e2 ld ra,56(sp) + 8c0: 7442 ld s0,48(sp) + 8c2: 74a2 ld s1,40(sp) + 8c4: 69e2 ld s3,24(sp) + 8c6: 6121 addi sp,sp,64 + 8c8: 8082 ret + 8ca: 7902 ld s2,32(sp) + 8cc: 6a42 ld s4,16(sp) + 8ce: 6aa2 ld s5,8(sp) + 8d0: 6b02 ld s6,0(sp) + 8d2: b7f5 j 8be diff --git a/user/kill.c b/G12_Project1_xv6CustomizeSystemCalls/user/kill.c similarity index 100% rename from user/kill.c rename to G12_Project1_xv6CustomizeSystemCalls/user/kill.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/kill.d b/G12_Project1_xv6CustomizeSystemCalls/user/kill.d new file mode 100644 index 0000000000..e83f22f735 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/kill.d @@ -0,0 +1 @@ +user/kill.o: user/kill.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/kill.o b/G12_Project1_xv6CustomizeSystemCalls/user/kill.o new file mode 100644 index 0000000000..7f6e127642 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/kill.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/kill.sym b/G12_Project1_xv6CustomizeSystemCalls/user/kill.sym new file mode 100644 index 0000000000..497a8c157f --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/kill.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +00000000000008d8 .rodata +0000000000000918 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 kill.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003a0 putc +00000000000003be printint +0000000000000900 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000064 strcpy +0000000000000378 pause +0000000000000728 printf +0000000000000370 sys_sbrk +000000000000020e memmove +0000000000000330 mknod +000000000000011c gets +0000000000000368 getpid +00000000000002a0 memcpy +00000000000007dc malloc +00000000000002ca sbrklazy +00000000000002f8 pipe +0000000000000308 write +0000000000000340 fstat +00000000000006fe fprintf +0000000000000318 kill +000000000000045a vprintf +0000000000000358 chdir +0000000000000320 exec +00000000000002f0 wait +0000000000000388 getprocsinfo +0000000000000300 read +0000000000000338 unlink +0000000000000266 memcmp +00000000000002e0 fork +00000000000002b4 sbrk +0000000000000380 uptime +00000000000000d6 memset +0000000000000000 main +0000000000000390 getppid +0000000000000080 strcmp +0000000000000360 dup +000000000000018c stat +0000000000000398 sleep2 +0000000000000348 link +00000000000002e8 exit +0000000000000054 start +00000000000001c6 atoi +00000000000000ac strlen +0000000000000328 open +00000000000000f8 strchr +0000000000000350 mkdir +0000000000000310 close +000000000000075a free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ln.asm b/G12_Project1_xv6CustomizeSystemCalls/user/ln.asm new file mode 100644 index 0000000000..5b7e6a9cc6 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/ln.asm @@ -0,0 +1,1522 @@ + +user/_ln: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/stat.h" +#include "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: 1000 addi s0,sp,32 + if(argc != 3){ + 8: 478d li a5,3 + a: 00f50d63 beq a0,a5,24 + e: e426 sd s1,8(sp) + fprintf(2, "Usage: ln old new\n"); + 10: 00001597 auipc a1,0x1 + 14: 8c058593 addi a1,a1,-1856 # 8d0 + 18: 4509 li a0,2 + 1a: 6de000ef jal 6f8 + exit(1); + 1e: 4505 li a0,1 + 20: 2c2000ef jal 2e2 + 24: e426 sd s1,8(sp) + 26: 84ae mv s1,a1 + } + if(link(argv[1], argv[2]) < 0) + 28: 698c ld a1,16(a1) + 2a: 6488 ld a0,8(s1) + 2c: 316000ef jal 342 + 30: 00054563 bltz a0,3a + fprintf(2, "link %s %s: failed\n", argv[1], argv[2]); + exit(0); + 34: 4501 li a0,0 + 36: 2ac000ef jal 2e2 + fprintf(2, "link %s %s: failed\n", argv[1], argv[2]); + 3a: 6894 ld a3,16(s1) + 3c: 6490 ld a2,8(s1) + 3e: 00001597 auipc a1,0x1 + 42: 8aa58593 addi a1,a1,-1878 # 8e8 + 46: 4509 li a0,2 + 48: 6b0000ef jal 6f8 + 4c: b7e5 j 34 + +000000000000004e : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 4e: 1141 addi sp,sp,-16 + 50: e406 sd ra,8(sp) + 52: e022 sd s0,0(sp) + 54: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 56: fabff0ef jal 0
+ exit(r); + 5a: 288000ef jal 2e2 + +000000000000005e : +} + +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 + ; + return os; +} + 74: 6422 ld s0,8(sp) + 76: 0141 addi sp,sp,16 + 78: 8082 ret + +000000000000007a : + +int +strcmp(const char *p, const char *q) +{ + 7a: 1141 addi sp,sp,-16 + 7c: e422 sd s0,8(sp) + 7e: 0800 addi s0,sp,16 + while(*p && *p == *q) + 80: 00054783 lbu a5,0(a0) + 84: cb91 beqz a5,98 + 86: 0005c703 lbu a4,0(a1) + 8a: 00f71763 bne a4,a5,98 + p++, q++; + 8e: 0505 addi a0,a0,1 + 90: 0585 addi a1,a1,1 + while(*p && *p == *q) + 92: 00054783 lbu a5,0(a0) + 96: fbe5 bnez a5,86 + return (uchar)*p - (uchar)*q; + 98: 0005c503 lbu a0,0(a1) +} + 9c: 40a7853b subw a0,a5,a0 + a0: 6422 ld s0,8(sp) + a2: 0141 addi sp,sp,16 + a4: 8082 ret + +00000000000000a6 : + +uint +strlen(const char *s) +{ + a6: 1141 addi sp,sp,-16 + a8: e422 sd s0,8(sp) + aa: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + ac: 00054783 lbu a5,0(a0) + b0: cf91 beqz a5,cc + b2: 0505 addi a0,a0,1 + b4: 87aa mv a5,a0 + b6: 86be mv a3,a5 + b8: 0785 addi a5,a5,1 + ba: fff7c703 lbu a4,-1(a5) + be: ff65 bnez a4,b6 + c0: 40a6853b subw a0,a3,a0 + c4: 2505 addiw a0,a0,1 + ; + return n; +} + c6: 6422 ld s0,8(sp) + c8: 0141 addi sp,sp,16 + ca: 8082 ret + for(n = 0; s[n]; n++) + cc: 4501 li a0,0 + ce: bfe5 j c6 + +00000000000000d0 : + +void* +memset(void *dst, int c, uint n) +{ + d0: 1141 addi sp,sp,-16 + d2: e422 sd s0,8(sp) + d4: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + d6: ca19 beqz a2,ec + d8: 87aa mv a5,a0 + da: 1602 slli a2,a2,0x20 + dc: 9201 srli a2,a2,0x20 + de: 00a60733 add a4,a2,a0 + cdst[i] = c; + e2: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + e6: 0785 addi a5,a5,1 + e8: fee79de3 bne a5,a4,e2 + } + return dst; +} + ec: 6422 ld s0,8(sp) + ee: 0141 addi sp,sp,16 + f0: 8082 ret + +00000000000000f2 : + +char* +strchr(const char *s, char c) +{ + f2: 1141 addi sp,sp,-16 + f4: e422 sd s0,8(sp) + f6: 0800 addi s0,sp,16 + for(; *s; s++) + f8: 00054783 lbu a5,0(a0) + fc: cb99 beqz a5,112 + if(*s == c) + fe: 00f58763 beq a1,a5,10c + for(; *s; s++) + 102: 0505 addi a0,a0,1 + 104: 00054783 lbu a5,0(a0) + 108: fbfd bnez a5,fe + return (char*)s; + return 0; + 10a: 4501 li a0,0 +} + 10c: 6422 ld s0,8(sp) + 10e: 0141 addi sp,sp,16 + 110: 8082 ret + return 0; + 112: 4501 li a0,0 + 114: bfe5 j 10c + +0000000000000116 : + +char* +gets(char *buf, int max) +{ + 116: 711d addi sp,sp,-96 + 118: ec86 sd ra,88(sp) + 11a: e8a2 sd s0,80(sp) + 11c: e4a6 sd s1,72(sp) + 11e: e0ca sd s2,64(sp) + 120: fc4e sd s3,56(sp) + 122: f852 sd s4,48(sp) + 124: f456 sd s5,40(sp) + 126: f05a sd s6,32(sp) + 128: ec5e sd s7,24(sp) + 12a: 1080 addi s0,sp,96 + 12c: 8baa mv s7,a0 + 12e: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 130: 892a mv s2,a0 + 132: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 134: 4aa9 li s5,10 + 136: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 138: 89a6 mv s3,s1 + 13a: 2485 addiw s1,s1,1 + 13c: 0344d663 bge s1,s4,168 + cc = read(0, &c, 1); + 140: 4605 li a2,1 + 142: faf40593 addi a1,s0,-81 + 146: 4501 li a0,0 + 148: 1b2000ef jal 2fa + if(cc < 1) + 14c: 00a05e63 blez a0,168 + buf[i++] = c; + 150: faf44783 lbu a5,-81(s0) + 154: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 158: 01578763 beq a5,s5,166 + 15c: 0905 addi s2,s2,1 + 15e: fd679de3 bne a5,s6,138 + buf[i++] = c; + 162: 89a6 mv s3,s1 + 164: a011 j 168 + 166: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 168: 99de add s3,s3,s7 + 16a: 00098023 sb zero,0(s3) + return buf; +} + 16e: 855e mv a0,s7 + 170: 60e6 ld ra,88(sp) + 172: 6446 ld s0,80(sp) + 174: 64a6 ld s1,72(sp) + 176: 6906 ld s2,64(sp) + 178: 79e2 ld s3,56(sp) + 17a: 7a42 ld s4,48(sp) + 17c: 7aa2 ld s5,40(sp) + 17e: 7b02 ld s6,32(sp) + 180: 6be2 ld s7,24(sp) + 182: 6125 addi sp,sp,96 + 184: 8082 ret + +0000000000000186 : + +int +stat(const char *n, struct stat *st) +{ + 186: 1101 addi sp,sp,-32 + 188: ec06 sd ra,24(sp) + 18a: e822 sd s0,16(sp) + 18c: e04a sd s2,0(sp) + 18e: 1000 addi s0,sp,32 + 190: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 192: 4581 li a1,0 + 194: 18e000ef jal 322 + if(fd < 0) + 198: 02054263 bltz a0,1bc + 19c: e426 sd s1,8(sp) + 19e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1a0: 85ca mv a1,s2 + 1a2: 198000ef jal 33a + 1a6: 892a mv s2,a0 + close(fd); + 1a8: 8526 mv a0,s1 + 1aa: 160000ef jal 30a + return r; + 1ae: 64a2 ld s1,8(sp) +} + 1b0: 854a mv a0,s2 + 1b2: 60e2 ld ra,24(sp) + 1b4: 6442 ld s0,16(sp) + 1b6: 6902 ld s2,0(sp) + 1b8: 6105 addi sp,sp,32 + 1ba: 8082 ret + return -1; + 1bc: 597d li s2,-1 + 1be: bfcd j 1b0 + +00000000000001c0 : + +int +atoi(const char *s) +{ + 1c0: 1141 addi sp,sp,-16 + 1c2: e422 sd s0,8(sp) + 1c4: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1c6: 00054683 lbu a3,0(a0) + 1ca: fd06879b addiw a5,a3,-48 + 1ce: 0ff7f793 zext.b a5,a5 + 1d2: 4625 li a2,9 + 1d4: 02f66863 bltu a2,a5,204 + 1d8: 872a mv a4,a0 + n = 0; + 1da: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1dc: 0705 addi a4,a4,1 + 1de: 0025179b slliw a5,a0,0x2 + 1e2: 9fa9 addw a5,a5,a0 + 1e4: 0017979b slliw a5,a5,0x1 + 1e8: 9fb5 addw a5,a5,a3 + 1ea: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1ee: 00074683 lbu a3,0(a4) + 1f2: fd06879b addiw a5,a3,-48 + 1f6: 0ff7f793 zext.b a5,a5 + 1fa: fef671e3 bgeu a2,a5,1dc + return n; +} + 1fe: 6422 ld s0,8(sp) + 200: 0141 addi sp,sp,16 + 202: 8082 ret + n = 0; + 204: 4501 li a0,0 + 206: bfe5 j 1fe + +0000000000000208 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 208: 1141 addi sp,sp,-16 + 20a: e422 sd s0,8(sp) + 20c: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 20e: 02b57463 bgeu a0,a1,236 + while(n-- > 0) + 212: 00c05f63 blez a2,230 + 216: 1602 slli a2,a2,0x20 + 218: 9201 srli a2,a2,0x20 + 21a: 00c507b3 add a5,a0,a2 + dst = vdst; + 21e: 872a mv a4,a0 + *dst++ = *src++; + 220: 0585 addi a1,a1,1 + 222: 0705 addi a4,a4,1 + 224: fff5c683 lbu a3,-1(a1) + 228: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 22c: fef71ae3 bne a4,a5,220 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 230: 6422 ld s0,8(sp) + 232: 0141 addi sp,sp,16 + 234: 8082 ret + dst += n; + 236: 00c50733 add a4,a0,a2 + src += n; + 23a: 95b2 add a1,a1,a2 + while(n-- > 0) + 23c: fec05ae3 blez a2,230 + 240: fff6079b addiw a5,a2,-1 + 244: 1782 slli a5,a5,0x20 + 246: 9381 srli a5,a5,0x20 + 248: fff7c793 not a5,a5 + 24c: 97ba add a5,a5,a4 + *--dst = *--src; + 24e: 15fd addi a1,a1,-1 + 250: 177d addi a4,a4,-1 + 252: 0005c683 lbu a3,0(a1) + 256: 00d70023 sb a3,0(a4) + while(n-- > 0) + 25a: fee79ae3 bne a5,a4,24e + 25e: bfc9 j 230 + +0000000000000260 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 260: 1141 addi sp,sp,-16 + 262: e422 sd s0,8(sp) + 264: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 266: ca05 beqz a2,296 + 268: fff6069b addiw a3,a2,-1 + 26c: 1682 slli a3,a3,0x20 + 26e: 9281 srli a3,a3,0x20 + 270: 0685 addi a3,a3,1 + 272: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 274: 00054783 lbu a5,0(a0) + 278: 0005c703 lbu a4,0(a1) + 27c: 00e79863 bne a5,a4,28c + return *p1 - *p2; + } + p1++; + 280: 0505 addi a0,a0,1 + p2++; + 282: 0585 addi a1,a1,1 + while (n-- > 0) { + 284: fed518e3 bne a0,a3,274 + } + return 0; + 288: 4501 li a0,0 + 28a: a019 j 290 + return *p1 - *p2; + 28c: 40e7853b subw a0,a5,a4 +} + 290: 6422 ld s0,8(sp) + 292: 0141 addi sp,sp,16 + 294: 8082 ret + return 0; + 296: 4501 li a0,0 + 298: bfe5 j 290 + +000000000000029a : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 29a: 1141 addi sp,sp,-16 + 29c: e406 sd ra,8(sp) + 29e: e022 sd s0,0(sp) + 2a0: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2a2: f67ff0ef jal 208 +} + 2a6: 60a2 ld ra,8(sp) + 2a8: 6402 ld s0,0(sp) + 2aa: 0141 addi sp,sp,16 + 2ac: 8082 ret + +00000000000002ae : + +char * +sbrk(int n) { + 2ae: 1141 addi sp,sp,-16 + 2b0: e406 sd ra,8(sp) + 2b2: e022 sd s0,0(sp) + 2b4: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2b6: 4585 li a1,1 + 2b8: 0b2000ef jal 36a +} + 2bc: 60a2 ld ra,8(sp) + 2be: 6402 ld s0,0(sp) + 2c0: 0141 addi sp,sp,16 + 2c2: 8082 ret + +00000000000002c4 : + +char * +sbrklazy(int n) { + 2c4: 1141 addi sp,sp,-16 + 2c6: e406 sd ra,8(sp) + 2c8: e022 sd s0,0(sp) + 2ca: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2cc: 4589 li a1,2 + 2ce: 09c000ef jal 36a +} + 2d2: 60a2 ld ra,8(sp) + 2d4: 6402 ld s0,0(sp) + 2d6: 0141 addi sp,sp,16 + 2d8: 8082 ret + +00000000000002da : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2da: 4885 li a7,1 + ecall + 2dc: 00000073 ecall + ret + 2e0: 8082 ret + +00000000000002e2 : +.global exit +exit: + li a7, SYS_exit + 2e2: 4889 li a7,2 + ecall + 2e4: 00000073 ecall + ret + 2e8: 8082 ret + +00000000000002ea : +.global wait +wait: + li a7, SYS_wait + 2ea: 488d li a7,3 + ecall + 2ec: 00000073 ecall + ret + 2f0: 8082 ret + +00000000000002f2 : +.global pipe +pipe: + li a7, SYS_pipe + 2f2: 4891 li a7,4 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa : +.global read +read: + li a7, SYS_read + 2fa: 4895 li a7,5 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 : +.global write +write: + li a7, SYS_write + 302: 48c1 li a7,16 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a : +.global close +close: + li a7, SYS_close + 30a: 48d5 li a7,21 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 : +.global kill +kill: + li a7, SYS_kill + 312: 4899 li a7,6 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a : +.global exec +exec: + li a7, SYS_exec + 31a: 489d li a7,7 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 : +.global open +open: + li a7, SYS_open + 322: 48bd li a7,15 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a : +.global mknod +mknod: + li a7, SYS_mknod + 32a: 48c5 li a7,17 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 : +.global unlink +unlink: + li a7, SYS_unlink + 332: 48c9 li a7,18 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a : +.global fstat +fstat: + li a7, SYS_fstat + 33a: 48a1 li a7,8 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 : +.global link +link: + li a7, SYS_link + 342: 48cd li a7,19 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a : +.global mkdir +mkdir: + li a7, SYS_mkdir + 34a: 48d1 li a7,20 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 : +.global chdir +chdir: + li a7, SYS_chdir + 352: 48a5 li a7,9 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a : +.global dup +dup: + li a7, SYS_dup + 35a: 48a9 li a7,10 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 : +.global getpid +getpid: + li a7, SYS_getpid + 362: 48ad li a7,11 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 36a: 48b1 li a7,12 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 : +.global pause +pause: + li a7, SYS_pause + 372: 48b5 li a7,13 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a : +.global uptime +uptime: + li a7, SYS_uptime + 37a: 48b9 li a7,14 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 382: 48d9 li a7,22 + ecall + 384: 00000073 ecall + ret + 388: 8082 ret + +000000000000038a : +.global getppid +getppid: + li a7, SYS_getppid + 38a: 48dd li a7,23 + ecall + 38c: 00000073 ecall + ret + 390: 8082 ret + +0000000000000392 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 392: 48e1 li a7,24 + ecall + 394: 00000073 ecall + ret + 398: 8082 ret + +000000000000039a : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 39a: 1101 addi sp,sp,-32 + 39c: ec06 sd ra,24(sp) + 39e: e822 sd s0,16(sp) + 3a0: 1000 addi s0,sp,32 + 3a2: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3a6: 4605 li a2,1 + 3a8: fef40593 addi a1,s0,-17 + 3ac: f57ff0ef jal 302 +} + 3b0: 60e2 ld ra,24(sp) + 3b2: 6442 ld s0,16(sp) + 3b4: 6105 addi sp,sp,32 + 3b6: 8082 ret + +00000000000003b8 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3b8: 715d addi sp,sp,-80 + 3ba: e486 sd ra,72(sp) + 3bc: e0a2 sd s0,64(sp) + 3be: f84a sd s2,48(sp) + 3c0: 0880 addi s0,sp,80 + 3c2: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3c4: c299 beqz a3,3ca + 3c6: 0805c363 bltz a1,44c + neg = 0; + 3ca: 4881 li a7,0 + 3cc: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3d0: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3d2: 00000517 auipc a0,0x0 + 3d6: 53650513 addi a0,a0,1334 # 908 + 3da: 883e mv a6,a5 + 3dc: 2785 addiw a5,a5,1 + 3de: 02c5f733 remu a4,a1,a2 + 3e2: 972a add a4,a4,a0 + 3e4: 00074703 lbu a4,0(a4) + 3e8: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3ec: 872e mv a4,a1 + 3ee: 02c5d5b3 divu a1,a1,a2 + 3f2: 0685 addi a3,a3,1 + 3f4: fec773e3 bgeu a4,a2,3da + if(neg) + 3f8: 00088b63 beqz a7,40e + buf[i++] = '-'; + 3fc: fd078793 addi a5,a5,-48 + 400: 97a2 add a5,a5,s0 + 402: 02d00713 li a4,45 + 406: fee78423 sb a4,-24(a5) + 40a: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 40e: 02f05a63 blez a5,442 + 412: fc26 sd s1,56(sp) + 414: f44e sd s3,40(sp) + 416: fb840713 addi a4,s0,-72 + 41a: 00f704b3 add s1,a4,a5 + 41e: fff70993 addi s3,a4,-1 + 422: 99be add s3,s3,a5 + 424: 37fd addiw a5,a5,-1 + 426: 1782 slli a5,a5,0x20 + 428: 9381 srli a5,a5,0x20 + 42a: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 42e: fff4c583 lbu a1,-1(s1) + 432: 854a mv a0,s2 + 434: f67ff0ef jal 39a + while(--i >= 0) + 438: 14fd addi s1,s1,-1 + 43a: ff349ae3 bne s1,s3,42e + 43e: 74e2 ld s1,56(sp) + 440: 79a2 ld s3,40(sp) +} + 442: 60a6 ld ra,72(sp) + 444: 6406 ld s0,64(sp) + 446: 7942 ld s2,48(sp) + 448: 6161 addi sp,sp,80 + 44a: 8082 ret + x = -xx; + 44c: 40b005b3 neg a1,a1 + neg = 1; + 450: 4885 li a7,1 + x = -xx; + 452: bfad j 3cc + +0000000000000454 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 454: 711d addi sp,sp,-96 + 456: ec86 sd ra,88(sp) + 458: e8a2 sd s0,80(sp) + 45a: e0ca sd s2,64(sp) + 45c: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 45e: 0005c903 lbu s2,0(a1) + 462: 28090663 beqz s2,6ee + 466: e4a6 sd s1,72(sp) + 468: fc4e sd s3,56(sp) + 46a: f852 sd s4,48(sp) + 46c: f456 sd s5,40(sp) + 46e: f05a sd s6,32(sp) + 470: ec5e sd s7,24(sp) + 472: e862 sd s8,16(sp) + 474: e466 sd s9,8(sp) + 476: 8b2a mv s6,a0 + 478: 8a2e mv s4,a1 + 47a: 8bb2 mv s7,a2 + state = 0; + 47c: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 47e: 4481 li s1,0 + 480: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 482: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 486: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 48a: 06c00c93 li s9,108 + 48e: a005 j 4ae + putc(fd, c0); + 490: 85ca mv a1,s2 + 492: 855a mv a0,s6 + 494: f07ff0ef jal 39a + 498: a019 j 49e + } else if(state == '%'){ + 49a: 03598263 beq s3,s5,4be + for(i = 0; fmt[i]; i++){ + 49e: 2485 addiw s1,s1,1 + 4a0: 8726 mv a4,s1 + 4a2: 009a07b3 add a5,s4,s1 + 4a6: 0007c903 lbu s2,0(a5) + 4aa: 22090a63 beqz s2,6de + c0 = fmt[i] & 0xff; + 4ae: 0009079b sext.w a5,s2 + if(state == 0){ + 4b2: fe0994e3 bnez s3,49a + if(c0 == '%'){ + 4b6: fd579de3 bne a5,s5,490 + state = '%'; + 4ba: 89be mv s3,a5 + 4bc: b7cd j 49e + if(c0) c1 = fmt[i+1] & 0xff; + 4be: 00ea06b3 add a3,s4,a4 + 4c2: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4c6: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4c8: c681 beqz a3,4d0 + 4ca: 9752 add a4,a4,s4 + 4cc: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4d0: 05878363 beq a5,s8,516 + } else if(c0 == 'l' && c1 == 'd'){ + 4d4: 05978d63 beq a5,s9,52e + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4d8: 07500713 li a4,117 + 4dc: 0ee78763 beq a5,a4,5ca + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4e0: 07800713 li a4,120 + 4e4: 12e78963 beq a5,a4,616 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4e8: 07000713 li a4,112 + 4ec: 14e78e63 beq a5,a4,648 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4f0: 06300713 li a4,99 + 4f4: 18e78e63 beq a5,a4,690 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4f8: 07300713 li a4,115 + 4fc: 1ae78463 beq a5,a4,6a4 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 500: 02500713 li a4,37 + 504: 04e79563 bne a5,a4,54e + putc(fd, '%'); + 508: 02500593 li a1,37 + 50c: 855a mv a0,s6 + 50e: e8dff0ef jal 39a + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 512: 4981 li s3,0 + 514: b769 j 49e + printint(fd, va_arg(ap, int), 10, 1); + 516: 008b8913 addi s2,s7,8 + 51a: 4685 li a3,1 + 51c: 4629 li a2,10 + 51e: 000ba583 lw a1,0(s7) + 522: 855a mv a0,s6 + 524: e95ff0ef jal 3b8 + 528: 8bca mv s7,s2 + state = 0; + 52a: 4981 li s3,0 + 52c: bf8d j 49e + } else if(c0 == 'l' && c1 == 'd'){ + 52e: 06400793 li a5,100 + 532: 02f68963 beq a3,a5,564 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 536: 06c00793 li a5,108 + 53a: 04f68263 beq a3,a5,57e + } else if(c0 == 'l' && c1 == 'u'){ + 53e: 07500793 li a5,117 + 542: 0af68063 beq a3,a5,5e2 + } else if(c0 == 'l' && c1 == 'x'){ + 546: 07800793 li a5,120 + 54a: 0ef68263 beq a3,a5,62e + putc(fd, '%'); + 54e: 02500593 li a1,37 + 552: 855a mv a0,s6 + 554: e47ff0ef jal 39a + putc(fd, c0); + 558: 85ca mv a1,s2 + 55a: 855a mv a0,s6 + 55c: e3fff0ef jal 39a + state = 0; + 560: 4981 li s3,0 + 562: bf35 j 49e + printint(fd, va_arg(ap, uint64), 10, 1); + 564: 008b8913 addi s2,s7,8 + 568: 4685 li a3,1 + 56a: 4629 li a2,10 + 56c: 000bb583 ld a1,0(s7) + 570: 855a mv a0,s6 + 572: e47ff0ef jal 3b8 + i += 1; + 576: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 578: 8bca mv s7,s2 + state = 0; + 57a: 4981 li s3,0 + i += 1; + 57c: b70d j 49e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 57e: 06400793 li a5,100 + 582: 02f60763 beq a2,a5,5b0 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 586: 07500793 li a5,117 + 58a: 06f60963 beq a2,a5,5fc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 58e: 07800793 li a5,120 + 592: faf61ee3 bne a2,a5,54e + printint(fd, va_arg(ap, uint64), 16, 0); + 596: 008b8913 addi s2,s7,8 + 59a: 4681 li a3,0 + 59c: 4641 li a2,16 + 59e: 000bb583 ld a1,0(s7) + 5a2: 855a mv a0,s6 + 5a4: e15ff0ef jal 3b8 + i += 2; + 5a8: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5aa: 8bca mv s7,s2 + state = 0; + 5ac: 4981 li s3,0 + i += 2; + 5ae: bdc5 j 49e + printint(fd, va_arg(ap, uint64), 10, 1); + 5b0: 008b8913 addi s2,s7,8 + 5b4: 4685 li a3,1 + 5b6: 4629 li a2,10 + 5b8: 000bb583 ld a1,0(s7) + 5bc: 855a mv a0,s6 + 5be: dfbff0ef jal 3b8 + i += 2; + 5c2: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5c4: 8bca mv s7,s2 + state = 0; + 5c6: 4981 li s3,0 + i += 2; + 5c8: bdd9 j 49e + printint(fd, va_arg(ap, uint32), 10, 0); + 5ca: 008b8913 addi s2,s7,8 + 5ce: 4681 li a3,0 + 5d0: 4629 li a2,10 + 5d2: 000be583 lwu a1,0(s7) + 5d6: 855a mv a0,s6 + 5d8: de1ff0ef jal 3b8 + 5dc: 8bca mv s7,s2 + state = 0; + 5de: 4981 li s3,0 + 5e0: bd7d j 49e + printint(fd, va_arg(ap, uint64), 10, 0); + 5e2: 008b8913 addi s2,s7,8 + 5e6: 4681 li a3,0 + 5e8: 4629 li a2,10 + 5ea: 000bb583 ld a1,0(s7) + 5ee: 855a mv a0,s6 + 5f0: dc9ff0ef jal 3b8 + i += 1; + 5f4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5f6: 8bca mv s7,s2 + state = 0; + 5f8: 4981 li s3,0 + i += 1; + 5fa: b555 j 49e + printint(fd, va_arg(ap, uint64), 10, 0); + 5fc: 008b8913 addi s2,s7,8 + 600: 4681 li a3,0 + 602: 4629 li a2,10 + 604: 000bb583 ld a1,0(s7) + 608: 855a mv a0,s6 + 60a: dafff0ef jal 3b8 + i += 2; + 60e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 610: 8bca mv s7,s2 + state = 0; + 612: 4981 li s3,0 + i += 2; + 614: b569 j 49e + printint(fd, va_arg(ap, uint32), 16, 0); + 616: 008b8913 addi s2,s7,8 + 61a: 4681 li a3,0 + 61c: 4641 li a2,16 + 61e: 000be583 lwu a1,0(s7) + 622: 855a mv a0,s6 + 624: d95ff0ef jal 3b8 + 628: 8bca mv s7,s2 + state = 0; + 62a: 4981 li s3,0 + 62c: bd8d j 49e + printint(fd, va_arg(ap, uint64), 16, 0); + 62e: 008b8913 addi s2,s7,8 + 632: 4681 li a3,0 + 634: 4641 li a2,16 + 636: 000bb583 ld a1,0(s7) + 63a: 855a mv a0,s6 + 63c: d7dff0ef jal 3b8 + i += 1; + 640: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 642: 8bca mv s7,s2 + state = 0; + 644: 4981 li s3,0 + i += 1; + 646: bda1 j 49e + 648: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 64a: 008b8d13 addi s10,s7,8 + 64e: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 652: 03000593 li a1,48 + 656: 855a mv a0,s6 + 658: d43ff0ef jal 39a + putc(fd, 'x'); + 65c: 07800593 li a1,120 + 660: 855a mv a0,s6 + 662: d39ff0ef jal 39a + 666: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 668: 00000b97 auipc s7,0x0 + 66c: 2a0b8b93 addi s7,s7,672 # 908 + 670: 03c9d793 srli a5,s3,0x3c + 674: 97de add a5,a5,s7 + 676: 0007c583 lbu a1,0(a5) + 67a: 855a mv a0,s6 + 67c: d1fff0ef jal 39a + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 680: 0992 slli s3,s3,0x4 + 682: 397d addiw s2,s2,-1 + 684: fe0916e3 bnez s2,670 + printptr(fd, va_arg(ap, uint64)); + 688: 8bea mv s7,s10 + state = 0; + 68a: 4981 li s3,0 + 68c: 6d02 ld s10,0(sp) + 68e: bd01 j 49e + putc(fd, va_arg(ap, uint32)); + 690: 008b8913 addi s2,s7,8 + 694: 000bc583 lbu a1,0(s7) + 698: 855a mv a0,s6 + 69a: d01ff0ef jal 39a + 69e: 8bca mv s7,s2 + state = 0; + 6a0: 4981 li s3,0 + 6a2: bbf5 j 49e + if((s = va_arg(ap, char*)) == 0) + 6a4: 008b8993 addi s3,s7,8 + 6a8: 000bb903 ld s2,0(s7) + 6ac: 00090f63 beqz s2,6ca + for(; *s; s++) + 6b0: 00094583 lbu a1,0(s2) + 6b4: c195 beqz a1,6d8 + putc(fd, *s); + 6b6: 855a mv a0,s6 + 6b8: ce3ff0ef jal 39a + for(; *s; s++) + 6bc: 0905 addi s2,s2,1 + 6be: 00094583 lbu a1,0(s2) + 6c2: f9f5 bnez a1,6b6 + if((s = va_arg(ap, char*)) == 0) + 6c4: 8bce mv s7,s3 + state = 0; + 6c6: 4981 li s3,0 + 6c8: bbd9 j 49e + s = "(null)"; + 6ca: 00000917 auipc s2,0x0 + 6ce: 23690913 addi s2,s2,566 # 900 + for(; *s; s++) + 6d2: 02800593 li a1,40 + 6d6: b7c5 j 6b6 + if((s = va_arg(ap, char*)) == 0) + 6d8: 8bce mv s7,s3 + state = 0; + 6da: 4981 li s3,0 + 6dc: b3c9 j 49e + 6de: 64a6 ld s1,72(sp) + 6e0: 79e2 ld s3,56(sp) + 6e2: 7a42 ld s4,48(sp) + 6e4: 7aa2 ld s5,40(sp) + 6e6: 7b02 ld s6,32(sp) + 6e8: 6be2 ld s7,24(sp) + 6ea: 6c42 ld s8,16(sp) + 6ec: 6ca2 ld s9,8(sp) + } + } +} + 6ee: 60e6 ld ra,88(sp) + 6f0: 6446 ld s0,80(sp) + 6f2: 6906 ld s2,64(sp) + 6f4: 6125 addi sp,sp,96 + 6f6: 8082 ret + +00000000000006f8 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6f8: 715d addi sp,sp,-80 + 6fa: ec06 sd ra,24(sp) + 6fc: e822 sd s0,16(sp) + 6fe: 1000 addi s0,sp,32 + 700: e010 sd a2,0(s0) + 702: e414 sd a3,8(s0) + 704: e818 sd a4,16(s0) + 706: ec1c sd a5,24(s0) + 708: 03043023 sd a6,32(s0) + 70c: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 710: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 714: 8622 mv a2,s0 + 716: d3fff0ef jal 454 +} + 71a: 60e2 ld ra,24(sp) + 71c: 6442 ld s0,16(sp) + 71e: 6161 addi sp,sp,80 + 720: 8082 ret + +0000000000000722 : + +void +printf(const char *fmt, ...) +{ + 722: 711d addi sp,sp,-96 + 724: ec06 sd ra,24(sp) + 726: e822 sd s0,16(sp) + 728: 1000 addi s0,sp,32 + 72a: e40c sd a1,8(s0) + 72c: e810 sd a2,16(s0) + 72e: ec14 sd a3,24(s0) + 730: f018 sd a4,32(s0) + 732: f41c sd a5,40(s0) + 734: 03043823 sd a6,48(s0) + 738: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 73c: 00840613 addi a2,s0,8 + 740: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 744: 85aa mv a1,a0 + 746: 4505 li a0,1 + 748: d0dff0ef jal 454 +} + 74c: 60e2 ld ra,24(sp) + 74e: 6442 ld s0,16(sp) + 750: 6125 addi sp,sp,96 + 752: 8082 ret + +0000000000000754 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 754: 1141 addi sp,sp,-16 + 756: e422 sd s0,8(sp) + 758: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 75a: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 75e: 00001797 auipc a5,0x1 + 762: 8a27b783 ld a5,-1886(a5) # 1000 + 766: a02d j 790 + 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; + 768: 4618 lw a4,8(a2) + 76a: 9f2d addw a4,a4,a1 + 76c: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 770: 6398 ld a4,0(a5) + 772: 6310 ld a2,0(a4) + 774: a83d j 7b2 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 776: ff852703 lw a4,-8(a0) + 77a: 9f31 addw a4,a4,a2 + 77c: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 77e: ff053683 ld a3,-16(a0) + 782: a091 j 7c6 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 784: 6398 ld a4,0(a5) + 786: 00e7e463 bltu a5,a4,78e + 78a: 00e6ea63 bltu a3,a4,79e +{ + 78e: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 790: fed7fae3 bgeu a5,a3,784 + 794: 6398 ld a4,0(a5) + 796: 00e6e463 bltu a3,a4,79e + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 79a: fee7eae3 bltu a5,a4,78e + if(bp + bp->s.size == p->s.ptr){ + 79e: ff852583 lw a1,-8(a0) + 7a2: 6390 ld a2,0(a5) + 7a4: 02059813 slli a6,a1,0x20 + 7a8: 01c85713 srli a4,a6,0x1c + 7ac: 9736 add a4,a4,a3 + 7ae: fae60de3 beq a2,a4,768 + bp->s.ptr = p->s.ptr->s.ptr; + 7b2: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7b6: 4790 lw a2,8(a5) + 7b8: 02061593 slli a1,a2,0x20 + 7bc: 01c5d713 srli a4,a1,0x1c + 7c0: 973e add a4,a4,a5 + 7c2: fae68ae3 beq a3,a4,776 + p->s.ptr = bp->s.ptr; + 7c6: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7c8: 00001717 auipc a4,0x1 + 7cc: 82f73c23 sd a5,-1992(a4) # 1000 +} + 7d0: 6422 ld s0,8(sp) + 7d2: 0141 addi sp,sp,16 + 7d4: 8082 ret + +00000000000007d6 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7d6: 7139 addi sp,sp,-64 + 7d8: fc06 sd ra,56(sp) + 7da: f822 sd s0,48(sp) + 7dc: f426 sd s1,40(sp) + 7de: ec4e sd s3,24(sp) + 7e0: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7e2: 02051493 slli s1,a0,0x20 + 7e6: 9081 srli s1,s1,0x20 + 7e8: 04bd addi s1,s1,15 + 7ea: 8091 srli s1,s1,0x4 + 7ec: 0014899b addiw s3,s1,1 + 7f0: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7f2: 00001517 auipc a0,0x1 + 7f6: 80e53503 ld a0,-2034(a0) # 1000 + 7fa: c915 beqz a0,82e + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7fc: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7fe: 4798 lw a4,8(a5) + 800: 08977a63 bgeu a4,s1,894 + 804: f04a sd s2,32(sp) + 806: e852 sd s4,16(sp) + 808: e456 sd s5,8(sp) + 80a: e05a sd s6,0(sp) + if(nu < 4096) + 80c: 8a4e mv s4,s3 + 80e: 0009871b sext.w a4,s3 + 812: 6685 lui a3,0x1 + 814: 00d77363 bgeu a4,a3,81a + 818: 6a05 lui s4,0x1 + 81a: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 81e: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 822: 00000917 auipc s2,0x0 + 826: 7de90913 addi s2,s2,2014 # 1000 + if(p == SBRK_ERROR) + 82a: 5afd li s5,-1 + 82c: a081 j 86c + 82e: f04a sd s2,32(sp) + 830: e852 sd s4,16(sp) + 832: e456 sd s5,8(sp) + 834: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 836: 00000797 auipc a5,0x0 + 83a: 7da78793 addi a5,a5,2010 # 1010 + 83e: 00000717 auipc a4,0x0 + 842: 7cf73123 sd a5,1986(a4) # 1000 + 846: e39c sd a5,0(a5) + base.s.size = 0; + 848: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 84c: b7c1 j 80c + prevp->s.ptr = p->s.ptr; + 84e: 6398 ld a4,0(a5) + 850: e118 sd a4,0(a0) + 852: a8a9 j 8ac + hp->s.size = nu; + 854: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 858: 0541 addi a0,a0,16 + 85a: efbff0ef jal 754 + return freep; + 85e: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 862: c12d beqz a0,8c4 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 864: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 866: 4798 lw a4,8(a5) + 868: 02977263 bgeu a4,s1,88c + if(p == freep) + 86c: 00093703 ld a4,0(s2) + 870: 853e mv a0,a5 + 872: fef719e3 bne a4,a5,864 + p = sbrk(nu * sizeof(Header)); + 876: 8552 mv a0,s4 + 878: a37ff0ef jal 2ae + if(p == SBRK_ERROR) + 87c: fd551ce3 bne a0,s5,854 + return 0; + 880: 4501 li a0,0 + 882: 7902 ld s2,32(sp) + 884: 6a42 ld s4,16(sp) + 886: 6aa2 ld s5,8(sp) + 888: 6b02 ld s6,0(sp) + 88a: a03d j 8b8 + 88c: 7902 ld s2,32(sp) + 88e: 6a42 ld s4,16(sp) + 890: 6aa2 ld s5,8(sp) + 892: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 894: fae48de3 beq s1,a4,84e + p->s.size -= nunits; + 898: 4137073b subw a4,a4,s3 + 89c: c798 sw a4,8(a5) + p += p->s.size; + 89e: 02071693 slli a3,a4,0x20 + 8a2: 01c6d713 srli a4,a3,0x1c + 8a6: 97ba add a5,a5,a4 + p->s.size = nunits; + 8a8: 0137a423 sw s3,8(a5) + freep = prevp; + 8ac: 00000717 auipc a4,0x0 + 8b0: 74a73a23 sd a0,1876(a4) # 1000 + return (void*)(p + 1); + 8b4: 01078513 addi a0,a5,16 + } +} + 8b8: 70e2 ld ra,56(sp) + 8ba: 7442 ld s0,48(sp) + 8bc: 74a2 ld s1,40(sp) + 8be: 69e2 ld s3,24(sp) + 8c0: 6121 addi sp,sp,64 + 8c2: 8082 ret + 8c4: 7902 ld s2,32(sp) + 8c6: 6a42 ld s4,16(sp) + 8c8: 6aa2 ld s5,8(sp) + 8ca: 6b02 ld s6,0(sp) + 8cc: b7f5 j 8b8 diff --git a/user/ln.c b/G12_Project1_xv6CustomizeSystemCalls/user/ln.c similarity index 100% rename from user/ln.c rename to G12_Project1_xv6CustomizeSystemCalls/user/ln.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ln.d b/G12_Project1_xv6CustomizeSystemCalls/user/ln.d new file mode 100644 index 0000000000..927138d33f --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/ln.d @@ -0,0 +1 @@ +user/ln.o: user/ln.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ln.o b/G12_Project1_xv6CustomizeSystemCalls/user/ln.o new file mode 100644 index 0000000000..df0a8330d6 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/ln.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ln.sym b/G12_Project1_xv6CustomizeSystemCalls/user/ln.sym new file mode 100644 index 0000000000..399460e49e --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/ln.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +00000000000008d0 .rodata +0000000000000920 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 ln.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000039a putc +00000000000003b8 printint +0000000000000908 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +000000000000005e strcpy +0000000000000372 pause +0000000000000722 printf +000000000000036a sys_sbrk +0000000000000208 memmove +000000000000032a mknod +0000000000000116 gets +0000000000000362 getpid +000000000000029a memcpy +00000000000007d6 malloc +00000000000002c4 sbrklazy +00000000000002f2 pipe +0000000000000302 write +000000000000033a fstat +00000000000006f8 fprintf +0000000000000312 kill +0000000000000454 vprintf +0000000000000352 chdir +000000000000031a exec +00000000000002ea wait +0000000000000382 getprocsinfo +00000000000002fa read +0000000000000332 unlink +0000000000000260 memcmp +00000000000002da fork +00000000000002ae sbrk +000000000000037a uptime +00000000000000d0 memset +0000000000000000 main +000000000000038a getppid +000000000000007a strcmp +000000000000035a dup +0000000000000186 stat +0000000000000392 sleep2 +0000000000000342 link +00000000000002e2 exit +000000000000004e start +00000000000001c0 atoi +00000000000000a6 strlen +0000000000000322 open +00000000000000f2 strchr +000000000000034a mkdir +000000000000030a close +0000000000000754 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/logstress.asm b/G12_Project1_xv6CustomizeSystemCalls/user/logstress.asm new file mode 100644 index 0000000000..0c9c68fbc4 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/logstress.asm @@ -0,0 +1,1608 @@ + +user/_logstress: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +main(int argc, char **argv) +{ + int fd, n; + enum { N = 250, SZ=2000 }; + + for (int i = 1; i < argc; i++){ + 0: 4785 li a5,1 + 2: 0ea7df63 bge a5,a0,100 +{ + 6: 7139 addi sp,sp,-64 + 8: fc06 sd ra,56(sp) + a: f822 sd s0,48(sp) + c: f426 sd s1,40(sp) + e: f04a sd s2,32(sp) + 10: ec4e sd s3,24(sp) + 12: 0080 addi s0,sp,64 + 14: 892a mv s2,a0 + 16: 89ae mv s3,a1 + for (int i = 1; i < argc; i++){ + 18: 4485 li s1,1 + 1a: a011 j 1e + 1c: 84be mv s1,a5 + int pid1 = fork(); + 1e: 372000ef jal 390 + if(pid1 < 0){ + 22: 00054963 bltz a0,34 + printf("%s: fork failed\n", argv[0]); + exit(1); + } + if(pid1 == 0) { + 26: c11d beqz a0,4c + for (int i = 1; i < argc; i++){ + 28: 0014879b addiw a5,s1,1 + 2c: fef918e3 bne s2,a5,1c + } + exit(0); + } + } + int xstatus; + for(int i = 1; i < argc; i++){ + 30: 4905 li s2,1 + 32: a04d j d4 + 34: e852 sd s4,16(sp) + printf("%s: fork failed\n", argv[0]); + 36: 0009b583 ld a1,0(s3) + 3a: 00001517 auipc a0,0x1 + 3e: 95650513 addi a0,a0,-1706 # 990 + 42: 796000ef jal 7d8 + exit(1); + 46: 4505 li a0,1 + 48: 350000ef jal 398 + 4c: e852 sd s4,16(sp) + fd = open(argv[i], O_CREATE | O_RDWR); + 4e: 00349a13 slli s4,s1,0x3 + 52: 9a4e add s4,s4,s3 + 54: 20200593 li a1,514 + 58: 000a3503 ld a0,0(s4) + 5c: 37c000ef jal 3d8 + 60: 892a mv s2,a0 + if(fd < 0){ + 62: 04054163 bltz a0,a4 + memset(buf, '0'+i, SZ); + 66: 7d000613 li a2,2000 + 6a: 0304859b addiw a1,s1,48 + 6e: 00001517 auipc a0,0x1 + 72: fa250513 addi a0,a0,-94 # 1010 + 76: 110000ef jal 186 + 7a: 0fa00493 li s1,250 + if((n = write(fd, buf, SZ)) != SZ){ + 7e: 00001997 auipc s3,0x1 + 82: f9298993 addi s3,s3,-110 # 1010 + 86: 7d000613 li a2,2000 + 8a: 85ce mv a1,s3 + 8c: 854a mv a0,s2 + 8e: 32a000ef jal 3b8 + 92: 7d000793 li a5,2000 + 96: 02f51463 bne a0,a5,be + for(i = 0; i < N; i++){ + 9a: 34fd addiw s1,s1,-1 + 9c: f4ed bnez s1,86 + exit(0); + 9e: 4501 li a0,0 + a0: 2f8000ef jal 398 + printf("%s: create %s failed\n", argv[0], argv[i]); + a4: 000a3603 ld a2,0(s4) + a8: 0009b583 ld a1,0(s3) + ac: 00001517 auipc a0,0x1 + b0: 8fc50513 addi a0,a0,-1796 # 9a8 + b4: 724000ef jal 7d8 + exit(1); + b8: 4505 li a0,1 + ba: 2de000ef jal 398 + printf("write failed %d\n", n); + be: 85aa mv a1,a0 + c0: 00001517 auipc a0,0x1 + c4: 90050513 addi a0,a0,-1792 # 9c0 + c8: 710000ef jal 7d8 + exit(1); + cc: 4505 li a0,1 + ce: 2ca000ef jal 398 + d2: 893e mv s2,a5 + wait(&xstatus); + d4: fcc40513 addi a0,s0,-52 + d8: 2c8000ef jal 3a0 + if(xstatus != 0) + dc: fcc42503 lw a0,-52(s0) + e0: ed09 bnez a0,fa + for(int i = 1; i < argc; i++){ + e2: 0019079b addiw a5,s2,1 + e6: ff2496e3 bne s1,s2,d2 + exit(xstatus); + } + return 0; +} + ea: 4501 li a0,0 + ec: 70e2 ld ra,56(sp) + ee: 7442 ld s0,48(sp) + f0: 74a2 ld s1,40(sp) + f2: 7902 ld s2,32(sp) + f4: 69e2 ld s3,24(sp) + f6: 6121 addi sp,sp,64 + f8: 8082 ret + fa: e852 sd s4,16(sp) + exit(xstatus); + fc: 29c000ef jal 398 +} + 100: 4501 li a0,0 + 102: 8082 ret + +0000000000000104 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 104: 1141 addi sp,sp,-16 + 106: e406 sd ra,8(sp) + 108: e022 sd s0,0(sp) + 10a: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 10c: ef5ff0ef jal 0
+ exit(r); + 110: 288000ef jal 398 + +0000000000000114 : +} + +char* +strcpy(char *s, const char *t) +{ + 114: 1141 addi sp,sp,-16 + 116: e422 sd s0,8(sp) + 118: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 11a: 87aa mv a5,a0 + 11c: 0585 addi a1,a1,1 + 11e: 0785 addi a5,a5,1 + 120: fff5c703 lbu a4,-1(a1) + 124: fee78fa3 sb a4,-1(a5) + 128: fb75 bnez a4,11c + ; + return os; +} + 12a: 6422 ld s0,8(sp) + 12c: 0141 addi sp,sp,16 + 12e: 8082 ret + +0000000000000130 : + +int +strcmp(const char *p, const char *q) +{ + 130: 1141 addi sp,sp,-16 + 132: e422 sd s0,8(sp) + 134: 0800 addi s0,sp,16 + while(*p && *p == *q) + 136: 00054783 lbu a5,0(a0) + 13a: cb91 beqz a5,14e + 13c: 0005c703 lbu a4,0(a1) + 140: 00f71763 bne a4,a5,14e + p++, q++; + 144: 0505 addi a0,a0,1 + 146: 0585 addi a1,a1,1 + while(*p && *p == *q) + 148: 00054783 lbu a5,0(a0) + 14c: fbe5 bnez a5,13c + return (uchar)*p - (uchar)*q; + 14e: 0005c503 lbu a0,0(a1) +} + 152: 40a7853b subw a0,a5,a0 + 156: 6422 ld s0,8(sp) + 158: 0141 addi sp,sp,16 + 15a: 8082 ret + +000000000000015c : + +uint +strlen(const char *s) +{ + 15c: 1141 addi sp,sp,-16 + 15e: e422 sd s0,8(sp) + 160: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 162: 00054783 lbu a5,0(a0) + 166: cf91 beqz a5,182 + 168: 0505 addi a0,a0,1 + 16a: 87aa mv a5,a0 + 16c: 86be mv a3,a5 + 16e: 0785 addi a5,a5,1 + 170: fff7c703 lbu a4,-1(a5) + 174: ff65 bnez a4,16c + 176: 40a6853b subw a0,a3,a0 + 17a: 2505 addiw a0,a0,1 + ; + return n; +} + 17c: 6422 ld s0,8(sp) + 17e: 0141 addi sp,sp,16 + 180: 8082 ret + for(n = 0; s[n]; n++) + 182: 4501 li a0,0 + 184: bfe5 j 17c + +0000000000000186 : + +void* +memset(void *dst, int c, uint n) +{ + 186: 1141 addi sp,sp,-16 + 188: e422 sd s0,8(sp) + 18a: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 18c: ca19 beqz a2,1a2 + 18e: 87aa mv a5,a0 + 190: 1602 slli a2,a2,0x20 + 192: 9201 srli a2,a2,0x20 + 194: 00a60733 add a4,a2,a0 + cdst[i] = c; + 198: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 19c: 0785 addi a5,a5,1 + 19e: fee79de3 bne a5,a4,198 + } + return dst; +} + 1a2: 6422 ld s0,8(sp) + 1a4: 0141 addi sp,sp,16 + 1a6: 8082 ret + +00000000000001a8 : + +char* +strchr(const char *s, char c) +{ + 1a8: 1141 addi sp,sp,-16 + 1aa: e422 sd s0,8(sp) + 1ac: 0800 addi s0,sp,16 + for(; *s; s++) + 1ae: 00054783 lbu a5,0(a0) + 1b2: cb99 beqz a5,1c8 + if(*s == c) + 1b4: 00f58763 beq a1,a5,1c2 + for(; *s; s++) + 1b8: 0505 addi a0,a0,1 + 1ba: 00054783 lbu a5,0(a0) + 1be: fbfd bnez a5,1b4 + return (char*)s; + return 0; + 1c0: 4501 li a0,0 +} + 1c2: 6422 ld s0,8(sp) + 1c4: 0141 addi sp,sp,16 + 1c6: 8082 ret + return 0; + 1c8: 4501 li a0,0 + 1ca: bfe5 j 1c2 + +00000000000001cc : + +char* +gets(char *buf, int max) +{ + 1cc: 711d addi sp,sp,-96 + 1ce: ec86 sd ra,88(sp) + 1d0: e8a2 sd s0,80(sp) + 1d2: e4a6 sd s1,72(sp) + 1d4: e0ca sd s2,64(sp) + 1d6: fc4e sd s3,56(sp) + 1d8: f852 sd s4,48(sp) + 1da: f456 sd s5,40(sp) + 1dc: f05a sd s6,32(sp) + 1de: ec5e sd s7,24(sp) + 1e0: 1080 addi s0,sp,96 + 1e2: 8baa mv s7,a0 + 1e4: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1e6: 892a mv s2,a0 + 1e8: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1ea: 4aa9 li s5,10 + 1ec: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1ee: 89a6 mv s3,s1 + 1f0: 2485 addiw s1,s1,1 + 1f2: 0344d663 bge s1,s4,21e + cc = read(0, &c, 1); + 1f6: 4605 li a2,1 + 1f8: faf40593 addi a1,s0,-81 + 1fc: 4501 li a0,0 + 1fe: 1b2000ef jal 3b0 + if(cc < 1) + 202: 00a05e63 blez a0,21e + buf[i++] = c; + 206: faf44783 lbu a5,-81(s0) + 20a: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 20e: 01578763 beq a5,s5,21c + 212: 0905 addi s2,s2,1 + 214: fd679de3 bne a5,s6,1ee + buf[i++] = c; + 218: 89a6 mv s3,s1 + 21a: a011 j 21e + 21c: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 21e: 99de add s3,s3,s7 + 220: 00098023 sb zero,0(s3) + return buf; +} + 224: 855e mv a0,s7 + 226: 60e6 ld ra,88(sp) + 228: 6446 ld s0,80(sp) + 22a: 64a6 ld s1,72(sp) + 22c: 6906 ld s2,64(sp) + 22e: 79e2 ld s3,56(sp) + 230: 7a42 ld s4,48(sp) + 232: 7aa2 ld s5,40(sp) + 234: 7b02 ld s6,32(sp) + 236: 6be2 ld s7,24(sp) + 238: 6125 addi sp,sp,96 + 23a: 8082 ret + +000000000000023c : + +int +stat(const char *n, struct stat *st) +{ + 23c: 1101 addi sp,sp,-32 + 23e: ec06 sd ra,24(sp) + 240: e822 sd s0,16(sp) + 242: e04a sd s2,0(sp) + 244: 1000 addi s0,sp,32 + 246: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 248: 4581 li a1,0 + 24a: 18e000ef jal 3d8 + if(fd < 0) + 24e: 02054263 bltz a0,272 + 252: e426 sd s1,8(sp) + 254: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 256: 85ca mv a1,s2 + 258: 198000ef jal 3f0 + 25c: 892a mv s2,a0 + close(fd); + 25e: 8526 mv a0,s1 + 260: 160000ef jal 3c0 + return r; + 264: 64a2 ld s1,8(sp) +} + 266: 854a mv a0,s2 + 268: 60e2 ld ra,24(sp) + 26a: 6442 ld s0,16(sp) + 26c: 6902 ld s2,0(sp) + 26e: 6105 addi sp,sp,32 + 270: 8082 ret + return -1; + 272: 597d li s2,-1 + 274: bfcd j 266 + +0000000000000276 : + +int +atoi(const char *s) +{ + 276: 1141 addi sp,sp,-16 + 278: e422 sd s0,8(sp) + 27a: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 27c: 00054683 lbu a3,0(a0) + 280: fd06879b addiw a5,a3,-48 + 284: 0ff7f793 zext.b a5,a5 + 288: 4625 li a2,9 + 28a: 02f66863 bltu a2,a5,2ba + 28e: 872a mv a4,a0 + n = 0; + 290: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 292: 0705 addi a4,a4,1 + 294: 0025179b slliw a5,a0,0x2 + 298: 9fa9 addw a5,a5,a0 + 29a: 0017979b slliw a5,a5,0x1 + 29e: 9fb5 addw a5,a5,a3 + 2a0: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 2a4: 00074683 lbu a3,0(a4) + 2a8: fd06879b addiw a5,a3,-48 + 2ac: 0ff7f793 zext.b a5,a5 + 2b0: fef671e3 bgeu a2,a5,292 + return n; +} + 2b4: 6422 ld s0,8(sp) + 2b6: 0141 addi sp,sp,16 + 2b8: 8082 ret + n = 0; + 2ba: 4501 li a0,0 + 2bc: bfe5 j 2b4 + +00000000000002be : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 2be: 1141 addi sp,sp,-16 + 2c0: e422 sd s0,8(sp) + 2c2: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 2c4: 02b57463 bgeu a0,a1,2ec + while(n-- > 0) + 2c8: 00c05f63 blez a2,2e6 + 2cc: 1602 slli a2,a2,0x20 + 2ce: 9201 srli a2,a2,0x20 + 2d0: 00c507b3 add a5,a0,a2 + dst = vdst; + 2d4: 872a mv a4,a0 + *dst++ = *src++; + 2d6: 0585 addi a1,a1,1 + 2d8: 0705 addi a4,a4,1 + 2da: fff5c683 lbu a3,-1(a1) + 2de: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2e2: fef71ae3 bne a4,a5,2d6 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2e6: 6422 ld s0,8(sp) + 2e8: 0141 addi sp,sp,16 + 2ea: 8082 ret + dst += n; + 2ec: 00c50733 add a4,a0,a2 + src += n; + 2f0: 95b2 add a1,a1,a2 + while(n-- > 0) + 2f2: fec05ae3 blez a2,2e6 + 2f6: fff6079b addiw a5,a2,-1 + 2fa: 1782 slli a5,a5,0x20 + 2fc: 9381 srli a5,a5,0x20 + 2fe: fff7c793 not a5,a5 + 302: 97ba add a5,a5,a4 + *--dst = *--src; + 304: 15fd addi a1,a1,-1 + 306: 177d addi a4,a4,-1 + 308: 0005c683 lbu a3,0(a1) + 30c: 00d70023 sb a3,0(a4) + while(n-- > 0) + 310: fee79ae3 bne a5,a4,304 + 314: bfc9 j 2e6 + +0000000000000316 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 316: 1141 addi sp,sp,-16 + 318: e422 sd s0,8(sp) + 31a: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 31c: ca05 beqz a2,34c + 31e: fff6069b addiw a3,a2,-1 + 322: 1682 slli a3,a3,0x20 + 324: 9281 srli a3,a3,0x20 + 326: 0685 addi a3,a3,1 + 328: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 32a: 00054783 lbu a5,0(a0) + 32e: 0005c703 lbu a4,0(a1) + 332: 00e79863 bne a5,a4,342 + return *p1 - *p2; + } + p1++; + 336: 0505 addi a0,a0,1 + p2++; + 338: 0585 addi a1,a1,1 + while (n-- > 0) { + 33a: fed518e3 bne a0,a3,32a + } + return 0; + 33e: 4501 li a0,0 + 340: a019 j 346 + return *p1 - *p2; + 342: 40e7853b subw a0,a5,a4 +} + 346: 6422 ld s0,8(sp) + 348: 0141 addi sp,sp,16 + 34a: 8082 ret + return 0; + 34c: 4501 li a0,0 + 34e: bfe5 j 346 + +0000000000000350 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 350: 1141 addi sp,sp,-16 + 352: e406 sd ra,8(sp) + 354: e022 sd s0,0(sp) + 356: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 358: f67ff0ef jal 2be +} + 35c: 60a2 ld ra,8(sp) + 35e: 6402 ld s0,0(sp) + 360: 0141 addi sp,sp,16 + 362: 8082 ret + +0000000000000364 : + +char * +sbrk(int n) { + 364: 1141 addi sp,sp,-16 + 366: e406 sd ra,8(sp) + 368: e022 sd s0,0(sp) + 36a: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 36c: 4585 li a1,1 + 36e: 0b2000ef jal 420 +} + 372: 60a2 ld ra,8(sp) + 374: 6402 ld s0,0(sp) + 376: 0141 addi sp,sp,16 + 378: 8082 ret + +000000000000037a : + +char * +sbrklazy(int n) { + 37a: 1141 addi sp,sp,-16 + 37c: e406 sd ra,8(sp) + 37e: e022 sd s0,0(sp) + 380: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 382: 4589 li a1,2 + 384: 09c000ef jal 420 +} + 388: 60a2 ld ra,8(sp) + 38a: 6402 ld s0,0(sp) + 38c: 0141 addi sp,sp,16 + 38e: 8082 ret + +0000000000000390 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 390: 4885 li a7,1 + ecall + 392: 00000073 ecall + ret + 396: 8082 ret + +0000000000000398 : +.global exit +exit: + li a7, SYS_exit + 398: 4889 li a7,2 + ecall + 39a: 00000073 ecall + ret + 39e: 8082 ret + +00000000000003a0 : +.global wait +wait: + li a7, SYS_wait + 3a0: 488d li a7,3 + ecall + 3a2: 00000073 ecall + ret + 3a6: 8082 ret + +00000000000003a8 : +.global pipe +pipe: + li a7, SYS_pipe + 3a8: 4891 li a7,4 + ecall + 3aa: 00000073 ecall + ret + 3ae: 8082 ret + +00000000000003b0 : +.global read +read: + li a7, SYS_read + 3b0: 4895 li a7,5 + ecall + 3b2: 00000073 ecall + ret + 3b6: 8082 ret + +00000000000003b8 : +.global write +write: + li a7, SYS_write + 3b8: 48c1 li a7,16 + ecall + 3ba: 00000073 ecall + ret + 3be: 8082 ret + +00000000000003c0 : +.global close +close: + li a7, SYS_close + 3c0: 48d5 li a7,21 + ecall + 3c2: 00000073 ecall + ret + 3c6: 8082 ret + +00000000000003c8 : +.global kill +kill: + li a7, SYS_kill + 3c8: 4899 li a7,6 + ecall + 3ca: 00000073 ecall + ret + 3ce: 8082 ret + +00000000000003d0 : +.global exec +exec: + li a7, SYS_exec + 3d0: 489d li a7,7 + ecall + 3d2: 00000073 ecall + ret + 3d6: 8082 ret + +00000000000003d8 : +.global open +open: + li a7, SYS_open + 3d8: 48bd li a7,15 + ecall + 3da: 00000073 ecall + ret + 3de: 8082 ret + +00000000000003e0 : +.global mknod +mknod: + li a7, SYS_mknod + 3e0: 48c5 li a7,17 + ecall + 3e2: 00000073 ecall + ret + 3e6: 8082 ret + +00000000000003e8 : +.global unlink +unlink: + li a7, SYS_unlink + 3e8: 48c9 li a7,18 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 : +.global fstat +fstat: + li a7, SYS_fstat + 3f0: 48a1 li a7,8 + ecall + 3f2: 00000073 ecall + ret + 3f6: 8082 ret + +00000000000003f8 : +.global link +link: + li a7, SYS_link + 3f8: 48cd li a7,19 + ecall + 3fa: 00000073 ecall + ret + 3fe: 8082 ret + +0000000000000400 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 400: 48d1 li a7,20 + ecall + 402: 00000073 ecall + ret + 406: 8082 ret + +0000000000000408 : +.global chdir +chdir: + li a7, SYS_chdir + 408: 48a5 li a7,9 + ecall + 40a: 00000073 ecall + ret + 40e: 8082 ret + +0000000000000410 : +.global dup +dup: + li a7, SYS_dup + 410: 48a9 li a7,10 + ecall + 412: 00000073 ecall + ret + 416: 8082 ret + +0000000000000418 : +.global getpid +getpid: + li a7, SYS_getpid + 418: 48ad li a7,11 + ecall + 41a: 00000073 ecall + ret + 41e: 8082 ret + +0000000000000420 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 420: 48b1 li a7,12 + ecall + 422: 00000073 ecall + ret + 426: 8082 ret + +0000000000000428 : +.global pause +pause: + li a7, SYS_pause + 428: 48b5 li a7,13 + ecall + 42a: 00000073 ecall + ret + 42e: 8082 ret + +0000000000000430 : +.global uptime +uptime: + li a7, SYS_uptime + 430: 48b9 li a7,14 + ecall + 432: 00000073 ecall + ret + 436: 8082 ret + +0000000000000438 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 438: 48d9 li a7,22 + ecall + 43a: 00000073 ecall + ret + 43e: 8082 ret + +0000000000000440 : +.global getppid +getppid: + li a7, SYS_getppid + 440: 48dd li a7,23 + ecall + 442: 00000073 ecall + ret + 446: 8082 ret + +0000000000000448 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 448: 48e1 li a7,24 + ecall + 44a: 00000073 ecall + ret + 44e: 8082 ret + +0000000000000450 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 450: 1101 addi sp,sp,-32 + 452: ec06 sd ra,24(sp) + 454: e822 sd s0,16(sp) + 456: 1000 addi s0,sp,32 + 458: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 45c: 4605 li a2,1 + 45e: fef40593 addi a1,s0,-17 + 462: f57ff0ef jal 3b8 +} + 466: 60e2 ld ra,24(sp) + 468: 6442 ld s0,16(sp) + 46a: 6105 addi sp,sp,32 + 46c: 8082 ret + +000000000000046e : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 46e: 715d addi sp,sp,-80 + 470: e486 sd ra,72(sp) + 472: e0a2 sd s0,64(sp) + 474: f84a sd s2,48(sp) + 476: 0880 addi s0,sp,80 + 478: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 47a: c299 beqz a3,480 + 47c: 0805c363 bltz a1,502 + neg = 0; + 480: 4881 li a7,0 + 482: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 486: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 488: 00000517 auipc a0,0x0 + 48c: 55850513 addi a0,a0,1368 # 9e0 + 490: 883e mv a6,a5 + 492: 2785 addiw a5,a5,1 + 494: 02c5f733 remu a4,a1,a2 + 498: 972a add a4,a4,a0 + 49a: 00074703 lbu a4,0(a4) + 49e: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 4a2: 872e mv a4,a1 + 4a4: 02c5d5b3 divu a1,a1,a2 + 4a8: 0685 addi a3,a3,1 + 4aa: fec773e3 bgeu a4,a2,490 + if(neg) + 4ae: 00088b63 beqz a7,4c4 + buf[i++] = '-'; + 4b2: fd078793 addi a5,a5,-48 + 4b6: 97a2 add a5,a5,s0 + 4b8: 02d00713 li a4,45 + 4bc: fee78423 sb a4,-24(a5) + 4c0: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 4c4: 02f05a63 blez a5,4f8 + 4c8: fc26 sd s1,56(sp) + 4ca: f44e sd s3,40(sp) + 4cc: fb840713 addi a4,s0,-72 + 4d0: 00f704b3 add s1,a4,a5 + 4d4: fff70993 addi s3,a4,-1 + 4d8: 99be add s3,s3,a5 + 4da: 37fd addiw a5,a5,-1 + 4dc: 1782 slli a5,a5,0x20 + 4de: 9381 srli a5,a5,0x20 + 4e0: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 4e4: fff4c583 lbu a1,-1(s1) + 4e8: 854a mv a0,s2 + 4ea: f67ff0ef jal 450 + while(--i >= 0) + 4ee: 14fd addi s1,s1,-1 + 4f0: ff349ae3 bne s1,s3,4e4 + 4f4: 74e2 ld s1,56(sp) + 4f6: 79a2 ld s3,40(sp) +} + 4f8: 60a6 ld ra,72(sp) + 4fa: 6406 ld s0,64(sp) + 4fc: 7942 ld s2,48(sp) + 4fe: 6161 addi sp,sp,80 + 500: 8082 ret + x = -xx; + 502: 40b005b3 neg a1,a1 + neg = 1; + 506: 4885 li a7,1 + x = -xx; + 508: bfad j 482 + +000000000000050a : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 50a: 711d addi sp,sp,-96 + 50c: ec86 sd ra,88(sp) + 50e: e8a2 sd s0,80(sp) + 510: e0ca sd s2,64(sp) + 512: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 514: 0005c903 lbu s2,0(a1) + 518: 28090663 beqz s2,7a4 + 51c: e4a6 sd s1,72(sp) + 51e: fc4e sd s3,56(sp) + 520: f852 sd s4,48(sp) + 522: f456 sd s5,40(sp) + 524: f05a sd s6,32(sp) + 526: ec5e sd s7,24(sp) + 528: e862 sd s8,16(sp) + 52a: e466 sd s9,8(sp) + 52c: 8b2a mv s6,a0 + 52e: 8a2e mv s4,a1 + 530: 8bb2 mv s7,a2 + state = 0; + 532: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 534: 4481 li s1,0 + 536: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 538: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 53c: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 540: 06c00c93 li s9,108 + 544: a005 j 564 + putc(fd, c0); + 546: 85ca mv a1,s2 + 548: 855a mv a0,s6 + 54a: f07ff0ef jal 450 + 54e: a019 j 554 + } else if(state == '%'){ + 550: 03598263 beq s3,s5,574 + for(i = 0; fmt[i]; i++){ + 554: 2485 addiw s1,s1,1 + 556: 8726 mv a4,s1 + 558: 009a07b3 add a5,s4,s1 + 55c: 0007c903 lbu s2,0(a5) + 560: 22090a63 beqz s2,794 + c0 = fmt[i] & 0xff; + 564: 0009079b sext.w a5,s2 + if(state == 0){ + 568: fe0994e3 bnez s3,550 + if(c0 == '%'){ + 56c: fd579de3 bne a5,s5,546 + state = '%'; + 570: 89be mv s3,a5 + 572: b7cd j 554 + if(c0) c1 = fmt[i+1] & 0xff; + 574: 00ea06b3 add a3,s4,a4 + 578: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 57c: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 57e: c681 beqz a3,586 + 580: 9752 add a4,a4,s4 + 582: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 586: 05878363 beq a5,s8,5cc + } else if(c0 == 'l' && c1 == 'd'){ + 58a: 05978d63 beq a5,s9,5e4 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 58e: 07500713 li a4,117 + 592: 0ee78763 beq a5,a4,680 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 596: 07800713 li a4,120 + 59a: 12e78963 beq a5,a4,6cc + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 59e: 07000713 li a4,112 + 5a2: 14e78e63 beq a5,a4,6fe + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 5a6: 06300713 li a4,99 + 5aa: 18e78e63 beq a5,a4,746 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 5ae: 07300713 li a4,115 + 5b2: 1ae78463 beq a5,a4,75a + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 5b6: 02500713 li a4,37 + 5ba: 04e79563 bne a5,a4,604 + putc(fd, '%'); + 5be: 02500593 li a1,37 + 5c2: 855a mv a0,s6 + 5c4: e8dff0ef jal 450 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 5c8: 4981 li s3,0 + 5ca: b769 j 554 + printint(fd, va_arg(ap, int), 10, 1); + 5cc: 008b8913 addi s2,s7,8 + 5d0: 4685 li a3,1 + 5d2: 4629 li a2,10 + 5d4: 000ba583 lw a1,0(s7) + 5d8: 855a mv a0,s6 + 5da: e95ff0ef jal 46e + 5de: 8bca mv s7,s2 + state = 0; + 5e0: 4981 li s3,0 + 5e2: bf8d j 554 + } else if(c0 == 'l' && c1 == 'd'){ + 5e4: 06400793 li a5,100 + 5e8: 02f68963 beq a3,a5,61a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5ec: 06c00793 li a5,108 + 5f0: 04f68263 beq a3,a5,634 + } else if(c0 == 'l' && c1 == 'u'){ + 5f4: 07500793 li a5,117 + 5f8: 0af68063 beq a3,a5,698 + } else if(c0 == 'l' && c1 == 'x'){ + 5fc: 07800793 li a5,120 + 600: 0ef68263 beq a3,a5,6e4 + putc(fd, '%'); + 604: 02500593 li a1,37 + 608: 855a mv a0,s6 + 60a: e47ff0ef jal 450 + putc(fd, c0); + 60e: 85ca mv a1,s2 + 610: 855a mv a0,s6 + 612: e3fff0ef jal 450 + state = 0; + 616: 4981 li s3,0 + 618: bf35 j 554 + printint(fd, va_arg(ap, uint64), 10, 1); + 61a: 008b8913 addi s2,s7,8 + 61e: 4685 li a3,1 + 620: 4629 li a2,10 + 622: 000bb583 ld a1,0(s7) + 626: 855a mv a0,s6 + 628: e47ff0ef jal 46e + i += 1; + 62c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 62e: 8bca mv s7,s2 + state = 0; + 630: 4981 li s3,0 + i += 1; + 632: b70d j 554 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 634: 06400793 li a5,100 + 638: 02f60763 beq a2,a5,666 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 63c: 07500793 li a5,117 + 640: 06f60963 beq a2,a5,6b2 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 644: 07800793 li a5,120 + 648: faf61ee3 bne a2,a5,604 + printint(fd, va_arg(ap, uint64), 16, 0); + 64c: 008b8913 addi s2,s7,8 + 650: 4681 li a3,0 + 652: 4641 li a2,16 + 654: 000bb583 ld a1,0(s7) + 658: 855a mv a0,s6 + 65a: e15ff0ef jal 46e + i += 2; + 65e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 660: 8bca mv s7,s2 + state = 0; + 662: 4981 li s3,0 + i += 2; + 664: bdc5 j 554 + printint(fd, va_arg(ap, uint64), 10, 1); + 666: 008b8913 addi s2,s7,8 + 66a: 4685 li a3,1 + 66c: 4629 li a2,10 + 66e: 000bb583 ld a1,0(s7) + 672: 855a mv a0,s6 + 674: dfbff0ef jal 46e + i += 2; + 678: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 67a: 8bca mv s7,s2 + state = 0; + 67c: 4981 li s3,0 + i += 2; + 67e: bdd9 j 554 + printint(fd, va_arg(ap, uint32), 10, 0); + 680: 008b8913 addi s2,s7,8 + 684: 4681 li a3,0 + 686: 4629 li a2,10 + 688: 000be583 lwu a1,0(s7) + 68c: 855a mv a0,s6 + 68e: de1ff0ef jal 46e + 692: 8bca mv s7,s2 + state = 0; + 694: 4981 li s3,0 + 696: bd7d j 554 + printint(fd, va_arg(ap, uint64), 10, 0); + 698: 008b8913 addi s2,s7,8 + 69c: 4681 li a3,0 + 69e: 4629 li a2,10 + 6a0: 000bb583 ld a1,0(s7) + 6a4: 855a mv a0,s6 + 6a6: dc9ff0ef jal 46e + i += 1; + 6aa: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 6ac: 8bca mv s7,s2 + state = 0; + 6ae: 4981 li s3,0 + i += 1; + 6b0: b555 j 554 + printint(fd, va_arg(ap, uint64), 10, 0); + 6b2: 008b8913 addi s2,s7,8 + 6b6: 4681 li a3,0 + 6b8: 4629 li a2,10 + 6ba: 000bb583 ld a1,0(s7) + 6be: 855a mv a0,s6 + 6c0: dafff0ef jal 46e + i += 2; + 6c4: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 6c6: 8bca mv s7,s2 + state = 0; + 6c8: 4981 li s3,0 + i += 2; + 6ca: b569 j 554 + printint(fd, va_arg(ap, uint32), 16, 0); + 6cc: 008b8913 addi s2,s7,8 + 6d0: 4681 li a3,0 + 6d2: 4641 li a2,16 + 6d4: 000be583 lwu a1,0(s7) + 6d8: 855a mv a0,s6 + 6da: d95ff0ef jal 46e + 6de: 8bca mv s7,s2 + state = 0; + 6e0: 4981 li s3,0 + 6e2: bd8d j 554 + printint(fd, va_arg(ap, uint64), 16, 0); + 6e4: 008b8913 addi s2,s7,8 + 6e8: 4681 li a3,0 + 6ea: 4641 li a2,16 + 6ec: 000bb583 ld a1,0(s7) + 6f0: 855a mv a0,s6 + 6f2: d7dff0ef jal 46e + i += 1; + 6f6: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6f8: 8bca mv s7,s2 + state = 0; + 6fa: 4981 li s3,0 + i += 1; + 6fc: bda1 j 554 + 6fe: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 700: 008b8d13 addi s10,s7,8 + 704: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 708: 03000593 li a1,48 + 70c: 855a mv a0,s6 + 70e: d43ff0ef jal 450 + putc(fd, 'x'); + 712: 07800593 li a1,120 + 716: 855a mv a0,s6 + 718: d39ff0ef jal 450 + 71c: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 71e: 00000b97 auipc s7,0x0 + 722: 2c2b8b93 addi s7,s7,706 # 9e0 + 726: 03c9d793 srli a5,s3,0x3c + 72a: 97de add a5,a5,s7 + 72c: 0007c583 lbu a1,0(a5) + 730: 855a mv a0,s6 + 732: d1fff0ef jal 450 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 736: 0992 slli s3,s3,0x4 + 738: 397d addiw s2,s2,-1 + 73a: fe0916e3 bnez s2,726 + printptr(fd, va_arg(ap, uint64)); + 73e: 8bea mv s7,s10 + state = 0; + 740: 4981 li s3,0 + 742: 6d02 ld s10,0(sp) + 744: bd01 j 554 + putc(fd, va_arg(ap, uint32)); + 746: 008b8913 addi s2,s7,8 + 74a: 000bc583 lbu a1,0(s7) + 74e: 855a mv a0,s6 + 750: d01ff0ef jal 450 + 754: 8bca mv s7,s2 + state = 0; + 756: 4981 li s3,0 + 758: bbf5 j 554 + if((s = va_arg(ap, char*)) == 0) + 75a: 008b8993 addi s3,s7,8 + 75e: 000bb903 ld s2,0(s7) + 762: 00090f63 beqz s2,780 + for(; *s; s++) + 766: 00094583 lbu a1,0(s2) + 76a: c195 beqz a1,78e + putc(fd, *s); + 76c: 855a mv a0,s6 + 76e: ce3ff0ef jal 450 + for(; *s; s++) + 772: 0905 addi s2,s2,1 + 774: 00094583 lbu a1,0(s2) + 778: f9f5 bnez a1,76c + if((s = va_arg(ap, char*)) == 0) + 77a: 8bce mv s7,s3 + state = 0; + 77c: 4981 li s3,0 + 77e: bbd9 j 554 + s = "(null)"; + 780: 00000917 auipc s2,0x0 + 784: 25890913 addi s2,s2,600 # 9d8 + for(; *s; s++) + 788: 02800593 li a1,40 + 78c: b7c5 j 76c + if((s = va_arg(ap, char*)) == 0) + 78e: 8bce mv s7,s3 + state = 0; + 790: 4981 li s3,0 + 792: b3c9 j 554 + 794: 64a6 ld s1,72(sp) + 796: 79e2 ld s3,56(sp) + 798: 7a42 ld s4,48(sp) + 79a: 7aa2 ld s5,40(sp) + 79c: 7b02 ld s6,32(sp) + 79e: 6be2 ld s7,24(sp) + 7a0: 6c42 ld s8,16(sp) + 7a2: 6ca2 ld s9,8(sp) + } + } +} + 7a4: 60e6 ld ra,88(sp) + 7a6: 6446 ld s0,80(sp) + 7a8: 6906 ld s2,64(sp) + 7aa: 6125 addi sp,sp,96 + 7ac: 8082 ret + +00000000000007ae : + +void +fprintf(int fd, const char *fmt, ...) +{ + 7ae: 715d addi sp,sp,-80 + 7b0: ec06 sd ra,24(sp) + 7b2: e822 sd s0,16(sp) + 7b4: 1000 addi s0,sp,32 + 7b6: e010 sd a2,0(s0) + 7b8: e414 sd a3,8(s0) + 7ba: e818 sd a4,16(s0) + 7bc: ec1c sd a5,24(s0) + 7be: 03043023 sd a6,32(s0) + 7c2: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 7c6: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 7ca: 8622 mv a2,s0 + 7cc: d3fff0ef jal 50a +} + 7d0: 60e2 ld ra,24(sp) + 7d2: 6442 ld s0,16(sp) + 7d4: 6161 addi sp,sp,80 + 7d6: 8082 ret + +00000000000007d8 : + +void +printf(const char *fmt, ...) +{ + 7d8: 711d addi sp,sp,-96 + 7da: ec06 sd ra,24(sp) + 7dc: e822 sd s0,16(sp) + 7de: 1000 addi s0,sp,32 + 7e0: e40c sd a1,8(s0) + 7e2: e810 sd a2,16(s0) + 7e4: ec14 sd a3,24(s0) + 7e6: f018 sd a4,32(s0) + 7e8: f41c sd a5,40(s0) + 7ea: 03043823 sd a6,48(s0) + 7ee: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 7f2: 00840613 addi a2,s0,8 + 7f6: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 7fa: 85aa mv a1,a0 + 7fc: 4505 li a0,1 + 7fe: d0dff0ef jal 50a +} + 802: 60e2 ld ra,24(sp) + 804: 6442 ld s0,16(sp) + 806: 6125 addi sp,sp,96 + 808: 8082 ret + +000000000000080a : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 80a: 1141 addi sp,sp,-16 + 80c: e422 sd s0,8(sp) + 80e: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 810: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 814: 00000797 auipc a5,0x0 + 818: 7ec7b783 ld a5,2028(a5) # 1000 + 81c: a02d j 846 + 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; + 81e: 4618 lw a4,8(a2) + 820: 9f2d addw a4,a4,a1 + 822: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 826: 6398 ld a4,0(a5) + 828: 6310 ld a2,0(a4) + 82a: a83d j 868 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 82c: ff852703 lw a4,-8(a0) + 830: 9f31 addw a4,a4,a2 + 832: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 834: ff053683 ld a3,-16(a0) + 838: a091 j 87c + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 83a: 6398 ld a4,0(a5) + 83c: 00e7e463 bltu a5,a4,844 + 840: 00e6ea63 bltu a3,a4,854 +{ + 844: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 846: fed7fae3 bgeu a5,a3,83a + 84a: 6398 ld a4,0(a5) + 84c: 00e6e463 bltu a3,a4,854 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 850: fee7eae3 bltu a5,a4,844 + if(bp + bp->s.size == p->s.ptr){ + 854: ff852583 lw a1,-8(a0) + 858: 6390 ld a2,0(a5) + 85a: 02059813 slli a6,a1,0x20 + 85e: 01c85713 srli a4,a6,0x1c + 862: 9736 add a4,a4,a3 + 864: fae60de3 beq a2,a4,81e + bp->s.ptr = p->s.ptr->s.ptr; + 868: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 86c: 4790 lw a2,8(a5) + 86e: 02061593 slli a1,a2,0x20 + 872: 01c5d713 srli a4,a1,0x1c + 876: 973e add a4,a4,a5 + 878: fae68ae3 beq a3,a4,82c + p->s.ptr = bp->s.ptr; + 87c: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 87e: 00000717 auipc a4,0x0 + 882: 78f73123 sd a5,1922(a4) # 1000 +} + 886: 6422 ld s0,8(sp) + 888: 0141 addi sp,sp,16 + 88a: 8082 ret + +000000000000088c : + return freep; +} + +void* +malloc(uint nbytes) +{ + 88c: 7139 addi sp,sp,-64 + 88e: fc06 sd ra,56(sp) + 890: f822 sd s0,48(sp) + 892: f426 sd s1,40(sp) + 894: ec4e sd s3,24(sp) + 896: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 898: 02051493 slli s1,a0,0x20 + 89c: 9081 srli s1,s1,0x20 + 89e: 04bd addi s1,s1,15 + 8a0: 8091 srli s1,s1,0x4 + 8a2: 0014899b addiw s3,s1,1 + 8a6: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 8a8: 00000517 auipc a0,0x0 + 8ac: 75853503 ld a0,1880(a0) # 1000 + 8b0: c915 beqz a0,8e4 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8b2: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8b4: 4798 lw a4,8(a5) + 8b6: 08977a63 bgeu a4,s1,94a + 8ba: f04a sd s2,32(sp) + 8bc: e852 sd s4,16(sp) + 8be: e456 sd s5,8(sp) + 8c0: e05a sd s6,0(sp) + if(nu < 4096) + 8c2: 8a4e mv s4,s3 + 8c4: 0009871b sext.w a4,s3 + 8c8: 6685 lui a3,0x1 + 8ca: 00d77363 bgeu a4,a3,8d0 + 8ce: 6a05 lui s4,0x1 + 8d0: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 8d4: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 8d8: 00000917 auipc s2,0x0 + 8dc: 72890913 addi s2,s2,1832 # 1000 + if(p == SBRK_ERROR) + 8e0: 5afd li s5,-1 + 8e2: a081 j 922 + 8e4: f04a sd s2,32(sp) + 8e6: e852 sd s4,16(sp) + 8e8: e456 sd s5,8(sp) + 8ea: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 8ec: 00001797 auipc a5,0x1 + 8f0: 91c78793 addi a5,a5,-1764 # 1208 + 8f4: 00000717 auipc a4,0x0 + 8f8: 70f73623 sd a5,1804(a4) # 1000 + 8fc: e39c sd a5,0(a5) + base.s.size = 0; + 8fe: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 902: b7c1 j 8c2 + prevp->s.ptr = p->s.ptr; + 904: 6398 ld a4,0(a5) + 906: e118 sd a4,0(a0) + 908: a8a9 j 962 + hp->s.size = nu; + 90a: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 90e: 0541 addi a0,a0,16 + 910: efbff0ef jal 80a + return freep; + 914: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 918: c12d beqz a0,97a + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 91a: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 91c: 4798 lw a4,8(a5) + 91e: 02977263 bgeu a4,s1,942 + if(p == freep) + 922: 00093703 ld a4,0(s2) + 926: 853e mv a0,a5 + 928: fef719e3 bne a4,a5,91a + p = sbrk(nu * sizeof(Header)); + 92c: 8552 mv a0,s4 + 92e: a37ff0ef jal 364 + if(p == SBRK_ERROR) + 932: fd551ce3 bne a0,s5,90a + return 0; + 936: 4501 li a0,0 + 938: 7902 ld s2,32(sp) + 93a: 6a42 ld s4,16(sp) + 93c: 6aa2 ld s5,8(sp) + 93e: 6b02 ld s6,0(sp) + 940: a03d j 96e + 942: 7902 ld s2,32(sp) + 944: 6a42 ld s4,16(sp) + 946: 6aa2 ld s5,8(sp) + 948: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 94a: fae48de3 beq s1,a4,904 + p->s.size -= nunits; + 94e: 4137073b subw a4,a4,s3 + 952: c798 sw a4,8(a5) + p += p->s.size; + 954: 02071693 slli a3,a4,0x20 + 958: 01c6d713 srli a4,a3,0x1c + 95c: 97ba add a5,a5,a4 + p->s.size = nunits; + 95e: 0137a423 sw s3,8(a5) + freep = prevp; + 962: 00000717 auipc a4,0x0 + 966: 68a73f23 sd a0,1694(a4) # 1000 + return (void*)(p + 1); + 96a: 01078513 addi a0,a5,16 + } +} + 96e: 70e2 ld ra,56(sp) + 970: 7442 ld s0,48(sp) + 972: 74a2 ld s1,40(sp) + 974: 69e2 ld s3,24(sp) + 976: 6121 addi sp,sp,64 + 978: 8082 ret + 97a: 7902 ld s2,32(sp) + 97c: 6a42 ld s4,16(sp) + 97e: 6aa2 ld s5,8(sp) + 980: 6b02 ld s6,0(sp) + 982: b7f5 j 96e diff --git a/user/logstress.c b/G12_Project1_xv6CustomizeSystemCalls/user/logstress.c similarity index 100% rename from user/logstress.c rename to G12_Project1_xv6CustomizeSystemCalls/user/logstress.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/logstress.d b/G12_Project1_xv6CustomizeSystemCalls/user/logstress.d new file mode 100644 index 0000000000..42def16bf4 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/logstress.d @@ -0,0 +1,2 @@ +user/logstress.o: user/logstress.c kernel/types.h kernel/stat.h \ + kernel/fcntl.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/logstress.o b/G12_Project1_xv6CustomizeSystemCalls/user/logstress.o new file mode 100644 index 0000000000..0a40e466c7 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/logstress.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/logstress.sym b/G12_Project1_xv6CustomizeSystemCalls/user/logstress.sym new file mode 100644 index 0000000000..d7b9e5a327 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/logstress.sym @@ -0,0 +1,69 @@ +0000000000000000 .text +0000000000000988 .rodata +00000000000009f8 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 logstress.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000450 putc +000000000000046e printint +00000000000009e0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001208 base +0000000000000114 strcpy +0000000000000428 pause +00000000000007d8 printf +0000000000000420 sys_sbrk +00000000000002be memmove +00000000000003e0 mknod +00000000000001cc gets +0000000000000418 getpid +0000000000000350 memcpy +000000000000088c malloc +000000000000037a sbrklazy +00000000000003a8 pipe +00000000000003b8 write +00000000000003f0 fstat +00000000000007ae fprintf +00000000000003c8 kill +000000000000050a vprintf +0000000000000408 chdir +00000000000003d0 exec +00000000000003a0 wait +0000000000000438 getprocsinfo +00000000000003b0 read +00000000000003e8 unlink +0000000000000316 memcmp +0000000000000390 fork +0000000000000364 sbrk +0000000000000430 uptime +0000000000000186 memset +0000000000000000 main +0000000000000440 getppid +0000000000000130 strcmp +0000000000000410 dup +0000000000001010 buf +000000000000023c stat +0000000000000448 sleep2 +00000000000003f8 link +0000000000000398 exit +0000000000000104 start +0000000000000276 atoi +000000000000015c strlen +00000000000003d8 open +00000000000001a8 strchr +0000000000000400 mkdir +00000000000003c0 close +000000000000080a free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ls.asm b/G12_Project1_xv6CustomizeSystemCalls/user/ls.asm new file mode 100644 index 0000000000..addd8eab1d --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/ls.asm @@ -0,0 +1,1775 @@ + +user/_ls: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : +#include "kernel/fs.h" +#include "kernel/fcntl.h" + +char* +fmtname(char *path) +{ + 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: 1800 addi s0,sp,48 + a: 84aa mv s1,a0 + static char buf[DIRSIZ+1]; + char *p; + + // Find first character after last slash. + for(p=path+strlen(path); p >= path && *p != '/'; p--) + c: 2b8000ef jal 2c4 + 10: 02051793 slli a5,a0,0x20 + 14: 9381 srli a5,a5,0x20 + 16: 97a6 add a5,a5,s1 + 18: 02f00693 li a3,47 + 1c: 0097e963 bltu a5,s1,2e + 20: 0007c703 lbu a4,0(a5) + 24: 00d70563 beq a4,a3,2e + 28: 17fd addi a5,a5,-1 + 2a: fe97fbe3 bgeu a5,s1,20 + ; + p++; + 2e: 00178493 addi s1,a5,1 + + // Return blank-padded name. + if(strlen(p) >= DIRSIZ) + 32: 8526 mv a0,s1 + 34: 290000ef jal 2c4 + 38: 2501 sext.w a0,a0 + 3a: 47b5 li a5,13 + 3c: 00a7f863 bgeu a5,a0,4c + return p; + memmove(buf, p, strlen(p)); + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + buf[sizeof(buf)-1] = '\0'; + return buf; +} + 40: 8526 mv a0,s1 + 42: 70a2 ld ra,40(sp) + 44: 7402 ld s0,32(sp) + 46: 64e2 ld s1,24(sp) + 48: 6145 addi sp,sp,48 + 4a: 8082 ret + 4c: e84a sd s2,16(sp) + 4e: e44e sd s3,8(sp) + memmove(buf, p, strlen(p)); + 50: 8526 mv a0,s1 + 52: 272000ef jal 2c4 + 56: 00002997 auipc s3,0x2 + 5a: fba98993 addi s3,s3,-70 # 2010 + 5e: 0005061b sext.w a2,a0 + 62: 85a6 mv a1,s1 + 64: 854e mv a0,s3 + 66: 3c0000ef jal 426 + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + 6a: 8526 mv a0,s1 + 6c: 258000ef jal 2c4 + 70: 0005091b sext.w s2,a0 + 74: 8526 mv a0,s1 + 76: 24e000ef jal 2c4 + 7a: 1902 slli s2,s2,0x20 + 7c: 02095913 srli s2,s2,0x20 + 80: 4639 li a2,14 + 82: 9e09 subw a2,a2,a0 + 84: 02000593 li a1,32 + 88: 01298533 add a0,s3,s2 + 8c: 262000ef jal 2ee + buf[sizeof(buf)-1] = '\0'; + 90: 00098723 sb zero,14(s3) + return buf; + 94: 84ce mv s1,s3 + 96: 6942 ld s2,16(sp) + 98: 69a2 ld s3,8(sp) + 9a: b75d j 40 + +000000000000009c : + +void +ls(char *path) +{ + 9c: d9010113 addi sp,sp,-624 + a0: 26113423 sd ra,616(sp) + a4: 26813023 sd s0,608(sp) + a8: 25213823 sd s2,592(sp) + ac: 1c80 addi s0,sp,624 + ae: 892a mv s2,a0 + char buf[512], *p; + int fd; + struct dirent de; + struct stat st; + + if((fd = open(path, O_RDONLY)) < 0){ + b0: 4581 li a1,0 + b2: 48e000ef jal 540 + b6: 06054363 bltz a0,11c + ba: 24913c23 sd s1,600(sp) + be: 84aa mv s1,a0 + fprintf(2, "ls: cannot open %s\n", path); + return; + } + + if(fstat(fd, &st) < 0){ + c0: d9840593 addi a1,s0,-616 + c4: 494000ef jal 558 + c8: 06054363 bltz a0,12e + fprintf(2, "ls: cannot stat %s\n", path); + close(fd); + return; + } + + switch(st.type){ + cc: da041783 lh a5,-608(s0) + d0: 4705 li a4,1 + d2: 06e78c63 beq a5,a4,14a + d6: 37f9 addiw a5,a5,-2 + d8: 17c2 slli a5,a5,0x30 + da: 93c1 srli a5,a5,0x30 + dc: 02f76263 bltu a4,a5,100 + case T_DEVICE: + case T_FILE: + printf("%s %d %d %d\n", fmtname(path), st.type, st.ino, (int) st.size); + e0: 854a mv a0,s2 + e2: f1fff0ef jal 0 + e6: 85aa mv a1,a0 + e8: da842703 lw a4,-600(s0) + ec: d9c42683 lw a3,-612(s0) + f0: da041603 lh a2,-608(s0) + f4: 00001517 auipc a0,0x1 + f8: a2c50513 addi a0,a0,-1492 # b20 + fc: 045000ef jal 940 + } + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + } + break; + } + close(fd); + 100: 8526 mv a0,s1 + 102: 426000ef jal 528 + 106: 25813483 ld s1,600(sp) +} + 10a: 26813083 ld ra,616(sp) + 10e: 26013403 ld s0,608(sp) + 112: 25013903 ld s2,592(sp) + 116: 27010113 addi sp,sp,624 + 11a: 8082 ret + fprintf(2, "ls: cannot open %s\n", path); + 11c: 864a mv a2,s2 + 11e: 00001597 auipc a1,0x1 + 122: 9d258593 addi a1,a1,-1582 # af0 + 126: 4509 li a0,2 + 128: 7ee000ef jal 916 + return; + 12c: bff9 j 10a + fprintf(2, "ls: cannot stat %s\n", path); + 12e: 864a mv a2,s2 + 130: 00001597 auipc a1,0x1 + 134: 9d858593 addi a1,a1,-1576 # b08 + 138: 4509 li a0,2 + 13a: 7dc000ef jal 916 + close(fd); + 13e: 8526 mv a0,s1 + 140: 3e8000ef jal 528 + return; + 144: 25813483 ld s1,600(sp) + 148: b7c9 j 10a + if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){ + 14a: 854a mv a0,s2 + 14c: 178000ef jal 2c4 + 150: 2541 addiw a0,a0,16 + 152: 20000793 li a5,512 + 156: 00a7f963 bgeu a5,a0,168 + printf("ls: path too long\n"); + 15a: 00001517 auipc a0,0x1 + 15e: 9d650513 addi a0,a0,-1578 # b30 + 162: 7de000ef jal 940 + break; + 166: bf69 j 100 + 168: 25313423 sd s3,584(sp) + 16c: 25413023 sd s4,576(sp) + 170: 23513c23 sd s5,568(sp) + strcpy(buf, path); + 174: 85ca mv a1,s2 + 176: dc040513 addi a0,s0,-576 + 17a: 102000ef jal 27c + p = buf+strlen(buf); + 17e: dc040513 addi a0,s0,-576 + 182: 142000ef jal 2c4 + 186: 1502 slli a0,a0,0x20 + 188: 9101 srli a0,a0,0x20 + 18a: dc040793 addi a5,s0,-576 + 18e: 00a78933 add s2,a5,a0 + *p++ = '/'; + 192: 00190993 addi s3,s2,1 + 196: 02f00793 li a5,47 + 19a: 00f90023 sb a5,0(s2) + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + 19e: 00001a17 auipc s4,0x1 + 1a2: 982a0a13 addi s4,s4,-1662 # b20 + printf("ls: cannot stat %s\n", buf); + 1a6: 00001a97 auipc s5,0x1 + 1aa: 962a8a93 addi s5,s5,-1694 # b08 + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + 1ae: a031 j 1ba + printf("ls: cannot stat %s\n", buf); + 1b0: dc040593 addi a1,s0,-576 + 1b4: 8556 mv a0,s5 + 1b6: 78a000ef jal 940 + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + 1ba: 4641 li a2,16 + 1bc: db040593 addi a1,s0,-592 + 1c0: 8526 mv a0,s1 + 1c2: 356000ef jal 518 + 1c6: 47c1 li a5,16 + 1c8: 04f51463 bne a0,a5,210 + if(de.inum == 0) + 1cc: db045783 lhu a5,-592(s0) + 1d0: d7ed beqz a5,1ba + memmove(p, de.name, DIRSIZ); + 1d2: 4639 li a2,14 + 1d4: db240593 addi a1,s0,-590 + 1d8: 854e mv a0,s3 + 1da: 24c000ef jal 426 + p[DIRSIZ] = 0; + 1de: 000907a3 sb zero,15(s2) + if(stat(buf, &st) < 0){ + 1e2: d9840593 addi a1,s0,-616 + 1e6: dc040513 addi a0,s0,-576 + 1ea: 1ba000ef jal 3a4 + 1ee: fc0541e3 bltz a0,1b0 + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + 1f2: dc040513 addi a0,s0,-576 + 1f6: e0bff0ef jal 0 + 1fa: 85aa mv a1,a0 + 1fc: da842703 lw a4,-600(s0) + 200: d9c42683 lw a3,-612(s0) + 204: da041603 lh a2,-608(s0) + 208: 8552 mv a0,s4 + 20a: 736000ef jal 940 + 20e: b775 j 1ba + 210: 24813983 ld s3,584(sp) + 214: 24013a03 ld s4,576(sp) + 218: 23813a83 ld s5,568(sp) + 21c: b5d5 j 100 + +000000000000021e
: + +int +main(int argc, char *argv[]) +{ + 21e: 1101 addi sp,sp,-32 + 220: ec06 sd ra,24(sp) + 222: e822 sd s0,16(sp) + 224: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + 226: 4785 li a5,1 + 228: 02a7d763 bge a5,a0,256 + 22c: e426 sd s1,8(sp) + 22e: e04a sd s2,0(sp) + 230: 00858493 addi s1,a1,8 + 234: ffe5091b addiw s2,a0,-2 + 238: 02091793 slli a5,s2,0x20 + 23c: 01d7d913 srli s2,a5,0x1d + 240: 05c1 addi a1,a1,16 + 242: 992e add s2,s2,a1 + ls("."); + exit(0); + } + for(i=1; i + for(i=1; i + exit(0); + 250: 4501 li a0,0 + 252: 2ae000ef jal 500 + 256: e426 sd s1,8(sp) + 258: e04a sd s2,0(sp) + ls("."); + 25a: 00001517 auipc a0,0x1 + 25e: 8ee50513 addi a0,a0,-1810 # b48 + 262: e3bff0ef jal 9c + exit(0); + 266: 4501 li a0,0 + 268: 298000ef jal 500 + +000000000000026c : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 26c: 1141 addi sp,sp,-16 + 26e: e406 sd ra,8(sp) + 270: e022 sd s0,0(sp) + 272: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 274: fabff0ef jal 21e
+ exit(r); + 278: 288000ef jal 500 + +000000000000027c : +} + +char* +strcpy(char *s, const char *t) +{ + 27c: 1141 addi sp,sp,-16 + 27e: e422 sd s0,8(sp) + 280: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 282: 87aa mv a5,a0 + 284: 0585 addi a1,a1,1 + 286: 0785 addi a5,a5,1 + 288: fff5c703 lbu a4,-1(a1) + 28c: fee78fa3 sb a4,-1(a5) + 290: fb75 bnez a4,284 + ; + return os; +} + 292: 6422 ld s0,8(sp) + 294: 0141 addi sp,sp,16 + 296: 8082 ret + +0000000000000298 : + +int +strcmp(const char *p, const char *q) +{ + 298: 1141 addi sp,sp,-16 + 29a: e422 sd s0,8(sp) + 29c: 0800 addi s0,sp,16 + while(*p && *p == *q) + 29e: 00054783 lbu a5,0(a0) + 2a2: cb91 beqz a5,2b6 + 2a4: 0005c703 lbu a4,0(a1) + 2a8: 00f71763 bne a4,a5,2b6 + p++, q++; + 2ac: 0505 addi a0,a0,1 + 2ae: 0585 addi a1,a1,1 + while(*p && *p == *q) + 2b0: 00054783 lbu a5,0(a0) + 2b4: fbe5 bnez a5,2a4 + return (uchar)*p - (uchar)*q; + 2b6: 0005c503 lbu a0,0(a1) +} + 2ba: 40a7853b subw a0,a5,a0 + 2be: 6422 ld s0,8(sp) + 2c0: 0141 addi sp,sp,16 + 2c2: 8082 ret + +00000000000002c4 : + +uint +strlen(const char *s) +{ + 2c4: 1141 addi sp,sp,-16 + 2c6: e422 sd s0,8(sp) + 2c8: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 2ca: 00054783 lbu a5,0(a0) + 2ce: cf91 beqz a5,2ea + 2d0: 0505 addi a0,a0,1 + 2d2: 87aa mv a5,a0 + 2d4: 86be mv a3,a5 + 2d6: 0785 addi a5,a5,1 + 2d8: fff7c703 lbu a4,-1(a5) + 2dc: ff65 bnez a4,2d4 + 2de: 40a6853b subw a0,a3,a0 + 2e2: 2505 addiw a0,a0,1 + ; + return n; +} + 2e4: 6422 ld s0,8(sp) + 2e6: 0141 addi sp,sp,16 + 2e8: 8082 ret + for(n = 0; s[n]; n++) + 2ea: 4501 li a0,0 + 2ec: bfe5 j 2e4 + +00000000000002ee : + +void* +memset(void *dst, int c, uint n) +{ + 2ee: 1141 addi sp,sp,-16 + 2f0: e422 sd s0,8(sp) + 2f2: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 2f4: ca19 beqz a2,30a + 2f6: 87aa mv a5,a0 + 2f8: 1602 slli a2,a2,0x20 + 2fa: 9201 srli a2,a2,0x20 + 2fc: 00a60733 add a4,a2,a0 + cdst[i] = c; + 300: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 304: 0785 addi a5,a5,1 + 306: fee79de3 bne a5,a4,300 + } + return dst; +} + 30a: 6422 ld s0,8(sp) + 30c: 0141 addi sp,sp,16 + 30e: 8082 ret + +0000000000000310 : + +char* +strchr(const char *s, char c) +{ + 310: 1141 addi sp,sp,-16 + 312: e422 sd s0,8(sp) + 314: 0800 addi s0,sp,16 + for(; *s; s++) + 316: 00054783 lbu a5,0(a0) + 31a: cb99 beqz a5,330 + if(*s == c) + 31c: 00f58763 beq a1,a5,32a + for(; *s; s++) + 320: 0505 addi a0,a0,1 + 322: 00054783 lbu a5,0(a0) + 326: fbfd bnez a5,31c + return (char*)s; + return 0; + 328: 4501 li a0,0 +} + 32a: 6422 ld s0,8(sp) + 32c: 0141 addi sp,sp,16 + 32e: 8082 ret + return 0; + 330: 4501 li a0,0 + 332: bfe5 j 32a + +0000000000000334 : + +char* +gets(char *buf, int max) +{ + 334: 711d addi sp,sp,-96 + 336: ec86 sd ra,88(sp) + 338: e8a2 sd s0,80(sp) + 33a: e4a6 sd s1,72(sp) + 33c: e0ca sd s2,64(sp) + 33e: fc4e sd s3,56(sp) + 340: f852 sd s4,48(sp) + 342: f456 sd s5,40(sp) + 344: f05a sd s6,32(sp) + 346: ec5e sd s7,24(sp) + 348: 1080 addi s0,sp,96 + 34a: 8baa mv s7,a0 + 34c: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 34e: 892a mv s2,a0 + 350: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 352: 4aa9 li s5,10 + 354: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 356: 89a6 mv s3,s1 + 358: 2485 addiw s1,s1,1 + 35a: 0344d663 bge s1,s4,386 + cc = read(0, &c, 1); + 35e: 4605 li a2,1 + 360: faf40593 addi a1,s0,-81 + 364: 4501 li a0,0 + 366: 1b2000ef jal 518 + if(cc < 1) + 36a: 00a05e63 blez a0,386 + buf[i++] = c; + 36e: faf44783 lbu a5,-81(s0) + 372: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 376: 01578763 beq a5,s5,384 + 37a: 0905 addi s2,s2,1 + 37c: fd679de3 bne a5,s6,356 + buf[i++] = c; + 380: 89a6 mv s3,s1 + 382: a011 j 386 + 384: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 386: 99de add s3,s3,s7 + 388: 00098023 sb zero,0(s3) + return buf; +} + 38c: 855e mv a0,s7 + 38e: 60e6 ld ra,88(sp) + 390: 6446 ld s0,80(sp) + 392: 64a6 ld s1,72(sp) + 394: 6906 ld s2,64(sp) + 396: 79e2 ld s3,56(sp) + 398: 7a42 ld s4,48(sp) + 39a: 7aa2 ld s5,40(sp) + 39c: 7b02 ld s6,32(sp) + 39e: 6be2 ld s7,24(sp) + 3a0: 6125 addi sp,sp,96 + 3a2: 8082 ret + +00000000000003a4 : + +int +stat(const char *n, struct stat *st) +{ + 3a4: 1101 addi sp,sp,-32 + 3a6: ec06 sd ra,24(sp) + 3a8: e822 sd s0,16(sp) + 3aa: e04a sd s2,0(sp) + 3ac: 1000 addi s0,sp,32 + 3ae: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 3b0: 4581 li a1,0 + 3b2: 18e000ef jal 540 + if(fd < 0) + 3b6: 02054263 bltz a0,3da + 3ba: e426 sd s1,8(sp) + 3bc: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 3be: 85ca mv a1,s2 + 3c0: 198000ef jal 558 + 3c4: 892a mv s2,a0 + close(fd); + 3c6: 8526 mv a0,s1 + 3c8: 160000ef jal 528 + return r; + 3cc: 64a2 ld s1,8(sp) +} + 3ce: 854a mv a0,s2 + 3d0: 60e2 ld ra,24(sp) + 3d2: 6442 ld s0,16(sp) + 3d4: 6902 ld s2,0(sp) + 3d6: 6105 addi sp,sp,32 + 3d8: 8082 ret + return -1; + 3da: 597d li s2,-1 + 3dc: bfcd j 3ce + +00000000000003de : + +int +atoi(const char *s) +{ + 3de: 1141 addi sp,sp,-16 + 3e0: e422 sd s0,8(sp) + 3e2: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 3e4: 00054683 lbu a3,0(a0) + 3e8: fd06879b addiw a5,a3,-48 + 3ec: 0ff7f793 zext.b a5,a5 + 3f0: 4625 li a2,9 + 3f2: 02f66863 bltu a2,a5,422 + 3f6: 872a mv a4,a0 + n = 0; + 3f8: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 3fa: 0705 addi a4,a4,1 + 3fc: 0025179b slliw a5,a0,0x2 + 400: 9fa9 addw a5,a5,a0 + 402: 0017979b slliw a5,a5,0x1 + 406: 9fb5 addw a5,a5,a3 + 408: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 40c: 00074683 lbu a3,0(a4) + 410: fd06879b addiw a5,a3,-48 + 414: 0ff7f793 zext.b a5,a5 + 418: fef671e3 bgeu a2,a5,3fa + return n; +} + 41c: 6422 ld s0,8(sp) + 41e: 0141 addi sp,sp,16 + 420: 8082 ret + n = 0; + 422: 4501 li a0,0 + 424: bfe5 j 41c + +0000000000000426 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 426: 1141 addi sp,sp,-16 + 428: e422 sd s0,8(sp) + 42a: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 42c: 02b57463 bgeu a0,a1,454 + while(n-- > 0) + 430: 00c05f63 blez a2,44e + 434: 1602 slli a2,a2,0x20 + 436: 9201 srli a2,a2,0x20 + 438: 00c507b3 add a5,a0,a2 + dst = vdst; + 43c: 872a mv a4,a0 + *dst++ = *src++; + 43e: 0585 addi a1,a1,1 + 440: 0705 addi a4,a4,1 + 442: fff5c683 lbu a3,-1(a1) + 446: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 44a: fef71ae3 bne a4,a5,43e + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 44e: 6422 ld s0,8(sp) + 450: 0141 addi sp,sp,16 + 452: 8082 ret + dst += n; + 454: 00c50733 add a4,a0,a2 + src += n; + 458: 95b2 add a1,a1,a2 + while(n-- > 0) + 45a: fec05ae3 blez a2,44e + 45e: fff6079b addiw a5,a2,-1 + 462: 1782 slli a5,a5,0x20 + 464: 9381 srli a5,a5,0x20 + 466: fff7c793 not a5,a5 + 46a: 97ba add a5,a5,a4 + *--dst = *--src; + 46c: 15fd addi a1,a1,-1 + 46e: 177d addi a4,a4,-1 + 470: 0005c683 lbu a3,0(a1) + 474: 00d70023 sb a3,0(a4) + while(n-- > 0) + 478: fee79ae3 bne a5,a4,46c + 47c: bfc9 j 44e + +000000000000047e : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 47e: 1141 addi sp,sp,-16 + 480: e422 sd s0,8(sp) + 482: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 484: ca05 beqz a2,4b4 + 486: fff6069b addiw a3,a2,-1 + 48a: 1682 slli a3,a3,0x20 + 48c: 9281 srli a3,a3,0x20 + 48e: 0685 addi a3,a3,1 + 490: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 492: 00054783 lbu a5,0(a0) + 496: 0005c703 lbu a4,0(a1) + 49a: 00e79863 bne a5,a4,4aa + return *p1 - *p2; + } + p1++; + 49e: 0505 addi a0,a0,1 + p2++; + 4a0: 0585 addi a1,a1,1 + while (n-- > 0) { + 4a2: fed518e3 bne a0,a3,492 + } + return 0; + 4a6: 4501 li a0,0 + 4a8: a019 j 4ae + return *p1 - *p2; + 4aa: 40e7853b subw a0,a5,a4 +} + 4ae: 6422 ld s0,8(sp) + 4b0: 0141 addi sp,sp,16 + 4b2: 8082 ret + return 0; + 4b4: 4501 li a0,0 + 4b6: bfe5 j 4ae + +00000000000004b8 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 4b8: 1141 addi sp,sp,-16 + 4ba: e406 sd ra,8(sp) + 4bc: e022 sd s0,0(sp) + 4be: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 4c0: f67ff0ef jal 426 +} + 4c4: 60a2 ld ra,8(sp) + 4c6: 6402 ld s0,0(sp) + 4c8: 0141 addi sp,sp,16 + 4ca: 8082 ret + +00000000000004cc : + +char * +sbrk(int n) { + 4cc: 1141 addi sp,sp,-16 + 4ce: e406 sd ra,8(sp) + 4d0: e022 sd s0,0(sp) + 4d2: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 4d4: 4585 li a1,1 + 4d6: 0b2000ef jal 588 +} + 4da: 60a2 ld ra,8(sp) + 4dc: 6402 ld s0,0(sp) + 4de: 0141 addi sp,sp,16 + 4e0: 8082 ret + +00000000000004e2 : + +char * +sbrklazy(int n) { + 4e2: 1141 addi sp,sp,-16 + 4e4: e406 sd ra,8(sp) + 4e6: e022 sd s0,0(sp) + 4e8: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 4ea: 4589 li a1,2 + 4ec: 09c000ef jal 588 +} + 4f0: 60a2 ld ra,8(sp) + 4f2: 6402 ld s0,0(sp) + 4f4: 0141 addi sp,sp,16 + 4f6: 8082 ret + +00000000000004f8 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 4f8: 4885 li a7,1 + ecall + 4fa: 00000073 ecall + ret + 4fe: 8082 ret + +0000000000000500 : +.global exit +exit: + li a7, SYS_exit + 500: 4889 li a7,2 + ecall + 502: 00000073 ecall + ret + 506: 8082 ret + +0000000000000508 : +.global wait +wait: + li a7, SYS_wait + 508: 488d li a7,3 + ecall + 50a: 00000073 ecall + ret + 50e: 8082 ret + +0000000000000510 : +.global pipe +pipe: + li a7, SYS_pipe + 510: 4891 li a7,4 + ecall + 512: 00000073 ecall + ret + 516: 8082 ret + +0000000000000518 : +.global read +read: + li a7, SYS_read + 518: 4895 li a7,5 + ecall + 51a: 00000073 ecall + ret + 51e: 8082 ret + +0000000000000520 : +.global write +write: + li a7, SYS_write + 520: 48c1 li a7,16 + ecall + 522: 00000073 ecall + ret + 526: 8082 ret + +0000000000000528 : +.global close +close: + li a7, SYS_close + 528: 48d5 li a7,21 + ecall + 52a: 00000073 ecall + ret + 52e: 8082 ret + +0000000000000530 : +.global kill +kill: + li a7, SYS_kill + 530: 4899 li a7,6 + ecall + 532: 00000073 ecall + ret + 536: 8082 ret + +0000000000000538 : +.global exec +exec: + li a7, SYS_exec + 538: 489d li a7,7 + ecall + 53a: 00000073 ecall + ret + 53e: 8082 ret + +0000000000000540 : +.global open +open: + li a7, SYS_open + 540: 48bd li a7,15 + ecall + 542: 00000073 ecall + ret + 546: 8082 ret + +0000000000000548 : +.global mknod +mknod: + li a7, SYS_mknod + 548: 48c5 li a7,17 + ecall + 54a: 00000073 ecall + ret + 54e: 8082 ret + +0000000000000550 : +.global unlink +unlink: + li a7, SYS_unlink + 550: 48c9 li a7,18 + ecall + 552: 00000073 ecall + ret + 556: 8082 ret + +0000000000000558 : +.global fstat +fstat: + li a7, SYS_fstat + 558: 48a1 li a7,8 + ecall + 55a: 00000073 ecall + ret + 55e: 8082 ret + +0000000000000560 : +.global link +link: + li a7, SYS_link + 560: 48cd li a7,19 + ecall + 562: 00000073 ecall + ret + 566: 8082 ret + +0000000000000568 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 568: 48d1 li a7,20 + ecall + 56a: 00000073 ecall + ret + 56e: 8082 ret + +0000000000000570 : +.global chdir +chdir: + li a7, SYS_chdir + 570: 48a5 li a7,9 + ecall + 572: 00000073 ecall + ret + 576: 8082 ret + +0000000000000578 : +.global dup +dup: + li a7, SYS_dup + 578: 48a9 li a7,10 + ecall + 57a: 00000073 ecall + ret + 57e: 8082 ret + +0000000000000580 : +.global getpid +getpid: + li a7, SYS_getpid + 580: 48ad li a7,11 + ecall + 582: 00000073 ecall + ret + 586: 8082 ret + +0000000000000588 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 588: 48b1 li a7,12 + ecall + 58a: 00000073 ecall + ret + 58e: 8082 ret + +0000000000000590 : +.global pause +pause: + li a7, SYS_pause + 590: 48b5 li a7,13 + ecall + 592: 00000073 ecall + ret + 596: 8082 ret + +0000000000000598 : +.global uptime +uptime: + li a7, SYS_uptime + 598: 48b9 li a7,14 + ecall + 59a: 00000073 ecall + ret + 59e: 8082 ret + +00000000000005a0 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 5a0: 48d9 li a7,22 + ecall + 5a2: 00000073 ecall + ret + 5a6: 8082 ret + +00000000000005a8 : +.global getppid +getppid: + li a7, SYS_getppid + 5a8: 48dd li a7,23 + ecall + 5aa: 00000073 ecall + ret + 5ae: 8082 ret + +00000000000005b0 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 5b0: 48e1 li a7,24 + ecall + 5b2: 00000073 ecall + ret + 5b6: 8082 ret + +00000000000005b8 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 5b8: 1101 addi sp,sp,-32 + 5ba: ec06 sd ra,24(sp) + 5bc: e822 sd s0,16(sp) + 5be: 1000 addi s0,sp,32 + 5c0: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 5c4: 4605 li a2,1 + 5c6: fef40593 addi a1,s0,-17 + 5ca: f57ff0ef jal 520 +} + 5ce: 60e2 ld ra,24(sp) + 5d0: 6442 ld s0,16(sp) + 5d2: 6105 addi sp,sp,32 + 5d4: 8082 ret + +00000000000005d6 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 5d6: 715d addi sp,sp,-80 + 5d8: e486 sd ra,72(sp) + 5da: e0a2 sd s0,64(sp) + 5dc: f84a sd s2,48(sp) + 5de: 0880 addi s0,sp,80 + 5e0: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 5e2: c299 beqz a3,5e8 + 5e4: 0805c363 bltz a1,66a + neg = 0; + 5e8: 4881 li a7,0 + 5ea: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 5ee: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 5f0: 00000517 auipc a0,0x0 + 5f4: 56850513 addi a0,a0,1384 # b58 + 5f8: 883e mv a6,a5 + 5fa: 2785 addiw a5,a5,1 + 5fc: 02c5f733 remu a4,a1,a2 + 600: 972a add a4,a4,a0 + 602: 00074703 lbu a4,0(a4) + 606: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 60a: 872e mv a4,a1 + 60c: 02c5d5b3 divu a1,a1,a2 + 610: 0685 addi a3,a3,1 + 612: fec773e3 bgeu a4,a2,5f8 + if(neg) + 616: 00088b63 beqz a7,62c + buf[i++] = '-'; + 61a: fd078793 addi a5,a5,-48 + 61e: 97a2 add a5,a5,s0 + 620: 02d00713 li a4,45 + 624: fee78423 sb a4,-24(a5) + 628: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 62c: 02f05a63 blez a5,660 + 630: fc26 sd s1,56(sp) + 632: f44e sd s3,40(sp) + 634: fb840713 addi a4,s0,-72 + 638: 00f704b3 add s1,a4,a5 + 63c: fff70993 addi s3,a4,-1 + 640: 99be add s3,s3,a5 + 642: 37fd addiw a5,a5,-1 + 644: 1782 slli a5,a5,0x20 + 646: 9381 srli a5,a5,0x20 + 648: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 64c: fff4c583 lbu a1,-1(s1) + 650: 854a mv a0,s2 + 652: f67ff0ef jal 5b8 + while(--i >= 0) + 656: 14fd addi s1,s1,-1 + 658: ff349ae3 bne s1,s3,64c + 65c: 74e2 ld s1,56(sp) + 65e: 79a2 ld s3,40(sp) +} + 660: 60a6 ld ra,72(sp) + 662: 6406 ld s0,64(sp) + 664: 7942 ld s2,48(sp) + 666: 6161 addi sp,sp,80 + 668: 8082 ret + x = -xx; + 66a: 40b005b3 neg a1,a1 + neg = 1; + 66e: 4885 li a7,1 + x = -xx; + 670: bfad j 5ea + +0000000000000672 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 672: 711d addi sp,sp,-96 + 674: ec86 sd ra,88(sp) + 676: e8a2 sd s0,80(sp) + 678: e0ca sd s2,64(sp) + 67a: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 67c: 0005c903 lbu s2,0(a1) + 680: 28090663 beqz s2,90c + 684: e4a6 sd s1,72(sp) + 686: fc4e sd s3,56(sp) + 688: f852 sd s4,48(sp) + 68a: f456 sd s5,40(sp) + 68c: f05a sd s6,32(sp) + 68e: ec5e sd s7,24(sp) + 690: e862 sd s8,16(sp) + 692: e466 sd s9,8(sp) + 694: 8b2a mv s6,a0 + 696: 8a2e mv s4,a1 + 698: 8bb2 mv s7,a2 + state = 0; + 69a: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 69c: 4481 li s1,0 + 69e: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 6a0: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 6a4: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 6a8: 06c00c93 li s9,108 + 6ac: a005 j 6cc + putc(fd, c0); + 6ae: 85ca mv a1,s2 + 6b0: 855a mv a0,s6 + 6b2: f07ff0ef jal 5b8 + 6b6: a019 j 6bc + } else if(state == '%'){ + 6b8: 03598263 beq s3,s5,6dc + for(i = 0; fmt[i]; i++){ + 6bc: 2485 addiw s1,s1,1 + 6be: 8726 mv a4,s1 + 6c0: 009a07b3 add a5,s4,s1 + 6c4: 0007c903 lbu s2,0(a5) + 6c8: 22090a63 beqz s2,8fc + c0 = fmt[i] & 0xff; + 6cc: 0009079b sext.w a5,s2 + if(state == 0){ + 6d0: fe0994e3 bnez s3,6b8 + if(c0 == '%'){ + 6d4: fd579de3 bne a5,s5,6ae + state = '%'; + 6d8: 89be mv s3,a5 + 6da: b7cd j 6bc + if(c0) c1 = fmt[i+1] & 0xff; + 6dc: 00ea06b3 add a3,s4,a4 + 6e0: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 6e4: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 6e6: c681 beqz a3,6ee + 6e8: 9752 add a4,a4,s4 + 6ea: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 6ee: 05878363 beq a5,s8,734 + } else if(c0 == 'l' && c1 == 'd'){ + 6f2: 05978d63 beq a5,s9,74c + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 6f6: 07500713 li a4,117 + 6fa: 0ee78763 beq a5,a4,7e8 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 6fe: 07800713 li a4,120 + 702: 12e78963 beq a5,a4,834 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 706: 07000713 li a4,112 + 70a: 14e78e63 beq a5,a4,866 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 70e: 06300713 li a4,99 + 712: 18e78e63 beq a5,a4,8ae + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 716: 07300713 li a4,115 + 71a: 1ae78463 beq a5,a4,8c2 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 71e: 02500713 li a4,37 + 722: 04e79563 bne a5,a4,76c + putc(fd, '%'); + 726: 02500593 li a1,37 + 72a: 855a mv a0,s6 + 72c: e8dff0ef jal 5b8 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 730: 4981 li s3,0 + 732: b769 j 6bc + printint(fd, va_arg(ap, int), 10, 1); + 734: 008b8913 addi s2,s7,8 + 738: 4685 li a3,1 + 73a: 4629 li a2,10 + 73c: 000ba583 lw a1,0(s7) + 740: 855a mv a0,s6 + 742: e95ff0ef jal 5d6 + 746: 8bca mv s7,s2 + state = 0; + 748: 4981 li s3,0 + 74a: bf8d j 6bc + } else if(c0 == 'l' && c1 == 'd'){ + 74c: 06400793 li a5,100 + 750: 02f68963 beq a3,a5,782 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 754: 06c00793 li a5,108 + 758: 04f68263 beq a3,a5,79c + } else if(c0 == 'l' && c1 == 'u'){ + 75c: 07500793 li a5,117 + 760: 0af68063 beq a3,a5,800 + } else if(c0 == 'l' && c1 == 'x'){ + 764: 07800793 li a5,120 + 768: 0ef68263 beq a3,a5,84c + putc(fd, '%'); + 76c: 02500593 li a1,37 + 770: 855a mv a0,s6 + 772: e47ff0ef jal 5b8 + putc(fd, c0); + 776: 85ca mv a1,s2 + 778: 855a mv a0,s6 + 77a: e3fff0ef jal 5b8 + state = 0; + 77e: 4981 li s3,0 + 780: bf35 j 6bc + printint(fd, va_arg(ap, uint64), 10, 1); + 782: 008b8913 addi s2,s7,8 + 786: 4685 li a3,1 + 788: 4629 li a2,10 + 78a: 000bb583 ld a1,0(s7) + 78e: 855a mv a0,s6 + 790: e47ff0ef jal 5d6 + i += 1; + 794: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 796: 8bca mv s7,s2 + state = 0; + 798: 4981 li s3,0 + i += 1; + 79a: b70d j 6bc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 79c: 06400793 li a5,100 + 7a0: 02f60763 beq a2,a5,7ce + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 7a4: 07500793 li a5,117 + 7a8: 06f60963 beq a2,a5,81a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 7ac: 07800793 li a5,120 + 7b0: faf61ee3 bne a2,a5,76c + printint(fd, va_arg(ap, uint64), 16, 0); + 7b4: 008b8913 addi s2,s7,8 + 7b8: 4681 li a3,0 + 7ba: 4641 li a2,16 + 7bc: 000bb583 ld a1,0(s7) + 7c0: 855a mv a0,s6 + 7c2: e15ff0ef jal 5d6 + i += 2; + 7c6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 7c8: 8bca mv s7,s2 + state = 0; + 7ca: 4981 li s3,0 + i += 2; + 7cc: bdc5 j 6bc + printint(fd, va_arg(ap, uint64), 10, 1); + 7ce: 008b8913 addi s2,s7,8 + 7d2: 4685 li a3,1 + 7d4: 4629 li a2,10 + 7d6: 000bb583 ld a1,0(s7) + 7da: 855a mv a0,s6 + 7dc: dfbff0ef jal 5d6 + i += 2; + 7e0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 7e2: 8bca mv s7,s2 + state = 0; + 7e4: 4981 li s3,0 + i += 2; + 7e6: bdd9 j 6bc + printint(fd, va_arg(ap, uint32), 10, 0); + 7e8: 008b8913 addi s2,s7,8 + 7ec: 4681 li a3,0 + 7ee: 4629 li a2,10 + 7f0: 000be583 lwu a1,0(s7) + 7f4: 855a mv a0,s6 + 7f6: de1ff0ef jal 5d6 + 7fa: 8bca mv s7,s2 + state = 0; + 7fc: 4981 li s3,0 + 7fe: bd7d j 6bc + printint(fd, va_arg(ap, uint64), 10, 0); + 800: 008b8913 addi s2,s7,8 + 804: 4681 li a3,0 + 806: 4629 li a2,10 + 808: 000bb583 ld a1,0(s7) + 80c: 855a mv a0,s6 + 80e: dc9ff0ef jal 5d6 + i += 1; + 812: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 814: 8bca mv s7,s2 + state = 0; + 816: 4981 li s3,0 + i += 1; + 818: b555 j 6bc + printint(fd, va_arg(ap, uint64), 10, 0); + 81a: 008b8913 addi s2,s7,8 + 81e: 4681 li a3,0 + 820: 4629 li a2,10 + 822: 000bb583 ld a1,0(s7) + 826: 855a mv a0,s6 + 828: dafff0ef jal 5d6 + i += 2; + 82c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 82e: 8bca mv s7,s2 + state = 0; + 830: 4981 li s3,0 + i += 2; + 832: b569 j 6bc + printint(fd, va_arg(ap, uint32), 16, 0); + 834: 008b8913 addi s2,s7,8 + 838: 4681 li a3,0 + 83a: 4641 li a2,16 + 83c: 000be583 lwu a1,0(s7) + 840: 855a mv a0,s6 + 842: d95ff0ef jal 5d6 + 846: 8bca mv s7,s2 + state = 0; + 848: 4981 li s3,0 + 84a: bd8d j 6bc + printint(fd, va_arg(ap, uint64), 16, 0); + 84c: 008b8913 addi s2,s7,8 + 850: 4681 li a3,0 + 852: 4641 li a2,16 + 854: 000bb583 ld a1,0(s7) + 858: 855a mv a0,s6 + 85a: d7dff0ef jal 5d6 + i += 1; + 85e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 860: 8bca mv s7,s2 + state = 0; + 862: 4981 li s3,0 + i += 1; + 864: bda1 j 6bc + 866: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 868: 008b8d13 addi s10,s7,8 + 86c: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 870: 03000593 li a1,48 + 874: 855a mv a0,s6 + 876: d43ff0ef jal 5b8 + putc(fd, 'x'); + 87a: 07800593 li a1,120 + 87e: 855a mv a0,s6 + 880: d39ff0ef jal 5b8 + 884: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 886: 00000b97 auipc s7,0x0 + 88a: 2d2b8b93 addi s7,s7,722 # b58 + 88e: 03c9d793 srli a5,s3,0x3c + 892: 97de add a5,a5,s7 + 894: 0007c583 lbu a1,0(a5) + 898: 855a mv a0,s6 + 89a: d1fff0ef jal 5b8 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 89e: 0992 slli s3,s3,0x4 + 8a0: 397d addiw s2,s2,-1 + 8a2: fe0916e3 bnez s2,88e + printptr(fd, va_arg(ap, uint64)); + 8a6: 8bea mv s7,s10 + state = 0; + 8a8: 4981 li s3,0 + 8aa: 6d02 ld s10,0(sp) + 8ac: bd01 j 6bc + putc(fd, va_arg(ap, uint32)); + 8ae: 008b8913 addi s2,s7,8 + 8b2: 000bc583 lbu a1,0(s7) + 8b6: 855a mv a0,s6 + 8b8: d01ff0ef jal 5b8 + 8bc: 8bca mv s7,s2 + state = 0; + 8be: 4981 li s3,0 + 8c0: bbf5 j 6bc + if((s = va_arg(ap, char*)) == 0) + 8c2: 008b8993 addi s3,s7,8 + 8c6: 000bb903 ld s2,0(s7) + 8ca: 00090f63 beqz s2,8e8 + for(; *s; s++) + 8ce: 00094583 lbu a1,0(s2) + 8d2: c195 beqz a1,8f6 + putc(fd, *s); + 8d4: 855a mv a0,s6 + 8d6: ce3ff0ef jal 5b8 + for(; *s; s++) + 8da: 0905 addi s2,s2,1 + 8dc: 00094583 lbu a1,0(s2) + 8e0: f9f5 bnez a1,8d4 + if((s = va_arg(ap, char*)) == 0) + 8e2: 8bce mv s7,s3 + state = 0; + 8e4: 4981 li s3,0 + 8e6: bbd9 j 6bc + s = "(null)"; + 8e8: 00000917 auipc s2,0x0 + 8ec: 26890913 addi s2,s2,616 # b50 + for(; *s; s++) + 8f0: 02800593 li a1,40 + 8f4: b7c5 j 8d4 + if((s = va_arg(ap, char*)) == 0) + 8f6: 8bce mv s7,s3 + state = 0; + 8f8: 4981 li s3,0 + 8fa: b3c9 j 6bc + 8fc: 64a6 ld s1,72(sp) + 8fe: 79e2 ld s3,56(sp) + 900: 7a42 ld s4,48(sp) + 902: 7aa2 ld s5,40(sp) + 904: 7b02 ld s6,32(sp) + 906: 6be2 ld s7,24(sp) + 908: 6c42 ld s8,16(sp) + 90a: 6ca2 ld s9,8(sp) + } + } +} + 90c: 60e6 ld ra,88(sp) + 90e: 6446 ld s0,80(sp) + 910: 6906 ld s2,64(sp) + 912: 6125 addi sp,sp,96 + 914: 8082 ret + +0000000000000916 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 916: 715d addi sp,sp,-80 + 918: ec06 sd ra,24(sp) + 91a: e822 sd s0,16(sp) + 91c: 1000 addi s0,sp,32 + 91e: e010 sd a2,0(s0) + 920: e414 sd a3,8(s0) + 922: e818 sd a4,16(s0) + 924: ec1c sd a5,24(s0) + 926: 03043023 sd a6,32(s0) + 92a: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 92e: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 932: 8622 mv a2,s0 + 934: d3fff0ef jal 672 +} + 938: 60e2 ld ra,24(sp) + 93a: 6442 ld s0,16(sp) + 93c: 6161 addi sp,sp,80 + 93e: 8082 ret + +0000000000000940 : + +void +printf(const char *fmt, ...) +{ + 940: 711d addi sp,sp,-96 + 942: ec06 sd ra,24(sp) + 944: e822 sd s0,16(sp) + 946: 1000 addi s0,sp,32 + 948: e40c sd a1,8(s0) + 94a: e810 sd a2,16(s0) + 94c: ec14 sd a3,24(s0) + 94e: f018 sd a4,32(s0) + 950: f41c sd a5,40(s0) + 952: 03043823 sd a6,48(s0) + 956: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 95a: 00840613 addi a2,s0,8 + 95e: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 962: 85aa mv a1,a0 + 964: 4505 li a0,1 + 966: d0dff0ef jal 672 +} + 96a: 60e2 ld ra,24(sp) + 96c: 6442 ld s0,16(sp) + 96e: 6125 addi sp,sp,96 + 970: 8082 ret + +0000000000000972 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 972: 1141 addi sp,sp,-16 + 974: e422 sd s0,8(sp) + 976: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 978: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 97c: 00001797 auipc a5,0x1 + 980: 6847b783 ld a5,1668(a5) # 2000 + 984: a02d j 9ae + 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; + 986: 4618 lw a4,8(a2) + 988: 9f2d addw a4,a4,a1 + 98a: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 98e: 6398 ld a4,0(a5) + 990: 6310 ld a2,0(a4) + 992: a83d j 9d0 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 994: ff852703 lw a4,-8(a0) + 998: 9f31 addw a4,a4,a2 + 99a: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 99c: ff053683 ld a3,-16(a0) + 9a0: a091 j 9e4 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 9a2: 6398 ld a4,0(a5) + 9a4: 00e7e463 bltu a5,a4,9ac + 9a8: 00e6ea63 bltu a3,a4,9bc +{ + 9ac: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 9ae: fed7fae3 bgeu a5,a3,9a2 + 9b2: 6398 ld a4,0(a5) + 9b4: 00e6e463 bltu a3,a4,9bc + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 9b8: fee7eae3 bltu a5,a4,9ac + if(bp + bp->s.size == p->s.ptr){ + 9bc: ff852583 lw a1,-8(a0) + 9c0: 6390 ld a2,0(a5) + 9c2: 02059813 slli a6,a1,0x20 + 9c6: 01c85713 srli a4,a6,0x1c + 9ca: 9736 add a4,a4,a3 + 9cc: fae60de3 beq a2,a4,986 + bp->s.ptr = p->s.ptr->s.ptr; + 9d0: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 9d4: 4790 lw a2,8(a5) + 9d6: 02061593 slli a1,a2,0x20 + 9da: 01c5d713 srli a4,a1,0x1c + 9de: 973e add a4,a4,a5 + 9e0: fae68ae3 beq a3,a4,994 + p->s.ptr = bp->s.ptr; + 9e4: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 9e6: 00001717 auipc a4,0x1 + 9ea: 60f73d23 sd a5,1562(a4) # 2000 +} + 9ee: 6422 ld s0,8(sp) + 9f0: 0141 addi sp,sp,16 + 9f2: 8082 ret + +00000000000009f4 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 9f4: 7139 addi sp,sp,-64 + 9f6: fc06 sd ra,56(sp) + 9f8: f822 sd s0,48(sp) + 9fa: f426 sd s1,40(sp) + 9fc: ec4e sd s3,24(sp) + 9fe: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + a00: 02051493 slli s1,a0,0x20 + a04: 9081 srli s1,s1,0x20 + a06: 04bd addi s1,s1,15 + a08: 8091 srli s1,s1,0x4 + a0a: 0014899b addiw s3,s1,1 + a0e: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + a10: 00001517 auipc a0,0x1 + a14: 5f053503 ld a0,1520(a0) # 2000 + a18: c915 beqz a0,a4c + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + a1a: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + a1c: 4798 lw a4,8(a5) + a1e: 08977a63 bgeu a4,s1,ab2 + a22: f04a sd s2,32(sp) + a24: e852 sd s4,16(sp) + a26: e456 sd s5,8(sp) + a28: e05a sd s6,0(sp) + if(nu < 4096) + a2a: 8a4e mv s4,s3 + a2c: 0009871b sext.w a4,s3 + a30: 6685 lui a3,0x1 + a32: 00d77363 bgeu a4,a3,a38 + a36: 6a05 lui s4,0x1 + a38: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + a3c: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + a40: 00001917 auipc s2,0x1 + a44: 5c090913 addi s2,s2,1472 # 2000 + if(p == SBRK_ERROR) + a48: 5afd li s5,-1 + a4a: a081 j a8a + a4c: f04a sd s2,32(sp) + a4e: e852 sd s4,16(sp) + a50: e456 sd s5,8(sp) + a52: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + a54: 00001797 auipc a5,0x1 + a58: 5cc78793 addi a5,a5,1484 # 2020 + a5c: 00001717 auipc a4,0x1 + a60: 5af73223 sd a5,1444(a4) # 2000 + a64: e39c sd a5,0(a5) + base.s.size = 0; + a66: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + a6a: b7c1 j a2a + prevp->s.ptr = p->s.ptr; + a6c: 6398 ld a4,0(a5) + a6e: e118 sd a4,0(a0) + a70: a8a9 j aca + hp->s.size = nu; + a72: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + a76: 0541 addi a0,a0,16 + a78: efbff0ef jal 972 + return freep; + a7c: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + a80: c12d beqz a0,ae2 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + a82: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + a84: 4798 lw a4,8(a5) + a86: 02977263 bgeu a4,s1,aaa + if(p == freep) + a8a: 00093703 ld a4,0(s2) + a8e: 853e mv a0,a5 + a90: fef719e3 bne a4,a5,a82 + p = sbrk(nu * sizeof(Header)); + a94: 8552 mv a0,s4 + a96: a37ff0ef jal 4cc + if(p == SBRK_ERROR) + a9a: fd551ce3 bne a0,s5,a72 + return 0; + a9e: 4501 li a0,0 + aa0: 7902 ld s2,32(sp) + aa2: 6a42 ld s4,16(sp) + aa4: 6aa2 ld s5,8(sp) + aa6: 6b02 ld s6,0(sp) + aa8: a03d j ad6 + aaa: 7902 ld s2,32(sp) + aac: 6a42 ld s4,16(sp) + aae: 6aa2 ld s5,8(sp) + ab0: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + ab2: fae48de3 beq s1,a4,a6c + p->s.size -= nunits; + ab6: 4137073b subw a4,a4,s3 + aba: c798 sw a4,8(a5) + p += p->s.size; + abc: 02071693 slli a3,a4,0x20 + ac0: 01c6d713 srli a4,a3,0x1c + ac4: 97ba add a5,a5,a4 + p->s.size = nunits; + ac6: 0137a423 sw s3,8(a5) + freep = prevp; + aca: 00001717 auipc a4,0x1 + ace: 52a73b23 sd a0,1334(a4) # 2000 + return (void*)(p + 1); + ad2: 01078513 addi a0,a5,16 + } +} + ad6: 70e2 ld ra,56(sp) + ad8: 7442 ld s0,48(sp) + ada: 74a2 ld s1,40(sp) + adc: 69e2 ld s3,24(sp) + ade: 6121 addi sp,sp,64 + ae0: 8082 ret + ae2: 7902 ld s2,32(sp) + ae4: 6a42 ld s4,16(sp) + ae6: 6aa2 ld s5,8(sp) + ae8: 6b02 ld s6,0(sp) + aea: b7f5 j ad6 diff --git a/user/ls.c b/G12_Project1_xv6CustomizeSystemCalls/user/ls.c similarity index 100% rename from user/ls.c rename to G12_Project1_xv6CustomizeSystemCalls/user/ls.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ls.d b/G12_Project1_xv6CustomizeSystemCalls/user/ls.d new file mode 100644 index 0000000000..7dddf9b1f6 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/ls.d @@ -0,0 +1,2 @@ +user/ls.o: user/ls.c kernel/types.h kernel/stat.h user/user.h kernel/fs.h \ + kernel/fcntl.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ls.o b/G12_Project1_xv6CustomizeSystemCalls/user/ls.o new file mode 100644 index 0000000000..be73a1739c Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/ls.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ls.sym b/G12_Project1_xv6CustomizeSystemCalls/user/ls.sym new file mode 100644 index 0000000000..6772306fd1 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/ls.sym @@ -0,0 +1,71 @@ +0000000000000000 .text +0000000000000af0 .rodata +0000000000000b70 .eh_frame +0000000000002000 .data +0000000000002000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 ls.c +0000000000002010 buf.0 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000005b8 putc +00000000000005d6 printint +0000000000000b58 digits +0000000000000000 umalloc.c +0000000000002000 freep +0000000000002020 base +000000000000027c strcpy +0000000000000000 fmtname +0000000000000590 pause +0000000000000940 printf +0000000000000588 sys_sbrk +0000000000000426 memmove +0000000000000548 mknod +0000000000000334 gets +0000000000000580 getpid +00000000000004b8 memcpy +00000000000009f4 malloc +00000000000004e2 sbrklazy +0000000000000510 pipe +0000000000000520 write +0000000000000558 fstat +0000000000000916 fprintf +0000000000000530 kill +0000000000000672 vprintf +0000000000000570 chdir +0000000000000538 exec +0000000000000508 wait +00000000000005a0 getprocsinfo +0000000000000518 read +0000000000000550 unlink +000000000000047e memcmp +00000000000004f8 fork +00000000000004cc sbrk +0000000000000598 uptime +00000000000002ee memset +000000000000021e main +00000000000005a8 getppid +0000000000000298 strcmp +0000000000000578 dup +00000000000003a4 stat +00000000000005b0 sleep2 +0000000000000560 link +000000000000009c ls +0000000000000500 exit +000000000000026c start +00000000000003de atoi +00000000000002c4 strlen +0000000000000540 open +0000000000000310 strchr +0000000000000568 mkdir +0000000000000528 close +0000000000000972 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.asm b/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.asm new file mode 100644 index 0000000000..a6fd20cca1 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.asm @@ -0,0 +1,1539 @@ + +user/_mkdir: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/stat.h" +#include "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: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + 8: 4785 li a5,1 + a: 02a7d763 bge a5,a0,38 + e: e426 sd s1,8(sp) + 10: e04a sd s2,0(sp) + 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: mkdir files...\n"); + exit(1); + } + + for(i = 1; i < argc; i++){ + if(mkdir(argv[i]) < 0){ + 26: 6088 ld a0,0(s1) + 28: 33a000ef jal 362 + 2c: 02054263 bltz a0,50 + for(i = 1; i < argc; i++){ + 30: 04a1 addi s1,s1,8 + 32: ff249ae3 bne s1,s2,26 + 36: a02d j 60 + 38: e426 sd s1,8(sp) + 3a: e04a sd s2,0(sp) + fprintf(2, "Usage: mkdir files...\n"); + 3c: 00001597 auipc a1,0x1 + 40: 8b458593 addi a1,a1,-1868 # 8f0 + 44: 4509 li a0,2 + 46: 6ca000ef jal 710 + exit(1); + 4a: 4505 li a0,1 + 4c: 2ae000ef jal 2fa + fprintf(2, "mkdir: %s failed to create\n", argv[i]); + 50: 6090 ld a2,0(s1) + 52: 00001597 auipc a1,0x1 + 56: 8b658593 addi a1,a1,-1866 # 908 + 5a: 4509 li a0,2 + 5c: 6b4000ef jal 710 + break; + } + } + + exit(0); + 60: 4501 li a0,0 + 62: 298000ef jal 2fa + +0000000000000066 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 66: 1141 addi sp,sp,-16 + 68: e406 sd ra,8(sp) + 6a: e022 sd s0,0(sp) + 6c: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 6e: f93ff0ef jal 0
+ exit(r); + 72: 288000ef jal 2fa + +0000000000000076 : +} + +char* +strcpy(char *s, const char *t) +{ + 76: 1141 addi sp,sp,-16 + 78: e422 sd s0,8(sp) + 7a: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 7c: 87aa mv a5,a0 + 7e: 0585 addi a1,a1,1 + 80: 0785 addi a5,a5,1 + 82: fff5c703 lbu a4,-1(a1) + 86: fee78fa3 sb a4,-1(a5) + 8a: fb75 bnez a4,7e + ; + return os; +} + 8c: 6422 ld s0,8(sp) + 8e: 0141 addi sp,sp,16 + 90: 8082 ret + +0000000000000092 : + +int +strcmp(const char *p, const char *q) +{ + 92: 1141 addi sp,sp,-16 + 94: e422 sd s0,8(sp) + 96: 0800 addi s0,sp,16 + while(*p && *p == *q) + 98: 00054783 lbu a5,0(a0) + 9c: cb91 beqz a5,b0 + 9e: 0005c703 lbu a4,0(a1) + a2: 00f71763 bne a4,a5,b0 + p++, q++; + a6: 0505 addi a0,a0,1 + a8: 0585 addi a1,a1,1 + while(*p && *p == *q) + aa: 00054783 lbu a5,0(a0) + ae: fbe5 bnez a5,9e + return (uchar)*p - (uchar)*q; + b0: 0005c503 lbu a0,0(a1) +} + b4: 40a7853b subw a0,a5,a0 + b8: 6422 ld s0,8(sp) + ba: 0141 addi sp,sp,16 + bc: 8082 ret + +00000000000000be : + +uint +strlen(const char *s) +{ + be: 1141 addi sp,sp,-16 + c0: e422 sd s0,8(sp) + c2: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + c4: 00054783 lbu a5,0(a0) + c8: cf91 beqz a5,e4 + ca: 0505 addi a0,a0,1 + cc: 87aa mv a5,a0 + ce: 86be mv a3,a5 + d0: 0785 addi a5,a5,1 + d2: fff7c703 lbu a4,-1(a5) + d6: ff65 bnez a4,ce + d8: 40a6853b subw a0,a3,a0 + dc: 2505 addiw a0,a0,1 + ; + return n; +} + de: 6422 ld s0,8(sp) + e0: 0141 addi sp,sp,16 + e2: 8082 ret + for(n = 0; s[n]; n++) + e4: 4501 li a0,0 + e6: bfe5 j de + +00000000000000e8 : + +void* +memset(void *dst, int c, uint n) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + ee: ca19 beqz a2,104 + f0: 87aa mv a5,a0 + f2: 1602 slli a2,a2,0x20 + f4: 9201 srli a2,a2,0x20 + f6: 00a60733 add a4,a2,a0 + cdst[i] = c; + fa: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + fe: 0785 addi a5,a5,1 + 100: fee79de3 bne a5,a4,fa + } + return dst; +} + 104: 6422 ld s0,8(sp) + 106: 0141 addi sp,sp,16 + 108: 8082 ret + +000000000000010a : + +char* +strchr(const char *s, char c) +{ + 10a: 1141 addi sp,sp,-16 + 10c: e422 sd s0,8(sp) + 10e: 0800 addi s0,sp,16 + for(; *s; s++) + 110: 00054783 lbu a5,0(a0) + 114: cb99 beqz a5,12a + if(*s == c) + 116: 00f58763 beq a1,a5,124 + for(; *s; s++) + 11a: 0505 addi a0,a0,1 + 11c: 00054783 lbu a5,0(a0) + 120: fbfd bnez a5,116 + return (char*)s; + return 0; + 122: 4501 li a0,0 +} + 124: 6422 ld s0,8(sp) + 126: 0141 addi sp,sp,16 + 128: 8082 ret + return 0; + 12a: 4501 li a0,0 + 12c: bfe5 j 124 + +000000000000012e : + +char* +gets(char *buf, int max) +{ + 12e: 711d addi sp,sp,-96 + 130: ec86 sd ra,88(sp) + 132: e8a2 sd s0,80(sp) + 134: e4a6 sd s1,72(sp) + 136: e0ca sd s2,64(sp) + 138: fc4e sd s3,56(sp) + 13a: f852 sd s4,48(sp) + 13c: f456 sd s5,40(sp) + 13e: f05a sd s6,32(sp) + 140: ec5e sd s7,24(sp) + 142: 1080 addi s0,sp,96 + 144: 8baa mv s7,a0 + 146: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 148: 892a mv s2,a0 + 14a: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 14c: 4aa9 li s5,10 + 14e: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 150: 89a6 mv s3,s1 + 152: 2485 addiw s1,s1,1 + 154: 0344d663 bge s1,s4,180 + cc = read(0, &c, 1); + 158: 4605 li a2,1 + 15a: faf40593 addi a1,s0,-81 + 15e: 4501 li a0,0 + 160: 1b2000ef jal 312 + if(cc < 1) + 164: 00a05e63 blez a0,180 + buf[i++] = c; + 168: faf44783 lbu a5,-81(s0) + 16c: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 170: 01578763 beq a5,s5,17e + 174: 0905 addi s2,s2,1 + 176: fd679de3 bne a5,s6,150 + buf[i++] = c; + 17a: 89a6 mv s3,s1 + 17c: a011 j 180 + 17e: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 180: 99de add s3,s3,s7 + 182: 00098023 sb zero,0(s3) + return buf; +} + 186: 855e mv a0,s7 + 188: 60e6 ld ra,88(sp) + 18a: 6446 ld s0,80(sp) + 18c: 64a6 ld s1,72(sp) + 18e: 6906 ld s2,64(sp) + 190: 79e2 ld s3,56(sp) + 192: 7a42 ld s4,48(sp) + 194: 7aa2 ld s5,40(sp) + 196: 7b02 ld s6,32(sp) + 198: 6be2 ld s7,24(sp) + 19a: 6125 addi sp,sp,96 + 19c: 8082 ret + +000000000000019e : + +int +stat(const char *n, struct stat *st) +{ + 19e: 1101 addi sp,sp,-32 + 1a0: ec06 sd ra,24(sp) + 1a2: e822 sd s0,16(sp) + 1a4: e04a sd s2,0(sp) + 1a6: 1000 addi s0,sp,32 + 1a8: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1aa: 4581 li a1,0 + 1ac: 18e000ef jal 33a + if(fd < 0) + 1b0: 02054263 bltz a0,1d4 + 1b4: e426 sd s1,8(sp) + 1b6: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1b8: 85ca mv a1,s2 + 1ba: 198000ef jal 352 + 1be: 892a mv s2,a0 + close(fd); + 1c0: 8526 mv a0,s1 + 1c2: 160000ef jal 322 + return r; + 1c6: 64a2 ld s1,8(sp) +} + 1c8: 854a mv a0,s2 + 1ca: 60e2 ld ra,24(sp) + 1cc: 6442 ld s0,16(sp) + 1ce: 6902 ld s2,0(sp) + 1d0: 6105 addi sp,sp,32 + 1d2: 8082 ret + return -1; + 1d4: 597d li s2,-1 + 1d6: bfcd j 1c8 + +00000000000001d8 : + +int +atoi(const char *s) +{ + 1d8: 1141 addi sp,sp,-16 + 1da: e422 sd s0,8(sp) + 1dc: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1de: 00054683 lbu a3,0(a0) + 1e2: fd06879b addiw a5,a3,-48 + 1e6: 0ff7f793 zext.b a5,a5 + 1ea: 4625 li a2,9 + 1ec: 02f66863 bltu a2,a5,21c + 1f0: 872a mv a4,a0 + n = 0; + 1f2: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1f4: 0705 addi a4,a4,1 + 1f6: 0025179b slliw a5,a0,0x2 + 1fa: 9fa9 addw a5,a5,a0 + 1fc: 0017979b slliw a5,a5,0x1 + 200: 9fb5 addw a5,a5,a3 + 202: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 206: 00074683 lbu a3,0(a4) + 20a: fd06879b addiw a5,a3,-48 + 20e: 0ff7f793 zext.b a5,a5 + 212: fef671e3 bgeu a2,a5,1f4 + return n; +} + 216: 6422 ld s0,8(sp) + 218: 0141 addi sp,sp,16 + 21a: 8082 ret + n = 0; + 21c: 4501 li a0,0 + 21e: bfe5 j 216 + +0000000000000220 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 220: 1141 addi sp,sp,-16 + 222: e422 sd s0,8(sp) + 224: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 226: 02b57463 bgeu a0,a1,24e + while(n-- > 0) + 22a: 00c05f63 blez a2,248 + 22e: 1602 slli a2,a2,0x20 + 230: 9201 srli a2,a2,0x20 + 232: 00c507b3 add a5,a0,a2 + dst = vdst; + 236: 872a mv a4,a0 + *dst++ = *src++; + 238: 0585 addi a1,a1,1 + 23a: 0705 addi a4,a4,1 + 23c: fff5c683 lbu a3,-1(a1) + 240: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 244: fef71ae3 bne a4,a5,238 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 248: 6422 ld s0,8(sp) + 24a: 0141 addi sp,sp,16 + 24c: 8082 ret + dst += n; + 24e: 00c50733 add a4,a0,a2 + src += n; + 252: 95b2 add a1,a1,a2 + while(n-- > 0) + 254: fec05ae3 blez a2,248 + 258: fff6079b addiw a5,a2,-1 + 25c: 1782 slli a5,a5,0x20 + 25e: 9381 srli a5,a5,0x20 + 260: fff7c793 not a5,a5 + 264: 97ba add a5,a5,a4 + *--dst = *--src; + 266: 15fd addi a1,a1,-1 + 268: 177d addi a4,a4,-1 + 26a: 0005c683 lbu a3,0(a1) + 26e: 00d70023 sb a3,0(a4) + while(n-- > 0) + 272: fee79ae3 bne a5,a4,266 + 276: bfc9 j 248 + +0000000000000278 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 278: 1141 addi sp,sp,-16 + 27a: e422 sd s0,8(sp) + 27c: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 27e: ca05 beqz a2,2ae + 280: fff6069b addiw a3,a2,-1 + 284: 1682 slli a3,a3,0x20 + 286: 9281 srli a3,a3,0x20 + 288: 0685 addi a3,a3,1 + 28a: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 28c: 00054783 lbu a5,0(a0) + 290: 0005c703 lbu a4,0(a1) + 294: 00e79863 bne a5,a4,2a4 + return *p1 - *p2; + } + p1++; + 298: 0505 addi a0,a0,1 + p2++; + 29a: 0585 addi a1,a1,1 + while (n-- > 0) { + 29c: fed518e3 bne a0,a3,28c + } + return 0; + 2a0: 4501 li a0,0 + 2a2: a019 j 2a8 + return *p1 - *p2; + 2a4: 40e7853b subw a0,a5,a4 +} + 2a8: 6422 ld s0,8(sp) + 2aa: 0141 addi sp,sp,16 + 2ac: 8082 ret + return 0; + 2ae: 4501 li a0,0 + 2b0: bfe5 j 2a8 + +00000000000002b2 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2b2: 1141 addi sp,sp,-16 + 2b4: e406 sd ra,8(sp) + 2b6: e022 sd s0,0(sp) + 2b8: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2ba: f67ff0ef jal 220 +} + 2be: 60a2 ld ra,8(sp) + 2c0: 6402 ld s0,0(sp) + 2c2: 0141 addi sp,sp,16 + 2c4: 8082 ret + +00000000000002c6 : + +char * +sbrk(int n) { + 2c6: 1141 addi sp,sp,-16 + 2c8: e406 sd ra,8(sp) + 2ca: e022 sd s0,0(sp) + 2cc: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2ce: 4585 li a1,1 + 2d0: 0b2000ef jal 382 +} + 2d4: 60a2 ld ra,8(sp) + 2d6: 6402 ld s0,0(sp) + 2d8: 0141 addi sp,sp,16 + 2da: 8082 ret + +00000000000002dc : + +char * +sbrklazy(int n) { + 2dc: 1141 addi sp,sp,-16 + 2de: e406 sd ra,8(sp) + 2e0: e022 sd s0,0(sp) + 2e2: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2e4: 4589 li a1,2 + 2e6: 09c000ef jal 382 +} + 2ea: 60a2 ld ra,8(sp) + 2ec: 6402 ld s0,0(sp) + 2ee: 0141 addi sp,sp,16 + 2f0: 8082 ret + +00000000000002f2 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2f2: 4885 li a7,1 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa : +.global exit +exit: + li a7, SYS_exit + 2fa: 4889 li a7,2 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 : +.global wait +wait: + li a7, SYS_wait + 302: 488d li a7,3 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a : +.global pipe +pipe: + li a7, SYS_pipe + 30a: 4891 li a7,4 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 : +.global read +read: + li a7, SYS_read + 312: 4895 li a7,5 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a : +.global write +write: + li a7, SYS_write + 31a: 48c1 li a7,16 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 : +.global close +close: + li a7, SYS_close + 322: 48d5 li a7,21 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a : +.global kill +kill: + li a7, SYS_kill + 32a: 4899 li a7,6 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 : +.global exec +exec: + li a7, SYS_exec + 332: 489d li a7,7 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a : +.global open +open: + li a7, SYS_open + 33a: 48bd li a7,15 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 : +.global mknod +mknod: + li a7, SYS_mknod + 342: 48c5 li a7,17 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a : +.global unlink +unlink: + li a7, SYS_unlink + 34a: 48c9 li a7,18 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 : +.global fstat +fstat: + li a7, SYS_fstat + 352: 48a1 li a7,8 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a : +.global link +link: + li a7, SYS_link + 35a: 48cd li a7,19 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 362: 48d1 li a7,20 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : +.global chdir +chdir: + li a7, SYS_chdir + 36a: 48a5 li a7,9 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 : +.global dup +dup: + li a7, SYS_dup + 372: 48a9 li a7,10 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a : +.global getpid +getpid: + li a7, SYS_getpid + 37a: 48ad li a7,11 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 382: 48b1 li a7,12 + ecall + 384: 00000073 ecall + ret + 388: 8082 ret + +000000000000038a : +.global pause +pause: + li a7, SYS_pause + 38a: 48b5 li a7,13 + ecall + 38c: 00000073 ecall + ret + 390: 8082 ret + +0000000000000392 : +.global uptime +uptime: + li a7, SYS_uptime + 392: 48b9 li a7,14 + ecall + 394: 00000073 ecall + ret + 398: 8082 ret + +000000000000039a : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 39a: 48d9 li a7,22 + ecall + 39c: 00000073 ecall + ret + 3a0: 8082 ret + +00000000000003a2 : +.global getppid +getppid: + li a7, SYS_getppid + 3a2: 48dd li a7,23 + ecall + 3a4: 00000073 ecall + ret + 3a8: 8082 ret + +00000000000003aa : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 3aa: 48e1 li a7,24 + ecall + 3ac: 00000073 ecall + ret + 3b0: 8082 ret + +00000000000003b2 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3b2: 1101 addi sp,sp,-32 + 3b4: ec06 sd ra,24(sp) + 3b6: e822 sd s0,16(sp) + 3b8: 1000 addi s0,sp,32 + 3ba: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3be: 4605 li a2,1 + 3c0: fef40593 addi a1,s0,-17 + 3c4: f57ff0ef jal 31a +} + 3c8: 60e2 ld ra,24(sp) + 3ca: 6442 ld s0,16(sp) + 3cc: 6105 addi sp,sp,32 + 3ce: 8082 ret + +00000000000003d0 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3d0: 715d addi sp,sp,-80 + 3d2: e486 sd ra,72(sp) + 3d4: e0a2 sd s0,64(sp) + 3d6: f84a sd s2,48(sp) + 3d8: 0880 addi s0,sp,80 + 3da: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3dc: c299 beqz a3,3e2 + 3de: 0805c363 bltz a1,464 + neg = 0; + 3e2: 4881 li a7,0 + 3e4: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3e8: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3ea: 00000517 auipc a0,0x0 + 3ee: 54650513 addi a0,a0,1350 # 930 + 3f2: 883e mv a6,a5 + 3f4: 2785 addiw a5,a5,1 + 3f6: 02c5f733 remu a4,a1,a2 + 3fa: 972a add a4,a4,a0 + 3fc: 00074703 lbu a4,0(a4) + 400: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 404: 872e mv a4,a1 + 406: 02c5d5b3 divu a1,a1,a2 + 40a: 0685 addi a3,a3,1 + 40c: fec773e3 bgeu a4,a2,3f2 + if(neg) + 410: 00088b63 beqz a7,426 + buf[i++] = '-'; + 414: fd078793 addi a5,a5,-48 + 418: 97a2 add a5,a5,s0 + 41a: 02d00713 li a4,45 + 41e: fee78423 sb a4,-24(a5) + 422: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 426: 02f05a63 blez a5,45a + 42a: fc26 sd s1,56(sp) + 42c: f44e sd s3,40(sp) + 42e: fb840713 addi a4,s0,-72 + 432: 00f704b3 add s1,a4,a5 + 436: fff70993 addi s3,a4,-1 + 43a: 99be add s3,s3,a5 + 43c: 37fd addiw a5,a5,-1 + 43e: 1782 slli a5,a5,0x20 + 440: 9381 srli a5,a5,0x20 + 442: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 446: fff4c583 lbu a1,-1(s1) + 44a: 854a mv a0,s2 + 44c: f67ff0ef jal 3b2 + while(--i >= 0) + 450: 14fd addi s1,s1,-1 + 452: ff349ae3 bne s1,s3,446 + 456: 74e2 ld s1,56(sp) + 458: 79a2 ld s3,40(sp) +} + 45a: 60a6 ld ra,72(sp) + 45c: 6406 ld s0,64(sp) + 45e: 7942 ld s2,48(sp) + 460: 6161 addi sp,sp,80 + 462: 8082 ret + x = -xx; + 464: 40b005b3 neg a1,a1 + neg = 1; + 468: 4885 li a7,1 + x = -xx; + 46a: bfad j 3e4 + +000000000000046c : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 46c: 711d addi sp,sp,-96 + 46e: ec86 sd ra,88(sp) + 470: e8a2 sd s0,80(sp) + 472: e0ca sd s2,64(sp) + 474: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 476: 0005c903 lbu s2,0(a1) + 47a: 28090663 beqz s2,706 + 47e: e4a6 sd s1,72(sp) + 480: fc4e sd s3,56(sp) + 482: f852 sd s4,48(sp) + 484: f456 sd s5,40(sp) + 486: f05a sd s6,32(sp) + 488: ec5e sd s7,24(sp) + 48a: e862 sd s8,16(sp) + 48c: e466 sd s9,8(sp) + 48e: 8b2a mv s6,a0 + 490: 8a2e mv s4,a1 + 492: 8bb2 mv s7,a2 + state = 0; + 494: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 496: 4481 li s1,0 + 498: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 49a: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 49e: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4a2: 06c00c93 li s9,108 + 4a6: a005 j 4c6 + putc(fd, c0); + 4a8: 85ca mv a1,s2 + 4aa: 855a mv a0,s6 + 4ac: f07ff0ef jal 3b2 + 4b0: a019 j 4b6 + } else if(state == '%'){ + 4b2: 03598263 beq s3,s5,4d6 + for(i = 0; fmt[i]; i++){ + 4b6: 2485 addiw s1,s1,1 + 4b8: 8726 mv a4,s1 + 4ba: 009a07b3 add a5,s4,s1 + 4be: 0007c903 lbu s2,0(a5) + 4c2: 22090a63 beqz s2,6f6 + c0 = fmt[i] & 0xff; + 4c6: 0009079b sext.w a5,s2 + if(state == 0){ + 4ca: fe0994e3 bnez s3,4b2 + if(c0 == '%'){ + 4ce: fd579de3 bne a5,s5,4a8 + state = '%'; + 4d2: 89be mv s3,a5 + 4d4: b7cd j 4b6 + if(c0) c1 = fmt[i+1] & 0xff; + 4d6: 00ea06b3 add a3,s4,a4 + 4da: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4de: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4e0: c681 beqz a3,4e8 + 4e2: 9752 add a4,a4,s4 + 4e4: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4e8: 05878363 beq a5,s8,52e + } else if(c0 == 'l' && c1 == 'd'){ + 4ec: 05978d63 beq a5,s9,546 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4f0: 07500713 li a4,117 + 4f4: 0ee78763 beq a5,a4,5e2 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4f8: 07800713 li a4,120 + 4fc: 12e78963 beq a5,a4,62e + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 500: 07000713 li a4,112 + 504: 14e78e63 beq a5,a4,660 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 508: 06300713 li a4,99 + 50c: 18e78e63 beq a5,a4,6a8 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 510: 07300713 li a4,115 + 514: 1ae78463 beq a5,a4,6bc + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 518: 02500713 li a4,37 + 51c: 04e79563 bne a5,a4,566 + putc(fd, '%'); + 520: 02500593 li a1,37 + 524: 855a mv a0,s6 + 526: e8dff0ef jal 3b2 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 52a: 4981 li s3,0 + 52c: b769 j 4b6 + printint(fd, va_arg(ap, int), 10, 1); + 52e: 008b8913 addi s2,s7,8 + 532: 4685 li a3,1 + 534: 4629 li a2,10 + 536: 000ba583 lw a1,0(s7) + 53a: 855a mv a0,s6 + 53c: e95ff0ef jal 3d0 + 540: 8bca mv s7,s2 + state = 0; + 542: 4981 li s3,0 + 544: bf8d j 4b6 + } else if(c0 == 'l' && c1 == 'd'){ + 546: 06400793 li a5,100 + 54a: 02f68963 beq a3,a5,57c + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 54e: 06c00793 li a5,108 + 552: 04f68263 beq a3,a5,596 + } else if(c0 == 'l' && c1 == 'u'){ + 556: 07500793 li a5,117 + 55a: 0af68063 beq a3,a5,5fa + } else if(c0 == 'l' && c1 == 'x'){ + 55e: 07800793 li a5,120 + 562: 0ef68263 beq a3,a5,646 + putc(fd, '%'); + 566: 02500593 li a1,37 + 56a: 855a mv a0,s6 + 56c: e47ff0ef jal 3b2 + putc(fd, c0); + 570: 85ca mv a1,s2 + 572: 855a mv a0,s6 + 574: e3fff0ef jal 3b2 + state = 0; + 578: 4981 li s3,0 + 57a: bf35 j 4b6 + printint(fd, va_arg(ap, uint64), 10, 1); + 57c: 008b8913 addi s2,s7,8 + 580: 4685 li a3,1 + 582: 4629 li a2,10 + 584: 000bb583 ld a1,0(s7) + 588: 855a mv a0,s6 + 58a: e47ff0ef jal 3d0 + i += 1; + 58e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 590: 8bca mv s7,s2 + state = 0; + 592: 4981 li s3,0 + i += 1; + 594: b70d j 4b6 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 596: 06400793 li a5,100 + 59a: 02f60763 beq a2,a5,5c8 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 59e: 07500793 li a5,117 + 5a2: 06f60963 beq a2,a5,614 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5a6: 07800793 li a5,120 + 5aa: faf61ee3 bne a2,a5,566 + printint(fd, va_arg(ap, uint64), 16, 0); + 5ae: 008b8913 addi s2,s7,8 + 5b2: 4681 li a3,0 + 5b4: 4641 li a2,16 + 5b6: 000bb583 ld a1,0(s7) + 5ba: 855a mv a0,s6 + 5bc: e15ff0ef jal 3d0 + i += 2; + 5c0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5c2: 8bca mv s7,s2 + state = 0; + 5c4: 4981 li s3,0 + i += 2; + 5c6: bdc5 j 4b6 + printint(fd, va_arg(ap, uint64), 10, 1); + 5c8: 008b8913 addi s2,s7,8 + 5cc: 4685 li a3,1 + 5ce: 4629 li a2,10 + 5d0: 000bb583 ld a1,0(s7) + 5d4: 855a mv a0,s6 + 5d6: dfbff0ef jal 3d0 + i += 2; + 5da: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5dc: 8bca mv s7,s2 + state = 0; + 5de: 4981 li s3,0 + i += 2; + 5e0: bdd9 j 4b6 + printint(fd, va_arg(ap, uint32), 10, 0); + 5e2: 008b8913 addi s2,s7,8 + 5e6: 4681 li a3,0 + 5e8: 4629 li a2,10 + 5ea: 000be583 lwu a1,0(s7) + 5ee: 855a mv a0,s6 + 5f0: de1ff0ef jal 3d0 + 5f4: 8bca mv s7,s2 + state = 0; + 5f6: 4981 li s3,0 + 5f8: bd7d j 4b6 + printint(fd, va_arg(ap, uint64), 10, 0); + 5fa: 008b8913 addi s2,s7,8 + 5fe: 4681 li a3,0 + 600: 4629 li a2,10 + 602: 000bb583 ld a1,0(s7) + 606: 855a mv a0,s6 + 608: dc9ff0ef jal 3d0 + i += 1; + 60c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 60e: 8bca mv s7,s2 + state = 0; + 610: 4981 li s3,0 + i += 1; + 612: b555 j 4b6 + printint(fd, va_arg(ap, uint64), 10, 0); + 614: 008b8913 addi s2,s7,8 + 618: 4681 li a3,0 + 61a: 4629 li a2,10 + 61c: 000bb583 ld a1,0(s7) + 620: 855a mv a0,s6 + 622: dafff0ef jal 3d0 + i += 2; + 626: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 628: 8bca mv s7,s2 + state = 0; + 62a: 4981 li s3,0 + i += 2; + 62c: b569 j 4b6 + printint(fd, va_arg(ap, uint32), 16, 0); + 62e: 008b8913 addi s2,s7,8 + 632: 4681 li a3,0 + 634: 4641 li a2,16 + 636: 000be583 lwu a1,0(s7) + 63a: 855a mv a0,s6 + 63c: d95ff0ef jal 3d0 + 640: 8bca mv s7,s2 + state = 0; + 642: 4981 li s3,0 + 644: bd8d j 4b6 + printint(fd, va_arg(ap, uint64), 16, 0); + 646: 008b8913 addi s2,s7,8 + 64a: 4681 li a3,0 + 64c: 4641 li a2,16 + 64e: 000bb583 ld a1,0(s7) + 652: 855a mv a0,s6 + 654: d7dff0ef jal 3d0 + i += 1; + 658: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 65a: 8bca mv s7,s2 + state = 0; + 65c: 4981 li s3,0 + i += 1; + 65e: bda1 j 4b6 + 660: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 662: 008b8d13 addi s10,s7,8 + 666: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 66a: 03000593 li a1,48 + 66e: 855a mv a0,s6 + 670: d43ff0ef jal 3b2 + putc(fd, 'x'); + 674: 07800593 li a1,120 + 678: 855a mv a0,s6 + 67a: d39ff0ef jal 3b2 + 67e: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 680: 00000b97 auipc s7,0x0 + 684: 2b0b8b93 addi s7,s7,688 # 930 + 688: 03c9d793 srli a5,s3,0x3c + 68c: 97de add a5,a5,s7 + 68e: 0007c583 lbu a1,0(a5) + 692: 855a mv a0,s6 + 694: d1fff0ef jal 3b2 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 698: 0992 slli s3,s3,0x4 + 69a: 397d addiw s2,s2,-1 + 69c: fe0916e3 bnez s2,688 + printptr(fd, va_arg(ap, uint64)); + 6a0: 8bea mv s7,s10 + state = 0; + 6a2: 4981 li s3,0 + 6a4: 6d02 ld s10,0(sp) + 6a6: bd01 j 4b6 + putc(fd, va_arg(ap, uint32)); + 6a8: 008b8913 addi s2,s7,8 + 6ac: 000bc583 lbu a1,0(s7) + 6b0: 855a mv a0,s6 + 6b2: d01ff0ef jal 3b2 + 6b6: 8bca mv s7,s2 + state = 0; + 6b8: 4981 li s3,0 + 6ba: bbf5 j 4b6 + if((s = va_arg(ap, char*)) == 0) + 6bc: 008b8993 addi s3,s7,8 + 6c0: 000bb903 ld s2,0(s7) + 6c4: 00090f63 beqz s2,6e2 + for(; *s; s++) + 6c8: 00094583 lbu a1,0(s2) + 6cc: c195 beqz a1,6f0 + putc(fd, *s); + 6ce: 855a mv a0,s6 + 6d0: ce3ff0ef jal 3b2 + for(; *s; s++) + 6d4: 0905 addi s2,s2,1 + 6d6: 00094583 lbu a1,0(s2) + 6da: f9f5 bnez a1,6ce + if((s = va_arg(ap, char*)) == 0) + 6dc: 8bce mv s7,s3 + state = 0; + 6de: 4981 li s3,0 + 6e0: bbd9 j 4b6 + s = "(null)"; + 6e2: 00000917 auipc s2,0x0 + 6e6: 24690913 addi s2,s2,582 # 928 + for(; *s; s++) + 6ea: 02800593 li a1,40 + 6ee: b7c5 j 6ce + if((s = va_arg(ap, char*)) == 0) + 6f0: 8bce mv s7,s3 + state = 0; + 6f2: 4981 li s3,0 + 6f4: b3c9 j 4b6 + 6f6: 64a6 ld s1,72(sp) + 6f8: 79e2 ld s3,56(sp) + 6fa: 7a42 ld s4,48(sp) + 6fc: 7aa2 ld s5,40(sp) + 6fe: 7b02 ld s6,32(sp) + 700: 6be2 ld s7,24(sp) + 702: 6c42 ld s8,16(sp) + 704: 6ca2 ld s9,8(sp) + } + } +} + 706: 60e6 ld ra,88(sp) + 708: 6446 ld s0,80(sp) + 70a: 6906 ld s2,64(sp) + 70c: 6125 addi sp,sp,96 + 70e: 8082 ret + +0000000000000710 : + +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: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 72c: 8622 mv a2,s0 + 72e: d3fff0ef jal 46c +} + 732: 60e2 ld ra,24(sp) + 734: 6442 ld s0,16(sp) + 736: 6161 addi sp,sp,80 + 738: 8082 ret + +000000000000073a : + +void +printf(const char *fmt, ...) +{ + 73a: 711d addi sp,sp,-96 + 73c: ec06 sd ra,24(sp) + 73e: e822 sd s0,16(sp) + 740: 1000 addi s0,sp,32 + 742: e40c sd a1,8(s0) + 744: e810 sd a2,16(s0) + 746: ec14 sd a3,24(s0) + 748: f018 sd a4,32(s0) + 74a: f41c sd a5,40(s0) + 74c: 03043823 sd a6,48(s0) + 750: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 754: 00840613 addi a2,s0,8 + 758: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 75c: 85aa mv a1,a0 + 75e: 4505 li a0,1 + 760: d0dff0ef jal 46c +} + 764: 60e2 ld ra,24(sp) + 766: 6442 ld s0,16(sp) + 768: 6125 addi sp,sp,96 + 76a: 8082 ret + +000000000000076c : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 76c: 1141 addi sp,sp,-16 + 76e: e422 sd s0,8(sp) + 770: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 772: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 776: 00001797 auipc a5,0x1 + 77a: 88a7b783 ld a5,-1910(a5) # 1000 + 77e: a02d j 7a8 + 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; + 780: 4618 lw a4,8(a2) + 782: 9f2d addw a4,a4,a1 + 784: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 788: 6398 ld a4,0(a5) + 78a: 6310 ld a2,0(a4) + 78c: a83d j 7ca + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 78e: ff852703 lw a4,-8(a0) + 792: 9f31 addw a4,a4,a2 + 794: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 796: ff053683 ld a3,-16(a0) + 79a: a091 j 7de + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 79c: 6398 ld a4,0(a5) + 79e: 00e7e463 bltu a5,a4,7a6 + 7a2: 00e6ea63 bltu a3,a4,7b6 +{ + 7a6: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7a8: fed7fae3 bgeu a5,a3,79c + 7ac: 6398 ld a4,0(a5) + 7ae: 00e6e463 bltu a3,a4,7b6 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7b2: fee7eae3 bltu a5,a4,7a6 + if(bp + bp->s.size == p->s.ptr){ + 7b6: ff852583 lw a1,-8(a0) + 7ba: 6390 ld a2,0(a5) + 7bc: 02059813 slli a6,a1,0x20 + 7c0: 01c85713 srli a4,a6,0x1c + 7c4: 9736 add a4,a4,a3 + 7c6: fae60de3 beq a2,a4,780 + bp->s.ptr = p->s.ptr->s.ptr; + 7ca: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7ce: 4790 lw a2,8(a5) + 7d0: 02061593 slli a1,a2,0x20 + 7d4: 01c5d713 srli a4,a1,0x1c + 7d8: 973e add a4,a4,a5 + 7da: fae68ae3 beq a3,a4,78e + p->s.ptr = bp->s.ptr; + 7de: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7e0: 00001717 auipc a4,0x1 + 7e4: 82f73023 sd a5,-2016(a4) # 1000 +} + 7e8: 6422 ld s0,8(sp) + 7ea: 0141 addi sp,sp,16 + 7ec: 8082 ret + +00000000000007ee : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7ee: 7139 addi sp,sp,-64 + 7f0: fc06 sd ra,56(sp) + 7f2: f822 sd s0,48(sp) + 7f4: f426 sd s1,40(sp) + 7f6: ec4e sd s3,24(sp) + 7f8: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7fa: 02051493 slli s1,a0,0x20 + 7fe: 9081 srli s1,s1,0x20 + 800: 04bd addi s1,s1,15 + 802: 8091 srli s1,s1,0x4 + 804: 0014899b addiw s3,s1,1 + 808: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 80a: 00000517 auipc a0,0x0 + 80e: 7f653503 ld a0,2038(a0) # 1000 + 812: c915 beqz a0,846 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 814: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 816: 4798 lw a4,8(a5) + 818: 08977a63 bgeu a4,s1,8ac + 81c: f04a sd s2,32(sp) + 81e: e852 sd s4,16(sp) + 820: e456 sd s5,8(sp) + 822: e05a sd s6,0(sp) + if(nu < 4096) + 824: 8a4e mv s4,s3 + 826: 0009871b sext.w a4,s3 + 82a: 6685 lui a3,0x1 + 82c: 00d77363 bgeu a4,a3,832 + 830: 6a05 lui s4,0x1 + 832: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 836: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 83a: 00000917 auipc s2,0x0 + 83e: 7c690913 addi s2,s2,1990 # 1000 + if(p == SBRK_ERROR) + 842: 5afd li s5,-1 + 844: a081 j 884 + 846: f04a sd s2,32(sp) + 848: e852 sd s4,16(sp) + 84a: e456 sd s5,8(sp) + 84c: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 84e: 00000797 auipc a5,0x0 + 852: 7c278793 addi a5,a5,1986 # 1010 + 856: 00000717 auipc a4,0x0 + 85a: 7af73523 sd a5,1962(a4) # 1000 + 85e: e39c sd a5,0(a5) + base.s.size = 0; + 860: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 864: b7c1 j 824 + prevp->s.ptr = p->s.ptr; + 866: 6398 ld a4,0(a5) + 868: e118 sd a4,0(a0) + 86a: a8a9 j 8c4 + hp->s.size = nu; + 86c: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 870: 0541 addi a0,a0,16 + 872: efbff0ef jal 76c + return freep; + 876: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 87a: c12d beqz a0,8dc + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 87c: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 87e: 4798 lw a4,8(a5) + 880: 02977263 bgeu a4,s1,8a4 + if(p == freep) + 884: 00093703 ld a4,0(s2) + 888: 853e mv a0,a5 + 88a: fef719e3 bne a4,a5,87c + p = sbrk(nu * sizeof(Header)); + 88e: 8552 mv a0,s4 + 890: a37ff0ef jal 2c6 + if(p == SBRK_ERROR) + 894: fd551ce3 bne a0,s5,86c + return 0; + 898: 4501 li a0,0 + 89a: 7902 ld s2,32(sp) + 89c: 6a42 ld s4,16(sp) + 89e: 6aa2 ld s5,8(sp) + 8a0: 6b02 ld s6,0(sp) + 8a2: a03d j 8d0 + 8a4: 7902 ld s2,32(sp) + 8a6: 6a42 ld s4,16(sp) + 8a8: 6aa2 ld s5,8(sp) + 8aa: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 8ac: fae48de3 beq s1,a4,866 + p->s.size -= nunits; + 8b0: 4137073b subw a4,a4,s3 + 8b4: c798 sw a4,8(a5) + p += p->s.size; + 8b6: 02071693 slli a3,a4,0x20 + 8ba: 01c6d713 srli a4,a3,0x1c + 8be: 97ba add a5,a5,a4 + p->s.size = nunits; + 8c0: 0137a423 sw s3,8(a5) + freep = prevp; + 8c4: 00000717 auipc a4,0x0 + 8c8: 72a73e23 sd a0,1852(a4) # 1000 + return (void*)(p + 1); + 8cc: 01078513 addi a0,a5,16 + } +} + 8d0: 70e2 ld ra,56(sp) + 8d2: 7442 ld s0,48(sp) + 8d4: 74a2 ld s1,40(sp) + 8d6: 69e2 ld s3,24(sp) + 8d8: 6121 addi sp,sp,64 + 8da: 8082 ret + 8dc: 7902 ld s2,32(sp) + 8de: 6a42 ld s4,16(sp) + 8e0: 6aa2 ld s5,8(sp) + 8e2: 6b02 ld s6,0(sp) + 8e4: b7f5 j 8d0 diff --git a/user/mkdir.c b/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.c similarity index 100% rename from user/mkdir.c rename to G12_Project1_xv6CustomizeSystemCalls/user/mkdir.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.d b/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.d new file mode 100644 index 0000000000..7ad28bea37 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.d @@ -0,0 +1 @@ +user/mkdir.o: user/mkdir.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.o b/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.o new file mode 100644 index 0000000000..4348823d51 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.sym b/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.sym new file mode 100644 index 0000000000..acbcbd1217 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/mkdir.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +00000000000008e8 .rodata +0000000000000948 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 mkdir.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003b2 putc +00000000000003d0 printint +0000000000000930 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000076 strcpy +000000000000038a pause +000000000000073a printf +0000000000000382 sys_sbrk +0000000000000220 memmove +0000000000000342 mknod +000000000000012e gets +000000000000037a getpid +00000000000002b2 memcpy +00000000000007ee malloc +00000000000002dc sbrklazy +000000000000030a pipe +000000000000031a write +0000000000000352 fstat +0000000000000710 fprintf +000000000000032a kill +000000000000046c vprintf +000000000000036a chdir +0000000000000332 exec +0000000000000302 wait +000000000000039a getprocsinfo +0000000000000312 read +000000000000034a unlink +0000000000000278 memcmp +00000000000002f2 fork +00000000000002c6 sbrk +0000000000000392 uptime +00000000000000e8 memset +0000000000000000 main +00000000000003a2 getppid +0000000000000092 strcmp +0000000000000372 dup +000000000000019e stat +00000000000003aa sleep2 +000000000000035a link +00000000000002fa exit +0000000000000066 start +00000000000001d8 atoi +00000000000000be strlen +000000000000033a open +000000000000010a strchr +0000000000000362 mkdir +0000000000000322 close +000000000000076c free diff --git a/user/printf.c b/G12_Project1_xv6CustomizeSystemCalls/user/printf.c similarity index 100% rename from user/printf.c rename to G12_Project1_xv6CustomizeSystemCalls/user/printf.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/printf.d b/G12_Project1_xv6CustomizeSystemCalls/user/printf.d new file mode 100644 index 0000000000..17c41ba34f --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/printf.d @@ -0,0 +1,2 @@ +user/printf.o: user/printf.c kernel/types.h kernel/stat.h user/user.h \ + /usr/lib/gcc-cross/riscv64-linux-gnu/13/include/stdarg.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/printf.o b/G12_Project1_xv6CustomizeSystemCalls/user/printf.o new file mode 100644 index 0000000000..b27c4e169d Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/printf.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/rm.asm b/G12_Project1_xv6CustomizeSystemCalls/user/rm.asm new file mode 100644 index 0000000000..d7e3f28a65 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/rm.asm @@ -0,0 +1,1539 @@ + +user/_rm: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/stat.h" +#include "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: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + 8: 4785 li a5,1 + a: 02a7d763 bge a5,a0,38 + e: e426 sd s1,8(sp) + 10: e04a sd s2,0(sp) + 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: rm files...\n"); + exit(1); + } + + for(i = 1; i < argc; i++){ + if(unlink(argv[i]) < 0){ + 26: 6088 ld a0,0(s1) + 28: 322000ef jal 34a + 2c: 02054263 bltz a0,50 + for(i = 1; i < argc; i++){ + 30: 04a1 addi s1,s1,8 + 32: ff249ae3 bne s1,s2,26 + 36: a02d j 60 + 38: e426 sd s1,8(sp) + 3a: e04a sd s2,0(sp) + fprintf(2, "Usage: rm files...\n"); + 3c: 00001597 auipc a1,0x1 + 40: 8b458593 addi a1,a1,-1868 # 8f0 + 44: 4509 li a0,2 + 46: 6ca000ef jal 710 + exit(1); + 4a: 4505 li a0,1 + 4c: 2ae000ef jal 2fa + fprintf(2, "rm: %s failed to delete\n", argv[i]); + 50: 6090 ld a2,0(s1) + 52: 00001597 auipc a1,0x1 + 56: 8b658593 addi a1,a1,-1866 # 908 + 5a: 4509 li a0,2 + 5c: 6b4000ef jal 710 + break; + } + } + + exit(0); + 60: 4501 li a0,0 + 62: 298000ef jal 2fa + +0000000000000066 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 66: 1141 addi sp,sp,-16 + 68: e406 sd ra,8(sp) + 6a: e022 sd s0,0(sp) + 6c: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 6e: f93ff0ef jal 0
+ exit(r); + 72: 288000ef jal 2fa + +0000000000000076 : +} + +char* +strcpy(char *s, const char *t) +{ + 76: 1141 addi sp,sp,-16 + 78: e422 sd s0,8(sp) + 7a: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 7c: 87aa mv a5,a0 + 7e: 0585 addi a1,a1,1 + 80: 0785 addi a5,a5,1 + 82: fff5c703 lbu a4,-1(a1) + 86: fee78fa3 sb a4,-1(a5) + 8a: fb75 bnez a4,7e + ; + return os; +} + 8c: 6422 ld s0,8(sp) + 8e: 0141 addi sp,sp,16 + 90: 8082 ret + +0000000000000092 : + +int +strcmp(const char *p, const char *q) +{ + 92: 1141 addi sp,sp,-16 + 94: e422 sd s0,8(sp) + 96: 0800 addi s0,sp,16 + while(*p && *p == *q) + 98: 00054783 lbu a5,0(a0) + 9c: cb91 beqz a5,b0 + 9e: 0005c703 lbu a4,0(a1) + a2: 00f71763 bne a4,a5,b0 + p++, q++; + a6: 0505 addi a0,a0,1 + a8: 0585 addi a1,a1,1 + while(*p && *p == *q) + aa: 00054783 lbu a5,0(a0) + ae: fbe5 bnez a5,9e + return (uchar)*p - (uchar)*q; + b0: 0005c503 lbu a0,0(a1) +} + b4: 40a7853b subw a0,a5,a0 + b8: 6422 ld s0,8(sp) + ba: 0141 addi sp,sp,16 + bc: 8082 ret + +00000000000000be : + +uint +strlen(const char *s) +{ + be: 1141 addi sp,sp,-16 + c0: e422 sd s0,8(sp) + c2: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + c4: 00054783 lbu a5,0(a0) + c8: cf91 beqz a5,e4 + ca: 0505 addi a0,a0,1 + cc: 87aa mv a5,a0 + ce: 86be mv a3,a5 + d0: 0785 addi a5,a5,1 + d2: fff7c703 lbu a4,-1(a5) + d6: ff65 bnez a4,ce + d8: 40a6853b subw a0,a3,a0 + dc: 2505 addiw a0,a0,1 + ; + return n; +} + de: 6422 ld s0,8(sp) + e0: 0141 addi sp,sp,16 + e2: 8082 ret + for(n = 0; s[n]; n++) + e4: 4501 li a0,0 + e6: bfe5 j de + +00000000000000e8 : + +void* +memset(void *dst, int c, uint n) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + ee: ca19 beqz a2,104 + f0: 87aa mv a5,a0 + f2: 1602 slli a2,a2,0x20 + f4: 9201 srli a2,a2,0x20 + f6: 00a60733 add a4,a2,a0 + cdst[i] = c; + fa: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + fe: 0785 addi a5,a5,1 + 100: fee79de3 bne a5,a4,fa + } + return dst; +} + 104: 6422 ld s0,8(sp) + 106: 0141 addi sp,sp,16 + 108: 8082 ret + +000000000000010a : + +char* +strchr(const char *s, char c) +{ + 10a: 1141 addi sp,sp,-16 + 10c: e422 sd s0,8(sp) + 10e: 0800 addi s0,sp,16 + for(; *s; s++) + 110: 00054783 lbu a5,0(a0) + 114: cb99 beqz a5,12a + if(*s == c) + 116: 00f58763 beq a1,a5,124 + for(; *s; s++) + 11a: 0505 addi a0,a0,1 + 11c: 00054783 lbu a5,0(a0) + 120: fbfd bnez a5,116 + return (char*)s; + return 0; + 122: 4501 li a0,0 +} + 124: 6422 ld s0,8(sp) + 126: 0141 addi sp,sp,16 + 128: 8082 ret + return 0; + 12a: 4501 li a0,0 + 12c: bfe5 j 124 + +000000000000012e : + +char* +gets(char *buf, int max) +{ + 12e: 711d addi sp,sp,-96 + 130: ec86 sd ra,88(sp) + 132: e8a2 sd s0,80(sp) + 134: e4a6 sd s1,72(sp) + 136: e0ca sd s2,64(sp) + 138: fc4e sd s3,56(sp) + 13a: f852 sd s4,48(sp) + 13c: f456 sd s5,40(sp) + 13e: f05a sd s6,32(sp) + 140: ec5e sd s7,24(sp) + 142: 1080 addi s0,sp,96 + 144: 8baa mv s7,a0 + 146: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 148: 892a mv s2,a0 + 14a: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 14c: 4aa9 li s5,10 + 14e: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 150: 89a6 mv s3,s1 + 152: 2485 addiw s1,s1,1 + 154: 0344d663 bge s1,s4,180 + cc = read(0, &c, 1); + 158: 4605 li a2,1 + 15a: faf40593 addi a1,s0,-81 + 15e: 4501 li a0,0 + 160: 1b2000ef jal 312 + if(cc < 1) + 164: 00a05e63 blez a0,180 + buf[i++] = c; + 168: faf44783 lbu a5,-81(s0) + 16c: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 170: 01578763 beq a5,s5,17e + 174: 0905 addi s2,s2,1 + 176: fd679de3 bne a5,s6,150 + buf[i++] = c; + 17a: 89a6 mv s3,s1 + 17c: a011 j 180 + 17e: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 180: 99de add s3,s3,s7 + 182: 00098023 sb zero,0(s3) + return buf; +} + 186: 855e mv a0,s7 + 188: 60e6 ld ra,88(sp) + 18a: 6446 ld s0,80(sp) + 18c: 64a6 ld s1,72(sp) + 18e: 6906 ld s2,64(sp) + 190: 79e2 ld s3,56(sp) + 192: 7a42 ld s4,48(sp) + 194: 7aa2 ld s5,40(sp) + 196: 7b02 ld s6,32(sp) + 198: 6be2 ld s7,24(sp) + 19a: 6125 addi sp,sp,96 + 19c: 8082 ret + +000000000000019e : + +int +stat(const char *n, struct stat *st) +{ + 19e: 1101 addi sp,sp,-32 + 1a0: ec06 sd ra,24(sp) + 1a2: e822 sd s0,16(sp) + 1a4: e04a sd s2,0(sp) + 1a6: 1000 addi s0,sp,32 + 1a8: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1aa: 4581 li a1,0 + 1ac: 18e000ef jal 33a + if(fd < 0) + 1b0: 02054263 bltz a0,1d4 + 1b4: e426 sd s1,8(sp) + 1b6: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1b8: 85ca mv a1,s2 + 1ba: 198000ef jal 352 + 1be: 892a mv s2,a0 + close(fd); + 1c0: 8526 mv a0,s1 + 1c2: 160000ef jal 322 + return r; + 1c6: 64a2 ld s1,8(sp) +} + 1c8: 854a mv a0,s2 + 1ca: 60e2 ld ra,24(sp) + 1cc: 6442 ld s0,16(sp) + 1ce: 6902 ld s2,0(sp) + 1d0: 6105 addi sp,sp,32 + 1d2: 8082 ret + return -1; + 1d4: 597d li s2,-1 + 1d6: bfcd j 1c8 + +00000000000001d8 : + +int +atoi(const char *s) +{ + 1d8: 1141 addi sp,sp,-16 + 1da: e422 sd s0,8(sp) + 1dc: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1de: 00054683 lbu a3,0(a0) + 1e2: fd06879b addiw a5,a3,-48 + 1e6: 0ff7f793 zext.b a5,a5 + 1ea: 4625 li a2,9 + 1ec: 02f66863 bltu a2,a5,21c + 1f0: 872a mv a4,a0 + n = 0; + 1f2: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1f4: 0705 addi a4,a4,1 + 1f6: 0025179b slliw a5,a0,0x2 + 1fa: 9fa9 addw a5,a5,a0 + 1fc: 0017979b slliw a5,a5,0x1 + 200: 9fb5 addw a5,a5,a3 + 202: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 206: 00074683 lbu a3,0(a4) + 20a: fd06879b addiw a5,a3,-48 + 20e: 0ff7f793 zext.b a5,a5 + 212: fef671e3 bgeu a2,a5,1f4 + return n; +} + 216: 6422 ld s0,8(sp) + 218: 0141 addi sp,sp,16 + 21a: 8082 ret + n = 0; + 21c: 4501 li a0,0 + 21e: bfe5 j 216 + +0000000000000220 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 220: 1141 addi sp,sp,-16 + 222: e422 sd s0,8(sp) + 224: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 226: 02b57463 bgeu a0,a1,24e + while(n-- > 0) + 22a: 00c05f63 blez a2,248 + 22e: 1602 slli a2,a2,0x20 + 230: 9201 srli a2,a2,0x20 + 232: 00c507b3 add a5,a0,a2 + dst = vdst; + 236: 872a mv a4,a0 + *dst++ = *src++; + 238: 0585 addi a1,a1,1 + 23a: 0705 addi a4,a4,1 + 23c: fff5c683 lbu a3,-1(a1) + 240: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 244: fef71ae3 bne a4,a5,238 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 248: 6422 ld s0,8(sp) + 24a: 0141 addi sp,sp,16 + 24c: 8082 ret + dst += n; + 24e: 00c50733 add a4,a0,a2 + src += n; + 252: 95b2 add a1,a1,a2 + while(n-- > 0) + 254: fec05ae3 blez a2,248 + 258: fff6079b addiw a5,a2,-1 + 25c: 1782 slli a5,a5,0x20 + 25e: 9381 srli a5,a5,0x20 + 260: fff7c793 not a5,a5 + 264: 97ba add a5,a5,a4 + *--dst = *--src; + 266: 15fd addi a1,a1,-1 + 268: 177d addi a4,a4,-1 + 26a: 0005c683 lbu a3,0(a1) + 26e: 00d70023 sb a3,0(a4) + while(n-- > 0) + 272: fee79ae3 bne a5,a4,266 + 276: bfc9 j 248 + +0000000000000278 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 278: 1141 addi sp,sp,-16 + 27a: e422 sd s0,8(sp) + 27c: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 27e: ca05 beqz a2,2ae + 280: fff6069b addiw a3,a2,-1 + 284: 1682 slli a3,a3,0x20 + 286: 9281 srli a3,a3,0x20 + 288: 0685 addi a3,a3,1 + 28a: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 28c: 00054783 lbu a5,0(a0) + 290: 0005c703 lbu a4,0(a1) + 294: 00e79863 bne a5,a4,2a4 + return *p1 - *p2; + } + p1++; + 298: 0505 addi a0,a0,1 + p2++; + 29a: 0585 addi a1,a1,1 + while (n-- > 0) { + 29c: fed518e3 bne a0,a3,28c + } + return 0; + 2a0: 4501 li a0,0 + 2a2: a019 j 2a8 + return *p1 - *p2; + 2a4: 40e7853b subw a0,a5,a4 +} + 2a8: 6422 ld s0,8(sp) + 2aa: 0141 addi sp,sp,16 + 2ac: 8082 ret + return 0; + 2ae: 4501 li a0,0 + 2b0: bfe5 j 2a8 + +00000000000002b2 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2b2: 1141 addi sp,sp,-16 + 2b4: e406 sd ra,8(sp) + 2b6: e022 sd s0,0(sp) + 2b8: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2ba: f67ff0ef jal 220 +} + 2be: 60a2 ld ra,8(sp) + 2c0: 6402 ld s0,0(sp) + 2c2: 0141 addi sp,sp,16 + 2c4: 8082 ret + +00000000000002c6 : + +char * +sbrk(int n) { + 2c6: 1141 addi sp,sp,-16 + 2c8: e406 sd ra,8(sp) + 2ca: e022 sd s0,0(sp) + 2cc: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2ce: 4585 li a1,1 + 2d0: 0b2000ef jal 382 +} + 2d4: 60a2 ld ra,8(sp) + 2d6: 6402 ld s0,0(sp) + 2d8: 0141 addi sp,sp,16 + 2da: 8082 ret + +00000000000002dc : + +char * +sbrklazy(int n) { + 2dc: 1141 addi sp,sp,-16 + 2de: e406 sd ra,8(sp) + 2e0: e022 sd s0,0(sp) + 2e2: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2e4: 4589 li a1,2 + 2e6: 09c000ef jal 382 +} + 2ea: 60a2 ld ra,8(sp) + 2ec: 6402 ld s0,0(sp) + 2ee: 0141 addi sp,sp,16 + 2f0: 8082 ret + +00000000000002f2 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2f2: 4885 li a7,1 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa : +.global exit +exit: + li a7, SYS_exit + 2fa: 4889 li a7,2 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 : +.global wait +wait: + li a7, SYS_wait + 302: 488d li a7,3 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a : +.global pipe +pipe: + li a7, SYS_pipe + 30a: 4891 li a7,4 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 : +.global read +read: + li a7, SYS_read + 312: 4895 li a7,5 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a : +.global write +write: + li a7, SYS_write + 31a: 48c1 li a7,16 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 : +.global close +close: + li a7, SYS_close + 322: 48d5 li a7,21 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a : +.global kill +kill: + li a7, SYS_kill + 32a: 4899 li a7,6 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 : +.global exec +exec: + li a7, SYS_exec + 332: 489d li a7,7 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a : +.global open +open: + li a7, SYS_open + 33a: 48bd li a7,15 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 : +.global mknod +mknod: + li a7, SYS_mknod + 342: 48c5 li a7,17 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a : +.global unlink +unlink: + li a7, SYS_unlink + 34a: 48c9 li a7,18 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 : +.global fstat +fstat: + li a7, SYS_fstat + 352: 48a1 li a7,8 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a : +.global link +link: + li a7, SYS_link + 35a: 48cd li a7,19 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 362: 48d1 li a7,20 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : +.global chdir +chdir: + li a7, SYS_chdir + 36a: 48a5 li a7,9 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 : +.global dup +dup: + li a7, SYS_dup + 372: 48a9 li a7,10 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a : +.global getpid +getpid: + li a7, SYS_getpid + 37a: 48ad li a7,11 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 382: 48b1 li a7,12 + ecall + 384: 00000073 ecall + ret + 388: 8082 ret + +000000000000038a : +.global pause +pause: + li a7, SYS_pause + 38a: 48b5 li a7,13 + ecall + 38c: 00000073 ecall + ret + 390: 8082 ret + +0000000000000392 : +.global uptime +uptime: + li a7, SYS_uptime + 392: 48b9 li a7,14 + ecall + 394: 00000073 ecall + ret + 398: 8082 ret + +000000000000039a : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 39a: 48d9 li a7,22 + ecall + 39c: 00000073 ecall + ret + 3a0: 8082 ret + +00000000000003a2 : +.global getppid +getppid: + li a7, SYS_getppid + 3a2: 48dd li a7,23 + ecall + 3a4: 00000073 ecall + ret + 3a8: 8082 ret + +00000000000003aa : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 3aa: 48e1 li a7,24 + ecall + 3ac: 00000073 ecall + ret + 3b0: 8082 ret + +00000000000003b2 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3b2: 1101 addi sp,sp,-32 + 3b4: ec06 sd ra,24(sp) + 3b6: e822 sd s0,16(sp) + 3b8: 1000 addi s0,sp,32 + 3ba: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3be: 4605 li a2,1 + 3c0: fef40593 addi a1,s0,-17 + 3c4: f57ff0ef jal 31a +} + 3c8: 60e2 ld ra,24(sp) + 3ca: 6442 ld s0,16(sp) + 3cc: 6105 addi sp,sp,32 + 3ce: 8082 ret + +00000000000003d0 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3d0: 715d addi sp,sp,-80 + 3d2: e486 sd ra,72(sp) + 3d4: e0a2 sd s0,64(sp) + 3d6: f84a sd s2,48(sp) + 3d8: 0880 addi s0,sp,80 + 3da: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3dc: c299 beqz a3,3e2 + 3de: 0805c363 bltz a1,464 + neg = 0; + 3e2: 4881 li a7,0 + 3e4: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3e8: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3ea: 00000517 auipc a0,0x0 + 3ee: 54650513 addi a0,a0,1350 # 930 + 3f2: 883e mv a6,a5 + 3f4: 2785 addiw a5,a5,1 + 3f6: 02c5f733 remu a4,a1,a2 + 3fa: 972a add a4,a4,a0 + 3fc: 00074703 lbu a4,0(a4) + 400: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 404: 872e mv a4,a1 + 406: 02c5d5b3 divu a1,a1,a2 + 40a: 0685 addi a3,a3,1 + 40c: fec773e3 bgeu a4,a2,3f2 + if(neg) + 410: 00088b63 beqz a7,426 + buf[i++] = '-'; + 414: fd078793 addi a5,a5,-48 + 418: 97a2 add a5,a5,s0 + 41a: 02d00713 li a4,45 + 41e: fee78423 sb a4,-24(a5) + 422: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 426: 02f05a63 blez a5,45a + 42a: fc26 sd s1,56(sp) + 42c: f44e sd s3,40(sp) + 42e: fb840713 addi a4,s0,-72 + 432: 00f704b3 add s1,a4,a5 + 436: fff70993 addi s3,a4,-1 + 43a: 99be add s3,s3,a5 + 43c: 37fd addiw a5,a5,-1 + 43e: 1782 slli a5,a5,0x20 + 440: 9381 srli a5,a5,0x20 + 442: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 446: fff4c583 lbu a1,-1(s1) + 44a: 854a mv a0,s2 + 44c: f67ff0ef jal 3b2 + while(--i >= 0) + 450: 14fd addi s1,s1,-1 + 452: ff349ae3 bne s1,s3,446 + 456: 74e2 ld s1,56(sp) + 458: 79a2 ld s3,40(sp) +} + 45a: 60a6 ld ra,72(sp) + 45c: 6406 ld s0,64(sp) + 45e: 7942 ld s2,48(sp) + 460: 6161 addi sp,sp,80 + 462: 8082 ret + x = -xx; + 464: 40b005b3 neg a1,a1 + neg = 1; + 468: 4885 li a7,1 + x = -xx; + 46a: bfad j 3e4 + +000000000000046c : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 46c: 711d addi sp,sp,-96 + 46e: ec86 sd ra,88(sp) + 470: e8a2 sd s0,80(sp) + 472: e0ca sd s2,64(sp) + 474: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 476: 0005c903 lbu s2,0(a1) + 47a: 28090663 beqz s2,706 + 47e: e4a6 sd s1,72(sp) + 480: fc4e sd s3,56(sp) + 482: f852 sd s4,48(sp) + 484: f456 sd s5,40(sp) + 486: f05a sd s6,32(sp) + 488: ec5e sd s7,24(sp) + 48a: e862 sd s8,16(sp) + 48c: e466 sd s9,8(sp) + 48e: 8b2a mv s6,a0 + 490: 8a2e mv s4,a1 + 492: 8bb2 mv s7,a2 + state = 0; + 494: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 496: 4481 li s1,0 + 498: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 49a: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 49e: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4a2: 06c00c93 li s9,108 + 4a6: a005 j 4c6 + putc(fd, c0); + 4a8: 85ca mv a1,s2 + 4aa: 855a mv a0,s6 + 4ac: f07ff0ef jal 3b2 + 4b0: a019 j 4b6 + } else if(state == '%'){ + 4b2: 03598263 beq s3,s5,4d6 + for(i = 0; fmt[i]; i++){ + 4b6: 2485 addiw s1,s1,1 + 4b8: 8726 mv a4,s1 + 4ba: 009a07b3 add a5,s4,s1 + 4be: 0007c903 lbu s2,0(a5) + 4c2: 22090a63 beqz s2,6f6 + c0 = fmt[i] & 0xff; + 4c6: 0009079b sext.w a5,s2 + if(state == 0){ + 4ca: fe0994e3 bnez s3,4b2 + if(c0 == '%'){ + 4ce: fd579de3 bne a5,s5,4a8 + state = '%'; + 4d2: 89be mv s3,a5 + 4d4: b7cd j 4b6 + if(c0) c1 = fmt[i+1] & 0xff; + 4d6: 00ea06b3 add a3,s4,a4 + 4da: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4de: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4e0: c681 beqz a3,4e8 + 4e2: 9752 add a4,a4,s4 + 4e4: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4e8: 05878363 beq a5,s8,52e + } else if(c0 == 'l' && c1 == 'd'){ + 4ec: 05978d63 beq a5,s9,546 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4f0: 07500713 li a4,117 + 4f4: 0ee78763 beq a5,a4,5e2 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4f8: 07800713 li a4,120 + 4fc: 12e78963 beq a5,a4,62e + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 500: 07000713 li a4,112 + 504: 14e78e63 beq a5,a4,660 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 508: 06300713 li a4,99 + 50c: 18e78e63 beq a5,a4,6a8 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 510: 07300713 li a4,115 + 514: 1ae78463 beq a5,a4,6bc + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 518: 02500713 li a4,37 + 51c: 04e79563 bne a5,a4,566 + putc(fd, '%'); + 520: 02500593 li a1,37 + 524: 855a mv a0,s6 + 526: e8dff0ef jal 3b2 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 52a: 4981 li s3,0 + 52c: b769 j 4b6 + printint(fd, va_arg(ap, int), 10, 1); + 52e: 008b8913 addi s2,s7,8 + 532: 4685 li a3,1 + 534: 4629 li a2,10 + 536: 000ba583 lw a1,0(s7) + 53a: 855a mv a0,s6 + 53c: e95ff0ef jal 3d0 + 540: 8bca mv s7,s2 + state = 0; + 542: 4981 li s3,0 + 544: bf8d j 4b6 + } else if(c0 == 'l' && c1 == 'd'){ + 546: 06400793 li a5,100 + 54a: 02f68963 beq a3,a5,57c + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 54e: 06c00793 li a5,108 + 552: 04f68263 beq a3,a5,596 + } else if(c0 == 'l' && c1 == 'u'){ + 556: 07500793 li a5,117 + 55a: 0af68063 beq a3,a5,5fa + } else if(c0 == 'l' && c1 == 'x'){ + 55e: 07800793 li a5,120 + 562: 0ef68263 beq a3,a5,646 + putc(fd, '%'); + 566: 02500593 li a1,37 + 56a: 855a mv a0,s6 + 56c: e47ff0ef jal 3b2 + putc(fd, c0); + 570: 85ca mv a1,s2 + 572: 855a mv a0,s6 + 574: e3fff0ef jal 3b2 + state = 0; + 578: 4981 li s3,0 + 57a: bf35 j 4b6 + printint(fd, va_arg(ap, uint64), 10, 1); + 57c: 008b8913 addi s2,s7,8 + 580: 4685 li a3,1 + 582: 4629 li a2,10 + 584: 000bb583 ld a1,0(s7) + 588: 855a mv a0,s6 + 58a: e47ff0ef jal 3d0 + i += 1; + 58e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 590: 8bca mv s7,s2 + state = 0; + 592: 4981 li s3,0 + i += 1; + 594: b70d j 4b6 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 596: 06400793 li a5,100 + 59a: 02f60763 beq a2,a5,5c8 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 59e: 07500793 li a5,117 + 5a2: 06f60963 beq a2,a5,614 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5a6: 07800793 li a5,120 + 5aa: faf61ee3 bne a2,a5,566 + printint(fd, va_arg(ap, uint64), 16, 0); + 5ae: 008b8913 addi s2,s7,8 + 5b2: 4681 li a3,0 + 5b4: 4641 li a2,16 + 5b6: 000bb583 ld a1,0(s7) + 5ba: 855a mv a0,s6 + 5bc: e15ff0ef jal 3d0 + i += 2; + 5c0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5c2: 8bca mv s7,s2 + state = 0; + 5c4: 4981 li s3,0 + i += 2; + 5c6: bdc5 j 4b6 + printint(fd, va_arg(ap, uint64), 10, 1); + 5c8: 008b8913 addi s2,s7,8 + 5cc: 4685 li a3,1 + 5ce: 4629 li a2,10 + 5d0: 000bb583 ld a1,0(s7) + 5d4: 855a mv a0,s6 + 5d6: dfbff0ef jal 3d0 + i += 2; + 5da: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5dc: 8bca mv s7,s2 + state = 0; + 5de: 4981 li s3,0 + i += 2; + 5e0: bdd9 j 4b6 + printint(fd, va_arg(ap, uint32), 10, 0); + 5e2: 008b8913 addi s2,s7,8 + 5e6: 4681 li a3,0 + 5e8: 4629 li a2,10 + 5ea: 000be583 lwu a1,0(s7) + 5ee: 855a mv a0,s6 + 5f0: de1ff0ef jal 3d0 + 5f4: 8bca mv s7,s2 + state = 0; + 5f6: 4981 li s3,0 + 5f8: bd7d j 4b6 + printint(fd, va_arg(ap, uint64), 10, 0); + 5fa: 008b8913 addi s2,s7,8 + 5fe: 4681 li a3,0 + 600: 4629 li a2,10 + 602: 000bb583 ld a1,0(s7) + 606: 855a mv a0,s6 + 608: dc9ff0ef jal 3d0 + i += 1; + 60c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 60e: 8bca mv s7,s2 + state = 0; + 610: 4981 li s3,0 + i += 1; + 612: b555 j 4b6 + printint(fd, va_arg(ap, uint64), 10, 0); + 614: 008b8913 addi s2,s7,8 + 618: 4681 li a3,0 + 61a: 4629 li a2,10 + 61c: 000bb583 ld a1,0(s7) + 620: 855a mv a0,s6 + 622: dafff0ef jal 3d0 + i += 2; + 626: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 628: 8bca mv s7,s2 + state = 0; + 62a: 4981 li s3,0 + i += 2; + 62c: b569 j 4b6 + printint(fd, va_arg(ap, uint32), 16, 0); + 62e: 008b8913 addi s2,s7,8 + 632: 4681 li a3,0 + 634: 4641 li a2,16 + 636: 000be583 lwu a1,0(s7) + 63a: 855a mv a0,s6 + 63c: d95ff0ef jal 3d0 + 640: 8bca mv s7,s2 + state = 0; + 642: 4981 li s3,0 + 644: bd8d j 4b6 + printint(fd, va_arg(ap, uint64), 16, 0); + 646: 008b8913 addi s2,s7,8 + 64a: 4681 li a3,0 + 64c: 4641 li a2,16 + 64e: 000bb583 ld a1,0(s7) + 652: 855a mv a0,s6 + 654: d7dff0ef jal 3d0 + i += 1; + 658: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 65a: 8bca mv s7,s2 + state = 0; + 65c: 4981 li s3,0 + i += 1; + 65e: bda1 j 4b6 + 660: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 662: 008b8d13 addi s10,s7,8 + 666: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 66a: 03000593 li a1,48 + 66e: 855a mv a0,s6 + 670: d43ff0ef jal 3b2 + putc(fd, 'x'); + 674: 07800593 li a1,120 + 678: 855a mv a0,s6 + 67a: d39ff0ef jal 3b2 + 67e: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 680: 00000b97 auipc s7,0x0 + 684: 2b0b8b93 addi s7,s7,688 # 930 + 688: 03c9d793 srli a5,s3,0x3c + 68c: 97de add a5,a5,s7 + 68e: 0007c583 lbu a1,0(a5) + 692: 855a mv a0,s6 + 694: d1fff0ef jal 3b2 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 698: 0992 slli s3,s3,0x4 + 69a: 397d addiw s2,s2,-1 + 69c: fe0916e3 bnez s2,688 + printptr(fd, va_arg(ap, uint64)); + 6a0: 8bea mv s7,s10 + state = 0; + 6a2: 4981 li s3,0 + 6a4: 6d02 ld s10,0(sp) + 6a6: bd01 j 4b6 + putc(fd, va_arg(ap, uint32)); + 6a8: 008b8913 addi s2,s7,8 + 6ac: 000bc583 lbu a1,0(s7) + 6b0: 855a mv a0,s6 + 6b2: d01ff0ef jal 3b2 + 6b6: 8bca mv s7,s2 + state = 0; + 6b8: 4981 li s3,0 + 6ba: bbf5 j 4b6 + if((s = va_arg(ap, char*)) == 0) + 6bc: 008b8993 addi s3,s7,8 + 6c0: 000bb903 ld s2,0(s7) + 6c4: 00090f63 beqz s2,6e2 + for(; *s; s++) + 6c8: 00094583 lbu a1,0(s2) + 6cc: c195 beqz a1,6f0 + putc(fd, *s); + 6ce: 855a mv a0,s6 + 6d0: ce3ff0ef jal 3b2 + for(; *s; s++) + 6d4: 0905 addi s2,s2,1 + 6d6: 00094583 lbu a1,0(s2) + 6da: f9f5 bnez a1,6ce + if((s = va_arg(ap, char*)) == 0) + 6dc: 8bce mv s7,s3 + state = 0; + 6de: 4981 li s3,0 + 6e0: bbd9 j 4b6 + s = "(null)"; + 6e2: 00000917 auipc s2,0x0 + 6e6: 24690913 addi s2,s2,582 # 928 + for(; *s; s++) + 6ea: 02800593 li a1,40 + 6ee: b7c5 j 6ce + if((s = va_arg(ap, char*)) == 0) + 6f0: 8bce mv s7,s3 + state = 0; + 6f2: 4981 li s3,0 + 6f4: b3c9 j 4b6 + 6f6: 64a6 ld s1,72(sp) + 6f8: 79e2 ld s3,56(sp) + 6fa: 7a42 ld s4,48(sp) + 6fc: 7aa2 ld s5,40(sp) + 6fe: 7b02 ld s6,32(sp) + 700: 6be2 ld s7,24(sp) + 702: 6c42 ld s8,16(sp) + 704: 6ca2 ld s9,8(sp) + } + } +} + 706: 60e6 ld ra,88(sp) + 708: 6446 ld s0,80(sp) + 70a: 6906 ld s2,64(sp) + 70c: 6125 addi sp,sp,96 + 70e: 8082 ret + +0000000000000710 : + +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: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 72c: 8622 mv a2,s0 + 72e: d3fff0ef jal 46c +} + 732: 60e2 ld ra,24(sp) + 734: 6442 ld s0,16(sp) + 736: 6161 addi sp,sp,80 + 738: 8082 ret + +000000000000073a : + +void +printf(const char *fmt, ...) +{ + 73a: 711d addi sp,sp,-96 + 73c: ec06 sd ra,24(sp) + 73e: e822 sd s0,16(sp) + 740: 1000 addi s0,sp,32 + 742: e40c sd a1,8(s0) + 744: e810 sd a2,16(s0) + 746: ec14 sd a3,24(s0) + 748: f018 sd a4,32(s0) + 74a: f41c sd a5,40(s0) + 74c: 03043823 sd a6,48(s0) + 750: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 754: 00840613 addi a2,s0,8 + 758: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 75c: 85aa mv a1,a0 + 75e: 4505 li a0,1 + 760: d0dff0ef jal 46c +} + 764: 60e2 ld ra,24(sp) + 766: 6442 ld s0,16(sp) + 768: 6125 addi sp,sp,96 + 76a: 8082 ret + +000000000000076c : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 76c: 1141 addi sp,sp,-16 + 76e: e422 sd s0,8(sp) + 770: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 772: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 776: 00001797 auipc a5,0x1 + 77a: 88a7b783 ld a5,-1910(a5) # 1000 + 77e: a02d j 7a8 + 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; + 780: 4618 lw a4,8(a2) + 782: 9f2d addw a4,a4,a1 + 784: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 788: 6398 ld a4,0(a5) + 78a: 6310 ld a2,0(a4) + 78c: a83d j 7ca + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 78e: ff852703 lw a4,-8(a0) + 792: 9f31 addw a4,a4,a2 + 794: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 796: ff053683 ld a3,-16(a0) + 79a: a091 j 7de + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 79c: 6398 ld a4,0(a5) + 79e: 00e7e463 bltu a5,a4,7a6 + 7a2: 00e6ea63 bltu a3,a4,7b6 +{ + 7a6: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7a8: fed7fae3 bgeu a5,a3,79c + 7ac: 6398 ld a4,0(a5) + 7ae: 00e6e463 bltu a3,a4,7b6 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7b2: fee7eae3 bltu a5,a4,7a6 + if(bp + bp->s.size == p->s.ptr){ + 7b6: ff852583 lw a1,-8(a0) + 7ba: 6390 ld a2,0(a5) + 7bc: 02059813 slli a6,a1,0x20 + 7c0: 01c85713 srli a4,a6,0x1c + 7c4: 9736 add a4,a4,a3 + 7c6: fae60de3 beq a2,a4,780 + bp->s.ptr = p->s.ptr->s.ptr; + 7ca: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7ce: 4790 lw a2,8(a5) + 7d0: 02061593 slli a1,a2,0x20 + 7d4: 01c5d713 srli a4,a1,0x1c + 7d8: 973e add a4,a4,a5 + 7da: fae68ae3 beq a3,a4,78e + p->s.ptr = bp->s.ptr; + 7de: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7e0: 00001717 auipc a4,0x1 + 7e4: 82f73023 sd a5,-2016(a4) # 1000 +} + 7e8: 6422 ld s0,8(sp) + 7ea: 0141 addi sp,sp,16 + 7ec: 8082 ret + +00000000000007ee : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7ee: 7139 addi sp,sp,-64 + 7f0: fc06 sd ra,56(sp) + 7f2: f822 sd s0,48(sp) + 7f4: f426 sd s1,40(sp) + 7f6: ec4e sd s3,24(sp) + 7f8: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7fa: 02051493 slli s1,a0,0x20 + 7fe: 9081 srli s1,s1,0x20 + 800: 04bd addi s1,s1,15 + 802: 8091 srli s1,s1,0x4 + 804: 0014899b addiw s3,s1,1 + 808: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 80a: 00000517 auipc a0,0x0 + 80e: 7f653503 ld a0,2038(a0) # 1000 + 812: c915 beqz a0,846 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 814: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 816: 4798 lw a4,8(a5) + 818: 08977a63 bgeu a4,s1,8ac + 81c: f04a sd s2,32(sp) + 81e: e852 sd s4,16(sp) + 820: e456 sd s5,8(sp) + 822: e05a sd s6,0(sp) + if(nu < 4096) + 824: 8a4e mv s4,s3 + 826: 0009871b sext.w a4,s3 + 82a: 6685 lui a3,0x1 + 82c: 00d77363 bgeu a4,a3,832 + 830: 6a05 lui s4,0x1 + 832: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 836: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 83a: 00000917 auipc s2,0x0 + 83e: 7c690913 addi s2,s2,1990 # 1000 + if(p == SBRK_ERROR) + 842: 5afd li s5,-1 + 844: a081 j 884 + 846: f04a sd s2,32(sp) + 848: e852 sd s4,16(sp) + 84a: e456 sd s5,8(sp) + 84c: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 84e: 00000797 auipc a5,0x0 + 852: 7c278793 addi a5,a5,1986 # 1010 + 856: 00000717 auipc a4,0x0 + 85a: 7af73523 sd a5,1962(a4) # 1000 + 85e: e39c sd a5,0(a5) + base.s.size = 0; + 860: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 864: b7c1 j 824 + prevp->s.ptr = p->s.ptr; + 866: 6398 ld a4,0(a5) + 868: e118 sd a4,0(a0) + 86a: a8a9 j 8c4 + hp->s.size = nu; + 86c: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 870: 0541 addi a0,a0,16 + 872: efbff0ef jal 76c + return freep; + 876: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 87a: c12d beqz a0,8dc + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 87c: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 87e: 4798 lw a4,8(a5) + 880: 02977263 bgeu a4,s1,8a4 + if(p == freep) + 884: 00093703 ld a4,0(s2) + 888: 853e mv a0,a5 + 88a: fef719e3 bne a4,a5,87c + p = sbrk(nu * sizeof(Header)); + 88e: 8552 mv a0,s4 + 890: a37ff0ef jal 2c6 + if(p == SBRK_ERROR) + 894: fd551ce3 bne a0,s5,86c + return 0; + 898: 4501 li a0,0 + 89a: 7902 ld s2,32(sp) + 89c: 6a42 ld s4,16(sp) + 89e: 6aa2 ld s5,8(sp) + 8a0: 6b02 ld s6,0(sp) + 8a2: a03d j 8d0 + 8a4: 7902 ld s2,32(sp) + 8a6: 6a42 ld s4,16(sp) + 8a8: 6aa2 ld s5,8(sp) + 8aa: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 8ac: fae48de3 beq s1,a4,866 + p->s.size -= nunits; + 8b0: 4137073b subw a4,a4,s3 + 8b4: c798 sw a4,8(a5) + p += p->s.size; + 8b6: 02071693 slli a3,a4,0x20 + 8ba: 01c6d713 srli a4,a3,0x1c + 8be: 97ba add a5,a5,a4 + p->s.size = nunits; + 8c0: 0137a423 sw s3,8(a5) + freep = prevp; + 8c4: 00000717 auipc a4,0x0 + 8c8: 72a73e23 sd a0,1852(a4) # 1000 + return (void*)(p + 1); + 8cc: 01078513 addi a0,a5,16 + } +} + 8d0: 70e2 ld ra,56(sp) + 8d2: 7442 ld s0,48(sp) + 8d4: 74a2 ld s1,40(sp) + 8d6: 69e2 ld s3,24(sp) + 8d8: 6121 addi sp,sp,64 + 8da: 8082 ret + 8dc: 7902 ld s2,32(sp) + 8de: 6a42 ld s4,16(sp) + 8e0: 6aa2 ld s5,8(sp) + 8e2: 6b02 ld s6,0(sp) + 8e4: b7f5 j 8d0 diff --git a/user/rm.c b/G12_Project1_xv6CustomizeSystemCalls/user/rm.c similarity index 100% rename from user/rm.c rename to G12_Project1_xv6CustomizeSystemCalls/user/rm.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/rm.d b/G12_Project1_xv6CustomizeSystemCalls/user/rm.d new file mode 100644 index 0000000000..bc40001ea9 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/rm.d @@ -0,0 +1 @@ +user/rm.o: user/rm.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/rm.o b/G12_Project1_xv6CustomizeSystemCalls/user/rm.o new file mode 100644 index 0000000000..ae5fb45f4a Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/rm.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/rm.sym b/G12_Project1_xv6CustomizeSystemCalls/user/rm.sym new file mode 100644 index 0000000000..0f45155067 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/rm.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +00000000000008e8 .rodata +0000000000000948 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 rm.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003b2 putc +00000000000003d0 printint +0000000000000930 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000076 strcpy +000000000000038a pause +000000000000073a printf +0000000000000382 sys_sbrk +0000000000000220 memmove +0000000000000342 mknod +000000000000012e gets +000000000000037a getpid +00000000000002b2 memcpy +00000000000007ee malloc +00000000000002dc sbrklazy +000000000000030a pipe +000000000000031a write +0000000000000352 fstat +0000000000000710 fprintf +000000000000032a kill +000000000000046c vprintf +000000000000036a chdir +0000000000000332 exec +0000000000000302 wait +000000000000039a getprocsinfo +0000000000000312 read +000000000000034a unlink +0000000000000278 memcmp +00000000000002f2 fork +00000000000002c6 sbrk +0000000000000392 uptime +00000000000000e8 memset +0000000000000000 main +00000000000003a2 getppid +0000000000000092 strcmp +0000000000000372 dup +000000000000019e stat +00000000000003aa sleep2 +000000000000035a link +00000000000002fa exit +0000000000000066 start +00000000000001d8 atoi +00000000000000be strlen +000000000000033a open +000000000000010a strchr +0000000000000362 mkdir +0000000000000322 close +000000000000076c free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/sh.asm b/G12_Project1_xv6CustomizeSystemCalls/user/sh.asm new file mode 100644 index 0000000000..fd6f3dfa63 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/sh.asm @@ -0,0 +1,2809 @@ + +user/_sh: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + exit(0); +} + +int +getcmd(char *buf, int nbuf) +{ + 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 + c: 84aa mv s1,a0 + e: 892e mv s2,a1 + write(2, "$ ", 2); + 10: 4609 li a2,2 + 12: 00001597 auipc a1,0x1 + 16: 20e58593 addi a1,a1,526 # 1220 + 1a: 4509 li a0,2 + 1c: 433000ef jal c4e + memset(buf, 0, nbuf); + 20: 864a mv a2,s2 + 22: 4581 li a1,0 + 24: 8526 mv a0,s1 + 26: 1f7000ef jal a1c + gets(buf, nbuf); + 2a: 85ca mv a1,s2 + 2c: 8526 mv a0,s1 + 2e: 235000ef jal a62 + if(buf[0] == 0) // EOF + 32: 0004c503 lbu a0,0(s1) + 36: 00153513 seqz a0,a0 + return -1; + return 0; +} + 3a: 40a00533 neg a0,a0 + 3e: 60e2 ld ra,24(sp) + 40: 6442 ld s0,16(sp) + 42: 64a2 ld s1,8(sp) + 44: 6902 ld s2,0(sp) + 46: 6105 addi sp,sp,32 + 48: 8082 ret + +000000000000004a : + exit(0); +} + +void +panic(char *s) +{ + 4a: 1141 addi sp,sp,-16 + 4c: e406 sd ra,8(sp) + 4e: e022 sd s0,0(sp) + 50: 0800 addi s0,sp,16 + 52: 862a mv a2,a0 + fprintf(2, "%s\n", s); + 54: 00001597 auipc a1,0x1 + 58: 1dc58593 addi a1,a1,476 # 1230 + 5c: 4509 li a0,2 + 5e: 7e7000ef jal 1044 + exit(1); + 62: 4505 li a0,1 + 64: 3cb000ef jal c2e + +0000000000000068 : +} + +int +fork1(void) +{ + 68: 1141 addi sp,sp,-16 + 6a: e406 sd ra,8(sp) + 6c: e022 sd s0,0(sp) + 6e: 0800 addi s0,sp,16 + int pid; + + pid = fork(); + 70: 3b7000ef jal c26 + if(pid == -1) + 74: 57fd li a5,-1 + 76: 00f50663 beq a0,a5,82 + panic("fork"); + return pid; +} + 7a: 60a2 ld ra,8(sp) + 7c: 6402 ld s0,0(sp) + 7e: 0141 addi sp,sp,16 + 80: 8082 ret + panic("fork"); + 82: 00001517 auipc a0,0x1 + 86: 1b650513 addi a0,a0,438 # 1238 + 8a: fc1ff0ef jal 4a + +000000000000008e : +{ + 8e: 7179 addi sp,sp,-48 + 90: f406 sd ra,40(sp) + 92: f022 sd s0,32(sp) + 94: 1800 addi s0,sp,48 + if(cmd == 0) + 96: c115 beqz a0,ba + 98: ec26 sd s1,24(sp) + 9a: 84aa mv s1,a0 + switch(cmd->type){ + 9c: 4118 lw a4,0(a0) + 9e: 4795 li a5,5 + a0: 02e7e163 bltu a5,a4,c2 + a4: 00056783 lwu a5,0(a0) + a8: 078a slli a5,a5,0x2 + aa: 00001717 auipc a4,0x1 + ae: 28e70713 addi a4,a4,654 # 1338 + b2: 97ba add a5,a5,a4 + b4: 439c lw a5,0(a5) + b6: 97ba add a5,a5,a4 + b8: 8782 jr a5 + ba: ec26 sd s1,24(sp) + exit(1); + bc: 4505 li a0,1 + be: 371000ef jal c2e + panic("runcmd"); + c2: 00001517 auipc a0,0x1 + c6: 17e50513 addi a0,a0,382 # 1240 + ca: f81ff0ef jal 4a + if(ecmd->argv[0] == 0) + ce: 6508 ld a0,8(a0) + d0: c105 beqz a0,f0 + exec(ecmd->argv[0], ecmd->argv); + d2: 00848593 addi a1,s1,8 + d6: 391000ef jal c66 + fprintf(2, "exec %s failed\n", ecmd->argv[0]); + da: 6490 ld a2,8(s1) + dc: 00001597 auipc a1,0x1 + e0: 16c58593 addi a1,a1,364 # 1248 + e4: 4509 li a0,2 + e6: 75f000ef jal 1044 + exit(0); + ea: 4501 li a0,0 + ec: 343000ef jal c2e + exit(1); + f0: 4505 li a0,1 + f2: 33d000ef jal c2e + close(rcmd->fd); + f6: 5148 lw a0,36(a0) + f8: 35f000ef jal c56 + if(open(rcmd->file, rcmd->mode) < 0){ + fc: 508c lw a1,32(s1) + fe: 6888 ld a0,16(s1) + 100: 36f000ef jal c6e + 104: 00054563 bltz a0,10e + runcmd(rcmd->cmd); + 108: 6488 ld a0,8(s1) + 10a: f85ff0ef jal 8e + fprintf(2, "open %s failed\n", rcmd->file); + 10e: 6890 ld a2,16(s1) + 110: 00001597 auipc a1,0x1 + 114: 14858593 addi a1,a1,328 # 1258 + 118: 4509 li a0,2 + 11a: 72b000ef jal 1044 + exit(1); + 11e: 4505 li a0,1 + 120: 30f000ef jal c2e + if(fork1() == 0) + 124: f45ff0ef jal 68 + 128: e501 bnez a0,130 + runcmd(lcmd->left); + 12a: 6488 ld a0,8(s1) + 12c: f63ff0ef jal 8e + wait(0); + 130: 4501 li a0,0 + 132: 305000ef jal c36 + runcmd(lcmd->right); + 136: 6888 ld a0,16(s1) + 138: f57ff0ef jal 8e + if(pipe(p) < 0) + 13c: fd840513 addi a0,s0,-40 + 140: 2ff000ef jal c3e + 144: 02054763 bltz a0,172 + if(fork1() == 0){ + 148: f21ff0ef jal 68 + 14c: e90d bnez a0,17e + close(1); + 14e: 4505 li a0,1 + 150: 307000ef jal c56 + dup(p[1]); + 154: fdc42503 lw a0,-36(s0) + 158: 34f000ef jal ca6 + close(p[0]); + 15c: fd842503 lw a0,-40(s0) + 160: 2f7000ef jal c56 + close(p[1]); + 164: fdc42503 lw a0,-36(s0) + 168: 2ef000ef jal c56 + runcmd(pcmd->left); + 16c: 6488 ld a0,8(s1) + 16e: f21ff0ef jal 8e + panic("pipe"); + 172: 00001517 auipc a0,0x1 + 176: 0f650513 addi a0,a0,246 # 1268 + 17a: ed1ff0ef jal 4a + if(fork1() == 0){ + 17e: eebff0ef jal 68 + 182: e115 bnez a0,1a6 + close(0); + 184: 2d3000ef jal c56 + dup(p[0]); + 188: fd842503 lw a0,-40(s0) + 18c: 31b000ef jal ca6 + close(p[0]); + 190: fd842503 lw a0,-40(s0) + 194: 2c3000ef jal c56 + close(p[1]); + 198: fdc42503 lw a0,-36(s0) + 19c: 2bb000ef jal c56 + runcmd(pcmd->right); + 1a0: 6888 ld a0,16(s1) + 1a2: eedff0ef jal 8e + close(p[0]); + 1a6: fd842503 lw a0,-40(s0) + 1aa: 2ad000ef jal c56 + close(p[1]); + 1ae: fdc42503 lw a0,-36(s0) + 1b2: 2a5000ef jal c56 + wait(0); + 1b6: 4501 li a0,0 + 1b8: 27f000ef jal c36 + wait(0); + 1bc: 4501 li a0,0 + 1be: 279000ef jal c36 + break; + 1c2: b725 j ea + if(fork1() == 0) + 1c4: ea5ff0ef jal 68 + 1c8: f20511e3 bnez a0,ea + runcmd(bcmd->cmd); + 1cc: 6488 ld a0,8(s1) + 1ce: ec1ff0ef jal 8e + +00000000000001d2 : +//PAGEBREAK! +// Constructors + +struct cmd* +execcmd(void) +{ + 1d2: 1101 addi sp,sp,-32 + 1d4: ec06 sd ra,24(sp) + 1d6: e822 sd s0,16(sp) + 1d8: e426 sd s1,8(sp) + 1da: 1000 addi s0,sp,32 + struct execcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 1dc: 0a800513 li a0,168 + 1e0: 743000ef jal 1122 + 1e4: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 1e6: 0a800613 li a2,168 + 1ea: 4581 li a1,0 + 1ec: 031000ef jal a1c + cmd->type = EXEC; + 1f0: 4785 li a5,1 + 1f2: c09c sw a5,0(s1) + return (struct cmd*)cmd; +} + 1f4: 8526 mv a0,s1 + 1f6: 60e2 ld ra,24(sp) + 1f8: 6442 ld s0,16(sp) + 1fa: 64a2 ld s1,8(sp) + 1fc: 6105 addi sp,sp,32 + 1fe: 8082 ret + +0000000000000200 : + +struct cmd* +redircmd(struct cmd *subcmd, char *file, char *efile, int mode, int fd) +{ + 200: 7139 addi sp,sp,-64 + 202: fc06 sd ra,56(sp) + 204: f822 sd s0,48(sp) + 206: f426 sd s1,40(sp) + 208: f04a sd s2,32(sp) + 20a: ec4e sd s3,24(sp) + 20c: e852 sd s4,16(sp) + 20e: e456 sd s5,8(sp) + 210: e05a sd s6,0(sp) + 212: 0080 addi s0,sp,64 + 214: 8b2a mv s6,a0 + 216: 8aae mv s5,a1 + 218: 8a32 mv s4,a2 + 21a: 89b6 mv s3,a3 + 21c: 893a mv s2,a4 + struct redircmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 21e: 02800513 li a0,40 + 222: 701000ef jal 1122 + 226: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 228: 02800613 li a2,40 + 22c: 4581 li a1,0 + 22e: 7ee000ef jal a1c + cmd->type = REDIR; + 232: 4789 li a5,2 + 234: c09c sw a5,0(s1) + cmd->cmd = subcmd; + 236: 0164b423 sd s6,8(s1) + cmd->file = file; + 23a: 0154b823 sd s5,16(s1) + cmd->efile = efile; + 23e: 0144bc23 sd s4,24(s1) + cmd->mode = mode; + 242: 0334a023 sw s3,32(s1) + cmd->fd = fd; + 246: 0324a223 sw s2,36(s1) + return (struct cmd*)cmd; +} + 24a: 8526 mv a0,s1 + 24c: 70e2 ld ra,56(sp) + 24e: 7442 ld s0,48(sp) + 250: 74a2 ld s1,40(sp) + 252: 7902 ld s2,32(sp) + 254: 69e2 ld s3,24(sp) + 256: 6a42 ld s4,16(sp) + 258: 6aa2 ld s5,8(sp) + 25a: 6b02 ld s6,0(sp) + 25c: 6121 addi sp,sp,64 + 25e: 8082 ret + +0000000000000260 : + +struct cmd* +pipecmd(struct cmd *left, struct cmd *right) +{ + 260: 7179 addi sp,sp,-48 + 262: f406 sd ra,40(sp) + 264: f022 sd s0,32(sp) + 266: ec26 sd s1,24(sp) + 268: e84a sd s2,16(sp) + 26a: e44e sd s3,8(sp) + 26c: 1800 addi s0,sp,48 + 26e: 89aa mv s3,a0 + 270: 892e mv s2,a1 + struct pipecmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 272: 4561 li a0,24 + 274: 6af000ef jal 1122 + 278: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 27a: 4661 li a2,24 + 27c: 4581 li a1,0 + 27e: 79e000ef jal a1c + cmd->type = PIPE; + 282: 478d li a5,3 + 284: c09c sw a5,0(s1) + cmd->left = left; + 286: 0134b423 sd s3,8(s1) + cmd->right = right; + 28a: 0124b823 sd s2,16(s1) + return (struct cmd*)cmd; +} + 28e: 8526 mv a0,s1 + 290: 70a2 ld ra,40(sp) + 292: 7402 ld s0,32(sp) + 294: 64e2 ld s1,24(sp) + 296: 6942 ld s2,16(sp) + 298: 69a2 ld s3,8(sp) + 29a: 6145 addi sp,sp,48 + 29c: 8082 ret + +000000000000029e : + +struct cmd* +listcmd(struct cmd *left, struct cmd *right) +{ + 29e: 7179 addi sp,sp,-48 + 2a0: f406 sd ra,40(sp) + 2a2: f022 sd s0,32(sp) + 2a4: ec26 sd s1,24(sp) + 2a6: e84a sd s2,16(sp) + 2a8: e44e sd s3,8(sp) + 2aa: 1800 addi s0,sp,48 + 2ac: 89aa mv s3,a0 + 2ae: 892e mv s2,a1 + struct listcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 2b0: 4561 li a0,24 + 2b2: 671000ef jal 1122 + 2b6: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 2b8: 4661 li a2,24 + 2ba: 4581 li a1,0 + 2bc: 760000ef jal a1c + cmd->type = LIST; + 2c0: 4791 li a5,4 + 2c2: c09c sw a5,0(s1) + cmd->left = left; + 2c4: 0134b423 sd s3,8(s1) + cmd->right = right; + 2c8: 0124b823 sd s2,16(s1) + return (struct cmd*)cmd; +} + 2cc: 8526 mv a0,s1 + 2ce: 70a2 ld ra,40(sp) + 2d0: 7402 ld s0,32(sp) + 2d2: 64e2 ld s1,24(sp) + 2d4: 6942 ld s2,16(sp) + 2d6: 69a2 ld s3,8(sp) + 2d8: 6145 addi sp,sp,48 + 2da: 8082 ret + +00000000000002dc : + +struct cmd* +backcmd(struct cmd *subcmd) +{ + 2dc: 1101 addi sp,sp,-32 + 2de: ec06 sd ra,24(sp) + 2e0: e822 sd s0,16(sp) + 2e2: e426 sd s1,8(sp) + 2e4: e04a sd s2,0(sp) + 2e6: 1000 addi s0,sp,32 + 2e8: 892a mv s2,a0 + struct backcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 2ea: 4541 li a0,16 + 2ec: 637000ef jal 1122 + 2f0: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 2f2: 4641 li a2,16 + 2f4: 4581 li a1,0 + 2f6: 726000ef jal a1c + cmd->type = BACK; + 2fa: 4795 li a5,5 + 2fc: c09c sw a5,0(s1) + cmd->cmd = subcmd; + 2fe: 0124b423 sd s2,8(s1) + return (struct cmd*)cmd; +} + 302: 8526 mv a0,s1 + 304: 60e2 ld ra,24(sp) + 306: 6442 ld s0,16(sp) + 308: 64a2 ld s1,8(sp) + 30a: 6902 ld s2,0(sp) + 30c: 6105 addi sp,sp,32 + 30e: 8082 ret + +0000000000000310 : +char whitespace[] = " \t\r\n\v"; +char symbols[] = "<|>&;()"; + +int +gettoken(char **ps, char *es, char **q, char **eq) +{ + 310: 7139 addi sp,sp,-64 + 312: fc06 sd ra,56(sp) + 314: f822 sd s0,48(sp) + 316: f426 sd s1,40(sp) + 318: f04a sd s2,32(sp) + 31a: ec4e sd s3,24(sp) + 31c: e852 sd s4,16(sp) + 31e: e456 sd s5,8(sp) + 320: e05a sd s6,0(sp) + 322: 0080 addi s0,sp,64 + 324: 8a2a mv s4,a0 + 326: 892e mv s2,a1 + 328: 8ab2 mv s5,a2 + 32a: 8b36 mv s6,a3 + char *s; + int ret; + + s = *ps; + 32c: 6104 ld s1,0(a0) + while(s < es && strchr(whitespace, *s)) + 32e: 00002997 auipc s3,0x2 + 332: cda98993 addi s3,s3,-806 # 2008 + 336: 00b4fc63 bgeu s1,a1,34e + 33a: 0004c583 lbu a1,0(s1) + 33e: 854e mv a0,s3 + 340: 6fe000ef jal a3e + 344: c509 beqz a0,34e + s++; + 346: 0485 addi s1,s1,1 + while(s < es && strchr(whitespace, *s)) + 348: fe9919e3 bne s2,s1,33a + 34c: 84ca mv s1,s2 + if(q) + 34e: 000a8463 beqz s5,356 + *q = s; + 352: 009ab023 sd s1,0(s5) + ret = *s; + 356: 0004c783 lbu a5,0(s1) + 35a: 00078a9b sext.w s5,a5 + switch(*s){ + 35e: 03c00713 li a4,60 + 362: 06f76463 bltu a4,a5,3ca + 366: 03a00713 li a4,58 + 36a: 00f76e63 bltu a4,a5,386 + 36e: cf89 beqz a5,388 + 370: 02600713 li a4,38 + 374: 00e78963 beq a5,a4,386 + 378: fd87879b addiw a5,a5,-40 + 37c: 0ff7f793 zext.b a5,a5 + 380: 4705 li a4,1 + 382: 06f76b63 bltu a4,a5,3f8 + case '(': + case ')': + case ';': + case '&': + case '<': + s++; + 386: 0485 addi s1,s1,1 + ret = 'a'; + while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) + s++; + break; + } + if(eq) + 388: 000b0463 beqz s6,390 + *eq = s; + 38c: 009b3023 sd s1,0(s6) + + while(s < es && strchr(whitespace, *s)) + 390: 00002997 auipc s3,0x2 + 394: c7898993 addi s3,s3,-904 # 2008 + 398: 0124fc63 bgeu s1,s2,3b0 + 39c: 0004c583 lbu a1,0(s1) + 3a0: 854e mv a0,s3 + 3a2: 69c000ef jal a3e + 3a6: c509 beqz a0,3b0 + s++; + 3a8: 0485 addi s1,s1,1 + while(s < es && strchr(whitespace, *s)) + 3aa: fe9919e3 bne s2,s1,39c + 3ae: 84ca mv s1,s2 + *ps = s; + 3b0: 009a3023 sd s1,0(s4) + return ret; +} + 3b4: 8556 mv a0,s5 + 3b6: 70e2 ld ra,56(sp) + 3b8: 7442 ld s0,48(sp) + 3ba: 74a2 ld s1,40(sp) + 3bc: 7902 ld s2,32(sp) + 3be: 69e2 ld s3,24(sp) + 3c0: 6a42 ld s4,16(sp) + 3c2: 6aa2 ld s5,8(sp) + 3c4: 6b02 ld s6,0(sp) + 3c6: 6121 addi sp,sp,64 + 3c8: 8082 ret + switch(*s){ + 3ca: 03e00713 li a4,62 + 3ce: 02e79163 bne a5,a4,3f0 + s++; + 3d2: 00148693 addi a3,s1,1 + if(*s == '>'){ + 3d6: 0014c703 lbu a4,1(s1) + 3da: 03e00793 li a5,62 + s++; + 3de: 0489 addi s1,s1,2 + ret = '+'; + 3e0: 02b00a93 li s5,43 + if(*s == '>'){ + 3e4: faf702e3 beq a4,a5,388 + s++; + 3e8: 84b6 mv s1,a3 + ret = *s; + 3ea: 03e00a93 li s5,62 + 3ee: bf69 j 388 + switch(*s){ + 3f0: 07c00713 li a4,124 + 3f4: f8e789e3 beq a5,a4,386 + while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) + 3f8: 00002997 auipc s3,0x2 + 3fc: c1098993 addi s3,s3,-1008 # 2008 + 400: 00002a97 auipc s5,0x2 + 404: c00a8a93 addi s5,s5,-1024 # 2000 + 408: 0324fd63 bgeu s1,s2,442 + 40c: 0004c583 lbu a1,0(s1) + 410: 854e mv a0,s3 + 412: 62c000ef jal a3e + 416: e11d bnez a0,43c + 418: 0004c583 lbu a1,0(s1) + 41c: 8556 mv a0,s5 + 41e: 620000ef jal a3e + 422: e911 bnez a0,436 + s++; + 424: 0485 addi s1,s1,1 + while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) + 426: fe9913e3 bne s2,s1,40c + if(eq) + 42a: 84ca mv s1,s2 + ret = 'a'; + 42c: 06100a93 li s5,97 + if(eq) + 430: f40b1ee3 bnez s6,38c + 434: bfb5 j 3b0 + ret = 'a'; + 436: 06100a93 li s5,97 + 43a: b7b9 j 388 + 43c: 06100a93 li s5,97 + 440: b7a1 j 388 + 442: 06100a93 li s5,97 + if(eq) + 446: f40b13e3 bnez s6,38c + 44a: b79d j 3b0 + +000000000000044c : + +int +peek(char **ps, char *es, char *toks) +{ + 44c: 7139 addi sp,sp,-64 + 44e: fc06 sd ra,56(sp) + 450: f822 sd s0,48(sp) + 452: f426 sd s1,40(sp) + 454: f04a sd s2,32(sp) + 456: ec4e sd s3,24(sp) + 458: e852 sd s4,16(sp) + 45a: e456 sd s5,8(sp) + 45c: 0080 addi s0,sp,64 + 45e: 8a2a mv s4,a0 + 460: 892e mv s2,a1 + 462: 8ab2 mv s5,a2 + char *s; + + s = *ps; + 464: 6104 ld s1,0(a0) + while(s < es && strchr(whitespace, *s)) + 466: 00002997 auipc s3,0x2 + 46a: ba298993 addi s3,s3,-1118 # 2008 + 46e: 00b4fc63 bgeu s1,a1,486 + 472: 0004c583 lbu a1,0(s1) + 476: 854e mv a0,s3 + 478: 5c6000ef jal a3e + 47c: c509 beqz a0,486 + s++; + 47e: 0485 addi s1,s1,1 + while(s < es && strchr(whitespace, *s)) + 480: fe9919e3 bne s2,s1,472 + 484: 84ca mv s1,s2 + *ps = s; + 486: 009a3023 sd s1,0(s4) + return *s && strchr(toks, *s); + 48a: 0004c583 lbu a1,0(s1) + 48e: 4501 li a0,0 + 490: e991 bnez a1,4a4 +} + 492: 70e2 ld ra,56(sp) + 494: 7442 ld s0,48(sp) + 496: 74a2 ld s1,40(sp) + 498: 7902 ld s2,32(sp) + 49a: 69e2 ld s3,24(sp) + 49c: 6a42 ld s4,16(sp) + 49e: 6aa2 ld s5,8(sp) + 4a0: 6121 addi sp,sp,64 + 4a2: 8082 ret + return *s && strchr(toks, *s); + 4a4: 8556 mv a0,s5 + 4a6: 598000ef jal a3e + 4aa: 00a03533 snez a0,a0 + 4ae: b7d5 j 492 + +00000000000004b0 : + return cmd; +} + +struct cmd* +parseredirs(struct cmd *cmd, char **ps, char *es) +{ + 4b0: 711d addi sp,sp,-96 + 4b2: ec86 sd ra,88(sp) + 4b4: e8a2 sd s0,80(sp) + 4b6: e4a6 sd s1,72(sp) + 4b8: e0ca sd s2,64(sp) + 4ba: fc4e sd s3,56(sp) + 4bc: f852 sd s4,48(sp) + 4be: f456 sd s5,40(sp) + 4c0: f05a sd s6,32(sp) + 4c2: ec5e sd s7,24(sp) + 4c4: 1080 addi s0,sp,96 + 4c6: 8a2a mv s4,a0 + 4c8: 89ae mv s3,a1 + 4ca: 8932 mv s2,a2 + int tok; + char *q, *eq; + + while(peek(ps, es, "<>")){ + 4cc: 00001a97 auipc s5,0x1 + 4d0: dc4a8a93 addi s5,s5,-572 # 1290 + tok = gettoken(ps, es, 0, 0); + if(gettoken(ps, es, &q, &eq) != 'a') + 4d4: 06100b13 li s6,97 + panic("missing file for redirection"); + switch(tok){ + 4d8: 03c00b93 li s7,60 + while(peek(ps, es, "<>")){ + 4dc: a00d j 4fe + panic("missing file for redirection"); + 4de: 00001517 auipc a0,0x1 + 4e2: d9250513 addi a0,a0,-622 # 1270 + 4e6: b65ff0ef jal 4a + case '<': + cmd = redircmd(cmd, q, eq, O_RDONLY, 0); + 4ea: 4701 li a4,0 + 4ec: 4681 li a3,0 + 4ee: fa043603 ld a2,-96(s0) + 4f2: fa843583 ld a1,-88(s0) + 4f6: 8552 mv a0,s4 + 4f8: d09ff0ef jal 200 + 4fc: 8a2a mv s4,a0 + while(peek(ps, es, "<>")){ + 4fe: 8656 mv a2,s5 + 500: 85ca mv a1,s2 + 502: 854e mv a0,s3 + 504: f49ff0ef jal 44c + 508: c525 beqz a0,570 + tok = gettoken(ps, es, 0, 0); + 50a: 4681 li a3,0 + 50c: 4601 li a2,0 + 50e: 85ca mv a1,s2 + 510: 854e mv a0,s3 + 512: dffff0ef jal 310 + 516: 84aa mv s1,a0 + if(gettoken(ps, es, &q, &eq) != 'a') + 518: fa040693 addi a3,s0,-96 + 51c: fa840613 addi a2,s0,-88 + 520: 85ca mv a1,s2 + 522: 854e mv a0,s3 + 524: dedff0ef jal 310 + 528: fb651be3 bne a0,s6,4de + switch(tok){ + 52c: fb748fe3 beq s1,s7,4ea + 530: 03e00793 li a5,62 + 534: 02f48263 beq s1,a5,558 + 538: 02b00793 li a5,43 + 53c: fcf491e3 bne s1,a5,4fe + 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, 1); + 540: 4705 li a4,1 + 542: 20100693 li a3,513 + 546: fa043603 ld a2,-96(s0) + 54a: fa843583 ld a1,-88(s0) + 54e: 8552 mv a0,s4 + 550: cb1ff0ef jal 200 + 554: 8a2a mv s4,a0 + break; + 556: b765 j 4fe + cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE|O_TRUNC, 1); + 558: 4705 li a4,1 + 55a: 60100693 li a3,1537 + 55e: fa043603 ld a2,-96(s0) + 562: fa843583 ld a1,-88(s0) + 566: 8552 mv a0,s4 + 568: c99ff0ef jal 200 + 56c: 8a2a mv s4,a0 + break; + 56e: bf41 j 4fe + } + } + return cmd; +} + 570: 8552 mv a0,s4 + 572: 60e6 ld ra,88(sp) + 574: 6446 ld s0,80(sp) + 576: 64a6 ld s1,72(sp) + 578: 6906 ld s2,64(sp) + 57a: 79e2 ld s3,56(sp) + 57c: 7a42 ld s4,48(sp) + 57e: 7aa2 ld s5,40(sp) + 580: 7b02 ld s6,32(sp) + 582: 6be2 ld s7,24(sp) + 584: 6125 addi sp,sp,96 + 586: 8082 ret + +0000000000000588 : + return cmd; +} + +struct cmd* +parseexec(char **ps, char *es) +{ + 588: 7159 addi sp,sp,-112 + 58a: f486 sd ra,104(sp) + 58c: f0a2 sd s0,96(sp) + 58e: eca6 sd s1,88(sp) + 590: e0d2 sd s4,64(sp) + 592: fc56 sd s5,56(sp) + 594: 1880 addi s0,sp,112 + 596: 8a2a mv s4,a0 + 598: 8aae mv s5,a1 + char *q, *eq; + int tok, argc; + struct execcmd *cmd; + struct cmd *ret; + + if(peek(ps, es, "(")) + 59a: 00001617 auipc a2,0x1 + 59e: cfe60613 addi a2,a2,-770 # 1298 + 5a2: eabff0ef jal 44c + 5a6: e915 bnez a0,5da + 5a8: e8ca sd s2,80(sp) + 5aa: e4ce sd s3,72(sp) + 5ac: f85a sd s6,48(sp) + 5ae: f45e sd s7,40(sp) + 5b0: f062 sd s8,32(sp) + 5b2: ec66 sd s9,24(sp) + 5b4: 89aa mv s3,a0 + return parseblock(ps, es); + + ret = execcmd(); + 5b6: c1dff0ef jal 1d2 + 5ba: 8c2a mv s8,a0 + cmd = (struct execcmd*)ret; + + argc = 0; + ret = parseredirs(ret, ps, es); + 5bc: 8656 mv a2,s5 + 5be: 85d2 mv a1,s4 + 5c0: ef1ff0ef jal 4b0 + 5c4: 84aa mv s1,a0 + while(!peek(ps, es, "|)&;")){ + 5c6: 008c0913 addi s2,s8,8 + 5ca: 00001b17 auipc s6,0x1 + 5ce: ceeb0b13 addi s6,s6,-786 # 12b8 + if((tok=gettoken(ps, es, &q, &eq)) == 0) + break; + if(tok != 'a') + 5d2: 06100c93 li s9,97 + panic("syntax"); + cmd->argv[argc] = q; + cmd->eargv[argc] = eq; + argc++; + if(argc >= MAXARGS) + 5d6: 4ba9 li s7,10 + while(!peek(ps, es, "|)&;")){ + 5d8: a815 j 60c + return parseblock(ps, es); + 5da: 85d6 mv a1,s5 + 5dc: 8552 mv a0,s4 + 5de: 170000ef jal 74e + 5e2: 84aa mv s1,a0 + ret = parseredirs(ret, ps, es); + } + cmd->argv[argc] = 0; + cmd->eargv[argc] = 0; + return ret; +} + 5e4: 8526 mv a0,s1 + 5e6: 70a6 ld ra,104(sp) + 5e8: 7406 ld s0,96(sp) + 5ea: 64e6 ld s1,88(sp) + 5ec: 6a06 ld s4,64(sp) + 5ee: 7ae2 ld s5,56(sp) + 5f0: 6165 addi sp,sp,112 + 5f2: 8082 ret + panic("syntax"); + 5f4: 00001517 auipc a0,0x1 + 5f8: cac50513 addi a0,a0,-852 # 12a0 + 5fc: a4fff0ef jal 4a + ret = parseredirs(ret, ps, es); + 600: 8656 mv a2,s5 + 602: 85d2 mv a1,s4 + 604: 8526 mv a0,s1 + 606: eabff0ef jal 4b0 + 60a: 84aa mv s1,a0 + while(!peek(ps, es, "|)&;")){ + 60c: 865a mv a2,s6 + 60e: 85d6 mv a1,s5 + 610: 8552 mv a0,s4 + 612: e3bff0ef jal 44c + 616: ed15 bnez a0,652 + if((tok=gettoken(ps, es, &q, &eq)) == 0) + 618: f9040693 addi a3,s0,-112 + 61c: f9840613 addi a2,s0,-104 + 620: 85d6 mv a1,s5 + 622: 8552 mv a0,s4 + 624: cedff0ef jal 310 + 628: c50d beqz a0,652 + if(tok != 'a') + 62a: fd9515e3 bne a0,s9,5f4 + cmd->argv[argc] = q; + 62e: f9843783 ld a5,-104(s0) + 632: 00f93023 sd a5,0(s2) + cmd->eargv[argc] = eq; + 636: f9043783 ld a5,-112(s0) + 63a: 04f93823 sd a5,80(s2) + argc++; + 63e: 2985 addiw s3,s3,1 + if(argc >= MAXARGS) + 640: 0921 addi s2,s2,8 + 642: fb799fe3 bne s3,s7,600 + panic("too many args"); + 646: 00001517 auipc a0,0x1 + 64a: c6250513 addi a0,a0,-926 # 12a8 + 64e: 9fdff0ef jal 4a + cmd->argv[argc] = 0; + 652: 098e slli s3,s3,0x3 + 654: 9c4e add s8,s8,s3 + 656: 000c3423 sd zero,8(s8) + cmd->eargv[argc] = 0; + 65a: 040c3c23 sd zero,88(s8) + 65e: 6946 ld s2,80(sp) + 660: 69a6 ld s3,72(sp) + 662: 7b42 ld s6,48(sp) + 664: 7ba2 ld s7,40(sp) + 666: 7c02 ld s8,32(sp) + 668: 6ce2 ld s9,24(sp) + return ret; + 66a: bfad j 5e4 + +000000000000066c : +{ + 66c: 7179 addi sp,sp,-48 + 66e: f406 sd ra,40(sp) + 670: f022 sd s0,32(sp) + 672: ec26 sd s1,24(sp) + 674: e84a sd s2,16(sp) + 676: e44e sd s3,8(sp) + 678: 1800 addi s0,sp,48 + 67a: 892a mv s2,a0 + 67c: 89ae mv s3,a1 + cmd = parseexec(ps, es); + 67e: f0bff0ef jal 588 + 682: 84aa mv s1,a0 + if(peek(ps, es, "|")){ + 684: 00001617 auipc a2,0x1 + 688: c3c60613 addi a2,a2,-964 # 12c0 + 68c: 85ce mv a1,s3 + 68e: 854a mv a0,s2 + 690: dbdff0ef jal 44c + 694: e909 bnez a0,6a6 +} + 696: 8526 mv a0,s1 + 698: 70a2 ld ra,40(sp) + 69a: 7402 ld s0,32(sp) + 69c: 64e2 ld s1,24(sp) + 69e: 6942 ld s2,16(sp) + 6a0: 69a2 ld s3,8(sp) + 6a2: 6145 addi sp,sp,48 + 6a4: 8082 ret + gettoken(ps, es, 0, 0); + 6a6: 4681 li a3,0 + 6a8: 4601 li a2,0 + 6aa: 85ce mv a1,s3 + 6ac: 854a mv a0,s2 + 6ae: c63ff0ef jal 310 + cmd = pipecmd(cmd, parsepipe(ps, es)); + 6b2: 85ce mv a1,s3 + 6b4: 854a mv a0,s2 + 6b6: fb7ff0ef jal 66c + 6ba: 85aa mv a1,a0 + 6bc: 8526 mv a0,s1 + 6be: ba3ff0ef jal 260 + 6c2: 84aa mv s1,a0 + return cmd; + 6c4: bfc9 j 696 + +00000000000006c6 : +{ + 6c6: 7179 addi sp,sp,-48 + 6c8: f406 sd ra,40(sp) + 6ca: f022 sd s0,32(sp) + 6cc: ec26 sd s1,24(sp) + 6ce: e84a sd s2,16(sp) + 6d0: e44e sd s3,8(sp) + 6d2: e052 sd s4,0(sp) + 6d4: 1800 addi s0,sp,48 + 6d6: 892a mv s2,a0 + 6d8: 89ae mv s3,a1 + cmd = parsepipe(ps, es); + 6da: f93ff0ef jal 66c + 6de: 84aa mv s1,a0 + while(peek(ps, es, "&")){ + 6e0: 00001a17 auipc s4,0x1 + 6e4: be8a0a13 addi s4,s4,-1048 # 12c8 + 6e8: a819 j 6fe + gettoken(ps, es, 0, 0); + 6ea: 4681 li a3,0 + 6ec: 4601 li a2,0 + 6ee: 85ce mv a1,s3 + 6f0: 854a mv a0,s2 + 6f2: c1fff0ef jal 310 + cmd = backcmd(cmd); + 6f6: 8526 mv a0,s1 + 6f8: be5ff0ef jal 2dc + 6fc: 84aa mv s1,a0 + while(peek(ps, es, "&")){ + 6fe: 8652 mv a2,s4 + 700: 85ce mv a1,s3 + 702: 854a mv a0,s2 + 704: d49ff0ef jal 44c + 708: f16d bnez a0,6ea + if(peek(ps, es, ";")){ + 70a: 00001617 auipc a2,0x1 + 70e: bc660613 addi a2,a2,-1082 # 12d0 + 712: 85ce mv a1,s3 + 714: 854a mv a0,s2 + 716: d37ff0ef jal 44c + 71a: e911 bnez a0,72e +} + 71c: 8526 mv a0,s1 + 71e: 70a2 ld ra,40(sp) + 720: 7402 ld s0,32(sp) + 722: 64e2 ld s1,24(sp) + 724: 6942 ld s2,16(sp) + 726: 69a2 ld s3,8(sp) + 728: 6a02 ld s4,0(sp) + 72a: 6145 addi sp,sp,48 + 72c: 8082 ret + gettoken(ps, es, 0, 0); + 72e: 4681 li a3,0 + 730: 4601 li a2,0 + 732: 85ce mv a1,s3 + 734: 854a mv a0,s2 + 736: bdbff0ef jal 310 + cmd = listcmd(cmd, parseline(ps, es)); + 73a: 85ce mv a1,s3 + 73c: 854a mv a0,s2 + 73e: f89ff0ef jal 6c6 + 742: 85aa mv a1,a0 + 744: 8526 mv a0,s1 + 746: b59ff0ef jal 29e + 74a: 84aa mv s1,a0 + return cmd; + 74c: bfc1 j 71c + +000000000000074e : +{ + 74e: 7179 addi sp,sp,-48 + 750: f406 sd ra,40(sp) + 752: f022 sd s0,32(sp) + 754: ec26 sd s1,24(sp) + 756: e84a sd s2,16(sp) + 758: e44e sd s3,8(sp) + 75a: 1800 addi s0,sp,48 + 75c: 84aa mv s1,a0 + 75e: 892e mv s2,a1 + if(!peek(ps, es, "(")) + 760: 00001617 auipc a2,0x1 + 764: b3860613 addi a2,a2,-1224 # 1298 + 768: ce5ff0ef jal 44c + 76c: c539 beqz a0,7ba + gettoken(ps, es, 0, 0); + 76e: 4681 li a3,0 + 770: 4601 li a2,0 + 772: 85ca mv a1,s2 + 774: 8526 mv a0,s1 + 776: b9bff0ef jal 310 + cmd = parseline(ps, es); + 77a: 85ca mv a1,s2 + 77c: 8526 mv a0,s1 + 77e: f49ff0ef jal 6c6 + 782: 89aa mv s3,a0 + if(!peek(ps, es, ")")) + 784: 00001617 auipc a2,0x1 + 788: b6460613 addi a2,a2,-1180 # 12e8 + 78c: 85ca mv a1,s2 + 78e: 8526 mv a0,s1 + 790: cbdff0ef jal 44c + 794: c90d beqz a0,7c6 + gettoken(ps, es, 0, 0); + 796: 4681 li a3,0 + 798: 4601 li a2,0 + 79a: 85ca mv a1,s2 + 79c: 8526 mv a0,s1 + 79e: b73ff0ef jal 310 + cmd = parseredirs(cmd, ps, es); + 7a2: 864a mv a2,s2 + 7a4: 85a6 mv a1,s1 + 7a6: 854e mv a0,s3 + 7a8: d09ff0ef jal 4b0 +} + 7ac: 70a2 ld ra,40(sp) + 7ae: 7402 ld s0,32(sp) + 7b0: 64e2 ld s1,24(sp) + 7b2: 6942 ld s2,16(sp) + 7b4: 69a2 ld s3,8(sp) + 7b6: 6145 addi sp,sp,48 + 7b8: 8082 ret + panic("parseblock"); + 7ba: 00001517 auipc a0,0x1 + 7be: b1e50513 addi a0,a0,-1250 # 12d8 + 7c2: 889ff0ef jal 4a + panic("syntax - missing )"); + 7c6: 00001517 auipc a0,0x1 + 7ca: b2a50513 addi a0,a0,-1238 # 12f0 + 7ce: 87dff0ef jal 4a + +00000000000007d2 : + +// NUL-terminate all the counted strings. +struct cmd* +nulterminate(struct cmd *cmd) +{ + 7d2: 1101 addi sp,sp,-32 + 7d4: ec06 sd ra,24(sp) + 7d6: e822 sd s0,16(sp) + 7d8: e426 sd s1,8(sp) + 7da: 1000 addi s0,sp,32 + 7dc: 84aa mv s1,a0 + struct execcmd *ecmd; + struct listcmd *lcmd; + struct pipecmd *pcmd; + struct redircmd *rcmd; + + if(cmd == 0) + 7de: c131 beqz a0,822 + return 0; + + switch(cmd->type){ + 7e0: 4118 lw a4,0(a0) + 7e2: 4795 li a5,5 + 7e4: 02e7ef63 bltu a5,a4,822 + 7e8: 00056783 lwu a5,0(a0) + 7ec: 078a slli a5,a5,0x2 + 7ee: 00001717 auipc a4,0x1 + 7f2: b6270713 addi a4,a4,-1182 # 1350 + 7f6: 97ba add a5,a5,a4 + 7f8: 439c lw a5,0(a5) + 7fa: 97ba add a5,a5,a4 + 7fc: 8782 jr a5 + case EXEC: + ecmd = (struct execcmd*)cmd; + for(i=0; ecmd->argv[i]; i++) + 7fe: 651c ld a5,8(a0) + 800: c38d beqz a5,822 + 802: 01050793 addi a5,a0,16 + *ecmd->eargv[i] = 0; + 806: 67b8 ld a4,72(a5) + 808: 00070023 sb zero,0(a4) + for(i=0; ecmd->argv[i]; i++) + 80c: 07a1 addi a5,a5,8 + 80e: ff87b703 ld a4,-8(a5) + 812: fb75 bnez a4,806 + 814: a039 j 822 + break; + + case REDIR: + rcmd = (struct redircmd*)cmd; + nulterminate(rcmd->cmd); + 816: 6508 ld a0,8(a0) + 818: fbbff0ef jal 7d2 + *rcmd->efile = 0; + 81c: 6c9c ld a5,24(s1) + 81e: 00078023 sb zero,0(a5) + bcmd = (struct backcmd*)cmd; + nulterminate(bcmd->cmd); + break; + } + return cmd; +} + 822: 8526 mv a0,s1 + 824: 60e2 ld ra,24(sp) + 826: 6442 ld s0,16(sp) + 828: 64a2 ld s1,8(sp) + 82a: 6105 addi sp,sp,32 + 82c: 8082 ret + nulterminate(pcmd->left); + 82e: 6508 ld a0,8(a0) + 830: fa3ff0ef jal 7d2 + nulterminate(pcmd->right); + 834: 6888 ld a0,16(s1) + 836: f9dff0ef jal 7d2 + break; + 83a: b7e5 j 822 + nulterminate(lcmd->left); + 83c: 6508 ld a0,8(a0) + 83e: f95ff0ef jal 7d2 + nulterminate(lcmd->right); + 842: 6888 ld a0,16(s1) + 844: f8fff0ef jal 7d2 + break; + 848: bfe9 j 822 + nulterminate(bcmd->cmd); + 84a: 6508 ld a0,8(a0) + 84c: f87ff0ef jal 7d2 + break; + 850: bfc9 j 822 + +0000000000000852 : +{ + 852: 7179 addi sp,sp,-48 + 854: f406 sd ra,40(sp) + 856: f022 sd s0,32(sp) + 858: ec26 sd s1,24(sp) + 85a: e84a sd s2,16(sp) + 85c: 1800 addi s0,sp,48 + 85e: fca43c23 sd a0,-40(s0) + es = s + strlen(s); + 862: 84aa mv s1,a0 + 864: 18e000ef jal 9f2 + 868: 1502 slli a0,a0,0x20 + 86a: 9101 srli a0,a0,0x20 + 86c: 94aa add s1,s1,a0 + cmd = parseline(&s, es); + 86e: 85a6 mv a1,s1 + 870: fd840513 addi a0,s0,-40 + 874: e53ff0ef jal 6c6 + 878: 892a mv s2,a0 + peek(&s, es, ""); + 87a: 00001617 auipc a2,0x1 + 87e: 9ae60613 addi a2,a2,-1618 # 1228 + 882: 85a6 mv a1,s1 + 884: fd840513 addi a0,s0,-40 + 888: bc5ff0ef jal 44c + if(s != es){ + 88c: fd843603 ld a2,-40(s0) + 890: 00961c63 bne a2,s1,8a8 + nulterminate(cmd); + 894: 854a mv a0,s2 + 896: f3dff0ef jal 7d2 +} + 89a: 854a mv a0,s2 + 89c: 70a2 ld ra,40(sp) + 89e: 7402 ld s0,32(sp) + 8a0: 64e2 ld s1,24(sp) + 8a2: 6942 ld s2,16(sp) + 8a4: 6145 addi sp,sp,48 + 8a6: 8082 ret + fprintf(2, "leftovers: %s\n", s); + 8a8: 00001597 auipc a1,0x1 + 8ac: a6058593 addi a1,a1,-1440 # 1308 + 8b0: 4509 li a0,2 + 8b2: 792000ef jal 1044 + panic("syntax"); + 8b6: 00001517 auipc a0,0x1 + 8ba: 9ea50513 addi a0,a0,-1558 # 12a0 + 8be: f8cff0ef jal 4a + +00000000000008c2
: +{ + 8c2: 7139 addi sp,sp,-64 + 8c4: fc06 sd ra,56(sp) + 8c6: f822 sd s0,48(sp) + 8c8: f426 sd s1,40(sp) + 8ca: f04a sd s2,32(sp) + 8cc: ec4e sd s3,24(sp) + 8ce: e852 sd s4,16(sp) + 8d0: e456 sd s5,8(sp) + 8d2: e05a sd s6,0(sp) + 8d4: 0080 addi s0,sp,64 + while((fd = open("console", O_RDWR)) >= 0){ + 8d6: 00001497 auipc s1,0x1 + 8da: a4248493 addi s1,s1,-1470 # 1318 + 8de: 4589 li a1,2 + 8e0: 8526 mv a0,s1 + 8e2: 38c000ef jal c6e + 8e6: 00054763 bltz a0,8f4 + if(fd >= 3){ + 8ea: 4789 li a5,2 + 8ec: fea7d9e3 bge a5,a0,8de + close(fd); + 8f0: 366000ef jal c56 + while(getcmd(buf, sizeof(buf)) >= 0){ + 8f4: 00001a17 auipc s4,0x1 + 8f8: 72ca0a13 addi s4,s4,1836 # 2020 + while (*cmd == ' ' || *cmd == '\t') + 8fc: 02000913 li s2,32 + 900: 49a5 li s3,9 + if (*cmd == '\n') // is a blank command + 902: 4aa9 li s5,10 + if(cmd[0] == 'c' && cmd[1] == 'd' && cmd[2] == ' '){ + 904: 06300b13 li s6,99 + 908: a805 j 938 + cmd++; + 90a: 0485 addi s1,s1,1 + while (*cmd == ' ' || *cmd == '\t') + 90c: 0004c783 lbu a5,0(s1) + 910: ff278de3 beq a5,s2,90a + 914: ff378be3 beq a5,s3,90a + if (*cmd == '\n') // is a blank command + 918: 03578063 beq a5,s5,938 + if(cmd[0] == 'c' && cmd[1] == 'd' && cmd[2] == ' '){ + 91c: 01679863 bne a5,s6,92c + 920: 0014c703 lbu a4,1(s1) + 924: 06400793 li a5,100 + 928: 02f70463 beq a4,a5,950 + if(fork1() == 0) + 92c: f3cff0ef jal 68 + 930: cd29 beqz a0,98a + wait(0); + 932: 4501 li a0,0 + 934: 302000ef jal c36 + while(getcmd(buf, sizeof(buf)) >= 0){ + 938: 06400593 li a1,100 + 93c: 8552 mv a0,s4 + 93e: ec2ff0ef jal 0 + 942: 04054963 bltz a0,994 + char *cmd = buf; + 946: 00001497 auipc s1,0x1 + 94a: 6da48493 addi s1,s1,1754 # 2020 + 94e: bf7d j 90c + if(cmd[0] == 'c' && cmd[1] == 'd' && cmd[2] == ' '){ + 950: 0024c783 lbu a5,2(s1) + 954: fd279ce3 bne a5,s2,92c + cmd[strlen(cmd)-1] = 0; // chop \n + 958: 8526 mv a0,s1 + 95a: 098000ef jal 9f2 + 95e: fff5079b addiw a5,a0,-1 + 962: 1782 slli a5,a5,0x20 + 964: 9381 srli a5,a5,0x20 + 966: 97a6 add a5,a5,s1 + 968: 00078023 sb zero,0(a5) + if(chdir(cmd+3) < 0) + 96c: 048d addi s1,s1,3 + 96e: 8526 mv a0,s1 + 970: 32e000ef jal c9e + 974: fc0552e3 bgez a0,938 + fprintf(2, "cannot cd %s\n", cmd+3); + 978: 8626 mv a2,s1 + 97a: 00001597 auipc a1,0x1 + 97e: 9a658593 addi a1,a1,-1626 # 1320 + 982: 4509 li a0,2 + 984: 6c0000ef jal 1044 + 988: bf45 j 938 + runcmd(parsecmd(cmd)); + 98a: 8526 mv a0,s1 + 98c: ec7ff0ef jal 852 + 990: efeff0ef jal 8e + exit(0); + 994: 4501 li a0,0 + 996: 298000ef jal c2e + +000000000000099a : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 99a: 1141 addi sp,sp,-16 + 99c: e406 sd ra,8(sp) + 99e: e022 sd s0,0(sp) + 9a0: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 9a2: f21ff0ef jal 8c2
+ exit(r); + 9a6: 288000ef jal c2e + +00000000000009aa : +} + +char* +strcpy(char *s, const char *t) +{ + 9aa: 1141 addi sp,sp,-16 + 9ac: e422 sd s0,8(sp) + 9ae: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 9b0: 87aa mv a5,a0 + 9b2: 0585 addi a1,a1,1 + 9b4: 0785 addi a5,a5,1 + 9b6: fff5c703 lbu a4,-1(a1) + 9ba: fee78fa3 sb a4,-1(a5) + 9be: fb75 bnez a4,9b2 + ; + return os; +} + 9c0: 6422 ld s0,8(sp) + 9c2: 0141 addi sp,sp,16 + 9c4: 8082 ret + +00000000000009c6 : + +int +strcmp(const char *p, const char *q) +{ + 9c6: 1141 addi sp,sp,-16 + 9c8: e422 sd s0,8(sp) + 9ca: 0800 addi s0,sp,16 + while(*p && *p == *q) + 9cc: 00054783 lbu a5,0(a0) + 9d0: cb91 beqz a5,9e4 + 9d2: 0005c703 lbu a4,0(a1) + 9d6: 00f71763 bne a4,a5,9e4 + p++, q++; + 9da: 0505 addi a0,a0,1 + 9dc: 0585 addi a1,a1,1 + while(*p && *p == *q) + 9de: 00054783 lbu a5,0(a0) + 9e2: fbe5 bnez a5,9d2 + return (uchar)*p - (uchar)*q; + 9e4: 0005c503 lbu a0,0(a1) +} + 9e8: 40a7853b subw a0,a5,a0 + 9ec: 6422 ld s0,8(sp) + 9ee: 0141 addi sp,sp,16 + 9f0: 8082 ret + +00000000000009f2 : + +uint +strlen(const char *s) +{ + 9f2: 1141 addi sp,sp,-16 + 9f4: e422 sd s0,8(sp) + 9f6: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 9f8: 00054783 lbu a5,0(a0) + 9fc: cf91 beqz a5,a18 + 9fe: 0505 addi a0,a0,1 + a00: 87aa mv a5,a0 + a02: 86be mv a3,a5 + a04: 0785 addi a5,a5,1 + a06: fff7c703 lbu a4,-1(a5) + a0a: ff65 bnez a4,a02 + a0c: 40a6853b subw a0,a3,a0 + a10: 2505 addiw a0,a0,1 + ; + return n; +} + a12: 6422 ld s0,8(sp) + a14: 0141 addi sp,sp,16 + a16: 8082 ret + for(n = 0; s[n]; n++) + a18: 4501 li a0,0 + a1a: bfe5 j a12 + +0000000000000a1c : + +void* +memset(void *dst, int c, uint n) +{ + a1c: 1141 addi sp,sp,-16 + a1e: e422 sd s0,8(sp) + a20: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + a22: ca19 beqz a2,a38 + a24: 87aa mv a5,a0 + a26: 1602 slli a2,a2,0x20 + a28: 9201 srli a2,a2,0x20 + a2a: 00a60733 add a4,a2,a0 + cdst[i] = c; + a2e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + a32: 0785 addi a5,a5,1 + a34: fee79de3 bne a5,a4,a2e + } + return dst; +} + a38: 6422 ld s0,8(sp) + a3a: 0141 addi sp,sp,16 + a3c: 8082 ret + +0000000000000a3e : + +char* +strchr(const char *s, char c) +{ + a3e: 1141 addi sp,sp,-16 + a40: e422 sd s0,8(sp) + a42: 0800 addi s0,sp,16 + for(; *s; s++) + a44: 00054783 lbu a5,0(a0) + a48: cb99 beqz a5,a5e + if(*s == c) + a4a: 00f58763 beq a1,a5,a58 + for(; *s; s++) + a4e: 0505 addi a0,a0,1 + a50: 00054783 lbu a5,0(a0) + a54: fbfd bnez a5,a4a + return (char*)s; + return 0; + a56: 4501 li a0,0 +} + a58: 6422 ld s0,8(sp) + a5a: 0141 addi sp,sp,16 + a5c: 8082 ret + return 0; + a5e: 4501 li a0,0 + a60: bfe5 j a58 + +0000000000000a62 : + +char* +gets(char *buf, int max) +{ + a62: 711d addi sp,sp,-96 + a64: ec86 sd ra,88(sp) + a66: e8a2 sd s0,80(sp) + a68: e4a6 sd s1,72(sp) + a6a: e0ca sd s2,64(sp) + a6c: fc4e sd s3,56(sp) + a6e: f852 sd s4,48(sp) + a70: f456 sd s5,40(sp) + a72: f05a sd s6,32(sp) + a74: ec5e sd s7,24(sp) + a76: 1080 addi s0,sp,96 + a78: 8baa mv s7,a0 + a7a: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + a7c: 892a mv s2,a0 + a7e: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + a80: 4aa9 li s5,10 + a82: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + a84: 89a6 mv s3,s1 + a86: 2485 addiw s1,s1,1 + a88: 0344d663 bge s1,s4,ab4 + cc = read(0, &c, 1); + a8c: 4605 li a2,1 + a8e: faf40593 addi a1,s0,-81 + a92: 4501 li a0,0 + a94: 1b2000ef jal c46 + if(cc < 1) + a98: 00a05e63 blez a0,ab4 + buf[i++] = c; + a9c: faf44783 lbu a5,-81(s0) + aa0: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + aa4: 01578763 beq a5,s5,ab2 + aa8: 0905 addi s2,s2,1 + aaa: fd679de3 bne a5,s6,a84 + buf[i++] = c; + aae: 89a6 mv s3,s1 + ab0: a011 j ab4 + ab2: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + ab4: 99de add s3,s3,s7 + ab6: 00098023 sb zero,0(s3) + return buf; +} + aba: 855e mv a0,s7 + abc: 60e6 ld ra,88(sp) + abe: 6446 ld s0,80(sp) + ac0: 64a6 ld s1,72(sp) + ac2: 6906 ld s2,64(sp) + ac4: 79e2 ld s3,56(sp) + ac6: 7a42 ld s4,48(sp) + ac8: 7aa2 ld s5,40(sp) + aca: 7b02 ld s6,32(sp) + acc: 6be2 ld s7,24(sp) + ace: 6125 addi sp,sp,96 + ad0: 8082 ret + +0000000000000ad2 : + +int +stat(const char *n, struct stat *st) +{ + ad2: 1101 addi sp,sp,-32 + ad4: ec06 sd ra,24(sp) + ad6: e822 sd s0,16(sp) + ad8: e04a sd s2,0(sp) + ada: 1000 addi s0,sp,32 + adc: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + ade: 4581 li a1,0 + ae0: 18e000ef jal c6e + if(fd < 0) + ae4: 02054263 bltz a0,b08 + ae8: e426 sd s1,8(sp) + aea: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + aec: 85ca mv a1,s2 + aee: 198000ef jal c86 + af2: 892a mv s2,a0 + close(fd); + af4: 8526 mv a0,s1 + af6: 160000ef jal c56 + return r; + afa: 64a2 ld s1,8(sp) +} + afc: 854a mv a0,s2 + afe: 60e2 ld ra,24(sp) + b00: 6442 ld s0,16(sp) + b02: 6902 ld s2,0(sp) + b04: 6105 addi sp,sp,32 + b06: 8082 ret + return -1; + b08: 597d li s2,-1 + b0a: bfcd j afc + +0000000000000b0c : + +int +atoi(const char *s) +{ + b0c: 1141 addi sp,sp,-16 + b0e: e422 sd s0,8(sp) + b10: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + b12: 00054683 lbu a3,0(a0) + b16: fd06879b addiw a5,a3,-48 + b1a: 0ff7f793 zext.b a5,a5 + b1e: 4625 li a2,9 + b20: 02f66863 bltu a2,a5,b50 + b24: 872a mv a4,a0 + n = 0; + b26: 4501 li a0,0 + n = n*10 + *s++ - '0'; + b28: 0705 addi a4,a4,1 + b2a: 0025179b slliw a5,a0,0x2 + b2e: 9fa9 addw a5,a5,a0 + b30: 0017979b slliw a5,a5,0x1 + b34: 9fb5 addw a5,a5,a3 + b36: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + b3a: 00074683 lbu a3,0(a4) + b3e: fd06879b addiw a5,a3,-48 + b42: 0ff7f793 zext.b a5,a5 + b46: fef671e3 bgeu a2,a5,b28 + return n; +} + b4a: 6422 ld s0,8(sp) + b4c: 0141 addi sp,sp,16 + b4e: 8082 ret + n = 0; + b50: 4501 li a0,0 + b52: bfe5 j b4a + +0000000000000b54 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + b54: 1141 addi sp,sp,-16 + b56: e422 sd s0,8(sp) + b58: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + b5a: 02b57463 bgeu a0,a1,b82 + while(n-- > 0) + b5e: 00c05f63 blez a2,b7c + b62: 1602 slli a2,a2,0x20 + b64: 9201 srli a2,a2,0x20 + b66: 00c507b3 add a5,a0,a2 + dst = vdst; + b6a: 872a mv a4,a0 + *dst++ = *src++; + b6c: 0585 addi a1,a1,1 + b6e: 0705 addi a4,a4,1 + b70: fff5c683 lbu a3,-1(a1) + b74: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + b78: fef71ae3 bne a4,a5,b6c + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + b7c: 6422 ld s0,8(sp) + b7e: 0141 addi sp,sp,16 + b80: 8082 ret + dst += n; + b82: 00c50733 add a4,a0,a2 + src += n; + b86: 95b2 add a1,a1,a2 + while(n-- > 0) + b88: fec05ae3 blez a2,b7c + b8c: fff6079b addiw a5,a2,-1 + b90: 1782 slli a5,a5,0x20 + b92: 9381 srli a5,a5,0x20 + b94: fff7c793 not a5,a5 + b98: 97ba add a5,a5,a4 + *--dst = *--src; + b9a: 15fd addi a1,a1,-1 + b9c: 177d addi a4,a4,-1 + b9e: 0005c683 lbu a3,0(a1) + ba2: 00d70023 sb a3,0(a4) + while(n-- > 0) + ba6: fee79ae3 bne a5,a4,b9a + baa: bfc9 j b7c + +0000000000000bac : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + bac: 1141 addi sp,sp,-16 + bae: e422 sd s0,8(sp) + bb0: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + bb2: ca05 beqz a2,be2 + bb4: fff6069b addiw a3,a2,-1 + bb8: 1682 slli a3,a3,0x20 + bba: 9281 srli a3,a3,0x20 + bbc: 0685 addi a3,a3,1 + bbe: 96aa add a3,a3,a0 + if (*p1 != *p2) { + bc0: 00054783 lbu a5,0(a0) + bc4: 0005c703 lbu a4,0(a1) + bc8: 00e79863 bne a5,a4,bd8 + return *p1 - *p2; + } + p1++; + bcc: 0505 addi a0,a0,1 + p2++; + bce: 0585 addi a1,a1,1 + while (n-- > 0) { + bd0: fed518e3 bne a0,a3,bc0 + } + return 0; + bd4: 4501 li a0,0 + bd6: a019 j bdc + return *p1 - *p2; + bd8: 40e7853b subw a0,a5,a4 +} + bdc: 6422 ld s0,8(sp) + bde: 0141 addi sp,sp,16 + be0: 8082 ret + return 0; + be2: 4501 li a0,0 + be4: bfe5 j bdc + +0000000000000be6 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + be6: 1141 addi sp,sp,-16 + be8: e406 sd ra,8(sp) + bea: e022 sd s0,0(sp) + bec: 0800 addi s0,sp,16 + return memmove(dst, src, n); + bee: f67ff0ef jal b54 +} + bf2: 60a2 ld ra,8(sp) + bf4: 6402 ld s0,0(sp) + bf6: 0141 addi sp,sp,16 + bf8: 8082 ret + +0000000000000bfa : + +char * +sbrk(int n) { + bfa: 1141 addi sp,sp,-16 + bfc: e406 sd ra,8(sp) + bfe: e022 sd s0,0(sp) + c00: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + c02: 4585 li a1,1 + c04: 0b2000ef jal cb6 +} + c08: 60a2 ld ra,8(sp) + c0a: 6402 ld s0,0(sp) + c0c: 0141 addi sp,sp,16 + c0e: 8082 ret + +0000000000000c10 : + +char * +sbrklazy(int n) { + c10: 1141 addi sp,sp,-16 + c12: e406 sd ra,8(sp) + c14: e022 sd s0,0(sp) + c16: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + c18: 4589 li a1,2 + c1a: 09c000ef jal cb6 +} + c1e: 60a2 ld ra,8(sp) + c20: 6402 ld s0,0(sp) + c22: 0141 addi sp,sp,16 + c24: 8082 ret + +0000000000000c26 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + c26: 4885 li a7,1 + ecall + c28: 00000073 ecall + ret + c2c: 8082 ret + +0000000000000c2e : +.global exit +exit: + li a7, SYS_exit + c2e: 4889 li a7,2 + ecall + c30: 00000073 ecall + ret + c34: 8082 ret + +0000000000000c36 : +.global wait +wait: + li a7, SYS_wait + c36: 488d li a7,3 + ecall + c38: 00000073 ecall + ret + c3c: 8082 ret + +0000000000000c3e : +.global pipe +pipe: + li a7, SYS_pipe + c3e: 4891 li a7,4 + ecall + c40: 00000073 ecall + ret + c44: 8082 ret + +0000000000000c46 : +.global read +read: + li a7, SYS_read + c46: 4895 li a7,5 + ecall + c48: 00000073 ecall + ret + c4c: 8082 ret + +0000000000000c4e : +.global write +write: + li a7, SYS_write + c4e: 48c1 li a7,16 + ecall + c50: 00000073 ecall + ret + c54: 8082 ret + +0000000000000c56 : +.global close +close: + li a7, SYS_close + c56: 48d5 li a7,21 + ecall + c58: 00000073 ecall + ret + c5c: 8082 ret + +0000000000000c5e : +.global kill +kill: + li a7, SYS_kill + c5e: 4899 li a7,6 + ecall + c60: 00000073 ecall + ret + c64: 8082 ret + +0000000000000c66 : +.global exec +exec: + li a7, SYS_exec + c66: 489d li a7,7 + ecall + c68: 00000073 ecall + ret + c6c: 8082 ret + +0000000000000c6e : +.global open +open: + li a7, SYS_open + c6e: 48bd li a7,15 + ecall + c70: 00000073 ecall + ret + c74: 8082 ret + +0000000000000c76 : +.global mknod +mknod: + li a7, SYS_mknod + c76: 48c5 li a7,17 + ecall + c78: 00000073 ecall + ret + c7c: 8082 ret + +0000000000000c7e : +.global unlink +unlink: + li a7, SYS_unlink + c7e: 48c9 li a7,18 + ecall + c80: 00000073 ecall + ret + c84: 8082 ret + +0000000000000c86 : +.global fstat +fstat: + li a7, SYS_fstat + c86: 48a1 li a7,8 + ecall + c88: 00000073 ecall + ret + c8c: 8082 ret + +0000000000000c8e : +.global link +link: + li a7, SYS_link + c8e: 48cd li a7,19 + ecall + c90: 00000073 ecall + ret + c94: 8082 ret + +0000000000000c96 : +.global mkdir +mkdir: + li a7, SYS_mkdir + c96: 48d1 li a7,20 + ecall + c98: 00000073 ecall + ret + c9c: 8082 ret + +0000000000000c9e : +.global chdir +chdir: + li a7, SYS_chdir + c9e: 48a5 li a7,9 + ecall + ca0: 00000073 ecall + ret + ca4: 8082 ret + +0000000000000ca6 : +.global dup +dup: + li a7, SYS_dup + ca6: 48a9 li a7,10 + ecall + ca8: 00000073 ecall + ret + cac: 8082 ret + +0000000000000cae : +.global getpid +getpid: + li a7, SYS_getpid + cae: 48ad li a7,11 + ecall + cb0: 00000073 ecall + ret + cb4: 8082 ret + +0000000000000cb6 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + cb6: 48b1 li a7,12 + ecall + cb8: 00000073 ecall + ret + cbc: 8082 ret + +0000000000000cbe : +.global pause +pause: + li a7, SYS_pause + cbe: 48b5 li a7,13 + ecall + cc0: 00000073 ecall + ret + cc4: 8082 ret + +0000000000000cc6 : +.global uptime +uptime: + li a7, SYS_uptime + cc6: 48b9 li a7,14 + ecall + cc8: 00000073 ecall + ret + ccc: 8082 ret + +0000000000000cce : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + cce: 48d9 li a7,22 + ecall + cd0: 00000073 ecall + ret + cd4: 8082 ret + +0000000000000cd6 : +.global getppid +getppid: + li a7, SYS_getppid + cd6: 48dd li a7,23 + ecall + cd8: 00000073 ecall + ret + cdc: 8082 ret + +0000000000000cde : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + cde: 48e1 li a7,24 + ecall + ce0: 00000073 ecall + ret + ce4: 8082 ret + +0000000000000ce6 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + ce6: 1101 addi sp,sp,-32 + ce8: ec06 sd ra,24(sp) + cea: e822 sd s0,16(sp) + cec: 1000 addi s0,sp,32 + cee: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + cf2: 4605 li a2,1 + cf4: fef40593 addi a1,s0,-17 + cf8: f57ff0ef jal c4e +} + cfc: 60e2 ld ra,24(sp) + cfe: 6442 ld s0,16(sp) + d00: 6105 addi sp,sp,32 + d02: 8082 ret + +0000000000000d04 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + d04: 715d addi sp,sp,-80 + d06: e486 sd ra,72(sp) + d08: e0a2 sd s0,64(sp) + d0a: f84a sd s2,48(sp) + d0c: 0880 addi s0,sp,80 + d0e: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + d10: c299 beqz a3,d16 + d12: 0805c363 bltz a1,d98 + neg = 0; + d16: 4881 li a7,0 + d18: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + d1c: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + d1e: 00000517 auipc a0,0x0 + d22: 64a50513 addi a0,a0,1610 # 1368 + d26: 883e mv a6,a5 + d28: 2785 addiw a5,a5,1 + d2a: 02c5f733 remu a4,a1,a2 + d2e: 972a add a4,a4,a0 + d30: 00074703 lbu a4,0(a4) + d34: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + d38: 872e mv a4,a1 + d3a: 02c5d5b3 divu a1,a1,a2 + d3e: 0685 addi a3,a3,1 + d40: fec773e3 bgeu a4,a2,d26 + if(neg) + d44: 00088b63 beqz a7,d5a + buf[i++] = '-'; + d48: fd078793 addi a5,a5,-48 + d4c: 97a2 add a5,a5,s0 + d4e: 02d00713 li a4,45 + d52: fee78423 sb a4,-24(a5) + d56: 0028079b addiw a5,a6,2 + + while(--i >= 0) + d5a: 02f05a63 blez a5,d8e + d5e: fc26 sd s1,56(sp) + d60: f44e sd s3,40(sp) + d62: fb840713 addi a4,s0,-72 + d66: 00f704b3 add s1,a4,a5 + d6a: fff70993 addi s3,a4,-1 + d6e: 99be add s3,s3,a5 + d70: 37fd addiw a5,a5,-1 + d72: 1782 slli a5,a5,0x20 + d74: 9381 srli a5,a5,0x20 + d76: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + d7a: fff4c583 lbu a1,-1(s1) + d7e: 854a mv a0,s2 + d80: f67ff0ef jal ce6 + while(--i >= 0) + d84: 14fd addi s1,s1,-1 + d86: ff349ae3 bne s1,s3,d7a + d8a: 74e2 ld s1,56(sp) + d8c: 79a2 ld s3,40(sp) +} + d8e: 60a6 ld ra,72(sp) + d90: 6406 ld s0,64(sp) + d92: 7942 ld s2,48(sp) + d94: 6161 addi sp,sp,80 + d96: 8082 ret + x = -xx; + d98: 40b005b3 neg a1,a1 + neg = 1; + d9c: 4885 li a7,1 + x = -xx; + d9e: bfad j d18 + +0000000000000da0 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + da0: 711d addi sp,sp,-96 + da2: ec86 sd ra,88(sp) + da4: e8a2 sd s0,80(sp) + da6: e0ca sd s2,64(sp) + da8: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + daa: 0005c903 lbu s2,0(a1) + dae: 28090663 beqz s2,103a + db2: e4a6 sd s1,72(sp) + db4: fc4e sd s3,56(sp) + db6: f852 sd s4,48(sp) + db8: f456 sd s5,40(sp) + dba: f05a sd s6,32(sp) + dbc: ec5e sd s7,24(sp) + dbe: e862 sd s8,16(sp) + dc0: e466 sd s9,8(sp) + dc2: 8b2a mv s6,a0 + dc4: 8a2e mv s4,a1 + dc6: 8bb2 mv s7,a2 + state = 0; + dc8: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + dca: 4481 li s1,0 + dcc: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + dce: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + dd2: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + dd6: 06c00c93 li s9,108 + dda: a005 j dfa + putc(fd, c0); + ddc: 85ca mv a1,s2 + dde: 855a mv a0,s6 + de0: f07ff0ef jal ce6 + de4: a019 j dea + } else if(state == '%'){ + de6: 03598263 beq s3,s5,e0a + for(i = 0; fmt[i]; i++){ + dea: 2485 addiw s1,s1,1 + dec: 8726 mv a4,s1 + dee: 009a07b3 add a5,s4,s1 + df2: 0007c903 lbu s2,0(a5) + df6: 22090a63 beqz s2,102a + c0 = fmt[i] & 0xff; + dfa: 0009079b sext.w a5,s2 + if(state == 0){ + dfe: fe0994e3 bnez s3,de6 + if(c0 == '%'){ + e02: fd579de3 bne a5,s5,ddc + state = '%'; + e06: 89be mv s3,a5 + e08: b7cd j dea + if(c0) c1 = fmt[i+1] & 0xff; + e0a: 00ea06b3 add a3,s4,a4 + e0e: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + e12: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + e14: c681 beqz a3,e1c + e16: 9752 add a4,a4,s4 + e18: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + e1c: 05878363 beq a5,s8,e62 + } else if(c0 == 'l' && c1 == 'd'){ + e20: 05978d63 beq a5,s9,e7a + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + e24: 07500713 li a4,117 + e28: 0ee78763 beq a5,a4,f16 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + e2c: 07800713 li a4,120 + e30: 12e78963 beq a5,a4,f62 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + e34: 07000713 li a4,112 + e38: 14e78e63 beq a5,a4,f94 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + e3c: 06300713 li a4,99 + e40: 18e78e63 beq a5,a4,fdc + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + e44: 07300713 li a4,115 + e48: 1ae78463 beq a5,a4,ff0 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + e4c: 02500713 li a4,37 + e50: 04e79563 bne a5,a4,e9a + putc(fd, '%'); + e54: 02500593 li a1,37 + e58: 855a mv a0,s6 + e5a: e8dff0ef jal ce6 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + e5e: 4981 li s3,0 + e60: b769 j dea + printint(fd, va_arg(ap, int), 10, 1); + e62: 008b8913 addi s2,s7,8 + e66: 4685 li a3,1 + e68: 4629 li a2,10 + e6a: 000ba583 lw a1,0(s7) + e6e: 855a mv a0,s6 + e70: e95ff0ef jal d04 + e74: 8bca mv s7,s2 + state = 0; + e76: 4981 li s3,0 + e78: bf8d j dea + } else if(c0 == 'l' && c1 == 'd'){ + e7a: 06400793 li a5,100 + e7e: 02f68963 beq a3,a5,eb0 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + e82: 06c00793 li a5,108 + e86: 04f68263 beq a3,a5,eca + } else if(c0 == 'l' && c1 == 'u'){ + e8a: 07500793 li a5,117 + e8e: 0af68063 beq a3,a5,f2e + } else if(c0 == 'l' && c1 == 'x'){ + e92: 07800793 li a5,120 + e96: 0ef68263 beq a3,a5,f7a + putc(fd, '%'); + e9a: 02500593 li a1,37 + e9e: 855a mv a0,s6 + ea0: e47ff0ef jal ce6 + putc(fd, c0); + ea4: 85ca mv a1,s2 + ea6: 855a mv a0,s6 + ea8: e3fff0ef jal ce6 + state = 0; + eac: 4981 li s3,0 + eae: bf35 j dea + printint(fd, va_arg(ap, uint64), 10, 1); + eb0: 008b8913 addi s2,s7,8 + eb4: 4685 li a3,1 + eb6: 4629 li a2,10 + eb8: 000bb583 ld a1,0(s7) + ebc: 855a mv a0,s6 + ebe: e47ff0ef jal d04 + i += 1; + ec2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + ec4: 8bca mv s7,s2 + state = 0; + ec6: 4981 li s3,0 + i += 1; + ec8: b70d j dea + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + eca: 06400793 li a5,100 + ece: 02f60763 beq a2,a5,efc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + ed2: 07500793 li a5,117 + ed6: 06f60963 beq a2,a5,f48 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + eda: 07800793 li a5,120 + ede: faf61ee3 bne a2,a5,e9a + printint(fd, va_arg(ap, uint64), 16, 0); + ee2: 008b8913 addi s2,s7,8 + ee6: 4681 li a3,0 + ee8: 4641 li a2,16 + eea: 000bb583 ld a1,0(s7) + eee: 855a mv a0,s6 + ef0: e15ff0ef jal d04 + i += 2; + ef4: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + ef6: 8bca mv s7,s2 + state = 0; + ef8: 4981 li s3,0 + i += 2; + efa: bdc5 j dea + printint(fd, va_arg(ap, uint64), 10, 1); + efc: 008b8913 addi s2,s7,8 + f00: 4685 li a3,1 + f02: 4629 li a2,10 + f04: 000bb583 ld a1,0(s7) + f08: 855a mv a0,s6 + f0a: dfbff0ef jal d04 + i += 2; + f0e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + f10: 8bca mv s7,s2 + state = 0; + f12: 4981 li s3,0 + i += 2; + f14: bdd9 j dea + printint(fd, va_arg(ap, uint32), 10, 0); + f16: 008b8913 addi s2,s7,8 + f1a: 4681 li a3,0 + f1c: 4629 li a2,10 + f1e: 000be583 lwu a1,0(s7) + f22: 855a mv a0,s6 + f24: de1ff0ef jal d04 + f28: 8bca mv s7,s2 + state = 0; + f2a: 4981 li s3,0 + f2c: bd7d j dea + printint(fd, va_arg(ap, uint64), 10, 0); + f2e: 008b8913 addi s2,s7,8 + f32: 4681 li a3,0 + f34: 4629 li a2,10 + f36: 000bb583 ld a1,0(s7) + f3a: 855a mv a0,s6 + f3c: dc9ff0ef jal d04 + i += 1; + f40: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + f42: 8bca mv s7,s2 + state = 0; + f44: 4981 li s3,0 + i += 1; + f46: b555 j dea + printint(fd, va_arg(ap, uint64), 10, 0); + f48: 008b8913 addi s2,s7,8 + f4c: 4681 li a3,0 + f4e: 4629 li a2,10 + f50: 000bb583 ld a1,0(s7) + f54: 855a mv a0,s6 + f56: dafff0ef jal d04 + i += 2; + f5a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + f5c: 8bca mv s7,s2 + state = 0; + f5e: 4981 li s3,0 + i += 2; + f60: b569 j dea + printint(fd, va_arg(ap, uint32), 16, 0); + f62: 008b8913 addi s2,s7,8 + f66: 4681 li a3,0 + f68: 4641 li a2,16 + f6a: 000be583 lwu a1,0(s7) + f6e: 855a mv a0,s6 + f70: d95ff0ef jal d04 + f74: 8bca mv s7,s2 + state = 0; + f76: 4981 li s3,0 + f78: bd8d j dea + printint(fd, va_arg(ap, uint64), 16, 0); + f7a: 008b8913 addi s2,s7,8 + f7e: 4681 li a3,0 + f80: 4641 li a2,16 + f82: 000bb583 ld a1,0(s7) + f86: 855a mv a0,s6 + f88: d7dff0ef jal d04 + i += 1; + f8c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + f8e: 8bca mv s7,s2 + state = 0; + f90: 4981 li s3,0 + i += 1; + f92: bda1 j dea + f94: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + f96: 008b8d13 addi s10,s7,8 + f9a: 000bb983 ld s3,0(s7) + putc(fd, '0'); + f9e: 03000593 li a1,48 + fa2: 855a mv a0,s6 + fa4: d43ff0ef jal ce6 + putc(fd, 'x'); + fa8: 07800593 li a1,120 + fac: 855a mv a0,s6 + fae: d39ff0ef jal ce6 + fb2: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + fb4: 00000b97 auipc s7,0x0 + fb8: 3b4b8b93 addi s7,s7,948 # 1368 + fbc: 03c9d793 srli a5,s3,0x3c + fc0: 97de add a5,a5,s7 + fc2: 0007c583 lbu a1,0(a5) + fc6: 855a mv a0,s6 + fc8: d1fff0ef jal ce6 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + fcc: 0992 slli s3,s3,0x4 + fce: 397d addiw s2,s2,-1 + fd0: fe0916e3 bnez s2,fbc + printptr(fd, va_arg(ap, uint64)); + fd4: 8bea mv s7,s10 + state = 0; + fd6: 4981 li s3,0 + fd8: 6d02 ld s10,0(sp) + fda: bd01 j dea + putc(fd, va_arg(ap, uint32)); + fdc: 008b8913 addi s2,s7,8 + fe0: 000bc583 lbu a1,0(s7) + fe4: 855a mv a0,s6 + fe6: d01ff0ef jal ce6 + fea: 8bca mv s7,s2 + state = 0; + fec: 4981 li s3,0 + fee: bbf5 j dea + if((s = va_arg(ap, char*)) == 0) + ff0: 008b8993 addi s3,s7,8 + ff4: 000bb903 ld s2,0(s7) + ff8: 00090f63 beqz s2,1016 + for(; *s; s++) + ffc: 00094583 lbu a1,0(s2) + 1000: c195 beqz a1,1024 + putc(fd, *s); + 1002: 855a mv a0,s6 + 1004: ce3ff0ef jal ce6 + for(; *s; s++) + 1008: 0905 addi s2,s2,1 + 100a: 00094583 lbu a1,0(s2) + 100e: f9f5 bnez a1,1002 + if((s = va_arg(ap, char*)) == 0) + 1010: 8bce mv s7,s3 + state = 0; + 1012: 4981 li s3,0 + 1014: bbd9 j dea + s = "(null)"; + 1016: 00000917 auipc s2,0x0 + 101a: 31a90913 addi s2,s2,794 # 1330 + for(; *s; s++) + 101e: 02800593 li a1,40 + 1022: b7c5 j 1002 + if((s = va_arg(ap, char*)) == 0) + 1024: 8bce mv s7,s3 + state = 0; + 1026: 4981 li s3,0 + 1028: b3c9 j dea + 102a: 64a6 ld s1,72(sp) + 102c: 79e2 ld s3,56(sp) + 102e: 7a42 ld s4,48(sp) + 1030: 7aa2 ld s5,40(sp) + 1032: 7b02 ld s6,32(sp) + 1034: 6be2 ld s7,24(sp) + 1036: 6c42 ld s8,16(sp) + 1038: 6ca2 ld s9,8(sp) + } + } +} + 103a: 60e6 ld ra,88(sp) + 103c: 6446 ld s0,80(sp) + 103e: 6906 ld s2,64(sp) + 1040: 6125 addi sp,sp,96 + 1042: 8082 ret + +0000000000001044 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 1044: 715d addi sp,sp,-80 + 1046: ec06 sd ra,24(sp) + 1048: e822 sd s0,16(sp) + 104a: 1000 addi s0,sp,32 + 104c: e010 sd a2,0(s0) + 104e: e414 sd a3,8(s0) + 1050: e818 sd a4,16(s0) + 1052: ec1c sd a5,24(s0) + 1054: 03043023 sd a6,32(s0) + 1058: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 105c: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 1060: 8622 mv a2,s0 + 1062: d3fff0ef jal da0 +} + 1066: 60e2 ld ra,24(sp) + 1068: 6442 ld s0,16(sp) + 106a: 6161 addi sp,sp,80 + 106c: 8082 ret + +000000000000106e : + +void +printf(const char *fmt, ...) +{ + 106e: 711d addi sp,sp,-96 + 1070: ec06 sd ra,24(sp) + 1072: e822 sd s0,16(sp) + 1074: 1000 addi s0,sp,32 + 1076: e40c sd a1,8(s0) + 1078: e810 sd a2,16(s0) + 107a: ec14 sd a3,24(s0) + 107c: f018 sd a4,32(s0) + 107e: f41c sd a5,40(s0) + 1080: 03043823 sd a6,48(s0) + 1084: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 1088: 00840613 addi a2,s0,8 + 108c: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 1090: 85aa mv a1,a0 + 1092: 4505 li a0,1 + 1094: d0dff0ef jal da0 +} + 1098: 60e2 ld ra,24(sp) + 109a: 6442 ld s0,16(sp) + 109c: 6125 addi sp,sp,96 + 109e: 8082 ret + +00000000000010a0 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 10a0: 1141 addi sp,sp,-16 + 10a2: e422 sd s0,8(sp) + 10a4: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 10a6: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 10aa: 00001797 auipc a5,0x1 + 10ae: f667b783 ld a5,-154(a5) # 2010 + 10b2: a02d j 10dc + 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; + 10b4: 4618 lw a4,8(a2) + 10b6: 9f2d addw a4,a4,a1 + 10b8: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 10bc: 6398 ld a4,0(a5) + 10be: 6310 ld a2,0(a4) + 10c0: a83d j 10fe + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 10c2: ff852703 lw a4,-8(a0) + 10c6: 9f31 addw a4,a4,a2 + 10c8: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 10ca: ff053683 ld a3,-16(a0) + 10ce: a091 j 1112 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 10d0: 6398 ld a4,0(a5) + 10d2: 00e7e463 bltu a5,a4,10da + 10d6: 00e6ea63 bltu a3,a4,10ea +{ + 10da: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 10dc: fed7fae3 bgeu a5,a3,10d0 + 10e0: 6398 ld a4,0(a5) + 10e2: 00e6e463 bltu a3,a4,10ea + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 10e6: fee7eae3 bltu a5,a4,10da + if(bp + bp->s.size == p->s.ptr){ + 10ea: ff852583 lw a1,-8(a0) + 10ee: 6390 ld a2,0(a5) + 10f0: 02059813 slli a6,a1,0x20 + 10f4: 01c85713 srli a4,a6,0x1c + 10f8: 9736 add a4,a4,a3 + 10fa: fae60de3 beq a2,a4,10b4 + bp->s.ptr = p->s.ptr->s.ptr; + 10fe: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 1102: 4790 lw a2,8(a5) + 1104: 02061593 slli a1,a2,0x20 + 1108: 01c5d713 srli a4,a1,0x1c + 110c: 973e add a4,a4,a5 + 110e: fae68ae3 beq a3,a4,10c2 + p->s.ptr = bp->s.ptr; + 1112: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 1114: 00001717 auipc a4,0x1 + 1118: eef73e23 sd a5,-260(a4) # 2010 +} + 111c: 6422 ld s0,8(sp) + 111e: 0141 addi sp,sp,16 + 1120: 8082 ret + +0000000000001122 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 1122: 7139 addi sp,sp,-64 + 1124: fc06 sd ra,56(sp) + 1126: f822 sd s0,48(sp) + 1128: f426 sd s1,40(sp) + 112a: ec4e sd s3,24(sp) + 112c: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 112e: 02051493 slli s1,a0,0x20 + 1132: 9081 srli s1,s1,0x20 + 1134: 04bd addi s1,s1,15 + 1136: 8091 srli s1,s1,0x4 + 1138: 0014899b addiw s3,s1,1 + 113c: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 113e: 00001517 auipc a0,0x1 + 1142: ed253503 ld a0,-302(a0) # 2010 + 1146: c915 beqz a0,117a + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 1148: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 114a: 4798 lw a4,8(a5) + 114c: 08977a63 bgeu a4,s1,11e0 + 1150: f04a sd s2,32(sp) + 1152: e852 sd s4,16(sp) + 1154: e456 sd s5,8(sp) + 1156: e05a sd s6,0(sp) + if(nu < 4096) + 1158: 8a4e mv s4,s3 + 115a: 0009871b sext.w a4,s3 + 115e: 6685 lui a3,0x1 + 1160: 00d77363 bgeu a4,a3,1166 + 1164: 6a05 lui s4,0x1 + 1166: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 116a: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 116e: 00001917 auipc s2,0x1 + 1172: ea290913 addi s2,s2,-350 # 2010 + if(p == SBRK_ERROR) + 1176: 5afd li s5,-1 + 1178: a081 j 11b8 + 117a: f04a sd s2,32(sp) + 117c: e852 sd s4,16(sp) + 117e: e456 sd s5,8(sp) + 1180: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 1182: 00001797 auipc a5,0x1 + 1186: f0678793 addi a5,a5,-250 # 2088 + 118a: 00001717 auipc a4,0x1 + 118e: e8f73323 sd a5,-378(a4) # 2010 + 1192: e39c sd a5,0(a5) + base.s.size = 0; + 1194: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 1198: b7c1 j 1158 + prevp->s.ptr = p->s.ptr; + 119a: 6398 ld a4,0(a5) + 119c: e118 sd a4,0(a0) + 119e: a8a9 j 11f8 + hp->s.size = nu; + 11a0: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 11a4: 0541 addi a0,a0,16 + 11a6: efbff0ef jal 10a0 + return freep; + 11aa: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 11ae: c12d beqz a0,1210 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 11b0: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 11b2: 4798 lw a4,8(a5) + 11b4: 02977263 bgeu a4,s1,11d8 + if(p == freep) + 11b8: 00093703 ld a4,0(s2) + 11bc: 853e mv a0,a5 + 11be: fef719e3 bne a4,a5,11b0 + p = sbrk(nu * sizeof(Header)); + 11c2: 8552 mv a0,s4 + 11c4: a37ff0ef jal bfa + if(p == SBRK_ERROR) + 11c8: fd551ce3 bne a0,s5,11a0 + return 0; + 11cc: 4501 li a0,0 + 11ce: 7902 ld s2,32(sp) + 11d0: 6a42 ld s4,16(sp) + 11d2: 6aa2 ld s5,8(sp) + 11d4: 6b02 ld s6,0(sp) + 11d6: a03d j 1204 + 11d8: 7902 ld s2,32(sp) + 11da: 6a42 ld s4,16(sp) + 11dc: 6aa2 ld s5,8(sp) + 11de: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 11e0: fae48de3 beq s1,a4,119a + p->s.size -= nunits; + 11e4: 4137073b subw a4,a4,s3 + 11e8: c798 sw a4,8(a5) + p += p->s.size; + 11ea: 02071693 slli a3,a4,0x20 + 11ee: 01c6d713 srli a4,a3,0x1c + 11f2: 97ba add a5,a5,a4 + p->s.size = nunits; + 11f4: 0137a423 sw s3,8(a5) + freep = prevp; + 11f8: 00001717 auipc a4,0x1 + 11fc: e0a73c23 sd a0,-488(a4) # 2010 + return (void*)(p + 1); + 1200: 01078513 addi a0,a5,16 + } +} + 1204: 70e2 ld ra,56(sp) + 1206: 7442 ld s0,48(sp) + 1208: 74a2 ld s1,40(sp) + 120a: 69e2 ld s3,24(sp) + 120c: 6121 addi sp,sp,64 + 120e: 8082 ret + 1210: 7902 ld s2,32(sp) + 1212: 6a42 ld s4,16(sp) + 1214: 6aa2 ld s5,8(sp) + 1216: 6b02 ld s6,0(sp) + 1218: b7f5 j 1204 diff --git a/user/sh.c b/G12_Project1_xv6CustomizeSystemCalls/user/sh.c similarity index 100% rename from user/sh.c rename to G12_Project1_xv6CustomizeSystemCalls/user/sh.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/sh.d b/G12_Project1_xv6CustomizeSystemCalls/user/sh.d new file mode 100644 index 0000000000..d2c3f5edbc --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/sh.d @@ -0,0 +1 @@ +user/sh.o: user/sh.c kernel/types.h user/user.h kernel/fcntl.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/sh.o b/G12_Project1_xv6CustomizeSystemCalls/user/sh.o new file mode 100644 index 0000000000..1129968e4a Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/sh.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/sh.sym b/G12_Project1_xv6CustomizeSystemCalls/user/sh.sym new file mode 100644 index 0000000000..0f98901d43 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/sh.sym @@ -0,0 +1,89 @@ +0000000000000000 .text +0000000000001220 .rodata +0000000000001380 .eh_frame +0000000000002000 .data +0000000000002010 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 sh.c +0000000000002020 buf.0 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000ce6 putc +0000000000000d04 printint +0000000000001368 digits +0000000000000000 umalloc.c +0000000000002010 freep +0000000000002088 base +00000000000009aa strcpy +0000000000000cbe pause +000000000000106e printf +0000000000000cb6 sys_sbrk +0000000000000b54 memmove +0000000000000c76 mknod +00000000000001d2 execcmd +0000000000000a62 gets +0000000000000cae getpid +000000000000066c parsepipe +0000000000000852 parsecmd +0000000000000be6 memcpy +00000000000002dc backcmd +000000000000044c peek +00000000000004b0 parseredirs +0000000000000310 gettoken +0000000000001122 malloc +0000000000002008 whitespace +0000000000000068 fork1 +0000000000000c10 sbrklazy +00000000000007d2 nulterminate +0000000000000c3e pipe +0000000000000000 getcmd +0000000000000c4e write +0000000000000c86 fstat +0000000000001044 fprintf +0000000000000c5e kill +0000000000000da0 vprintf +0000000000000c9e chdir +00000000000006c6 parseline +000000000000008e runcmd +000000000000074e parseblock +0000000000000c66 exec +0000000000000c36 wait +0000000000002000 symbols +0000000000000cce getprocsinfo +0000000000000c46 read +0000000000000588 parseexec +0000000000000c7e unlink +000000000000004a panic +0000000000000bac memcmp +0000000000000c26 fork +0000000000000bfa sbrk +0000000000000cc6 uptime +0000000000000a1c memset +00000000000008c2 main +0000000000000cd6 getppid +00000000000009c6 strcmp +0000000000000ca6 dup +0000000000000260 pipecmd +0000000000000200 redircmd +0000000000000ad2 stat +0000000000000cde sleep2 +0000000000000c8e link +0000000000000c2e exit +000000000000099a start +0000000000000b0c atoi +00000000000009f2 strlen +0000000000000c6e open +0000000000000a3e strchr +0000000000000c96 mkdir +0000000000000c56 close +000000000000029e listcmd +00000000000010a0 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.asm b/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.asm new file mode 100644 index 0000000000..a402476a8a --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.asm @@ -0,0 +1,1584 @@ + +user/_stressfs: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/fs.h" +#include "kernel/fcntl.h" + +int +main(int argc, char *argv[]) +{ + 0: dd010113 addi sp,sp,-560 + 4: 22113423 sd ra,552(sp) + 8: 22813023 sd s0,544(sp) + c: 20913c23 sd s1,536(sp) + 10: 21213823 sd s2,528(sp) + 14: 1c00 addi s0,sp,560 + int fd, i; + char path[] = "stressfs0"; + 16: 00001797 auipc a5,0x1 + 1a: 97a78793 addi a5,a5,-1670 # 990 + 1e: 6398 ld a4,0(a5) + 20: fce43823 sd a4,-48(s0) + 24: 0087d783 lhu a5,8(a5) + 28: fcf41c23 sh a5,-40(s0) + char data[512]; + + printf("stressfs starting\n"); + 2c: 00001517 auipc a0,0x1 + 30: 93450513 addi a0,a0,-1740 # 960 + 34: 778000ef jal 7ac + memset(data, 'a', sizeof(data)); + 38: 20000613 li a2,512 + 3c: 06100593 li a1,97 + 40: dd040513 addi a0,s0,-560 + 44: 116000ef jal 15a + + for(i = 0; i < 4; i++) + 48: 4481 li s1,0 + 4a: 4911 li s2,4 + if(fork() > 0) + 4c: 318000ef jal 364 + 50: 00a04563 bgtz a0,5a + for(i = 0; i < 4; i++) + 54: 2485 addiw s1,s1,1 + 56: ff249be3 bne s1,s2,4c + break; + + printf("write %d\n", i); + 5a: 85a6 mv a1,s1 + 5c: 00001517 auipc a0,0x1 + 60: 91c50513 addi a0,a0,-1764 # 978 + 64: 748000ef jal 7ac + + path[8] += i; + 68: fd844783 lbu a5,-40(s0) + 6c: 9fa5 addw a5,a5,s1 + 6e: fcf40c23 sb a5,-40(s0) + fd = open(path, O_CREATE | O_RDWR); + 72: 20200593 li a1,514 + 76: fd040513 addi a0,s0,-48 + 7a: 332000ef jal 3ac + 7e: 892a mv s2,a0 + 80: 44d1 li s1,20 + for(i = 0; i < 20; i++) +// printf(fd, "%d\n", i); + write(fd, data, sizeof(data)); + 82: 20000613 li a2,512 + 86: dd040593 addi a1,s0,-560 + 8a: 854a mv a0,s2 + 8c: 300000ef jal 38c + for(i = 0; i < 20; i++) + 90: 34fd addiw s1,s1,-1 + 92: f8e5 bnez s1,82 + close(fd); + 94: 854a mv a0,s2 + 96: 2fe000ef jal 394 + + printf("read\n"); + 9a: 00001517 auipc a0,0x1 + 9e: 8ee50513 addi a0,a0,-1810 # 988 + a2: 70a000ef jal 7ac + + fd = open(path, O_RDONLY); + a6: 4581 li a1,0 + a8: fd040513 addi a0,s0,-48 + ac: 300000ef jal 3ac + b0: 892a mv s2,a0 + b2: 44d1 li s1,20 + for (i = 0; i < 20; i++) + read(fd, data, sizeof(data)); + b4: 20000613 li a2,512 + b8: dd040593 addi a1,s0,-560 + bc: 854a mv a0,s2 + be: 2c6000ef jal 384 + for (i = 0; i < 20; i++) + c2: 34fd addiw s1,s1,-1 + c4: f8e5 bnez s1,b4 + close(fd); + c6: 854a mv a0,s2 + c8: 2cc000ef jal 394 + + wait(0); + cc: 4501 li a0,0 + ce: 2a6000ef jal 374 + + exit(0); + d2: 4501 li a0,0 + d4: 298000ef jal 36c + +00000000000000d8 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + d8: 1141 addi sp,sp,-16 + da: e406 sd ra,8(sp) + dc: e022 sd s0,0(sp) + de: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + e0: f21ff0ef jal 0
+ exit(r); + e4: 288000ef jal 36c + +00000000000000e8 : +} + +char* +strcpy(char *s, const char *t) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + ee: 87aa mv a5,a0 + f0: 0585 addi a1,a1,1 + f2: 0785 addi a5,a5,1 + f4: fff5c703 lbu a4,-1(a1) + f8: fee78fa3 sb a4,-1(a5) + fc: fb75 bnez a4,f0 + ; + return os; +} + fe: 6422 ld s0,8(sp) + 100: 0141 addi sp,sp,16 + 102: 8082 ret + +0000000000000104 : + +int +strcmp(const char *p, const char *q) +{ + 104: 1141 addi sp,sp,-16 + 106: e422 sd s0,8(sp) + 108: 0800 addi s0,sp,16 + while(*p && *p == *q) + 10a: 00054783 lbu a5,0(a0) + 10e: cb91 beqz a5,122 + 110: 0005c703 lbu a4,0(a1) + 114: 00f71763 bne a4,a5,122 + p++, q++; + 118: 0505 addi a0,a0,1 + 11a: 0585 addi a1,a1,1 + while(*p && *p == *q) + 11c: 00054783 lbu a5,0(a0) + 120: fbe5 bnez a5,110 + return (uchar)*p - (uchar)*q; + 122: 0005c503 lbu a0,0(a1) +} + 126: 40a7853b subw a0,a5,a0 + 12a: 6422 ld s0,8(sp) + 12c: 0141 addi sp,sp,16 + 12e: 8082 ret + +0000000000000130 : + +uint +strlen(const char *s) +{ + 130: 1141 addi sp,sp,-16 + 132: e422 sd s0,8(sp) + 134: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 136: 00054783 lbu a5,0(a0) + 13a: cf91 beqz a5,156 + 13c: 0505 addi a0,a0,1 + 13e: 87aa mv a5,a0 + 140: 86be mv a3,a5 + 142: 0785 addi a5,a5,1 + 144: fff7c703 lbu a4,-1(a5) + 148: ff65 bnez a4,140 + 14a: 40a6853b subw a0,a3,a0 + 14e: 2505 addiw a0,a0,1 + ; + return n; +} + 150: 6422 ld s0,8(sp) + 152: 0141 addi sp,sp,16 + 154: 8082 ret + for(n = 0; s[n]; n++) + 156: 4501 li a0,0 + 158: bfe5 j 150 + +000000000000015a : + +void* +memset(void *dst, int c, uint n) +{ + 15a: 1141 addi sp,sp,-16 + 15c: e422 sd s0,8(sp) + 15e: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 160: ca19 beqz a2,176 + 162: 87aa mv a5,a0 + 164: 1602 slli a2,a2,0x20 + 166: 9201 srli a2,a2,0x20 + 168: 00a60733 add a4,a2,a0 + cdst[i] = c; + 16c: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 170: 0785 addi a5,a5,1 + 172: fee79de3 bne a5,a4,16c + } + return dst; +} + 176: 6422 ld s0,8(sp) + 178: 0141 addi sp,sp,16 + 17a: 8082 ret + +000000000000017c : + +char* +strchr(const char *s, char c) +{ + 17c: 1141 addi sp,sp,-16 + 17e: e422 sd s0,8(sp) + 180: 0800 addi s0,sp,16 + for(; *s; s++) + 182: 00054783 lbu a5,0(a0) + 186: cb99 beqz a5,19c + if(*s == c) + 188: 00f58763 beq a1,a5,196 + for(; *s; s++) + 18c: 0505 addi a0,a0,1 + 18e: 00054783 lbu a5,0(a0) + 192: fbfd bnez a5,188 + return (char*)s; + return 0; + 194: 4501 li a0,0 +} + 196: 6422 ld s0,8(sp) + 198: 0141 addi sp,sp,16 + 19a: 8082 ret + return 0; + 19c: 4501 li a0,0 + 19e: bfe5 j 196 + +00000000000001a0 : + +char* +gets(char *buf, int max) +{ + 1a0: 711d addi sp,sp,-96 + 1a2: ec86 sd ra,88(sp) + 1a4: e8a2 sd s0,80(sp) + 1a6: e4a6 sd s1,72(sp) + 1a8: e0ca sd s2,64(sp) + 1aa: fc4e sd s3,56(sp) + 1ac: f852 sd s4,48(sp) + 1ae: f456 sd s5,40(sp) + 1b0: f05a sd s6,32(sp) + 1b2: ec5e sd s7,24(sp) + 1b4: 1080 addi s0,sp,96 + 1b6: 8baa mv s7,a0 + 1b8: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1ba: 892a mv s2,a0 + 1bc: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1be: 4aa9 li s5,10 + 1c0: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1c2: 89a6 mv s3,s1 + 1c4: 2485 addiw s1,s1,1 + 1c6: 0344d663 bge s1,s4,1f2 + cc = read(0, &c, 1); + 1ca: 4605 li a2,1 + 1cc: faf40593 addi a1,s0,-81 + 1d0: 4501 li a0,0 + 1d2: 1b2000ef jal 384 + if(cc < 1) + 1d6: 00a05e63 blez a0,1f2 + buf[i++] = c; + 1da: faf44783 lbu a5,-81(s0) + 1de: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1e2: 01578763 beq a5,s5,1f0 + 1e6: 0905 addi s2,s2,1 + 1e8: fd679de3 bne a5,s6,1c2 + buf[i++] = c; + 1ec: 89a6 mv s3,s1 + 1ee: a011 j 1f2 + 1f0: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1f2: 99de add s3,s3,s7 + 1f4: 00098023 sb zero,0(s3) + return buf; +} + 1f8: 855e mv a0,s7 + 1fa: 60e6 ld ra,88(sp) + 1fc: 6446 ld s0,80(sp) + 1fe: 64a6 ld s1,72(sp) + 200: 6906 ld s2,64(sp) + 202: 79e2 ld s3,56(sp) + 204: 7a42 ld s4,48(sp) + 206: 7aa2 ld s5,40(sp) + 208: 7b02 ld s6,32(sp) + 20a: 6be2 ld s7,24(sp) + 20c: 6125 addi sp,sp,96 + 20e: 8082 ret + +0000000000000210 : + +int +stat(const char *n, struct stat *st) +{ + 210: 1101 addi sp,sp,-32 + 212: ec06 sd ra,24(sp) + 214: e822 sd s0,16(sp) + 216: e04a sd s2,0(sp) + 218: 1000 addi s0,sp,32 + 21a: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 21c: 4581 li a1,0 + 21e: 18e000ef jal 3ac + if(fd < 0) + 222: 02054263 bltz a0,246 + 226: e426 sd s1,8(sp) + 228: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 22a: 85ca mv a1,s2 + 22c: 198000ef jal 3c4 + 230: 892a mv s2,a0 + close(fd); + 232: 8526 mv a0,s1 + 234: 160000ef jal 394 + return r; + 238: 64a2 ld s1,8(sp) +} + 23a: 854a mv a0,s2 + 23c: 60e2 ld ra,24(sp) + 23e: 6442 ld s0,16(sp) + 240: 6902 ld s2,0(sp) + 242: 6105 addi sp,sp,32 + 244: 8082 ret + return -1; + 246: 597d li s2,-1 + 248: bfcd j 23a + +000000000000024a : + +int +atoi(const char *s) +{ + 24a: 1141 addi sp,sp,-16 + 24c: e422 sd s0,8(sp) + 24e: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 250: 00054683 lbu a3,0(a0) + 254: fd06879b addiw a5,a3,-48 + 258: 0ff7f793 zext.b a5,a5 + 25c: 4625 li a2,9 + 25e: 02f66863 bltu a2,a5,28e + 262: 872a mv a4,a0 + n = 0; + 264: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 266: 0705 addi a4,a4,1 + 268: 0025179b slliw a5,a0,0x2 + 26c: 9fa9 addw a5,a5,a0 + 26e: 0017979b slliw a5,a5,0x1 + 272: 9fb5 addw a5,a5,a3 + 274: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 278: 00074683 lbu a3,0(a4) + 27c: fd06879b addiw a5,a3,-48 + 280: 0ff7f793 zext.b a5,a5 + 284: fef671e3 bgeu a2,a5,266 + return n; +} + 288: 6422 ld s0,8(sp) + 28a: 0141 addi sp,sp,16 + 28c: 8082 ret + n = 0; + 28e: 4501 li a0,0 + 290: bfe5 j 288 + +0000000000000292 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 292: 1141 addi sp,sp,-16 + 294: e422 sd s0,8(sp) + 296: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 298: 02b57463 bgeu a0,a1,2c0 + while(n-- > 0) + 29c: 00c05f63 blez a2,2ba + 2a0: 1602 slli a2,a2,0x20 + 2a2: 9201 srli a2,a2,0x20 + 2a4: 00c507b3 add a5,a0,a2 + dst = vdst; + 2a8: 872a mv a4,a0 + *dst++ = *src++; + 2aa: 0585 addi a1,a1,1 + 2ac: 0705 addi a4,a4,1 + 2ae: fff5c683 lbu a3,-1(a1) + 2b2: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2b6: fef71ae3 bne a4,a5,2aa + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2ba: 6422 ld s0,8(sp) + 2bc: 0141 addi sp,sp,16 + 2be: 8082 ret + dst += n; + 2c0: 00c50733 add a4,a0,a2 + src += n; + 2c4: 95b2 add a1,a1,a2 + while(n-- > 0) + 2c6: fec05ae3 blez a2,2ba + 2ca: fff6079b addiw a5,a2,-1 + 2ce: 1782 slli a5,a5,0x20 + 2d0: 9381 srli a5,a5,0x20 + 2d2: fff7c793 not a5,a5 + 2d6: 97ba add a5,a5,a4 + *--dst = *--src; + 2d8: 15fd addi a1,a1,-1 + 2da: 177d addi a4,a4,-1 + 2dc: 0005c683 lbu a3,0(a1) + 2e0: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2e4: fee79ae3 bne a5,a4,2d8 + 2e8: bfc9 j 2ba + +00000000000002ea : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2ea: 1141 addi sp,sp,-16 + 2ec: e422 sd s0,8(sp) + 2ee: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2f0: ca05 beqz a2,320 + 2f2: fff6069b addiw a3,a2,-1 + 2f6: 1682 slli a3,a3,0x20 + 2f8: 9281 srli a3,a3,0x20 + 2fa: 0685 addi a3,a3,1 + 2fc: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2fe: 00054783 lbu a5,0(a0) + 302: 0005c703 lbu a4,0(a1) + 306: 00e79863 bne a5,a4,316 + return *p1 - *p2; + } + p1++; + 30a: 0505 addi a0,a0,1 + p2++; + 30c: 0585 addi a1,a1,1 + while (n-- > 0) { + 30e: fed518e3 bne a0,a3,2fe + } + return 0; + 312: 4501 li a0,0 + 314: a019 j 31a + return *p1 - *p2; + 316: 40e7853b subw a0,a5,a4 +} + 31a: 6422 ld s0,8(sp) + 31c: 0141 addi sp,sp,16 + 31e: 8082 ret + return 0; + 320: 4501 li a0,0 + 322: bfe5 j 31a + +0000000000000324 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 324: 1141 addi sp,sp,-16 + 326: e406 sd ra,8(sp) + 328: e022 sd s0,0(sp) + 32a: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 32c: f67ff0ef jal 292 +} + 330: 60a2 ld ra,8(sp) + 332: 6402 ld s0,0(sp) + 334: 0141 addi sp,sp,16 + 336: 8082 ret + +0000000000000338 : + +char * +sbrk(int n) { + 338: 1141 addi sp,sp,-16 + 33a: e406 sd ra,8(sp) + 33c: e022 sd s0,0(sp) + 33e: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 340: 4585 li a1,1 + 342: 0b2000ef jal 3f4 +} + 346: 60a2 ld ra,8(sp) + 348: 6402 ld s0,0(sp) + 34a: 0141 addi sp,sp,16 + 34c: 8082 ret + +000000000000034e : + +char * +sbrklazy(int n) { + 34e: 1141 addi sp,sp,-16 + 350: e406 sd ra,8(sp) + 352: e022 sd s0,0(sp) + 354: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 356: 4589 li a1,2 + 358: 09c000ef jal 3f4 +} + 35c: 60a2 ld ra,8(sp) + 35e: 6402 ld s0,0(sp) + 360: 0141 addi sp,sp,16 + 362: 8082 ret + +0000000000000364 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 364: 4885 li a7,1 + ecall + 366: 00000073 ecall + ret + 36a: 8082 ret + +000000000000036c : +.global exit +exit: + li a7, SYS_exit + 36c: 4889 li a7,2 + ecall + 36e: 00000073 ecall + ret + 372: 8082 ret + +0000000000000374 : +.global wait +wait: + li a7, SYS_wait + 374: 488d li a7,3 + ecall + 376: 00000073 ecall + ret + 37a: 8082 ret + +000000000000037c : +.global pipe +pipe: + li a7, SYS_pipe + 37c: 4891 li a7,4 + ecall + 37e: 00000073 ecall + ret + 382: 8082 ret + +0000000000000384 : +.global read +read: + li a7, SYS_read + 384: 4895 li a7,5 + ecall + 386: 00000073 ecall + ret + 38a: 8082 ret + +000000000000038c : +.global write +write: + li a7, SYS_write + 38c: 48c1 li a7,16 + ecall + 38e: 00000073 ecall + ret + 392: 8082 ret + +0000000000000394 : +.global close +close: + li a7, SYS_close + 394: 48d5 li a7,21 + ecall + 396: 00000073 ecall + ret + 39a: 8082 ret + +000000000000039c : +.global kill +kill: + li a7, SYS_kill + 39c: 4899 li a7,6 + ecall + 39e: 00000073 ecall + ret + 3a2: 8082 ret + +00000000000003a4 : +.global exec +exec: + li a7, SYS_exec + 3a4: 489d li a7,7 + ecall + 3a6: 00000073 ecall + ret + 3aa: 8082 ret + +00000000000003ac : +.global open +open: + li a7, SYS_open + 3ac: 48bd li a7,15 + ecall + 3ae: 00000073 ecall + ret + 3b2: 8082 ret + +00000000000003b4 : +.global mknod +mknod: + li a7, SYS_mknod + 3b4: 48c5 li a7,17 + ecall + 3b6: 00000073 ecall + ret + 3ba: 8082 ret + +00000000000003bc : +.global unlink +unlink: + li a7, SYS_unlink + 3bc: 48c9 li a7,18 + ecall + 3be: 00000073 ecall + ret + 3c2: 8082 ret + +00000000000003c4 : +.global fstat +fstat: + li a7, SYS_fstat + 3c4: 48a1 li a7,8 + ecall + 3c6: 00000073 ecall + ret + 3ca: 8082 ret + +00000000000003cc : +.global link +link: + li a7, SYS_link + 3cc: 48cd li a7,19 + ecall + 3ce: 00000073 ecall + ret + 3d2: 8082 ret + +00000000000003d4 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3d4: 48d1 li a7,20 + ecall + 3d6: 00000073 ecall + ret + 3da: 8082 ret + +00000000000003dc : +.global chdir +chdir: + li a7, SYS_chdir + 3dc: 48a5 li a7,9 + ecall + 3de: 00000073 ecall + ret + 3e2: 8082 ret + +00000000000003e4 : +.global dup +dup: + li a7, SYS_dup + 3e4: 48a9 li a7,10 + ecall + 3e6: 00000073 ecall + ret + 3ea: 8082 ret + +00000000000003ec : +.global getpid +getpid: + li a7, SYS_getpid + 3ec: 48ad li a7,11 + ecall + 3ee: 00000073 ecall + ret + 3f2: 8082 ret + +00000000000003f4 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3f4: 48b1 li a7,12 + ecall + 3f6: 00000073 ecall + ret + 3fa: 8082 ret + +00000000000003fc : +.global pause +pause: + li a7, SYS_pause + 3fc: 48b5 li a7,13 + ecall + 3fe: 00000073 ecall + ret + 402: 8082 ret + +0000000000000404 : +.global uptime +uptime: + li a7, SYS_uptime + 404: 48b9 li a7,14 + ecall + 406: 00000073 ecall + ret + 40a: 8082 ret + +000000000000040c : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 40c: 48d9 li a7,22 + ecall + 40e: 00000073 ecall + ret + 412: 8082 ret + +0000000000000414 : +.global getppid +getppid: + li a7, SYS_getppid + 414: 48dd li a7,23 + ecall + 416: 00000073 ecall + ret + 41a: 8082 ret + +000000000000041c : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 41c: 48e1 li a7,24 + ecall + 41e: 00000073 ecall + ret + 422: 8082 ret + +0000000000000424 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 424: 1101 addi sp,sp,-32 + 426: ec06 sd ra,24(sp) + 428: e822 sd s0,16(sp) + 42a: 1000 addi s0,sp,32 + 42c: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 430: 4605 li a2,1 + 432: fef40593 addi a1,s0,-17 + 436: f57ff0ef jal 38c +} + 43a: 60e2 ld ra,24(sp) + 43c: 6442 ld s0,16(sp) + 43e: 6105 addi sp,sp,32 + 440: 8082 ret + +0000000000000442 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 442: 715d addi sp,sp,-80 + 444: e486 sd ra,72(sp) + 446: e0a2 sd s0,64(sp) + 448: f84a sd s2,48(sp) + 44a: 0880 addi s0,sp,80 + 44c: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 44e: c299 beqz a3,454 + 450: 0805c363 bltz a1,4d6 + neg = 0; + 454: 4881 li a7,0 + 456: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 45a: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 45c: 00000517 auipc a0,0x0 + 460: 54c50513 addi a0,a0,1356 # 9a8 + 464: 883e mv a6,a5 + 466: 2785 addiw a5,a5,1 + 468: 02c5f733 remu a4,a1,a2 + 46c: 972a add a4,a4,a0 + 46e: 00074703 lbu a4,0(a4) + 472: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 476: 872e mv a4,a1 + 478: 02c5d5b3 divu a1,a1,a2 + 47c: 0685 addi a3,a3,1 + 47e: fec773e3 bgeu a4,a2,464 + if(neg) + 482: 00088b63 beqz a7,498 + buf[i++] = '-'; + 486: fd078793 addi a5,a5,-48 + 48a: 97a2 add a5,a5,s0 + 48c: 02d00713 li a4,45 + 490: fee78423 sb a4,-24(a5) + 494: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 498: 02f05a63 blez a5,4cc + 49c: fc26 sd s1,56(sp) + 49e: f44e sd s3,40(sp) + 4a0: fb840713 addi a4,s0,-72 + 4a4: 00f704b3 add s1,a4,a5 + 4a8: fff70993 addi s3,a4,-1 + 4ac: 99be add s3,s3,a5 + 4ae: 37fd addiw a5,a5,-1 + 4b0: 1782 slli a5,a5,0x20 + 4b2: 9381 srli a5,a5,0x20 + 4b4: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 4b8: fff4c583 lbu a1,-1(s1) + 4bc: 854a mv a0,s2 + 4be: f67ff0ef jal 424 + while(--i >= 0) + 4c2: 14fd addi s1,s1,-1 + 4c4: ff349ae3 bne s1,s3,4b8 + 4c8: 74e2 ld s1,56(sp) + 4ca: 79a2 ld s3,40(sp) +} + 4cc: 60a6 ld ra,72(sp) + 4ce: 6406 ld s0,64(sp) + 4d0: 7942 ld s2,48(sp) + 4d2: 6161 addi sp,sp,80 + 4d4: 8082 ret + x = -xx; + 4d6: 40b005b3 neg a1,a1 + neg = 1; + 4da: 4885 li a7,1 + x = -xx; + 4dc: bfad j 456 + +00000000000004de : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4de: 711d addi sp,sp,-96 + 4e0: ec86 sd ra,88(sp) + 4e2: e8a2 sd s0,80(sp) + 4e4: e0ca sd s2,64(sp) + 4e6: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4e8: 0005c903 lbu s2,0(a1) + 4ec: 28090663 beqz s2,778 + 4f0: e4a6 sd s1,72(sp) + 4f2: fc4e sd s3,56(sp) + 4f4: f852 sd s4,48(sp) + 4f6: f456 sd s5,40(sp) + 4f8: f05a sd s6,32(sp) + 4fa: ec5e sd s7,24(sp) + 4fc: e862 sd s8,16(sp) + 4fe: e466 sd s9,8(sp) + 500: 8b2a mv s6,a0 + 502: 8a2e mv s4,a1 + 504: 8bb2 mv s7,a2 + state = 0; + 506: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 508: 4481 li s1,0 + 50a: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 50c: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 510: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 514: 06c00c93 li s9,108 + 518: a005 j 538 + putc(fd, c0); + 51a: 85ca mv a1,s2 + 51c: 855a mv a0,s6 + 51e: f07ff0ef jal 424 + 522: a019 j 528 + } else if(state == '%'){ + 524: 03598263 beq s3,s5,548 + for(i = 0; fmt[i]; i++){ + 528: 2485 addiw s1,s1,1 + 52a: 8726 mv a4,s1 + 52c: 009a07b3 add a5,s4,s1 + 530: 0007c903 lbu s2,0(a5) + 534: 22090a63 beqz s2,768 + c0 = fmt[i] & 0xff; + 538: 0009079b sext.w a5,s2 + if(state == 0){ + 53c: fe0994e3 bnez s3,524 + if(c0 == '%'){ + 540: fd579de3 bne a5,s5,51a + state = '%'; + 544: 89be mv s3,a5 + 546: b7cd j 528 + if(c0) c1 = fmt[i+1] & 0xff; + 548: 00ea06b3 add a3,s4,a4 + 54c: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 550: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 552: c681 beqz a3,55a + 554: 9752 add a4,a4,s4 + 556: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 55a: 05878363 beq a5,s8,5a0 + } else if(c0 == 'l' && c1 == 'd'){ + 55e: 05978d63 beq a5,s9,5b8 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 562: 07500713 li a4,117 + 566: 0ee78763 beq a5,a4,654 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 56a: 07800713 li a4,120 + 56e: 12e78963 beq a5,a4,6a0 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 572: 07000713 li a4,112 + 576: 14e78e63 beq a5,a4,6d2 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 57a: 06300713 li a4,99 + 57e: 18e78e63 beq a5,a4,71a + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 582: 07300713 li a4,115 + 586: 1ae78463 beq a5,a4,72e + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 58a: 02500713 li a4,37 + 58e: 04e79563 bne a5,a4,5d8 + putc(fd, '%'); + 592: 02500593 li a1,37 + 596: 855a mv a0,s6 + 598: e8dff0ef jal 424 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 59c: 4981 li s3,0 + 59e: b769 j 528 + printint(fd, va_arg(ap, int), 10, 1); + 5a0: 008b8913 addi s2,s7,8 + 5a4: 4685 li a3,1 + 5a6: 4629 li a2,10 + 5a8: 000ba583 lw a1,0(s7) + 5ac: 855a mv a0,s6 + 5ae: e95ff0ef jal 442 + 5b2: 8bca mv s7,s2 + state = 0; + 5b4: 4981 li s3,0 + 5b6: bf8d j 528 + } else if(c0 == 'l' && c1 == 'd'){ + 5b8: 06400793 li a5,100 + 5bc: 02f68963 beq a3,a5,5ee + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5c0: 06c00793 li a5,108 + 5c4: 04f68263 beq a3,a5,608 + } else if(c0 == 'l' && c1 == 'u'){ + 5c8: 07500793 li a5,117 + 5cc: 0af68063 beq a3,a5,66c + } else if(c0 == 'l' && c1 == 'x'){ + 5d0: 07800793 li a5,120 + 5d4: 0ef68263 beq a3,a5,6b8 + putc(fd, '%'); + 5d8: 02500593 li a1,37 + 5dc: 855a mv a0,s6 + 5de: e47ff0ef jal 424 + putc(fd, c0); + 5e2: 85ca mv a1,s2 + 5e4: 855a mv a0,s6 + 5e6: e3fff0ef jal 424 + state = 0; + 5ea: 4981 li s3,0 + 5ec: bf35 j 528 + printint(fd, va_arg(ap, uint64), 10, 1); + 5ee: 008b8913 addi s2,s7,8 + 5f2: 4685 li a3,1 + 5f4: 4629 li a2,10 + 5f6: 000bb583 ld a1,0(s7) + 5fa: 855a mv a0,s6 + 5fc: e47ff0ef jal 442 + i += 1; + 600: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 602: 8bca mv s7,s2 + state = 0; + 604: 4981 li s3,0 + i += 1; + 606: b70d j 528 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 608: 06400793 li a5,100 + 60c: 02f60763 beq a2,a5,63a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 610: 07500793 li a5,117 + 614: 06f60963 beq a2,a5,686 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 618: 07800793 li a5,120 + 61c: faf61ee3 bne a2,a5,5d8 + printint(fd, va_arg(ap, uint64), 16, 0); + 620: 008b8913 addi s2,s7,8 + 624: 4681 li a3,0 + 626: 4641 li a2,16 + 628: 000bb583 ld a1,0(s7) + 62c: 855a mv a0,s6 + 62e: e15ff0ef jal 442 + i += 2; + 632: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 634: 8bca mv s7,s2 + state = 0; + 636: 4981 li s3,0 + i += 2; + 638: bdc5 j 528 + printint(fd, va_arg(ap, uint64), 10, 1); + 63a: 008b8913 addi s2,s7,8 + 63e: 4685 li a3,1 + 640: 4629 li a2,10 + 642: 000bb583 ld a1,0(s7) + 646: 855a mv a0,s6 + 648: dfbff0ef jal 442 + i += 2; + 64c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 64e: 8bca mv s7,s2 + state = 0; + 650: 4981 li s3,0 + i += 2; + 652: bdd9 j 528 + printint(fd, va_arg(ap, uint32), 10, 0); + 654: 008b8913 addi s2,s7,8 + 658: 4681 li a3,0 + 65a: 4629 li a2,10 + 65c: 000be583 lwu a1,0(s7) + 660: 855a mv a0,s6 + 662: de1ff0ef jal 442 + 666: 8bca mv s7,s2 + state = 0; + 668: 4981 li s3,0 + 66a: bd7d j 528 + printint(fd, va_arg(ap, uint64), 10, 0); + 66c: 008b8913 addi s2,s7,8 + 670: 4681 li a3,0 + 672: 4629 li a2,10 + 674: 000bb583 ld a1,0(s7) + 678: 855a mv a0,s6 + 67a: dc9ff0ef jal 442 + i += 1; + 67e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 680: 8bca mv s7,s2 + state = 0; + 682: 4981 li s3,0 + i += 1; + 684: b555 j 528 + printint(fd, va_arg(ap, uint64), 10, 0); + 686: 008b8913 addi s2,s7,8 + 68a: 4681 li a3,0 + 68c: 4629 li a2,10 + 68e: 000bb583 ld a1,0(s7) + 692: 855a mv a0,s6 + 694: dafff0ef jal 442 + i += 2; + 698: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 69a: 8bca mv s7,s2 + state = 0; + 69c: 4981 li s3,0 + i += 2; + 69e: b569 j 528 + printint(fd, va_arg(ap, uint32), 16, 0); + 6a0: 008b8913 addi s2,s7,8 + 6a4: 4681 li a3,0 + 6a6: 4641 li a2,16 + 6a8: 000be583 lwu a1,0(s7) + 6ac: 855a mv a0,s6 + 6ae: d95ff0ef jal 442 + 6b2: 8bca mv s7,s2 + state = 0; + 6b4: 4981 li s3,0 + 6b6: bd8d j 528 + printint(fd, va_arg(ap, uint64), 16, 0); + 6b8: 008b8913 addi s2,s7,8 + 6bc: 4681 li a3,0 + 6be: 4641 li a2,16 + 6c0: 000bb583 ld a1,0(s7) + 6c4: 855a mv a0,s6 + 6c6: d7dff0ef jal 442 + i += 1; + 6ca: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6cc: 8bca mv s7,s2 + state = 0; + 6ce: 4981 li s3,0 + i += 1; + 6d0: bda1 j 528 + 6d2: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 6d4: 008b8d13 addi s10,s7,8 + 6d8: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6dc: 03000593 li a1,48 + 6e0: 855a mv a0,s6 + 6e2: d43ff0ef jal 424 + putc(fd, 'x'); + 6e6: 07800593 li a1,120 + 6ea: 855a mv a0,s6 + 6ec: d39ff0ef jal 424 + 6f0: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6f2: 00000b97 auipc s7,0x0 + 6f6: 2b6b8b93 addi s7,s7,694 # 9a8 + 6fa: 03c9d793 srli a5,s3,0x3c + 6fe: 97de add a5,a5,s7 + 700: 0007c583 lbu a1,0(a5) + 704: 855a mv a0,s6 + 706: d1fff0ef jal 424 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 70a: 0992 slli s3,s3,0x4 + 70c: 397d addiw s2,s2,-1 + 70e: fe0916e3 bnez s2,6fa + printptr(fd, va_arg(ap, uint64)); + 712: 8bea mv s7,s10 + state = 0; + 714: 4981 li s3,0 + 716: 6d02 ld s10,0(sp) + 718: bd01 j 528 + putc(fd, va_arg(ap, uint32)); + 71a: 008b8913 addi s2,s7,8 + 71e: 000bc583 lbu a1,0(s7) + 722: 855a mv a0,s6 + 724: d01ff0ef jal 424 + 728: 8bca mv s7,s2 + state = 0; + 72a: 4981 li s3,0 + 72c: bbf5 j 528 + if((s = va_arg(ap, char*)) == 0) + 72e: 008b8993 addi s3,s7,8 + 732: 000bb903 ld s2,0(s7) + 736: 00090f63 beqz s2,754 + for(; *s; s++) + 73a: 00094583 lbu a1,0(s2) + 73e: c195 beqz a1,762 + putc(fd, *s); + 740: 855a mv a0,s6 + 742: ce3ff0ef jal 424 + for(; *s; s++) + 746: 0905 addi s2,s2,1 + 748: 00094583 lbu a1,0(s2) + 74c: f9f5 bnez a1,740 + if((s = va_arg(ap, char*)) == 0) + 74e: 8bce mv s7,s3 + state = 0; + 750: 4981 li s3,0 + 752: bbd9 j 528 + s = "(null)"; + 754: 00000917 auipc s2,0x0 + 758: 24c90913 addi s2,s2,588 # 9a0 + for(; *s; s++) + 75c: 02800593 li a1,40 + 760: b7c5 j 740 + if((s = va_arg(ap, char*)) == 0) + 762: 8bce mv s7,s3 + state = 0; + 764: 4981 li s3,0 + 766: b3c9 j 528 + 768: 64a6 ld s1,72(sp) + 76a: 79e2 ld s3,56(sp) + 76c: 7a42 ld s4,48(sp) + 76e: 7aa2 ld s5,40(sp) + 770: 7b02 ld s6,32(sp) + 772: 6be2 ld s7,24(sp) + 774: 6c42 ld s8,16(sp) + 776: 6ca2 ld s9,8(sp) + } + } +} + 778: 60e6 ld ra,88(sp) + 77a: 6446 ld s0,80(sp) + 77c: 6906 ld s2,64(sp) + 77e: 6125 addi sp,sp,96 + 780: 8082 ret + +0000000000000782 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 782: 715d addi sp,sp,-80 + 784: ec06 sd ra,24(sp) + 786: e822 sd s0,16(sp) + 788: 1000 addi s0,sp,32 + 78a: e010 sd a2,0(s0) + 78c: e414 sd a3,8(s0) + 78e: e818 sd a4,16(s0) + 790: ec1c sd a5,24(s0) + 792: 03043023 sd a6,32(s0) + 796: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 79a: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 79e: 8622 mv a2,s0 + 7a0: d3fff0ef jal 4de +} + 7a4: 60e2 ld ra,24(sp) + 7a6: 6442 ld s0,16(sp) + 7a8: 6161 addi sp,sp,80 + 7aa: 8082 ret + +00000000000007ac : + +void +printf(const char *fmt, ...) +{ + 7ac: 711d addi sp,sp,-96 + 7ae: ec06 sd ra,24(sp) + 7b0: e822 sd s0,16(sp) + 7b2: 1000 addi s0,sp,32 + 7b4: e40c sd a1,8(s0) + 7b6: e810 sd a2,16(s0) + 7b8: ec14 sd a3,24(s0) + 7ba: f018 sd a4,32(s0) + 7bc: f41c sd a5,40(s0) + 7be: 03043823 sd a6,48(s0) + 7c2: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 7c6: 00840613 addi a2,s0,8 + 7ca: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 7ce: 85aa mv a1,a0 + 7d0: 4505 li a0,1 + 7d2: d0dff0ef jal 4de +} + 7d6: 60e2 ld ra,24(sp) + 7d8: 6442 ld s0,16(sp) + 7da: 6125 addi sp,sp,96 + 7dc: 8082 ret + +00000000000007de : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7de: 1141 addi sp,sp,-16 + 7e0: e422 sd s0,8(sp) + 7e2: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7e4: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7e8: 00001797 auipc a5,0x1 + 7ec: 8187b783 ld a5,-2024(a5) # 1000 + 7f0: a02d j 81a + 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; + 7f2: 4618 lw a4,8(a2) + 7f4: 9f2d addw a4,a4,a1 + 7f6: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7fa: 6398 ld a4,0(a5) + 7fc: 6310 ld a2,0(a4) + 7fe: a83d j 83c + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 800: ff852703 lw a4,-8(a0) + 804: 9f31 addw a4,a4,a2 + 806: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 808: ff053683 ld a3,-16(a0) + 80c: a091 j 850 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 80e: 6398 ld a4,0(a5) + 810: 00e7e463 bltu a5,a4,818 + 814: 00e6ea63 bltu a3,a4,828 +{ + 818: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 81a: fed7fae3 bgeu a5,a3,80e + 81e: 6398 ld a4,0(a5) + 820: 00e6e463 bltu a3,a4,828 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 824: fee7eae3 bltu a5,a4,818 + if(bp + bp->s.size == p->s.ptr){ + 828: ff852583 lw a1,-8(a0) + 82c: 6390 ld a2,0(a5) + 82e: 02059813 slli a6,a1,0x20 + 832: 01c85713 srli a4,a6,0x1c + 836: 9736 add a4,a4,a3 + 838: fae60de3 beq a2,a4,7f2 + bp->s.ptr = p->s.ptr->s.ptr; + 83c: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 840: 4790 lw a2,8(a5) + 842: 02061593 slli a1,a2,0x20 + 846: 01c5d713 srli a4,a1,0x1c + 84a: 973e add a4,a4,a5 + 84c: fae68ae3 beq a3,a4,800 + p->s.ptr = bp->s.ptr; + 850: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 852: 00000717 auipc a4,0x0 + 856: 7af73723 sd a5,1966(a4) # 1000 +} + 85a: 6422 ld s0,8(sp) + 85c: 0141 addi sp,sp,16 + 85e: 8082 ret + +0000000000000860 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 860: 7139 addi sp,sp,-64 + 862: fc06 sd ra,56(sp) + 864: f822 sd s0,48(sp) + 866: f426 sd s1,40(sp) + 868: ec4e sd s3,24(sp) + 86a: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 86c: 02051493 slli s1,a0,0x20 + 870: 9081 srli s1,s1,0x20 + 872: 04bd addi s1,s1,15 + 874: 8091 srli s1,s1,0x4 + 876: 0014899b addiw s3,s1,1 + 87a: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 87c: 00000517 auipc a0,0x0 + 880: 78453503 ld a0,1924(a0) # 1000 + 884: c915 beqz a0,8b8 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 886: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 888: 4798 lw a4,8(a5) + 88a: 08977a63 bgeu a4,s1,91e + 88e: f04a sd s2,32(sp) + 890: e852 sd s4,16(sp) + 892: e456 sd s5,8(sp) + 894: e05a sd s6,0(sp) + if(nu < 4096) + 896: 8a4e mv s4,s3 + 898: 0009871b sext.w a4,s3 + 89c: 6685 lui a3,0x1 + 89e: 00d77363 bgeu a4,a3,8a4 + 8a2: 6a05 lui s4,0x1 + 8a4: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 8a8: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 8ac: 00000917 auipc s2,0x0 + 8b0: 75490913 addi s2,s2,1876 # 1000 + if(p == SBRK_ERROR) + 8b4: 5afd li s5,-1 + 8b6: a081 j 8f6 + 8b8: f04a sd s2,32(sp) + 8ba: e852 sd s4,16(sp) + 8bc: e456 sd s5,8(sp) + 8be: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 8c0: 00000797 auipc a5,0x0 + 8c4: 75078793 addi a5,a5,1872 # 1010 + 8c8: 00000717 auipc a4,0x0 + 8cc: 72f73c23 sd a5,1848(a4) # 1000 + 8d0: e39c sd a5,0(a5) + base.s.size = 0; + 8d2: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 8d6: b7c1 j 896 + prevp->s.ptr = p->s.ptr; + 8d8: 6398 ld a4,0(a5) + 8da: e118 sd a4,0(a0) + 8dc: a8a9 j 936 + hp->s.size = nu; + 8de: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8e2: 0541 addi a0,a0,16 + 8e4: efbff0ef jal 7de + return freep; + 8e8: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8ec: c12d beqz a0,94e + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8ee: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8f0: 4798 lw a4,8(a5) + 8f2: 02977263 bgeu a4,s1,916 + if(p == freep) + 8f6: 00093703 ld a4,0(s2) + 8fa: 853e mv a0,a5 + 8fc: fef719e3 bne a4,a5,8ee + p = sbrk(nu * sizeof(Header)); + 900: 8552 mv a0,s4 + 902: a37ff0ef jal 338 + if(p == SBRK_ERROR) + 906: fd551ce3 bne a0,s5,8de + return 0; + 90a: 4501 li a0,0 + 90c: 7902 ld s2,32(sp) + 90e: 6a42 ld s4,16(sp) + 910: 6aa2 ld s5,8(sp) + 912: 6b02 ld s6,0(sp) + 914: a03d j 942 + 916: 7902 ld s2,32(sp) + 918: 6a42 ld s4,16(sp) + 91a: 6aa2 ld s5,8(sp) + 91c: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 91e: fae48de3 beq s1,a4,8d8 + p->s.size -= nunits; + 922: 4137073b subw a4,a4,s3 + 926: c798 sw a4,8(a5) + p += p->s.size; + 928: 02071693 slli a3,a4,0x20 + 92c: 01c6d713 srli a4,a3,0x1c + 930: 97ba add a5,a5,a4 + p->s.size = nunits; + 932: 0137a423 sw s3,8(a5) + freep = prevp; + 936: 00000717 auipc a4,0x0 + 93a: 6ca73523 sd a0,1738(a4) # 1000 + return (void*)(p + 1); + 93e: 01078513 addi a0,a5,16 + } +} + 942: 70e2 ld ra,56(sp) + 944: 7442 ld s0,48(sp) + 946: 74a2 ld s1,40(sp) + 948: 69e2 ld s3,24(sp) + 94a: 6121 addi sp,sp,64 + 94c: 8082 ret + 94e: 7902 ld s2,32(sp) + 950: 6a42 ld s4,16(sp) + 952: 6aa2 ld s5,8(sp) + 954: 6b02 ld s6,0(sp) + 956: b7f5 j 942 diff --git a/user/stressfs.c b/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.c similarity index 100% rename from user/stressfs.c rename to G12_Project1_xv6CustomizeSystemCalls/user/stressfs.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.d b/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.d new file mode 100644 index 0000000000..027fba3704 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.d @@ -0,0 +1,2 @@ +user/stressfs.o: user/stressfs.c kernel/types.h kernel/stat.h user/user.h \ + kernel/fs.h kernel/fcntl.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.o b/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.o new file mode 100644 index 0000000000..0fc130ca21 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.sym b/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.sym new file mode 100644 index 0000000000..1f394780b9 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/stressfs.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +0000000000000958 .rodata +00000000000009c0 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 stressfs.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000424 putc +0000000000000442 printint +00000000000009a8 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +00000000000000e8 strcpy +00000000000003fc pause +00000000000007ac printf +00000000000003f4 sys_sbrk +0000000000000292 memmove +00000000000003b4 mknod +00000000000001a0 gets +00000000000003ec getpid +0000000000000324 memcpy +0000000000000860 malloc +000000000000034e sbrklazy +000000000000037c pipe +000000000000038c write +00000000000003c4 fstat +0000000000000782 fprintf +000000000000039c kill +00000000000004de vprintf +00000000000003dc chdir +00000000000003a4 exec +0000000000000374 wait +000000000000040c getprocsinfo +0000000000000384 read +00000000000003bc unlink +00000000000002ea memcmp +0000000000000364 fork +0000000000000338 sbrk +0000000000000404 uptime +000000000000015a memset +0000000000000000 main +0000000000000414 getppid +0000000000000104 strcmp +00000000000003e4 dup +0000000000000210 stat +000000000000041c sleep2 +00000000000003cc link +000000000000036c exit +00000000000000d8 start +000000000000024a atoi +0000000000000130 strlen +00000000000003ac open +000000000000017c strchr +00000000000003d4 mkdir +0000000000000394 close +00000000000007de free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.asm b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.asm new file mode 100644 index 0000000000..87e2250e92 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.asm @@ -0,0 +1,1503 @@ + +user/_test_getppid: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/types.h" +#include "user/user.h" + +int main(){ + 0: 1141 addi sp,sp,-16 + 2: e406 sd ra,8(sp) + 4: e022 sd s0,0(sp) + 6: 0800 addi s0,sp,16 + printf("My PID: %d\n", getpid()); + 8: 33e000ef jal 346 + c: 85aa mv a1,a0 + e: 00001517 auipc a0,0x1 + 12: 8b250513 addi a0,a0,-1870 # 8c0 + 16: 6f0000ef jal 706 + printf("Parent PID: %d\n", getppid()); + 1a: 354000ef jal 36e + 1e: 85aa mv a1,a0 + 20: 00001517 auipc a0,0x1 + 24: 8b050513 addi a0,a0,-1872 # 8d0 + 28: 6de000ef jal 706 + exit(0); + 2c: 4501 li a0,0 + 2e: 298000ef jal 2c6 + +0000000000000032 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 32: 1141 addi sp,sp,-16 + 34: e406 sd ra,8(sp) + 36: e022 sd s0,0(sp) + 38: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 3a: fc7ff0ef jal 0
+ exit(r); + 3e: 288000ef jal 2c6 + +0000000000000042 : +} + +char* +strcpy(char *s, const char *t) +{ + 42: 1141 addi sp,sp,-16 + 44: e422 sd s0,8(sp) + 46: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 48: 87aa mv a5,a0 + 4a: 0585 addi a1,a1,1 + 4c: 0785 addi a5,a5,1 + 4e: fff5c703 lbu a4,-1(a1) + 52: fee78fa3 sb a4,-1(a5) + 56: fb75 bnez a4,4a + ; + return os; +} + 58: 6422 ld s0,8(sp) + 5a: 0141 addi sp,sp,16 + 5c: 8082 ret + +000000000000005e : + +int +strcmp(const char *p, const char *q) +{ + 5e: 1141 addi sp,sp,-16 + 60: e422 sd s0,8(sp) + 62: 0800 addi s0,sp,16 + while(*p && *p == *q) + 64: 00054783 lbu a5,0(a0) + 68: cb91 beqz a5,7c + 6a: 0005c703 lbu a4,0(a1) + 6e: 00f71763 bne a4,a5,7c + p++, q++; + 72: 0505 addi a0,a0,1 + 74: 0585 addi a1,a1,1 + while(*p && *p == *q) + 76: 00054783 lbu a5,0(a0) + 7a: fbe5 bnez a5,6a + return (uchar)*p - (uchar)*q; + 7c: 0005c503 lbu a0,0(a1) +} + 80: 40a7853b subw a0,a5,a0 + 84: 6422 ld s0,8(sp) + 86: 0141 addi sp,sp,16 + 88: 8082 ret + +000000000000008a : + +uint +strlen(const char *s) +{ + 8a: 1141 addi sp,sp,-16 + 8c: e422 sd s0,8(sp) + 8e: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 90: 00054783 lbu a5,0(a0) + 94: cf91 beqz a5,b0 + 96: 0505 addi a0,a0,1 + 98: 87aa mv a5,a0 + 9a: 86be mv a3,a5 + 9c: 0785 addi a5,a5,1 + 9e: fff7c703 lbu a4,-1(a5) + a2: ff65 bnez a4,9a + a4: 40a6853b subw a0,a3,a0 + a8: 2505 addiw a0,a0,1 + ; + return n; +} + aa: 6422 ld s0,8(sp) + ac: 0141 addi sp,sp,16 + ae: 8082 ret + for(n = 0; s[n]; n++) + b0: 4501 li a0,0 + b2: bfe5 j aa + +00000000000000b4 : + +void* +memset(void *dst, int c, uint n) +{ + b4: 1141 addi sp,sp,-16 + b6: e422 sd s0,8(sp) + b8: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + ba: ca19 beqz a2,d0 + bc: 87aa mv a5,a0 + be: 1602 slli a2,a2,0x20 + c0: 9201 srli a2,a2,0x20 + c2: 00a60733 add a4,a2,a0 + cdst[i] = c; + c6: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + ca: 0785 addi a5,a5,1 + cc: fee79de3 bne a5,a4,c6 + } + return dst; +} + d0: 6422 ld s0,8(sp) + d2: 0141 addi sp,sp,16 + d4: 8082 ret + +00000000000000d6 : + +char* +strchr(const char *s, char c) +{ + d6: 1141 addi sp,sp,-16 + d8: e422 sd s0,8(sp) + da: 0800 addi s0,sp,16 + for(; *s; s++) + dc: 00054783 lbu a5,0(a0) + e0: cb99 beqz a5,f6 + if(*s == c) + e2: 00f58763 beq a1,a5,f0 + for(; *s; s++) + e6: 0505 addi a0,a0,1 + e8: 00054783 lbu a5,0(a0) + ec: fbfd bnez a5,e2 + return (char*)s; + return 0; + ee: 4501 li a0,0 +} + f0: 6422 ld s0,8(sp) + f2: 0141 addi sp,sp,16 + f4: 8082 ret + return 0; + f6: 4501 li a0,0 + f8: bfe5 j f0 + +00000000000000fa : + +char* +gets(char *buf, int max) +{ + fa: 711d addi sp,sp,-96 + fc: ec86 sd ra,88(sp) + fe: e8a2 sd s0,80(sp) + 100: e4a6 sd s1,72(sp) + 102: e0ca sd s2,64(sp) + 104: fc4e sd s3,56(sp) + 106: f852 sd s4,48(sp) + 108: f456 sd s5,40(sp) + 10a: f05a sd s6,32(sp) + 10c: ec5e sd s7,24(sp) + 10e: 1080 addi s0,sp,96 + 110: 8baa mv s7,a0 + 112: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 114: 892a mv s2,a0 + 116: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 118: 4aa9 li s5,10 + 11a: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 11c: 89a6 mv s3,s1 + 11e: 2485 addiw s1,s1,1 + 120: 0344d663 bge s1,s4,14c + cc = read(0, &c, 1); + 124: 4605 li a2,1 + 126: faf40593 addi a1,s0,-81 + 12a: 4501 li a0,0 + 12c: 1b2000ef jal 2de + if(cc < 1) + 130: 00a05e63 blez a0,14c + buf[i++] = c; + 134: faf44783 lbu a5,-81(s0) + 138: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 13c: 01578763 beq a5,s5,14a + 140: 0905 addi s2,s2,1 + 142: fd679de3 bne a5,s6,11c + buf[i++] = c; + 146: 89a6 mv s3,s1 + 148: a011 j 14c + 14a: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 14c: 99de add s3,s3,s7 + 14e: 00098023 sb zero,0(s3) + return buf; +} + 152: 855e mv a0,s7 + 154: 60e6 ld ra,88(sp) + 156: 6446 ld s0,80(sp) + 158: 64a6 ld s1,72(sp) + 15a: 6906 ld s2,64(sp) + 15c: 79e2 ld s3,56(sp) + 15e: 7a42 ld s4,48(sp) + 160: 7aa2 ld s5,40(sp) + 162: 7b02 ld s6,32(sp) + 164: 6be2 ld s7,24(sp) + 166: 6125 addi sp,sp,96 + 168: 8082 ret + +000000000000016a : + +int +stat(const char *n, struct stat *st) +{ + 16a: 1101 addi sp,sp,-32 + 16c: ec06 sd ra,24(sp) + 16e: e822 sd s0,16(sp) + 170: e04a sd s2,0(sp) + 172: 1000 addi s0,sp,32 + 174: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 176: 4581 li a1,0 + 178: 18e000ef jal 306 + if(fd < 0) + 17c: 02054263 bltz a0,1a0 + 180: e426 sd s1,8(sp) + 182: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 184: 85ca mv a1,s2 + 186: 198000ef jal 31e + 18a: 892a mv s2,a0 + close(fd); + 18c: 8526 mv a0,s1 + 18e: 160000ef jal 2ee + return r; + 192: 64a2 ld s1,8(sp) +} + 194: 854a mv a0,s2 + 196: 60e2 ld ra,24(sp) + 198: 6442 ld s0,16(sp) + 19a: 6902 ld s2,0(sp) + 19c: 6105 addi sp,sp,32 + 19e: 8082 ret + return -1; + 1a0: 597d li s2,-1 + 1a2: bfcd j 194 + +00000000000001a4 : + +int +atoi(const char *s) +{ + 1a4: 1141 addi sp,sp,-16 + 1a6: e422 sd s0,8(sp) + 1a8: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1aa: 00054683 lbu a3,0(a0) + 1ae: fd06879b addiw a5,a3,-48 + 1b2: 0ff7f793 zext.b a5,a5 + 1b6: 4625 li a2,9 + 1b8: 02f66863 bltu a2,a5,1e8 + 1bc: 872a mv a4,a0 + n = 0; + 1be: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1c0: 0705 addi a4,a4,1 + 1c2: 0025179b slliw a5,a0,0x2 + 1c6: 9fa9 addw a5,a5,a0 + 1c8: 0017979b slliw a5,a5,0x1 + 1cc: 9fb5 addw a5,a5,a3 + 1ce: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1d2: 00074683 lbu a3,0(a4) + 1d6: fd06879b addiw a5,a3,-48 + 1da: 0ff7f793 zext.b a5,a5 + 1de: fef671e3 bgeu a2,a5,1c0 + return n; +} + 1e2: 6422 ld s0,8(sp) + 1e4: 0141 addi sp,sp,16 + 1e6: 8082 ret + n = 0; + 1e8: 4501 li a0,0 + 1ea: bfe5 j 1e2 + +00000000000001ec : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 1ec: 1141 addi sp,sp,-16 + 1ee: e422 sd s0,8(sp) + 1f0: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 1f2: 02b57463 bgeu a0,a1,21a + while(n-- > 0) + 1f6: 00c05f63 blez a2,214 + 1fa: 1602 slli a2,a2,0x20 + 1fc: 9201 srli a2,a2,0x20 + 1fe: 00c507b3 add a5,a0,a2 + dst = vdst; + 202: 872a mv a4,a0 + *dst++ = *src++; + 204: 0585 addi a1,a1,1 + 206: 0705 addi a4,a4,1 + 208: fff5c683 lbu a3,-1(a1) + 20c: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 210: fef71ae3 bne a4,a5,204 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 214: 6422 ld s0,8(sp) + 216: 0141 addi sp,sp,16 + 218: 8082 ret + dst += n; + 21a: 00c50733 add a4,a0,a2 + src += n; + 21e: 95b2 add a1,a1,a2 + while(n-- > 0) + 220: fec05ae3 blez a2,214 + 224: fff6079b addiw a5,a2,-1 + 228: 1782 slli a5,a5,0x20 + 22a: 9381 srli a5,a5,0x20 + 22c: fff7c793 not a5,a5 + 230: 97ba add a5,a5,a4 + *--dst = *--src; + 232: 15fd addi a1,a1,-1 + 234: 177d addi a4,a4,-1 + 236: 0005c683 lbu a3,0(a1) + 23a: 00d70023 sb a3,0(a4) + while(n-- > 0) + 23e: fee79ae3 bne a5,a4,232 + 242: bfc9 j 214 + +0000000000000244 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 244: 1141 addi sp,sp,-16 + 246: e422 sd s0,8(sp) + 248: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 24a: ca05 beqz a2,27a + 24c: fff6069b addiw a3,a2,-1 + 250: 1682 slli a3,a3,0x20 + 252: 9281 srli a3,a3,0x20 + 254: 0685 addi a3,a3,1 + 256: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 258: 00054783 lbu a5,0(a0) + 25c: 0005c703 lbu a4,0(a1) + 260: 00e79863 bne a5,a4,270 + return *p1 - *p2; + } + p1++; + 264: 0505 addi a0,a0,1 + p2++; + 266: 0585 addi a1,a1,1 + while (n-- > 0) { + 268: fed518e3 bne a0,a3,258 + } + return 0; + 26c: 4501 li a0,0 + 26e: a019 j 274 + return *p1 - *p2; + 270: 40e7853b subw a0,a5,a4 +} + 274: 6422 ld s0,8(sp) + 276: 0141 addi sp,sp,16 + 278: 8082 ret + return 0; + 27a: 4501 li a0,0 + 27c: bfe5 j 274 + +000000000000027e : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 27e: 1141 addi sp,sp,-16 + 280: e406 sd ra,8(sp) + 282: e022 sd s0,0(sp) + 284: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 286: f67ff0ef jal 1ec +} + 28a: 60a2 ld ra,8(sp) + 28c: 6402 ld s0,0(sp) + 28e: 0141 addi sp,sp,16 + 290: 8082 ret + +0000000000000292 : + +char * +sbrk(int n) { + 292: 1141 addi sp,sp,-16 + 294: e406 sd ra,8(sp) + 296: e022 sd s0,0(sp) + 298: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 29a: 4585 li a1,1 + 29c: 0b2000ef jal 34e +} + 2a0: 60a2 ld ra,8(sp) + 2a2: 6402 ld s0,0(sp) + 2a4: 0141 addi sp,sp,16 + 2a6: 8082 ret + +00000000000002a8 : + +char * +sbrklazy(int n) { + 2a8: 1141 addi sp,sp,-16 + 2aa: e406 sd ra,8(sp) + 2ac: e022 sd s0,0(sp) + 2ae: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2b0: 4589 li a1,2 + 2b2: 09c000ef jal 34e +} + 2b6: 60a2 ld ra,8(sp) + 2b8: 6402 ld s0,0(sp) + 2ba: 0141 addi sp,sp,16 + 2bc: 8082 ret + +00000000000002be : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2be: 4885 li a7,1 + ecall + 2c0: 00000073 ecall + ret + 2c4: 8082 ret + +00000000000002c6 : +.global exit +exit: + li a7, SYS_exit + 2c6: 4889 li a7,2 + ecall + 2c8: 00000073 ecall + ret + 2cc: 8082 ret + +00000000000002ce : +.global wait +wait: + li a7, SYS_wait + 2ce: 488d li a7,3 + ecall + 2d0: 00000073 ecall + ret + 2d4: 8082 ret + +00000000000002d6 : +.global pipe +pipe: + li a7, SYS_pipe + 2d6: 4891 li a7,4 + ecall + 2d8: 00000073 ecall + ret + 2dc: 8082 ret + +00000000000002de : +.global read +read: + li a7, SYS_read + 2de: 4895 li a7,5 + ecall + 2e0: 00000073 ecall + ret + 2e4: 8082 ret + +00000000000002e6 : +.global write +write: + li a7, SYS_write + 2e6: 48c1 li a7,16 + ecall + 2e8: 00000073 ecall + ret + 2ec: 8082 ret + +00000000000002ee : +.global close +close: + li a7, SYS_close + 2ee: 48d5 li a7,21 + ecall + 2f0: 00000073 ecall + ret + 2f4: 8082 ret + +00000000000002f6 : +.global kill +kill: + li a7, SYS_kill + 2f6: 4899 li a7,6 + ecall + 2f8: 00000073 ecall + ret + 2fc: 8082 ret + +00000000000002fe : +.global exec +exec: + li a7, SYS_exec + 2fe: 489d li a7,7 + ecall + 300: 00000073 ecall + ret + 304: 8082 ret + +0000000000000306 : +.global open +open: + li a7, SYS_open + 306: 48bd li a7,15 + ecall + 308: 00000073 ecall + ret + 30c: 8082 ret + +000000000000030e : +.global mknod +mknod: + li a7, SYS_mknod + 30e: 48c5 li a7,17 + ecall + 310: 00000073 ecall + ret + 314: 8082 ret + +0000000000000316 : +.global unlink +unlink: + li a7, SYS_unlink + 316: 48c9 li a7,18 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e : +.global fstat +fstat: + li a7, SYS_fstat + 31e: 48a1 li a7,8 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 : +.global link +link: + li a7, SYS_link + 326: 48cd li a7,19 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e : +.global mkdir +mkdir: + li a7, SYS_mkdir + 32e: 48d1 li a7,20 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 : +.global chdir +chdir: + li a7, SYS_chdir + 336: 48a5 li a7,9 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e : +.global dup +dup: + li a7, SYS_dup + 33e: 48a9 li a7,10 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 : +.global getpid +getpid: + li a7, SYS_getpid + 346: 48ad li a7,11 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 34e: 48b1 li a7,12 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 : +.global pause +pause: + li a7, SYS_pause + 356: 48b5 li a7,13 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e : +.global uptime +uptime: + li a7, SYS_uptime + 35e: 48b9 li a7,14 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 366: 48d9 li a7,22 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e : +.global getppid +getppid: + li a7, SYS_getppid + 36e: 48dd li a7,23 + ecall + 370: 00000073 ecall + ret + 374: 8082 ret + +0000000000000376 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 376: 48e1 li a7,24 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 37e: 1101 addi sp,sp,-32 + 380: ec06 sd ra,24(sp) + 382: e822 sd s0,16(sp) + 384: 1000 addi s0,sp,32 + 386: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 38a: 4605 li a2,1 + 38c: fef40593 addi a1,s0,-17 + 390: f57ff0ef jal 2e6 +} + 394: 60e2 ld ra,24(sp) + 396: 6442 ld s0,16(sp) + 398: 6105 addi sp,sp,32 + 39a: 8082 ret + +000000000000039c : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 39c: 715d addi sp,sp,-80 + 39e: e486 sd ra,72(sp) + 3a0: e0a2 sd s0,64(sp) + 3a2: f84a sd s2,48(sp) + 3a4: 0880 addi s0,sp,80 + 3a6: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3a8: c299 beqz a3,3ae + 3aa: 0805c363 bltz a1,430 + neg = 0; + 3ae: 4881 li a7,0 + 3b0: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3b4: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3b6: 00000517 auipc a0,0x0 + 3ba: 53250513 addi a0,a0,1330 # 8e8 + 3be: 883e mv a6,a5 + 3c0: 2785 addiw a5,a5,1 + 3c2: 02c5f733 remu a4,a1,a2 + 3c6: 972a add a4,a4,a0 + 3c8: 00074703 lbu a4,0(a4) + 3cc: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3d0: 872e mv a4,a1 + 3d2: 02c5d5b3 divu a1,a1,a2 + 3d6: 0685 addi a3,a3,1 + 3d8: fec773e3 bgeu a4,a2,3be + if(neg) + 3dc: 00088b63 beqz a7,3f2 + buf[i++] = '-'; + 3e0: fd078793 addi a5,a5,-48 + 3e4: 97a2 add a5,a5,s0 + 3e6: 02d00713 li a4,45 + 3ea: fee78423 sb a4,-24(a5) + 3ee: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 3f2: 02f05a63 blez a5,426 + 3f6: fc26 sd s1,56(sp) + 3f8: f44e sd s3,40(sp) + 3fa: fb840713 addi a4,s0,-72 + 3fe: 00f704b3 add s1,a4,a5 + 402: fff70993 addi s3,a4,-1 + 406: 99be add s3,s3,a5 + 408: 37fd addiw a5,a5,-1 + 40a: 1782 slli a5,a5,0x20 + 40c: 9381 srli a5,a5,0x20 + 40e: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 412: fff4c583 lbu a1,-1(s1) + 416: 854a mv a0,s2 + 418: f67ff0ef jal 37e + while(--i >= 0) + 41c: 14fd addi s1,s1,-1 + 41e: ff349ae3 bne s1,s3,412 + 422: 74e2 ld s1,56(sp) + 424: 79a2 ld s3,40(sp) +} + 426: 60a6 ld ra,72(sp) + 428: 6406 ld s0,64(sp) + 42a: 7942 ld s2,48(sp) + 42c: 6161 addi sp,sp,80 + 42e: 8082 ret + x = -xx; + 430: 40b005b3 neg a1,a1 + neg = 1; + 434: 4885 li a7,1 + x = -xx; + 436: bfad j 3b0 + +0000000000000438 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 438: 711d addi sp,sp,-96 + 43a: ec86 sd ra,88(sp) + 43c: e8a2 sd s0,80(sp) + 43e: e0ca sd s2,64(sp) + 440: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 442: 0005c903 lbu s2,0(a1) + 446: 28090663 beqz s2,6d2 + 44a: e4a6 sd s1,72(sp) + 44c: fc4e sd s3,56(sp) + 44e: f852 sd s4,48(sp) + 450: f456 sd s5,40(sp) + 452: f05a sd s6,32(sp) + 454: ec5e sd s7,24(sp) + 456: e862 sd s8,16(sp) + 458: e466 sd s9,8(sp) + 45a: 8b2a mv s6,a0 + 45c: 8a2e mv s4,a1 + 45e: 8bb2 mv s7,a2 + state = 0; + 460: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 462: 4481 li s1,0 + 464: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 466: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 46a: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 46e: 06c00c93 li s9,108 + 472: a005 j 492 + putc(fd, c0); + 474: 85ca mv a1,s2 + 476: 855a mv a0,s6 + 478: f07ff0ef jal 37e + 47c: a019 j 482 + } else if(state == '%'){ + 47e: 03598263 beq s3,s5,4a2 + for(i = 0; fmt[i]; i++){ + 482: 2485 addiw s1,s1,1 + 484: 8726 mv a4,s1 + 486: 009a07b3 add a5,s4,s1 + 48a: 0007c903 lbu s2,0(a5) + 48e: 22090a63 beqz s2,6c2 + c0 = fmt[i] & 0xff; + 492: 0009079b sext.w a5,s2 + if(state == 0){ + 496: fe0994e3 bnez s3,47e + if(c0 == '%'){ + 49a: fd579de3 bne a5,s5,474 + state = '%'; + 49e: 89be mv s3,a5 + 4a0: b7cd j 482 + if(c0) c1 = fmt[i+1] & 0xff; + 4a2: 00ea06b3 add a3,s4,a4 + 4a6: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4aa: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4ac: c681 beqz a3,4b4 + 4ae: 9752 add a4,a4,s4 + 4b0: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4b4: 05878363 beq a5,s8,4fa + } else if(c0 == 'l' && c1 == 'd'){ + 4b8: 05978d63 beq a5,s9,512 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4bc: 07500713 li a4,117 + 4c0: 0ee78763 beq a5,a4,5ae + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4c4: 07800713 li a4,120 + 4c8: 12e78963 beq a5,a4,5fa + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4cc: 07000713 li a4,112 + 4d0: 14e78e63 beq a5,a4,62c + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4d4: 06300713 li a4,99 + 4d8: 18e78e63 beq a5,a4,674 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4dc: 07300713 li a4,115 + 4e0: 1ae78463 beq a5,a4,688 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4e4: 02500713 li a4,37 + 4e8: 04e79563 bne a5,a4,532 + putc(fd, '%'); + 4ec: 02500593 li a1,37 + 4f0: 855a mv a0,s6 + 4f2: e8dff0ef jal 37e + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 4f6: 4981 li s3,0 + 4f8: b769 j 482 + printint(fd, va_arg(ap, int), 10, 1); + 4fa: 008b8913 addi s2,s7,8 + 4fe: 4685 li a3,1 + 500: 4629 li a2,10 + 502: 000ba583 lw a1,0(s7) + 506: 855a mv a0,s6 + 508: e95ff0ef jal 39c + 50c: 8bca mv s7,s2 + state = 0; + 50e: 4981 li s3,0 + 510: bf8d j 482 + } else if(c0 == 'l' && c1 == 'd'){ + 512: 06400793 li a5,100 + 516: 02f68963 beq a3,a5,548 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 51a: 06c00793 li a5,108 + 51e: 04f68263 beq a3,a5,562 + } else if(c0 == 'l' && c1 == 'u'){ + 522: 07500793 li a5,117 + 526: 0af68063 beq a3,a5,5c6 + } else if(c0 == 'l' && c1 == 'x'){ + 52a: 07800793 li a5,120 + 52e: 0ef68263 beq a3,a5,612 + putc(fd, '%'); + 532: 02500593 li a1,37 + 536: 855a mv a0,s6 + 538: e47ff0ef jal 37e + putc(fd, c0); + 53c: 85ca mv a1,s2 + 53e: 855a mv a0,s6 + 540: e3fff0ef jal 37e + state = 0; + 544: 4981 li s3,0 + 546: bf35 j 482 + printint(fd, va_arg(ap, uint64), 10, 1); + 548: 008b8913 addi s2,s7,8 + 54c: 4685 li a3,1 + 54e: 4629 li a2,10 + 550: 000bb583 ld a1,0(s7) + 554: 855a mv a0,s6 + 556: e47ff0ef jal 39c + i += 1; + 55a: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 55c: 8bca mv s7,s2 + state = 0; + 55e: 4981 li s3,0 + i += 1; + 560: b70d j 482 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 562: 06400793 li a5,100 + 566: 02f60763 beq a2,a5,594 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 56a: 07500793 li a5,117 + 56e: 06f60963 beq a2,a5,5e0 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 572: 07800793 li a5,120 + 576: faf61ee3 bne a2,a5,532 + printint(fd, va_arg(ap, uint64), 16, 0); + 57a: 008b8913 addi s2,s7,8 + 57e: 4681 li a3,0 + 580: 4641 li a2,16 + 582: 000bb583 ld a1,0(s7) + 586: 855a mv a0,s6 + 588: e15ff0ef jal 39c + i += 2; + 58c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 58e: 8bca mv s7,s2 + state = 0; + 590: 4981 li s3,0 + i += 2; + 592: bdc5 j 482 + printint(fd, va_arg(ap, uint64), 10, 1); + 594: 008b8913 addi s2,s7,8 + 598: 4685 li a3,1 + 59a: 4629 li a2,10 + 59c: 000bb583 ld a1,0(s7) + 5a0: 855a mv a0,s6 + 5a2: dfbff0ef jal 39c + i += 2; + 5a6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5a8: 8bca mv s7,s2 + state = 0; + 5aa: 4981 li s3,0 + i += 2; + 5ac: bdd9 j 482 + printint(fd, va_arg(ap, uint32), 10, 0); + 5ae: 008b8913 addi s2,s7,8 + 5b2: 4681 li a3,0 + 5b4: 4629 li a2,10 + 5b6: 000be583 lwu a1,0(s7) + 5ba: 855a mv a0,s6 + 5bc: de1ff0ef jal 39c + 5c0: 8bca mv s7,s2 + state = 0; + 5c2: 4981 li s3,0 + 5c4: bd7d j 482 + printint(fd, va_arg(ap, uint64), 10, 0); + 5c6: 008b8913 addi s2,s7,8 + 5ca: 4681 li a3,0 + 5cc: 4629 li a2,10 + 5ce: 000bb583 ld a1,0(s7) + 5d2: 855a mv a0,s6 + 5d4: dc9ff0ef jal 39c + i += 1; + 5d8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5da: 8bca mv s7,s2 + state = 0; + 5dc: 4981 li s3,0 + i += 1; + 5de: b555 j 482 + printint(fd, va_arg(ap, uint64), 10, 0); + 5e0: 008b8913 addi s2,s7,8 + 5e4: 4681 li a3,0 + 5e6: 4629 li a2,10 + 5e8: 000bb583 ld a1,0(s7) + 5ec: 855a mv a0,s6 + 5ee: dafff0ef jal 39c + i += 2; + 5f2: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5f4: 8bca mv s7,s2 + state = 0; + 5f6: 4981 li s3,0 + i += 2; + 5f8: b569 j 482 + printint(fd, va_arg(ap, uint32), 16, 0); + 5fa: 008b8913 addi s2,s7,8 + 5fe: 4681 li a3,0 + 600: 4641 li a2,16 + 602: 000be583 lwu a1,0(s7) + 606: 855a mv a0,s6 + 608: d95ff0ef jal 39c + 60c: 8bca mv s7,s2 + state = 0; + 60e: 4981 li s3,0 + 610: bd8d j 482 + printint(fd, va_arg(ap, uint64), 16, 0); + 612: 008b8913 addi s2,s7,8 + 616: 4681 li a3,0 + 618: 4641 li a2,16 + 61a: 000bb583 ld a1,0(s7) + 61e: 855a mv a0,s6 + 620: d7dff0ef jal 39c + i += 1; + 624: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 626: 8bca mv s7,s2 + state = 0; + 628: 4981 li s3,0 + i += 1; + 62a: bda1 j 482 + 62c: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 62e: 008b8d13 addi s10,s7,8 + 632: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 636: 03000593 li a1,48 + 63a: 855a mv a0,s6 + 63c: d43ff0ef jal 37e + putc(fd, 'x'); + 640: 07800593 li a1,120 + 644: 855a mv a0,s6 + 646: d39ff0ef jal 37e + 64a: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 64c: 00000b97 auipc s7,0x0 + 650: 29cb8b93 addi s7,s7,668 # 8e8 + 654: 03c9d793 srli a5,s3,0x3c + 658: 97de add a5,a5,s7 + 65a: 0007c583 lbu a1,0(a5) + 65e: 855a mv a0,s6 + 660: d1fff0ef jal 37e + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 664: 0992 slli s3,s3,0x4 + 666: 397d addiw s2,s2,-1 + 668: fe0916e3 bnez s2,654 + printptr(fd, va_arg(ap, uint64)); + 66c: 8bea mv s7,s10 + state = 0; + 66e: 4981 li s3,0 + 670: 6d02 ld s10,0(sp) + 672: bd01 j 482 + putc(fd, va_arg(ap, uint32)); + 674: 008b8913 addi s2,s7,8 + 678: 000bc583 lbu a1,0(s7) + 67c: 855a mv a0,s6 + 67e: d01ff0ef jal 37e + 682: 8bca mv s7,s2 + state = 0; + 684: 4981 li s3,0 + 686: bbf5 j 482 + if((s = va_arg(ap, char*)) == 0) + 688: 008b8993 addi s3,s7,8 + 68c: 000bb903 ld s2,0(s7) + 690: 00090f63 beqz s2,6ae + for(; *s; s++) + 694: 00094583 lbu a1,0(s2) + 698: c195 beqz a1,6bc + putc(fd, *s); + 69a: 855a mv a0,s6 + 69c: ce3ff0ef jal 37e + for(; *s; s++) + 6a0: 0905 addi s2,s2,1 + 6a2: 00094583 lbu a1,0(s2) + 6a6: f9f5 bnez a1,69a + if((s = va_arg(ap, char*)) == 0) + 6a8: 8bce mv s7,s3 + state = 0; + 6aa: 4981 li s3,0 + 6ac: bbd9 j 482 + s = "(null)"; + 6ae: 00000917 auipc s2,0x0 + 6b2: 23290913 addi s2,s2,562 # 8e0 + for(; *s; s++) + 6b6: 02800593 li a1,40 + 6ba: b7c5 j 69a + if((s = va_arg(ap, char*)) == 0) + 6bc: 8bce mv s7,s3 + state = 0; + 6be: 4981 li s3,0 + 6c0: b3c9 j 482 + 6c2: 64a6 ld s1,72(sp) + 6c4: 79e2 ld s3,56(sp) + 6c6: 7a42 ld s4,48(sp) + 6c8: 7aa2 ld s5,40(sp) + 6ca: 7b02 ld s6,32(sp) + 6cc: 6be2 ld s7,24(sp) + 6ce: 6c42 ld s8,16(sp) + 6d0: 6ca2 ld s9,8(sp) + } + } +} + 6d2: 60e6 ld ra,88(sp) + 6d4: 6446 ld s0,80(sp) + 6d6: 6906 ld s2,64(sp) + 6d8: 6125 addi sp,sp,96 + 6da: 8082 ret + +00000000000006dc : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6dc: 715d addi sp,sp,-80 + 6de: ec06 sd ra,24(sp) + 6e0: e822 sd s0,16(sp) + 6e2: 1000 addi s0,sp,32 + 6e4: e010 sd a2,0(s0) + 6e6: e414 sd a3,8(s0) + 6e8: e818 sd a4,16(s0) + 6ea: ec1c sd a5,24(s0) + 6ec: 03043023 sd a6,32(s0) + 6f0: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6f4: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6f8: 8622 mv a2,s0 + 6fa: d3fff0ef jal 438 +} + 6fe: 60e2 ld ra,24(sp) + 700: 6442 ld s0,16(sp) + 702: 6161 addi sp,sp,80 + 704: 8082 ret + +0000000000000706 : + +void +printf(const char *fmt, ...) +{ + 706: 711d addi sp,sp,-96 + 708: ec06 sd ra,24(sp) + 70a: e822 sd s0,16(sp) + 70c: 1000 addi s0,sp,32 + 70e: e40c sd a1,8(s0) + 710: e810 sd a2,16(s0) + 712: ec14 sd a3,24(s0) + 714: f018 sd a4,32(s0) + 716: f41c sd a5,40(s0) + 718: 03043823 sd a6,48(s0) + 71c: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 720: 00840613 addi a2,s0,8 + 724: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 728: 85aa mv a1,a0 + 72a: 4505 li a0,1 + 72c: d0dff0ef jal 438 +} + 730: 60e2 ld ra,24(sp) + 732: 6442 ld s0,16(sp) + 734: 6125 addi sp,sp,96 + 736: 8082 ret + +0000000000000738 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 738: 1141 addi sp,sp,-16 + 73a: e422 sd s0,8(sp) + 73c: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 73e: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 742: 00001797 auipc a5,0x1 + 746: 8be7b783 ld a5,-1858(a5) # 1000 + 74a: a02d j 774 + 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; + 74c: 4618 lw a4,8(a2) + 74e: 9f2d addw a4,a4,a1 + 750: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 754: 6398 ld a4,0(a5) + 756: 6310 ld a2,0(a4) + 758: a83d j 796 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 75a: ff852703 lw a4,-8(a0) + 75e: 9f31 addw a4,a4,a2 + 760: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 762: ff053683 ld a3,-16(a0) + 766: a091 j 7aa + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 768: 6398 ld a4,0(a5) + 76a: 00e7e463 bltu a5,a4,772 + 76e: 00e6ea63 bltu a3,a4,782 +{ + 772: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 774: fed7fae3 bgeu a5,a3,768 + 778: 6398 ld a4,0(a5) + 77a: 00e6e463 bltu a3,a4,782 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 77e: fee7eae3 bltu a5,a4,772 + if(bp + bp->s.size == p->s.ptr){ + 782: ff852583 lw a1,-8(a0) + 786: 6390 ld a2,0(a5) + 788: 02059813 slli a6,a1,0x20 + 78c: 01c85713 srli a4,a6,0x1c + 790: 9736 add a4,a4,a3 + 792: fae60de3 beq a2,a4,74c + bp->s.ptr = p->s.ptr->s.ptr; + 796: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 79a: 4790 lw a2,8(a5) + 79c: 02061593 slli a1,a2,0x20 + 7a0: 01c5d713 srli a4,a1,0x1c + 7a4: 973e add a4,a4,a5 + 7a6: fae68ae3 beq a3,a4,75a + p->s.ptr = bp->s.ptr; + 7aa: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7ac: 00001717 auipc a4,0x1 + 7b0: 84f73a23 sd a5,-1964(a4) # 1000 +} + 7b4: 6422 ld s0,8(sp) + 7b6: 0141 addi sp,sp,16 + 7b8: 8082 ret + +00000000000007ba : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7ba: 7139 addi sp,sp,-64 + 7bc: fc06 sd ra,56(sp) + 7be: f822 sd s0,48(sp) + 7c0: f426 sd s1,40(sp) + 7c2: ec4e sd s3,24(sp) + 7c4: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7c6: 02051493 slli s1,a0,0x20 + 7ca: 9081 srli s1,s1,0x20 + 7cc: 04bd addi s1,s1,15 + 7ce: 8091 srli s1,s1,0x4 + 7d0: 0014899b addiw s3,s1,1 + 7d4: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7d6: 00001517 auipc a0,0x1 + 7da: 82a53503 ld a0,-2006(a0) # 1000 + 7de: c915 beqz a0,812 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7e0: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7e2: 4798 lw a4,8(a5) + 7e4: 08977a63 bgeu a4,s1,878 + 7e8: f04a sd s2,32(sp) + 7ea: e852 sd s4,16(sp) + 7ec: e456 sd s5,8(sp) + 7ee: e05a sd s6,0(sp) + if(nu < 4096) + 7f0: 8a4e mv s4,s3 + 7f2: 0009871b sext.w a4,s3 + 7f6: 6685 lui a3,0x1 + 7f8: 00d77363 bgeu a4,a3,7fe + 7fc: 6a05 lui s4,0x1 + 7fe: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 802: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 806: 00000917 auipc s2,0x0 + 80a: 7fa90913 addi s2,s2,2042 # 1000 + if(p == SBRK_ERROR) + 80e: 5afd li s5,-1 + 810: a081 j 850 + 812: f04a sd s2,32(sp) + 814: e852 sd s4,16(sp) + 816: e456 sd s5,8(sp) + 818: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 81a: 00000797 auipc a5,0x0 + 81e: 7f678793 addi a5,a5,2038 # 1010 + 822: 00000717 auipc a4,0x0 + 826: 7cf73f23 sd a5,2014(a4) # 1000 + 82a: e39c sd a5,0(a5) + base.s.size = 0; + 82c: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 830: b7c1 j 7f0 + prevp->s.ptr = p->s.ptr; + 832: 6398 ld a4,0(a5) + 834: e118 sd a4,0(a0) + 836: a8a9 j 890 + hp->s.size = nu; + 838: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 83c: 0541 addi a0,a0,16 + 83e: efbff0ef jal 738 + return freep; + 842: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 846: c12d beqz a0,8a8 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 848: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 84a: 4798 lw a4,8(a5) + 84c: 02977263 bgeu a4,s1,870 + if(p == freep) + 850: 00093703 ld a4,0(s2) + 854: 853e mv a0,a5 + 856: fef719e3 bne a4,a5,848 + p = sbrk(nu * sizeof(Header)); + 85a: 8552 mv a0,s4 + 85c: a37ff0ef jal 292 + if(p == SBRK_ERROR) + 860: fd551ce3 bne a0,s5,838 + return 0; + 864: 4501 li a0,0 + 866: 7902 ld s2,32(sp) + 868: 6a42 ld s4,16(sp) + 86a: 6aa2 ld s5,8(sp) + 86c: 6b02 ld s6,0(sp) + 86e: a03d j 89c + 870: 7902 ld s2,32(sp) + 872: 6a42 ld s4,16(sp) + 874: 6aa2 ld s5,8(sp) + 876: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 878: fae48de3 beq s1,a4,832 + p->s.size -= nunits; + 87c: 4137073b subw a4,a4,s3 + 880: c798 sw a4,8(a5) + p += p->s.size; + 882: 02071693 slli a3,a4,0x20 + 886: 01c6d713 srli a4,a3,0x1c + 88a: 97ba add a5,a5,a4 + p->s.size = nunits; + 88c: 0137a423 sw s3,8(a5) + freep = prevp; + 890: 00000717 auipc a4,0x0 + 894: 76a73823 sd a0,1904(a4) # 1000 + return (void*)(p + 1); + 898: 01078513 addi a0,a5,16 + } +} + 89c: 70e2 ld ra,56(sp) + 89e: 7442 ld s0,48(sp) + 8a0: 74a2 ld s1,40(sp) + 8a2: 69e2 ld s3,24(sp) + 8a4: 6121 addi sp,sp,64 + 8a6: 8082 ret + 8a8: 7902 ld s2,32(sp) + 8aa: 6a42 ld s4,16(sp) + 8ac: 6aa2 ld s5,8(sp) + 8ae: 6b02 ld s6,0(sp) + 8b0: b7f5 j 89c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.c b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.c new file mode 100644 index 0000000000..b96e229d08 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.c @@ -0,0 +1,8 @@ +#include "kernel/types.h" +#include "user/user.h" + +int main(){ + printf("My PID: %d\n", getpid()); + printf("Parent PID: %d\n", getppid()); + exit(0); +} diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.d b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.d new file mode 100644 index 0000000000..28375f457c --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.d @@ -0,0 +1 @@ +user/test_getppid.o: user/test_getppid.c kernel/types.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.o b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.o new file mode 100644 index 0000000000..827b32a5fb Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.sym b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.sym new file mode 100644 index 0000000000..b82590723a --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_getppid.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +00000000000008b8 .rodata +0000000000000900 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 test_getppid.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000037e putc +000000000000039c printint +00000000000008e8 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000042 strcpy +0000000000000356 pause +0000000000000706 printf +000000000000034e sys_sbrk +00000000000001ec memmove +000000000000030e mknod +00000000000000fa gets +0000000000000346 getpid +000000000000027e memcpy +00000000000007ba malloc +00000000000002a8 sbrklazy +00000000000002d6 pipe +00000000000002e6 write +000000000000031e fstat +00000000000006dc fprintf +00000000000002f6 kill +0000000000000438 vprintf +0000000000000336 chdir +00000000000002fe exec +00000000000002ce wait +0000000000000366 getprocsinfo +00000000000002de read +0000000000000316 unlink +0000000000000244 memcmp +00000000000002be fork +0000000000000292 sbrk +000000000000035e uptime +00000000000000b4 memset +0000000000000000 main +000000000000036e getppid +000000000000005e strcmp +000000000000033e dup +000000000000016a stat +0000000000000376 sleep2 +0000000000000326 link +00000000000002c6 exit +0000000000000032 start +00000000000001a4 atoi +000000000000008a strlen +0000000000000306 open +00000000000000d6 strchr +000000000000032e mkdir +00000000000002ee close +0000000000000738 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.asm b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.asm new file mode 100644 index 0000000000..3a7630ac26 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.asm @@ -0,0 +1,1493 @@ + +user/_test_procs: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/types.h" +#include "user/user.h" + +int main() { + 0: 1141 addi sp,sp,-16 + 2: e406 sd ra,8(sp) + 4: e022 sd s0,0(sp) + 6: 0800 addi s0,sp,16 + getprocsinfo(); + 8: 33e000ef jal 346 + exit(0); + c: 4501 li a0,0 + e: 298000ef jal 2a6 + +0000000000000012 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 12: 1141 addi sp,sp,-16 + 14: e406 sd ra,8(sp) + 16: e022 sd s0,0(sp) + 18: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 1a: fe7ff0ef jal 0
+ exit(r); + 1e: 288000ef jal 2a6 + +0000000000000022 : +} + +char* +strcpy(char *s, const char *t) +{ + 22: 1141 addi sp,sp,-16 + 24: e422 sd s0,8(sp) + 26: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 28: 87aa mv a5,a0 + 2a: 0585 addi a1,a1,1 + 2c: 0785 addi a5,a5,1 + 2e: fff5c703 lbu a4,-1(a1) + 32: fee78fa3 sb a4,-1(a5) + 36: fb75 bnez a4,2a + ; + return os; +} + 38: 6422 ld s0,8(sp) + 3a: 0141 addi sp,sp,16 + 3c: 8082 ret + +000000000000003e : + +int +strcmp(const char *p, const char *q) +{ + 3e: 1141 addi sp,sp,-16 + 40: e422 sd s0,8(sp) + 42: 0800 addi s0,sp,16 + while(*p && *p == *q) + 44: 00054783 lbu a5,0(a0) + 48: cb91 beqz a5,5c + 4a: 0005c703 lbu a4,0(a1) + 4e: 00f71763 bne a4,a5,5c + p++, q++; + 52: 0505 addi a0,a0,1 + 54: 0585 addi a1,a1,1 + while(*p && *p == *q) + 56: 00054783 lbu a5,0(a0) + 5a: fbe5 bnez a5,4a + return (uchar)*p - (uchar)*q; + 5c: 0005c503 lbu a0,0(a1) +} + 60: 40a7853b subw a0,a5,a0 + 64: 6422 ld s0,8(sp) + 66: 0141 addi sp,sp,16 + 68: 8082 ret + +000000000000006a : + +uint +strlen(const char *s) +{ + 6a: 1141 addi sp,sp,-16 + 6c: e422 sd s0,8(sp) + 6e: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 70: 00054783 lbu a5,0(a0) + 74: cf91 beqz a5,90 + 76: 0505 addi a0,a0,1 + 78: 87aa mv a5,a0 + 7a: 86be mv a3,a5 + 7c: 0785 addi a5,a5,1 + 7e: fff7c703 lbu a4,-1(a5) + 82: ff65 bnez a4,7a + 84: 40a6853b subw a0,a3,a0 + 88: 2505 addiw a0,a0,1 + ; + return n; +} + 8a: 6422 ld s0,8(sp) + 8c: 0141 addi sp,sp,16 + 8e: 8082 ret + for(n = 0; s[n]; n++) + 90: 4501 li a0,0 + 92: bfe5 j 8a + +0000000000000094 : + +void* +memset(void *dst, int c, uint n) +{ + 94: 1141 addi sp,sp,-16 + 96: e422 sd s0,8(sp) + 98: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 9a: ca19 beqz a2,b0 + 9c: 87aa mv a5,a0 + 9e: 1602 slli a2,a2,0x20 + a0: 9201 srli a2,a2,0x20 + a2: 00a60733 add a4,a2,a0 + cdst[i] = c; + a6: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + aa: 0785 addi a5,a5,1 + ac: fee79de3 bne a5,a4,a6 + } + return dst; +} + b0: 6422 ld s0,8(sp) + b2: 0141 addi sp,sp,16 + b4: 8082 ret + +00000000000000b6 : + +char* +strchr(const char *s, char c) +{ + b6: 1141 addi sp,sp,-16 + b8: e422 sd s0,8(sp) + ba: 0800 addi s0,sp,16 + for(; *s; s++) + bc: 00054783 lbu a5,0(a0) + c0: cb99 beqz a5,d6 + if(*s == c) + c2: 00f58763 beq a1,a5,d0 + for(; *s; s++) + c6: 0505 addi a0,a0,1 + c8: 00054783 lbu a5,0(a0) + cc: fbfd bnez a5,c2 + return (char*)s; + return 0; + ce: 4501 li a0,0 +} + d0: 6422 ld s0,8(sp) + d2: 0141 addi sp,sp,16 + d4: 8082 ret + return 0; + d6: 4501 li a0,0 + d8: bfe5 j d0 + +00000000000000da : + +char* +gets(char *buf, int max) +{ + da: 711d addi sp,sp,-96 + dc: ec86 sd ra,88(sp) + de: e8a2 sd s0,80(sp) + e0: e4a6 sd s1,72(sp) + e2: e0ca sd s2,64(sp) + e4: fc4e sd s3,56(sp) + e6: f852 sd s4,48(sp) + e8: f456 sd s5,40(sp) + ea: f05a sd s6,32(sp) + ec: ec5e sd s7,24(sp) + ee: 1080 addi s0,sp,96 + f0: 8baa mv s7,a0 + f2: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + f4: 892a mv s2,a0 + f6: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + f8: 4aa9 li s5,10 + fa: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + fc: 89a6 mv s3,s1 + fe: 2485 addiw s1,s1,1 + 100: 0344d663 bge s1,s4,12c + cc = read(0, &c, 1); + 104: 4605 li a2,1 + 106: faf40593 addi a1,s0,-81 + 10a: 4501 li a0,0 + 10c: 1b2000ef jal 2be + if(cc < 1) + 110: 00a05e63 blez a0,12c + buf[i++] = c; + 114: faf44783 lbu a5,-81(s0) + 118: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 11c: 01578763 beq a5,s5,12a + 120: 0905 addi s2,s2,1 + 122: fd679de3 bne a5,s6,fc + buf[i++] = c; + 126: 89a6 mv s3,s1 + 128: a011 j 12c + 12a: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 12c: 99de add s3,s3,s7 + 12e: 00098023 sb zero,0(s3) + return buf; +} + 132: 855e mv a0,s7 + 134: 60e6 ld ra,88(sp) + 136: 6446 ld s0,80(sp) + 138: 64a6 ld s1,72(sp) + 13a: 6906 ld s2,64(sp) + 13c: 79e2 ld s3,56(sp) + 13e: 7a42 ld s4,48(sp) + 140: 7aa2 ld s5,40(sp) + 142: 7b02 ld s6,32(sp) + 144: 6be2 ld s7,24(sp) + 146: 6125 addi sp,sp,96 + 148: 8082 ret + +000000000000014a : + +int +stat(const char *n, struct stat *st) +{ + 14a: 1101 addi sp,sp,-32 + 14c: ec06 sd ra,24(sp) + 14e: e822 sd s0,16(sp) + 150: e04a sd s2,0(sp) + 152: 1000 addi s0,sp,32 + 154: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 156: 4581 li a1,0 + 158: 18e000ef jal 2e6 + if(fd < 0) + 15c: 02054263 bltz a0,180 + 160: e426 sd s1,8(sp) + 162: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 164: 85ca mv a1,s2 + 166: 198000ef jal 2fe + 16a: 892a mv s2,a0 + close(fd); + 16c: 8526 mv a0,s1 + 16e: 160000ef jal 2ce + return r; + 172: 64a2 ld s1,8(sp) +} + 174: 854a mv a0,s2 + 176: 60e2 ld ra,24(sp) + 178: 6442 ld s0,16(sp) + 17a: 6902 ld s2,0(sp) + 17c: 6105 addi sp,sp,32 + 17e: 8082 ret + return -1; + 180: 597d li s2,-1 + 182: bfcd j 174 + +0000000000000184 : + +int +atoi(const char *s) +{ + 184: 1141 addi sp,sp,-16 + 186: e422 sd s0,8(sp) + 188: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 18a: 00054683 lbu a3,0(a0) + 18e: fd06879b addiw a5,a3,-48 + 192: 0ff7f793 zext.b a5,a5 + 196: 4625 li a2,9 + 198: 02f66863 bltu a2,a5,1c8 + 19c: 872a mv a4,a0 + n = 0; + 19e: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1a0: 0705 addi a4,a4,1 + 1a2: 0025179b slliw a5,a0,0x2 + 1a6: 9fa9 addw a5,a5,a0 + 1a8: 0017979b slliw a5,a5,0x1 + 1ac: 9fb5 addw a5,a5,a3 + 1ae: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1b2: 00074683 lbu a3,0(a4) + 1b6: fd06879b addiw a5,a3,-48 + 1ba: 0ff7f793 zext.b a5,a5 + 1be: fef671e3 bgeu a2,a5,1a0 + return n; +} + 1c2: 6422 ld s0,8(sp) + 1c4: 0141 addi sp,sp,16 + 1c6: 8082 ret + n = 0; + 1c8: 4501 li a0,0 + 1ca: bfe5 j 1c2 + +00000000000001cc : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 1cc: 1141 addi sp,sp,-16 + 1ce: e422 sd s0,8(sp) + 1d0: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 1d2: 02b57463 bgeu a0,a1,1fa + while(n-- > 0) + 1d6: 00c05f63 blez a2,1f4 + 1da: 1602 slli a2,a2,0x20 + 1dc: 9201 srli a2,a2,0x20 + 1de: 00c507b3 add a5,a0,a2 + dst = vdst; + 1e2: 872a mv a4,a0 + *dst++ = *src++; + 1e4: 0585 addi a1,a1,1 + 1e6: 0705 addi a4,a4,1 + 1e8: fff5c683 lbu a3,-1(a1) + 1ec: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 1f0: fef71ae3 bne a4,a5,1e4 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 1f4: 6422 ld s0,8(sp) + 1f6: 0141 addi sp,sp,16 + 1f8: 8082 ret + dst += n; + 1fa: 00c50733 add a4,a0,a2 + src += n; + 1fe: 95b2 add a1,a1,a2 + while(n-- > 0) + 200: fec05ae3 blez a2,1f4 + 204: fff6079b addiw a5,a2,-1 + 208: 1782 slli a5,a5,0x20 + 20a: 9381 srli a5,a5,0x20 + 20c: fff7c793 not a5,a5 + 210: 97ba add a5,a5,a4 + *--dst = *--src; + 212: 15fd addi a1,a1,-1 + 214: 177d addi a4,a4,-1 + 216: 0005c683 lbu a3,0(a1) + 21a: 00d70023 sb a3,0(a4) + while(n-- > 0) + 21e: fee79ae3 bne a5,a4,212 + 222: bfc9 j 1f4 + +0000000000000224 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 224: 1141 addi sp,sp,-16 + 226: e422 sd s0,8(sp) + 228: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 22a: ca05 beqz a2,25a + 22c: fff6069b addiw a3,a2,-1 + 230: 1682 slli a3,a3,0x20 + 232: 9281 srli a3,a3,0x20 + 234: 0685 addi a3,a3,1 + 236: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 238: 00054783 lbu a5,0(a0) + 23c: 0005c703 lbu a4,0(a1) + 240: 00e79863 bne a5,a4,250 + return *p1 - *p2; + } + p1++; + 244: 0505 addi a0,a0,1 + p2++; + 246: 0585 addi a1,a1,1 + while (n-- > 0) { + 248: fed518e3 bne a0,a3,238 + } + return 0; + 24c: 4501 li a0,0 + 24e: a019 j 254 + return *p1 - *p2; + 250: 40e7853b subw a0,a5,a4 +} + 254: 6422 ld s0,8(sp) + 256: 0141 addi sp,sp,16 + 258: 8082 ret + return 0; + 25a: 4501 li a0,0 + 25c: bfe5 j 254 + +000000000000025e : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 25e: 1141 addi sp,sp,-16 + 260: e406 sd ra,8(sp) + 262: e022 sd s0,0(sp) + 264: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 266: f67ff0ef jal 1cc +} + 26a: 60a2 ld ra,8(sp) + 26c: 6402 ld s0,0(sp) + 26e: 0141 addi sp,sp,16 + 270: 8082 ret + +0000000000000272 : + +char * +sbrk(int n) { + 272: 1141 addi sp,sp,-16 + 274: e406 sd ra,8(sp) + 276: e022 sd s0,0(sp) + 278: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 27a: 4585 li a1,1 + 27c: 0b2000ef jal 32e +} + 280: 60a2 ld ra,8(sp) + 282: 6402 ld s0,0(sp) + 284: 0141 addi sp,sp,16 + 286: 8082 ret + +0000000000000288 : + +char * +sbrklazy(int n) { + 288: 1141 addi sp,sp,-16 + 28a: e406 sd ra,8(sp) + 28c: e022 sd s0,0(sp) + 28e: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 290: 4589 li a1,2 + 292: 09c000ef jal 32e +} + 296: 60a2 ld ra,8(sp) + 298: 6402 ld s0,0(sp) + 29a: 0141 addi sp,sp,16 + 29c: 8082 ret + +000000000000029e : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 29e: 4885 li a7,1 + ecall + 2a0: 00000073 ecall + ret + 2a4: 8082 ret + +00000000000002a6 : +.global exit +exit: + li a7, SYS_exit + 2a6: 4889 li a7,2 + ecall + 2a8: 00000073 ecall + ret + 2ac: 8082 ret + +00000000000002ae : +.global wait +wait: + li a7, SYS_wait + 2ae: 488d li a7,3 + ecall + 2b0: 00000073 ecall + ret + 2b4: 8082 ret + +00000000000002b6 : +.global pipe +pipe: + li a7, SYS_pipe + 2b6: 4891 li a7,4 + ecall + 2b8: 00000073 ecall + ret + 2bc: 8082 ret + +00000000000002be : +.global read +read: + li a7, SYS_read + 2be: 4895 li a7,5 + ecall + 2c0: 00000073 ecall + ret + 2c4: 8082 ret + +00000000000002c6 : +.global write +write: + li a7, SYS_write + 2c6: 48c1 li a7,16 + ecall + 2c8: 00000073 ecall + ret + 2cc: 8082 ret + +00000000000002ce : +.global close +close: + li a7, SYS_close + 2ce: 48d5 li a7,21 + ecall + 2d0: 00000073 ecall + ret + 2d4: 8082 ret + +00000000000002d6 : +.global kill +kill: + li a7, SYS_kill + 2d6: 4899 li a7,6 + ecall + 2d8: 00000073 ecall + ret + 2dc: 8082 ret + +00000000000002de : +.global exec +exec: + li a7, SYS_exec + 2de: 489d li a7,7 + ecall + 2e0: 00000073 ecall + ret + 2e4: 8082 ret + +00000000000002e6 : +.global open +open: + li a7, SYS_open + 2e6: 48bd li a7,15 + ecall + 2e8: 00000073 ecall + ret + 2ec: 8082 ret + +00000000000002ee : +.global mknod +mknod: + li a7, SYS_mknod + 2ee: 48c5 li a7,17 + ecall + 2f0: 00000073 ecall + ret + 2f4: 8082 ret + +00000000000002f6 : +.global unlink +unlink: + li a7, SYS_unlink + 2f6: 48c9 li a7,18 + ecall + 2f8: 00000073 ecall + ret + 2fc: 8082 ret + +00000000000002fe : +.global fstat +fstat: + li a7, SYS_fstat + 2fe: 48a1 li a7,8 + ecall + 300: 00000073 ecall + ret + 304: 8082 ret + +0000000000000306 : +.global link +link: + li a7, SYS_link + 306: 48cd li a7,19 + ecall + 308: 00000073 ecall + ret + 30c: 8082 ret + +000000000000030e : +.global mkdir +mkdir: + li a7, SYS_mkdir + 30e: 48d1 li a7,20 + ecall + 310: 00000073 ecall + ret + 314: 8082 ret + +0000000000000316 : +.global chdir +chdir: + li a7, SYS_chdir + 316: 48a5 li a7,9 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e : +.global dup +dup: + li a7, SYS_dup + 31e: 48a9 li a7,10 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 : +.global getpid +getpid: + li a7, SYS_getpid + 326: 48ad li a7,11 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 32e: 48b1 li a7,12 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 : +.global pause +pause: + li a7, SYS_pause + 336: 48b5 li a7,13 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e : +.global uptime +uptime: + li a7, SYS_uptime + 33e: 48b9 li a7,14 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 346: 48d9 li a7,22 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e : +.global getppid +getppid: + li a7, SYS_getppid + 34e: 48dd li a7,23 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 356: 48e1 li a7,24 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 35e: 1101 addi sp,sp,-32 + 360: ec06 sd ra,24(sp) + 362: e822 sd s0,16(sp) + 364: 1000 addi s0,sp,32 + 366: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 36a: 4605 li a2,1 + 36c: fef40593 addi a1,s0,-17 + 370: f57ff0ef jal 2c6 +} + 374: 60e2 ld ra,24(sp) + 376: 6442 ld s0,16(sp) + 378: 6105 addi sp,sp,32 + 37a: 8082 ret + +000000000000037c : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 37c: 715d addi sp,sp,-80 + 37e: e486 sd ra,72(sp) + 380: e0a2 sd s0,64(sp) + 382: f84a sd s2,48(sp) + 384: 0880 addi s0,sp,80 + 386: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 388: c299 beqz a3,38e + 38a: 0805c363 bltz a1,410 + neg = 0; + 38e: 4881 li a7,0 + 390: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 394: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 396: 00000517 auipc a0,0x0 + 39a: 51250513 addi a0,a0,1298 # 8a8 + 39e: 883e mv a6,a5 + 3a0: 2785 addiw a5,a5,1 + 3a2: 02c5f733 remu a4,a1,a2 + 3a6: 972a add a4,a4,a0 + 3a8: 00074703 lbu a4,0(a4) + 3ac: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3b0: 872e mv a4,a1 + 3b2: 02c5d5b3 divu a1,a1,a2 + 3b6: 0685 addi a3,a3,1 + 3b8: fec773e3 bgeu a4,a2,39e + if(neg) + 3bc: 00088b63 beqz a7,3d2 + buf[i++] = '-'; + 3c0: fd078793 addi a5,a5,-48 + 3c4: 97a2 add a5,a5,s0 + 3c6: 02d00713 li a4,45 + 3ca: fee78423 sb a4,-24(a5) + 3ce: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 3d2: 02f05a63 blez a5,406 + 3d6: fc26 sd s1,56(sp) + 3d8: f44e sd s3,40(sp) + 3da: fb840713 addi a4,s0,-72 + 3de: 00f704b3 add s1,a4,a5 + 3e2: fff70993 addi s3,a4,-1 + 3e6: 99be add s3,s3,a5 + 3e8: 37fd addiw a5,a5,-1 + 3ea: 1782 slli a5,a5,0x20 + 3ec: 9381 srli a5,a5,0x20 + 3ee: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 3f2: fff4c583 lbu a1,-1(s1) + 3f6: 854a mv a0,s2 + 3f8: f67ff0ef jal 35e + while(--i >= 0) + 3fc: 14fd addi s1,s1,-1 + 3fe: ff349ae3 bne s1,s3,3f2 + 402: 74e2 ld s1,56(sp) + 404: 79a2 ld s3,40(sp) +} + 406: 60a6 ld ra,72(sp) + 408: 6406 ld s0,64(sp) + 40a: 7942 ld s2,48(sp) + 40c: 6161 addi sp,sp,80 + 40e: 8082 ret + x = -xx; + 410: 40b005b3 neg a1,a1 + neg = 1; + 414: 4885 li a7,1 + x = -xx; + 416: bfad j 390 + +0000000000000418 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 418: 711d addi sp,sp,-96 + 41a: ec86 sd ra,88(sp) + 41c: e8a2 sd s0,80(sp) + 41e: e0ca sd s2,64(sp) + 420: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 422: 0005c903 lbu s2,0(a1) + 426: 28090663 beqz s2,6b2 + 42a: e4a6 sd s1,72(sp) + 42c: fc4e sd s3,56(sp) + 42e: f852 sd s4,48(sp) + 430: f456 sd s5,40(sp) + 432: f05a sd s6,32(sp) + 434: ec5e sd s7,24(sp) + 436: e862 sd s8,16(sp) + 438: e466 sd s9,8(sp) + 43a: 8b2a mv s6,a0 + 43c: 8a2e mv s4,a1 + 43e: 8bb2 mv s7,a2 + state = 0; + 440: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 442: 4481 li s1,0 + 444: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 446: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 44a: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 44e: 06c00c93 li s9,108 + 452: a005 j 472 + putc(fd, c0); + 454: 85ca mv a1,s2 + 456: 855a mv a0,s6 + 458: f07ff0ef jal 35e + 45c: a019 j 462 + } else if(state == '%'){ + 45e: 03598263 beq s3,s5,482 + for(i = 0; fmt[i]; i++){ + 462: 2485 addiw s1,s1,1 + 464: 8726 mv a4,s1 + 466: 009a07b3 add a5,s4,s1 + 46a: 0007c903 lbu s2,0(a5) + 46e: 22090a63 beqz s2,6a2 + c0 = fmt[i] & 0xff; + 472: 0009079b sext.w a5,s2 + if(state == 0){ + 476: fe0994e3 bnez s3,45e + if(c0 == '%'){ + 47a: fd579de3 bne a5,s5,454 + state = '%'; + 47e: 89be mv s3,a5 + 480: b7cd j 462 + if(c0) c1 = fmt[i+1] & 0xff; + 482: 00ea06b3 add a3,s4,a4 + 486: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 48a: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 48c: c681 beqz a3,494 + 48e: 9752 add a4,a4,s4 + 490: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 494: 05878363 beq a5,s8,4da + } else if(c0 == 'l' && c1 == 'd'){ + 498: 05978d63 beq a5,s9,4f2 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 49c: 07500713 li a4,117 + 4a0: 0ee78763 beq a5,a4,58e + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4a4: 07800713 li a4,120 + 4a8: 12e78963 beq a5,a4,5da + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4ac: 07000713 li a4,112 + 4b0: 14e78e63 beq a5,a4,60c + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4b4: 06300713 li a4,99 + 4b8: 18e78e63 beq a5,a4,654 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4bc: 07300713 li a4,115 + 4c0: 1ae78463 beq a5,a4,668 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4c4: 02500713 li a4,37 + 4c8: 04e79563 bne a5,a4,512 + putc(fd, '%'); + 4cc: 02500593 li a1,37 + 4d0: 855a mv a0,s6 + 4d2: e8dff0ef jal 35e + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 4d6: 4981 li s3,0 + 4d8: b769 j 462 + printint(fd, va_arg(ap, int), 10, 1); + 4da: 008b8913 addi s2,s7,8 + 4de: 4685 li a3,1 + 4e0: 4629 li a2,10 + 4e2: 000ba583 lw a1,0(s7) + 4e6: 855a mv a0,s6 + 4e8: e95ff0ef jal 37c + 4ec: 8bca mv s7,s2 + state = 0; + 4ee: 4981 li s3,0 + 4f0: bf8d j 462 + } else if(c0 == 'l' && c1 == 'd'){ + 4f2: 06400793 li a5,100 + 4f6: 02f68963 beq a3,a5,528 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 4fa: 06c00793 li a5,108 + 4fe: 04f68263 beq a3,a5,542 + } else if(c0 == 'l' && c1 == 'u'){ + 502: 07500793 li a5,117 + 506: 0af68063 beq a3,a5,5a6 + } else if(c0 == 'l' && c1 == 'x'){ + 50a: 07800793 li a5,120 + 50e: 0ef68263 beq a3,a5,5f2 + putc(fd, '%'); + 512: 02500593 li a1,37 + 516: 855a mv a0,s6 + 518: e47ff0ef jal 35e + putc(fd, c0); + 51c: 85ca mv a1,s2 + 51e: 855a mv a0,s6 + 520: e3fff0ef jal 35e + state = 0; + 524: 4981 li s3,0 + 526: bf35 j 462 + printint(fd, va_arg(ap, uint64), 10, 1); + 528: 008b8913 addi s2,s7,8 + 52c: 4685 li a3,1 + 52e: 4629 li a2,10 + 530: 000bb583 ld a1,0(s7) + 534: 855a mv a0,s6 + 536: e47ff0ef jal 37c + i += 1; + 53a: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 53c: 8bca mv s7,s2 + state = 0; + 53e: 4981 li s3,0 + i += 1; + 540: b70d j 462 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 542: 06400793 li a5,100 + 546: 02f60763 beq a2,a5,574 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 54a: 07500793 li a5,117 + 54e: 06f60963 beq a2,a5,5c0 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 552: 07800793 li a5,120 + 556: faf61ee3 bne a2,a5,512 + printint(fd, va_arg(ap, uint64), 16, 0); + 55a: 008b8913 addi s2,s7,8 + 55e: 4681 li a3,0 + 560: 4641 li a2,16 + 562: 000bb583 ld a1,0(s7) + 566: 855a mv a0,s6 + 568: e15ff0ef jal 37c + i += 2; + 56c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 56e: 8bca mv s7,s2 + state = 0; + 570: 4981 li s3,0 + i += 2; + 572: bdc5 j 462 + printint(fd, va_arg(ap, uint64), 10, 1); + 574: 008b8913 addi s2,s7,8 + 578: 4685 li a3,1 + 57a: 4629 li a2,10 + 57c: 000bb583 ld a1,0(s7) + 580: 855a mv a0,s6 + 582: dfbff0ef jal 37c + i += 2; + 586: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 588: 8bca mv s7,s2 + state = 0; + 58a: 4981 li s3,0 + i += 2; + 58c: bdd9 j 462 + printint(fd, va_arg(ap, uint32), 10, 0); + 58e: 008b8913 addi s2,s7,8 + 592: 4681 li a3,0 + 594: 4629 li a2,10 + 596: 000be583 lwu a1,0(s7) + 59a: 855a mv a0,s6 + 59c: de1ff0ef jal 37c + 5a0: 8bca mv s7,s2 + state = 0; + 5a2: 4981 li s3,0 + 5a4: bd7d j 462 + printint(fd, va_arg(ap, uint64), 10, 0); + 5a6: 008b8913 addi s2,s7,8 + 5aa: 4681 li a3,0 + 5ac: 4629 li a2,10 + 5ae: 000bb583 ld a1,0(s7) + 5b2: 855a mv a0,s6 + 5b4: dc9ff0ef jal 37c + i += 1; + 5b8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5ba: 8bca mv s7,s2 + state = 0; + 5bc: 4981 li s3,0 + i += 1; + 5be: b555 j 462 + printint(fd, va_arg(ap, uint64), 10, 0); + 5c0: 008b8913 addi s2,s7,8 + 5c4: 4681 li a3,0 + 5c6: 4629 li a2,10 + 5c8: 000bb583 ld a1,0(s7) + 5cc: 855a mv a0,s6 + 5ce: dafff0ef jal 37c + i += 2; + 5d2: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5d4: 8bca mv s7,s2 + state = 0; + 5d6: 4981 li s3,0 + i += 2; + 5d8: b569 j 462 + printint(fd, va_arg(ap, uint32), 16, 0); + 5da: 008b8913 addi s2,s7,8 + 5de: 4681 li a3,0 + 5e0: 4641 li a2,16 + 5e2: 000be583 lwu a1,0(s7) + 5e6: 855a mv a0,s6 + 5e8: d95ff0ef jal 37c + 5ec: 8bca mv s7,s2 + state = 0; + 5ee: 4981 li s3,0 + 5f0: bd8d j 462 + printint(fd, va_arg(ap, uint64), 16, 0); + 5f2: 008b8913 addi s2,s7,8 + 5f6: 4681 li a3,0 + 5f8: 4641 li a2,16 + 5fa: 000bb583 ld a1,0(s7) + 5fe: 855a mv a0,s6 + 600: d7dff0ef jal 37c + i += 1; + 604: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 606: 8bca mv s7,s2 + state = 0; + 608: 4981 li s3,0 + i += 1; + 60a: bda1 j 462 + 60c: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 60e: 008b8d13 addi s10,s7,8 + 612: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 616: 03000593 li a1,48 + 61a: 855a mv a0,s6 + 61c: d43ff0ef jal 35e + putc(fd, 'x'); + 620: 07800593 li a1,120 + 624: 855a mv a0,s6 + 626: d39ff0ef jal 35e + 62a: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 62c: 00000b97 auipc s7,0x0 + 630: 27cb8b93 addi s7,s7,636 # 8a8 + 634: 03c9d793 srli a5,s3,0x3c + 638: 97de add a5,a5,s7 + 63a: 0007c583 lbu a1,0(a5) + 63e: 855a mv a0,s6 + 640: d1fff0ef jal 35e + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 644: 0992 slli s3,s3,0x4 + 646: 397d addiw s2,s2,-1 + 648: fe0916e3 bnez s2,634 + printptr(fd, va_arg(ap, uint64)); + 64c: 8bea mv s7,s10 + state = 0; + 64e: 4981 li s3,0 + 650: 6d02 ld s10,0(sp) + 652: bd01 j 462 + putc(fd, va_arg(ap, uint32)); + 654: 008b8913 addi s2,s7,8 + 658: 000bc583 lbu a1,0(s7) + 65c: 855a mv a0,s6 + 65e: d01ff0ef jal 35e + 662: 8bca mv s7,s2 + state = 0; + 664: 4981 li s3,0 + 666: bbf5 j 462 + if((s = va_arg(ap, char*)) == 0) + 668: 008b8993 addi s3,s7,8 + 66c: 000bb903 ld s2,0(s7) + 670: 00090f63 beqz s2,68e + for(; *s; s++) + 674: 00094583 lbu a1,0(s2) + 678: c195 beqz a1,69c + putc(fd, *s); + 67a: 855a mv a0,s6 + 67c: ce3ff0ef jal 35e + for(; *s; s++) + 680: 0905 addi s2,s2,1 + 682: 00094583 lbu a1,0(s2) + 686: f9f5 bnez a1,67a + if((s = va_arg(ap, char*)) == 0) + 688: 8bce mv s7,s3 + state = 0; + 68a: 4981 li s3,0 + 68c: bbd9 j 462 + s = "(null)"; + 68e: 00000917 auipc s2,0x0 + 692: 21290913 addi s2,s2,530 # 8a0 + for(; *s; s++) + 696: 02800593 li a1,40 + 69a: b7c5 j 67a + if((s = va_arg(ap, char*)) == 0) + 69c: 8bce mv s7,s3 + state = 0; + 69e: 4981 li s3,0 + 6a0: b3c9 j 462 + 6a2: 64a6 ld s1,72(sp) + 6a4: 79e2 ld s3,56(sp) + 6a6: 7a42 ld s4,48(sp) + 6a8: 7aa2 ld s5,40(sp) + 6aa: 7b02 ld s6,32(sp) + 6ac: 6be2 ld s7,24(sp) + 6ae: 6c42 ld s8,16(sp) + 6b0: 6ca2 ld s9,8(sp) + } + } +} + 6b2: 60e6 ld ra,88(sp) + 6b4: 6446 ld s0,80(sp) + 6b6: 6906 ld s2,64(sp) + 6b8: 6125 addi sp,sp,96 + 6ba: 8082 ret + +00000000000006bc : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6bc: 715d addi sp,sp,-80 + 6be: ec06 sd ra,24(sp) + 6c0: e822 sd s0,16(sp) + 6c2: 1000 addi s0,sp,32 + 6c4: e010 sd a2,0(s0) + 6c6: e414 sd a3,8(s0) + 6c8: e818 sd a4,16(s0) + 6ca: ec1c sd a5,24(s0) + 6cc: 03043023 sd a6,32(s0) + 6d0: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6d4: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6d8: 8622 mv a2,s0 + 6da: d3fff0ef jal 418 +} + 6de: 60e2 ld ra,24(sp) + 6e0: 6442 ld s0,16(sp) + 6e2: 6161 addi sp,sp,80 + 6e4: 8082 ret + +00000000000006e6 : + +void +printf(const char *fmt, ...) +{ + 6e6: 711d addi sp,sp,-96 + 6e8: ec06 sd ra,24(sp) + 6ea: e822 sd s0,16(sp) + 6ec: 1000 addi s0,sp,32 + 6ee: e40c sd a1,8(s0) + 6f0: e810 sd a2,16(s0) + 6f2: ec14 sd a3,24(s0) + 6f4: f018 sd a4,32(s0) + 6f6: f41c sd a5,40(s0) + 6f8: 03043823 sd a6,48(s0) + 6fc: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 700: 00840613 addi a2,s0,8 + 704: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 708: 85aa mv a1,a0 + 70a: 4505 li a0,1 + 70c: d0dff0ef jal 418 +} + 710: 60e2 ld ra,24(sp) + 712: 6442 ld s0,16(sp) + 714: 6125 addi sp,sp,96 + 716: 8082 ret + +0000000000000718 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 718: 1141 addi sp,sp,-16 + 71a: e422 sd s0,8(sp) + 71c: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 71e: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 722: 00001797 auipc a5,0x1 + 726: 8de7b783 ld a5,-1826(a5) # 1000 + 72a: a02d j 754 + 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; + 72c: 4618 lw a4,8(a2) + 72e: 9f2d addw a4,a4,a1 + 730: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 734: 6398 ld a4,0(a5) + 736: 6310 ld a2,0(a4) + 738: a83d j 776 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 73a: ff852703 lw a4,-8(a0) + 73e: 9f31 addw a4,a4,a2 + 740: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 742: ff053683 ld a3,-16(a0) + 746: a091 j 78a + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 748: 6398 ld a4,0(a5) + 74a: 00e7e463 bltu a5,a4,752 + 74e: 00e6ea63 bltu a3,a4,762 +{ + 752: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 754: fed7fae3 bgeu a5,a3,748 + 758: 6398 ld a4,0(a5) + 75a: 00e6e463 bltu a3,a4,762 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 75e: fee7eae3 bltu a5,a4,752 + if(bp + bp->s.size == p->s.ptr){ + 762: ff852583 lw a1,-8(a0) + 766: 6390 ld a2,0(a5) + 768: 02059813 slli a6,a1,0x20 + 76c: 01c85713 srli a4,a6,0x1c + 770: 9736 add a4,a4,a3 + 772: fae60de3 beq a2,a4,72c + bp->s.ptr = p->s.ptr->s.ptr; + 776: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 77a: 4790 lw a2,8(a5) + 77c: 02061593 slli a1,a2,0x20 + 780: 01c5d713 srli a4,a1,0x1c + 784: 973e add a4,a4,a5 + 786: fae68ae3 beq a3,a4,73a + p->s.ptr = bp->s.ptr; + 78a: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 78c: 00001717 auipc a4,0x1 + 790: 86f73a23 sd a5,-1932(a4) # 1000 +} + 794: 6422 ld s0,8(sp) + 796: 0141 addi sp,sp,16 + 798: 8082 ret + +000000000000079a : + return freep; +} + +void* +malloc(uint nbytes) +{ + 79a: 7139 addi sp,sp,-64 + 79c: fc06 sd ra,56(sp) + 79e: f822 sd s0,48(sp) + 7a0: f426 sd s1,40(sp) + 7a2: ec4e sd s3,24(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: 0014899b addiw s3,s1,1 + 7b4: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7b6: 00001517 auipc a0,0x1 + 7ba: 84a53503 ld a0,-1974(a0) # 1000 + 7be: c915 beqz a0,7f2 + 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: 08977a63 bgeu a4,s1,858 + 7c8: f04a sd s2,32(sp) + 7ca: e852 sd s4,16(sp) + 7cc: e456 sd s5,8(sp) + 7ce: e05a sd s6,0(sp) + if(nu < 4096) + 7d0: 8a4e mv s4,s3 + 7d2: 0009871b sext.w a4,s3 + 7d6: 6685 lui a3,0x1 + 7d8: 00d77363 bgeu a4,a3,7de + 7dc: 6a05 lui s4,0x1 + 7de: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7e2: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7e6: 00001917 auipc s2,0x1 + 7ea: 81a90913 addi s2,s2,-2022 # 1000 + if(p == SBRK_ERROR) + 7ee: 5afd li s5,-1 + 7f0: a081 j 830 + 7f2: f04a sd s2,32(sp) + 7f4: e852 sd s4,16(sp) + 7f6: e456 sd s5,8(sp) + 7f8: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 7fa: 00001797 auipc a5,0x1 + 7fe: 81678793 addi a5,a5,-2026 # 1010 + 802: 00000717 auipc a4,0x0 + 806: 7ef73f23 sd a5,2046(a4) # 1000 + 80a: e39c sd a5,0(a5) + base.s.size = 0; + 80c: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 810: b7c1 j 7d0 + prevp->s.ptr = p->s.ptr; + 812: 6398 ld a4,0(a5) + 814: e118 sd a4,0(a0) + 816: a8a9 j 870 + hp->s.size = nu; + 818: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 81c: 0541 addi a0,a0,16 + 81e: efbff0ef jal 718 + return freep; + 822: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 826: c12d beqz a0,888 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 828: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 82a: 4798 lw a4,8(a5) + 82c: 02977263 bgeu a4,s1,850 + if(p == freep) + 830: 00093703 ld a4,0(s2) + 834: 853e mv a0,a5 + 836: fef719e3 bne a4,a5,828 + p = sbrk(nu * sizeof(Header)); + 83a: 8552 mv a0,s4 + 83c: a37ff0ef jal 272 + if(p == SBRK_ERROR) + 840: fd551ce3 bne a0,s5,818 + return 0; + 844: 4501 li a0,0 + 846: 7902 ld s2,32(sp) + 848: 6a42 ld s4,16(sp) + 84a: 6aa2 ld s5,8(sp) + 84c: 6b02 ld s6,0(sp) + 84e: a03d j 87c + 850: 7902 ld s2,32(sp) + 852: 6a42 ld s4,16(sp) + 854: 6aa2 ld s5,8(sp) + 856: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 858: fae48de3 beq s1,a4,812 + p->s.size -= nunits; + 85c: 4137073b subw a4,a4,s3 + 860: c798 sw a4,8(a5) + p += p->s.size; + 862: 02071693 slli a3,a4,0x20 + 866: 01c6d713 srli a4,a3,0x1c + 86a: 97ba add a5,a5,a4 + p->s.size = nunits; + 86c: 0137a423 sw s3,8(a5) + freep = prevp; + 870: 00000717 auipc a4,0x0 + 874: 78a73823 sd a0,1936(a4) # 1000 + return (void*)(p + 1); + 878: 01078513 addi a0,a5,16 + } +} + 87c: 70e2 ld ra,56(sp) + 87e: 7442 ld s0,48(sp) + 880: 74a2 ld s1,40(sp) + 882: 69e2 ld s3,24(sp) + 884: 6121 addi sp,sp,64 + 886: 8082 ret + 888: 7902 ld s2,32(sp) + 88a: 6a42 ld s4,16(sp) + 88c: 6aa2 ld s5,8(sp) + 88e: 6b02 ld s6,0(sp) + 890: b7f5 j 87c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.c b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.c new file mode 100644 index 0000000000..a29cb274a7 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.c @@ -0,0 +1,7 @@ +#include "kernel/types.h" +#include "user/user.h" + +int main() { + getprocsinfo(); + exit(0); +} diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.d b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.d new file mode 100644 index 0000000000..2334647596 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.d @@ -0,0 +1 @@ +user/test_procs.o: user/test_procs.c kernel/types.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.o b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.o new file mode 100644 index 0000000000..eefddca545 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.sym b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.sym new file mode 100644 index 0000000000..754b001ce5 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_procs.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +0000000000000898 .rodata +00000000000008c0 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 test_procs.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000035e putc +000000000000037c printint +00000000000008a8 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000022 strcpy +0000000000000336 pause +00000000000006e6 printf +000000000000032e sys_sbrk +00000000000001cc memmove +00000000000002ee mknod +00000000000000da gets +0000000000000326 getpid +000000000000025e memcpy +000000000000079a malloc +0000000000000288 sbrklazy +00000000000002b6 pipe +00000000000002c6 write +00000000000002fe fstat +00000000000006bc fprintf +00000000000002d6 kill +0000000000000418 vprintf +0000000000000316 chdir +00000000000002de exec +00000000000002ae wait +0000000000000346 getprocsinfo +00000000000002be read +00000000000002f6 unlink +0000000000000224 memcmp +000000000000029e fork +0000000000000272 sbrk +000000000000033e uptime +0000000000000094 memset +0000000000000000 main +000000000000034e getppid +000000000000003e strcmp +000000000000031e dup +000000000000014a stat +0000000000000356 sleep2 +0000000000000306 link +00000000000002a6 exit +0000000000000012 start +0000000000000184 atoi +000000000000006a strlen +00000000000002e6 open +00000000000000b6 strchr +000000000000030e mkdir +00000000000002ce close +0000000000000718 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.asm b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.asm new file mode 100644 index 0000000000..b8023395d4 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.asm @@ -0,0 +1,1502 @@ + +user/_test_sleep2: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/types.h" +#include "user/user.h" + +int main(){ + 0: 1141 addi sp,sp,-16 + 2: e406 sd ra,8(sp) + 4: e022 sd s0,0(sp) + 6: 0800 addi s0,sp,16 + printf("Start\n"); + 8: 00001517 auipc a0,0x1 + c: 8a850513 addi a0,a0,-1880 # 8b0 + 10: 6f2000ef jal 702 + sleep2(50); + 14: 03200513 li a0,50 + 18: 35a000ef jal 372 + printf("End\n"); + 1c: 00001517 auipc a0,0x1 + 20: 89c50513 addi a0,a0,-1892 # 8b8 + 24: 6de000ef jal 702 + exit(0); + 28: 4501 li a0,0 + 2a: 298000ef jal 2c2 + +000000000000002e : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 2e: 1141 addi sp,sp,-16 + 30: e406 sd ra,8(sp) + 32: e022 sd s0,0(sp) + 34: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 36: fcbff0ef jal 0
+ exit(r); + 3a: 288000ef jal 2c2 + +000000000000003e : +} + +char* +strcpy(char *s, const char *t) +{ + 3e: 1141 addi sp,sp,-16 + 40: e422 sd s0,8(sp) + 42: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 44: 87aa mv a5,a0 + 46: 0585 addi a1,a1,1 + 48: 0785 addi a5,a5,1 + 4a: fff5c703 lbu a4,-1(a1) + 4e: fee78fa3 sb a4,-1(a5) + 52: fb75 bnez a4,46 + ; + return os; +} + 54: 6422 ld s0,8(sp) + 56: 0141 addi sp,sp,16 + 58: 8082 ret + +000000000000005a : + +int +strcmp(const char *p, const char *q) +{ + 5a: 1141 addi sp,sp,-16 + 5c: e422 sd s0,8(sp) + 5e: 0800 addi s0,sp,16 + while(*p && *p == *q) + 60: 00054783 lbu a5,0(a0) + 64: cb91 beqz a5,78 + 66: 0005c703 lbu a4,0(a1) + 6a: 00f71763 bne a4,a5,78 + p++, q++; + 6e: 0505 addi a0,a0,1 + 70: 0585 addi a1,a1,1 + while(*p && *p == *q) + 72: 00054783 lbu a5,0(a0) + 76: fbe5 bnez a5,66 + return (uchar)*p - (uchar)*q; + 78: 0005c503 lbu a0,0(a1) +} + 7c: 40a7853b subw a0,a5,a0 + 80: 6422 ld s0,8(sp) + 82: 0141 addi sp,sp,16 + 84: 8082 ret + +0000000000000086 : + +uint +strlen(const char *s) +{ + 86: 1141 addi sp,sp,-16 + 88: e422 sd s0,8(sp) + 8a: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 8c: 00054783 lbu a5,0(a0) + 90: cf91 beqz a5,ac + 92: 0505 addi a0,a0,1 + 94: 87aa mv a5,a0 + 96: 86be mv a3,a5 + 98: 0785 addi a5,a5,1 + 9a: fff7c703 lbu a4,-1(a5) + 9e: ff65 bnez a4,96 + a0: 40a6853b subw a0,a3,a0 + a4: 2505 addiw a0,a0,1 + ; + return n; +} + a6: 6422 ld s0,8(sp) + a8: 0141 addi sp,sp,16 + aa: 8082 ret + for(n = 0; s[n]; n++) + ac: 4501 li a0,0 + ae: bfe5 j a6 + +00000000000000b0 : + +void* +memset(void *dst, int c, uint n) +{ + b0: 1141 addi sp,sp,-16 + b2: e422 sd s0,8(sp) + b4: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + b6: ca19 beqz a2,cc + b8: 87aa mv a5,a0 + ba: 1602 slli a2,a2,0x20 + bc: 9201 srli a2,a2,0x20 + be: 00a60733 add a4,a2,a0 + cdst[i] = c; + c2: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + c6: 0785 addi a5,a5,1 + c8: fee79de3 bne a5,a4,c2 + } + return dst; +} + cc: 6422 ld s0,8(sp) + ce: 0141 addi sp,sp,16 + d0: 8082 ret + +00000000000000d2 : + +char* +strchr(const char *s, char c) +{ + d2: 1141 addi sp,sp,-16 + d4: e422 sd s0,8(sp) + d6: 0800 addi s0,sp,16 + for(; *s; s++) + d8: 00054783 lbu a5,0(a0) + dc: cb99 beqz a5,f2 + if(*s == c) + de: 00f58763 beq a1,a5,ec + for(; *s; s++) + e2: 0505 addi a0,a0,1 + e4: 00054783 lbu a5,0(a0) + e8: fbfd bnez a5,de + return (char*)s; + return 0; + ea: 4501 li a0,0 +} + ec: 6422 ld s0,8(sp) + ee: 0141 addi sp,sp,16 + f0: 8082 ret + return 0; + f2: 4501 li a0,0 + f4: bfe5 j ec + +00000000000000f6 : + +char* +gets(char *buf, int max) +{ + f6: 711d addi sp,sp,-96 + f8: ec86 sd ra,88(sp) + fa: e8a2 sd s0,80(sp) + fc: e4a6 sd s1,72(sp) + fe: e0ca sd s2,64(sp) + 100: fc4e sd s3,56(sp) + 102: f852 sd s4,48(sp) + 104: f456 sd s5,40(sp) + 106: f05a sd s6,32(sp) + 108: ec5e sd s7,24(sp) + 10a: 1080 addi s0,sp,96 + 10c: 8baa mv s7,a0 + 10e: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 110: 892a mv s2,a0 + 112: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 114: 4aa9 li s5,10 + 116: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 118: 89a6 mv s3,s1 + 11a: 2485 addiw s1,s1,1 + 11c: 0344d663 bge s1,s4,148 + cc = read(0, &c, 1); + 120: 4605 li a2,1 + 122: faf40593 addi a1,s0,-81 + 126: 4501 li a0,0 + 128: 1b2000ef jal 2da + if(cc < 1) + 12c: 00a05e63 blez a0,148 + buf[i++] = c; + 130: faf44783 lbu a5,-81(s0) + 134: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 138: 01578763 beq a5,s5,146 + 13c: 0905 addi s2,s2,1 + 13e: fd679de3 bne a5,s6,118 + buf[i++] = c; + 142: 89a6 mv s3,s1 + 144: a011 j 148 + 146: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 148: 99de add s3,s3,s7 + 14a: 00098023 sb zero,0(s3) + return buf; +} + 14e: 855e mv a0,s7 + 150: 60e6 ld ra,88(sp) + 152: 6446 ld s0,80(sp) + 154: 64a6 ld s1,72(sp) + 156: 6906 ld s2,64(sp) + 158: 79e2 ld s3,56(sp) + 15a: 7a42 ld s4,48(sp) + 15c: 7aa2 ld s5,40(sp) + 15e: 7b02 ld s6,32(sp) + 160: 6be2 ld s7,24(sp) + 162: 6125 addi sp,sp,96 + 164: 8082 ret + +0000000000000166 : + +int +stat(const char *n, struct stat *st) +{ + 166: 1101 addi sp,sp,-32 + 168: ec06 sd ra,24(sp) + 16a: e822 sd s0,16(sp) + 16c: e04a sd s2,0(sp) + 16e: 1000 addi s0,sp,32 + 170: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 172: 4581 li a1,0 + 174: 18e000ef jal 302 + if(fd < 0) + 178: 02054263 bltz a0,19c + 17c: e426 sd s1,8(sp) + 17e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 180: 85ca mv a1,s2 + 182: 198000ef jal 31a + 186: 892a mv s2,a0 + close(fd); + 188: 8526 mv a0,s1 + 18a: 160000ef jal 2ea + return r; + 18e: 64a2 ld s1,8(sp) +} + 190: 854a mv a0,s2 + 192: 60e2 ld ra,24(sp) + 194: 6442 ld s0,16(sp) + 196: 6902 ld s2,0(sp) + 198: 6105 addi sp,sp,32 + 19a: 8082 ret + return -1; + 19c: 597d li s2,-1 + 19e: bfcd j 190 + +00000000000001a0 : + +int +atoi(const char *s) +{ + 1a0: 1141 addi sp,sp,-16 + 1a2: e422 sd s0,8(sp) + 1a4: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1a6: 00054683 lbu a3,0(a0) + 1aa: fd06879b addiw a5,a3,-48 + 1ae: 0ff7f793 zext.b a5,a5 + 1b2: 4625 li a2,9 + 1b4: 02f66863 bltu a2,a5,1e4 + 1b8: 872a mv a4,a0 + n = 0; + 1ba: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1bc: 0705 addi a4,a4,1 + 1be: 0025179b slliw a5,a0,0x2 + 1c2: 9fa9 addw a5,a5,a0 + 1c4: 0017979b slliw a5,a5,0x1 + 1c8: 9fb5 addw a5,a5,a3 + 1ca: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1ce: 00074683 lbu a3,0(a4) + 1d2: fd06879b addiw a5,a3,-48 + 1d6: 0ff7f793 zext.b a5,a5 + 1da: fef671e3 bgeu a2,a5,1bc + return n; +} + 1de: 6422 ld s0,8(sp) + 1e0: 0141 addi sp,sp,16 + 1e2: 8082 ret + n = 0; + 1e4: 4501 li a0,0 + 1e6: bfe5 j 1de + +00000000000001e8 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 1e8: 1141 addi sp,sp,-16 + 1ea: e422 sd s0,8(sp) + 1ec: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 1ee: 02b57463 bgeu a0,a1,216 + while(n-- > 0) + 1f2: 00c05f63 blez a2,210 + 1f6: 1602 slli a2,a2,0x20 + 1f8: 9201 srli a2,a2,0x20 + 1fa: 00c507b3 add a5,a0,a2 + dst = vdst; + 1fe: 872a mv a4,a0 + *dst++ = *src++; + 200: 0585 addi a1,a1,1 + 202: 0705 addi a4,a4,1 + 204: fff5c683 lbu a3,-1(a1) + 208: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 20c: fef71ae3 bne a4,a5,200 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 210: 6422 ld s0,8(sp) + 212: 0141 addi sp,sp,16 + 214: 8082 ret + dst += n; + 216: 00c50733 add a4,a0,a2 + src += n; + 21a: 95b2 add a1,a1,a2 + while(n-- > 0) + 21c: fec05ae3 blez a2,210 + 220: fff6079b addiw a5,a2,-1 + 224: 1782 slli a5,a5,0x20 + 226: 9381 srli a5,a5,0x20 + 228: fff7c793 not a5,a5 + 22c: 97ba add a5,a5,a4 + *--dst = *--src; + 22e: 15fd addi a1,a1,-1 + 230: 177d addi a4,a4,-1 + 232: 0005c683 lbu a3,0(a1) + 236: 00d70023 sb a3,0(a4) + while(n-- > 0) + 23a: fee79ae3 bne a5,a4,22e + 23e: bfc9 j 210 + +0000000000000240 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 240: 1141 addi sp,sp,-16 + 242: e422 sd s0,8(sp) + 244: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 246: ca05 beqz a2,276 + 248: fff6069b addiw a3,a2,-1 + 24c: 1682 slli a3,a3,0x20 + 24e: 9281 srli a3,a3,0x20 + 250: 0685 addi a3,a3,1 + 252: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 254: 00054783 lbu a5,0(a0) + 258: 0005c703 lbu a4,0(a1) + 25c: 00e79863 bne a5,a4,26c + return *p1 - *p2; + } + p1++; + 260: 0505 addi a0,a0,1 + p2++; + 262: 0585 addi a1,a1,1 + while (n-- > 0) { + 264: fed518e3 bne a0,a3,254 + } + return 0; + 268: 4501 li a0,0 + 26a: a019 j 270 + return *p1 - *p2; + 26c: 40e7853b subw a0,a5,a4 +} + 270: 6422 ld s0,8(sp) + 272: 0141 addi sp,sp,16 + 274: 8082 ret + return 0; + 276: 4501 li a0,0 + 278: bfe5 j 270 + +000000000000027a : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 27a: 1141 addi sp,sp,-16 + 27c: e406 sd ra,8(sp) + 27e: e022 sd s0,0(sp) + 280: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 282: f67ff0ef jal 1e8 +} + 286: 60a2 ld ra,8(sp) + 288: 6402 ld s0,0(sp) + 28a: 0141 addi sp,sp,16 + 28c: 8082 ret + +000000000000028e : + +char * +sbrk(int n) { + 28e: 1141 addi sp,sp,-16 + 290: e406 sd ra,8(sp) + 292: e022 sd s0,0(sp) + 294: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 296: 4585 li a1,1 + 298: 0b2000ef jal 34a +} + 29c: 60a2 ld ra,8(sp) + 29e: 6402 ld s0,0(sp) + 2a0: 0141 addi sp,sp,16 + 2a2: 8082 ret + +00000000000002a4 : + +char * +sbrklazy(int n) { + 2a4: 1141 addi sp,sp,-16 + 2a6: e406 sd ra,8(sp) + 2a8: e022 sd s0,0(sp) + 2aa: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2ac: 4589 li a1,2 + 2ae: 09c000ef jal 34a +} + 2b2: 60a2 ld ra,8(sp) + 2b4: 6402 ld s0,0(sp) + 2b6: 0141 addi sp,sp,16 + 2b8: 8082 ret + +00000000000002ba : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2ba: 4885 li a7,1 + ecall + 2bc: 00000073 ecall + ret + 2c0: 8082 ret + +00000000000002c2 : +.global exit +exit: + li a7, SYS_exit + 2c2: 4889 li a7,2 + ecall + 2c4: 00000073 ecall + ret + 2c8: 8082 ret + +00000000000002ca : +.global wait +wait: + li a7, SYS_wait + 2ca: 488d li a7,3 + ecall + 2cc: 00000073 ecall + ret + 2d0: 8082 ret + +00000000000002d2 : +.global pipe +pipe: + li a7, SYS_pipe + 2d2: 4891 li a7,4 + ecall + 2d4: 00000073 ecall + ret + 2d8: 8082 ret + +00000000000002da : +.global read +read: + li a7, SYS_read + 2da: 4895 li a7,5 + ecall + 2dc: 00000073 ecall + ret + 2e0: 8082 ret + +00000000000002e2 : +.global write +write: + li a7, SYS_write + 2e2: 48c1 li a7,16 + ecall + 2e4: 00000073 ecall + ret + 2e8: 8082 ret + +00000000000002ea : +.global close +close: + li a7, SYS_close + 2ea: 48d5 li a7,21 + ecall + 2ec: 00000073 ecall + ret + 2f0: 8082 ret + +00000000000002f2 : +.global kill +kill: + li a7, SYS_kill + 2f2: 4899 li a7,6 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa : +.global exec +exec: + li a7, SYS_exec + 2fa: 489d li a7,7 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 : +.global open +open: + li a7, SYS_open + 302: 48bd li a7,15 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a : +.global mknod +mknod: + li a7, SYS_mknod + 30a: 48c5 li a7,17 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 : +.global unlink +unlink: + li a7, SYS_unlink + 312: 48c9 li a7,18 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a : +.global fstat +fstat: + li a7, SYS_fstat + 31a: 48a1 li a7,8 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 : +.global link +link: + li a7, SYS_link + 322: 48cd li a7,19 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a : +.global mkdir +mkdir: + li a7, SYS_mkdir + 32a: 48d1 li a7,20 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 : +.global chdir +chdir: + li a7, SYS_chdir + 332: 48a5 li a7,9 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a : +.global dup +dup: + li a7, SYS_dup + 33a: 48a9 li a7,10 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 : +.global getpid +getpid: + li a7, SYS_getpid + 342: 48ad li a7,11 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 34a: 48b1 li a7,12 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 : +.global pause +pause: + li a7, SYS_pause + 352: 48b5 li a7,13 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a : +.global uptime +uptime: + li a7, SYS_uptime + 35a: 48b9 li a7,14 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 362: 48d9 li a7,22 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : +.global getppid +getppid: + li a7, SYS_getppid + 36a: 48dd li a7,23 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 372: 48e1 li a7,24 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 37a: 1101 addi sp,sp,-32 + 37c: ec06 sd ra,24(sp) + 37e: e822 sd s0,16(sp) + 380: 1000 addi s0,sp,32 + 382: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 386: 4605 li a2,1 + 388: fef40593 addi a1,s0,-17 + 38c: f57ff0ef jal 2e2 +} + 390: 60e2 ld ra,24(sp) + 392: 6442 ld s0,16(sp) + 394: 6105 addi sp,sp,32 + 396: 8082 ret + +0000000000000398 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 398: 715d addi sp,sp,-80 + 39a: e486 sd ra,72(sp) + 39c: e0a2 sd s0,64(sp) + 39e: f84a sd s2,48(sp) + 3a0: 0880 addi s0,sp,80 + 3a2: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3a4: c299 beqz a3,3aa + 3a6: 0805c363 bltz a1,42c + neg = 0; + 3aa: 4881 li a7,0 + 3ac: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3b0: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3b2: 00000517 auipc a0,0x0 + 3b6: 51650513 addi a0,a0,1302 # 8c8 + 3ba: 883e mv a6,a5 + 3bc: 2785 addiw a5,a5,1 + 3be: 02c5f733 remu a4,a1,a2 + 3c2: 972a add a4,a4,a0 + 3c4: 00074703 lbu a4,0(a4) + 3c8: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3cc: 872e mv a4,a1 + 3ce: 02c5d5b3 divu a1,a1,a2 + 3d2: 0685 addi a3,a3,1 + 3d4: fec773e3 bgeu a4,a2,3ba + if(neg) + 3d8: 00088b63 beqz a7,3ee + buf[i++] = '-'; + 3dc: fd078793 addi a5,a5,-48 + 3e0: 97a2 add a5,a5,s0 + 3e2: 02d00713 li a4,45 + 3e6: fee78423 sb a4,-24(a5) + 3ea: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 3ee: 02f05a63 blez a5,422 + 3f2: fc26 sd s1,56(sp) + 3f4: f44e sd s3,40(sp) + 3f6: fb840713 addi a4,s0,-72 + 3fa: 00f704b3 add s1,a4,a5 + 3fe: fff70993 addi s3,a4,-1 + 402: 99be add s3,s3,a5 + 404: 37fd addiw a5,a5,-1 + 406: 1782 slli a5,a5,0x20 + 408: 9381 srli a5,a5,0x20 + 40a: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 40e: fff4c583 lbu a1,-1(s1) + 412: 854a mv a0,s2 + 414: f67ff0ef jal 37a + while(--i >= 0) + 418: 14fd addi s1,s1,-1 + 41a: ff349ae3 bne s1,s3,40e + 41e: 74e2 ld s1,56(sp) + 420: 79a2 ld s3,40(sp) +} + 422: 60a6 ld ra,72(sp) + 424: 6406 ld s0,64(sp) + 426: 7942 ld s2,48(sp) + 428: 6161 addi sp,sp,80 + 42a: 8082 ret + x = -xx; + 42c: 40b005b3 neg a1,a1 + neg = 1; + 430: 4885 li a7,1 + x = -xx; + 432: bfad j 3ac + +0000000000000434 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 434: 711d addi sp,sp,-96 + 436: ec86 sd ra,88(sp) + 438: e8a2 sd s0,80(sp) + 43a: e0ca sd s2,64(sp) + 43c: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 43e: 0005c903 lbu s2,0(a1) + 442: 28090663 beqz s2,6ce + 446: e4a6 sd s1,72(sp) + 448: fc4e sd s3,56(sp) + 44a: f852 sd s4,48(sp) + 44c: f456 sd s5,40(sp) + 44e: f05a sd s6,32(sp) + 450: ec5e sd s7,24(sp) + 452: e862 sd s8,16(sp) + 454: e466 sd s9,8(sp) + 456: 8b2a mv s6,a0 + 458: 8a2e mv s4,a1 + 45a: 8bb2 mv s7,a2 + state = 0; + 45c: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 45e: 4481 li s1,0 + 460: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 462: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 466: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 46a: 06c00c93 li s9,108 + 46e: a005 j 48e + putc(fd, c0); + 470: 85ca mv a1,s2 + 472: 855a mv a0,s6 + 474: f07ff0ef jal 37a + 478: a019 j 47e + } else if(state == '%'){ + 47a: 03598263 beq s3,s5,49e + for(i = 0; fmt[i]; i++){ + 47e: 2485 addiw s1,s1,1 + 480: 8726 mv a4,s1 + 482: 009a07b3 add a5,s4,s1 + 486: 0007c903 lbu s2,0(a5) + 48a: 22090a63 beqz s2,6be + c0 = fmt[i] & 0xff; + 48e: 0009079b sext.w a5,s2 + if(state == 0){ + 492: fe0994e3 bnez s3,47a + if(c0 == '%'){ + 496: fd579de3 bne a5,s5,470 + state = '%'; + 49a: 89be mv s3,a5 + 49c: b7cd j 47e + if(c0) c1 = fmt[i+1] & 0xff; + 49e: 00ea06b3 add a3,s4,a4 + 4a2: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4a6: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4a8: c681 beqz a3,4b0 + 4aa: 9752 add a4,a4,s4 + 4ac: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4b0: 05878363 beq a5,s8,4f6 + } else if(c0 == 'l' && c1 == 'd'){ + 4b4: 05978d63 beq a5,s9,50e + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4b8: 07500713 li a4,117 + 4bc: 0ee78763 beq a5,a4,5aa + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4c0: 07800713 li a4,120 + 4c4: 12e78963 beq a5,a4,5f6 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4c8: 07000713 li a4,112 + 4cc: 14e78e63 beq a5,a4,628 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4d0: 06300713 li a4,99 + 4d4: 18e78e63 beq a5,a4,670 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4d8: 07300713 li a4,115 + 4dc: 1ae78463 beq a5,a4,684 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4e0: 02500713 li a4,37 + 4e4: 04e79563 bne a5,a4,52e + putc(fd, '%'); + 4e8: 02500593 li a1,37 + 4ec: 855a mv a0,s6 + 4ee: e8dff0ef jal 37a + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 4f2: 4981 li s3,0 + 4f4: b769 j 47e + printint(fd, va_arg(ap, int), 10, 1); + 4f6: 008b8913 addi s2,s7,8 + 4fa: 4685 li a3,1 + 4fc: 4629 li a2,10 + 4fe: 000ba583 lw a1,0(s7) + 502: 855a mv a0,s6 + 504: e95ff0ef jal 398 + 508: 8bca mv s7,s2 + state = 0; + 50a: 4981 li s3,0 + 50c: bf8d j 47e + } else if(c0 == 'l' && c1 == 'd'){ + 50e: 06400793 li a5,100 + 512: 02f68963 beq a3,a5,544 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 516: 06c00793 li a5,108 + 51a: 04f68263 beq a3,a5,55e + } else if(c0 == 'l' && c1 == 'u'){ + 51e: 07500793 li a5,117 + 522: 0af68063 beq a3,a5,5c2 + } else if(c0 == 'l' && c1 == 'x'){ + 526: 07800793 li a5,120 + 52a: 0ef68263 beq a3,a5,60e + putc(fd, '%'); + 52e: 02500593 li a1,37 + 532: 855a mv a0,s6 + 534: e47ff0ef jal 37a + putc(fd, c0); + 538: 85ca mv a1,s2 + 53a: 855a mv a0,s6 + 53c: e3fff0ef jal 37a + state = 0; + 540: 4981 li s3,0 + 542: bf35 j 47e + printint(fd, va_arg(ap, uint64), 10, 1); + 544: 008b8913 addi s2,s7,8 + 548: 4685 li a3,1 + 54a: 4629 li a2,10 + 54c: 000bb583 ld a1,0(s7) + 550: 855a mv a0,s6 + 552: e47ff0ef jal 398 + i += 1; + 556: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 558: 8bca mv s7,s2 + state = 0; + 55a: 4981 li s3,0 + i += 1; + 55c: b70d j 47e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 55e: 06400793 li a5,100 + 562: 02f60763 beq a2,a5,590 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 566: 07500793 li a5,117 + 56a: 06f60963 beq a2,a5,5dc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 56e: 07800793 li a5,120 + 572: faf61ee3 bne a2,a5,52e + printint(fd, va_arg(ap, uint64), 16, 0); + 576: 008b8913 addi s2,s7,8 + 57a: 4681 li a3,0 + 57c: 4641 li a2,16 + 57e: 000bb583 ld a1,0(s7) + 582: 855a mv a0,s6 + 584: e15ff0ef jal 398 + i += 2; + 588: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 58a: 8bca mv s7,s2 + state = 0; + 58c: 4981 li s3,0 + i += 2; + 58e: bdc5 j 47e + printint(fd, va_arg(ap, uint64), 10, 1); + 590: 008b8913 addi s2,s7,8 + 594: 4685 li a3,1 + 596: 4629 li a2,10 + 598: 000bb583 ld a1,0(s7) + 59c: 855a mv a0,s6 + 59e: dfbff0ef jal 398 + i += 2; + 5a2: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5a4: 8bca mv s7,s2 + state = 0; + 5a6: 4981 li s3,0 + i += 2; + 5a8: bdd9 j 47e + printint(fd, va_arg(ap, uint32), 10, 0); + 5aa: 008b8913 addi s2,s7,8 + 5ae: 4681 li a3,0 + 5b0: 4629 li a2,10 + 5b2: 000be583 lwu a1,0(s7) + 5b6: 855a mv a0,s6 + 5b8: de1ff0ef jal 398 + 5bc: 8bca mv s7,s2 + state = 0; + 5be: 4981 li s3,0 + 5c0: bd7d j 47e + printint(fd, va_arg(ap, uint64), 10, 0); + 5c2: 008b8913 addi s2,s7,8 + 5c6: 4681 li a3,0 + 5c8: 4629 li a2,10 + 5ca: 000bb583 ld a1,0(s7) + 5ce: 855a mv a0,s6 + 5d0: dc9ff0ef jal 398 + i += 1; + 5d4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5d6: 8bca mv s7,s2 + state = 0; + 5d8: 4981 li s3,0 + i += 1; + 5da: b555 j 47e + printint(fd, va_arg(ap, uint64), 10, 0); + 5dc: 008b8913 addi s2,s7,8 + 5e0: 4681 li a3,0 + 5e2: 4629 li a2,10 + 5e4: 000bb583 ld a1,0(s7) + 5e8: 855a mv a0,s6 + 5ea: dafff0ef jal 398 + i += 2; + 5ee: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5f0: 8bca mv s7,s2 + state = 0; + 5f2: 4981 li s3,0 + i += 2; + 5f4: b569 j 47e + printint(fd, va_arg(ap, uint32), 16, 0); + 5f6: 008b8913 addi s2,s7,8 + 5fa: 4681 li a3,0 + 5fc: 4641 li a2,16 + 5fe: 000be583 lwu a1,0(s7) + 602: 855a mv a0,s6 + 604: d95ff0ef jal 398 + 608: 8bca mv s7,s2 + state = 0; + 60a: 4981 li s3,0 + 60c: bd8d j 47e + printint(fd, va_arg(ap, uint64), 16, 0); + 60e: 008b8913 addi s2,s7,8 + 612: 4681 li a3,0 + 614: 4641 li a2,16 + 616: 000bb583 ld a1,0(s7) + 61a: 855a mv a0,s6 + 61c: d7dff0ef jal 398 + i += 1; + 620: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 622: 8bca mv s7,s2 + state = 0; + 624: 4981 li s3,0 + i += 1; + 626: bda1 j 47e + 628: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 62a: 008b8d13 addi s10,s7,8 + 62e: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 632: 03000593 li a1,48 + 636: 855a mv a0,s6 + 638: d43ff0ef jal 37a + putc(fd, 'x'); + 63c: 07800593 li a1,120 + 640: 855a mv a0,s6 + 642: d39ff0ef jal 37a + 646: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 648: 00000b97 auipc s7,0x0 + 64c: 280b8b93 addi s7,s7,640 # 8c8 + 650: 03c9d793 srli a5,s3,0x3c + 654: 97de add a5,a5,s7 + 656: 0007c583 lbu a1,0(a5) + 65a: 855a mv a0,s6 + 65c: d1fff0ef jal 37a + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 660: 0992 slli s3,s3,0x4 + 662: 397d addiw s2,s2,-1 + 664: fe0916e3 bnez s2,650 + printptr(fd, va_arg(ap, uint64)); + 668: 8bea mv s7,s10 + state = 0; + 66a: 4981 li s3,0 + 66c: 6d02 ld s10,0(sp) + 66e: bd01 j 47e + putc(fd, va_arg(ap, uint32)); + 670: 008b8913 addi s2,s7,8 + 674: 000bc583 lbu a1,0(s7) + 678: 855a mv a0,s6 + 67a: d01ff0ef jal 37a + 67e: 8bca mv s7,s2 + state = 0; + 680: 4981 li s3,0 + 682: bbf5 j 47e + if((s = va_arg(ap, char*)) == 0) + 684: 008b8993 addi s3,s7,8 + 688: 000bb903 ld s2,0(s7) + 68c: 00090f63 beqz s2,6aa + for(; *s; s++) + 690: 00094583 lbu a1,0(s2) + 694: c195 beqz a1,6b8 + putc(fd, *s); + 696: 855a mv a0,s6 + 698: ce3ff0ef jal 37a + for(; *s; s++) + 69c: 0905 addi s2,s2,1 + 69e: 00094583 lbu a1,0(s2) + 6a2: f9f5 bnez a1,696 + if((s = va_arg(ap, char*)) == 0) + 6a4: 8bce mv s7,s3 + state = 0; + 6a6: 4981 li s3,0 + 6a8: bbd9 j 47e + s = "(null)"; + 6aa: 00000917 auipc s2,0x0 + 6ae: 21690913 addi s2,s2,534 # 8c0 + for(; *s; s++) + 6b2: 02800593 li a1,40 + 6b6: b7c5 j 696 + if((s = va_arg(ap, char*)) == 0) + 6b8: 8bce mv s7,s3 + state = 0; + 6ba: 4981 li s3,0 + 6bc: b3c9 j 47e + 6be: 64a6 ld s1,72(sp) + 6c0: 79e2 ld s3,56(sp) + 6c2: 7a42 ld s4,48(sp) + 6c4: 7aa2 ld s5,40(sp) + 6c6: 7b02 ld s6,32(sp) + 6c8: 6be2 ld s7,24(sp) + 6ca: 6c42 ld s8,16(sp) + 6cc: 6ca2 ld s9,8(sp) + } + } +} + 6ce: 60e6 ld ra,88(sp) + 6d0: 6446 ld s0,80(sp) + 6d2: 6906 ld s2,64(sp) + 6d4: 6125 addi sp,sp,96 + 6d6: 8082 ret + +00000000000006d8 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6d8: 715d addi sp,sp,-80 + 6da: ec06 sd ra,24(sp) + 6dc: e822 sd s0,16(sp) + 6de: 1000 addi s0,sp,32 + 6e0: e010 sd a2,0(s0) + 6e2: e414 sd a3,8(s0) + 6e4: e818 sd a4,16(s0) + 6e6: ec1c sd a5,24(s0) + 6e8: 03043023 sd a6,32(s0) + 6ec: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6f0: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6f4: 8622 mv a2,s0 + 6f6: d3fff0ef jal 434 +} + 6fa: 60e2 ld ra,24(sp) + 6fc: 6442 ld s0,16(sp) + 6fe: 6161 addi sp,sp,80 + 700: 8082 ret + +0000000000000702 : + +void +printf(const char *fmt, ...) +{ + 702: 711d addi sp,sp,-96 + 704: ec06 sd ra,24(sp) + 706: e822 sd s0,16(sp) + 708: 1000 addi s0,sp,32 + 70a: e40c sd a1,8(s0) + 70c: e810 sd a2,16(s0) + 70e: ec14 sd a3,24(s0) + 710: f018 sd a4,32(s0) + 712: f41c sd a5,40(s0) + 714: 03043823 sd a6,48(s0) + 718: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 71c: 00840613 addi a2,s0,8 + 720: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 724: 85aa mv a1,a0 + 726: 4505 li a0,1 + 728: d0dff0ef jal 434 +} + 72c: 60e2 ld ra,24(sp) + 72e: 6442 ld s0,16(sp) + 730: 6125 addi sp,sp,96 + 732: 8082 ret + +0000000000000734 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 734: 1141 addi sp,sp,-16 + 736: e422 sd s0,8(sp) + 738: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 73a: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 73e: 00001797 auipc a5,0x1 + 742: 8c27b783 ld a5,-1854(a5) # 1000 + 746: a02d j 770 + 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; + 748: 4618 lw a4,8(a2) + 74a: 9f2d addw a4,a4,a1 + 74c: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 750: 6398 ld a4,0(a5) + 752: 6310 ld a2,0(a4) + 754: a83d j 792 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 756: ff852703 lw a4,-8(a0) + 75a: 9f31 addw a4,a4,a2 + 75c: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 75e: ff053683 ld a3,-16(a0) + 762: a091 j 7a6 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 764: 6398 ld a4,0(a5) + 766: 00e7e463 bltu a5,a4,76e + 76a: 00e6ea63 bltu a3,a4,77e +{ + 76e: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 770: fed7fae3 bgeu a5,a3,764 + 774: 6398 ld a4,0(a5) + 776: 00e6e463 bltu a3,a4,77e + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 77a: fee7eae3 bltu a5,a4,76e + if(bp + bp->s.size == p->s.ptr){ + 77e: ff852583 lw a1,-8(a0) + 782: 6390 ld a2,0(a5) + 784: 02059813 slli a6,a1,0x20 + 788: 01c85713 srli a4,a6,0x1c + 78c: 9736 add a4,a4,a3 + 78e: fae60de3 beq a2,a4,748 + bp->s.ptr = p->s.ptr->s.ptr; + 792: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 796: 4790 lw a2,8(a5) + 798: 02061593 slli a1,a2,0x20 + 79c: 01c5d713 srli a4,a1,0x1c + 7a0: 973e add a4,a4,a5 + 7a2: fae68ae3 beq a3,a4,756 + p->s.ptr = bp->s.ptr; + 7a6: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7a8: 00001717 auipc a4,0x1 + 7ac: 84f73c23 sd a5,-1960(a4) # 1000 +} + 7b0: 6422 ld s0,8(sp) + 7b2: 0141 addi sp,sp,16 + 7b4: 8082 ret + +00000000000007b6 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7b6: 7139 addi sp,sp,-64 + 7b8: fc06 sd ra,56(sp) + 7ba: f822 sd s0,48(sp) + 7bc: f426 sd s1,40(sp) + 7be: ec4e sd s3,24(sp) + 7c0: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7c2: 02051493 slli s1,a0,0x20 + 7c6: 9081 srli s1,s1,0x20 + 7c8: 04bd addi s1,s1,15 + 7ca: 8091 srli s1,s1,0x4 + 7cc: 0014899b addiw s3,s1,1 + 7d0: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7d2: 00001517 auipc a0,0x1 + 7d6: 82e53503 ld a0,-2002(a0) # 1000 + 7da: c915 beqz a0,80e + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7dc: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7de: 4798 lw a4,8(a5) + 7e0: 08977a63 bgeu a4,s1,874 + 7e4: f04a sd s2,32(sp) + 7e6: e852 sd s4,16(sp) + 7e8: e456 sd s5,8(sp) + 7ea: e05a sd s6,0(sp) + if(nu < 4096) + 7ec: 8a4e mv s4,s3 + 7ee: 0009871b sext.w a4,s3 + 7f2: 6685 lui a3,0x1 + 7f4: 00d77363 bgeu a4,a3,7fa + 7f8: 6a05 lui s4,0x1 + 7fa: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7fe: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 802: 00000917 auipc s2,0x0 + 806: 7fe90913 addi s2,s2,2046 # 1000 + if(p == SBRK_ERROR) + 80a: 5afd li s5,-1 + 80c: a081 j 84c + 80e: f04a sd s2,32(sp) + 810: e852 sd s4,16(sp) + 812: e456 sd s5,8(sp) + 814: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 816: 00000797 auipc a5,0x0 + 81a: 7fa78793 addi a5,a5,2042 # 1010 + 81e: 00000717 auipc a4,0x0 + 822: 7ef73123 sd a5,2018(a4) # 1000 + 826: e39c sd a5,0(a5) + base.s.size = 0; + 828: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 82c: b7c1 j 7ec + prevp->s.ptr = p->s.ptr; + 82e: 6398 ld a4,0(a5) + 830: e118 sd a4,0(a0) + 832: a8a9 j 88c + hp->s.size = nu; + 834: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 838: 0541 addi a0,a0,16 + 83a: efbff0ef jal 734 + return freep; + 83e: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 842: c12d beqz a0,8a4 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 844: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 846: 4798 lw a4,8(a5) + 848: 02977263 bgeu a4,s1,86c + if(p == freep) + 84c: 00093703 ld a4,0(s2) + 850: 853e mv a0,a5 + 852: fef719e3 bne a4,a5,844 + p = sbrk(nu * sizeof(Header)); + 856: 8552 mv a0,s4 + 858: a37ff0ef jal 28e + if(p == SBRK_ERROR) + 85c: fd551ce3 bne a0,s5,834 + return 0; + 860: 4501 li a0,0 + 862: 7902 ld s2,32(sp) + 864: 6a42 ld s4,16(sp) + 866: 6aa2 ld s5,8(sp) + 868: 6b02 ld s6,0(sp) + 86a: a03d j 898 + 86c: 7902 ld s2,32(sp) + 86e: 6a42 ld s4,16(sp) + 870: 6aa2 ld s5,8(sp) + 872: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 874: fae48de3 beq s1,a4,82e + p->s.size -= nunits; + 878: 4137073b subw a4,a4,s3 + 87c: c798 sw a4,8(a5) + p += p->s.size; + 87e: 02071693 slli a3,a4,0x20 + 882: 01c6d713 srli a4,a3,0x1c + 886: 97ba add a5,a5,a4 + p->s.size = nunits; + 888: 0137a423 sw s3,8(a5) + freep = prevp; + 88c: 00000717 auipc a4,0x0 + 890: 76a73a23 sd a0,1908(a4) # 1000 + return (void*)(p + 1); + 894: 01078513 addi a0,a5,16 + } +} + 898: 70e2 ld ra,56(sp) + 89a: 7442 ld s0,48(sp) + 89c: 74a2 ld s1,40(sp) + 89e: 69e2 ld s3,24(sp) + 8a0: 6121 addi sp,sp,64 + 8a2: 8082 ret + 8a4: 7902 ld s2,32(sp) + 8a6: 6a42 ld s4,16(sp) + 8a8: 6aa2 ld s5,8(sp) + 8aa: 6b02 ld s6,0(sp) + 8ac: b7f5 j 898 diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.c b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.c new file mode 100644 index 0000000000..24d323955f --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.c @@ -0,0 +1,9 @@ +#include "kernel/types.h" +#include "user/user.h" + +int main(){ + printf("Start\n"); + sleep2(50); + printf("End\n"); + exit(0); +} diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.d b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.d new file mode 100644 index 0000000000..ba0b8245b5 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.d @@ -0,0 +1 @@ +user/test_sleep2.o: user/test_sleep2.c kernel/types.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.o b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.o new file mode 100644 index 0000000000..71070243b3 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.sym b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.sym new file mode 100644 index 0000000000..654eaebab9 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/test_sleep2.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +00000000000008b0 .rodata +00000000000008e0 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 test_sleep2.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000037a putc +0000000000000398 printint +00000000000008c8 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +000000000000003e strcpy +0000000000000352 pause +0000000000000702 printf +000000000000034a sys_sbrk +00000000000001e8 memmove +000000000000030a mknod +00000000000000f6 gets +0000000000000342 getpid +000000000000027a memcpy +00000000000007b6 malloc +00000000000002a4 sbrklazy +00000000000002d2 pipe +00000000000002e2 write +000000000000031a fstat +00000000000006d8 fprintf +00000000000002f2 kill +0000000000000434 vprintf +0000000000000332 chdir +00000000000002fa exec +00000000000002ca wait +0000000000000362 getprocsinfo +00000000000002da read +0000000000000312 unlink +0000000000000240 memcmp +00000000000002ba fork +000000000000028e sbrk +000000000000035a uptime +00000000000000b0 memset +0000000000000000 main +000000000000036a getppid +000000000000005a strcmp +000000000000033a dup +0000000000000166 stat +0000000000000372 sleep2 +0000000000000322 link +00000000000002c2 exit +000000000000002e start +00000000000001a0 atoi +0000000000000086 strlen +0000000000000302 open +00000000000000d2 strchr +000000000000032a mkdir +00000000000002ea close +0000000000000734 free diff --git a/user/ulib.c b/G12_Project1_xv6CustomizeSystemCalls/user/ulib.c similarity index 100% rename from user/ulib.c rename to G12_Project1_xv6CustomizeSystemCalls/user/ulib.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ulib.d b/G12_Project1_xv6CustomizeSystemCalls/user/ulib.d new file mode 100644 index 0000000000..fa219061b6 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/ulib.d @@ -0,0 +1,2 @@ +user/ulib.o: user/ulib.c kernel/types.h kernel/stat.h kernel/fcntl.h \ + kernel/riscv.h kernel/vm.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/ulib.o b/G12_Project1_xv6CustomizeSystemCalls/user/ulib.o new file mode 100644 index 0000000000..c131f9cd8d Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/ulib.o differ diff --git a/user/umalloc.c b/G12_Project1_xv6CustomizeSystemCalls/user/umalloc.c similarity index 100% rename from user/umalloc.c rename to G12_Project1_xv6CustomizeSystemCalls/user/umalloc.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/umalloc.d b/G12_Project1_xv6CustomizeSystemCalls/user/umalloc.d new file mode 100644 index 0000000000..b03b5c2edc --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/umalloc.d @@ -0,0 +1,2 @@ +user/umalloc.o: user/umalloc.c kernel/types.h kernel/stat.h user/user.h \ + kernel/param.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/umalloc.o b/G12_Project1_xv6CustomizeSystemCalls/user/umalloc.o new file mode 100644 index 0000000000..a79d83e123 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/umalloc.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/user.h b/G12_Project1_xv6CustomizeSystemCalls/user/user.h new file mode 100644 index 0000000000..7f491f872a --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/user.h @@ -0,0 +1,51 @@ +#define SBRK_ERROR ((char *)-1) + +struct stat; + +// system calls +int fork(void); +int exit(int) __attribute__((noreturn)); +int wait(int*); +int pipe(int*); +int write(int, const void*, int); +int read(int, void*, int); +int close(int); +int kill(int); +int exec(const char*, char**); +int open(const char*, int); +int mknod(const char*, short, short); +int unlink(const char*); +int fstat(int fd, struct stat*); +int link(const char*, const char*); +int mkdir(const char*); +int chdir(const char*); +int dup(int); +int getpid(void); +char* sys_sbrk(int,int); +int pause(int); +int uptime(void); +int getprocsinfo(void); +int getppid(void); +int sleep2(int); +// ulib.c +int stat(const char*, struct stat*); +char* strcpy(char*, const char*); +void *memmove(void*, const void*, int); +char* strchr(const char*, char c); +int strcmp(const char*, const char*); +char* gets(char*, int max); +uint strlen(const char*); +void* memset(void*, int, uint); +int atoi(const char*); +int memcmp(const void *, const void *, uint); +void *memcpy(void *, const void *, uint); +char* sbrk(int); +char* sbrklazy(int); + +// printf.c +void fprintf(int, const char*, ...) __attribute__ ((format (printf, 2, 3))); +void printf(const char*, ...) __attribute__ ((format (printf, 1, 2))); + +// umalloc.c +void* malloc(uint); +void free(void*); diff --git a/user/user.ld b/G12_Project1_xv6CustomizeSystemCalls/user/user.ld similarity index 100% rename from user/user.ld rename to G12_Project1_xv6CustomizeSystemCalls/user/user.ld diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/usertests.asm b/G12_Project1_xv6CustomizeSystemCalls/user/usertests.asm new file mode 100644 index 0000000000..712e7639ff --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/usertests.asm @@ -0,0 +1,9943 @@ + +user/_usertests: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : +} + +// what if you pass ridiculous string pointers to system calls? +void +copyinstr1(char *s) +{ + 0: 711d addi sp,sp,-96 + 2: ec86 sd ra,88(sp) + 4: e8a2 sd s0,80(sp) + 6: e4a6 sd s1,72(sp) + 8: e0ca sd s2,64(sp) + a: fc4e sd s3,56(sp) + c: 1080 addi s0,sp,96 + uint64 addrs[] = { 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + e: 00008797 auipc a5,0x8 + 12: 8d278793 addi a5,a5,-1838 # 78e0 + 16: 638c ld a1,0(a5) + 18: 6790 ld a2,8(a5) + 1a: 6b94 ld a3,16(a5) + 1c: 6f98 ld a4,24(a5) + 1e: 739c ld a5,32(a5) + 20: fab43423 sd a1,-88(s0) + 24: fac43823 sd a2,-80(s0) + 28: fad43c23 sd a3,-72(s0) + 2c: fce43023 sd a4,-64(s0) + 30: fcf43423 sd a5,-56(s0) + 0xffffffffffffffff }; + + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 34: fa840493 addi s1,s0,-88 + 38: fd040993 addi s3,s0,-48 + uint64 addr = addrs[ai]; + + int fd = open((char *)addr, O_CREATE|O_WRONLY); + 3c: 0004b903 ld s2,0(s1) + 40: 20100593 li a1,513 + 44: 854a mv a0,s2 + 46: 56f040ef jal 4db4 + if(fd >= 0){ + 4a: 00055c63 bgez a0,62 + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 4e: 04a1 addi s1,s1,8 + 50: ff3496e3 bne s1,s3,3c + printf("open(%p) returned %d, not -1\n", (void*)addr, fd); + exit(1); + } + } +} + 54: 60e6 ld ra,88(sp) + 56: 6446 ld s0,80(sp) + 58: 64a6 ld s1,72(sp) + 5a: 6906 ld s2,64(sp) + 5c: 79e2 ld s3,56(sp) + 5e: 6125 addi sp,sp,96 + 60: 8082 ret + printf("open(%p) returned %d, not -1\n", (void*)addr, fd); + 62: 862a mv a2,a0 + 64: 85ca mv a1,s2 + 66: 00005517 auipc a0,0x5 + 6a: 2fa50513 addi a0,a0,762 # 5360 + 6e: 146050ef jal 51b4 + exit(1); + 72: 4505 li a0,1 + 74: 501040ef jal 4d74 + +0000000000000078 : +void +bsstest(char *s) +{ + int i; + + for(i = 0; i < sizeof(uninit); i++){ + 78: 0000a797 auipc a5,0xa + 7c: 53078793 addi a5,a5,1328 # a5a8 + 80: 0000d697 auipc a3,0xd + 84: c3868693 addi a3,a3,-968 # ccb8 + if(uninit[i] != '\0'){ + 88: 0007c703 lbu a4,0(a5) + 8c: e709 bnez a4,96 + for(i = 0; i < sizeof(uninit); i++){ + 8e: 0785 addi a5,a5,1 + 90: fed79ce3 bne a5,a3,88 + 94: 8082 ret +{ + 96: 1141 addi sp,sp,-16 + 98: e406 sd ra,8(sp) + 9a: e022 sd s0,0(sp) + 9c: 0800 addi s0,sp,16 + printf("%s: bss test failed\n", s); + 9e: 85aa mv a1,a0 + a0: 00005517 auipc a0,0x5 + a4: 2e050513 addi a0,a0,736 # 5380 + a8: 10c050ef jal 51b4 + exit(1); + ac: 4505 li a0,1 + ae: 4c7040ef jal 4d74 + +00000000000000b2 : +{ + b2: 1101 addi sp,sp,-32 + b4: ec06 sd ra,24(sp) + b6: e822 sd s0,16(sp) + b8: e426 sd s1,8(sp) + ba: 1000 addi s0,sp,32 + bc: 84aa mv s1,a0 + fd = open("echo", 0); + be: 4581 li a1,0 + c0: 00005517 auipc a0,0x5 + c4: 2d850513 addi a0,a0,728 # 5398 + c8: 4ed040ef jal 4db4 + if(fd < 0){ + cc: 02054263 bltz a0,f0 + close(fd); + d0: 4cd040ef jal 4d9c + fd = open("doesnotexist", 0); + d4: 4581 li a1,0 + d6: 00005517 auipc a0,0x5 + da: 2e250513 addi a0,a0,738 # 53b8 + de: 4d7040ef jal 4db4 + if(fd >= 0){ + e2: 02055163 bgez a0,104 +} + e6: 60e2 ld ra,24(sp) + e8: 6442 ld s0,16(sp) + ea: 64a2 ld s1,8(sp) + ec: 6105 addi sp,sp,32 + ee: 8082 ret + printf("%s: open echo failed!\n", s); + f0: 85a6 mv a1,s1 + f2: 00005517 auipc a0,0x5 + f6: 2ae50513 addi a0,a0,686 # 53a0 + fa: 0ba050ef jal 51b4 + exit(1); + fe: 4505 li a0,1 + 100: 475040ef jal 4d74 + printf("%s: open doesnotexist succeeded!\n", s); + 104: 85a6 mv a1,s1 + 106: 00005517 auipc a0,0x5 + 10a: 2c250513 addi a0,a0,706 # 53c8 + 10e: 0a6050ef jal 51b4 + exit(1); + 112: 4505 li a0,1 + 114: 461040ef jal 4d74 + +0000000000000118 : +{ + 118: 7179 addi sp,sp,-48 + 11a: f406 sd ra,40(sp) + 11c: f022 sd s0,32(sp) + 11e: ec26 sd s1,24(sp) + 120: e84a sd s2,16(sp) + 122: e44e sd s3,8(sp) + 124: 1800 addi s0,sp,48 + 126: 89aa mv s3,a0 + unlink("truncfile"); + 128: 00005517 auipc a0,0x5 + 12c: 2c850513 addi a0,a0,712 # 53f0 + 130: 495040ef jal 4dc4 + int fd1 = open("truncfile", O_CREATE|O_TRUNC|O_WRONLY); + 134: 60100593 li a1,1537 + 138: 00005517 auipc a0,0x5 + 13c: 2b850513 addi a0,a0,696 # 53f0 + 140: 475040ef jal 4db4 + 144: 84aa mv s1,a0 + write(fd1, "abcd", 4); + 146: 4611 li a2,4 + 148: 00005597 auipc a1,0x5 + 14c: 2b858593 addi a1,a1,696 # 5400 + 150: 445040ef jal 4d94 + int fd2 = open("truncfile", O_TRUNC|O_WRONLY); + 154: 40100593 li a1,1025 + 158: 00005517 auipc a0,0x5 + 15c: 29850513 addi a0,a0,664 # 53f0 + 160: 455040ef jal 4db4 + 164: 892a mv s2,a0 + int n = write(fd1, "x", 1); + 166: 4605 li a2,1 + 168: 00005597 auipc a1,0x5 + 16c: 2a058593 addi a1,a1,672 # 5408 + 170: 8526 mv a0,s1 + 172: 423040ef jal 4d94 + if(n != -1){ + 176: 57fd li a5,-1 + 178: 02f51563 bne a0,a5,1a2 + unlink("truncfile"); + 17c: 00005517 auipc a0,0x5 + 180: 27450513 addi a0,a0,628 # 53f0 + 184: 441040ef jal 4dc4 + close(fd1); + 188: 8526 mv a0,s1 + 18a: 413040ef jal 4d9c + close(fd2); + 18e: 854a mv a0,s2 + 190: 40d040ef jal 4d9c +} + 194: 70a2 ld ra,40(sp) + 196: 7402 ld s0,32(sp) + 198: 64e2 ld s1,24(sp) + 19a: 6942 ld s2,16(sp) + 19c: 69a2 ld s3,8(sp) + 19e: 6145 addi sp,sp,48 + 1a0: 8082 ret + printf("%s: write returned %d, expected -1\n", s, n); + 1a2: 862a mv a2,a0 + 1a4: 85ce mv a1,s3 + 1a6: 00005517 auipc a0,0x5 + 1aa: 26a50513 addi a0,a0,618 # 5410 + 1ae: 006050ef jal 51b4 + exit(1); + 1b2: 4505 li a0,1 + 1b4: 3c1040ef jal 4d74 + +00000000000001b8 : +{ + 1b8: 7179 addi sp,sp,-48 + 1ba: f406 sd ra,40(sp) + 1bc: f022 sd s0,32(sp) + 1be: ec26 sd s1,24(sp) + 1c0: e84a sd s2,16(sp) + 1c2: 1800 addi s0,sp,48 + name[0] = 'a'; + 1c4: 06100793 li a5,97 + 1c8: fcf40c23 sb a5,-40(s0) + name[2] = '\0'; + 1cc: fc040d23 sb zero,-38(s0) + 1d0: 03000493 li s1,48 + for(i = 0; i < N; i++){ + 1d4: 06400913 li s2,100 + name[1] = '0' + i; + 1d8: fc940ca3 sb s1,-39(s0) + fd = open(name, O_CREATE|O_RDWR); + 1dc: 20200593 li a1,514 + 1e0: fd840513 addi a0,s0,-40 + 1e4: 3d1040ef jal 4db4 + close(fd); + 1e8: 3b5040ef jal 4d9c + for(i = 0; i < N; i++){ + 1ec: 2485 addiw s1,s1,1 + 1ee: 0ff4f493 zext.b s1,s1 + 1f2: ff2493e3 bne s1,s2,1d8 + name[0] = 'a'; + 1f6: 06100793 li a5,97 + 1fa: fcf40c23 sb a5,-40(s0) + name[2] = '\0'; + 1fe: fc040d23 sb zero,-38(s0) + 202: 03000493 li s1,48 + for(i = 0; i < N; i++){ + 206: 06400913 li s2,100 + name[1] = '0' + i; + 20a: fc940ca3 sb s1,-39(s0) + unlink(name); + 20e: fd840513 addi a0,s0,-40 + 212: 3b3040ef jal 4dc4 + for(i = 0; i < N; i++){ + 216: 2485 addiw s1,s1,1 + 218: 0ff4f493 zext.b s1,s1 + 21c: ff2497e3 bne s1,s2,20a +} + 220: 70a2 ld ra,40(sp) + 222: 7402 ld s0,32(sp) + 224: 64e2 ld s1,24(sp) + 226: 6942 ld s2,16(sp) + 228: 6145 addi sp,sp,48 + 22a: 8082 ret + +000000000000022c : +{ + 22c: 715d addi sp,sp,-80 + 22e: e486 sd ra,72(sp) + 230: e0a2 sd s0,64(sp) + 232: fc26 sd s1,56(sp) + 234: f84a sd s2,48(sp) + 236: f44e sd s3,40(sp) + 238: f052 sd s4,32(sp) + 23a: ec56 sd s5,24(sp) + 23c: e85a sd s6,16(sp) + 23e: e45e sd s7,8(sp) + 240: 0880 addi s0,sp,80 + 242: 8baa mv s7,a0 + unlink("bigwrite"); + 244: 00005517 auipc a0,0x5 + 248: 1f450513 addi a0,a0,500 # 5438 + 24c: 379040ef jal 4dc4 + for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ + 250: 1f300493 li s1,499 + fd = open("bigwrite", O_CREATE | O_RDWR); + 254: 00005a97 auipc s5,0x5 + 258: 1e4a8a93 addi s5,s5,484 # 5438 + int cc = write(fd, buf, sz); + 25c: 0000da17 auipc s4,0xd + 260: a5ca0a13 addi s4,s4,-1444 # ccb8 + for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ + 264: 6b0d lui s6,0x3 + 266: 1c9b0b13 addi s6,s6,457 # 31c9 + fd = open("bigwrite", O_CREATE | O_RDWR); + 26a: 20200593 li a1,514 + 26e: 8556 mv a0,s5 + 270: 345040ef jal 4db4 + 274: 892a mv s2,a0 + if(fd < 0){ + 276: 04054563 bltz a0,2c0 + int cc = write(fd, buf, sz); + 27a: 8626 mv a2,s1 + 27c: 85d2 mv a1,s4 + 27e: 317040ef jal 4d94 + 282: 89aa mv s3,a0 + if(cc != sz){ + 284: 04a49863 bne s1,a0,2d4 + int cc = write(fd, buf, sz); + 288: 8626 mv a2,s1 + 28a: 85d2 mv a1,s4 + 28c: 854a mv a0,s2 + 28e: 307040ef jal 4d94 + if(cc != sz){ + 292: 04951263 bne a0,s1,2d6 + close(fd); + 296: 854a mv a0,s2 + 298: 305040ef jal 4d9c + unlink("bigwrite"); + 29c: 8556 mv a0,s5 + 29e: 327040ef jal 4dc4 + for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ + 2a2: 1d74849b addiw s1,s1,471 + 2a6: fd6492e3 bne s1,s6,26a +} + 2aa: 60a6 ld ra,72(sp) + 2ac: 6406 ld s0,64(sp) + 2ae: 74e2 ld s1,56(sp) + 2b0: 7942 ld s2,48(sp) + 2b2: 79a2 ld s3,40(sp) + 2b4: 7a02 ld s4,32(sp) + 2b6: 6ae2 ld s5,24(sp) + 2b8: 6b42 ld s6,16(sp) + 2ba: 6ba2 ld s7,8(sp) + 2bc: 6161 addi sp,sp,80 + 2be: 8082 ret + printf("%s: cannot create bigwrite\n", s); + 2c0: 85de mv a1,s7 + 2c2: 00005517 auipc a0,0x5 + 2c6: 18650513 addi a0,a0,390 # 5448 + 2ca: 6eb040ef jal 51b4 + exit(1); + 2ce: 4505 li a0,1 + 2d0: 2a5040ef jal 4d74 + if(cc != sz){ + 2d4: 89a6 mv s3,s1 + printf("%s: write(%d) ret %d\n", s, sz, cc); + 2d6: 86aa mv a3,a0 + 2d8: 864e mv a2,s3 + 2da: 85de mv a1,s7 + 2dc: 00005517 auipc a0,0x5 + 2e0: 18c50513 addi a0,a0,396 # 5468 + 2e4: 6d1040ef jal 51b4 + exit(1); + 2e8: 4505 li a0,1 + 2ea: 28b040ef jal 4d74 + +00000000000002ee : +// file is deleted? if the kernel has this bug, it will panic: balloc: +// out of blocks. assumed_free may need to be raised to be more than +// the number of free blocks. this test takes a long time. +void +badwrite(char *s) +{ + 2ee: 7179 addi sp,sp,-48 + 2f0: f406 sd ra,40(sp) + 2f2: f022 sd s0,32(sp) + 2f4: ec26 sd s1,24(sp) + 2f6: e84a sd s2,16(sp) + 2f8: e44e sd s3,8(sp) + 2fa: e052 sd s4,0(sp) + 2fc: 1800 addi s0,sp,48 + int assumed_free = 600; + + unlink("junk"); + 2fe: 00005517 auipc a0,0x5 + 302: 18250513 addi a0,a0,386 # 5480 + 306: 2bf040ef jal 4dc4 + 30a: 25800913 li s2,600 + for(int i = 0; i < assumed_free; i++){ + int fd = open("junk", O_CREATE|O_WRONLY); + 30e: 00005997 auipc s3,0x5 + 312: 17298993 addi s3,s3,370 # 5480 + if(fd < 0){ + printf("open junk failed\n"); + exit(1); + } + write(fd, (char*)0xffffffffffL, 1); + 316: 5a7d li s4,-1 + 318: 018a5a13 srli s4,s4,0x18 + int fd = open("junk", O_CREATE|O_WRONLY); + 31c: 20100593 li a1,513 + 320: 854e mv a0,s3 + 322: 293040ef jal 4db4 + 326: 84aa mv s1,a0 + if(fd < 0){ + 328: 04054d63 bltz a0,382 + write(fd, (char*)0xffffffffffL, 1); + 32c: 4605 li a2,1 + 32e: 85d2 mv a1,s4 + 330: 265040ef jal 4d94 + close(fd); + 334: 8526 mv a0,s1 + 336: 267040ef jal 4d9c + unlink("junk"); + 33a: 854e mv a0,s3 + 33c: 289040ef jal 4dc4 + for(int i = 0; i < assumed_free; i++){ + 340: 397d addiw s2,s2,-1 + 342: fc091de3 bnez s2,31c + } + + int fd = open("junk", O_CREATE|O_WRONLY); + 346: 20100593 li a1,513 + 34a: 00005517 auipc a0,0x5 + 34e: 13650513 addi a0,a0,310 # 5480 + 352: 263040ef jal 4db4 + 356: 84aa mv s1,a0 + if(fd < 0){ + 358: 02054e63 bltz a0,394 + printf("open junk failed\n"); + exit(1); + } + if(write(fd, "x", 1) != 1){ + 35c: 4605 li a2,1 + 35e: 00005597 auipc a1,0x5 + 362: 0aa58593 addi a1,a1,170 # 5408 + 366: 22f040ef jal 4d94 + 36a: 4785 li a5,1 + 36c: 02f50d63 beq a0,a5,3a6 + printf("write failed\n"); + 370: 00005517 auipc a0,0x5 + 374: 13050513 addi a0,a0,304 # 54a0 + 378: 63d040ef jal 51b4 + exit(1); + 37c: 4505 li a0,1 + 37e: 1f7040ef jal 4d74 + printf("open junk failed\n"); + 382: 00005517 auipc a0,0x5 + 386: 10650513 addi a0,a0,262 # 5488 + 38a: 62b040ef jal 51b4 + exit(1); + 38e: 4505 li a0,1 + 390: 1e5040ef jal 4d74 + printf("open junk failed\n"); + 394: 00005517 auipc a0,0x5 + 398: 0f450513 addi a0,a0,244 # 5488 + 39c: 619040ef jal 51b4 + exit(1); + 3a0: 4505 li a0,1 + 3a2: 1d3040ef jal 4d74 + } + close(fd); + 3a6: 8526 mv a0,s1 + 3a8: 1f5040ef jal 4d9c + unlink("junk"); + 3ac: 00005517 auipc a0,0x5 + 3b0: 0d450513 addi a0,a0,212 # 5480 + 3b4: 211040ef jal 4dc4 + + exit(0); + 3b8: 4501 li a0,0 + 3ba: 1bb040ef jal 4d74 + +00000000000003be : + } +} + +void +outofinodes(char *s) +{ + 3be: 715d addi sp,sp,-80 + 3c0: e486 sd ra,72(sp) + 3c2: e0a2 sd s0,64(sp) + 3c4: fc26 sd s1,56(sp) + 3c6: f84a sd s2,48(sp) + 3c8: f44e sd s3,40(sp) + 3ca: 0880 addi s0,sp,80 + int nzz = 32*32; + for(int i = 0; i < nzz; i++){ + 3cc: 4481 li s1,0 + char name[32]; + name[0] = 'z'; + 3ce: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 3d2: 40000993 li s3,1024 + name[0] = 'z'; + 3d6: fb240823 sb s2,-80(s0) + name[1] = 'z'; + 3da: fb2408a3 sb s2,-79(s0) + name[2] = '0' + (i / 32); + 3de: 41f4d71b sraiw a4,s1,0x1f + 3e2: 01b7571b srliw a4,a4,0x1b + 3e6: 009707bb addw a5,a4,s1 + 3ea: 4057d69b sraiw a3,a5,0x5 + 3ee: 0306869b addiw a3,a3,48 + 3f2: fad40923 sb a3,-78(s0) + name[3] = '0' + (i % 32); + 3f6: 8bfd andi a5,a5,31 + 3f8: 9f99 subw a5,a5,a4 + 3fa: 0307879b addiw a5,a5,48 + 3fe: faf409a3 sb a5,-77(s0) + name[4] = '\0'; + 402: fa040a23 sb zero,-76(s0) + unlink(name); + 406: fb040513 addi a0,s0,-80 + 40a: 1bb040ef jal 4dc4 + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + 40e: 60200593 li a1,1538 + 412: fb040513 addi a0,s0,-80 + 416: 19f040ef jal 4db4 + if(fd < 0){ + 41a: 00054763 bltz a0,428 + // failure is eventually expected. + break; + } + close(fd); + 41e: 17f040ef jal 4d9c + for(int i = 0; i < nzz; i++){ + 422: 2485 addiw s1,s1,1 + 424: fb3499e3 bne s1,s3,3d6 + 428: 4481 li s1,0 + } + + for(int i = 0; i < nzz; i++){ + char name[32]; + name[0] = 'z'; + 42a: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 42e: 40000993 li s3,1024 + name[0] = 'z'; + 432: fb240823 sb s2,-80(s0) + name[1] = 'z'; + 436: fb2408a3 sb s2,-79(s0) + name[2] = '0' + (i / 32); + 43a: 41f4d71b sraiw a4,s1,0x1f + 43e: 01b7571b srliw a4,a4,0x1b + 442: 009707bb addw a5,a4,s1 + 446: 4057d69b sraiw a3,a5,0x5 + 44a: 0306869b addiw a3,a3,48 + 44e: fad40923 sb a3,-78(s0) + name[3] = '0' + (i % 32); + 452: 8bfd andi a5,a5,31 + 454: 9f99 subw a5,a5,a4 + 456: 0307879b addiw a5,a5,48 + 45a: faf409a3 sb a5,-77(s0) + name[4] = '\0'; + 45e: fa040a23 sb zero,-76(s0) + unlink(name); + 462: fb040513 addi a0,s0,-80 + 466: 15f040ef jal 4dc4 + for(int i = 0; i < nzz; i++){ + 46a: 2485 addiw s1,s1,1 + 46c: fd3493e3 bne s1,s3,432 + } +} + 470: 60a6 ld ra,72(sp) + 472: 6406 ld s0,64(sp) + 474: 74e2 ld s1,56(sp) + 476: 7942 ld s2,48(sp) + 478: 79a2 ld s3,40(sp) + 47a: 6161 addi sp,sp,80 + 47c: 8082 ret + +000000000000047e : +{ + 47e: 7159 addi sp,sp,-112 + 480: f486 sd ra,104(sp) + 482: f0a2 sd s0,96(sp) + 484: eca6 sd s1,88(sp) + 486: e8ca sd s2,80(sp) + 488: e4ce sd s3,72(sp) + 48a: e0d2 sd s4,64(sp) + 48c: fc56 sd s5,56(sp) + 48e: 1880 addi s0,sp,112 + uint64 addrs[] = { 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 490: 00007797 auipc a5,0x7 + 494: 45078793 addi a5,a5,1104 # 78e0 + 498: 638c ld a1,0(a5) + 49a: 6790 ld a2,8(a5) + 49c: 6b94 ld a3,16(a5) + 49e: 6f98 ld a4,24(a5) + 4a0: 739c ld a5,32(a5) + 4a2: f8b43c23 sd a1,-104(s0) + 4a6: fac43023 sd a2,-96(s0) + 4aa: fad43423 sd a3,-88(s0) + 4ae: fae43823 sd a4,-80(s0) + 4b2: faf43c23 sd a5,-72(s0) + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 4b6: f9840913 addi s2,s0,-104 + 4ba: fc040a93 addi s5,s0,-64 + int fd = open("copyin1", O_CREATE|O_WRONLY); + 4be: 00005a17 auipc s4,0x5 + 4c2: ff2a0a13 addi s4,s4,-14 # 54b0 + uint64 addr = addrs[ai]; + 4c6: 00093983 ld s3,0(s2) + int fd = open("copyin1", O_CREATE|O_WRONLY); + 4ca: 20100593 li a1,513 + 4ce: 8552 mv a0,s4 + 4d0: 0e5040ef jal 4db4 + 4d4: 84aa mv s1,a0 + if(fd < 0){ + 4d6: 06054763 bltz a0,544 + int n = write(fd, (void*)addr, 8192); + 4da: 6609 lui a2,0x2 + 4dc: 85ce mv a1,s3 + 4de: 0b7040ef jal 4d94 + if(n >= 0){ + 4e2: 06055a63 bgez a0,556 + close(fd); + 4e6: 8526 mv a0,s1 + 4e8: 0b5040ef jal 4d9c + unlink("copyin1"); + 4ec: 8552 mv a0,s4 + 4ee: 0d7040ef jal 4dc4 + n = write(1, (char*)addr, 8192); + 4f2: 6609 lui a2,0x2 + 4f4: 85ce mv a1,s3 + 4f6: 4505 li a0,1 + 4f8: 09d040ef jal 4d94 + if(n > 0){ + 4fc: 06a04863 bgtz a0,56c + if(pipe(fds) < 0){ + 500: f9040513 addi a0,s0,-112 + 504: 081040ef jal 4d84 + 508: 06054d63 bltz a0,582 + n = write(fds[1], (char*)addr, 8192); + 50c: 6609 lui a2,0x2 + 50e: 85ce mv a1,s3 + 510: f9442503 lw a0,-108(s0) + 514: 081040ef jal 4d94 + if(n > 0){ + 518: 06a04e63 bgtz a0,594 + close(fds[0]); + 51c: f9042503 lw a0,-112(s0) + 520: 07d040ef jal 4d9c + close(fds[1]); + 524: f9442503 lw a0,-108(s0) + 528: 075040ef jal 4d9c + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 52c: 0921 addi s2,s2,8 + 52e: f9591ce3 bne s2,s5,4c6 +} + 532: 70a6 ld ra,104(sp) + 534: 7406 ld s0,96(sp) + 536: 64e6 ld s1,88(sp) + 538: 6946 ld s2,80(sp) + 53a: 69a6 ld s3,72(sp) + 53c: 6a06 ld s4,64(sp) + 53e: 7ae2 ld s5,56(sp) + 540: 6165 addi sp,sp,112 + 542: 8082 ret + printf("open(copyin1) failed\n"); + 544: 00005517 auipc a0,0x5 + 548: f7450513 addi a0,a0,-140 # 54b8 + 54c: 469040ef jal 51b4 + exit(1); + 550: 4505 li a0,1 + 552: 023040ef jal 4d74 + printf("write(fd, %p, 8192) returned %d, not -1\n", (void*)addr, n); + 556: 862a mv a2,a0 + 558: 85ce mv a1,s3 + 55a: 00005517 auipc a0,0x5 + 55e: f7650513 addi a0,a0,-138 # 54d0 + 562: 453040ef jal 51b4 + exit(1); + 566: 4505 li a0,1 + 568: 00d040ef jal 4d74 + printf("write(1, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 56c: 862a mv a2,a0 + 56e: 85ce mv a1,s3 + 570: 00005517 auipc a0,0x5 + 574: f9050513 addi a0,a0,-112 # 5500 + 578: 43d040ef jal 51b4 + exit(1); + 57c: 4505 li a0,1 + 57e: 7f6040ef jal 4d74 + printf("pipe() failed\n"); + 582: 00005517 auipc a0,0x5 + 586: fae50513 addi a0,a0,-82 # 5530 + 58a: 42b040ef jal 51b4 + exit(1); + 58e: 4505 li a0,1 + 590: 7e4040ef jal 4d74 + printf("write(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 594: 862a mv a2,a0 + 596: 85ce mv a1,s3 + 598: 00005517 auipc a0,0x5 + 59c: fa850513 addi a0,a0,-88 # 5540 + 5a0: 415040ef jal 51b4 + exit(1); + 5a4: 4505 li a0,1 + 5a6: 7ce040ef jal 4d74 + +00000000000005aa : +{ + 5aa: 7119 addi sp,sp,-128 + 5ac: fc86 sd ra,120(sp) + 5ae: f8a2 sd s0,112(sp) + 5b0: f4a6 sd s1,104(sp) + 5b2: f0ca sd s2,96(sp) + 5b4: ecce sd s3,88(sp) + 5b6: e8d2 sd s4,80(sp) + 5b8: e4d6 sd s5,72(sp) + 5ba: e0da sd s6,64(sp) + 5bc: 0100 addi s0,sp,128 + uint64 addrs[] = { 0LL, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 5be: 00007797 auipc a5,0x7 + 5c2: 32278793 addi a5,a5,802 # 78e0 + 5c6: 7788 ld a0,40(a5) + 5c8: 7b8c ld a1,48(a5) + 5ca: 7f90 ld a2,56(a5) + 5cc: 63b4 ld a3,64(a5) + 5ce: 67b8 ld a4,72(a5) + 5d0: 6bbc ld a5,80(a5) + 5d2: f8a43823 sd a0,-112(s0) + 5d6: f8b43c23 sd a1,-104(s0) + 5da: fac43023 sd a2,-96(s0) + 5de: fad43423 sd a3,-88(s0) + 5e2: fae43823 sd a4,-80(s0) + 5e6: faf43c23 sd a5,-72(s0) + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 5ea: f9040913 addi s2,s0,-112 + 5ee: fc040b13 addi s6,s0,-64 + int fd = open("README", 0); + 5f2: 00005a17 auipc s4,0x5 + 5f6: f7ea0a13 addi s4,s4,-130 # 5570 + n = write(fds[1], "x", 1); + 5fa: 00005a97 auipc s5,0x5 + 5fe: e0ea8a93 addi s5,s5,-498 # 5408 + uint64 addr = addrs[ai]; + 602: 00093983 ld s3,0(s2) + int fd = open("README", 0); + 606: 4581 li a1,0 + 608: 8552 mv a0,s4 + 60a: 7aa040ef jal 4db4 + 60e: 84aa mv s1,a0 + if(fd < 0){ + 610: 06054763 bltz a0,67e + int n = read(fd, (void*)addr, 8192); + 614: 6609 lui a2,0x2 + 616: 85ce mv a1,s3 + 618: 774040ef jal 4d8c + if(n > 0){ + 61c: 06a04a63 bgtz a0,690 + close(fd); + 620: 8526 mv a0,s1 + 622: 77a040ef jal 4d9c + if(pipe(fds) < 0){ + 626: f8840513 addi a0,s0,-120 + 62a: 75a040ef jal 4d84 + 62e: 06054c63 bltz a0,6a6 + n = write(fds[1], "x", 1); + 632: 4605 li a2,1 + 634: 85d6 mv a1,s5 + 636: f8c42503 lw a0,-116(s0) + 63a: 75a040ef jal 4d94 + if(n != 1){ + 63e: 4785 li a5,1 + 640: 06f51c63 bne a0,a5,6b8 + n = read(fds[0], (void*)addr, 8192); + 644: 6609 lui a2,0x2 + 646: 85ce mv a1,s3 + 648: f8842503 lw a0,-120(s0) + 64c: 740040ef jal 4d8c + if(n > 0){ + 650: 06a04d63 bgtz a0,6ca + close(fds[0]); + 654: f8842503 lw a0,-120(s0) + 658: 744040ef jal 4d9c + close(fds[1]); + 65c: f8c42503 lw a0,-116(s0) + 660: 73c040ef jal 4d9c + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 664: 0921 addi s2,s2,8 + 666: f9691ee3 bne s2,s6,602 +} + 66a: 70e6 ld ra,120(sp) + 66c: 7446 ld s0,112(sp) + 66e: 74a6 ld s1,104(sp) + 670: 7906 ld s2,96(sp) + 672: 69e6 ld s3,88(sp) + 674: 6a46 ld s4,80(sp) + 676: 6aa6 ld s5,72(sp) + 678: 6b06 ld s6,64(sp) + 67a: 6109 addi sp,sp,128 + 67c: 8082 ret + printf("open(README) failed\n"); + 67e: 00005517 auipc a0,0x5 + 682: efa50513 addi a0,a0,-262 # 5578 + 686: 32f040ef jal 51b4 + exit(1); + 68a: 4505 li a0,1 + 68c: 6e8040ef jal 4d74 + printf("read(fd, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 690: 862a mv a2,a0 + 692: 85ce mv a1,s3 + 694: 00005517 auipc a0,0x5 + 698: efc50513 addi a0,a0,-260 # 5590 + 69c: 319040ef jal 51b4 + exit(1); + 6a0: 4505 li a0,1 + 6a2: 6d2040ef jal 4d74 + printf("pipe() failed\n"); + 6a6: 00005517 auipc a0,0x5 + 6aa: e8a50513 addi a0,a0,-374 # 5530 + 6ae: 307040ef jal 51b4 + exit(1); + 6b2: 4505 li a0,1 + 6b4: 6c0040ef jal 4d74 + printf("pipe write failed\n"); + 6b8: 00005517 auipc a0,0x5 + 6bc: f0850513 addi a0,a0,-248 # 55c0 + 6c0: 2f5040ef jal 51b4 + exit(1); + 6c4: 4505 li a0,1 + 6c6: 6ae040ef jal 4d74 + printf("read(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 6ca: 862a mv a2,a0 + 6cc: 85ce mv a1,s3 + 6ce: 00005517 auipc a0,0x5 + 6d2: f0a50513 addi a0,a0,-246 # 55d8 + 6d6: 2df040ef jal 51b4 + exit(1); + 6da: 4505 li a0,1 + 6dc: 698040ef jal 4d74 + +00000000000006e0 : +{ + 6e0: 711d addi sp,sp,-96 + 6e2: ec86 sd ra,88(sp) + 6e4: e8a2 sd s0,80(sp) + 6e6: e4a6 sd s1,72(sp) + 6e8: e0ca sd s2,64(sp) + 6ea: fc4e sd s3,56(sp) + 6ec: f852 sd s4,48(sp) + 6ee: f456 sd s5,40(sp) + 6f0: 1080 addi s0,sp,96 + 6f2: 8aaa mv s5,a0 + unlink("truncfile"); + 6f4: 00005517 auipc a0,0x5 + 6f8: cfc50513 addi a0,a0,-772 # 53f0 + 6fc: 6c8040ef jal 4dc4 + int fd1 = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); + 700: 60100593 li a1,1537 + 704: 00005517 auipc a0,0x5 + 708: cec50513 addi a0,a0,-788 # 53f0 + 70c: 6a8040ef jal 4db4 + 710: 84aa mv s1,a0 + write(fd1, "abcd", 4); + 712: 4611 li a2,4 + 714: 00005597 auipc a1,0x5 + 718: cec58593 addi a1,a1,-788 # 5400 + 71c: 678040ef jal 4d94 + close(fd1); + 720: 8526 mv a0,s1 + 722: 67a040ef jal 4d9c + int fd2 = open("truncfile", O_RDONLY); + 726: 4581 li a1,0 + 728: 00005517 auipc a0,0x5 + 72c: cc850513 addi a0,a0,-824 # 53f0 + 730: 684040ef jal 4db4 + 734: 84aa mv s1,a0 + int n = read(fd2, buf, sizeof(buf)); + 736: 02000613 li a2,32 + 73a: fa040593 addi a1,s0,-96 + 73e: 64e040ef jal 4d8c + if(n != 4){ + 742: 4791 li a5,4 + 744: 0af51863 bne a0,a5,7f4 + fd1 = open("truncfile", O_WRONLY|O_TRUNC); + 748: 40100593 li a1,1025 + 74c: 00005517 auipc a0,0x5 + 750: ca450513 addi a0,a0,-860 # 53f0 + 754: 660040ef jal 4db4 + 758: 89aa mv s3,a0 + int fd3 = open("truncfile", O_RDONLY); + 75a: 4581 li a1,0 + 75c: 00005517 auipc a0,0x5 + 760: c9450513 addi a0,a0,-876 # 53f0 + 764: 650040ef jal 4db4 + 768: 892a mv s2,a0 + n = read(fd3, buf, sizeof(buf)); + 76a: 02000613 li a2,32 + 76e: fa040593 addi a1,s0,-96 + 772: 61a040ef jal 4d8c + 776: 8a2a mv s4,a0 + if(n != 0){ + 778: e949 bnez a0,80a + n = read(fd2, buf, sizeof(buf)); + 77a: 02000613 li a2,32 + 77e: fa040593 addi a1,s0,-96 + 782: 8526 mv a0,s1 + 784: 608040ef jal 4d8c + 788: 8a2a mv s4,a0 + if(n != 0){ + 78a: e155 bnez a0,82e + write(fd1, "abcdef", 6); + 78c: 4619 li a2,6 + 78e: 00005597 auipc a1,0x5 + 792: eda58593 addi a1,a1,-294 # 5668 + 796: 854e mv a0,s3 + 798: 5fc040ef jal 4d94 + n = read(fd3, buf, sizeof(buf)); + 79c: 02000613 li a2,32 + 7a0: fa040593 addi a1,s0,-96 + 7a4: 854a mv a0,s2 + 7a6: 5e6040ef jal 4d8c + if(n != 6){ + 7aa: 4799 li a5,6 + 7ac: 0af51363 bne a0,a5,852 + n = read(fd2, buf, sizeof(buf)); + 7b0: 02000613 li a2,32 + 7b4: fa040593 addi a1,s0,-96 + 7b8: 8526 mv a0,s1 + 7ba: 5d2040ef jal 4d8c + if(n != 2){ + 7be: 4789 li a5,2 + 7c0: 0af51463 bne a0,a5,868 + unlink("truncfile"); + 7c4: 00005517 auipc a0,0x5 + 7c8: c2c50513 addi a0,a0,-980 # 53f0 + 7cc: 5f8040ef jal 4dc4 + close(fd1); + 7d0: 854e mv a0,s3 + 7d2: 5ca040ef jal 4d9c + close(fd2); + 7d6: 8526 mv a0,s1 + 7d8: 5c4040ef jal 4d9c + close(fd3); + 7dc: 854a mv a0,s2 + 7de: 5be040ef jal 4d9c +} + 7e2: 60e6 ld ra,88(sp) + 7e4: 6446 ld s0,80(sp) + 7e6: 64a6 ld s1,72(sp) + 7e8: 6906 ld s2,64(sp) + 7ea: 79e2 ld s3,56(sp) + 7ec: 7a42 ld s4,48(sp) + 7ee: 7aa2 ld s5,40(sp) + 7f0: 6125 addi sp,sp,96 + 7f2: 8082 ret + printf("%s: read %d bytes, wanted 4\n", s, n); + 7f4: 862a mv a2,a0 + 7f6: 85d6 mv a1,s5 + 7f8: 00005517 auipc a0,0x5 + 7fc: e1050513 addi a0,a0,-496 # 5608 + 800: 1b5040ef jal 51b4 + exit(1); + 804: 4505 li a0,1 + 806: 56e040ef jal 4d74 + printf("aaa fd3=%d\n", fd3); + 80a: 85ca mv a1,s2 + 80c: 00005517 auipc a0,0x5 + 810: e1c50513 addi a0,a0,-484 # 5628 + 814: 1a1040ef jal 51b4 + printf("%s: read %d bytes, wanted 0\n", s, n); + 818: 8652 mv a2,s4 + 81a: 85d6 mv a1,s5 + 81c: 00005517 auipc a0,0x5 + 820: e1c50513 addi a0,a0,-484 # 5638 + 824: 191040ef jal 51b4 + exit(1); + 828: 4505 li a0,1 + 82a: 54a040ef jal 4d74 + printf("bbb fd2=%d\n", fd2); + 82e: 85a6 mv a1,s1 + 830: 00005517 auipc a0,0x5 + 834: e2850513 addi a0,a0,-472 # 5658 + 838: 17d040ef jal 51b4 + printf("%s: read %d bytes, wanted 0\n", s, n); + 83c: 8652 mv a2,s4 + 83e: 85d6 mv a1,s5 + 840: 00005517 auipc a0,0x5 + 844: df850513 addi a0,a0,-520 # 5638 + 848: 16d040ef jal 51b4 + exit(1); + 84c: 4505 li a0,1 + 84e: 526040ef jal 4d74 + printf("%s: read %d bytes, wanted 6\n", s, n); + 852: 862a mv a2,a0 + 854: 85d6 mv a1,s5 + 856: 00005517 auipc a0,0x5 + 85a: e1a50513 addi a0,a0,-486 # 5670 + 85e: 157040ef jal 51b4 + exit(1); + 862: 4505 li a0,1 + 864: 510040ef jal 4d74 + printf("%s: read %d bytes, wanted 2\n", s, n); + 868: 862a mv a2,a0 + 86a: 85d6 mv a1,s5 + 86c: 00005517 auipc a0,0x5 + 870: e2450513 addi a0,a0,-476 # 5690 + 874: 141040ef jal 51b4 + exit(1); + 878: 4505 li a0,1 + 87a: 4fa040ef jal 4d74 + +000000000000087e : +{ + 87e: 7139 addi sp,sp,-64 + 880: fc06 sd ra,56(sp) + 882: f822 sd s0,48(sp) + 884: f426 sd s1,40(sp) + 886: f04a sd s2,32(sp) + 888: ec4e sd s3,24(sp) + 88a: e852 sd s4,16(sp) + 88c: e456 sd s5,8(sp) + 88e: e05a sd s6,0(sp) + 890: 0080 addi s0,sp,64 + 892: 8b2a mv s6,a0 + fd = open("small", O_CREATE|O_RDWR); + 894: 20200593 li a1,514 + 898: 00005517 auipc a0,0x5 + 89c: e1850513 addi a0,a0,-488 # 56b0 + 8a0: 514040ef jal 4db4 + if(fd < 0){ + 8a4: 08054f63 bltz a0,942 + 8a8: 892a mv s2,a0 + 8aa: 4481 li s1,0 + if(write(fd, "aaaaaaaaaa", SZ) != SZ){ + 8ac: 00005997 auipc s3,0x5 + 8b0: e2c98993 addi s3,s3,-468 # 56d8 + if(write(fd, "bbbbbbbbbb", SZ) != SZ){ + 8b4: 00005a97 auipc s5,0x5 + 8b8: e5ca8a93 addi s5,s5,-420 # 5710 + for(i = 0; i < N; i++){ + 8bc: 06400a13 li s4,100 + if(write(fd, "aaaaaaaaaa", SZ) != SZ){ + 8c0: 4629 li a2,10 + 8c2: 85ce mv a1,s3 + 8c4: 854a mv a0,s2 + 8c6: 4ce040ef jal 4d94 + 8ca: 47a9 li a5,10 + 8cc: 08f51563 bne a0,a5,956 + if(write(fd, "bbbbbbbbbb", SZ) != SZ){ + 8d0: 4629 li a2,10 + 8d2: 85d6 mv a1,s5 + 8d4: 854a mv a0,s2 + 8d6: 4be040ef jal 4d94 + 8da: 47a9 li a5,10 + 8dc: 08f51863 bne a0,a5,96c + for(i = 0; i < N; i++){ + 8e0: 2485 addiw s1,s1,1 + 8e2: fd449fe3 bne s1,s4,8c0 + close(fd); + 8e6: 854a mv a0,s2 + 8e8: 4b4040ef jal 4d9c + fd = open("small", O_RDONLY); + 8ec: 4581 li a1,0 + 8ee: 00005517 auipc a0,0x5 + 8f2: dc250513 addi a0,a0,-574 # 56b0 + 8f6: 4be040ef jal 4db4 + 8fa: 84aa mv s1,a0 + if(fd < 0){ + 8fc: 08054363 bltz a0,982 + i = read(fd, buf, N*SZ*2); + 900: 7d000613 li a2,2000 + 904: 0000c597 auipc a1,0xc + 908: 3b458593 addi a1,a1,948 # ccb8 + 90c: 480040ef jal 4d8c + if(i != N*SZ*2){ + 910: 7d000793 li a5,2000 + 914: 08f51163 bne a0,a5,996 + close(fd); + 918: 8526 mv a0,s1 + 91a: 482040ef jal 4d9c + if(unlink("small") < 0){ + 91e: 00005517 auipc a0,0x5 + 922: d9250513 addi a0,a0,-622 # 56b0 + 926: 49e040ef jal 4dc4 + 92a: 08054063 bltz a0,9aa +} + 92e: 70e2 ld ra,56(sp) + 930: 7442 ld s0,48(sp) + 932: 74a2 ld s1,40(sp) + 934: 7902 ld s2,32(sp) + 936: 69e2 ld s3,24(sp) + 938: 6a42 ld s4,16(sp) + 93a: 6aa2 ld s5,8(sp) + 93c: 6b02 ld s6,0(sp) + 93e: 6121 addi sp,sp,64 + 940: 8082 ret + printf("%s: error: creat small failed!\n", s); + 942: 85da mv a1,s6 + 944: 00005517 auipc a0,0x5 + 948: d7450513 addi a0,a0,-652 # 56b8 + 94c: 069040ef jal 51b4 + exit(1); + 950: 4505 li a0,1 + 952: 422040ef jal 4d74 + printf("%s: error: write aa %d new file failed\n", s, i); + 956: 8626 mv a2,s1 + 958: 85da mv a1,s6 + 95a: 00005517 auipc a0,0x5 + 95e: d8e50513 addi a0,a0,-626 # 56e8 + 962: 053040ef jal 51b4 + exit(1); + 966: 4505 li a0,1 + 968: 40c040ef jal 4d74 + printf("%s: error: write bb %d new file failed\n", s, i); + 96c: 8626 mv a2,s1 + 96e: 85da mv a1,s6 + 970: 00005517 auipc a0,0x5 + 974: db050513 addi a0,a0,-592 # 5720 + 978: 03d040ef jal 51b4 + exit(1); + 97c: 4505 li a0,1 + 97e: 3f6040ef jal 4d74 + printf("%s: error: open small failed!\n", s); + 982: 85da mv a1,s6 + 984: 00005517 auipc a0,0x5 + 988: dc450513 addi a0,a0,-572 # 5748 + 98c: 029040ef jal 51b4 + exit(1); + 990: 4505 li a0,1 + 992: 3e2040ef jal 4d74 + printf("%s: read failed\n", s); + 996: 85da mv a1,s6 + 998: 00005517 auipc a0,0x5 + 99c: dd050513 addi a0,a0,-560 # 5768 + 9a0: 015040ef jal 51b4 + exit(1); + 9a4: 4505 li a0,1 + 9a6: 3ce040ef jal 4d74 + printf("%s: unlink small failed\n", s); + 9aa: 85da mv a1,s6 + 9ac: 00005517 auipc a0,0x5 + 9b0: dd450513 addi a0,a0,-556 # 5780 + 9b4: 001040ef jal 51b4 + exit(1); + 9b8: 4505 li a0,1 + 9ba: 3ba040ef jal 4d74 + +00000000000009be : +{ + 9be: 7139 addi sp,sp,-64 + 9c0: fc06 sd ra,56(sp) + 9c2: f822 sd s0,48(sp) + 9c4: f426 sd s1,40(sp) + 9c6: f04a sd s2,32(sp) + 9c8: ec4e sd s3,24(sp) + 9ca: e852 sd s4,16(sp) + 9cc: e456 sd s5,8(sp) + 9ce: 0080 addi s0,sp,64 + 9d0: 8aaa mv s5,a0 + fd = open("big", O_CREATE|O_RDWR); + 9d2: 20200593 li a1,514 + 9d6: 00005517 auipc a0,0x5 + 9da: dca50513 addi a0,a0,-566 # 57a0 + 9de: 3d6040ef jal 4db4 + 9e2: 89aa mv s3,a0 + for(i = 0; i < MAXFILE; i++){ + 9e4: 4481 li s1,0 + ((int*)buf)[0] = i; + 9e6: 0000c917 auipc s2,0xc + 9ea: 2d290913 addi s2,s2,722 # ccb8 + for(i = 0; i < MAXFILE; i++){ + 9ee: 10c00a13 li s4,268 + if(fd < 0){ + 9f2: 06054463 bltz a0,a5a + ((int*)buf)[0] = i; + 9f6: 00992023 sw s1,0(s2) + if(write(fd, buf, BSIZE) != BSIZE){ + 9fa: 40000613 li a2,1024 + 9fe: 85ca mv a1,s2 + a00: 854e mv a0,s3 + a02: 392040ef jal 4d94 + a06: 40000793 li a5,1024 + a0a: 06f51263 bne a0,a5,a6e + for(i = 0; i < MAXFILE; i++){ + a0e: 2485 addiw s1,s1,1 + a10: ff4493e3 bne s1,s4,9f6 + close(fd); + a14: 854e mv a0,s3 + a16: 386040ef jal 4d9c + fd = open("big", O_RDONLY); + a1a: 4581 li a1,0 + a1c: 00005517 auipc a0,0x5 + a20: d8450513 addi a0,a0,-636 # 57a0 + a24: 390040ef jal 4db4 + a28: 89aa mv s3,a0 + n = 0; + a2a: 4481 li s1,0 + i = read(fd, buf, BSIZE); + a2c: 0000c917 auipc s2,0xc + a30: 28c90913 addi s2,s2,652 # ccb8 + if(fd < 0){ + a34: 04054863 bltz a0,a84 + i = read(fd, buf, BSIZE); + a38: 40000613 li a2,1024 + a3c: 85ca mv a1,s2 + a3e: 854e mv a0,s3 + a40: 34c040ef jal 4d8c + if(i == 0){ + a44: c931 beqz a0,a98 + } else if(i != BSIZE){ + a46: 40000793 li a5,1024 + a4a: 08f51a63 bne a0,a5,ade + if(((int*)buf)[0] != n){ + a4e: 00092683 lw a3,0(s2) + a52: 0a969163 bne a3,s1,af4 + n++; + a56: 2485 addiw s1,s1,1 + i = read(fd, buf, BSIZE); + a58: b7c5 j a38 + printf("%s: error: creat big failed!\n", s); + a5a: 85d6 mv a1,s5 + a5c: 00005517 auipc a0,0x5 + a60: d4c50513 addi a0,a0,-692 # 57a8 + a64: 750040ef jal 51b4 + exit(1); + a68: 4505 li a0,1 + a6a: 30a040ef jal 4d74 + printf("%s: error: write big file failed i=%d\n", s, i); + a6e: 8626 mv a2,s1 + a70: 85d6 mv a1,s5 + a72: 00005517 auipc a0,0x5 + a76: d5650513 addi a0,a0,-682 # 57c8 + a7a: 73a040ef jal 51b4 + exit(1); + a7e: 4505 li a0,1 + a80: 2f4040ef jal 4d74 + printf("%s: error: open big failed!\n", s); + a84: 85d6 mv a1,s5 + a86: 00005517 auipc a0,0x5 + a8a: d6a50513 addi a0,a0,-662 # 57f0 + a8e: 726040ef jal 51b4 + exit(1); + a92: 4505 li a0,1 + a94: 2e0040ef jal 4d74 + if(n != MAXFILE){ + a98: 10c00793 li a5,268 + a9c: 02f49663 bne s1,a5,ac8 + close(fd); + aa0: 854e mv a0,s3 + aa2: 2fa040ef jal 4d9c + if(unlink("big") < 0){ + aa6: 00005517 auipc a0,0x5 + aaa: cfa50513 addi a0,a0,-774 # 57a0 + aae: 316040ef jal 4dc4 + ab2: 04054c63 bltz a0,b0a +} + ab6: 70e2 ld ra,56(sp) + ab8: 7442 ld s0,48(sp) + aba: 74a2 ld s1,40(sp) + abc: 7902 ld s2,32(sp) + abe: 69e2 ld s3,24(sp) + ac0: 6a42 ld s4,16(sp) + ac2: 6aa2 ld s5,8(sp) + ac4: 6121 addi sp,sp,64 + ac6: 8082 ret + printf("%s: read only %d blocks from big", s, n); + ac8: 8626 mv a2,s1 + aca: 85d6 mv a1,s5 + acc: 00005517 auipc a0,0x5 + ad0: d4450513 addi a0,a0,-700 # 5810 + ad4: 6e0040ef jal 51b4 + exit(1); + ad8: 4505 li a0,1 + ada: 29a040ef jal 4d74 + printf("%s: read failed %d\n", s, i); + ade: 862a mv a2,a0 + ae0: 85d6 mv a1,s5 + ae2: 00005517 auipc a0,0x5 + ae6: d5650513 addi a0,a0,-682 # 5838 + aea: 6ca040ef jal 51b4 + exit(1); + aee: 4505 li a0,1 + af0: 284040ef jal 4d74 + printf("%s: read content of block %d is %d\n", s, + af4: 8626 mv a2,s1 + af6: 85d6 mv a1,s5 + af8: 00005517 auipc a0,0x5 + afc: d5850513 addi a0,a0,-680 # 5850 + b00: 6b4040ef jal 51b4 + exit(1); + b04: 4505 li a0,1 + b06: 26e040ef jal 4d74 + printf("%s: unlink big failed\n", s); + b0a: 85d6 mv a1,s5 + b0c: 00005517 auipc a0,0x5 + b10: d6c50513 addi a0,a0,-660 # 5878 + b14: 6a0040ef jal 51b4 + exit(1); + b18: 4505 li a0,1 + b1a: 25a040ef jal 4d74 + +0000000000000b1e : +{ + b1e: 7179 addi sp,sp,-48 + b20: f406 sd ra,40(sp) + b22: f022 sd s0,32(sp) + b24: ec26 sd s1,24(sp) + b26: e84a sd s2,16(sp) + b28: e44e sd s3,8(sp) + b2a: 1800 addi s0,sp,48 + b2c: 89aa mv s3,a0 + fd = open("unlinkread", O_CREATE | O_RDWR); + b2e: 20200593 li a1,514 + b32: 00005517 auipc a0,0x5 + b36: d5e50513 addi a0,a0,-674 # 5890 + b3a: 27a040ef jal 4db4 + if(fd < 0){ + b3e: 0a054f63 bltz a0,bfc + b42: 84aa mv s1,a0 + write(fd, "hello", SZ); + b44: 4615 li a2,5 + b46: 00005597 auipc a1,0x5 + b4a: d7a58593 addi a1,a1,-646 # 58c0 + b4e: 246040ef jal 4d94 + close(fd); + b52: 8526 mv a0,s1 + b54: 248040ef jal 4d9c + fd = open("unlinkread", O_RDWR); + b58: 4589 li a1,2 + b5a: 00005517 auipc a0,0x5 + b5e: d3650513 addi a0,a0,-714 # 5890 + b62: 252040ef jal 4db4 + b66: 84aa mv s1,a0 + if(fd < 0){ + b68: 0a054463 bltz a0,c10 + if(unlink("unlinkread") != 0){ + b6c: 00005517 auipc a0,0x5 + b70: d2450513 addi a0,a0,-732 # 5890 + b74: 250040ef jal 4dc4 + b78: e555 bnez a0,c24 + fd1 = open("unlinkread", O_CREATE | O_RDWR); + b7a: 20200593 li a1,514 + b7e: 00005517 auipc a0,0x5 + b82: d1250513 addi a0,a0,-750 # 5890 + b86: 22e040ef jal 4db4 + b8a: 892a mv s2,a0 + write(fd1, "yyy", 3); + b8c: 460d li a2,3 + b8e: 00005597 auipc a1,0x5 + b92: d7a58593 addi a1,a1,-646 # 5908 + b96: 1fe040ef jal 4d94 + close(fd1); + b9a: 854a mv a0,s2 + b9c: 200040ef jal 4d9c + if(read(fd, buf, sizeof(buf)) != SZ){ + ba0: 660d lui a2,0x3 + ba2: 0000c597 auipc a1,0xc + ba6: 11658593 addi a1,a1,278 # ccb8 + baa: 8526 mv a0,s1 + bac: 1e0040ef jal 4d8c + bb0: 4795 li a5,5 + bb2: 08f51363 bne a0,a5,c38 + if(buf[0] != 'h'){ + bb6: 0000c717 auipc a4,0xc + bba: 10274703 lbu a4,258(a4) # ccb8 + bbe: 06800793 li a5,104 + bc2: 08f71563 bne a4,a5,c4c + if(write(fd, buf, 10) != 10){ + bc6: 4629 li a2,10 + bc8: 0000c597 auipc a1,0xc + bcc: 0f058593 addi a1,a1,240 # ccb8 + bd0: 8526 mv a0,s1 + bd2: 1c2040ef jal 4d94 + bd6: 47a9 li a5,10 + bd8: 08f51463 bne a0,a5,c60 + close(fd); + bdc: 8526 mv a0,s1 + bde: 1be040ef jal 4d9c + unlink("unlinkread"); + be2: 00005517 auipc a0,0x5 + be6: cae50513 addi a0,a0,-850 # 5890 + bea: 1da040ef jal 4dc4 +} + bee: 70a2 ld ra,40(sp) + bf0: 7402 ld s0,32(sp) + bf2: 64e2 ld s1,24(sp) + bf4: 6942 ld s2,16(sp) + bf6: 69a2 ld s3,8(sp) + bf8: 6145 addi sp,sp,48 + bfa: 8082 ret + printf("%s: create unlinkread failed\n", s); + bfc: 85ce mv a1,s3 + bfe: 00005517 auipc a0,0x5 + c02: ca250513 addi a0,a0,-862 # 58a0 + c06: 5ae040ef jal 51b4 + exit(1); + c0a: 4505 li a0,1 + c0c: 168040ef jal 4d74 + printf("%s: open unlinkread failed\n", s); + c10: 85ce mv a1,s3 + c12: 00005517 auipc a0,0x5 + c16: cb650513 addi a0,a0,-842 # 58c8 + c1a: 59a040ef jal 51b4 + exit(1); + c1e: 4505 li a0,1 + c20: 154040ef jal 4d74 + printf("%s: unlink unlinkread failed\n", s); + c24: 85ce mv a1,s3 + c26: 00005517 auipc a0,0x5 + c2a: cc250513 addi a0,a0,-830 # 58e8 + c2e: 586040ef jal 51b4 + exit(1); + c32: 4505 li a0,1 + c34: 140040ef jal 4d74 + printf("%s: unlinkread read failed", s); + c38: 85ce mv a1,s3 + c3a: 00005517 auipc a0,0x5 + c3e: cd650513 addi a0,a0,-810 # 5910 + c42: 572040ef jal 51b4 + exit(1); + c46: 4505 li a0,1 + c48: 12c040ef jal 4d74 + printf("%s: unlinkread wrong data\n", s); + c4c: 85ce mv a1,s3 + c4e: 00005517 auipc a0,0x5 + c52: ce250513 addi a0,a0,-798 # 5930 + c56: 55e040ef jal 51b4 + exit(1); + c5a: 4505 li a0,1 + c5c: 118040ef jal 4d74 + printf("%s: unlinkread write failed\n", s); + c60: 85ce mv a1,s3 + c62: 00005517 auipc a0,0x5 + c66: cee50513 addi a0,a0,-786 # 5950 + c6a: 54a040ef jal 51b4 + exit(1); + c6e: 4505 li a0,1 + c70: 104040ef jal 4d74 + +0000000000000c74 : +{ + c74: 1101 addi sp,sp,-32 + c76: ec06 sd ra,24(sp) + c78: e822 sd s0,16(sp) + c7a: e426 sd s1,8(sp) + c7c: e04a sd s2,0(sp) + c7e: 1000 addi s0,sp,32 + c80: 892a mv s2,a0 + unlink("lf1"); + c82: 00005517 auipc a0,0x5 + c86: cee50513 addi a0,a0,-786 # 5970 + c8a: 13a040ef jal 4dc4 + unlink("lf2"); + c8e: 00005517 auipc a0,0x5 + c92: cea50513 addi a0,a0,-790 # 5978 + c96: 12e040ef jal 4dc4 + fd = open("lf1", O_CREATE|O_RDWR); + c9a: 20200593 li a1,514 + c9e: 00005517 auipc a0,0x5 + ca2: cd250513 addi a0,a0,-814 # 5970 + ca6: 10e040ef jal 4db4 + if(fd < 0){ + caa: 0c054f63 bltz a0,d88 + cae: 84aa mv s1,a0 + if(write(fd, "hello", SZ) != SZ){ + cb0: 4615 li a2,5 + cb2: 00005597 auipc a1,0x5 + cb6: c0e58593 addi a1,a1,-1010 # 58c0 + cba: 0da040ef jal 4d94 + cbe: 4795 li a5,5 + cc0: 0cf51e63 bne a0,a5,d9c + close(fd); + cc4: 8526 mv a0,s1 + cc6: 0d6040ef jal 4d9c + if(link("lf1", "lf2") < 0){ + cca: 00005597 auipc a1,0x5 + cce: cae58593 addi a1,a1,-850 # 5978 + cd2: 00005517 auipc a0,0x5 + cd6: c9e50513 addi a0,a0,-866 # 5970 + cda: 0fa040ef jal 4dd4 + cde: 0c054963 bltz a0,db0 + unlink("lf1"); + ce2: 00005517 auipc a0,0x5 + ce6: c8e50513 addi a0,a0,-882 # 5970 + cea: 0da040ef jal 4dc4 + if(open("lf1", 0) >= 0){ + cee: 4581 li a1,0 + cf0: 00005517 auipc a0,0x5 + cf4: c8050513 addi a0,a0,-896 # 5970 + cf8: 0bc040ef jal 4db4 + cfc: 0c055463 bgez a0,dc4 + fd = open("lf2", 0); + d00: 4581 li a1,0 + d02: 00005517 auipc a0,0x5 + d06: c7650513 addi a0,a0,-906 # 5978 + d0a: 0aa040ef jal 4db4 + d0e: 84aa mv s1,a0 + if(fd < 0){ + d10: 0c054463 bltz a0,dd8 + if(read(fd, buf, sizeof(buf)) != SZ){ + d14: 660d lui a2,0x3 + d16: 0000c597 auipc a1,0xc + d1a: fa258593 addi a1,a1,-94 # ccb8 + d1e: 06e040ef jal 4d8c + d22: 4795 li a5,5 + d24: 0cf51463 bne a0,a5,dec + close(fd); + d28: 8526 mv a0,s1 + d2a: 072040ef jal 4d9c + if(link("lf2", "lf2") >= 0){ + d2e: 00005597 auipc a1,0x5 + d32: c4a58593 addi a1,a1,-950 # 5978 + d36: 852e mv a0,a1 + d38: 09c040ef jal 4dd4 + d3c: 0c055263 bgez a0,e00 + unlink("lf2"); + d40: 00005517 auipc a0,0x5 + d44: c3850513 addi a0,a0,-968 # 5978 + d48: 07c040ef jal 4dc4 + if(link("lf2", "lf1") >= 0){ + d4c: 00005597 auipc a1,0x5 + d50: c2458593 addi a1,a1,-988 # 5970 + d54: 00005517 auipc a0,0x5 + d58: c2450513 addi a0,a0,-988 # 5978 + d5c: 078040ef jal 4dd4 + d60: 0a055a63 bgez a0,e14 + if(link(".", "lf1") >= 0){ + d64: 00005597 auipc a1,0x5 + d68: c0c58593 addi a1,a1,-1012 # 5970 + d6c: 00005517 auipc a0,0x5 + d70: d1450513 addi a0,a0,-748 # 5a80 + d74: 060040ef jal 4dd4 + d78: 0a055863 bgez a0,e28 +} + d7c: 60e2 ld ra,24(sp) + d7e: 6442 ld s0,16(sp) + d80: 64a2 ld s1,8(sp) + d82: 6902 ld s2,0(sp) + d84: 6105 addi sp,sp,32 + d86: 8082 ret + printf("%s: create lf1 failed\n", s); + d88: 85ca mv a1,s2 + d8a: 00005517 auipc a0,0x5 + d8e: bf650513 addi a0,a0,-1034 # 5980 + d92: 422040ef jal 51b4 + exit(1); + d96: 4505 li a0,1 + d98: 7dd030ef jal 4d74 + printf("%s: write lf1 failed\n", s); + d9c: 85ca mv a1,s2 + d9e: 00005517 auipc a0,0x5 + da2: bfa50513 addi a0,a0,-1030 # 5998 + da6: 40e040ef jal 51b4 + exit(1); + daa: 4505 li a0,1 + dac: 7c9030ef jal 4d74 + printf("%s: link lf1 lf2 failed\n", s); + db0: 85ca mv a1,s2 + db2: 00005517 auipc a0,0x5 + db6: bfe50513 addi a0,a0,-1026 # 59b0 + dba: 3fa040ef jal 51b4 + exit(1); + dbe: 4505 li a0,1 + dc0: 7b5030ef jal 4d74 + printf("%s: unlinked lf1 but it is still there!\n", s); + dc4: 85ca mv a1,s2 + dc6: 00005517 auipc a0,0x5 + dca: c0a50513 addi a0,a0,-1014 # 59d0 + dce: 3e6040ef jal 51b4 + exit(1); + dd2: 4505 li a0,1 + dd4: 7a1030ef jal 4d74 + printf("%s: open lf2 failed\n", s); + dd8: 85ca mv a1,s2 + dda: 00005517 auipc a0,0x5 + dde: c2650513 addi a0,a0,-986 # 5a00 + de2: 3d2040ef jal 51b4 + exit(1); + de6: 4505 li a0,1 + de8: 78d030ef jal 4d74 + printf("%s: read lf2 failed\n", s); + dec: 85ca mv a1,s2 + dee: 00005517 auipc a0,0x5 + df2: c2a50513 addi a0,a0,-982 # 5a18 + df6: 3be040ef jal 51b4 + exit(1); + dfa: 4505 li a0,1 + dfc: 779030ef jal 4d74 + printf("%s: link lf2 lf2 succeeded! oops\n", s); + e00: 85ca mv a1,s2 + e02: 00005517 auipc a0,0x5 + e06: c2e50513 addi a0,a0,-978 # 5a30 + e0a: 3aa040ef jal 51b4 + exit(1); + e0e: 4505 li a0,1 + e10: 765030ef jal 4d74 + printf("%s: link non-existent succeeded! oops\n", s); + e14: 85ca mv a1,s2 + e16: 00005517 auipc a0,0x5 + e1a: c4250513 addi a0,a0,-958 # 5a58 + e1e: 396040ef jal 51b4 + exit(1); + e22: 4505 li a0,1 + e24: 751030ef jal 4d74 + printf("%s: link . lf1 succeeded! oops\n", s); + e28: 85ca mv a1,s2 + e2a: 00005517 auipc a0,0x5 + e2e: c5e50513 addi a0,a0,-930 # 5a88 + e32: 382040ef jal 51b4 + exit(1); + e36: 4505 li a0,1 + e38: 73d030ef jal 4d74 + +0000000000000e3c : +{ + e3c: 7139 addi sp,sp,-64 + e3e: fc06 sd ra,56(sp) + e40: f822 sd s0,48(sp) + e42: f426 sd s1,40(sp) + e44: f04a sd s2,32(sp) + e46: ec4e sd s3,24(sp) + e48: e852 sd s4,16(sp) + e4a: e456 sd s5,8(sp) + e4c: e05a sd s6,0(sp) + e4e: 0080 addi s0,sp,64 + e50: 8b2a mv s6,a0 + for(p = 0; p <= (uint)hi; p += PGSIZE){ + e52: 4481 li s1,0 + if(link("nosuchfile", (char*)p) != -1){ + e54: 00005997 auipc s3,0x5 + e58: c5498993 addi s3,s3,-940 # 5aa8 + e5c: 597d li s2,-1 + for(p = 0; p <= (uint)hi; p += PGSIZE){ + e5e: 6a85 lui s5,0x1 + e60: 00114a37 lui s4,0x114 + if(link("nosuchfile", (char*)p) != -1){ + e64: 85a6 mv a1,s1 + e66: 854e mv a0,s3 + e68: 76d030ef jal 4dd4 + e6c: 01251f63 bne a0,s2,e8a + for(p = 0; p <= (uint)hi; p += PGSIZE){ + e70: 94d6 add s1,s1,s5 + e72: ff4499e3 bne s1,s4,e64 +} + e76: 70e2 ld ra,56(sp) + e78: 7442 ld s0,48(sp) + e7a: 74a2 ld s1,40(sp) + e7c: 7902 ld s2,32(sp) + e7e: 69e2 ld s3,24(sp) + e80: 6a42 ld s4,16(sp) + e82: 6aa2 ld s5,8(sp) + e84: 6b02 ld s6,0(sp) + e86: 6121 addi sp,sp,64 + e88: 8082 ret + printf("%s: link should not succeed\n", s); + e8a: 85da mv a1,s6 + e8c: 00005517 auipc a0,0x5 + e90: c2c50513 addi a0,a0,-980 # 5ab8 + e94: 320040ef jal 51b4 + exit(1); + e98: 4505 li a0,1 + e9a: 6db030ef jal 4d74 + +0000000000000e9e : +{ + e9e: 715d addi sp,sp,-80 + ea0: e486 sd ra,72(sp) + ea2: e0a2 sd s0,64(sp) + ea4: fc26 sd s1,56(sp) + ea6: f84a sd s2,48(sp) + ea8: f44e sd s3,40(sp) + eaa: f052 sd s4,32(sp) + eac: ec56 sd s5,24(sp) + eae: e85a sd s6,16(sp) + eb0: 0880 addi s0,sp,80 + eb2: 89aa mv s3,a0 + unlink("bd"); + eb4: 00005517 auipc a0,0x5 + eb8: c2450513 addi a0,a0,-988 # 5ad8 + ebc: 709030ef jal 4dc4 + fd = open("bd", O_CREATE); + ec0: 20000593 li a1,512 + ec4: 00005517 auipc a0,0x5 + ec8: c1450513 addi a0,a0,-1004 # 5ad8 + ecc: 6e9030ef jal 4db4 + if(fd < 0){ + ed0: 0c054163 bltz a0,f92 + close(fd); + ed4: 6c9030ef jal 4d9c + for(i = 0; i < N; i++){ + ed8: 4901 li s2,0 + name[0] = 'x'; + eda: 07800a93 li s5,120 + if(link("bd", name) != 0){ + ede: 00005a17 auipc s4,0x5 + ee2: bfaa0a13 addi s4,s4,-1030 # 5ad8 + for(i = 0; i < N; i++){ + ee6: 1f400b13 li s6,500 + name[0] = 'x'; + eea: fb540823 sb s5,-80(s0) + name[1] = '0' + (i / 64); + eee: 41f9571b sraiw a4,s2,0x1f + ef2: 01a7571b srliw a4,a4,0x1a + ef6: 012707bb addw a5,a4,s2 + efa: 4067d69b sraiw a3,a5,0x6 + efe: 0306869b addiw a3,a3,48 + f02: fad408a3 sb a3,-79(s0) + name[2] = '0' + (i % 64); + f06: 03f7f793 andi a5,a5,63 + f0a: 9f99 subw a5,a5,a4 + f0c: 0307879b addiw a5,a5,48 + f10: faf40923 sb a5,-78(s0) + name[3] = '\0'; + f14: fa0409a3 sb zero,-77(s0) + if(link("bd", name) != 0){ + f18: fb040593 addi a1,s0,-80 + f1c: 8552 mv a0,s4 + f1e: 6b7030ef jal 4dd4 + f22: 84aa mv s1,a0 + f24: e149 bnez a0,fa6 + for(i = 0; i < N; i++){ + f26: 2905 addiw s2,s2,1 + f28: fd6911e3 bne s2,s6,eea + unlink("bd"); + f2c: 00005517 auipc a0,0x5 + f30: bac50513 addi a0,a0,-1108 # 5ad8 + f34: 691030ef jal 4dc4 + name[0] = 'x'; + f38: 07800913 li s2,120 + for(i = 0; i < N; i++){ + f3c: 1f400a13 li s4,500 + name[0] = 'x'; + f40: fb240823 sb s2,-80(s0) + name[1] = '0' + (i / 64); + f44: 41f4d71b sraiw a4,s1,0x1f + f48: 01a7571b srliw a4,a4,0x1a + f4c: 009707bb addw a5,a4,s1 + f50: 4067d69b sraiw a3,a5,0x6 + f54: 0306869b addiw a3,a3,48 + f58: fad408a3 sb a3,-79(s0) + name[2] = '0' + (i % 64); + f5c: 03f7f793 andi a5,a5,63 + f60: 9f99 subw a5,a5,a4 + f62: 0307879b addiw a5,a5,48 + f66: faf40923 sb a5,-78(s0) + name[3] = '\0'; + f6a: fa0409a3 sb zero,-77(s0) + if(unlink(name) != 0){ + f6e: fb040513 addi a0,s0,-80 + f72: 653030ef jal 4dc4 + f76: e529 bnez a0,fc0 + for(i = 0; i < N; i++){ + f78: 2485 addiw s1,s1,1 + f7a: fd4493e3 bne s1,s4,f40 +} + f7e: 60a6 ld ra,72(sp) + f80: 6406 ld s0,64(sp) + f82: 74e2 ld s1,56(sp) + f84: 7942 ld s2,48(sp) + f86: 79a2 ld s3,40(sp) + f88: 7a02 ld s4,32(sp) + f8a: 6ae2 ld s5,24(sp) + f8c: 6b42 ld s6,16(sp) + f8e: 6161 addi sp,sp,80 + f90: 8082 ret + printf("%s: bigdir create failed\n", s); + f92: 85ce mv a1,s3 + f94: 00005517 auipc a0,0x5 + f98: b4c50513 addi a0,a0,-1204 # 5ae0 + f9c: 218040ef jal 51b4 + exit(1); + fa0: 4505 li a0,1 + fa2: 5d3030ef jal 4d74 + printf("%s: bigdir i=%d link(bd, %s) failed\n", s, i, name); + fa6: fb040693 addi a3,s0,-80 + faa: 864a mv a2,s2 + fac: 85ce mv a1,s3 + fae: 00005517 auipc a0,0x5 + fb2: b5250513 addi a0,a0,-1198 # 5b00 + fb6: 1fe040ef jal 51b4 + exit(1); + fba: 4505 li a0,1 + fbc: 5b9030ef jal 4d74 + printf("%s: bigdir unlink failed", s); + fc0: 85ce mv a1,s3 + fc2: 00005517 auipc a0,0x5 + fc6: b6650513 addi a0,a0,-1178 # 5b28 + fca: 1ea040ef jal 51b4 + exit(1); + fce: 4505 li a0,1 + fd0: 5a5030ef jal 4d74 + +0000000000000fd4 : +{ + fd4: 7179 addi sp,sp,-48 + fd6: f406 sd ra,40(sp) + fd8: f022 sd s0,32(sp) + fda: ec26 sd s1,24(sp) + fdc: 1800 addi s0,sp,48 + argv[0] = 0; + fde: fc043c23 sd zero,-40(s0) + exec(big, argv); + fe2: 00008497 auipc s1,0x8 + fe6: 01e48493 addi s1,s1,30 # 9000 + fea: fd840593 addi a1,s0,-40 + fee: 6088 ld a0,0(s1) + ff0: 5bd030ef jal 4dac + pipe(big); + ff4: 6088 ld a0,0(s1) + ff6: 58f030ef jal 4d84 + exit(0); + ffa: 4501 li a0,0 + ffc: 579030ef jal 4d74 + +0000000000001000 : +{ + 1000: 7139 addi sp,sp,-64 + 1002: fc06 sd ra,56(sp) + 1004: f822 sd s0,48(sp) + 1006: f426 sd s1,40(sp) + 1008: f04a sd s2,32(sp) + 100a: ec4e sd s3,24(sp) + 100c: 0080 addi s0,sp,64 + 100e: 64b1 lui s1,0xc + 1010: 35048493 addi s1,s1,848 # c350 + argv[0] = (char*)0xffffffff; + 1014: 597d li s2,-1 + 1016: 02095913 srli s2,s2,0x20 + exec("echo", argv); + 101a: 00004997 auipc s3,0x4 + 101e: 37e98993 addi s3,s3,894 # 5398 + argv[0] = (char*)0xffffffff; + 1022: fd243023 sd s2,-64(s0) + argv[1] = 0; + 1026: fc043423 sd zero,-56(s0) + exec("echo", argv); + 102a: fc040593 addi a1,s0,-64 + 102e: 854e mv a0,s3 + 1030: 57d030ef jal 4dac + for(int i = 0; i < 50000; i++){ + 1034: 34fd addiw s1,s1,-1 + 1036: f4f5 bnez s1,1022 + exit(0); + 1038: 4501 li a0,0 + 103a: 53b030ef jal 4d74 + +000000000000103e : +{ + 103e: 7155 addi sp,sp,-208 + 1040: e586 sd ra,200(sp) + 1042: e1a2 sd s0,192(sp) + 1044: 0980 addi s0,sp,208 + for(int i = 0; i < MAXPATH; i++) + 1046: f6840793 addi a5,s0,-152 + 104a: fe840693 addi a3,s0,-24 + b[i] = 'x'; + 104e: 07800713 li a4,120 + 1052: 00e78023 sb a4,0(a5) + for(int i = 0; i < MAXPATH; i++) + 1056: 0785 addi a5,a5,1 + 1058: fed79de3 bne a5,a3,1052 + b[MAXPATH] = '\0'; + 105c: fe040423 sb zero,-24(s0) + int ret = unlink(b); + 1060: f6840513 addi a0,s0,-152 + 1064: 561030ef jal 4dc4 + if(ret != -1){ + 1068: 57fd li a5,-1 + 106a: 0cf51263 bne a0,a5,112e + int fd = open(b, O_CREATE | O_WRONLY); + 106e: 20100593 li a1,513 + 1072: f6840513 addi a0,s0,-152 + 1076: 53f030ef jal 4db4 + if(fd != -1){ + 107a: 57fd li a5,-1 + 107c: 0cf51563 bne a0,a5,1146 + ret = link(b, b); + 1080: f6840593 addi a1,s0,-152 + 1084: 852e mv a0,a1 + 1086: 54f030ef jal 4dd4 + if(ret != -1){ + 108a: 57fd li a5,-1 + 108c: 0cf51963 bne a0,a5,115e + char *args[] = { "xx", 0 }; + 1090: 00006797 auipc a5,0x6 + 1094: be878793 addi a5,a5,-1048 # 6c78 + 1098: f4f43c23 sd a5,-168(s0) + 109c: f6043023 sd zero,-160(s0) + ret = exec(b, args); + 10a0: f5840593 addi a1,s0,-168 + 10a4: f6840513 addi a0,s0,-152 + 10a8: 505030ef jal 4dac + if(ret != -1){ + 10ac: 57fd li a5,-1 + 10ae: 0cf51563 bne a0,a5,1178 + int pid = fork(); + 10b2: 4bb030ef jal 4d6c + if(pid < 0){ + 10b6: 0c054d63 bltz a0,1190 + if(pid == 0){ + 10ba: 0e051863 bnez a0,11aa + 10be: 00008797 auipc a5,0x8 + 10c2: 4e278793 addi a5,a5,1250 # 95a0 + 10c6: 00009697 auipc a3,0x9 + 10ca: 4da68693 addi a3,a3,1242 # a5a0 + big[i] = 'x'; + 10ce: 07800713 li a4,120 + 10d2: 00e78023 sb a4,0(a5) + for(int i = 0; i < PGSIZE; i++) + 10d6: 0785 addi a5,a5,1 + 10d8: fed79de3 bne a5,a3,10d2 + big[PGSIZE] = '\0'; + 10dc: 00009797 auipc a5,0x9 + 10e0: 4c078223 sb zero,1220(a5) # a5a0 + char *args2[] = { big, big, big, 0 }; + 10e4: 00006797 auipc a5,0x6 + 10e8: 7fc78793 addi a5,a5,2044 # 78e0 + 10ec: 6fb0 ld a2,88(a5) + 10ee: 73b4 ld a3,96(a5) + 10f0: 77b8 ld a4,104(a5) + 10f2: 7bbc ld a5,112(a5) + 10f4: f2c43823 sd a2,-208(s0) + 10f8: f2d43c23 sd a3,-200(s0) + 10fc: f4e43023 sd a4,-192(s0) + 1100: f4f43423 sd a5,-184(s0) + ret = exec("echo", args2); + 1104: f3040593 addi a1,s0,-208 + 1108: 00004517 auipc a0,0x4 + 110c: 29050513 addi a0,a0,656 # 5398 + 1110: 49d030ef jal 4dac + if(ret != -1){ + 1114: 57fd li a5,-1 + 1116: 08f50663 beq a0,a5,11a2 + printf("exec(echo, BIG) returned %d, not -1\n", fd); + 111a: 55fd li a1,-1 + 111c: 00005517 auipc a0,0x5 + 1120: ab450513 addi a0,a0,-1356 # 5bd0 + 1124: 090040ef jal 51b4 + exit(1); + 1128: 4505 li a0,1 + 112a: 44b030ef jal 4d74 + printf("unlink(%s) returned %d, not -1\n", b, ret); + 112e: 862a mv a2,a0 + 1130: f6840593 addi a1,s0,-152 + 1134: 00005517 auipc a0,0x5 + 1138: a1450513 addi a0,a0,-1516 # 5b48 + 113c: 078040ef jal 51b4 + exit(1); + 1140: 4505 li a0,1 + 1142: 433030ef jal 4d74 + printf("open(%s) returned %d, not -1\n", b, fd); + 1146: 862a mv a2,a0 + 1148: f6840593 addi a1,s0,-152 + 114c: 00005517 auipc a0,0x5 + 1150: a1c50513 addi a0,a0,-1508 # 5b68 + 1154: 060040ef jal 51b4 + exit(1); + 1158: 4505 li a0,1 + 115a: 41b030ef jal 4d74 + printf("link(%s, %s) returned %d, not -1\n", b, b, ret); + 115e: 86aa mv a3,a0 + 1160: f6840613 addi a2,s0,-152 + 1164: 85b2 mv a1,a2 + 1166: 00005517 auipc a0,0x5 + 116a: a2250513 addi a0,a0,-1502 # 5b88 + 116e: 046040ef jal 51b4 + exit(1); + 1172: 4505 li a0,1 + 1174: 401030ef jal 4d74 + printf("exec(%s) returned %d, not -1\n", b, fd); + 1178: 567d li a2,-1 + 117a: f6840593 addi a1,s0,-152 + 117e: 00005517 auipc a0,0x5 + 1182: a3250513 addi a0,a0,-1486 # 5bb0 + 1186: 02e040ef jal 51b4 + exit(1); + 118a: 4505 li a0,1 + 118c: 3e9030ef jal 4d74 + printf("fork failed\n"); + 1190: 00006517 auipc a0,0x6 + 1194: 04050513 addi a0,a0,64 # 71d0 + 1198: 01c040ef jal 51b4 + exit(1); + 119c: 4505 li a0,1 + 119e: 3d7030ef jal 4d74 + exit(747); // OK + 11a2: 2eb00513 li a0,747 + 11a6: 3cf030ef jal 4d74 + int st = 0; + 11aa: f4042a23 sw zero,-172(s0) + wait(&st); + 11ae: f5440513 addi a0,s0,-172 + 11b2: 3cb030ef jal 4d7c + if(st != 747){ + 11b6: f5442703 lw a4,-172(s0) + 11ba: 2eb00793 li a5,747 + 11be: 00f71663 bne a4,a5,11ca +} + 11c2: 60ae ld ra,200(sp) + 11c4: 640e ld s0,192(sp) + 11c6: 6169 addi sp,sp,208 + 11c8: 8082 ret + printf("exec(echo, BIG) succeeded, should have failed\n"); + 11ca: 00005517 auipc a0,0x5 + 11ce: a2e50513 addi a0,a0,-1490 # 5bf8 + 11d2: 7e3030ef jal 51b4 + exit(1); + 11d6: 4505 li a0,1 + 11d8: 39d030ef jal 4d74 + +00000000000011dc : +{ + 11dc: 7159 addi sp,sp,-112 + 11de: f486 sd ra,104(sp) + 11e0: f0a2 sd s0,96(sp) + 11e2: e8ca sd s2,80(sp) + 11e4: 1880 addi s0,sp,112 + 11e6: 892a mv s2,a0 + close(open("truncfile", O_CREATE|O_TRUNC|O_WRONLY)); + 11e8: 60100593 li a1,1537 + 11ec: 00004517 auipc a0,0x4 + 11f0: 20450513 addi a0,a0,516 # 53f0 + 11f4: 3c1030ef jal 4db4 + 11f8: 3a5030ef jal 4d9c + pid = fork(); + 11fc: 371030ef jal 4d6c + if(pid < 0){ + 1200: 06054663 bltz a0,126c + if(pid == 0){ + 1204: e55d bnez a0,12b2 + 1206: eca6 sd s1,88(sp) + 1208: e4ce sd s3,72(sp) + 120a: e0d2 sd s4,64(sp) + 120c: fc56 sd s5,56(sp) + 120e: 06400993 li s3,100 + int fd = open("truncfile", O_WRONLY); + 1212: 00004a17 auipc s4,0x4 + 1216: 1dea0a13 addi s4,s4,478 # 53f0 + int n = write(fd, "1234567890", 10); + 121a: 00005a97 auipc s5,0x5 + 121e: a3ea8a93 addi s5,s5,-1474 # 5c58 + int fd = open("truncfile", O_WRONLY); + 1222: 4585 li a1,1 + 1224: 8552 mv a0,s4 + 1226: 38f030ef jal 4db4 + 122a: 84aa mv s1,a0 + if(fd < 0){ + 122c: 04054e63 bltz a0,1288 + int n = write(fd, "1234567890", 10); + 1230: 4629 li a2,10 + 1232: 85d6 mv a1,s5 + 1234: 361030ef jal 4d94 + if(n != 10){ + 1238: 47a9 li a5,10 + 123a: 06f51163 bne a0,a5,129c + close(fd); + 123e: 8526 mv a0,s1 + 1240: 35d030ef jal 4d9c + fd = open("truncfile", O_RDONLY); + 1244: 4581 li a1,0 + 1246: 8552 mv a0,s4 + 1248: 36d030ef jal 4db4 + 124c: 84aa mv s1,a0 + read(fd, buf, sizeof(buf)); + 124e: 02000613 li a2,32 + 1252: f9840593 addi a1,s0,-104 + 1256: 337030ef jal 4d8c + close(fd); + 125a: 8526 mv a0,s1 + 125c: 341030ef jal 4d9c + for(int i = 0; i < 100; i++){ + 1260: 39fd addiw s3,s3,-1 + 1262: fc0990e3 bnez s3,1222 + exit(0); + 1266: 4501 li a0,0 + 1268: 30d030ef jal 4d74 + 126c: eca6 sd s1,88(sp) + 126e: e4ce sd s3,72(sp) + 1270: e0d2 sd s4,64(sp) + 1272: fc56 sd s5,56(sp) + printf("%s: fork failed\n", s); + 1274: 85ca mv a1,s2 + 1276: 00005517 auipc a0,0x5 + 127a: 9b250513 addi a0,a0,-1614 # 5c28 + 127e: 737030ef jal 51b4 + exit(1); + 1282: 4505 li a0,1 + 1284: 2f1030ef jal 4d74 + printf("%s: open failed\n", s); + 1288: 85ca mv a1,s2 + 128a: 00005517 auipc a0,0x5 + 128e: 9b650513 addi a0,a0,-1610 # 5c40 + 1292: 723030ef jal 51b4 + exit(1); + 1296: 4505 li a0,1 + 1298: 2dd030ef jal 4d74 + printf("%s: write got %d, expected 10\n", s, n); + 129c: 862a mv a2,a0 + 129e: 85ca mv a1,s2 + 12a0: 00005517 auipc a0,0x5 + 12a4: 9c850513 addi a0,a0,-1592 # 5c68 + 12a8: 70d030ef jal 51b4 + exit(1); + 12ac: 4505 li a0,1 + 12ae: 2c7030ef jal 4d74 + 12b2: eca6 sd s1,88(sp) + 12b4: e4ce sd s3,72(sp) + 12b6: e0d2 sd s4,64(sp) + 12b8: fc56 sd s5,56(sp) + 12ba: 09600993 li s3,150 + int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); + 12be: 00004a17 auipc s4,0x4 + 12c2: 132a0a13 addi s4,s4,306 # 53f0 + int n = write(fd, "xxx", 3); + 12c6: 00005a97 auipc s5,0x5 + 12ca: 9c2a8a93 addi s5,s5,-1598 # 5c88 + int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); + 12ce: 60100593 li a1,1537 + 12d2: 8552 mv a0,s4 + 12d4: 2e1030ef jal 4db4 + 12d8: 84aa mv s1,a0 + if(fd < 0){ + 12da: 02054d63 bltz a0,1314 + int n = write(fd, "xxx", 3); + 12de: 460d li a2,3 + 12e0: 85d6 mv a1,s5 + 12e2: 2b3030ef jal 4d94 + if(n != 3){ + 12e6: 478d li a5,3 + 12e8: 04f51063 bne a0,a5,1328 + close(fd); + 12ec: 8526 mv a0,s1 + 12ee: 2af030ef jal 4d9c + for(int i = 0; i < 150; i++){ + 12f2: 39fd addiw s3,s3,-1 + 12f4: fc099de3 bnez s3,12ce + wait(&xstatus); + 12f8: fbc40513 addi a0,s0,-68 + 12fc: 281030ef jal 4d7c + unlink("truncfile"); + 1300: 00004517 auipc a0,0x4 + 1304: 0f050513 addi a0,a0,240 # 53f0 + 1308: 2bd030ef jal 4dc4 + exit(xstatus); + 130c: fbc42503 lw a0,-68(s0) + 1310: 265030ef jal 4d74 + printf("%s: open failed\n", s); + 1314: 85ca mv a1,s2 + 1316: 00005517 auipc a0,0x5 + 131a: 92a50513 addi a0,a0,-1750 # 5c40 + 131e: 697030ef jal 51b4 + exit(1); + 1322: 4505 li a0,1 + 1324: 251030ef jal 4d74 + printf("%s: write got %d, expected 3\n", s, n); + 1328: 862a mv a2,a0 + 132a: 85ca mv a1,s2 + 132c: 00005517 auipc a0,0x5 + 1330: 96450513 addi a0,a0,-1692 # 5c90 + 1334: 681030ef jal 51b4 + exit(1); + 1338: 4505 li a0,1 + 133a: 23b030ef jal 4d74 + +000000000000133e : +{ + 133e: 715d addi sp,sp,-80 + 1340: e486 sd ra,72(sp) + 1342: e0a2 sd s0,64(sp) + 1344: f84a sd s2,48(sp) + 1346: 0880 addi s0,sp,80 + 1348: 892a mv s2,a0 + char *echoargv[] = { "echo", "OK", 0 }; + 134a: 00004797 auipc a5,0x4 + 134e: 04e78793 addi a5,a5,78 # 5398 + 1352: fcf43023 sd a5,-64(s0) + 1356: 00005797 auipc a5,0x5 + 135a: 95a78793 addi a5,a5,-1702 # 5cb0 + 135e: fcf43423 sd a5,-56(s0) + 1362: fc043823 sd zero,-48(s0) + unlink("echo-ok"); + 1366: 00005517 auipc a0,0x5 + 136a: 95250513 addi a0,a0,-1710 # 5cb8 + 136e: 257030ef jal 4dc4 + pid = fork(); + 1372: 1fb030ef jal 4d6c + if(pid < 0) { + 1376: 02054f63 bltz a0,13b4 + 137a: fc26 sd s1,56(sp) + 137c: 84aa mv s1,a0 + if(pid == 0) { + 137e: e935 bnez a0,13f2 + close(1); + 1380: 4505 li a0,1 + 1382: 21b030ef jal 4d9c + fd = open("echo-ok", O_CREATE|O_WRONLY); + 1386: 20100593 li a1,513 + 138a: 00005517 auipc a0,0x5 + 138e: 92e50513 addi a0,a0,-1746 # 5cb8 + 1392: 223030ef jal 4db4 + if(fd < 0) { + 1396: 02054a63 bltz a0,13ca + if(fd != 1) { + 139a: 4785 li a5,1 + 139c: 04f50163 beq a0,a5,13de + printf("%s: wrong fd\n", s); + 13a0: 85ca mv a1,s2 + 13a2: 00005517 auipc a0,0x5 + 13a6: 93650513 addi a0,a0,-1738 # 5cd8 + 13aa: 60b030ef jal 51b4 + exit(1); + 13ae: 4505 li a0,1 + 13b0: 1c5030ef jal 4d74 + 13b4: fc26 sd s1,56(sp) + printf("%s: fork failed\n", s); + 13b6: 85ca mv a1,s2 + 13b8: 00005517 auipc a0,0x5 + 13bc: 87050513 addi a0,a0,-1936 # 5c28 + 13c0: 5f5030ef jal 51b4 + exit(1); + 13c4: 4505 li a0,1 + 13c6: 1af030ef jal 4d74 + printf("%s: create failed\n", s); + 13ca: 85ca mv a1,s2 + 13cc: 00005517 auipc a0,0x5 + 13d0: 8f450513 addi a0,a0,-1804 # 5cc0 + 13d4: 5e1030ef jal 51b4 + exit(1); + 13d8: 4505 li a0,1 + 13da: 19b030ef jal 4d74 + if(exec("echo", echoargv) < 0){ + 13de: fc040593 addi a1,s0,-64 + 13e2: 00004517 auipc a0,0x4 + 13e6: fb650513 addi a0,a0,-74 # 5398 + 13ea: 1c3030ef jal 4dac + 13ee: 00054d63 bltz a0,1408 + if (wait(&xstatus) != pid) { + 13f2: fdc40513 addi a0,s0,-36 + 13f6: 187030ef jal 4d7c + 13fa: 02951163 bne a0,s1,141c + if(xstatus != 0) + 13fe: fdc42503 lw a0,-36(s0) + 1402: c50d beqz a0,142c + exit(xstatus); + 1404: 171030ef jal 4d74 + printf("%s: exec echo failed\n", s); + 1408: 85ca mv a1,s2 + 140a: 00005517 auipc a0,0x5 + 140e: 8de50513 addi a0,a0,-1826 # 5ce8 + 1412: 5a3030ef jal 51b4 + exit(1); + 1416: 4505 li a0,1 + 1418: 15d030ef jal 4d74 + printf("%s: wait failed!\n", s); + 141c: 85ca mv a1,s2 + 141e: 00005517 auipc a0,0x5 + 1422: 8e250513 addi a0,a0,-1822 # 5d00 + 1426: 58f030ef jal 51b4 + 142a: bfd1 j 13fe + fd = open("echo-ok", O_RDONLY); + 142c: 4581 li a1,0 + 142e: 00005517 auipc a0,0x5 + 1432: 88a50513 addi a0,a0,-1910 # 5cb8 + 1436: 17f030ef jal 4db4 + if(fd < 0) { + 143a: 02054463 bltz a0,1462 + if (read(fd, buf, 2) != 2) { + 143e: 4609 li a2,2 + 1440: fb840593 addi a1,s0,-72 + 1444: 149030ef jal 4d8c + 1448: 4789 li a5,2 + 144a: 02f50663 beq a0,a5,1476 + printf("%s: read failed\n", s); + 144e: 85ca mv a1,s2 + 1450: 00004517 auipc a0,0x4 + 1454: 31850513 addi a0,a0,792 # 5768 + 1458: 55d030ef jal 51b4 + exit(1); + 145c: 4505 li a0,1 + 145e: 117030ef jal 4d74 + printf("%s: open failed\n", s); + 1462: 85ca mv a1,s2 + 1464: 00004517 auipc a0,0x4 + 1468: 7dc50513 addi a0,a0,2012 # 5c40 + 146c: 549030ef jal 51b4 + exit(1); + 1470: 4505 li a0,1 + 1472: 103030ef jal 4d74 + unlink("echo-ok"); + 1476: 00005517 auipc a0,0x5 + 147a: 84250513 addi a0,a0,-1982 # 5cb8 + 147e: 147030ef jal 4dc4 + if(buf[0] == 'O' && buf[1] == 'K') + 1482: fb844703 lbu a4,-72(s0) + 1486: 04f00793 li a5,79 + 148a: 00f71863 bne a4,a5,149a + 148e: fb944703 lbu a4,-71(s0) + 1492: 04b00793 li a5,75 + 1496: 00f70c63 beq a4,a5,14ae + printf("%s: wrong output\n", s); + 149a: 85ca mv a1,s2 + 149c: 00005517 auipc a0,0x5 + 14a0: 87c50513 addi a0,a0,-1924 # 5d18 + 14a4: 511030ef jal 51b4 + exit(1); + 14a8: 4505 li a0,1 + 14aa: 0cb030ef jal 4d74 + exit(0); + 14ae: 4501 li a0,0 + 14b0: 0c5030ef jal 4d74 + +00000000000014b4 : +{ + 14b4: 711d addi sp,sp,-96 + 14b6: ec86 sd ra,88(sp) + 14b8: e8a2 sd s0,80(sp) + 14ba: fc4e sd s3,56(sp) + 14bc: 1080 addi s0,sp,96 + 14be: 89aa mv s3,a0 + if(pipe(fds) != 0){ + 14c0: fa840513 addi a0,s0,-88 + 14c4: 0c1030ef jal 4d84 + 14c8: e92d bnez a0,153a + 14ca: e4a6 sd s1,72(sp) + 14cc: f852 sd s4,48(sp) + 14ce: 84aa mv s1,a0 + pid = fork(); + 14d0: 09d030ef jal 4d6c + 14d4: 8a2a mv s4,a0 + if(pid == 0){ + 14d6: c151 beqz a0,155a + } else if(pid > 0){ + 14d8: 14a05e63 blez a0,1634 + 14dc: e0ca sd s2,64(sp) + 14de: f456 sd s5,40(sp) + close(fds[1]); + 14e0: fac42503 lw a0,-84(s0) + 14e4: 0b9030ef jal 4d9c + total = 0; + 14e8: 8a26 mv s4,s1 + cc = 1; + 14ea: 4905 li s2,1 + while((n = read(fds[0], buf, cc)) > 0){ + 14ec: 0000ba97 auipc s5,0xb + 14f0: 7cca8a93 addi s5,s5,1996 # ccb8 + 14f4: 864a mv a2,s2 + 14f6: 85d6 mv a1,s5 + 14f8: fa842503 lw a0,-88(s0) + 14fc: 091030ef jal 4d8c + 1500: 0ea05a63 blez a0,15f4 + for(i = 0; i < n; i++){ + 1504: 0000b717 auipc a4,0xb + 1508: 7b470713 addi a4,a4,1972 # ccb8 + 150c: 00a4863b addw a2,s1,a0 + if((buf[i] & 0xff) != (seq++ & 0xff)){ + 1510: 00074683 lbu a3,0(a4) + 1514: 0ff4f793 zext.b a5,s1 + 1518: 2485 addiw s1,s1,1 + 151a: 0af69d63 bne a3,a5,15d4 + for(i = 0; i < n; i++){ + 151e: 0705 addi a4,a4,1 + 1520: fec498e3 bne s1,a2,1510 + total += n; + 1524: 00aa0a3b addw s4,s4,a0 + cc = cc * 2; + 1528: 0019179b slliw a5,s2,0x1 + 152c: 0007891b sext.w s2,a5 + if(cc > sizeof(buf)) + 1530: 670d lui a4,0x3 + 1532: fd2771e3 bgeu a4,s2,14f4 + cc = sizeof(buf); + 1536: 690d lui s2,0x3 + 1538: bf75 j 14f4 + 153a: e4a6 sd s1,72(sp) + 153c: e0ca sd s2,64(sp) + 153e: f852 sd s4,48(sp) + 1540: f456 sd s5,40(sp) + 1542: f05a sd s6,32(sp) + 1544: ec5e sd s7,24(sp) + printf("%s: pipe() failed\n", s); + 1546: 85ce mv a1,s3 + 1548: 00004517 auipc a0,0x4 + 154c: 7e850513 addi a0,a0,2024 # 5d30 + 1550: 465030ef jal 51b4 + exit(1); + 1554: 4505 li a0,1 + 1556: 01f030ef jal 4d74 + 155a: e0ca sd s2,64(sp) + 155c: f456 sd s5,40(sp) + 155e: f05a sd s6,32(sp) + 1560: ec5e sd s7,24(sp) + close(fds[0]); + 1562: fa842503 lw a0,-88(s0) + 1566: 037030ef jal 4d9c + for(n = 0; n < N; n++){ + 156a: 0000bb17 auipc s6,0xb + 156e: 74eb0b13 addi s6,s6,1870 # ccb8 + 1572: 416004bb negw s1,s6 + 1576: 0ff4f493 zext.b s1,s1 + 157a: 409b0913 addi s2,s6,1033 + if(write(fds[1], buf, SZ) != SZ){ + 157e: 8bda mv s7,s6 + for(n = 0; n < N; n++){ + 1580: 6a85 lui s5,0x1 + 1582: 42da8a93 addi s5,s5,1069 # 142d +{ + 1586: 87da mv a5,s6 + buf[i] = seq++; + 1588: 0097873b addw a4,a5,s1 + 158c: 00e78023 sb a4,0(a5) + for(i = 0; i < SZ; i++) + 1590: 0785 addi a5,a5,1 + 1592: ff279be3 bne a5,s2,1588 + 1596: 409a0a1b addiw s4,s4,1033 + if(write(fds[1], buf, SZ) != SZ){ + 159a: 40900613 li a2,1033 + 159e: 85de mv a1,s7 + 15a0: fac42503 lw a0,-84(s0) + 15a4: 7f0030ef jal 4d94 + 15a8: 40900793 li a5,1033 + 15ac: 00f51a63 bne a0,a5,15c0 + for(n = 0; n < N; n++){ + 15b0: 24a5 addiw s1,s1,9 + 15b2: 0ff4f493 zext.b s1,s1 + 15b6: fd5a18e3 bne s4,s5,1586 + exit(0); + 15ba: 4501 li a0,0 + 15bc: 7b8030ef jal 4d74 + printf("%s: pipe1 oops 1\n", s); + 15c0: 85ce mv a1,s3 + 15c2: 00004517 auipc a0,0x4 + 15c6: 78650513 addi a0,a0,1926 # 5d48 + 15ca: 3eb030ef jal 51b4 + exit(1); + 15ce: 4505 li a0,1 + 15d0: 7a4030ef jal 4d74 + printf("%s: pipe1 oops 2\n", s); + 15d4: 85ce mv a1,s3 + 15d6: 00004517 auipc a0,0x4 + 15da: 78a50513 addi a0,a0,1930 # 5d60 + 15de: 3d7030ef jal 51b4 + return; + 15e2: 64a6 ld s1,72(sp) + 15e4: 6906 ld s2,64(sp) + 15e6: 7a42 ld s4,48(sp) + 15e8: 7aa2 ld s5,40(sp) +} + 15ea: 60e6 ld ra,88(sp) + 15ec: 6446 ld s0,80(sp) + 15ee: 79e2 ld s3,56(sp) + 15f0: 6125 addi sp,sp,96 + 15f2: 8082 ret + if(total != N * SZ){ + 15f4: 6785 lui a5,0x1 + 15f6: 42d78793 addi a5,a5,1069 # 142d + 15fa: 00fa0f63 beq s4,a5,1618 + 15fe: f05a sd s6,32(sp) + 1600: ec5e sd s7,24(sp) + printf("%s: pipe1 oops 3 total %d\n", s, total); + 1602: 8652 mv a2,s4 + 1604: 85ce mv a1,s3 + 1606: 00004517 auipc a0,0x4 + 160a: 77250513 addi a0,a0,1906 # 5d78 + 160e: 3a7030ef jal 51b4 + exit(1); + 1612: 4505 li a0,1 + 1614: 760030ef jal 4d74 + 1618: f05a sd s6,32(sp) + 161a: ec5e sd s7,24(sp) + close(fds[0]); + 161c: fa842503 lw a0,-88(s0) + 1620: 77c030ef jal 4d9c + wait(&xstatus); + 1624: fa440513 addi a0,s0,-92 + 1628: 754030ef jal 4d7c + exit(xstatus); + 162c: fa442503 lw a0,-92(s0) + 1630: 744030ef jal 4d74 + 1634: e0ca sd s2,64(sp) + 1636: f456 sd s5,40(sp) + 1638: f05a sd s6,32(sp) + 163a: ec5e sd s7,24(sp) + printf("%s: fork() failed\n", s); + 163c: 85ce mv a1,s3 + 163e: 00004517 auipc a0,0x4 + 1642: 75a50513 addi a0,a0,1882 # 5d98 + 1646: 36f030ef jal 51b4 + exit(1); + 164a: 4505 li a0,1 + 164c: 728030ef jal 4d74 + +0000000000001650 : +{ + 1650: 7139 addi sp,sp,-64 + 1652: fc06 sd ra,56(sp) + 1654: f822 sd s0,48(sp) + 1656: f426 sd s1,40(sp) + 1658: f04a sd s2,32(sp) + 165a: ec4e sd s3,24(sp) + 165c: e852 sd s4,16(sp) + 165e: 0080 addi s0,sp,64 + 1660: 8a2a mv s4,a0 + for(i = 0; i < 100; i++){ + 1662: 4901 li s2,0 + 1664: 06400993 li s3,100 + pid = fork(); + 1668: 704030ef jal 4d6c + 166c: 84aa mv s1,a0 + if(pid < 0){ + 166e: 02054863 bltz a0,169e + if(pid){ + 1672: c525 beqz a0,16da + if(wait(&xstate) != pid){ + 1674: fcc40513 addi a0,s0,-52 + 1678: 704030ef jal 4d7c + 167c: 02951b63 bne a0,s1,16b2 + if(i != xstate) { + 1680: fcc42783 lw a5,-52(s0) + 1684: 05279163 bne a5,s2,16c6 + for(i = 0; i < 100; i++){ + 1688: 2905 addiw s2,s2,1 # 3001 + 168a: fd391fe3 bne s2,s3,1668 +} + 168e: 70e2 ld ra,56(sp) + 1690: 7442 ld s0,48(sp) + 1692: 74a2 ld s1,40(sp) + 1694: 7902 ld s2,32(sp) + 1696: 69e2 ld s3,24(sp) + 1698: 6a42 ld s4,16(sp) + 169a: 6121 addi sp,sp,64 + 169c: 8082 ret + printf("%s: fork failed\n", s); + 169e: 85d2 mv a1,s4 + 16a0: 00004517 auipc a0,0x4 + 16a4: 58850513 addi a0,a0,1416 # 5c28 + 16a8: 30d030ef jal 51b4 + exit(1); + 16ac: 4505 li a0,1 + 16ae: 6c6030ef jal 4d74 + printf("%s: wait wrong pid\n", s); + 16b2: 85d2 mv a1,s4 + 16b4: 00004517 auipc a0,0x4 + 16b8: 6fc50513 addi a0,a0,1788 # 5db0 + 16bc: 2f9030ef jal 51b4 + exit(1); + 16c0: 4505 li a0,1 + 16c2: 6b2030ef jal 4d74 + printf("%s: wait wrong exit status\n", s); + 16c6: 85d2 mv a1,s4 + 16c8: 00004517 auipc a0,0x4 + 16cc: 70050513 addi a0,a0,1792 # 5dc8 + 16d0: 2e5030ef jal 51b4 + exit(1); + 16d4: 4505 li a0,1 + 16d6: 69e030ef jal 4d74 + exit(i); + 16da: 854a mv a0,s2 + 16dc: 698030ef jal 4d74 + +00000000000016e0 : +{ + 16e0: 1101 addi sp,sp,-32 + 16e2: ec06 sd ra,24(sp) + 16e4: e822 sd s0,16(sp) + 16e6: e426 sd s1,8(sp) + 16e8: e04a sd s2,0(sp) + 16ea: 1000 addi s0,sp,32 + 16ec: 892a mv s2,a0 + 16ee: 3e800493 li s1,1000 + int pid1 = fork(); + 16f2: 67a030ef jal 4d6c + if(pid1 < 0){ + 16f6: 02054663 bltz a0,1722 + if(pid1 == 0){ + 16fa: cd15 beqz a0,1736 + int pid2 = fork(); + 16fc: 670030ef jal 4d6c + if(pid2 < 0){ + 1700: 02054d63 bltz a0,173a + if(pid2 == 0){ + 1704: c529 beqz a0,174e + wait(0); + 1706: 4501 li a0,0 + 1708: 674030ef jal 4d7c + wait(0); + 170c: 4501 li a0,0 + 170e: 66e030ef jal 4d7c + for(int i = 0; i < 1000; i++){ + 1712: 34fd addiw s1,s1,-1 + 1714: fcf9 bnez s1,16f2 +} + 1716: 60e2 ld ra,24(sp) + 1718: 6442 ld s0,16(sp) + 171a: 64a2 ld s1,8(sp) + 171c: 6902 ld s2,0(sp) + 171e: 6105 addi sp,sp,32 + 1720: 8082 ret + printf("%s: fork failed\n", s); + 1722: 85ca mv a1,s2 + 1724: 00004517 auipc a0,0x4 + 1728: 50450513 addi a0,a0,1284 # 5c28 + 172c: 289030ef jal 51b4 + exit(1); + 1730: 4505 li a0,1 + 1732: 642030ef jal 4d74 + exit(0); + 1736: 63e030ef jal 4d74 + printf("%s: fork failed\n", s); + 173a: 85ca mv a1,s2 + 173c: 00004517 auipc a0,0x4 + 1740: 4ec50513 addi a0,a0,1260 # 5c28 + 1744: 271030ef jal 51b4 + exit(1); + 1748: 4505 li a0,1 + 174a: 62a030ef jal 4d74 + exit(0); + 174e: 626030ef jal 4d74 + +0000000000001752 : +{ + 1752: 7179 addi sp,sp,-48 + 1754: f406 sd ra,40(sp) + 1756: f022 sd s0,32(sp) + 1758: ec26 sd s1,24(sp) + 175a: 1800 addi s0,sp,48 + 175c: 84aa mv s1,a0 + int pid = fork(); + 175e: 60e030ef jal 4d6c + if(pid < 0){ + 1762: 02054b63 bltz a0,1798 + if(pid == 0){ + 1766: c139 beqz a0,17ac + int pid = fork(); + 1768: 604030ef jal 4d6c + if(pid < 0){ + 176c: 02054663 bltz a0,1798 + if(pid == 0){ + 1770: cd15 beqz a0,17ac + wait(&xstatus); + 1772: fdc40513 addi a0,s0,-36 + 1776: 606030ef jal 4d7c + if(xstatus != 0) { + 177a: fdc42783 lw a5,-36(s0) + 177e: ebb9 bnez a5,17d4 + wait(&xstatus); + 1780: fdc40513 addi a0,s0,-36 + 1784: 5f8030ef jal 4d7c + if(xstatus != 0) { + 1788: fdc42783 lw a5,-36(s0) + 178c: e7a1 bnez a5,17d4 +} + 178e: 70a2 ld ra,40(sp) + 1790: 7402 ld s0,32(sp) + 1792: 64e2 ld s1,24(sp) + 1794: 6145 addi sp,sp,48 + 1796: 8082 ret + printf("%s: fork failed", s); + 1798: 85a6 mv a1,s1 + 179a: 00004517 auipc a0,0x4 + 179e: 64e50513 addi a0,a0,1614 # 5de8 + 17a2: 213030ef jal 51b4 + exit(1); + 17a6: 4505 li a0,1 + 17a8: 5cc030ef jal 4d74 +{ + 17ac: 0c800493 li s1,200 + int pid1 = fork(); + 17b0: 5bc030ef jal 4d6c + if(pid1 < 0){ + 17b4: 00054b63 bltz a0,17ca + if(pid1 == 0){ + 17b8: cd01 beqz a0,17d0 + wait(0); + 17ba: 4501 li a0,0 + 17bc: 5c0030ef jal 4d7c + for(int j = 0; j < 200; j++){ + 17c0: 34fd addiw s1,s1,-1 + 17c2: f4fd bnez s1,17b0 + exit(0); + 17c4: 4501 li a0,0 + 17c6: 5ae030ef jal 4d74 + exit(1); + 17ca: 4505 li a0,1 + 17cc: 5a8030ef jal 4d74 + exit(0); + 17d0: 5a4030ef jal 4d74 + printf("%s: fork in child failed", s); + 17d4: 85a6 mv a1,s1 + 17d6: 00004517 auipc a0,0x4 + 17da: 62250513 addi a0,a0,1570 # 5df8 + 17de: 1d7030ef jal 51b4 + exit(1); + 17e2: 4505 li a0,1 + 17e4: 590030ef jal 4d74 + +00000000000017e8 : +{ + 17e8: 1101 addi sp,sp,-32 + 17ea: ec06 sd ra,24(sp) + 17ec: e822 sd s0,16(sp) + 17ee: e426 sd s1,8(sp) + 17f0: 1000 addi s0,sp,32 + 17f2: 32000493 li s1,800 + int pid1 = fork(); + 17f6: 576030ef jal 4d6c + if(pid1 < 0){ + 17fa: 00054b63 bltz a0,1810 + if(pid1 == 0){ + 17fe: c115 beqz a0,1822 + wait(0); + 1800: 4501 li a0,0 + 1802: 57a030ef jal 4d7c + for(int i = 0; i < 800; i++){ + 1806: 34fd addiw s1,s1,-1 + 1808: f4fd bnez s1,17f6 + exit(0); + 180a: 4501 li a0,0 + 180c: 568030ef jal 4d74 + printf("fork failed\n"); + 1810: 00006517 auipc a0,0x6 + 1814: 9c050513 addi a0,a0,-1600 # 71d0 + 1818: 19d030ef jal 51b4 + exit(1); + 181c: 4505 li a0,1 + 181e: 556030ef jal 4d74 + fork(); + 1822: 54a030ef jal 4d6c + fork(); + 1826: 546030ef jal 4d6c + exit(0); + 182a: 4501 li a0,0 + 182c: 548030ef jal 4d74 + +0000000000001830 : +{ + 1830: 7175 addi sp,sp,-144 + 1832: e506 sd ra,136(sp) + 1834: e122 sd s0,128(sp) + 1836: fca6 sd s1,120(sp) + 1838: f8ca sd s2,112(sp) + 183a: f4ce sd s3,104(sp) + 183c: f0d2 sd s4,96(sp) + 183e: ecd6 sd s5,88(sp) + 1840: e8da sd s6,80(sp) + 1842: e4de sd s7,72(sp) + 1844: e0e2 sd s8,64(sp) + 1846: fc66 sd s9,56(sp) + 1848: 0900 addi s0,sp,144 + 184a: 8caa mv s9,a0 + for(pi = 0; pi < NCHILD; pi++){ + 184c: 4901 li s2,0 + 184e: 4991 li s3,4 + pid = fork(); + 1850: 51c030ef jal 4d6c + 1854: 84aa mv s1,a0 + if(pid < 0){ + 1856: 02054d63 bltz a0,1890 + if(pid == 0){ + 185a: c529 beqz a0,18a4 + for(pi = 0; pi < NCHILD; pi++){ + 185c: 2905 addiw s2,s2,1 + 185e: ff3919e3 bne s2,s3,1850 + 1862: 4491 li s1,4 + wait(&xstatus); + 1864: f7c40513 addi a0,s0,-132 + 1868: 514030ef jal 4d7c + if(xstatus != 0) + 186c: f7c42903 lw s2,-132(s0) + 1870: 0a091e63 bnez s2,192c + for(pi = 0; pi < NCHILD; pi++){ + 1874: 34fd addiw s1,s1,-1 + 1876: f4fd bnez s1,1864 + name[0] = name[1] = name[2] = 0; + 1878: f8040123 sb zero,-126(s0) + 187c: 03000993 li s3,48 + 1880: 5a7d li s4,-1 + 1882: 07000c13 li s8,112 + if((i == 0 || i >= N/2) && fd < 0){ + 1886: 4b25 li s6,9 + } else if((i >= 1 && i < N/2) && fd >= 0){ + 1888: 4ba1 li s7,8 + for(pi = 0; pi < NCHILD; pi++){ + 188a: 07400a93 li s5,116 + 188e: aa39 j 19ac + printf("%s: fork failed\n", s); + 1890: 85e6 mv a1,s9 + 1892: 00004517 auipc a0,0x4 + 1896: 39650513 addi a0,a0,918 # 5c28 + 189a: 11b030ef jal 51b4 + exit(1); + 189e: 4505 li a0,1 + 18a0: 4d4030ef jal 4d74 + name[0] = 'p' + pi; + 18a4: 0709091b addiw s2,s2,112 + 18a8: f9240023 sb s2,-128(s0) + name[2] = '\0'; + 18ac: f8040123 sb zero,-126(s0) + for(i = 0; i < N; i++){ + 18b0: 4951 li s2,20 + 18b2: a831 j 18ce + printf("%s: create failed\n", s); + 18b4: 85e6 mv a1,s9 + 18b6: 00004517 auipc a0,0x4 + 18ba: 40a50513 addi a0,a0,1034 # 5cc0 + 18be: 0f7030ef jal 51b4 + exit(1); + 18c2: 4505 li a0,1 + 18c4: 4b0030ef jal 4d74 + for(i = 0; i < N; i++){ + 18c8: 2485 addiw s1,s1,1 + 18ca: 05248e63 beq s1,s2,1926 + name[1] = '0' + i; + 18ce: 0304879b addiw a5,s1,48 + 18d2: f8f400a3 sb a5,-127(s0) + fd = open(name, O_CREATE | O_RDWR); + 18d6: 20200593 li a1,514 + 18da: f8040513 addi a0,s0,-128 + 18de: 4d6030ef jal 4db4 + if(fd < 0){ + 18e2: fc0549e3 bltz a0,18b4 + close(fd); + 18e6: 4b6030ef jal 4d9c + if(i > 0 && (i % 2 ) == 0){ + 18ea: 10905063 blez s1,19ea + 18ee: 0014f793 andi a5,s1,1 + 18f2: fbf9 bnez a5,18c8 + name[1] = '0' + (i / 2); + 18f4: 01f4d79b srliw a5,s1,0x1f + 18f8: 9fa5 addw a5,a5,s1 + 18fa: 4017d79b sraiw a5,a5,0x1 + 18fe: 0307879b addiw a5,a5,48 + 1902: f8f400a3 sb a5,-127(s0) + if(unlink(name) < 0){ + 1906: f8040513 addi a0,s0,-128 + 190a: 4ba030ef jal 4dc4 + 190e: fa055de3 bgez a0,18c8 + printf("%s: unlink failed\n", s); + 1912: 85e6 mv a1,s9 + 1914: 00004517 auipc a0,0x4 + 1918: 50450513 addi a0,a0,1284 # 5e18 + 191c: 099030ef jal 51b4 + exit(1); + 1920: 4505 li a0,1 + 1922: 452030ef jal 4d74 + exit(0); + 1926: 4501 li a0,0 + 1928: 44c030ef jal 4d74 + exit(1); + 192c: 4505 li a0,1 + 192e: 446030ef jal 4d74 + printf("%s: oops createdelete %s didn't exist\n", s, name); + 1932: f8040613 addi a2,s0,-128 + 1936: 85e6 mv a1,s9 + 1938: 00004517 auipc a0,0x4 + 193c: 4f850513 addi a0,a0,1272 # 5e30 + 1940: 075030ef jal 51b4 + exit(1); + 1944: 4505 li a0,1 + 1946: 42e030ef jal 4d74 + } else if((i >= 1 && i < N/2) && fd >= 0){ + 194a: 034bfb63 bgeu s7,s4,1980 + if(fd >= 0) + 194e: 02055663 bgez a0,197a + for(pi = 0; pi < NCHILD; pi++){ + 1952: 2485 addiw s1,s1,1 + 1954: 0ff4f493 zext.b s1,s1 + 1958: 05548263 beq s1,s5,199c + name[0] = 'p' + pi; + 195c: f8940023 sb s1,-128(s0) + name[1] = '0' + i; + 1960: f93400a3 sb s3,-127(s0) + fd = open(name, 0); + 1964: 4581 li a1,0 + 1966: f8040513 addi a0,s0,-128 + 196a: 44a030ef jal 4db4 + if((i == 0 || i >= N/2) && fd < 0){ + 196e: 00090463 beqz s2,1976 + 1972: fd2b5ce3 bge s6,s2,194a + 1976: fa054ee3 bltz a0,1932 + close(fd); + 197a: 422030ef jal 4d9c + 197e: bfd1 j 1952 + } else if((i >= 1 && i < N/2) && fd >= 0){ + 1980: fc0549e3 bltz a0,1952 + printf("%s: oops createdelete %s did exist\n", s, name); + 1984: f8040613 addi a2,s0,-128 + 1988: 85e6 mv a1,s9 + 198a: 00004517 auipc a0,0x4 + 198e: 4ce50513 addi a0,a0,1230 # 5e58 + 1992: 023030ef jal 51b4 + exit(1); + 1996: 4505 li a0,1 + 1998: 3dc030ef jal 4d74 + for(i = 0; i < N; i++){ + 199c: 2905 addiw s2,s2,1 + 199e: 2a05 addiw s4,s4,1 + 19a0: 2985 addiw s3,s3,1 + 19a2: 0ff9f993 zext.b s3,s3 + 19a6: 47d1 li a5,20 + 19a8: 02f90863 beq s2,a5,19d8 + for(pi = 0; pi < NCHILD; pi++){ + 19ac: 84e2 mv s1,s8 + 19ae: b77d j 195c + for(i = 0; i < N; i++){ + 19b0: 2905 addiw s2,s2,1 + 19b2: 0ff97913 zext.b s2,s2 + 19b6: 03490c63 beq s2,s4,19ee + name[0] = name[1] = name[2] = 0; + 19ba: 84d6 mv s1,s5 + name[0] = 'p' + pi; + 19bc: f8940023 sb s1,-128(s0) + name[1] = '0' + i; + 19c0: f92400a3 sb s2,-127(s0) + unlink(name); + 19c4: f8040513 addi a0,s0,-128 + 19c8: 3fc030ef jal 4dc4 + for(pi = 0; pi < NCHILD; pi++){ + 19cc: 2485 addiw s1,s1,1 + 19ce: 0ff4f493 zext.b s1,s1 + 19d2: ff3495e3 bne s1,s3,19bc + 19d6: bfe9 j 19b0 + 19d8: 03000913 li s2,48 + name[0] = name[1] = name[2] = 0; + 19dc: 07000a93 li s5,112 + for(pi = 0; pi < NCHILD; pi++){ + 19e0: 07400993 li s3,116 + for(i = 0; i < N; i++){ + 19e4: 04400a13 li s4,68 + 19e8: bfc9 j 19ba + for(i = 0; i < N; i++){ + 19ea: 2485 addiw s1,s1,1 + 19ec: b5cd j 18ce +} + 19ee: 60aa ld ra,136(sp) + 19f0: 640a ld s0,128(sp) + 19f2: 74e6 ld s1,120(sp) + 19f4: 7946 ld s2,112(sp) + 19f6: 79a6 ld s3,104(sp) + 19f8: 7a06 ld s4,96(sp) + 19fa: 6ae6 ld s5,88(sp) + 19fc: 6b46 ld s6,80(sp) + 19fe: 6ba6 ld s7,72(sp) + 1a00: 6c06 ld s8,64(sp) + 1a02: 7ce2 ld s9,56(sp) + 1a04: 6149 addi sp,sp,144 + 1a06: 8082 ret + +0000000000001a08 : +{ + 1a08: 711d addi sp,sp,-96 + 1a0a: ec86 sd ra,88(sp) + 1a0c: e8a2 sd s0,80(sp) + 1a0e: e4a6 sd s1,72(sp) + 1a10: e0ca sd s2,64(sp) + 1a12: fc4e sd s3,56(sp) + 1a14: f852 sd s4,48(sp) + 1a16: f456 sd s5,40(sp) + 1a18: f05a sd s6,32(sp) + 1a1a: ec5e sd s7,24(sp) + 1a1c: e862 sd s8,16(sp) + 1a1e: e466 sd s9,8(sp) + 1a20: 1080 addi s0,sp,96 + 1a22: 84aa mv s1,a0 + unlink("x"); + 1a24: 00004517 auipc a0,0x4 + 1a28: 9e450513 addi a0,a0,-1564 # 5408 + 1a2c: 398030ef jal 4dc4 + pid = fork(); + 1a30: 33c030ef jal 4d6c + if(pid < 0){ + 1a34: 02054b63 bltz a0,1a6a + 1a38: 8caa mv s9,a0 + unsigned int x = (pid ? 1 : 97); + 1a3a: 06100913 li s2,97 + 1a3e: c111 beqz a0,1a42 + 1a40: 4905 li s2,1 + 1a42: 06400493 li s1,100 + x = x * 1103515245 + 12345; + 1a46: 41c65a37 lui s4,0x41c65 + 1a4a: e6da0a1b addiw s4,s4,-403 # 41c64e6d + 1a4e: 698d lui s3,0x3 + 1a50: 0399899b addiw s3,s3,57 # 3039 + if((x % 3) == 0){ + 1a54: 4a8d li s5,3 + } else if((x % 3) == 1){ + 1a56: 4b85 li s7,1 + unlink("x"); + 1a58: 00004b17 auipc s6,0x4 + 1a5c: 9b0b0b13 addi s6,s6,-1616 # 5408 + link("cat", "x"); + 1a60: 00004c17 auipc s8,0x4 + 1a64: 420c0c13 addi s8,s8,1056 # 5e80 + 1a68: a025 j 1a90 + printf("%s: fork failed\n", s); + 1a6a: 85a6 mv a1,s1 + 1a6c: 00004517 auipc a0,0x4 + 1a70: 1bc50513 addi a0,a0,444 # 5c28 + 1a74: 740030ef jal 51b4 + exit(1); + 1a78: 4505 li a0,1 + 1a7a: 2fa030ef jal 4d74 + close(open("x", O_RDWR | O_CREATE)); + 1a7e: 20200593 li a1,514 + 1a82: 855a mv a0,s6 + 1a84: 330030ef jal 4db4 + 1a88: 314030ef jal 4d9c + for(i = 0; i < 100; i++){ + 1a8c: 34fd addiw s1,s1,-1 + 1a8e: c495 beqz s1,1aba + x = x * 1103515245 + 12345; + 1a90: 034907bb mulw a5,s2,s4 + 1a94: 013787bb addw a5,a5,s3 + 1a98: 0007891b sext.w s2,a5 + if((x % 3) == 0){ + 1a9c: 0357f7bb remuw a5,a5,s5 + 1aa0: 2781 sext.w a5,a5 + 1aa2: dff1 beqz a5,1a7e + } else if((x % 3) == 1){ + 1aa4: 01778663 beq a5,s7,1ab0 + unlink("x"); + 1aa8: 855a mv a0,s6 + 1aaa: 31a030ef jal 4dc4 + 1aae: bff9 j 1a8c + link("cat", "x"); + 1ab0: 85da mv a1,s6 + 1ab2: 8562 mv a0,s8 + 1ab4: 320030ef jal 4dd4 + 1ab8: bfd1 j 1a8c + if(pid) + 1aba: 020c8263 beqz s9,1ade + wait(0); + 1abe: 4501 li a0,0 + 1ac0: 2bc030ef jal 4d7c +} + 1ac4: 60e6 ld ra,88(sp) + 1ac6: 6446 ld s0,80(sp) + 1ac8: 64a6 ld s1,72(sp) + 1aca: 6906 ld s2,64(sp) + 1acc: 79e2 ld s3,56(sp) + 1ace: 7a42 ld s4,48(sp) + 1ad0: 7aa2 ld s5,40(sp) + 1ad2: 7b02 ld s6,32(sp) + 1ad4: 6be2 ld s7,24(sp) + 1ad6: 6c42 ld s8,16(sp) + 1ad8: 6ca2 ld s9,8(sp) + 1ada: 6125 addi sp,sp,96 + 1adc: 8082 ret + exit(0); + 1ade: 4501 li a0,0 + 1ae0: 294030ef jal 4d74 + +0000000000001ae4 : +{ + 1ae4: 7179 addi sp,sp,-48 + 1ae6: f406 sd ra,40(sp) + 1ae8: f022 sd s0,32(sp) + 1aea: ec26 sd s1,24(sp) + 1aec: e84a sd s2,16(sp) + 1aee: e44e sd s3,8(sp) + 1af0: 1800 addi s0,sp,48 + 1af2: 89aa mv s3,a0 + for(n=0; n + if(pid < 0) + 1afe: 06054063 bltz a0,1b5e + if(pid == 0) + 1b02: cd11 beqz a0,1b1e + for(n=0; n + printf("%s: fork claimed to work 1000 times!\n", s); + 1b0a: 85ce mv a1,s3 + 1b0c: 00004517 auipc a0,0x4 + 1b10: 3c450513 addi a0,a0,964 # 5ed0 + 1b14: 6a0030ef jal 51b4 + exit(1); + 1b18: 4505 li a0,1 + 1b1a: 25a030ef jal 4d74 + exit(0); + 1b1e: 256030ef jal 4d74 + printf("%s: no fork at all!\n", s); + 1b22: 85ce mv a1,s3 + 1b24: 00004517 auipc a0,0x4 + 1b28: 36450513 addi a0,a0,868 # 5e88 + 1b2c: 688030ef jal 51b4 + exit(1); + 1b30: 4505 li a0,1 + 1b32: 242030ef jal 4d74 + printf("%s: wait stopped early\n", s); + 1b36: 85ce mv a1,s3 + 1b38: 00004517 auipc a0,0x4 + 1b3c: 36850513 addi a0,a0,872 # 5ea0 + 1b40: 674030ef jal 51b4 + exit(1); + 1b44: 4505 li a0,1 + 1b46: 22e030ef jal 4d74 + printf("%s: wait got too many\n", s); + 1b4a: 85ce mv a1,s3 + 1b4c: 00004517 auipc a0,0x4 + 1b50: 36c50513 addi a0,a0,876 # 5eb8 + 1b54: 660030ef jal 51b4 + exit(1); + 1b58: 4505 li a0,1 + 1b5a: 21a030ef jal 4d74 + if (n == 0) { + 1b5e: d0f1 beqz s1,1b22 + for(; n > 0; n--){ + 1b60: 00905963 blez s1,1b72 + if(wait(0) < 0){ + 1b64: 4501 li a0,0 + 1b66: 216030ef jal 4d7c + 1b6a: fc0546e3 bltz a0,1b36 + for(; n > 0; n--){ + 1b6e: 34fd addiw s1,s1,-1 + 1b70: f8f5 bnez s1,1b64 + if(wait(0) != -1){ + 1b72: 4501 li a0,0 + 1b74: 208030ef jal 4d7c + 1b78: 57fd li a5,-1 + 1b7a: fcf518e3 bne a0,a5,1b4a +} + 1b7e: 70a2 ld ra,40(sp) + 1b80: 7402 ld s0,32(sp) + 1b82: 64e2 ld s1,24(sp) + 1b84: 6942 ld s2,16(sp) + 1b86: 69a2 ld s3,8(sp) + 1b88: 6145 addi sp,sp,48 + 1b8a: 8082 ret + +0000000000001b8c : +{ + 1b8c: 715d addi sp,sp,-80 + 1b8e: e486 sd ra,72(sp) + 1b90: e0a2 sd s0,64(sp) + 1b92: fc26 sd s1,56(sp) + 1b94: f84a sd s2,48(sp) + 1b96: f44e sd s3,40(sp) + 1b98: f052 sd s4,32(sp) + 1b9a: ec56 sd s5,24(sp) + 1b9c: 0880 addi s0,sp,80 + 1b9e: 8aaa mv s5,a0 + for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ + 1ba0: 4485 li s1,1 + 1ba2: 04fe slli s1,s1,0x1f + if(xstatus != -1) // did kernel kill child? + 1ba4: 5a7d li s4,-1 + for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ + 1ba6: 69b1 lui s3,0xc + 1ba8: 35098993 addi s3,s3,848 # c350 + 1bac: 1003d937 lui s2,0x1003d + 1bb0: 090e slli s2,s2,0x3 + 1bb2: 48090913 addi s2,s2,1152 # 1003d480 + pid = fork(); + 1bb6: 1b6030ef jal 4d6c + if(pid < 0){ + 1bba: 02054763 bltz a0,1be8 + if(pid == 0){ + 1bbe: cd1d beqz a0,1bfc + wait(&xstatus); + 1bc0: fbc40513 addi a0,s0,-68 + 1bc4: 1b8030ef jal 4d7c + if(xstatus != -1) // did kernel kill child? + 1bc8: fbc42783 lw a5,-68(s0) + 1bcc: 05479563 bne a5,s4,1c16 + for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ + 1bd0: 94ce add s1,s1,s3 + 1bd2: ff2492e3 bne s1,s2,1bb6 +} + 1bd6: 60a6 ld ra,72(sp) + 1bd8: 6406 ld s0,64(sp) + 1bda: 74e2 ld s1,56(sp) + 1bdc: 7942 ld s2,48(sp) + 1bde: 79a2 ld s3,40(sp) + 1be0: 7a02 ld s4,32(sp) + 1be2: 6ae2 ld s5,24(sp) + 1be4: 6161 addi sp,sp,80 + 1be6: 8082 ret + printf("%s: fork failed\n", s); + 1be8: 85d6 mv a1,s5 + 1bea: 00004517 auipc a0,0x4 + 1bee: 03e50513 addi a0,a0,62 # 5c28 + 1bf2: 5c2030ef jal 51b4 + exit(1); + 1bf6: 4505 li a0,1 + 1bf8: 17c030ef jal 4d74 + printf("%s: oops could read %p = %x\n", s, a, *a); + 1bfc: 0004c683 lbu a3,0(s1) + 1c00: 8626 mv a2,s1 + 1c02: 85d6 mv a1,s5 + 1c04: 00004517 auipc a0,0x4 + 1c08: 2f450513 addi a0,a0,756 # 5ef8 + 1c0c: 5a8030ef jal 51b4 + exit(1); + 1c10: 4505 li a0,1 + 1c12: 162030ef jal 4d74 + exit(1); + 1c16: 4505 li a0,1 + 1c18: 15c030ef jal 4d74 + +0000000000001c1c : +{ + 1c1c: 7179 addi sp,sp,-48 + 1c1e: f406 sd ra,40(sp) + 1c20: f022 sd s0,32(sp) + 1c22: 1800 addi s0,sp,48 + volatile uint64 a = MAXVA; + 1c24: 4785 li a5,1 + 1c26: 179a slli a5,a5,0x26 + 1c28: fcf43c23 sd a5,-40(s0) + for( ; a != 0; a <<= 1){ + 1c2c: fd843783 ld a5,-40(s0) + 1c30: cf85 beqz a5,1c68 + 1c32: ec26 sd s1,24(sp) + 1c34: e84a sd s2,16(sp) + 1c36: 892a mv s2,a0 + if(xstatus != -1) // did kernel kill child? + 1c38: 54fd li s1,-1 + pid = fork(); + 1c3a: 132030ef jal 4d6c + if(pid < 0){ + 1c3e: 02054963 bltz a0,1c70 + if(pid == 0){ + 1c42: c129 beqz a0,1c84 + wait(&xstatus); + 1c44: fd440513 addi a0,s0,-44 + 1c48: 134030ef jal 4d7c + if(xstatus != -1) // did kernel kill child? + 1c4c: fd442783 lw a5,-44(s0) + 1c50: 04979c63 bne a5,s1,1ca8 + for( ; a != 0; a <<= 1){ + 1c54: fd843783 ld a5,-40(s0) + 1c58: 0786 slli a5,a5,0x1 + 1c5a: fcf43c23 sd a5,-40(s0) + 1c5e: fd843783 ld a5,-40(s0) + 1c62: ffe1 bnez a5,1c3a + 1c64: 64e2 ld s1,24(sp) + 1c66: 6942 ld s2,16(sp) +} + 1c68: 70a2 ld ra,40(sp) + 1c6a: 7402 ld s0,32(sp) + 1c6c: 6145 addi sp,sp,48 + 1c6e: 8082 ret + printf("%s: fork failed\n", s); + 1c70: 85ca mv a1,s2 + 1c72: 00004517 auipc a0,0x4 + 1c76: fb650513 addi a0,a0,-74 # 5c28 + 1c7a: 53a030ef jal 51b4 + exit(1); + 1c7e: 4505 li a0,1 + 1c80: 0f4030ef jal 4d74 + *(char*)a = 99; + 1c84: fd843783 ld a5,-40(s0) + 1c88: 06300713 li a4,99 + 1c8c: 00e78023 sb a4,0(a5) + printf("%s: oops wrote %p\n", s, (void*)a); + 1c90: fd843603 ld a2,-40(s0) + 1c94: 85ca mv a1,s2 + 1c96: 00004517 auipc a0,0x4 + 1c9a: 28250513 addi a0,a0,642 # 5f18 + 1c9e: 516030ef jal 51b4 + exit(1); + 1ca2: 4505 li a0,1 + 1ca4: 0d0030ef jal 4d74 + exit(1); + 1ca8: 4505 li a0,1 + 1caa: 0ca030ef jal 4d74 + +0000000000001cae : +{ + 1cae: 7179 addi sp,sp,-48 + 1cb0: f406 sd ra,40(sp) + 1cb2: f022 sd s0,32(sp) + 1cb4: ec26 sd s1,24(sp) + 1cb6: 1800 addi s0,sp,48 + 1cb8: 84aa mv s1,a0 + pid = fork(); + 1cba: 0b2030ef jal 4d6c + if(pid == 0) { + 1cbe: cd11 beqz a0,1cda + } else if(pid < 0){ + 1cc0: 02054c63 bltz a0,1cf8 + wait(&xstatus); + 1cc4: fdc40513 addi a0,s0,-36 + 1cc8: 0b4030ef jal 4d7c + if(xstatus == -1) // kernel killed child? + 1ccc: fdc42503 lw a0,-36(s0) + 1cd0: 57fd li a5,-1 + 1cd2: 02f50d63 beq a0,a5,1d0c + exit(xstatus); + 1cd6: 09e030ef jal 4d74 + +static inline uint64 +r_sp() +{ + uint64 x; + asm volatile("mv %0, sp" : "=r" (x) ); + 1cda: 870a mv a4,sp + printf("%s: stacktest: read below stack %d\n", s, *sp); + 1cdc: 77fd lui a5,0xfffff + 1cde: 97ba add a5,a5,a4 + 1ce0: 0007c603 lbu a2,0(a5) # fffffffffffff000 + 1ce4: 85a6 mv a1,s1 + 1ce6: 00004517 auipc a0,0x4 + 1cea: 24a50513 addi a0,a0,586 # 5f30 + 1cee: 4c6030ef jal 51b4 + exit(1); + 1cf2: 4505 li a0,1 + 1cf4: 080030ef jal 4d74 + printf("%s: fork failed\n", s); + 1cf8: 85a6 mv a1,s1 + 1cfa: 00004517 auipc a0,0x4 + 1cfe: f2e50513 addi a0,a0,-210 # 5c28 + 1d02: 4b2030ef jal 51b4 + exit(1); + 1d06: 4505 li a0,1 + 1d08: 06c030ef jal 4d74 + exit(0); + 1d0c: 4501 li a0,0 + 1d0e: 066030ef jal 4d74 + +0000000000001d12 : +{ + 1d12: 7159 addi sp,sp,-112 + 1d14: f486 sd ra,104(sp) + 1d16: f0a2 sd s0,96(sp) + 1d18: eca6 sd s1,88(sp) + 1d1a: e8ca sd s2,80(sp) + 1d1c: e4ce sd s3,72(sp) + 1d1e: 1880 addi s0,sp,112 + 1d20: 89aa mv s3,a0 + uint64 addrs[] = { 0, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 1d22: 00006797 auipc a5,0x6 + 1d26: bbe78793 addi a5,a5,-1090 # 78e0 + 1d2a: 7788 ld a0,40(a5) + 1d2c: 7b8c ld a1,48(a5) + 1d2e: 7f90 ld a2,56(a5) + 1d30: 63b4 ld a3,64(a5) + 1d32: 67b8 ld a4,72(a5) + 1d34: 6bbc ld a5,80(a5) + 1d36: f8a43c23 sd a0,-104(s0) + 1d3a: fab43023 sd a1,-96(s0) + 1d3e: fac43423 sd a2,-88(s0) + 1d42: fad43823 sd a3,-80(s0) + 1d46: fae43c23 sd a4,-72(s0) + 1d4a: fcf43023 sd a5,-64(s0) + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 1d4e: 4481 li s1,0 + 1d50: 4919 li s2,6 + pid = fork(); + 1d52: 01a030ef jal 4d6c + if(pid == 0) { + 1d56: c105 beqz a0,1d76 + } else if(pid < 0){ + 1d58: 04054263 bltz a0,1d9c + wait(&xstatus); + 1d5c: fcc40513 addi a0,s0,-52 + 1d60: 01c030ef jal 4d7c + if(xstatus == 0){ + 1d64: fcc42783 lw a5,-52(s0) + 1d68: c7a1 beqz a5,1db0 + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 1d6a: 2485 addiw s1,s1,1 + 1d6c: ff2493e3 bne s1,s2,1d52 + exit(0); + 1d70: 4501 li a0,0 + 1d72: 002030ef jal 4d74 + volatile int *addr = (int *) addrs[ai]; + 1d76: 048e slli s1,s1,0x3 + 1d78: fd048793 addi a5,s1,-48 + 1d7c: 008784b3 add s1,a5,s0 + 1d80: fc84b603 ld a2,-56(s1) + *addr = 10; + 1d84: 47a9 li a5,10 + 1d86: c21c sw a5,0(a2) + printf("%s: write to %p did not fail!\n", s, addr); + 1d88: 85ce mv a1,s3 + 1d8a: 00004517 auipc a0,0x4 + 1d8e: 1ce50513 addi a0,a0,462 # 5f58 + 1d92: 422030ef jal 51b4 + exit(0); + 1d96: 4501 li a0,0 + 1d98: 7dd020ef jal 4d74 + printf("%s: fork failed\n", s); + 1d9c: 85ce mv a1,s3 + 1d9e: 00004517 auipc a0,0x4 + 1da2: e8a50513 addi a0,a0,-374 # 5c28 + 1da6: 40e030ef jal 51b4 + exit(1); + 1daa: 4505 li a0,1 + 1dac: 7c9020ef jal 4d74 + exit(1); + 1db0: 4505 li a0,1 + 1db2: 7c3020ef jal 4d74 + +0000000000001db6 : +{ + 1db6: 711d addi sp,sp,-96 + 1db8: ec86 sd ra,88(sp) + 1dba: e8a2 sd s0,80(sp) + 1dbc: e4a6 sd s1,72(sp) + 1dbe: e0ca sd s2,64(sp) + 1dc0: fc4e sd s3,56(sp) + 1dc2: f456 sd s5,40(sp) + 1dc4: 1080 addi s0,sp,96 + 1dc6: 8aaa mv s5,a0 + for(int ci = 0; ci < nchildren; ci++){ + 1dc8: 4981 li s3,0 + 1dca: 4911 li s2,4 + int pid = fork(); + 1dcc: 7a1020ef jal 4d6c + 1dd0: 84aa mv s1,a0 + if(pid < 0){ + 1dd2: 02054963 bltz a0,1e04 + if(pid == 0){ + 1dd6: c139 beqz a0,1e1c + for(int ci = 0; ci < nchildren; ci++){ + 1dd8: 2985 addiw s3,s3,1 + 1dda: ff2999e3 bne s3,s2,1dcc + 1dde: f852 sd s4,48(sp) + 1de0: f05a sd s6,32(sp) + 1de2: ec5e sd s7,24(sp) + 1de4: 4491 li s1,4 + int st = 0; + 1de6: fa042423 sw zero,-88(s0) + wait(&st); + 1dea: fa840513 addi a0,s0,-88 + 1dee: 78f020ef jal 4d7c + if(st != 0) + 1df2: fa842503 lw a0,-88(s0) + 1df6: 0c051863 bnez a0,1ec6 + for(int ci = 0; ci < nchildren; ci++){ + 1dfa: 34fd addiw s1,s1,-1 + 1dfc: f4ed bnez s1,1de6 + exit(0); + 1dfe: 4501 li a0,0 + 1e00: 775020ef jal 4d74 + 1e04: f852 sd s4,48(sp) + 1e06: f05a sd s6,32(sp) + 1e08: ec5e sd s7,24(sp) + printf("fork failed\n"); + 1e0a: 00005517 auipc a0,0x5 + 1e0e: 3c650513 addi a0,a0,966 # 71d0 + 1e12: 3a2030ef jal 51b4 + exit(1); + 1e16: 4505 li a0,1 + 1e18: 75d020ef jal 4d74 + 1e1c: f852 sd s4,48(sp) + 1e1e: f05a sd s6,32(sp) + 1e20: ec5e sd s7,24(sp) + name[0] = 'b'; + 1e22: 06200793 li a5,98 + 1e26: faf40423 sb a5,-88(s0) + name[1] = 'a' + ci; + 1e2a: 0619879b addiw a5,s3,97 + 1e2e: faf404a3 sb a5,-87(s0) + name[2] = '\0'; + 1e32: fa040523 sb zero,-86(s0) + unlink(name); + 1e36: fa840513 addi a0,s0,-88 + 1e3a: 78b020ef jal 4dc4 + 1e3e: 4bf9 li s7,30 + int cc = write(fd, buf, sz); + 1e40: 0000bb17 auipc s6,0xb + 1e44: e78b0b13 addi s6,s6,-392 # ccb8 + for(int i = 0; i < ci+1; i++){ + 1e48: 8a26 mv s4,s1 + 1e4a: 0209c863 bltz s3,1e7a + int fd = open(name, O_CREATE | O_RDWR); + 1e4e: 20200593 li a1,514 + 1e52: fa840513 addi a0,s0,-88 + 1e56: 75f020ef jal 4db4 + 1e5a: 892a mv s2,a0 + if(fd < 0){ + 1e5c: 02054d63 bltz a0,1e96 + int cc = write(fd, buf, sz); + 1e60: 660d lui a2,0x3 + 1e62: 85da mv a1,s6 + 1e64: 731020ef jal 4d94 + if(cc != sz){ + 1e68: 678d lui a5,0x3 + 1e6a: 04f51263 bne a0,a5,1eae + close(fd); + 1e6e: 854a mv a0,s2 + 1e70: 72d020ef jal 4d9c + for(int i = 0; i < ci+1; i++){ + 1e74: 2a05 addiw s4,s4,1 + 1e76: fd49dce3 bge s3,s4,1e4e + unlink(name); + 1e7a: fa840513 addi a0,s0,-88 + 1e7e: 747020ef jal 4dc4 + for(int iters = 0; iters < howmany; iters++){ + 1e82: 3bfd addiw s7,s7,-1 + 1e84: fc0b92e3 bnez s7,1e48 + unlink(name); + 1e88: fa840513 addi a0,s0,-88 + 1e8c: 739020ef jal 4dc4 + exit(0); + 1e90: 4501 li a0,0 + 1e92: 6e3020ef jal 4d74 + printf("%s: cannot create %s\n", s, name); + 1e96: fa840613 addi a2,s0,-88 + 1e9a: 85d6 mv a1,s5 + 1e9c: 00004517 auipc a0,0x4 + 1ea0: 0dc50513 addi a0,a0,220 # 5f78 + 1ea4: 310030ef jal 51b4 + exit(1); + 1ea8: 4505 li a0,1 + 1eaa: 6cb020ef jal 4d74 + printf("%s: write(%d) ret %d\n", s, sz, cc); + 1eae: 86aa mv a3,a0 + 1eb0: 660d lui a2,0x3 + 1eb2: 85d6 mv a1,s5 + 1eb4: 00003517 auipc a0,0x3 + 1eb8: 5b450513 addi a0,a0,1460 # 5468 + 1ebc: 2f8030ef jal 51b4 + exit(1); + 1ec0: 4505 li a0,1 + 1ec2: 6b3020ef jal 4d74 + exit(st); + 1ec6: 6af020ef jal 4d74 + +0000000000001eca : +{ + 1eca: 7179 addi sp,sp,-48 + 1ecc: f406 sd ra,40(sp) + 1ece: f022 sd s0,32(sp) + 1ed0: ec26 sd s1,24(sp) + 1ed2: 1800 addi s0,sp,48 + sbrk(8192); + 1ed4: 6509 lui a0,0x2 + 1ed6: 66b020ef jal 4d40 + uint64 top = (uint64) sbrk(0); + 1eda: 4501 li a0,0 + 1edc: 665020ef jal 4d40 + if((top % PGSIZE) != 0){ + 1ee0: 03451793 slli a5,a0,0x34 + 1ee4: e7bd bnez a5,1f52 + top = (uint64) sbrk(0); + 1ee6: 4501 li a0,0 + 1ee8: 659020ef jal 4d40 + if(top % PGSIZE){ + 1eec: 03451793 slli a5,a0,0x34 + 1ef0: ebad bnez a5,1f62 + char *b = (char *) (top - 1); + 1ef2: fff50493 addi s1,a0,-1 # 1fff + *b = 'x'; + 1ef6: 07800793 li a5,120 + 1efa: fef50fa3 sb a5,-1(a0) + int ret = unlink(b); + 1efe: 8526 mv a0,s1 + 1f00: 6c5020ef jal 4dc4 + if(ret != -1){ + 1f04: 57fd li a5,-1 + 1f06: 06f51763 bne a0,a5,1f74 + int fd = open(b, O_CREATE | O_WRONLY); + 1f0a: 20100593 li a1,513 + 1f0e: 8526 mv a0,s1 + 1f10: 6a5020ef jal 4db4 + if(fd != -1){ + 1f14: 57fd li a5,-1 + 1f16: 06f51a63 bne a0,a5,1f8a + ret = link(b, b); + 1f1a: 85a6 mv a1,s1 + 1f1c: 8526 mv a0,s1 + 1f1e: 6b7020ef jal 4dd4 + if(ret != -1){ + 1f22: 57fd li a5,-1 + 1f24: 06f51e63 bne a0,a5,1fa0 + char *args[] = { "xx", 0 }; + 1f28: 00005797 auipc a5,0x5 + 1f2c: d5078793 addi a5,a5,-688 # 6c78 + 1f30: fcf43823 sd a5,-48(s0) + 1f34: fc043c23 sd zero,-40(s0) + ret = exec(b, args); + 1f38: fd040593 addi a1,s0,-48 + 1f3c: 8526 mv a0,s1 + 1f3e: 66f020ef jal 4dac + if(ret != -1){ + 1f42: 57fd li a5,-1 + 1f44: 06f51a63 bne a0,a5,1fb8 +} + 1f48: 70a2 ld ra,40(sp) + 1f4a: 7402 ld s0,32(sp) + 1f4c: 64e2 ld s1,24(sp) + 1f4e: 6145 addi sp,sp,48 + 1f50: 8082 ret + sbrk(PGSIZE - (top % PGSIZE)); + 1f52: 0347d513 srli a0,a5,0x34 + 1f56: 6785 lui a5,0x1 + 1f58: 40a7853b subw a0,a5,a0 + 1f5c: 5e5020ef jal 4d40 + 1f60: b759 j 1ee6 + printf("oops\n"); + 1f62: 00004517 auipc a0,0x4 + 1f66: 02e50513 addi a0,a0,46 # 5f90 + 1f6a: 24a030ef jal 51b4 + exit(1); + 1f6e: 4505 li a0,1 + 1f70: 605020ef jal 4d74 + printf("unlink(%s) returned %d, not -1\n", b, ret); + 1f74: 862a mv a2,a0 + 1f76: 85a6 mv a1,s1 + 1f78: 00004517 auipc a0,0x4 + 1f7c: bd050513 addi a0,a0,-1072 # 5b48 + 1f80: 234030ef jal 51b4 + exit(1); + 1f84: 4505 li a0,1 + 1f86: 5ef020ef jal 4d74 + printf("open(%s) returned %d, not -1\n", b, fd); + 1f8a: 862a mv a2,a0 + 1f8c: 85a6 mv a1,s1 + 1f8e: 00004517 auipc a0,0x4 + 1f92: bda50513 addi a0,a0,-1062 # 5b68 + 1f96: 21e030ef jal 51b4 + exit(1); + 1f9a: 4505 li a0,1 + 1f9c: 5d9020ef jal 4d74 + printf("link(%s, %s) returned %d, not -1\n", b, b, ret); + 1fa0: 86aa mv a3,a0 + 1fa2: 8626 mv a2,s1 + 1fa4: 85a6 mv a1,s1 + 1fa6: 00004517 auipc a0,0x4 + 1faa: be250513 addi a0,a0,-1054 # 5b88 + 1fae: 206030ef jal 51b4 + exit(1); + 1fb2: 4505 li a0,1 + 1fb4: 5c1020ef jal 4d74 + printf("exec(%s) returned %d, not -1\n", b, fd); + 1fb8: 567d li a2,-1 + 1fba: 85a6 mv a1,s1 + 1fbc: 00004517 auipc a0,0x4 + 1fc0: bf450513 addi a0,a0,-1036 # 5bb0 + 1fc4: 1f0030ef jal 51b4 + exit(1); + 1fc8: 4505 li a0,1 + 1fca: 5ab020ef jal 4d74 + +0000000000001fce : +{ + 1fce: 1101 addi sp,sp,-32 + 1fd0: ec06 sd ra,24(sp) + 1fd2: e822 sd s0,16(sp) + 1fd4: 1000 addi s0,sp,32 + uint64 a = (uint64) sbrk(8192); + 1fd6: 6509 lui a0,0x2 + 1fd8: 569020ef jal 4d40 + if(a == (uint64) SBRK_ERROR) { + 1fdc: 57fd li a5,-1 + 1fde: 04f50a63 beq a0,a5,2032 + 1fe2: e426 sd s1,8(sp) + 1fe4: 84aa mv s1,a0 + if (sbrk(-8192) == SBRK_ERROR) { + 1fe6: 7579 lui a0,0xffffe + 1fe8: 559020ef jal 4d40 + 1fec: 57fd li a5,-1 + 1fee: 04f50d63 beq a0,a5,2048 + 1ff2: e04a sd s2,0(sp) + fd = open("rwsbrk", O_CREATE|O_WRONLY); + 1ff4: 20100593 li a1,513 + 1ff8: 00004517 auipc a0,0x4 + 1ffc: fd850513 addi a0,a0,-40 # 5fd0 + 2000: 5b5020ef jal 4db4 + 2004: 892a mv s2,a0 + if(fd < 0){ + 2006: 04054b63 bltz a0,205c + n = write(fd, (void*)(a+PGSIZE), 1024); + 200a: 6785 lui a5,0x1 + 200c: 94be add s1,s1,a5 + 200e: 40000613 li a2,1024 + 2012: 85a6 mv a1,s1 + 2014: 581020ef jal 4d94 + 2018: 862a mv a2,a0 + if(n >= 0){ + 201a: 04054a63 bltz a0,206e + printf("write(fd, %p, 1024) returned %d, not -1\n", (void*)a+PGSIZE, n); + 201e: 85a6 mv a1,s1 + 2020: 00004517 auipc a0,0x4 + 2024: fd050513 addi a0,a0,-48 # 5ff0 + 2028: 18c030ef jal 51b4 + exit(1); + 202c: 4505 li a0,1 + 202e: 547020ef jal 4d74 + 2032: e426 sd s1,8(sp) + 2034: e04a sd s2,0(sp) + printf("sbrk(rwsbrk) failed\n"); + 2036: 00004517 auipc a0,0x4 + 203a: f6250513 addi a0,a0,-158 # 5f98 + 203e: 176030ef jal 51b4 + exit(1); + 2042: 4505 li a0,1 + 2044: 531020ef jal 4d74 + 2048: e04a sd s2,0(sp) + printf("sbrk(rwsbrk) shrink failed\n"); + 204a: 00004517 auipc a0,0x4 + 204e: f6650513 addi a0,a0,-154 # 5fb0 + 2052: 162030ef jal 51b4 + exit(1); + 2056: 4505 li a0,1 + 2058: 51d020ef jal 4d74 + printf("open(rwsbrk) failed\n"); + 205c: 00004517 auipc a0,0x4 + 2060: f7c50513 addi a0,a0,-132 # 5fd8 + 2064: 150030ef jal 51b4 + exit(1); + 2068: 4505 li a0,1 + 206a: 50b020ef jal 4d74 + close(fd); + 206e: 854a mv a0,s2 + 2070: 52d020ef jal 4d9c + unlink("rwsbrk"); + 2074: 00004517 auipc a0,0x4 + 2078: f5c50513 addi a0,a0,-164 # 5fd0 + 207c: 549020ef jal 4dc4 + fd = open("README", O_RDONLY); + 2080: 4581 li a1,0 + 2082: 00003517 auipc a0,0x3 + 2086: 4ee50513 addi a0,a0,1262 # 5570 + 208a: 52b020ef jal 4db4 + 208e: 892a mv s2,a0 + if(fd < 0){ + 2090: 02054363 bltz a0,20b6 + n = read(fd, (void*)(a+PGSIZE), 10); + 2094: 4629 li a2,10 + 2096: 85a6 mv a1,s1 + 2098: 4f5020ef jal 4d8c + 209c: 862a mv a2,a0 + if(n >= 0){ + 209e: 02054563 bltz a0,20c8 + printf("read(fd, %p, 10) returned %d, not -1\n", (void*)a+PGSIZE, n); + 20a2: 85a6 mv a1,s1 + 20a4: 00004517 auipc a0,0x4 + 20a8: f7c50513 addi a0,a0,-132 # 6020 + 20ac: 108030ef jal 51b4 + exit(1); + 20b0: 4505 li a0,1 + 20b2: 4c3020ef jal 4d74 + printf("open(README) failed\n"); + 20b6: 00003517 auipc a0,0x3 + 20ba: 4c250513 addi a0,a0,1218 # 5578 + 20be: 0f6030ef jal 51b4 + exit(1); + 20c2: 4505 li a0,1 + 20c4: 4b1020ef jal 4d74 + close(fd); + 20c8: 854a mv a0,s2 + 20ca: 4d3020ef jal 4d9c + exit(0); + 20ce: 4501 li a0,0 + 20d0: 4a5020ef jal 4d74 + +00000000000020d4 : +{ + 20d4: 7139 addi sp,sp,-64 + 20d6: fc06 sd ra,56(sp) + 20d8: f822 sd s0,48(sp) + 20da: ec4e sd s3,24(sp) + 20dc: 0080 addi s0,sp,64 + 20de: 89aa mv s3,a0 + pid = fork(); + 20e0: 48d020ef jal 4d6c + if(pid < 0){ + 20e4: 02054b63 bltz a0,211a + if(pid == 0){ + 20e8: e939 bnez a0,213e + a = sbrk(TOOMUCH); + 20ea: 40000537 lui a0,0x40000 + 20ee: 453020ef jal 4d40 + if(a == (char*)SBRK_ERROR){ + 20f2: 57fd li a5,-1 + 20f4: 02f50f63 beq a0,a5,2132 + 20f8: f426 sd s1,40(sp) + 20fa: f04a sd s2,32(sp) + 20fc: e852 sd s4,16(sp) + for(b = a; b < a+TOOMUCH; b += PGSIZE){ + 20fe: 400007b7 lui a5,0x40000 + 2102: 97aa add a5,a5,a0 + *b = 99; + 2104: 06300693 li a3,99 + for(b = a; b < a+TOOMUCH; b += PGSIZE){ + 2108: 6705 lui a4,0x1 + *b = 99; + 210a: 00d50023 sb a3,0(a0) # 40000000 + for(b = a; b < a+TOOMUCH; b += PGSIZE){ + 210e: 953a add a0,a0,a4 + 2110: fef51de3 bne a0,a5,210a + exit(1); + 2114: 4505 li a0,1 + 2116: 45f020ef jal 4d74 + 211a: f426 sd s1,40(sp) + 211c: f04a sd s2,32(sp) + 211e: e852 sd s4,16(sp) + printf("fork failed in sbrkbasic\n"); + 2120: 00004517 auipc a0,0x4 + 2124: f2850513 addi a0,a0,-216 # 6048 + 2128: 08c030ef jal 51b4 + exit(1); + 212c: 4505 li a0,1 + 212e: 447020ef jal 4d74 + 2132: f426 sd s1,40(sp) + 2134: f04a sd s2,32(sp) + 2136: e852 sd s4,16(sp) + exit(0); + 2138: 4501 li a0,0 + 213a: 43b020ef jal 4d74 + wait(&xstatus); + 213e: fcc40513 addi a0,s0,-52 + 2142: 43b020ef jal 4d7c + if(xstatus == 1){ + 2146: fcc42703 lw a4,-52(s0) + 214a: 4785 li a5,1 + 214c: 00f70e63 beq a4,a5,2168 + 2150: f426 sd s1,40(sp) + 2152: f04a sd s2,32(sp) + 2154: e852 sd s4,16(sp) + a = sbrk(0); + 2156: 4501 li a0,0 + 2158: 3e9020ef jal 4d40 + 215c: 84aa mv s1,a0 + for(i = 0; i < 5000; i++){ + 215e: 4901 li s2,0 + 2160: 6a05 lui s4,0x1 + 2162: 388a0a13 addi s4,s4,904 # 1388 + 2166: a839 j 2184 + 2168: f426 sd s1,40(sp) + 216a: f04a sd s2,32(sp) + 216c: e852 sd s4,16(sp) + printf("%s: too much memory allocated!\n", s); + 216e: 85ce mv a1,s3 + 2170: 00004517 auipc a0,0x4 + 2174: ef850513 addi a0,a0,-264 # 6068 + 2178: 03c030ef jal 51b4 + exit(1); + 217c: 4505 li a0,1 + 217e: 3f7020ef jal 4d74 + 2182: 84be mv s1,a5 + b = sbrk(1); + 2184: 4505 li a0,1 + 2186: 3bb020ef jal 4d40 + if(b != a){ + 218a: 04951263 bne a0,s1,21ce + *b = 1; + 218e: 4785 li a5,1 + 2190: 00f48023 sb a5,0(s1) + a = b + 1; + 2194: 00148793 addi a5,s1,1 + for(i = 0; i < 5000; i++){ + 2198: 2905 addiw s2,s2,1 + 219a: ff4914e3 bne s2,s4,2182 + pid = fork(); + 219e: 3cf020ef jal 4d6c + 21a2: 892a mv s2,a0 + if(pid < 0){ + 21a4: 04054263 bltz a0,21e8 + c = sbrk(1); + 21a8: 4505 li a0,1 + 21aa: 397020ef jal 4d40 + c = sbrk(1); + 21ae: 4505 li a0,1 + 21b0: 391020ef jal 4d40 + if(c != a + 1){ + 21b4: 0489 addi s1,s1,2 + 21b6: 04a48363 beq s1,a0,21fc + printf("%s: sbrk test failed post-fork\n", s); + 21ba: 85ce mv a1,s3 + 21bc: 00004517 auipc a0,0x4 + 21c0: f0c50513 addi a0,a0,-244 # 60c8 + 21c4: 7f1020ef jal 51b4 + exit(1); + 21c8: 4505 li a0,1 + 21ca: 3ab020ef jal 4d74 + printf("%s: sbrk test failed %d %p %p\n", s, i, a, b); + 21ce: 872a mv a4,a0 + 21d0: 86a6 mv a3,s1 + 21d2: 864a mv a2,s2 + 21d4: 85ce mv a1,s3 + 21d6: 00004517 auipc a0,0x4 + 21da: eb250513 addi a0,a0,-334 # 6088 + 21de: 7d7020ef jal 51b4 + exit(1); + 21e2: 4505 li a0,1 + 21e4: 391020ef jal 4d74 + printf("%s: sbrk test fork failed\n", s); + 21e8: 85ce mv a1,s3 + 21ea: 00004517 auipc a0,0x4 + 21ee: ebe50513 addi a0,a0,-322 # 60a8 + 21f2: 7c3020ef jal 51b4 + exit(1); + 21f6: 4505 li a0,1 + 21f8: 37d020ef jal 4d74 + if(pid == 0) + 21fc: 00091563 bnez s2,2206 + exit(0); + 2200: 4501 li a0,0 + 2202: 373020ef jal 4d74 + wait(&xstatus); + 2206: fcc40513 addi a0,s0,-52 + 220a: 373020ef jal 4d7c + exit(xstatus); + 220e: fcc42503 lw a0,-52(s0) + 2212: 363020ef jal 4d74 + +0000000000002216 : +{ + 2216: 7179 addi sp,sp,-48 + 2218: f406 sd ra,40(sp) + 221a: f022 sd s0,32(sp) + 221c: ec26 sd s1,24(sp) + 221e: e84a sd s2,16(sp) + 2220: e44e sd s3,8(sp) + 2222: e052 sd s4,0(sp) + 2224: 1800 addi s0,sp,48 + 2226: 89aa mv s3,a0 + oldbrk = sbrk(0); + 2228: 4501 li a0,0 + 222a: 317020ef jal 4d40 + 222e: 892a mv s2,a0 + a = sbrk(0); + 2230: 4501 li a0,0 + 2232: 30f020ef jal 4d40 + 2236: 84aa mv s1,a0 + p = sbrk(amt); + 2238: 06400537 lui a0,0x6400 + 223c: 9d05 subw a0,a0,s1 + 223e: 303020ef jal 4d40 + if (p != a) { + 2242: 08a49763 bne s1,a0,22d0 + *lastaddr = 99; + 2246: 064007b7 lui a5,0x6400 + 224a: 06300713 li a4,99 + 224e: fee78fa3 sb a4,-1(a5) # 63fffff + a = sbrk(0); + 2252: 4501 li a0,0 + 2254: 2ed020ef jal 4d40 + 2258: 84aa mv s1,a0 + c = sbrk(-PGSIZE); + 225a: 757d lui a0,0xfffff + 225c: 2e5020ef jal 4d40 + if(c == (char*)SBRK_ERROR){ + 2260: 57fd li a5,-1 + 2262: 08f50163 beq a0,a5,22e4 + c = sbrk(0); + 2266: 4501 li a0,0 + 2268: 2d9020ef jal 4d40 + if(c != a - PGSIZE){ + 226c: 77fd lui a5,0xfffff + 226e: 97a6 add a5,a5,s1 + 2270: 08f51463 bne a0,a5,22f8 + a = sbrk(0); + 2274: 4501 li a0,0 + 2276: 2cb020ef jal 4d40 + 227a: 84aa mv s1,a0 + c = sbrk(PGSIZE); + 227c: 6505 lui a0,0x1 + 227e: 2c3020ef jal 4d40 + 2282: 8a2a mv s4,a0 + if(c != a || sbrk(0) != a + PGSIZE){ + 2284: 08a49663 bne s1,a0,2310 + 2288: 4501 li a0,0 + 228a: 2b7020ef jal 4d40 + 228e: 6785 lui a5,0x1 + 2290: 97a6 add a5,a5,s1 + 2292: 06f51f63 bne a0,a5,2310 + if(*lastaddr == 99){ + 2296: 064007b7 lui a5,0x6400 + 229a: fff7c703 lbu a4,-1(a5) # 63fffff + 229e: 06300793 li a5,99 + 22a2: 08f70363 beq a4,a5,2328 + a = sbrk(0); + 22a6: 4501 li a0,0 + 22a8: 299020ef jal 4d40 + 22ac: 84aa mv s1,a0 + c = sbrk(-(sbrk(0) - oldbrk)); + 22ae: 4501 li a0,0 + 22b0: 291020ef jal 4d40 + 22b4: 40a9053b subw a0,s2,a0 + 22b8: 289020ef jal 4d40 + if(c != a){ + 22bc: 08a49063 bne s1,a0,233c +} + 22c0: 70a2 ld ra,40(sp) + 22c2: 7402 ld s0,32(sp) + 22c4: 64e2 ld s1,24(sp) + 22c6: 6942 ld s2,16(sp) + 22c8: 69a2 ld s3,8(sp) + 22ca: 6a02 ld s4,0(sp) + 22cc: 6145 addi sp,sp,48 + 22ce: 8082 ret + printf("%s: sbrk test failed to grow big address space; enough phys mem?\n", s); + 22d0: 85ce mv a1,s3 + 22d2: 00004517 auipc a0,0x4 + 22d6: e1650513 addi a0,a0,-490 # 60e8 + 22da: 6db020ef jal 51b4 + exit(1); + 22de: 4505 li a0,1 + 22e0: 295020ef jal 4d74 + printf("%s: sbrk could not deallocate\n", s); + 22e4: 85ce mv a1,s3 + 22e6: 00004517 auipc a0,0x4 + 22ea: e4a50513 addi a0,a0,-438 # 6130 + 22ee: 6c7020ef jal 51b4 + exit(1); + 22f2: 4505 li a0,1 + 22f4: 281020ef jal 4d74 + printf("%s: sbrk deallocation produced wrong address, a %p c %p\n", s, a, c); + 22f8: 86aa mv a3,a0 + 22fa: 8626 mv a2,s1 + 22fc: 85ce mv a1,s3 + 22fe: 00004517 auipc a0,0x4 + 2302: e5250513 addi a0,a0,-430 # 6150 + 2306: 6af020ef jal 51b4 + exit(1); + 230a: 4505 li a0,1 + 230c: 269020ef jal 4d74 + printf("%s: sbrk re-allocation failed, a %p c %p\n", s, a, c); + 2310: 86d2 mv a3,s4 + 2312: 8626 mv a2,s1 + 2314: 85ce mv a1,s3 + 2316: 00004517 auipc a0,0x4 + 231a: e7a50513 addi a0,a0,-390 # 6190 + 231e: 697020ef jal 51b4 + exit(1); + 2322: 4505 li a0,1 + 2324: 251020ef jal 4d74 + printf("%s: sbrk de-allocation didn't really deallocate\n", s); + 2328: 85ce mv a1,s3 + 232a: 00004517 auipc a0,0x4 + 232e: e9650513 addi a0,a0,-362 # 61c0 + 2332: 683020ef jal 51b4 + exit(1); + 2336: 4505 li a0,1 + 2338: 23d020ef jal 4d74 + printf("%s: sbrk downsize failed, a %p c %p\n", s, a, c); + 233c: 86aa mv a3,a0 + 233e: 8626 mv a2,s1 + 2340: 85ce mv a1,s3 + 2342: 00004517 auipc a0,0x4 + 2346: eb650513 addi a0,a0,-330 # 61f8 + 234a: 66b020ef jal 51b4 + exit(1); + 234e: 4505 li a0,1 + 2350: 225020ef jal 4d74 + +0000000000002354 : +{ + 2354: 7179 addi sp,sp,-48 + 2356: f406 sd ra,40(sp) + 2358: f022 sd s0,32(sp) + 235a: ec26 sd s1,24(sp) + 235c: e84a sd s2,16(sp) + 235e: e44e sd s3,8(sp) + 2360: 1800 addi s0,sp,48 + 2362: 89aa mv s3,a0 + a = sbrk(PGSIZE); + 2364: 6505 lui a0,0x1 + 2366: 1db020ef jal 4d40 + 236a: 892a mv s2,a0 + fd = open("sbrk", O_CREATE|O_WRONLY); + 236c: 20100593 li a1,513 + 2370: 00004517 auipc a0,0x4 + 2374: eb050513 addi a0,a0,-336 # 6220 + 2378: 23d020ef jal 4db4 + 237c: 84aa mv s1,a0 + unlink("sbrk"); + 237e: 00004517 auipc a0,0x4 + 2382: ea250513 addi a0,a0,-350 # 6220 + 2386: 23f020ef jal 4dc4 + if(fd < 0) { + 238a: 0204c963 bltz s1,23bc + if ((n = write(fd, a, PGSIZE)) < 0) { + 238e: 6605 lui a2,0x1 + 2390: 85ca mv a1,s2 + 2392: 8526 mv a0,s1 + 2394: 201020ef jal 4d94 + 2398: 02054c63 bltz a0,23d0 + close(fd); + 239c: 8526 mv a0,s1 + 239e: 1ff020ef jal 4d9c + a = sbrk(PGSIZE); + 23a2: 6505 lui a0,0x1 + 23a4: 19d020ef jal 4d40 + if(pipe((int *) a) != 0){ + 23a8: 1dd020ef jal 4d84 + 23ac: ed05 bnez a0,23e4 +} + 23ae: 70a2 ld ra,40(sp) + 23b0: 7402 ld s0,32(sp) + 23b2: 64e2 ld s1,24(sp) + 23b4: 6942 ld s2,16(sp) + 23b6: 69a2 ld s3,8(sp) + 23b8: 6145 addi sp,sp,48 + 23ba: 8082 ret + printf("%s: open sbrk failed\n", s); + 23bc: 85ce mv a1,s3 + 23be: 00004517 auipc a0,0x4 + 23c2: e6a50513 addi a0,a0,-406 # 6228 + 23c6: 5ef020ef jal 51b4 + exit(1); + 23ca: 4505 li a0,1 + 23cc: 1a9020ef jal 4d74 + printf("%s: write sbrk failed\n", s); + 23d0: 85ce mv a1,s3 + 23d2: 00004517 auipc a0,0x4 + 23d6: e6e50513 addi a0,a0,-402 # 6240 + 23da: 5db020ef jal 51b4 + exit(1); + 23de: 4505 li a0,1 + 23e0: 195020ef jal 4d74 + printf("%s: pipe() failed\n", s); + 23e4: 85ce mv a1,s3 + 23e6: 00004517 auipc a0,0x4 + 23ea: 94a50513 addi a0,a0,-1718 # 5d30 + 23ee: 5c7020ef jal 51b4 + exit(1); + 23f2: 4505 li a0,1 + 23f4: 181020ef jal 4d74 + +00000000000023f8 : +{ + 23f8: 1101 addi sp,sp,-32 + 23fa: ec06 sd ra,24(sp) + 23fc: e822 sd s0,16(sp) + 23fe: e426 sd s1,8(sp) + 2400: e04a sd s2,0(sp) + 2402: 1000 addi s0,sp,32 + 2404: 892a mv s2,a0 + fd = open("init", O_RDONLY); + 2406: 4581 li a1,0 + 2408: 00004517 auipc a0,0x4 + 240c: e5050513 addi a0,a0,-432 # 6258 + 2410: 1a5020ef jal 4db4 + if (fd < 0) { + 2414: 02054563 bltz a0,243e + 2418: 84aa mv s1,a0 + read(fd, sbrk(0) - 1, -1); + 241a: 4501 li a0,0 + 241c: 125020ef jal 4d40 + 2420: 567d li a2,-1 + 2422: fff50593 addi a1,a0,-1 + 2426: 8526 mv a0,s1 + 2428: 165020ef jal 4d8c + close(fd); + 242c: 8526 mv a0,s1 + 242e: 16f020ef jal 4d9c +} + 2432: 60e2 ld ra,24(sp) + 2434: 6442 ld s0,16(sp) + 2436: 64a2 ld s1,8(sp) + 2438: 6902 ld s2,0(sp) + 243a: 6105 addi sp,sp,32 + 243c: 8082 ret + printf("%s: open failed\n", s); + 243e: 85ca mv a1,s2 + 2440: 00004517 auipc a0,0x4 + 2444: 80050513 addi a0,a0,-2048 # 5c40 + 2448: 56d020ef jal 51b4 + exit(1); + 244c: 4505 li a0,1 + 244e: 127020ef jal 4d74 + +0000000000002452 : +{ + 2452: 1141 addi sp,sp,-16 + 2454: e406 sd ra,8(sp) + 2456: e022 sd s0,0(sp) + 2458: 0800 addi s0,sp,16 + int pid = fork(); + 245a: 113020ef jal 4d6c + if(pid < 0){ + 245e: 00054c63 bltz a0,2476 + if(pid == 0){ + 2462: e11d bnez a0,2488 + int sz = (uint64) sbrk(0); + 2464: 0dd020ef jal 4d40 + sbrk(-sz); + 2468: 40a0053b negw a0,a0 + 246c: 0d5020ef jal 4d40 + exit(0); + 2470: 4501 li a0,0 + 2472: 103020ef jal 4d74 + printf("fork failed\n"); + 2476: 00005517 auipc a0,0x5 + 247a: d5a50513 addi a0,a0,-678 # 71d0 + 247e: 537020ef jal 51b4 + exit(1); + 2482: 4505 li a0,1 + 2484: 0f1020ef jal 4d74 + wait(0); + 2488: 4501 li a0,0 + 248a: 0f3020ef jal 4d7c + pid = fork(); + 248e: 0df020ef jal 4d6c + if(pid < 0){ + 2492: 00054f63 bltz a0,24b0 + if(pid == 0){ + 2496: e515 bnez a0,24c2 + int sz = (uint64) sbrk(0); + 2498: 0a9020ef jal 4d40 + sbrk(-(sz - 3500)); + 249c: 6785 lui a5,0x1 + 249e: dac7879b addiw a5,a5,-596 # dac + 24a2: 40a7853b subw a0,a5,a0 + 24a6: 09b020ef jal 4d40 + exit(0); + 24aa: 4501 li a0,0 + 24ac: 0c9020ef jal 4d74 + printf("fork failed\n"); + 24b0: 00005517 auipc a0,0x5 + 24b4: d2050513 addi a0,a0,-736 # 71d0 + 24b8: 4fd020ef jal 51b4 + exit(1); + 24bc: 4505 li a0,1 + 24be: 0b7020ef jal 4d74 + wait(0); + 24c2: 4501 li a0,0 + 24c4: 0b9020ef jal 4d7c + pid = fork(); + 24c8: 0a5020ef jal 4d6c + if(pid < 0){ + 24cc: 02054263 bltz a0,24f0 + if(pid == 0){ + 24d0: e90d bnez a0,2502 + sbrk((10*PGSIZE + 2048) - (uint64)sbrk(0)); + 24d2: 06f020ef jal 4d40 + 24d6: 67ad lui a5,0xb + 24d8: 8007879b addiw a5,a5,-2048 # a800 + 24dc: 40a7853b subw a0,a5,a0 + 24e0: 061020ef jal 4d40 + sbrk(-10); + 24e4: 5559 li a0,-10 + 24e6: 05b020ef jal 4d40 + exit(0); + 24ea: 4501 li a0,0 + 24ec: 089020ef jal 4d74 + printf("fork failed\n"); + 24f0: 00005517 auipc a0,0x5 + 24f4: ce050513 addi a0,a0,-800 # 71d0 + 24f8: 4bd020ef jal 51b4 + exit(1); + 24fc: 4505 li a0,1 + 24fe: 077020ef jal 4d74 + wait(0); + 2502: 4501 li a0,0 + 2504: 079020ef jal 4d7c + exit(0); + 2508: 4501 li a0,0 + 250a: 06b020ef jal 4d74 + +000000000000250e : +{ + 250e: 7179 addi sp,sp,-48 + 2510: f406 sd ra,40(sp) + 2512: f022 sd s0,32(sp) + 2514: ec26 sd s1,24(sp) + 2516: e84a sd s2,16(sp) + 2518: e44e sd s3,8(sp) + 251a: e052 sd s4,0(sp) + 251c: 1800 addi s0,sp,48 + uint64 top = (uint64) sbrk(0); + 251e: 4501 li a0,0 + 2520: 021020ef jal 4d40 + if((top % PGSIZE) != 0) + 2524: 03451793 slli a5,a0,0x34 + 2528: ebad bnez a5,259a + sbrk(PGSIZE); + 252a: 6505 lui a0,0x1 + 252c: 015020ef jal 4d40 + sbrk(10); + 2530: 4529 li a0,10 + 2532: 00f020ef jal 4d40 + sbrk(-20); + 2536: 5531 li a0,-20 + 2538: 009020ef jal 4d40 + top = (uint64) sbrk(0); + 253c: 4501 li a0,0 + 253e: 003020ef jal 4d40 + 2542: 84aa mv s1,a0 + char *p = (char *) (top - 64); + 2544: fc050913 addi s2,a0,-64 # fc0 + p[0] = 'x'; + 2548: 07800a13 li s4,120 + 254c: fd450023 sb s4,-64(a0) + p[1] = '\0'; + 2550: fc0500a3 sb zero,-63(a0) + int fd = open(p, O_RDWR|O_CREATE); + 2554: 20200593 li a1,514 + 2558: 854a mv a0,s2 + 255a: 05b020ef jal 4db4 + 255e: 89aa mv s3,a0 + write(fd, p, 1); + 2560: 4605 li a2,1 + 2562: 85ca mv a1,s2 + 2564: 031020ef jal 4d94 + close(fd); + 2568: 854e mv a0,s3 + 256a: 033020ef jal 4d9c + fd = open(p, O_RDWR); + 256e: 4589 li a1,2 + 2570: 854a mv a0,s2 + 2572: 043020ef jal 4db4 + p[0] = '\0'; + 2576: fc048023 sb zero,-64(s1) + read(fd, p, 1); + 257a: 4605 li a2,1 + 257c: 85ca mv a1,s2 + 257e: 00f020ef jal 4d8c + if(p[0] != 'x') + 2582: fc04c783 lbu a5,-64(s1) + 2586: 03479263 bne a5,s4,25aa +} + 258a: 70a2 ld ra,40(sp) + 258c: 7402 ld s0,32(sp) + 258e: 64e2 ld s1,24(sp) + 2590: 6942 ld s2,16(sp) + 2592: 69a2 ld s3,8(sp) + 2594: 6a02 ld s4,0(sp) + 2596: 6145 addi sp,sp,48 + 2598: 8082 ret + sbrk(PGSIZE - (top % PGSIZE)); + 259a: 0347d513 srli a0,a5,0x34 + 259e: 6785 lui a5,0x1 + 25a0: 40a7853b subw a0,a5,a0 + 25a4: 79c020ef jal 4d40 + 25a8: b749 j 252a + exit(1); + 25aa: 4505 li a0,1 + 25ac: 7c8020ef jal 4d74 + +00000000000025b0 : +{ + 25b0: 1141 addi sp,sp,-16 + 25b2: e406 sd ra,8(sp) + 25b4: e022 sd s0,0(sp) + 25b6: 0800 addi s0,sp,16 + sbrk(0x80000004); + 25b8: 80000537 lui a0,0x80000 + 25bc: 0511 addi a0,a0,4 # ffffffff80000004 + 25be: 782020ef jal 4d40 + volatile char *top = sbrk(0); + 25c2: 4501 li a0,0 + 25c4: 77c020ef jal 4d40 + *(top-1) = *(top-1) + 1; + 25c8: fff54783 lbu a5,-1(a0) + 25cc: 2785 addiw a5,a5,1 # 1001 + 25ce: 0ff7f793 zext.b a5,a5 + 25d2: fef50fa3 sb a5,-1(a0) +} + 25d6: 60a2 ld ra,8(sp) + 25d8: 6402 ld s0,0(sp) + 25da: 0141 addi sp,sp,16 + 25dc: 8082 ret + +00000000000025de : +{ + 25de: 715d addi sp,sp,-80 + 25e0: e486 sd ra,72(sp) + 25e2: e0a2 sd s0,64(sp) + 25e4: fc26 sd s1,56(sp) + 25e6: f84a sd s2,48(sp) + 25e8: f44e sd s3,40(sp) + 25ea: f052 sd s4,32(sp) + 25ec: 0880 addi s0,sp,80 + for(int avail = 0; avail < 15; avail++){ + 25ee: 4901 li s2,0 + 25f0: 49bd li s3,15 + int pid = fork(); + 25f2: 77a020ef jal 4d6c + 25f6: 84aa mv s1,a0 + if(pid < 0){ + 25f8: 00054c63 bltz a0,2610 + } else if(pid == 0){ + 25fc: c11d beqz a0,2622 + wait((int*)0); + 25fe: 4501 li a0,0 + 2600: 77c020ef jal 4d7c + for(int avail = 0; avail < 15; avail++){ + 2604: 2905 addiw s2,s2,1 + 2606: ff3916e3 bne s2,s3,25f2 + exit(0); + 260a: 4501 li a0,0 + 260c: 768020ef jal 4d74 + printf("fork failed\n"); + 2610: 00005517 auipc a0,0x5 + 2614: bc050513 addi a0,a0,-1088 # 71d0 + 2618: 39d020ef jal 51b4 + exit(1); + 261c: 4505 li a0,1 + 261e: 756020ef jal 4d74 + if(a == SBRK_ERROR) + 2622: 59fd li s3,-1 + *(a + PGSIZE - 1) = 1; + 2624: 4a05 li s4,1 + char *a = sbrk(PGSIZE); + 2626: 6505 lui a0,0x1 + 2628: 718020ef jal 4d40 + if(a == SBRK_ERROR) + 262c: 01350763 beq a0,s3,263a + *(a + PGSIZE - 1) = 1; + 2630: 6785 lui a5,0x1 + 2632: 953e add a0,a0,a5 + 2634: ff450fa3 sb s4,-1(a0) # fff + while(1){ + 2638: b7fd j 2626 + for(int i = 0; i < avail; i++) + 263a: 01205863 blez s2,264a + sbrk(-PGSIZE); + 263e: 757d lui a0,0xfffff + 2640: 700020ef jal 4d40 + for(int i = 0; i < avail; i++) + 2644: 2485 addiw s1,s1,1 + 2646: ff249ce3 bne s1,s2,263e + close(1); + 264a: 4505 li a0,1 + 264c: 750020ef jal 4d9c + char *args[] = { "echo", "x", 0 }; + 2650: 00003517 auipc a0,0x3 + 2654: d4850513 addi a0,a0,-696 # 5398 + 2658: faa43c23 sd a0,-72(s0) + 265c: 00003797 auipc a5,0x3 + 2660: dac78793 addi a5,a5,-596 # 5408 + 2664: fcf43023 sd a5,-64(s0) + 2668: fc043423 sd zero,-56(s0) + exec("echo", args); + 266c: fb840593 addi a1,s0,-72 + 2670: 73c020ef jal 4dac + exit(0); + 2674: 4501 li a0,0 + 2676: 6fe020ef jal 4d74 + +000000000000267a : +{ + 267a: 1101 addi sp,sp,-32 + 267c: ec06 sd ra,24(sp) + 267e: e822 sd s0,16(sp) + 2680: e426 sd s1,8(sp) + 2682: 1000 addi s0,sp,32 + 2684: 84aa mv s1,a0 + if(mkdir("12345678901234") != 0){ + 2686: 00004517 auipc a0,0x4 + 268a: daa50513 addi a0,a0,-598 # 6430 + 268e: 74e020ef jal 4ddc + 2692: e555 bnez a0,273e + if(mkdir("12345678901234/123456789012345") != 0){ + 2694: 00004517 auipc a0,0x4 + 2698: bf450513 addi a0,a0,-1036 # 6288 + 269c: 740020ef jal 4ddc + 26a0: e94d bnez a0,2752 + fd = open("123456789012345/123456789012345/123456789012345", O_CREATE); + 26a2: 20000593 li a1,512 + 26a6: 00004517 auipc a0,0x4 + 26aa: c3a50513 addi a0,a0,-966 # 62e0 + 26ae: 706020ef jal 4db4 + if(fd < 0){ + 26b2: 0a054a63 bltz a0,2766 + close(fd); + 26b6: 6e6020ef jal 4d9c + fd = open("12345678901234/12345678901234/12345678901234", 0); + 26ba: 4581 li a1,0 + 26bc: 00004517 auipc a0,0x4 + 26c0: c9c50513 addi a0,a0,-868 # 6358 + 26c4: 6f0020ef jal 4db4 + if(fd < 0){ + 26c8: 0a054963 bltz a0,277a + close(fd); + 26cc: 6d0020ef jal 4d9c + if(mkdir("12345678901234/12345678901234") == 0){ + 26d0: 00004517 auipc a0,0x4 + 26d4: cf850513 addi a0,a0,-776 # 63c8 + 26d8: 704020ef jal 4ddc + 26dc: c94d beqz a0,278e + if(mkdir("123456789012345/12345678901234") == 0){ + 26de: 00004517 auipc a0,0x4 + 26e2: d4250513 addi a0,a0,-702 # 6420 + 26e6: 6f6020ef jal 4ddc + 26ea: cd45 beqz a0,27a2 + unlink("123456789012345/12345678901234"); + 26ec: 00004517 auipc a0,0x4 + 26f0: d3450513 addi a0,a0,-716 # 6420 + 26f4: 6d0020ef jal 4dc4 + unlink("12345678901234/12345678901234"); + 26f8: 00004517 auipc a0,0x4 + 26fc: cd050513 addi a0,a0,-816 # 63c8 + 2700: 6c4020ef jal 4dc4 + unlink("12345678901234/12345678901234/12345678901234"); + 2704: 00004517 auipc a0,0x4 + 2708: c5450513 addi a0,a0,-940 # 6358 + 270c: 6b8020ef jal 4dc4 + unlink("123456789012345/123456789012345/123456789012345"); + 2710: 00004517 auipc a0,0x4 + 2714: bd050513 addi a0,a0,-1072 # 62e0 + 2718: 6ac020ef jal 4dc4 + unlink("12345678901234/123456789012345"); + 271c: 00004517 auipc a0,0x4 + 2720: b6c50513 addi a0,a0,-1172 # 6288 + 2724: 6a0020ef jal 4dc4 + unlink("12345678901234"); + 2728: 00004517 auipc a0,0x4 + 272c: d0850513 addi a0,a0,-760 # 6430 + 2730: 694020ef jal 4dc4 +} + 2734: 60e2 ld ra,24(sp) + 2736: 6442 ld s0,16(sp) + 2738: 64a2 ld s1,8(sp) + 273a: 6105 addi sp,sp,32 + 273c: 8082 ret + printf("%s: mkdir 12345678901234 failed\n", s); + 273e: 85a6 mv a1,s1 + 2740: 00004517 auipc a0,0x4 + 2744: b2050513 addi a0,a0,-1248 # 6260 + 2748: 26d020ef jal 51b4 + exit(1); + 274c: 4505 li a0,1 + 274e: 626020ef jal 4d74 + printf("%s: mkdir 12345678901234/123456789012345 failed\n", s); + 2752: 85a6 mv a1,s1 + 2754: 00004517 auipc a0,0x4 + 2758: b5450513 addi a0,a0,-1196 # 62a8 + 275c: 259020ef jal 51b4 + exit(1); + 2760: 4505 li a0,1 + 2762: 612020ef jal 4d74 + printf("%s: create 123456789012345/123456789012345/123456789012345 failed\n", s); + 2766: 85a6 mv a1,s1 + 2768: 00004517 auipc a0,0x4 + 276c: ba850513 addi a0,a0,-1112 # 6310 + 2770: 245020ef jal 51b4 + exit(1); + 2774: 4505 li a0,1 + 2776: 5fe020ef jal 4d74 + printf("%s: open 12345678901234/12345678901234/12345678901234 failed\n", s); + 277a: 85a6 mv a1,s1 + 277c: 00004517 auipc a0,0x4 + 2780: c0c50513 addi a0,a0,-1012 # 6388 + 2784: 231020ef jal 51b4 + exit(1); + 2788: 4505 li a0,1 + 278a: 5ea020ef jal 4d74 + printf("%s: mkdir 12345678901234/12345678901234 succeeded!\n", s); + 278e: 85a6 mv a1,s1 + 2790: 00004517 auipc a0,0x4 + 2794: c5850513 addi a0,a0,-936 # 63e8 + 2798: 21d020ef jal 51b4 + exit(1); + 279c: 4505 li a0,1 + 279e: 5d6020ef jal 4d74 + printf("%s: mkdir 12345678901234/123456789012345 succeeded!\n", s); + 27a2: 85a6 mv a1,s1 + 27a4: 00004517 auipc a0,0x4 + 27a8: c9c50513 addi a0,a0,-868 # 6440 + 27ac: 209020ef jal 51b4 + exit(1); + 27b0: 4505 li a0,1 + 27b2: 5c2020ef jal 4d74 + +00000000000027b6 : +{ + 27b6: b8010113 addi sp,sp,-1152 + 27ba: 46113c23 sd ra,1144(sp) + 27be: 46813823 sd s0,1136(sp) + 27c2: 46913423 sd s1,1128(sp) + 27c6: 47213023 sd s2,1120(sp) + 27ca: 45313c23 sd s3,1112(sp) + 27ce: 45413823 sd s4,1104(sp) + 27d2: 45513423 sd s5,1096(sp) + 27d6: 45613023 sd s6,1088(sp) + 27da: 43713c23 sd s7,1080(sp) + 27de: 43813823 sd s8,1072(sp) + 27e2: 43913423 sd s9,1064(sp) + 27e6: 48010413 addi s0,sp,1152 + 27ea: 8caa mv s9,a0 + unlink("diskfulldir"); + 27ec: 00004517 auipc a0,0x4 + 27f0: c8c50513 addi a0,a0,-884 # 6478 + 27f4: 5d0020ef jal 4dc4 + 27f8: 03000993 li s3,48 + name[0] = 'b'; + 27fc: 06200b13 li s6,98 + name[1] = 'i'; + 2800: 06900a93 li s5,105 + name[2] = 'g'; + 2804: 06700a13 li s4,103 + 2808: 10c00b93 li s7,268 + for(fi = 0; done == 0 && '0' + fi < 0177; fi++){ + 280c: 07f00c13 li s8,127 + 2810: aab9 j 296e + printf("%s: could not create file %s\n", s, name); + 2812: b8040613 addi a2,s0,-1152 + 2816: 85e6 mv a1,s9 + 2818: 00004517 auipc a0,0x4 + 281c: c7050513 addi a0,a0,-912 # 6488 + 2820: 195020ef jal 51b4 + break; + 2824: a039 j 2832 + close(fd); + 2826: 854a mv a0,s2 + 2828: 574020ef jal 4d9c + close(fd); + 282c: 854a mv a0,s2 + 282e: 56e020ef jal 4d9c + for(int i = 0; i < nzz; i++){ + 2832: 4481 li s1,0 + name[0] = 'z'; + 2834: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 2838: 08000993 li s3,128 + name[0] = 'z'; + 283c: bb240023 sb s2,-1120(s0) + name[1] = 'z'; + 2840: bb2400a3 sb s2,-1119(s0) + name[2] = '0' + (i / 32); + 2844: 41f4d71b sraiw a4,s1,0x1f + 2848: 01b7571b srliw a4,a4,0x1b + 284c: 009707bb addw a5,a4,s1 + 2850: 4057d69b sraiw a3,a5,0x5 + 2854: 0306869b addiw a3,a3,48 + 2858: bad40123 sb a3,-1118(s0) + name[3] = '0' + (i % 32); + 285c: 8bfd andi a5,a5,31 + 285e: 9f99 subw a5,a5,a4 + 2860: 0307879b addiw a5,a5,48 + 2864: baf401a3 sb a5,-1117(s0) + name[4] = '\0'; + 2868: ba040223 sb zero,-1116(s0) + unlink(name); + 286c: ba040513 addi a0,s0,-1120 + 2870: 554020ef jal 4dc4 + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + 2874: 60200593 li a1,1538 + 2878: ba040513 addi a0,s0,-1120 + 287c: 538020ef jal 4db4 + if(fd < 0) + 2880: 00054763 bltz a0,288e + close(fd); + 2884: 518020ef jal 4d9c + for(int i = 0; i < nzz; i++){ + 2888: 2485 addiw s1,s1,1 + 288a: fb3499e3 bne s1,s3,283c + if(mkdir("diskfulldir") == 0) + 288e: 00004517 auipc a0,0x4 + 2892: bea50513 addi a0,a0,-1046 # 6478 + 2896: 546020ef jal 4ddc + 289a: 12050063 beqz a0,29ba + unlink("diskfulldir"); + 289e: 00004517 auipc a0,0x4 + 28a2: bda50513 addi a0,a0,-1062 # 6478 + 28a6: 51e020ef jal 4dc4 + for(int i = 0; i < nzz; i++){ + 28aa: 4481 li s1,0 + name[0] = 'z'; + 28ac: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 28b0: 08000993 li s3,128 + name[0] = 'z'; + 28b4: bb240023 sb s2,-1120(s0) + name[1] = 'z'; + 28b8: bb2400a3 sb s2,-1119(s0) + name[2] = '0' + (i / 32); + 28bc: 41f4d71b sraiw a4,s1,0x1f + 28c0: 01b7571b srliw a4,a4,0x1b + 28c4: 009707bb addw a5,a4,s1 + 28c8: 4057d69b sraiw a3,a5,0x5 + 28cc: 0306869b addiw a3,a3,48 + 28d0: bad40123 sb a3,-1118(s0) + name[3] = '0' + (i % 32); + 28d4: 8bfd andi a5,a5,31 + 28d6: 9f99 subw a5,a5,a4 + 28d8: 0307879b addiw a5,a5,48 + 28dc: baf401a3 sb a5,-1117(s0) + name[4] = '\0'; + 28e0: ba040223 sb zero,-1116(s0) + unlink(name); + 28e4: ba040513 addi a0,s0,-1120 + 28e8: 4dc020ef jal 4dc4 + for(int i = 0; i < nzz; i++){ + 28ec: 2485 addiw s1,s1,1 + 28ee: fd3493e3 bne s1,s3,28b4 + 28f2: 03000493 li s1,48 + name[0] = 'b'; + 28f6: 06200a93 li s5,98 + name[1] = 'i'; + 28fa: 06900a13 li s4,105 + name[2] = 'g'; + 28fe: 06700993 li s3,103 + for(int i = 0; '0' + i < 0177; i++){ + 2902: 07f00913 li s2,127 + name[0] = 'b'; + 2906: bb540023 sb s5,-1120(s0) + name[1] = 'i'; + 290a: bb4400a3 sb s4,-1119(s0) + name[2] = 'g'; + 290e: bb340123 sb s3,-1118(s0) + name[3] = '0' + i; + 2912: ba9401a3 sb s1,-1117(s0) + name[4] = '\0'; + 2916: ba040223 sb zero,-1116(s0) + unlink(name); + 291a: ba040513 addi a0,s0,-1120 + 291e: 4a6020ef jal 4dc4 + for(int i = 0; '0' + i < 0177; i++){ + 2922: 2485 addiw s1,s1,1 + 2924: 0ff4f493 zext.b s1,s1 + 2928: fd249fe3 bne s1,s2,2906 +} + 292c: 47813083 ld ra,1144(sp) + 2930: 47013403 ld s0,1136(sp) + 2934: 46813483 ld s1,1128(sp) + 2938: 46013903 ld s2,1120(sp) + 293c: 45813983 ld s3,1112(sp) + 2940: 45013a03 ld s4,1104(sp) + 2944: 44813a83 ld s5,1096(sp) + 2948: 44013b03 ld s6,1088(sp) + 294c: 43813b83 ld s7,1080(sp) + 2950: 43013c03 ld s8,1072(sp) + 2954: 42813c83 ld s9,1064(sp) + 2958: 48010113 addi sp,sp,1152 + 295c: 8082 ret + close(fd); + 295e: 854a mv a0,s2 + 2960: 43c020ef jal 4d9c + for(fi = 0; done == 0 && '0' + fi < 0177; fi++){ + 2964: 2985 addiw s3,s3,1 + 2966: 0ff9f993 zext.b s3,s3 + 296a: ed8984e3 beq s3,s8,2832 + name[0] = 'b'; + 296e: b9640023 sb s6,-1152(s0) + name[1] = 'i'; + 2972: b95400a3 sb s5,-1151(s0) + name[2] = 'g'; + 2976: b9440123 sb s4,-1150(s0) + name[3] = '0' + fi; + 297a: b93401a3 sb s3,-1149(s0) + name[4] = '\0'; + 297e: b8040223 sb zero,-1148(s0) + unlink(name); + 2982: b8040513 addi a0,s0,-1152 + 2986: 43e020ef jal 4dc4 + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + 298a: 60200593 li a1,1538 + 298e: b8040513 addi a0,s0,-1152 + 2992: 422020ef jal 4db4 + 2996: 892a mv s2,a0 + if(fd < 0){ + 2998: e6054de3 bltz a0,2812 + 299c: 84de mv s1,s7 + if(write(fd, buf, BSIZE) != BSIZE){ + 299e: 40000613 li a2,1024 + 29a2: ba040593 addi a1,s0,-1120 + 29a6: 854a mv a0,s2 + 29a8: 3ec020ef jal 4d94 + 29ac: 40000793 li a5,1024 + 29b0: e6f51be3 bne a0,a5,2826 + for(int i = 0; i < MAXFILE; i++){ + 29b4: 34fd addiw s1,s1,-1 + 29b6: f4e5 bnez s1,299e + 29b8: b75d j 295e + printf("%s: mkdir(diskfulldir) unexpectedly succeeded!\n", s); + 29ba: 85e6 mv a1,s9 + 29bc: 00004517 auipc a0,0x4 + 29c0: aec50513 addi a0,a0,-1300 # 64a8 + 29c4: 7f0020ef jal 51b4 + 29c8: bdd9 j 289e + +00000000000029ca : +{ + 29ca: 1101 addi sp,sp,-32 + 29cc: ec06 sd ra,24(sp) + 29ce: e822 sd s0,16(sp) + 29d0: e426 sd s1,8(sp) + 29d2: 1000 addi s0,sp,32 + 29d4: 84aa mv s1,a0 + if(mkdir("iputdir") < 0){ + 29d6: 00004517 auipc a0,0x4 + 29da: b0250513 addi a0,a0,-1278 # 64d8 + 29de: 3fe020ef jal 4ddc + 29e2: 02054f63 bltz a0,2a20 + if(chdir("iputdir") < 0){ + 29e6: 00004517 auipc a0,0x4 + 29ea: af250513 addi a0,a0,-1294 # 64d8 + 29ee: 3f6020ef jal 4de4 + 29f2: 04054163 bltz a0,2a34 + if(unlink("../iputdir") < 0){ + 29f6: 00004517 auipc a0,0x4 + 29fa: b2250513 addi a0,a0,-1246 # 6518 + 29fe: 3c6020ef jal 4dc4 + 2a02: 04054363 bltz a0,2a48 + if(chdir("/") < 0){ + 2a06: 00004517 auipc a0,0x4 + 2a0a: b4250513 addi a0,a0,-1214 # 6548 + 2a0e: 3d6020ef jal 4de4 + 2a12: 04054563 bltz a0,2a5c +} + 2a16: 60e2 ld ra,24(sp) + 2a18: 6442 ld s0,16(sp) + 2a1a: 64a2 ld s1,8(sp) + 2a1c: 6105 addi sp,sp,32 + 2a1e: 8082 ret + printf("%s: mkdir failed\n", s); + 2a20: 85a6 mv a1,s1 + 2a22: 00004517 auipc a0,0x4 + 2a26: abe50513 addi a0,a0,-1346 # 64e0 + 2a2a: 78a020ef jal 51b4 + exit(1); + 2a2e: 4505 li a0,1 + 2a30: 344020ef jal 4d74 + printf("%s: chdir iputdir failed\n", s); + 2a34: 85a6 mv a1,s1 + 2a36: 00004517 auipc a0,0x4 + 2a3a: ac250513 addi a0,a0,-1342 # 64f8 + 2a3e: 776020ef jal 51b4 + exit(1); + 2a42: 4505 li a0,1 + 2a44: 330020ef jal 4d74 + printf("%s: unlink ../iputdir failed\n", s); + 2a48: 85a6 mv a1,s1 + 2a4a: 00004517 auipc a0,0x4 + 2a4e: ade50513 addi a0,a0,-1314 # 6528 + 2a52: 762020ef jal 51b4 + exit(1); + 2a56: 4505 li a0,1 + 2a58: 31c020ef jal 4d74 + printf("%s: chdir / failed\n", s); + 2a5c: 85a6 mv a1,s1 + 2a5e: 00004517 auipc a0,0x4 + 2a62: af250513 addi a0,a0,-1294 # 6550 + 2a66: 74e020ef jal 51b4 + exit(1); + 2a6a: 4505 li a0,1 + 2a6c: 308020ef jal 4d74 + +0000000000002a70 : +{ + 2a70: 7179 addi sp,sp,-48 + 2a72: f406 sd ra,40(sp) + 2a74: f022 sd s0,32(sp) + 2a76: ec26 sd s1,24(sp) + 2a78: 1800 addi s0,sp,48 + 2a7a: 84aa mv s1,a0 + pid = fork(); + 2a7c: 2f0020ef jal 4d6c + if(pid < 0){ + 2a80: 02054e63 bltz a0,2abc + if(pid == 0){ + 2a84: e541 bnez a0,2b0c + if(mkdir("iputdir") < 0){ + 2a86: 00004517 auipc a0,0x4 + 2a8a: a5250513 addi a0,a0,-1454 # 64d8 + 2a8e: 34e020ef jal 4ddc + 2a92: 02054f63 bltz a0,2ad0 + if(chdir("iputdir") < 0){ + 2a96: 00004517 auipc a0,0x4 + 2a9a: a4250513 addi a0,a0,-1470 # 64d8 + 2a9e: 346020ef jal 4de4 + 2aa2: 04054163 bltz a0,2ae4 + if(unlink("../iputdir") < 0){ + 2aa6: 00004517 auipc a0,0x4 + 2aaa: a7250513 addi a0,a0,-1422 # 6518 + 2aae: 316020ef jal 4dc4 + 2ab2: 04054363 bltz a0,2af8 + exit(0); + 2ab6: 4501 li a0,0 + 2ab8: 2bc020ef jal 4d74 + printf("%s: fork failed\n", s); + 2abc: 85a6 mv a1,s1 + 2abe: 00003517 auipc a0,0x3 + 2ac2: 16a50513 addi a0,a0,362 # 5c28 + 2ac6: 6ee020ef jal 51b4 + exit(1); + 2aca: 4505 li a0,1 + 2acc: 2a8020ef jal 4d74 + printf("%s: mkdir failed\n", s); + 2ad0: 85a6 mv a1,s1 + 2ad2: 00004517 auipc a0,0x4 + 2ad6: a0e50513 addi a0,a0,-1522 # 64e0 + 2ada: 6da020ef jal 51b4 + exit(1); + 2ade: 4505 li a0,1 + 2ae0: 294020ef jal 4d74 + printf("%s: child chdir failed\n", s); + 2ae4: 85a6 mv a1,s1 + 2ae6: 00004517 auipc a0,0x4 + 2aea: a8250513 addi a0,a0,-1406 # 6568 + 2aee: 6c6020ef jal 51b4 + exit(1); + 2af2: 4505 li a0,1 + 2af4: 280020ef jal 4d74 + printf("%s: unlink ../iputdir failed\n", s); + 2af8: 85a6 mv a1,s1 + 2afa: 00004517 auipc a0,0x4 + 2afe: a2e50513 addi a0,a0,-1490 # 6528 + 2b02: 6b2020ef jal 51b4 + exit(1); + 2b06: 4505 li a0,1 + 2b08: 26c020ef jal 4d74 + wait(&xstatus); + 2b0c: fdc40513 addi a0,s0,-36 + 2b10: 26c020ef jal 4d7c + exit(xstatus); + 2b14: fdc42503 lw a0,-36(s0) + 2b18: 25c020ef jal 4d74 + +0000000000002b1c : +{ + 2b1c: 1101 addi sp,sp,-32 + 2b1e: ec06 sd ra,24(sp) + 2b20: e822 sd s0,16(sp) + 2b22: e426 sd s1,8(sp) + 2b24: 1000 addi s0,sp,32 + 2b26: 84aa mv s1,a0 + if(mkdir("dir0") < 0){ + 2b28: 00004517 auipc a0,0x4 + 2b2c: a5850513 addi a0,a0,-1448 # 6580 + 2b30: 2ac020ef jal 4ddc + 2b34: 02054f63 bltz a0,2b72 + if(chdir("dir0") < 0){ + 2b38: 00004517 auipc a0,0x4 + 2b3c: a4850513 addi a0,a0,-1464 # 6580 + 2b40: 2a4020ef jal 4de4 + 2b44: 04054163 bltz a0,2b86 + if(chdir("..") < 0){ + 2b48: 00004517 auipc a0,0x4 + 2b4c: a5850513 addi a0,a0,-1448 # 65a0 + 2b50: 294020ef jal 4de4 + 2b54: 04054363 bltz a0,2b9a + if(unlink("dir0") < 0){ + 2b58: 00004517 auipc a0,0x4 + 2b5c: a2850513 addi a0,a0,-1496 # 6580 + 2b60: 264020ef jal 4dc4 + 2b64: 04054563 bltz a0,2bae +} + 2b68: 60e2 ld ra,24(sp) + 2b6a: 6442 ld s0,16(sp) + 2b6c: 64a2 ld s1,8(sp) + 2b6e: 6105 addi sp,sp,32 + 2b70: 8082 ret + printf("%s: mkdir failed\n", s); + 2b72: 85a6 mv a1,s1 + 2b74: 00004517 auipc a0,0x4 + 2b78: 96c50513 addi a0,a0,-1684 # 64e0 + 2b7c: 638020ef jal 51b4 + exit(1); + 2b80: 4505 li a0,1 + 2b82: 1f2020ef jal 4d74 + printf("%s: chdir dir0 failed\n", s); + 2b86: 85a6 mv a1,s1 + 2b88: 00004517 auipc a0,0x4 + 2b8c: a0050513 addi a0,a0,-1536 # 6588 + 2b90: 624020ef jal 51b4 + exit(1); + 2b94: 4505 li a0,1 + 2b96: 1de020ef jal 4d74 + printf("%s: chdir .. failed\n", s); + 2b9a: 85a6 mv a1,s1 + 2b9c: 00004517 auipc a0,0x4 + 2ba0: a0c50513 addi a0,a0,-1524 # 65a8 + 2ba4: 610020ef jal 51b4 + exit(1); + 2ba8: 4505 li a0,1 + 2baa: 1ca020ef jal 4d74 + printf("%s: unlink dir0 failed\n", s); + 2bae: 85a6 mv a1,s1 + 2bb0: 00004517 auipc a0,0x4 + 2bb4: a1050513 addi a0,a0,-1520 # 65c0 + 2bb8: 5fc020ef jal 51b4 + exit(1); + 2bbc: 4505 li a0,1 + 2bbe: 1b6020ef jal 4d74 + +0000000000002bc2 : +{ + 2bc2: 1101 addi sp,sp,-32 + 2bc4: ec06 sd ra,24(sp) + 2bc6: e822 sd s0,16(sp) + 2bc8: e426 sd s1,8(sp) + 2bca: e04a sd s2,0(sp) + 2bcc: 1000 addi s0,sp,32 + 2bce: 892a mv s2,a0 + unlink("ff"); + 2bd0: 00004517 auipc a0,0x4 + 2bd4: b3850513 addi a0,a0,-1224 # 6708 + 2bd8: 1ec020ef jal 4dc4 + if(mkdir("dd") != 0){ + 2bdc: 00004517 auipc a0,0x4 + 2be0: 9fc50513 addi a0,a0,-1540 # 65d8 + 2be4: 1f8020ef jal 4ddc + 2be8: 2e051263 bnez a0,2ecc + fd = open("dd/ff", O_CREATE | O_RDWR); + 2bec: 20200593 li a1,514 + 2bf0: 00004517 auipc a0,0x4 + 2bf4: a0850513 addi a0,a0,-1528 # 65f8 + 2bf8: 1bc020ef jal 4db4 + 2bfc: 84aa mv s1,a0 + if(fd < 0){ + 2bfe: 2e054163 bltz a0,2ee0 + write(fd, "ff", 2); + 2c02: 4609 li a2,2 + 2c04: 00004597 auipc a1,0x4 + 2c08: b0458593 addi a1,a1,-1276 # 6708 + 2c0c: 188020ef jal 4d94 + close(fd); + 2c10: 8526 mv a0,s1 + 2c12: 18a020ef jal 4d9c + if(unlink("dd") >= 0){ + 2c16: 00004517 auipc a0,0x4 + 2c1a: 9c250513 addi a0,a0,-1598 # 65d8 + 2c1e: 1a6020ef jal 4dc4 + 2c22: 2c055963 bgez a0,2ef4 + if(mkdir("/dd/dd") != 0){ + 2c26: 00004517 auipc a0,0x4 + 2c2a: a2a50513 addi a0,a0,-1494 # 6650 + 2c2e: 1ae020ef jal 4ddc + 2c32: 2c051b63 bnez a0,2f08 + fd = open("dd/dd/ff", O_CREATE | O_RDWR); + 2c36: 20200593 li a1,514 + 2c3a: 00004517 auipc a0,0x4 + 2c3e: a3e50513 addi a0,a0,-1474 # 6678 + 2c42: 172020ef jal 4db4 + 2c46: 84aa mv s1,a0 + if(fd < 0){ + 2c48: 2c054a63 bltz a0,2f1c + write(fd, "FF", 2); + 2c4c: 4609 li a2,2 + 2c4e: 00004597 auipc a1,0x4 + 2c52: a5a58593 addi a1,a1,-1446 # 66a8 + 2c56: 13e020ef jal 4d94 + close(fd); + 2c5a: 8526 mv a0,s1 + 2c5c: 140020ef jal 4d9c + fd = open("dd/dd/../ff", 0); + 2c60: 4581 li a1,0 + 2c62: 00004517 auipc a0,0x4 + 2c66: a4e50513 addi a0,a0,-1458 # 66b0 + 2c6a: 14a020ef jal 4db4 + 2c6e: 84aa mv s1,a0 + if(fd < 0){ + 2c70: 2c054063 bltz a0,2f30 + cc = read(fd, buf, sizeof(buf)); + 2c74: 660d lui a2,0x3 + 2c76: 0000a597 auipc a1,0xa + 2c7a: 04258593 addi a1,a1,66 # ccb8 + 2c7e: 10e020ef jal 4d8c + if(cc != 2 || buf[0] != 'f'){ + 2c82: 4789 li a5,2 + 2c84: 2cf51063 bne a0,a5,2f44 + 2c88: 0000a717 auipc a4,0xa + 2c8c: 03074703 lbu a4,48(a4) # ccb8 + 2c90: 06600793 li a5,102 + 2c94: 2af71863 bne a4,a5,2f44 + close(fd); + 2c98: 8526 mv a0,s1 + 2c9a: 102020ef jal 4d9c + if(link("dd/dd/ff", "dd/dd/ffff") != 0){ + 2c9e: 00004597 auipc a1,0x4 + 2ca2: a6258593 addi a1,a1,-1438 # 6700 + 2ca6: 00004517 auipc a0,0x4 + 2caa: 9d250513 addi a0,a0,-1582 # 6678 + 2cae: 126020ef jal 4dd4 + 2cb2: 2a051363 bnez a0,2f58 + if(unlink("dd/dd/ff") != 0){ + 2cb6: 00004517 auipc a0,0x4 + 2cba: 9c250513 addi a0,a0,-1598 # 6678 + 2cbe: 106020ef jal 4dc4 + 2cc2: 2a051563 bnez a0,2f6c + if(open("dd/dd/ff", O_RDONLY) >= 0){ + 2cc6: 4581 li a1,0 + 2cc8: 00004517 auipc a0,0x4 + 2ccc: 9b050513 addi a0,a0,-1616 # 6678 + 2cd0: 0e4020ef jal 4db4 + 2cd4: 2a055663 bgez a0,2f80 + if(chdir("dd") != 0){ + 2cd8: 00004517 auipc a0,0x4 + 2cdc: 90050513 addi a0,a0,-1792 # 65d8 + 2ce0: 104020ef jal 4de4 + 2ce4: 2a051863 bnez a0,2f94 + if(chdir("dd/../../dd") != 0){ + 2ce8: 00004517 auipc a0,0x4 + 2cec: ab050513 addi a0,a0,-1360 # 6798 + 2cf0: 0f4020ef jal 4de4 + 2cf4: 2a051a63 bnez a0,2fa8 + if(chdir("dd/../../../dd") != 0){ + 2cf8: 00004517 auipc a0,0x4 + 2cfc: ad050513 addi a0,a0,-1328 # 67c8 + 2d00: 0e4020ef jal 4de4 + 2d04: 2a051c63 bnez a0,2fbc + if(chdir("./..") != 0){ + 2d08: 00004517 auipc a0,0x4 + 2d0c: af850513 addi a0,a0,-1288 # 6800 + 2d10: 0d4020ef jal 4de4 + 2d14: 2a051e63 bnez a0,2fd0 + fd = open("dd/dd/ffff", 0); + 2d18: 4581 li a1,0 + 2d1a: 00004517 auipc a0,0x4 + 2d1e: 9e650513 addi a0,a0,-1562 # 6700 + 2d22: 092020ef jal 4db4 + 2d26: 84aa mv s1,a0 + if(fd < 0){ + 2d28: 2a054e63 bltz a0,2fe4 + if(read(fd, buf, sizeof(buf)) != 2){ + 2d2c: 660d lui a2,0x3 + 2d2e: 0000a597 auipc a1,0xa + 2d32: f8a58593 addi a1,a1,-118 # ccb8 + 2d36: 056020ef jal 4d8c + 2d3a: 4789 li a5,2 + 2d3c: 2af51e63 bne a0,a5,2ff8 + close(fd); + 2d40: 8526 mv a0,s1 + 2d42: 05a020ef jal 4d9c + if(open("dd/dd/ff", O_RDONLY) >= 0){ + 2d46: 4581 li a1,0 + 2d48: 00004517 auipc a0,0x4 + 2d4c: 93050513 addi a0,a0,-1744 # 6678 + 2d50: 064020ef jal 4db4 + 2d54: 2a055c63 bgez a0,300c + if(open("dd/ff/ff", O_CREATE|O_RDWR) >= 0){ + 2d58: 20200593 li a1,514 + 2d5c: 00004517 auipc a0,0x4 + 2d60: b3450513 addi a0,a0,-1228 # 6890 + 2d64: 050020ef jal 4db4 + 2d68: 2a055c63 bgez a0,3020 + if(open("dd/xx/ff", O_CREATE|O_RDWR) >= 0){ + 2d6c: 20200593 li a1,514 + 2d70: 00004517 auipc a0,0x4 + 2d74: b5050513 addi a0,a0,-1200 # 68c0 + 2d78: 03c020ef jal 4db4 + 2d7c: 2a055c63 bgez a0,3034 + if(open("dd", O_CREATE) >= 0){ + 2d80: 20000593 li a1,512 + 2d84: 00004517 auipc a0,0x4 + 2d88: 85450513 addi a0,a0,-1964 # 65d8 + 2d8c: 028020ef jal 4db4 + 2d90: 2a055c63 bgez a0,3048 + if(open("dd", O_RDWR) >= 0){ + 2d94: 4589 li a1,2 + 2d96: 00004517 auipc a0,0x4 + 2d9a: 84250513 addi a0,a0,-1982 # 65d8 + 2d9e: 016020ef jal 4db4 + 2da2: 2a055d63 bgez a0,305c + if(open("dd", O_WRONLY) >= 0){ + 2da6: 4585 li a1,1 + 2da8: 00004517 auipc a0,0x4 + 2dac: 83050513 addi a0,a0,-2000 # 65d8 + 2db0: 004020ef jal 4db4 + 2db4: 2a055e63 bgez a0,3070 + if(link("dd/ff/ff", "dd/dd/xx") == 0){ + 2db8: 00004597 auipc a1,0x4 + 2dbc: b9858593 addi a1,a1,-1128 # 6950 + 2dc0: 00004517 auipc a0,0x4 + 2dc4: ad050513 addi a0,a0,-1328 # 6890 + 2dc8: 00c020ef jal 4dd4 + 2dcc: 2a050c63 beqz a0,3084 + if(link("dd/xx/ff", "dd/dd/xx") == 0){ + 2dd0: 00004597 auipc a1,0x4 + 2dd4: b8058593 addi a1,a1,-1152 # 6950 + 2dd8: 00004517 auipc a0,0x4 + 2ddc: ae850513 addi a0,a0,-1304 # 68c0 + 2de0: 7f5010ef jal 4dd4 + 2de4: 2a050a63 beqz a0,3098 + if(link("dd/ff", "dd/dd/ffff") == 0){ + 2de8: 00004597 auipc a1,0x4 + 2dec: 91858593 addi a1,a1,-1768 # 6700 + 2df0: 00004517 auipc a0,0x4 + 2df4: 80850513 addi a0,a0,-2040 # 65f8 + 2df8: 7dd010ef jal 4dd4 + 2dfc: 2a050863 beqz a0,30ac + if(mkdir("dd/ff/ff") == 0){ + 2e00: 00004517 auipc a0,0x4 + 2e04: a9050513 addi a0,a0,-1392 # 6890 + 2e08: 7d5010ef jal 4ddc + 2e0c: 2a050a63 beqz a0,30c0 + if(mkdir("dd/xx/ff") == 0){ + 2e10: 00004517 auipc a0,0x4 + 2e14: ab050513 addi a0,a0,-1360 # 68c0 + 2e18: 7c5010ef jal 4ddc + 2e1c: 2a050c63 beqz a0,30d4 + if(mkdir("dd/dd/ffff") == 0){ + 2e20: 00004517 auipc a0,0x4 + 2e24: 8e050513 addi a0,a0,-1824 # 6700 + 2e28: 7b5010ef jal 4ddc + 2e2c: 2a050e63 beqz a0,30e8 + if(unlink("dd/xx/ff") == 0){ + 2e30: 00004517 auipc a0,0x4 + 2e34: a9050513 addi a0,a0,-1392 # 68c0 + 2e38: 78d010ef jal 4dc4 + 2e3c: 2c050063 beqz a0,30fc + if(unlink("dd/ff/ff") == 0){ + 2e40: 00004517 auipc a0,0x4 + 2e44: a5050513 addi a0,a0,-1456 # 6890 + 2e48: 77d010ef jal 4dc4 + 2e4c: 2c050263 beqz a0,3110 + if(chdir("dd/ff") == 0){ + 2e50: 00003517 auipc a0,0x3 + 2e54: 7a850513 addi a0,a0,1960 # 65f8 + 2e58: 78d010ef jal 4de4 + 2e5c: 2c050463 beqz a0,3124 + if(chdir("dd/xx") == 0){ + 2e60: 00004517 auipc a0,0x4 + 2e64: c4050513 addi a0,a0,-960 # 6aa0 + 2e68: 77d010ef jal 4de4 + 2e6c: 2c050663 beqz a0,3138 + if(unlink("dd/dd/ffff") != 0){ + 2e70: 00004517 auipc a0,0x4 + 2e74: 89050513 addi a0,a0,-1904 # 6700 + 2e78: 74d010ef jal 4dc4 + 2e7c: 2c051863 bnez a0,314c + if(unlink("dd/ff") != 0){ + 2e80: 00003517 auipc a0,0x3 + 2e84: 77850513 addi a0,a0,1912 # 65f8 + 2e88: 73d010ef jal 4dc4 + 2e8c: 2c051a63 bnez a0,3160 + if(unlink("dd") == 0){ + 2e90: 00003517 auipc a0,0x3 + 2e94: 74850513 addi a0,a0,1864 # 65d8 + 2e98: 72d010ef jal 4dc4 + 2e9c: 2c050c63 beqz a0,3174 + if(unlink("dd/dd") < 0){ + 2ea0: 00004517 auipc a0,0x4 + 2ea4: c7050513 addi a0,a0,-912 # 6b10 + 2ea8: 71d010ef jal 4dc4 + 2eac: 2c054e63 bltz a0,3188 + if(unlink("dd") < 0){ + 2eb0: 00003517 auipc a0,0x3 + 2eb4: 72850513 addi a0,a0,1832 # 65d8 + 2eb8: 70d010ef jal 4dc4 + 2ebc: 2e054063 bltz a0,319c +} + 2ec0: 60e2 ld ra,24(sp) + 2ec2: 6442 ld s0,16(sp) + 2ec4: 64a2 ld s1,8(sp) + 2ec6: 6902 ld s2,0(sp) + 2ec8: 6105 addi sp,sp,32 + 2eca: 8082 ret + printf("%s: mkdir dd failed\n", s); + 2ecc: 85ca mv a1,s2 + 2ece: 00003517 auipc a0,0x3 + 2ed2: 71250513 addi a0,a0,1810 # 65e0 + 2ed6: 2de020ef jal 51b4 + exit(1); + 2eda: 4505 li a0,1 + 2edc: 699010ef jal 4d74 + printf("%s: create dd/ff failed\n", s); + 2ee0: 85ca mv a1,s2 + 2ee2: 00003517 auipc a0,0x3 + 2ee6: 71e50513 addi a0,a0,1822 # 6600 + 2eea: 2ca020ef jal 51b4 + exit(1); + 2eee: 4505 li a0,1 + 2ef0: 685010ef jal 4d74 + printf("%s: unlink dd (non-empty dir) succeeded!\n", s); + 2ef4: 85ca mv a1,s2 + 2ef6: 00003517 auipc a0,0x3 + 2efa: 72a50513 addi a0,a0,1834 # 6620 + 2efe: 2b6020ef jal 51b4 + exit(1); + 2f02: 4505 li a0,1 + 2f04: 671010ef jal 4d74 + printf("%s: subdir mkdir dd/dd failed\n", s); + 2f08: 85ca mv a1,s2 + 2f0a: 00003517 auipc a0,0x3 + 2f0e: 74e50513 addi a0,a0,1870 # 6658 + 2f12: 2a2020ef jal 51b4 + exit(1); + 2f16: 4505 li a0,1 + 2f18: 65d010ef jal 4d74 + printf("%s: create dd/dd/ff failed\n", s); + 2f1c: 85ca mv a1,s2 + 2f1e: 00003517 auipc a0,0x3 + 2f22: 76a50513 addi a0,a0,1898 # 6688 + 2f26: 28e020ef jal 51b4 + exit(1); + 2f2a: 4505 li a0,1 + 2f2c: 649010ef jal 4d74 + printf("%s: open dd/dd/../ff failed\n", s); + 2f30: 85ca mv a1,s2 + 2f32: 00003517 auipc a0,0x3 + 2f36: 78e50513 addi a0,a0,1934 # 66c0 + 2f3a: 27a020ef jal 51b4 + exit(1); + 2f3e: 4505 li a0,1 + 2f40: 635010ef jal 4d74 + printf("%s: dd/dd/../ff wrong content\n", s); + 2f44: 85ca mv a1,s2 + 2f46: 00003517 auipc a0,0x3 + 2f4a: 79a50513 addi a0,a0,1946 # 66e0 + 2f4e: 266020ef jal 51b4 + exit(1); + 2f52: 4505 li a0,1 + 2f54: 621010ef jal 4d74 + printf("%s: link dd/dd/ff dd/dd/ffff failed\n", s); + 2f58: 85ca mv a1,s2 + 2f5a: 00003517 auipc a0,0x3 + 2f5e: 7b650513 addi a0,a0,1974 # 6710 + 2f62: 252020ef jal 51b4 + exit(1); + 2f66: 4505 li a0,1 + 2f68: 60d010ef jal 4d74 + printf("%s: unlink dd/dd/ff failed\n", s); + 2f6c: 85ca mv a1,s2 + 2f6e: 00003517 auipc a0,0x3 + 2f72: 7ca50513 addi a0,a0,1994 # 6738 + 2f76: 23e020ef jal 51b4 + exit(1); + 2f7a: 4505 li a0,1 + 2f7c: 5f9010ef jal 4d74 + printf("%s: open (unlinked) dd/dd/ff succeeded\n", s); + 2f80: 85ca mv a1,s2 + 2f82: 00003517 auipc a0,0x3 + 2f86: 7d650513 addi a0,a0,2006 # 6758 + 2f8a: 22a020ef jal 51b4 + exit(1); + 2f8e: 4505 li a0,1 + 2f90: 5e5010ef jal 4d74 + printf("%s: chdir dd failed\n", s); + 2f94: 85ca mv a1,s2 + 2f96: 00003517 auipc a0,0x3 + 2f9a: 7ea50513 addi a0,a0,2026 # 6780 + 2f9e: 216020ef jal 51b4 + exit(1); + 2fa2: 4505 li a0,1 + 2fa4: 5d1010ef jal 4d74 + printf("%s: chdir dd/../../dd failed\n", s); + 2fa8: 85ca mv a1,s2 + 2faa: 00003517 auipc a0,0x3 + 2fae: 7fe50513 addi a0,a0,2046 # 67a8 + 2fb2: 202020ef jal 51b4 + exit(1); + 2fb6: 4505 li a0,1 + 2fb8: 5bd010ef jal 4d74 + printf("%s: chdir dd/../../../dd failed\n", s); + 2fbc: 85ca mv a1,s2 + 2fbe: 00004517 auipc a0,0x4 + 2fc2: 81a50513 addi a0,a0,-2022 # 67d8 + 2fc6: 1ee020ef jal 51b4 + exit(1); + 2fca: 4505 li a0,1 + 2fcc: 5a9010ef jal 4d74 + printf("%s: chdir ./.. failed\n", s); + 2fd0: 85ca mv a1,s2 + 2fd2: 00004517 auipc a0,0x4 + 2fd6: 83650513 addi a0,a0,-1994 # 6808 + 2fda: 1da020ef jal 51b4 + exit(1); + 2fde: 4505 li a0,1 + 2fe0: 595010ef jal 4d74 + printf("%s: open dd/dd/ffff failed\n", s); + 2fe4: 85ca mv a1,s2 + 2fe6: 00004517 auipc a0,0x4 + 2fea: 83a50513 addi a0,a0,-1990 # 6820 + 2fee: 1c6020ef jal 51b4 + exit(1); + 2ff2: 4505 li a0,1 + 2ff4: 581010ef jal 4d74 + printf("%s: read dd/dd/ffff wrong len\n", s); + 2ff8: 85ca mv a1,s2 + 2ffa: 00004517 auipc a0,0x4 + 2ffe: 84650513 addi a0,a0,-1978 # 6840 + 3002: 1b2020ef jal 51b4 + exit(1); + 3006: 4505 li a0,1 + 3008: 56d010ef jal 4d74 + printf("%s: open (unlinked) dd/dd/ff succeeded!\n", s); + 300c: 85ca mv a1,s2 + 300e: 00004517 auipc a0,0x4 + 3012: 85250513 addi a0,a0,-1966 # 6860 + 3016: 19e020ef jal 51b4 + exit(1); + 301a: 4505 li a0,1 + 301c: 559010ef jal 4d74 + printf("%s: create dd/ff/ff succeeded!\n", s); + 3020: 85ca mv a1,s2 + 3022: 00004517 auipc a0,0x4 + 3026: 87e50513 addi a0,a0,-1922 # 68a0 + 302a: 18a020ef jal 51b4 + exit(1); + 302e: 4505 li a0,1 + 3030: 545010ef jal 4d74 + printf("%s: create dd/xx/ff succeeded!\n", s); + 3034: 85ca mv a1,s2 + 3036: 00004517 auipc a0,0x4 + 303a: 89a50513 addi a0,a0,-1894 # 68d0 + 303e: 176020ef jal 51b4 + exit(1); + 3042: 4505 li a0,1 + 3044: 531010ef jal 4d74 + printf("%s: create dd succeeded!\n", s); + 3048: 85ca mv a1,s2 + 304a: 00004517 auipc a0,0x4 + 304e: 8a650513 addi a0,a0,-1882 # 68f0 + 3052: 162020ef jal 51b4 + exit(1); + 3056: 4505 li a0,1 + 3058: 51d010ef jal 4d74 + printf("%s: open dd rdwr succeeded!\n", s); + 305c: 85ca mv a1,s2 + 305e: 00004517 auipc a0,0x4 + 3062: 8b250513 addi a0,a0,-1870 # 6910 + 3066: 14e020ef jal 51b4 + exit(1); + 306a: 4505 li a0,1 + 306c: 509010ef jal 4d74 + printf("%s: open dd wronly succeeded!\n", s); + 3070: 85ca mv a1,s2 + 3072: 00004517 auipc a0,0x4 + 3076: 8be50513 addi a0,a0,-1858 # 6930 + 307a: 13a020ef jal 51b4 + exit(1); + 307e: 4505 li a0,1 + 3080: 4f5010ef jal 4d74 + printf("%s: link dd/ff/ff dd/dd/xx succeeded!\n", s); + 3084: 85ca mv a1,s2 + 3086: 00004517 auipc a0,0x4 + 308a: 8da50513 addi a0,a0,-1830 # 6960 + 308e: 126020ef jal 51b4 + exit(1); + 3092: 4505 li a0,1 + 3094: 4e1010ef jal 4d74 + printf("%s: link dd/xx/ff dd/dd/xx succeeded!\n", s); + 3098: 85ca mv a1,s2 + 309a: 00004517 auipc a0,0x4 + 309e: 8ee50513 addi a0,a0,-1810 # 6988 + 30a2: 112020ef jal 51b4 + exit(1); + 30a6: 4505 li a0,1 + 30a8: 4cd010ef jal 4d74 + printf("%s: link dd/ff dd/dd/ffff succeeded!\n", s); + 30ac: 85ca mv a1,s2 + 30ae: 00004517 auipc a0,0x4 + 30b2: 90250513 addi a0,a0,-1790 # 69b0 + 30b6: 0fe020ef jal 51b4 + exit(1); + 30ba: 4505 li a0,1 + 30bc: 4b9010ef jal 4d74 + printf("%s: mkdir dd/ff/ff succeeded!\n", s); + 30c0: 85ca mv a1,s2 + 30c2: 00004517 auipc a0,0x4 + 30c6: 91650513 addi a0,a0,-1770 # 69d8 + 30ca: 0ea020ef jal 51b4 + exit(1); + 30ce: 4505 li a0,1 + 30d0: 4a5010ef jal 4d74 + printf("%s: mkdir dd/xx/ff succeeded!\n", s); + 30d4: 85ca mv a1,s2 + 30d6: 00004517 auipc a0,0x4 + 30da: 92250513 addi a0,a0,-1758 # 69f8 + 30de: 0d6020ef jal 51b4 + exit(1); + 30e2: 4505 li a0,1 + 30e4: 491010ef jal 4d74 + printf("%s: mkdir dd/dd/ffff succeeded!\n", s); + 30e8: 85ca mv a1,s2 + 30ea: 00004517 auipc a0,0x4 + 30ee: 92e50513 addi a0,a0,-1746 # 6a18 + 30f2: 0c2020ef jal 51b4 + exit(1); + 30f6: 4505 li a0,1 + 30f8: 47d010ef jal 4d74 + printf("%s: unlink dd/xx/ff succeeded!\n", s); + 30fc: 85ca mv a1,s2 + 30fe: 00004517 auipc a0,0x4 + 3102: 94250513 addi a0,a0,-1726 # 6a40 + 3106: 0ae020ef jal 51b4 + exit(1); + 310a: 4505 li a0,1 + 310c: 469010ef jal 4d74 + printf("%s: unlink dd/ff/ff succeeded!\n", s); + 3110: 85ca mv a1,s2 + 3112: 00004517 auipc a0,0x4 + 3116: 94e50513 addi a0,a0,-1714 # 6a60 + 311a: 09a020ef jal 51b4 + exit(1); + 311e: 4505 li a0,1 + 3120: 455010ef jal 4d74 + printf("%s: chdir dd/ff succeeded!\n", s); + 3124: 85ca mv a1,s2 + 3126: 00004517 auipc a0,0x4 + 312a: 95a50513 addi a0,a0,-1702 # 6a80 + 312e: 086020ef jal 51b4 + exit(1); + 3132: 4505 li a0,1 + 3134: 441010ef jal 4d74 + printf("%s: chdir dd/xx succeeded!\n", s); + 3138: 85ca mv a1,s2 + 313a: 00004517 auipc a0,0x4 + 313e: 96e50513 addi a0,a0,-1682 # 6aa8 + 3142: 072020ef jal 51b4 + exit(1); + 3146: 4505 li a0,1 + 3148: 42d010ef jal 4d74 + printf("%s: unlink dd/dd/ff failed\n", s); + 314c: 85ca mv a1,s2 + 314e: 00003517 auipc a0,0x3 + 3152: 5ea50513 addi a0,a0,1514 # 6738 + 3156: 05e020ef jal 51b4 + exit(1); + 315a: 4505 li a0,1 + 315c: 419010ef jal 4d74 + printf("%s: unlink dd/ff failed\n", s); + 3160: 85ca mv a1,s2 + 3162: 00004517 auipc a0,0x4 + 3166: 96650513 addi a0,a0,-1690 # 6ac8 + 316a: 04a020ef jal 51b4 + exit(1); + 316e: 4505 li a0,1 + 3170: 405010ef jal 4d74 + printf("%s: unlink non-empty dd succeeded!\n", s); + 3174: 85ca mv a1,s2 + 3176: 00004517 auipc a0,0x4 + 317a: 97250513 addi a0,a0,-1678 # 6ae8 + 317e: 036020ef jal 51b4 + exit(1); + 3182: 4505 li a0,1 + 3184: 3f1010ef jal 4d74 + printf("%s: unlink dd/dd failed\n", s); + 3188: 85ca mv a1,s2 + 318a: 00004517 auipc a0,0x4 + 318e: 98e50513 addi a0,a0,-1650 # 6b18 + 3192: 022020ef jal 51b4 + exit(1); + 3196: 4505 li a0,1 + 3198: 3dd010ef jal 4d74 + printf("%s: unlink dd failed\n", s); + 319c: 85ca mv a1,s2 + 319e: 00004517 auipc a0,0x4 + 31a2: 99a50513 addi a0,a0,-1638 # 6b38 + 31a6: 00e020ef jal 51b4 + exit(1); + 31aa: 4505 li a0,1 + 31ac: 3c9010ef jal 4d74 + +00000000000031b0 : +{ + 31b0: 1101 addi sp,sp,-32 + 31b2: ec06 sd ra,24(sp) + 31b4: e822 sd s0,16(sp) + 31b6: e426 sd s1,8(sp) + 31b8: 1000 addi s0,sp,32 + 31ba: 84aa mv s1,a0 + if(mkdir("dots") != 0){ + 31bc: 00004517 auipc a0,0x4 + 31c0: 99450513 addi a0,a0,-1644 # 6b50 + 31c4: 419010ef jal 4ddc + 31c8: e53d bnez a0,3236 + if(chdir("dots") != 0){ + 31ca: 00004517 auipc a0,0x4 + 31ce: 98650513 addi a0,a0,-1658 # 6b50 + 31d2: 413010ef jal 4de4 + 31d6: e935 bnez a0,324a + if(unlink(".") == 0){ + 31d8: 00003517 auipc a0,0x3 + 31dc: 8a850513 addi a0,a0,-1880 # 5a80 + 31e0: 3e5010ef jal 4dc4 + 31e4: cd2d beqz a0,325e + if(unlink("..") == 0){ + 31e6: 00003517 auipc a0,0x3 + 31ea: 3ba50513 addi a0,a0,954 # 65a0 + 31ee: 3d7010ef jal 4dc4 + 31f2: c141 beqz a0,3272 + if(chdir("/") != 0){ + 31f4: 00003517 auipc a0,0x3 + 31f8: 35450513 addi a0,a0,852 # 6548 + 31fc: 3e9010ef jal 4de4 + 3200: e159 bnez a0,3286 + if(unlink("dots/.") == 0){ + 3202: 00004517 auipc a0,0x4 + 3206: 9b650513 addi a0,a0,-1610 # 6bb8 + 320a: 3bb010ef jal 4dc4 + 320e: c551 beqz a0,329a + if(unlink("dots/..") == 0){ + 3210: 00004517 auipc a0,0x4 + 3214: 9d050513 addi a0,a0,-1584 # 6be0 + 3218: 3ad010ef jal 4dc4 + 321c: c949 beqz a0,32ae + if(unlink("dots") != 0){ + 321e: 00004517 auipc a0,0x4 + 3222: 93250513 addi a0,a0,-1742 # 6b50 + 3226: 39f010ef jal 4dc4 + 322a: ed41 bnez a0,32c2 +} + 322c: 60e2 ld ra,24(sp) + 322e: 6442 ld s0,16(sp) + 3230: 64a2 ld s1,8(sp) + 3232: 6105 addi sp,sp,32 + 3234: 8082 ret + printf("%s: mkdir dots failed\n", s); + 3236: 85a6 mv a1,s1 + 3238: 00004517 auipc a0,0x4 + 323c: 92050513 addi a0,a0,-1760 # 6b58 + 3240: 775010ef jal 51b4 + exit(1); + 3244: 4505 li a0,1 + 3246: 32f010ef jal 4d74 + printf("%s: chdir dots failed\n", s); + 324a: 85a6 mv a1,s1 + 324c: 00004517 auipc a0,0x4 + 3250: 92450513 addi a0,a0,-1756 # 6b70 + 3254: 761010ef jal 51b4 + exit(1); + 3258: 4505 li a0,1 + 325a: 31b010ef jal 4d74 + printf("%s: rm . worked!\n", s); + 325e: 85a6 mv a1,s1 + 3260: 00004517 auipc a0,0x4 + 3264: 92850513 addi a0,a0,-1752 # 6b88 + 3268: 74d010ef jal 51b4 + exit(1); + 326c: 4505 li a0,1 + 326e: 307010ef jal 4d74 + printf("%s: rm .. worked!\n", s); + 3272: 85a6 mv a1,s1 + 3274: 00004517 auipc a0,0x4 + 3278: 92c50513 addi a0,a0,-1748 # 6ba0 + 327c: 739010ef jal 51b4 + exit(1); + 3280: 4505 li a0,1 + 3282: 2f3010ef jal 4d74 + printf("%s: chdir / failed\n", s); + 3286: 85a6 mv a1,s1 + 3288: 00003517 auipc a0,0x3 + 328c: 2c850513 addi a0,a0,712 # 6550 + 3290: 725010ef jal 51b4 + exit(1); + 3294: 4505 li a0,1 + 3296: 2df010ef jal 4d74 + printf("%s: unlink dots/. worked!\n", s); + 329a: 85a6 mv a1,s1 + 329c: 00004517 auipc a0,0x4 + 32a0: 92450513 addi a0,a0,-1756 # 6bc0 + 32a4: 711010ef jal 51b4 + exit(1); + 32a8: 4505 li a0,1 + 32aa: 2cb010ef jal 4d74 + printf("%s: unlink dots/.. worked!\n", s); + 32ae: 85a6 mv a1,s1 + 32b0: 00004517 auipc a0,0x4 + 32b4: 93850513 addi a0,a0,-1736 # 6be8 + 32b8: 6fd010ef jal 51b4 + exit(1); + 32bc: 4505 li a0,1 + 32be: 2b7010ef jal 4d74 + printf("%s: unlink dots failed!\n", s); + 32c2: 85a6 mv a1,s1 + 32c4: 00004517 auipc a0,0x4 + 32c8: 94450513 addi a0,a0,-1724 # 6c08 + 32cc: 6e9010ef jal 51b4 + exit(1); + 32d0: 4505 li a0,1 + 32d2: 2a3010ef jal 4d74 + +00000000000032d6 : +{ + 32d6: 1101 addi sp,sp,-32 + 32d8: ec06 sd ra,24(sp) + 32da: e822 sd s0,16(sp) + 32dc: e426 sd s1,8(sp) + 32de: e04a sd s2,0(sp) + 32e0: 1000 addi s0,sp,32 + 32e2: 892a mv s2,a0 + fd = open("dirfile", O_CREATE); + 32e4: 20000593 li a1,512 + 32e8: 00004517 auipc a0,0x4 + 32ec: 94050513 addi a0,a0,-1728 # 6c28 + 32f0: 2c5010ef jal 4db4 + if(fd < 0){ + 32f4: 0c054563 bltz a0,33be + close(fd); + 32f8: 2a5010ef jal 4d9c + if(chdir("dirfile") == 0){ + 32fc: 00004517 auipc a0,0x4 + 3300: 92c50513 addi a0,a0,-1748 # 6c28 + 3304: 2e1010ef jal 4de4 + 3308: c569 beqz a0,33d2 + fd = open("dirfile/xx", 0); + 330a: 4581 li a1,0 + 330c: 00004517 auipc a0,0x4 + 3310: 96450513 addi a0,a0,-1692 # 6c70 + 3314: 2a1010ef jal 4db4 + if(fd >= 0){ + 3318: 0c055763 bgez a0,33e6 + fd = open("dirfile/xx", O_CREATE); + 331c: 20000593 li a1,512 + 3320: 00004517 auipc a0,0x4 + 3324: 95050513 addi a0,a0,-1712 # 6c70 + 3328: 28d010ef jal 4db4 + if(fd >= 0){ + 332c: 0c055763 bgez a0,33fa + if(mkdir("dirfile/xx") == 0){ + 3330: 00004517 auipc a0,0x4 + 3334: 94050513 addi a0,a0,-1728 # 6c70 + 3338: 2a5010ef jal 4ddc + 333c: 0c050963 beqz a0,340e + if(unlink("dirfile/xx") == 0){ + 3340: 00004517 auipc a0,0x4 + 3344: 93050513 addi a0,a0,-1744 # 6c70 + 3348: 27d010ef jal 4dc4 + 334c: 0c050b63 beqz a0,3422 + if(link("README", "dirfile/xx") == 0){ + 3350: 00004597 auipc a1,0x4 + 3354: 92058593 addi a1,a1,-1760 # 6c70 + 3358: 00002517 auipc a0,0x2 + 335c: 21850513 addi a0,a0,536 # 5570 + 3360: 275010ef jal 4dd4 + 3364: 0c050963 beqz a0,3436 + if(unlink("dirfile") != 0){ + 3368: 00004517 auipc a0,0x4 + 336c: 8c050513 addi a0,a0,-1856 # 6c28 + 3370: 255010ef jal 4dc4 + 3374: 0c051b63 bnez a0,344a + fd = open(".", O_RDWR); + 3378: 4589 li a1,2 + 337a: 00002517 auipc a0,0x2 + 337e: 70650513 addi a0,a0,1798 # 5a80 + 3382: 233010ef jal 4db4 + if(fd >= 0){ + 3386: 0c055c63 bgez a0,345e + fd = open(".", 0); + 338a: 4581 li a1,0 + 338c: 00002517 auipc a0,0x2 + 3390: 6f450513 addi a0,a0,1780 # 5a80 + 3394: 221010ef jal 4db4 + 3398: 84aa mv s1,a0 + if(write(fd, "x", 1) > 0){ + 339a: 4605 li a2,1 + 339c: 00002597 auipc a1,0x2 + 33a0: 06c58593 addi a1,a1,108 # 5408 + 33a4: 1f1010ef jal 4d94 + 33a8: 0ca04563 bgtz a0,3472 + close(fd); + 33ac: 8526 mv a0,s1 + 33ae: 1ef010ef jal 4d9c +} + 33b2: 60e2 ld ra,24(sp) + 33b4: 6442 ld s0,16(sp) + 33b6: 64a2 ld s1,8(sp) + 33b8: 6902 ld s2,0(sp) + 33ba: 6105 addi sp,sp,32 + 33bc: 8082 ret + printf("%s: create dirfile failed\n", s); + 33be: 85ca mv a1,s2 + 33c0: 00004517 auipc a0,0x4 + 33c4: 87050513 addi a0,a0,-1936 # 6c30 + 33c8: 5ed010ef jal 51b4 + exit(1); + 33cc: 4505 li a0,1 + 33ce: 1a7010ef jal 4d74 + printf("%s: chdir dirfile succeeded!\n", s); + 33d2: 85ca mv a1,s2 + 33d4: 00004517 auipc a0,0x4 + 33d8: 87c50513 addi a0,a0,-1924 # 6c50 + 33dc: 5d9010ef jal 51b4 + exit(1); + 33e0: 4505 li a0,1 + 33e2: 193010ef jal 4d74 + printf("%s: create dirfile/xx succeeded!\n", s); + 33e6: 85ca mv a1,s2 + 33e8: 00004517 auipc a0,0x4 + 33ec: 89850513 addi a0,a0,-1896 # 6c80 + 33f0: 5c5010ef jal 51b4 + exit(1); + 33f4: 4505 li a0,1 + 33f6: 17f010ef jal 4d74 + printf("%s: create dirfile/xx succeeded!\n", s); + 33fa: 85ca mv a1,s2 + 33fc: 00004517 auipc a0,0x4 + 3400: 88450513 addi a0,a0,-1916 # 6c80 + 3404: 5b1010ef jal 51b4 + exit(1); + 3408: 4505 li a0,1 + 340a: 16b010ef jal 4d74 + printf("%s: mkdir dirfile/xx succeeded!\n", s); + 340e: 85ca mv a1,s2 + 3410: 00004517 auipc a0,0x4 + 3414: 89850513 addi a0,a0,-1896 # 6ca8 + 3418: 59d010ef jal 51b4 + exit(1); + 341c: 4505 li a0,1 + 341e: 157010ef jal 4d74 + printf("%s: unlink dirfile/xx succeeded!\n", s); + 3422: 85ca mv a1,s2 + 3424: 00004517 auipc a0,0x4 + 3428: 8ac50513 addi a0,a0,-1876 # 6cd0 + 342c: 589010ef jal 51b4 + exit(1); + 3430: 4505 li a0,1 + 3432: 143010ef jal 4d74 + printf("%s: link to dirfile/xx succeeded!\n", s); + 3436: 85ca mv a1,s2 + 3438: 00004517 auipc a0,0x4 + 343c: 8c050513 addi a0,a0,-1856 # 6cf8 + 3440: 575010ef jal 51b4 + exit(1); + 3444: 4505 li a0,1 + 3446: 12f010ef jal 4d74 + printf("%s: unlink dirfile failed!\n", s); + 344a: 85ca mv a1,s2 + 344c: 00004517 auipc a0,0x4 + 3450: 8d450513 addi a0,a0,-1836 # 6d20 + 3454: 561010ef jal 51b4 + exit(1); + 3458: 4505 li a0,1 + 345a: 11b010ef jal 4d74 + printf("%s: open . for writing succeeded!\n", s); + 345e: 85ca mv a1,s2 + 3460: 00004517 auipc a0,0x4 + 3464: 8e050513 addi a0,a0,-1824 # 6d40 + 3468: 54d010ef jal 51b4 + exit(1); + 346c: 4505 li a0,1 + 346e: 107010ef jal 4d74 + printf("%s: write . succeeded!\n", s); + 3472: 85ca mv a1,s2 + 3474: 00004517 auipc a0,0x4 + 3478: 8f450513 addi a0,a0,-1804 # 6d68 + 347c: 539010ef jal 51b4 + exit(1); + 3480: 4505 li a0,1 + 3482: 0f3010ef jal 4d74 + +0000000000003486 : +{ + 3486: 7139 addi sp,sp,-64 + 3488: fc06 sd ra,56(sp) + 348a: f822 sd s0,48(sp) + 348c: f426 sd s1,40(sp) + 348e: f04a sd s2,32(sp) + 3490: ec4e sd s3,24(sp) + 3492: e852 sd s4,16(sp) + 3494: e456 sd s5,8(sp) + 3496: e05a sd s6,0(sp) + 3498: 0080 addi s0,sp,64 + 349a: 8b2a mv s6,a0 + 349c: 03300913 li s2,51 + if(mkdir("irefd") != 0){ + 34a0: 00004a17 auipc s4,0x4 + 34a4: 8e0a0a13 addi s4,s4,-1824 # 6d80 + mkdir(""); + 34a8: 00003497 auipc s1,0x3 + 34ac: 3e048493 addi s1,s1,992 # 6888 + link("README", ""); + 34b0: 00002a97 auipc s5,0x2 + 34b4: 0c0a8a93 addi s5,s5,192 # 5570 + fd = open("xx", O_CREATE); + 34b8: 00003997 auipc s3,0x3 + 34bc: 7c098993 addi s3,s3,1984 # 6c78 + 34c0: a835 j 34fc + printf("%s: mkdir irefd failed\n", s); + 34c2: 85da mv a1,s6 + 34c4: 00004517 auipc a0,0x4 + 34c8: 8c450513 addi a0,a0,-1852 # 6d88 + 34cc: 4e9010ef jal 51b4 + exit(1); + 34d0: 4505 li a0,1 + 34d2: 0a3010ef jal 4d74 + printf("%s: chdir irefd failed\n", s); + 34d6: 85da mv a1,s6 + 34d8: 00004517 auipc a0,0x4 + 34dc: 8c850513 addi a0,a0,-1848 # 6da0 + 34e0: 4d5010ef jal 51b4 + exit(1); + 34e4: 4505 li a0,1 + 34e6: 08f010ef jal 4d74 + close(fd); + 34ea: 0b3010ef jal 4d9c + 34ee: a82d j 3528 + unlink("xx"); + 34f0: 854e mv a0,s3 + 34f2: 0d3010ef jal 4dc4 + for(i = 0; i < NINODE + 1; i++){ + 34f6: 397d addiw s2,s2,-1 + 34f8: 04090263 beqz s2,353c + if(mkdir("irefd") != 0){ + 34fc: 8552 mv a0,s4 + 34fe: 0df010ef jal 4ddc + 3502: f161 bnez a0,34c2 + if(chdir("irefd") != 0){ + 3504: 8552 mv a0,s4 + 3506: 0df010ef jal 4de4 + 350a: f571 bnez a0,34d6 + mkdir(""); + 350c: 8526 mv a0,s1 + 350e: 0cf010ef jal 4ddc + link("README", ""); + 3512: 85a6 mv a1,s1 + 3514: 8556 mv a0,s5 + 3516: 0bf010ef jal 4dd4 + fd = open("", O_CREATE); + 351a: 20000593 li a1,512 + 351e: 8526 mv a0,s1 + 3520: 095010ef jal 4db4 + if(fd >= 0) + 3524: fc0553e3 bgez a0,34ea + fd = open("xx", O_CREATE); + 3528: 20000593 li a1,512 + 352c: 854e mv a0,s3 + 352e: 087010ef jal 4db4 + if(fd >= 0) + 3532: fa054fe3 bltz a0,34f0 + close(fd); + 3536: 067010ef jal 4d9c + 353a: bf5d j 34f0 + 353c: 03300493 li s1,51 + chdir(".."); + 3540: 00003997 auipc s3,0x3 + 3544: 06098993 addi s3,s3,96 # 65a0 + unlink("irefd"); + 3548: 00004917 auipc s2,0x4 + 354c: 83890913 addi s2,s2,-1992 # 6d80 + chdir(".."); + 3550: 854e mv a0,s3 + 3552: 093010ef jal 4de4 + unlink("irefd"); + 3556: 854a mv a0,s2 + 3558: 06d010ef jal 4dc4 + for(i = 0; i < NINODE + 1; i++){ + 355c: 34fd addiw s1,s1,-1 + 355e: f8ed bnez s1,3550 + chdir("/"); + 3560: 00003517 auipc a0,0x3 + 3564: fe850513 addi a0,a0,-24 # 6548 + 3568: 07d010ef jal 4de4 +} + 356c: 70e2 ld ra,56(sp) + 356e: 7442 ld s0,48(sp) + 3570: 74a2 ld s1,40(sp) + 3572: 7902 ld s2,32(sp) + 3574: 69e2 ld s3,24(sp) + 3576: 6a42 ld s4,16(sp) + 3578: 6aa2 ld s5,8(sp) + 357a: 6b02 ld s6,0(sp) + 357c: 6121 addi sp,sp,64 + 357e: 8082 ret + +0000000000003580 : +{ + 3580: 7179 addi sp,sp,-48 + 3582: f406 sd ra,40(sp) + 3584: f022 sd s0,32(sp) + 3586: ec26 sd s1,24(sp) + 3588: 1800 addi s0,sp,48 + 358a: 84aa mv s1,a0 + if(mkdir("oidir") < 0){ + 358c: 00004517 auipc a0,0x4 + 3590: 82c50513 addi a0,a0,-2004 # 6db8 + 3594: 049010ef jal 4ddc + 3598: 02054a63 bltz a0,35cc + pid = fork(); + 359c: 7d0010ef jal 4d6c + if(pid < 0){ + 35a0: 04054063 bltz a0,35e0 + if(pid == 0){ + 35a4: e939 bnez a0,35fa + int fd = open("oidir", O_RDWR); + 35a6: 4589 li a1,2 + 35a8: 00004517 auipc a0,0x4 + 35ac: 81050513 addi a0,a0,-2032 # 6db8 + 35b0: 005010ef jal 4db4 + if(fd >= 0){ + 35b4: 04054063 bltz a0,35f4 + printf("%s: open directory for write succeeded\n", s); + 35b8: 85a6 mv a1,s1 + 35ba: 00004517 auipc a0,0x4 + 35be: 81e50513 addi a0,a0,-2018 # 6dd8 + 35c2: 3f3010ef jal 51b4 + exit(1); + 35c6: 4505 li a0,1 + 35c8: 7ac010ef jal 4d74 + printf("%s: mkdir oidir failed\n", s); + 35cc: 85a6 mv a1,s1 + 35ce: 00003517 auipc a0,0x3 + 35d2: 7f250513 addi a0,a0,2034 # 6dc0 + 35d6: 3df010ef jal 51b4 + exit(1); + 35da: 4505 li a0,1 + 35dc: 798010ef jal 4d74 + printf("%s: fork failed\n", s); + 35e0: 85a6 mv a1,s1 + 35e2: 00002517 auipc a0,0x2 + 35e6: 64650513 addi a0,a0,1606 # 5c28 + 35ea: 3cb010ef jal 51b4 + exit(1); + 35ee: 4505 li a0,1 + 35f0: 784010ef jal 4d74 + exit(0); + 35f4: 4501 li a0,0 + 35f6: 77e010ef jal 4d74 + pause(1); + 35fa: 4505 li a0,1 + 35fc: 009010ef jal 4e04 + if(unlink("oidir") != 0){ + 3600: 00003517 auipc a0,0x3 + 3604: 7b850513 addi a0,a0,1976 # 6db8 + 3608: 7bc010ef jal 4dc4 + 360c: c919 beqz a0,3622 + printf("%s: unlink failed\n", s); + 360e: 85a6 mv a1,s1 + 3610: 00003517 auipc a0,0x3 + 3614: 80850513 addi a0,a0,-2040 # 5e18 + 3618: 39d010ef jal 51b4 + exit(1); + 361c: 4505 li a0,1 + 361e: 756010ef jal 4d74 + wait(&xstatus); + 3622: fdc40513 addi a0,s0,-36 + 3626: 756010ef jal 4d7c + exit(xstatus); + 362a: fdc42503 lw a0,-36(s0) + 362e: 746010ef jal 4d74 + +0000000000003632 : +{ + 3632: 1101 addi sp,sp,-32 + 3634: ec06 sd ra,24(sp) + 3636: e822 sd s0,16(sp) + 3638: e426 sd s1,8(sp) + 363a: 1000 addi s0,sp,32 + 363c: 84aa mv s1,a0 + unlink("stopforking"); + 363e: 00003517 auipc a0,0x3 + 3642: 7c250513 addi a0,a0,1986 # 6e00 + 3646: 77e010ef jal 4dc4 + int pid = fork(); + 364a: 722010ef jal 4d6c + if(pid < 0){ + 364e: 02054b63 bltz a0,3684 + if(pid == 0){ + 3652: c139 beqz a0,3698 + pause(20); // two seconds + 3654: 4551 li a0,20 + 3656: 7ae010ef jal 4e04 + close(open("stopforking", O_CREATE|O_RDWR)); + 365a: 20200593 li a1,514 + 365e: 00003517 auipc a0,0x3 + 3662: 7a250513 addi a0,a0,1954 # 6e00 + 3666: 74e010ef jal 4db4 + 366a: 732010ef jal 4d9c + wait(0); + 366e: 4501 li a0,0 + 3670: 70c010ef jal 4d7c + pause(10); // one second + 3674: 4529 li a0,10 + 3676: 78e010ef jal 4e04 +} + 367a: 60e2 ld ra,24(sp) + 367c: 6442 ld s0,16(sp) + 367e: 64a2 ld s1,8(sp) + 3680: 6105 addi sp,sp,32 + 3682: 8082 ret + printf("%s: fork failed", s); + 3684: 85a6 mv a1,s1 + 3686: 00002517 auipc a0,0x2 + 368a: 76250513 addi a0,a0,1890 # 5de8 + 368e: 327010ef jal 51b4 + exit(1); + 3692: 4505 li a0,1 + 3694: 6e0010ef jal 4d74 + int fd = open("stopforking", 0); + 3698: 00003497 auipc s1,0x3 + 369c: 76848493 addi s1,s1,1896 # 6e00 + 36a0: 4581 li a1,0 + 36a2: 8526 mv a0,s1 + 36a4: 710010ef jal 4db4 + if(fd >= 0){ + 36a8: 02055163 bgez a0,36ca + if(fork() < 0){ + 36ac: 6c0010ef jal 4d6c + 36b0: fe0558e3 bgez a0,36a0 + close(open("stopforking", O_CREATE|O_RDWR)); + 36b4: 20200593 li a1,514 + 36b8: 00003517 auipc a0,0x3 + 36bc: 74850513 addi a0,a0,1864 # 6e00 + 36c0: 6f4010ef jal 4db4 + 36c4: 6d8010ef jal 4d9c + 36c8: bfe1 j 36a0 + exit(0); + 36ca: 4501 li a0,0 + 36cc: 6a8010ef jal 4d74 + +00000000000036d0 : +{ + 36d0: 7139 addi sp,sp,-64 + 36d2: fc06 sd ra,56(sp) + 36d4: f822 sd s0,48(sp) + 36d6: f426 sd s1,40(sp) + 36d8: f04a sd s2,32(sp) + 36da: ec4e sd s3,24(sp) + 36dc: e852 sd s4,16(sp) + 36de: 0080 addi s0,sp,64 + 36e0: 8a2a mv s4,a0 + 36e2: 06400913 li s2,100 + if(xst != -1) { + 36e6: 59fd li s3,-1 + int pid1 = fork(); + 36e8: 684010ef jal 4d6c + 36ec: 84aa mv s1,a0 + if(pid1 < 0){ + 36ee: 02054763 bltz a0,371c + if(pid1 == 0){ + 36f2: cd1d beqz a0,3730 + pause(1); + 36f4: 4505 li a0,1 + 36f6: 70e010ef jal 4e04 + kill(pid1); + 36fa: 8526 mv a0,s1 + 36fc: 6a8010ef jal 4da4 + wait(&xst); + 3700: fcc40513 addi a0,s0,-52 + 3704: 678010ef jal 4d7c + if(xst != -1) { + 3708: fcc42783 lw a5,-52(s0) + 370c: 03379563 bne a5,s3,3736 + for(int i = 0; i < 100; i++){ + 3710: 397d addiw s2,s2,-1 + 3712: fc091be3 bnez s2,36e8 + exit(0); + 3716: 4501 li a0,0 + 3718: 65c010ef jal 4d74 + printf("%s: fork failed\n", s); + 371c: 85d2 mv a1,s4 + 371e: 00002517 auipc a0,0x2 + 3722: 50a50513 addi a0,a0,1290 # 5c28 + 3726: 28f010ef jal 51b4 + exit(1); + 372a: 4505 li a0,1 + 372c: 648010ef jal 4d74 + getpid(); + 3730: 6c4010ef jal 4df4 + while(1) { + 3734: bff5 j 3730 + printf("%s: status should be -1\n", s); + 3736: 85d2 mv a1,s4 + 3738: 00003517 auipc a0,0x3 + 373c: 6d850513 addi a0,a0,1752 # 6e10 + 3740: 275010ef jal 51b4 + exit(1); + 3744: 4505 li a0,1 + 3746: 62e010ef jal 4d74 + +000000000000374a : +{ + 374a: 7139 addi sp,sp,-64 + 374c: fc06 sd ra,56(sp) + 374e: f822 sd s0,48(sp) + 3750: f426 sd s1,40(sp) + 3752: f04a sd s2,32(sp) + 3754: ec4e sd s3,24(sp) + 3756: e852 sd s4,16(sp) + 3758: 0080 addi s0,sp,64 + 375a: 892a mv s2,a0 + pid1 = fork(); + 375c: 610010ef jal 4d6c + if(pid1 < 0) { + 3760: 00054563 bltz a0,376a + 3764: 84aa mv s1,a0 + if(pid1 == 0) + 3766: ed01 bnez a0,377e + for(;;) + 3768: a001 j 3768 + printf("%s: fork failed", s); + 376a: 85ca mv a1,s2 + 376c: 00002517 auipc a0,0x2 + 3770: 67c50513 addi a0,a0,1660 # 5de8 + 3774: 241010ef jal 51b4 + exit(1); + 3778: 4505 li a0,1 + 377a: 5fa010ef jal 4d74 + pid2 = fork(); + 377e: 5ee010ef jal 4d6c + 3782: 89aa mv s3,a0 + if(pid2 < 0) { + 3784: 00054463 bltz a0,378c + if(pid2 == 0) + 3788: ed01 bnez a0,37a0 + for(;;) + 378a: a001 j 378a + printf("%s: fork failed\n", s); + 378c: 85ca mv a1,s2 + 378e: 00002517 auipc a0,0x2 + 3792: 49a50513 addi a0,a0,1178 # 5c28 + 3796: 21f010ef jal 51b4 + exit(1); + 379a: 4505 li a0,1 + 379c: 5d8010ef jal 4d74 + pipe(pfds); + 37a0: fc840513 addi a0,s0,-56 + 37a4: 5e0010ef jal 4d84 + pid3 = fork(); + 37a8: 5c4010ef jal 4d6c + 37ac: 8a2a mv s4,a0 + if(pid3 < 0) { + 37ae: 02054863 bltz a0,37de + if(pid3 == 0){ + 37b2: e921 bnez a0,3802 + close(pfds[0]); + 37b4: fc842503 lw a0,-56(s0) + 37b8: 5e4010ef jal 4d9c + if(write(pfds[1], "x", 1) != 1) + 37bc: 4605 li a2,1 + 37be: 00002597 auipc a1,0x2 + 37c2: c4a58593 addi a1,a1,-950 # 5408 + 37c6: fcc42503 lw a0,-52(s0) + 37ca: 5ca010ef jal 4d94 + 37ce: 4785 li a5,1 + 37d0: 02f51163 bne a0,a5,37f2 + close(pfds[1]); + 37d4: fcc42503 lw a0,-52(s0) + 37d8: 5c4010ef jal 4d9c + for(;;) + 37dc: a001 j 37dc + printf("%s: fork failed\n", s); + 37de: 85ca mv a1,s2 + 37e0: 00002517 auipc a0,0x2 + 37e4: 44850513 addi a0,a0,1096 # 5c28 + 37e8: 1cd010ef jal 51b4 + exit(1); + 37ec: 4505 li a0,1 + 37ee: 586010ef jal 4d74 + printf("%s: preempt write error", s); + 37f2: 85ca mv a1,s2 + 37f4: 00003517 auipc a0,0x3 + 37f8: 63c50513 addi a0,a0,1596 # 6e30 + 37fc: 1b9010ef jal 51b4 + 3800: bfd1 j 37d4 + close(pfds[1]); + 3802: fcc42503 lw a0,-52(s0) + 3806: 596010ef jal 4d9c + if(read(pfds[0], buf, sizeof(buf)) != 1){ + 380a: 660d lui a2,0x3 + 380c: 00009597 auipc a1,0x9 + 3810: 4ac58593 addi a1,a1,1196 # ccb8 + 3814: fc842503 lw a0,-56(s0) + 3818: 574010ef jal 4d8c + 381c: 4785 li a5,1 + 381e: 02f50163 beq a0,a5,3840 + printf("%s: preempt read error", s); + 3822: 85ca mv a1,s2 + 3824: 00003517 auipc a0,0x3 + 3828: 62450513 addi a0,a0,1572 # 6e48 + 382c: 189010ef jal 51b4 +} + 3830: 70e2 ld ra,56(sp) + 3832: 7442 ld s0,48(sp) + 3834: 74a2 ld s1,40(sp) + 3836: 7902 ld s2,32(sp) + 3838: 69e2 ld s3,24(sp) + 383a: 6a42 ld s4,16(sp) + 383c: 6121 addi sp,sp,64 + 383e: 8082 ret + close(pfds[0]); + 3840: fc842503 lw a0,-56(s0) + 3844: 558010ef jal 4d9c + printf("kill... "); + 3848: 00003517 auipc a0,0x3 + 384c: 61850513 addi a0,a0,1560 # 6e60 + 3850: 165010ef jal 51b4 + kill(pid1); + 3854: 8526 mv a0,s1 + 3856: 54e010ef jal 4da4 + kill(pid2); + 385a: 854e mv a0,s3 + 385c: 548010ef jal 4da4 + kill(pid3); + 3860: 8552 mv a0,s4 + 3862: 542010ef jal 4da4 + printf("wait... "); + 3866: 00003517 auipc a0,0x3 + 386a: 60a50513 addi a0,a0,1546 # 6e70 + 386e: 147010ef jal 51b4 + wait(0); + 3872: 4501 li a0,0 + 3874: 508010ef jal 4d7c + wait(0); + 3878: 4501 li a0,0 + 387a: 502010ef jal 4d7c + wait(0); + 387e: 4501 li a0,0 + 3880: 4fc010ef jal 4d7c + 3884: b775 j 3830 + +0000000000003886 : +{ + 3886: 7179 addi sp,sp,-48 + 3888: f406 sd ra,40(sp) + 388a: f022 sd s0,32(sp) + 388c: ec26 sd s1,24(sp) + 388e: e84a sd s2,16(sp) + 3890: e44e sd s3,8(sp) + 3892: e052 sd s4,0(sp) + 3894: 1800 addi s0,sp,48 + 3896: 89aa mv s3,a0 + int master_pid = getpid(); + 3898: 55c010ef jal 4df4 + 389c: 8a2a mv s4,a0 + 389e: 0c800913 li s2,200 + int pid = fork(); + 38a2: 4ca010ef jal 4d6c + 38a6: 84aa mv s1,a0 + if(pid < 0){ + 38a8: 00054e63 bltz a0,38c4 + if(pid){ + 38ac: c121 beqz a0,38ec + if(wait(0) != pid){ + 38ae: 4501 li a0,0 + 38b0: 4cc010ef jal 4d7c + 38b4: 02951263 bne a0,s1,38d8 + for(int i = 0; i < 200; i++){ + 38b8: 397d addiw s2,s2,-1 + 38ba: fe0914e3 bnez s2,38a2 + exit(0); + 38be: 4501 li a0,0 + 38c0: 4b4010ef jal 4d74 + printf("%s: fork failed\n", s); + 38c4: 85ce mv a1,s3 + 38c6: 00002517 auipc a0,0x2 + 38ca: 36250513 addi a0,a0,866 # 5c28 + 38ce: 0e7010ef jal 51b4 + exit(1); + 38d2: 4505 li a0,1 + 38d4: 4a0010ef jal 4d74 + printf("%s: wait wrong pid\n", s); + 38d8: 85ce mv a1,s3 + 38da: 00002517 auipc a0,0x2 + 38de: 4d650513 addi a0,a0,1238 # 5db0 + 38e2: 0d3010ef jal 51b4 + exit(1); + 38e6: 4505 li a0,1 + 38e8: 48c010ef jal 4d74 + int pid2 = fork(); + 38ec: 480010ef jal 4d6c + if(pid2 < 0){ + 38f0: 00054563 bltz a0,38fa + exit(0); + 38f4: 4501 li a0,0 + 38f6: 47e010ef jal 4d74 + kill(master_pid); + 38fa: 8552 mv a0,s4 + 38fc: 4a8010ef jal 4da4 + exit(1); + 3900: 4505 li a0,1 + 3902: 472010ef jal 4d74 + +0000000000003906 : +{ + 3906: 7175 addi sp,sp,-144 + 3908: e506 sd ra,136(sp) + 390a: e122 sd s0,128(sp) + 390c: fca6 sd s1,120(sp) + 390e: f8ca sd s2,112(sp) + 3910: f4ce sd s3,104(sp) + 3912: f0d2 sd s4,96(sp) + 3914: ecd6 sd s5,88(sp) + 3916: e8da sd s6,80(sp) + 3918: e4de sd s7,72(sp) + 391a: 0900 addi s0,sp,144 + 391c: 8b2a mv s6,a0 + if(pipe(fds) != 0){ + 391e: fa040513 addi a0,s0,-96 + 3922: 462010ef jal 4d84 + 3926: e919 bnez a0,393c + 3928: 8aaa mv s5,a0 + 392a: f7040493 addi s1,s0,-144 + 392e: f9840993 addi s3,s0,-104 + 3932: 8926 mv s2,s1 + if(pids[i] != -1) { + 3934: 5a7d li s4,-1 + if(scratch == '0') + 3936: 03000b93 li s7,48 + 393a: a08d j 399c + printf("%s: pipe() failed\n", s); + 393c: 85da mv a1,s6 + 393e: 00002517 auipc a0,0x2 + 3942: 3f250513 addi a0,a0,1010 # 5d30 + 3946: 06f010ef jal 51b4 + exit(1); + 394a: 4505 li a0,1 + 394c: 428010ef jal 4d74 + if (sbrk(BIG - (uint64)sbrk(0)) == (char*)SBRK_ERROR) + 3950: 3f0010ef jal 4d40 + 3954: 064007b7 lui a5,0x6400 + 3958: 40a7853b subw a0,a5,a0 + 395c: 3e4010ef jal 4d40 + 3960: 57fd li a5,-1 + 3962: 02f50063 beq a0,a5,3982 + write(fds[1], "1", 1); + 3966: 4605 li a2,1 + 3968: 00004597 auipc a1,0x4 + 396c: c9058593 addi a1,a1,-880 # 75f8 + 3970: fa442503 lw a0,-92(s0) + 3974: 420010ef jal 4d94 + for(;;) pause(1000); + 3978: 3e800513 li a0,1000 + 397c: 488010ef jal 4e04 + 3980: bfe5 j 3978 + write(fds[1], "0", 1); + 3982: 4605 li a2,1 + 3984: 00003597 auipc a1,0x3 + 3988: 4fc58593 addi a1,a1,1276 # 6e80 + 398c: fa442503 lw a0,-92(s0) + 3990: 404010ef jal 4d94 + 3994: b7d5 j 3978 + for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ + 3996: 0911 addi s2,s2,4 + 3998: 03390663 beq s2,s3,39c4 + if((pids[i] = fork()) == 0){ + 399c: 3d0010ef jal 4d6c + 39a0: 00a92023 sw a0,0(s2) + 39a4: d555 beqz a0,3950 + if(pids[i] != -1) { + 39a6: ff4508e3 beq a0,s4,3996 + read(fds[0], &scratch, 1); + 39aa: 4605 li a2,1 + 39ac: f9f40593 addi a1,s0,-97 + 39b0: fa042503 lw a0,-96(s0) + 39b4: 3d8010ef jal 4d8c + if(scratch == '0') + 39b8: f9f44783 lbu a5,-97(s0) + 39bc: fd779de3 bne a5,s7,3996 + failed = 1; + 39c0: 4a85 li s5,1 + 39c2: bfd1 j 3996 + if(!failed) { + 39c4: 000a8863 beqz s5,39d4 + c = sbrk(PGSIZE); + 39c8: 6505 lui a0,0x1 + 39ca: 376010ef jal 4d40 + 39ce: 8a2a mv s4,a0 + if(pids[i] == -1) + 39d0: 597d li s2,-1 + 39d2: a821 j 39ea + printf("%s: no allocation failed; allocate more?\n", s); + 39d4: 85da mv a1,s6 + 39d6: 00003517 auipc a0,0x3 + 39da: 4b250513 addi a0,a0,1202 # 6e88 + 39de: 7d6010ef jal 51b4 + 39e2: b7dd j 39c8 + for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ + 39e4: 0491 addi s1,s1,4 + 39e6: 01348b63 beq s1,s3,39fc + if(pids[i] == -1) + 39ea: 4088 lw a0,0(s1) + 39ec: ff250ce3 beq a0,s2,39e4 + kill(pids[i]); + 39f0: 3b4010ef jal 4da4 + wait(0); + 39f4: 4501 li a0,0 + 39f6: 386010ef jal 4d7c + 39fa: b7ed j 39e4 + if(c == (char*)SBRK_ERROR){ + 39fc: 57fd li a5,-1 + 39fe: 02fa0a63 beq s4,a5,3a32 + pid = fork(); + 3a02: 36a010ef jal 4d6c + if(pid < 0){ + 3a06: 04054063 bltz a0,3a46 + if(pid == 0){ + 3a0a: e939 bnez a0,3a60 + a = sbrk(10*BIG); + 3a0c: 3e800537 lui a0,0x3e800 + 3a10: 330010ef jal 4d40 + if(a == (char*)SBRK_ERROR){ + 3a14: 57fd li a5,-1 + 3a16: 04f50263 beq a0,a5,3a5a + printf("%s: allocate a lot of memory succeeded %d\n", s, 10*BIG); + 3a1a: 3e800637 lui a2,0x3e800 + 3a1e: 85da mv a1,s6 + 3a20: 00003517 auipc a0,0x3 + 3a24: 4b850513 addi a0,a0,1208 # 6ed8 + 3a28: 78c010ef jal 51b4 + exit(1); + 3a2c: 4505 li a0,1 + 3a2e: 346010ef jal 4d74 + printf("%s: failed sbrk leaked memory\n", s); + 3a32: 85da mv a1,s6 + 3a34: 00003517 auipc a0,0x3 + 3a38: 48450513 addi a0,a0,1156 # 6eb8 + 3a3c: 778010ef jal 51b4 + exit(1); + 3a40: 4505 li a0,1 + 3a42: 332010ef jal 4d74 + printf("%s: fork failed\n", s); + 3a46: 85da mv a1,s6 + 3a48: 00002517 auipc a0,0x2 + 3a4c: 1e050513 addi a0,a0,480 # 5c28 + 3a50: 764010ef jal 51b4 + exit(1); + 3a54: 4505 li a0,1 + 3a56: 31e010ef jal 4d74 + exit(0); + 3a5a: 4501 li a0,0 + 3a5c: 318010ef jal 4d74 + wait(&xstatus); + 3a60: fac40513 addi a0,s0,-84 + 3a64: 318010ef jal 4d7c + if(xstatus != 0) + 3a68: fac42783 lw a5,-84(s0) + 3a6c: ef81 bnez a5,3a84 +} + 3a6e: 60aa ld ra,136(sp) + 3a70: 640a ld s0,128(sp) + 3a72: 74e6 ld s1,120(sp) + 3a74: 7946 ld s2,112(sp) + 3a76: 79a6 ld s3,104(sp) + 3a78: 7a06 ld s4,96(sp) + 3a7a: 6ae6 ld s5,88(sp) + 3a7c: 6b46 ld s6,80(sp) + 3a7e: 6ba6 ld s7,72(sp) + 3a80: 6149 addi sp,sp,144 + 3a82: 8082 ret + exit(1); + 3a84: 4505 li a0,1 + 3a86: 2ee010ef jal 4d74 + +0000000000003a8a : +{ + 3a8a: 7139 addi sp,sp,-64 + 3a8c: fc06 sd ra,56(sp) + 3a8e: f822 sd s0,48(sp) + 3a90: f426 sd s1,40(sp) + 3a92: f04a sd s2,32(sp) + 3a94: ec4e sd s3,24(sp) + 3a96: 0080 addi s0,sp,64 + 3a98: 89aa mv s3,a0 + if((pid = fork()) == 0){ + 3a9a: 2d2010ef jal 4d6c + m1 = 0; + 3a9e: 4481 li s1,0 + while((m2 = malloc(10001)) != 0){ + 3aa0: 6909 lui s2,0x2 + 3aa2: 71190913 addi s2,s2,1809 # 2711 + if((pid = fork()) == 0){ + 3aa6: cd11 beqz a0,3ac2 + wait(&xstatus); + 3aa8: fcc40513 addi a0,s0,-52 + 3aac: 2d0010ef jal 4d7c + if(xstatus == -1){ + 3ab0: fcc42503 lw a0,-52(s0) + 3ab4: 57fd li a5,-1 + 3ab6: 04f50363 beq a0,a5,3afc + exit(xstatus); + 3aba: 2ba010ef jal 4d74 + *(char**)m2 = m1; + 3abe: e104 sd s1,0(a0) + m1 = m2; + 3ac0: 84aa mv s1,a0 + while((m2 = malloc(10001)) != 0){ + 3ac2: 854a mv a0,s2 + 3ac4: 7a4010ef jal 5268 + 3ac8: f97d bnez a0,3abe + while(m1){ + 3aca: c491 beqz s1,3ad6 + m2 = *(char**)m1; + 3acc: 8526 mv a0,s1 + 3ace: 6084 ld s1,0(s1) + free(m1); + 3ad0: 716010ef jal 51e6 + while(m1){ + 3ad4: fce5 bnez s1,3acc + m1 = malloc(1024*20); + 3ad6: 6515 lui a0,0x5 + 3ad8: 790010ef jal 5268 + if(m1 == 0){ + 3adc: c511 beqz a0,3ae8 + free(m1); + 3ade: 708010ef jal 51e6 + exit(0); + 3ae2: 4501 li a0,0 + 3ae4: 290010ef jal 4d74 + printf("%s: couldn't allocate mem?!!\n", s); + 3ae8: 85ce mv a1,s3 + 3aea: 00003517 auipc a0,0x3 + 3aee: 41e50513 addi a0,a0,1054 # 6f08 + 3af2: 6c2010ef jal 51b4 + exit(1); + 3af6: 4505 li a0,1 + 3af8: 27c010ef jal 4d74 + exit(0); + 3afc: 4501 li a0,0 + 3afe: 276010ef jal 4d74 + +0000000000003b02 : +{ + 3b02: 7159 addi sp,sp,-112 + 3b04: f486 sd ra,104(sp) + 3b06: f0a2 sd s0,96(sp) + 3b08: e0d2 sd s4,64(sp) + 3b0a: 1880 addi s0,sp,112 + 3b0c: 8a2a mv s4,a0 + unlink("sharedfd"); + 3b0e: 00003517 auipc a0,0x3 + 3b12: 41a50513 addi a0,a0,1050 # 6f28 + 3b16: 2ae010ef jal 4dc4 + fd = open("sharedfd", O_CREATE|O_RDWR); + 3b1a: 20200593 li a1,514 + 3b1e: 00003517 auipc a0,0x3 + 3b22: 40a50513 addi a0,a0,1034 # 6f28 + 3b26: 28e010ef jal 4db4 + if(fd < 0){ + 3b2a: 04054863 bltz a0,3b7a + 3b2e: eca6 sd s1,88(sp) + 3b30: e8ca sd s2,80(sp) + 3b32: e4ce sd s3,72(sp) + 3b34: fc56 sd s5,56(sp) + 3b36: f85a sd s6,48(sp) + 3b38: f45e sd s7,40(sp) + 3b3a: 892a mv s2,a0 + pid = fork(); + 3b3c: 230010ef jal 4d6c + 3b40: 89aa mv s3,a0 + memset(buf, pid==0?'c':'p', sizeof(buf)); + 3b42: 07000593 li a1,112 + 3b46: e119 bnez a0,3b4c + 3b48: 06300593 li a1,99 + 3b4c: 4629 li a2,10 + 3b4e: fa040513 addi a0,s0,-96 + 3b52: 010010ef jal 4b62 + 3b56: 3e800493 li s1,1000 + if(write(fd, buf, sizeof(buf)) != sizeof(buf)){ + 3b5a: 4629 li a2,10 + 3b5c: fa040593 addi a1,s0,-96 + 3b60: 854a mv a0,s2 + 3b62: 232010ef jal 4d94 + 3b66: 47a9 li a5,10 + 3b68: 02f51963 bne a0,a5,3b9a + for(i = 0; i < N; i++){ + 3b6c: 34fd addiw s1,s1,-1 + 3b6e: f4f5 bnez s1,3b5a + if(pid == 0) { + 3b70: 02099f63 bnez s3,3bae + exit(0); + 3b74: 4501 li a0,0 + 3b76: 1fe010ef jal 4d74 + 3b7a: eca6 sd s1,88(sp) + 3b7c: e8ca sd s2,80(sp) + 3b7e: e4ce sd s3,72(sp) + 3b80: fc56 sd s5,56(sp) + 3b82: f85a sd s6,48(sp) + 3b84: f45e sd s7,40(sp) + printf("%s: cannot open sharedfd for writing", s); + 3b86: 85d2 mv a1,s4 + 3b88: 00003517 auipc a0,0x3 + 3b8c: 3b050513 addi a0,a0,944 # 6f38 + 3b90: 624010ef jal 51b4 + exit(1); + 3b94: 4505 li a0,1 + 3b96: 1de010ef jal 4d74 + printf("%s: write sharedfd failed\n", s); + 3b9a: 85d2 mv a1,s4 + 3b9c: 00003517 auipc a0,0x3 + 3ba0: 3c450513 addi a0,a0,964 # 6f60 + 3ba4: 610010ef jal 51b4 + exit(1); + 3ba8: 4505 li a0,1 + 3baa: 1ca010ef jal 4d74 + wait(&xstatus); + 3bae: f9c40513 addi a0,s0,-100 + 3bb2: 1ca010ef jal 4d7c + if(xstatus != 0) + 3bb6: f9c42983 lw s3,-100(s0) + 3bba: 00098563 beqz s3,3bc4 + exit(xstatus); + 3bbe: 854e mv a0,s3 + 3bc0: 1b4010ef jal 4d74 + close(fd); + 3bc4: 854a mv a0,s2 + 3bc6: 1d6010ef jal 4d9c + fd = open("sharedfd", 0); + 3bca: 4581 li a1,0 + 3bcc: 00003517 auipc a0,0x3 + 3bd0: 35c50513 addi a0,a0,860 # 6f28 + 3bd4: 1e0010ef jal 4db4 + 3bd8: 8baa mv s7,a0 + nc = np = 0; + 3bda: 8ace mv s5,s3 + if(fd < 0){ + 3bdc: 02054363 bltz a0,3c02 + 3be0: faa40913 addi s2,s0,-86 + if(buf[i] == 'c') + 3be4: 06300493 li s1,99 + if(buf[i] == 'p') + 3be8: 07000b13 li s6,112 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3bec: 4629 li a2,10 + 3bee: fa040593 addi a1,s0,-96 + 3bf2: 855e mv a0,s7 + 3bf4: 198010ef jal 4d8c + 3bf8: 02a05b63 blez a0,3c2e + 3bfc: fa040793 addi a5,s0,-96 + 3c00: a839 j 3c1e + printf("%s: cannot open sharedfd for reading\n", s); + 3c02: 85d2 mv a1,s4 + 3c04: 00003517 auipc a0,0x3 + 3c08: 37c50513 addi a0,a0,892 # 6f80 + 3c0c: 5a8010ef jal 51b4 + exit(1); + 3c10: 4505 li a0,1 + 3c12: 162010ef jal 4d74 + nc++; + 3c16: 2985 addiw s3,s3,1 + for(i = 0; i < sizeof(buf); i++){ + 3c18: 0785 addi a5,a5,1 # 6400001 + 3c1a: fd2789e3 beq a5,s2,3bec + if(buf[i] == 'c') + 3c1e: 0007c703 lbu a4,0(a5) + 3c22: fe970ae3 beq a4,s1,3c16 + if(buf[i] == 'p') + 3c26: ff6719e3 bne a4,s6,3c18 + np++; + 3c2a: 2a85 addiw s5,s5,1 + 3c2c: b7f5 j 3c18 + close(fd); + 3c2e: 855e mv a0,s7 + 3c30: 16c010ef jal 4d9c + unlink("sharedfd"); + 3c34: 00003517 auipc a0,0x3 + 3c38: 2f450513 addi a0,a0,756 # 6f28 + 3c3c: 188010ef jal 4dc4 + if(nc == N*SZ && np == N*SZ){ + 3c40: 6789 lui a5,0x2 + 3c42: 71078793 addi a5,a5,1808 # 2710 + 3c46: 00f99763 bne s3,a5,3c54 + 3c4a: 6789 lui a5,0x2 + 3c4c: 71078793 addi a5,a5,1808 # 2710 + 3c50: 00fa8c63 beq s5,a5,3c68 + printf("%s: nc/np test fails\n", s); + 3c54: 85d2 mv a1,s4 + 3c56: 00003517 auipc a0,0x3 + 3c5a: 35250513 addi a0,a0,850 # 6fa8 + 3c5e: 556010ef jal 51b4 + exit(1); + 3c62: 4505 li a0,1 + 3c64: 110010ef jal 4d74 + exit(0); + 3c68: 4501 li a0,0 + 3c6a: 10a010ef jal 4d74 + +0000000000003c6e : +{ + 3c6e: 7135 addi sp,sp,-160 + 3c70: ed06 sd ra,152(sp) + 3c72: e922 sd s0,144(sp) + 3c74: e526 sd s1,136(sp) + 3c76: e14a sd s2,128(sp) + 3c78: fcce sd s3,120(sp) + 3c7a: f8d2 sd s4,112(sp) + 3c7c: f4d6 sd s5,104(sp) + 3c7e: f0da sd s6,96(sp) + 3c80: ecde sd s7,88(sp) + 3c82: e8e2 sd s8,80(sp) + 3c84: e4e6 sd s9,72(sp) + 3c86: e0ea sd s10,64(sp) + 3c88: fc6e sd s11,56(sp) + 3c8a: 1100 addi s0,sp,160 + 3c8c: 8caa mv s9,a0 + char *names[] = { "f0", "f1", "f2", "f3" }; + 3c8e: 00003797 auipc a5,0x3 + 3c92: 33278793 addi a5,a5,818 # 6fc0 + 3c96: f6f43823 sd a5,-144(s0) + 3c9a: 00003797 auipc a5,0x3 + 3c9e: 32e78793 addi a5,a5,814 # 6fc8 + 3ca2: f6f43c23 sd a5,-136(s0) + 3ca6: 00003797 auipc a5,0x3 + 3caa: 32a78793 addi a5,a5,810 # 6fd0 + 3cae: f8f43023 sd a5,-128(s0) + 3cb2: 00003797 auipc a5,0x3 + 3cb6: 32678793 addi a5,a5,806 # 6fd8 + 3cba: f8f43423 sd a5,-120(s0) + for(pi = 0; pi < NCHILD; pi++){ + 3cbe: f7040b93 addi s7,s0,-144 + char *names[] = { "f0", "f1", "f2", "f3" }; + 3cc2: 895e mv s2,s7 + for(pi = 0; pi < NCHILD; pi++){ + 3cc4: 4481 li s1,0 + 3cc6: 4a11 li s4,4 + fname = names[pi]; + 3cc8: 00093983 ld s3,0(s2) + unlink(fname); + 3ccc: 854e mv a0,s3 + 3cce: 0f6010ef jal 4dc4 + pid = fork(); + 3cd2: 09a010ef jal 4d6c + if(pid < 0){ + 3cd6: 02054e63 bltz a0,3d12 + if(pid == 0){ + 3cda: c531 beqz a0,3d26 + for(pi = 0; pi < NCHILD; pi++){ + 3cdc: 2485 addiw s1,s1,1 + 3cde: 0921 addi s2,s2,8 + 3ce0: ff4494e3 bne s1,s4,3cc8 + 3ce4: 4491 li s1,4 + wait(&xstatus); + 3ce6: f6c40513 addi a0,s0,-148 + 3cea: 092010ef jal 4d7c + if(xstatus != 0) + 3cee: f6c42a83 lw s5,-148(s0) + 3cf2: 0a0a9463 bnez s5,3d9a + for(pi = 0; pi < NCHILD; pi++){ + 3cf6: 34fd addiw s1,s1,-1 + 3cf8: f4fd bnez s1,3ce6 + 3cfa: 03000b13 li s6,48 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3cfe: 00009a17 auipc s4,0x9 + 3d02: fbaa0a13 addi s4,s4,-70 # ccb8 + if(total != N*SZ){ + 3d06: 6d05 lui s10,0x1 + 3d08: 770d0d13 addi s10,s10,1904 # 1770 + for(i = 0; i < NCHILD; i++){ + 3d0c: 03400d93 li s11,52 + 3d10: a0ed j 3dfa + printf("%s: fork failed\n", s); + 3d12: 85e6 mv a1,s9 + 3d14: 00002517 auipc a0,0x2 + 3d18: f1450513 addi a0,a0,-236 # 5c28 + 3d1c: 498010ef jal 51b4 + exit(1); + 3d20: 4505 li a0,1 + 3d22: 052010ef jal 4d74 + fd = open(fname, O_CREATE | O_RDWR); + 3d26: 20200593 li a1,514 + 3d2a: 854e mv a0,s3 + 3d2c: 088010ef jal 4db4 + 3d30: 892a mv s2,a0 + if(fd < 0){ + 3d32: 04054163 bltz a0,3d74 + memset(buf, '0'+pi, SZ); + 3d36: 1f400613 li a2,500 + 3d3a: 0304859b addiw a1,s1,48 + 3d3e: 00009517 auipc a0,0x9 + 3d42: f7a50513 addi a0,a0,-134 # ccb8 + 3d46: 61d000ef jal 4b62 + 3d4a: 44b1 li s1,12 + if((n = write(fd, buf, SZ)) != SZ){ + 3d4c: 00009997 auipc s3,0x9 + 3d50: f6c98993 addi s3,s3,-148 # ccb8 + 3d54: 1f400613 li a2,500 + 3d58: 85ce mv a1,s3 + 3d5a: 854a mv a0,s2 + 3d5c: 038010ef jal 4d94 + 3d60: 85aa mv a1,a0 + 3d62: 1f400793 li a5,500 + 3d66: 02f51163 bne a0,a5,3d88 + for(i = 0; i < N; i++){ + 3d6a: 34fd addiw s1,s1,-1 + 3d6c: f4e5 bnez s1,3d54 + exit(0); + 3d6e: 4501 li a0,0 + 3d70: 004010ef jal 4d74 + printf("%s: create failed\n", s); + 3d74: 85e6 mv a1,s9 + 3d76: 00002517 auipc a0,0x2 + 3d7a: f4a50513 addi a0,a0,-182 # 5cc0 + 3d7e: 436010ef jal 51b4 + exit(1); + 3d82: 4505 li a0,1 + 3d84: 7f1000ef jal 4d74 + printf("write failed %d\n", n); + 3d88: 00003517 auipc a0,0x3 + 3d8c: 25850513 addi a0,a0,600 # 6fe0 + 3d90: 424010ef jal 51b4 + exit(1); + 3d94: 4505 li a0,1 + 3d96: 7df000ef jal 4d74 + exit(xstatus); + 3d9a: 8556 mv a0,s5 + 3d9c: 7d9000ef jal 4d74 + printf("%s: wrong char\n", s); + 3da0: 85e6 mv a1,s9 + 3da2: 00003517 auipc a0,0x3 + 3da6: 25650513 addi a0,a0,598 # 6ff8 + 3daa: 40a010ef jal 51b4 + exit(1); + 3dae: 4505 li a0,1 + 3db0: 7c5000ef jal 4d74 + total += n; + 3db4: 00a9093b addw s2,s2,a0 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3db8: 660d lui a2,0x3 + 3dba: 85d2 mv a1,s4 + 3dbc: 854e mv a0,s3 + 3dbe: 7cf000ef jal 4d8c + 3dc2: 02a05063 blez a0,3de2 + 3dc6: 00009797 auipc a5,0x9 + 3dca: ef278793 addi a5,a5,-270 # ccb8 + 3dce: 00f506b3 add a3,a0,a5 + if(buf[j] != '0'+i){ + 3dd2: 0007c703 lbu a4,0(a5) + 3dd6: fc9715e3 bne a4,s1,3da0 + for(j = 0; j < n; j++){ + 3dda: 0785 addi a5,a5,1 + 3ddc: fed79be3 bne a5,a3,3dd2 + 3de0: bfd1 j 3db4 + close(fd); + 3de2: 854e mv a0,s3 + 3de4: 7b9000ef jal 4d9c + if(total != N*SZ){ + 3de8: 03a91463 bne s2,s10,3e10 + unlink(fname); + 3dec: 8562 mv a0,s8 + 3dee: 7d7000ef jal 4dc4 + for(i = 0; i < NCHILD; i++){ + 3df2: 0ba1 addi s7,s7,8 + 3df4: 2b05 addiw s6,s6,1 + 3df6: 03bb0763 beq s6,s11,3e24 + fname = names[i]; + 3dfa: 000bbc03 ld s8,0(s7) + fd = open(fname, 0); + 3dfe: 4581 li a1,0 + 3e00: 8562 mv a0,s8 + 3e02: 7b3000ef jal 4db4 + 3e06: 89aa mv s3,a0 + total = 0; + 3e08: 8956 mv s2,s5 + if(buf[j] != '0'+i){ + 3e0a: 000b049b sext.w s1,s6 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3e0e: b76d j 3db8 + printf("wrong length %d\n", total); + 3e10: 85ca mv a1,s2 + 3e12: 00003517 auipc a0,0x3 + 3e16: 1f650513 addi a0,a0,502 # 7008 + 3e1a: 39a010ef jal 51b4 + exit(1); + 3e1e: 4505 li a0,1 + 3e20: 755000ef jal 4d74 +} + 3e24: 60ea ld ra,152(sp) + 3e26: 644a ld s0,144(sp) + 3e28: 64aa ld s1,136(sp) + 3e2a: 690a ld s2,128(sp) + 3e2c: 79e6 ld s3,120(sp) + 3e2e: 7a46 ld s4,112(sp) + 3e30: 7aa6 ld s5,104(sp) + 3e32: 7b06 ld s6,96(sp) + 3e34: 6be6 ld s7,88(sp) + 3e36: 6c46 ld s8,80(sp) + 3e38: 6ca6 ld s9,72(sp) + 3e3a: 6d06 ld s10,64(sp) + 3e3c: 7de2 ld s11,56(sp) + 3e3e: 610d addi sp,sp,160 + 3e40: 8082 ret + +0000000000003e42 : +{ + 3e42: 7135 addi sp,sp,-160 + 3e44: ed06 sd ra,152(sp) + 3e46: e922 sd s0,144(sp) + 3e48: e526 sd s1,136(sp) + 3e4a: e14a sd s2,128(sp) + 3e4c: fcce sd s3,120(sp) + 3e4e: f8d2 sd s4,112(sp) + 3e50: f4d6 sd s5,104(sp) + 3e52: f0da sd s6,96(sp) + 3e54: ecde sd s7,88(sp) + 3e56: 1100 addi s0,sp,160 + 3e58: 89aa mv s3,a0 + file[0] = 'C'; + 3e5a: 04300793 li a5,67 + 3e5e: faf40423 sb a5,-88(s0) + file[2] = '\0'; + 3e62: fa040523 sb zero,-86(s0) + for(i = 0; i < N; i++){ + 3e66: 4901 li s2,0 + if(pid && (i % 3) == 1){ + 3e68: 4b0d li s6,3 + 3e6a: 4a85 li s5,1 + link("C0", file); + 3e6c: 00003b97 auipc s7,0x3 + 3e70: 1b4b8b93 addi s7,s7,436 # 7020 + for(i = 0; i < N; i++){ + 3e74: 02800a13 li s4,40 + 3e78: a41d j 409e + link("C0", file); + 3e7a: fa840593 addi a1,s0,-88 + 3e7e: 855e mv a0,s7 + 3e80: 755000ef jal 4dd4 + if(pid == 0) { + 3e84: a411 j 4088 + } else if(pid == 0 && (i % 5) == 1){ + 3e86: 4795 li a5,5 + 3e88: 02f9693b remw s2,s2,a5 + 3e8c: 4785 li a5,1 + 3e8e: 02f90563 beq s2,a5,3eb8 + fd = open(file, O_CREATE | O_RDWR); + 3e92: 20200593 li a1,514 + 3e96: fa840513 addi a0,s0,-88 + 3e9a: 71b000ef jal 4db4 + if(fd < 0){ + 3e9e: 1e055063 bgez a0,407e + printf("concreate create %s failed\n", file); + 3ea2: fa840593 addi a1,s0,-88 + 3ea6: 00003517 auipc a0,0x3 + 3eaa: 18250513 addi a0,a0,386 # 7028 + 3eae: 306010ef jal 51b4 + exit(1); + 3eb2: 4505 li a0,1 + 3eb4: 6c1000ef jal 4d74 + link("C0", file); + 3eb8: fa840593 addi a1,s0,-88 + 3ebc: 00003517 auipc a0,0x3 + 3ec0: 16450513 addi a0,a0,356 # 7020 + 3ec4: 711000ef jal 4dd4 + exit(0); + 3ec8: 4501 li a0,0 + 3eca: 6ab000ef jal 4d74 + exit(1); + 3ece: 4505 li a0,1 + 3ed0: 6a5000ef jal 4d74 + memset(fa, 0, sizeof(fa)); + 3ed4: 02800613 li a2,40 + 3ed8: 4581 li a1,0 + 3eda: f8040513 addi a0,s0,-128 + 3ede: 485000ef jal 4b62 + fd = open(".", 0); + 3ee2: 4581 li a1,0 + 3ee4: 00002517 auipc a0,0x2 + 3ee8: b9c50513 addi a0,a0,-1124 # 5a80 + 3eec: 6c9000ef jal 4db4 + 3ef0: 892a mv s2,a0 + n = 0; + 3ef2: 8aa6 mv s5,s1 + if(de.name[0] == 'C' && de.name[2] == '\0'){ + 3ef4: 04300a13 li s4,67 + if(i < 0 || i >= sizeof(fa)){ + 3ef8: 02700b13 li s6,39 + fa[i] = 1; + 3efc: 4b85 li s7,1 + while(read(fd, &de, sizeof(de)) > 0){ + 3efe: 4641 li a2,16 + 3f00: f7040593 addi a1,s0,-144 + 3f04: 854a mv a0,s2 + 3f06: 687000ef jal 4d8c + 3f0a: 06a05a63 blez a0,3f7e + if(de.inum == 0) + 3f0e: f7045783 lhu a5,-144(s0) + 3f12: d7f5 beqz a5,3efe + if(de.name[0] == 'C' && de.name[2] == '\0'){ + 3f14: f7244783 lbu a5,-142(s0) + 3f18: ff4793e3 bne a5,s4,3efe + 3f1c: f7444783 lbu a5,-140(s0) + 3f20: fff9 bnez a5,3efe + i = de.name[1] - '0'; + 3f22: f7344783 lbu a5,-141(s0) + 3f26: fd07879b addiw a5,a5,-48 + 3f2a: 0007871b sext.w a4,a5 + if(i < 0 || i >= sizeof(fa)){ + 3f2e: 02eb6063 bltu s6,a4,3f4e + if(fa[i]){ + 3f32: fb070793 addi a5,a4,-80 + 3f36: 97a2 add a5,a5,s0 + 3f38: fd07c783 lbu a5,-48(a5) + 3f3c: e78d bnez a5,3f66 + fa[i] = 1; + 3f3e: fb070793 addi a5,a4,-80 + 3f42: 00878733 add a4,a5,s0 + 3f46: fd770823 sb s7,-48(a4) + n++; + 3f4a: 2a85 addiw s5,s5,1 + 3f4c: bf4d j 3efe + printf("%s: concreate weird file %s\n", s, de.name); + 3f4e: f7240613 addi a2,s0,-142 + 3f52: 85ce mv a1,s3 + 3f54: 00003517 auipc a0,0x3 + 3f58: 0f450513 addi a0,a0,244 # 7048 + 3f5c: 258010ef jal 51b4 + exit(1); + 3f60: 4505 li a0,1 + 3f62: 613000ef jal 4d74 + printf("%s: concreate duplicate file %s\n", s, de.name); + 3f66: f7240613 addi a2,s0,-142 + 3f6a: 85ce mv a1,s3 + 3f6c: 00003517 auipc a0,0x3 + 3f70: 0fc50513 addi a0,a0,252 # 7068 + 3f74: 240010ef jal 51b4 + exit(1); + 3f78: 4505 li a0,1 + 3f7a: 5fb000ef jal 4d74 + close(fd); + 3f7e: 854a mv a0,s2 + 3f80: 61d000ef jal 4d9c + if(n != N){ + 3f84: 02800793 li a5,40 + 3f88: 00fa9763 bne s5,a5,3f96 + if(((i % 3) == 0 && pid == 0) || + 3f8c: 4a8d li s5,3 + 3f8e: 4b05 li s6,1 + for(i = 0; i < N; i++){ + 3f90: 02800a13 li s4,40 + 3f94: a079 j 4022 + printf("%s: concreate not enough files in directory listing\n", s); + 3f96: 85ce mv a1,s3 + 3f98: 00003517 auipc a0,0x3 + 3f9c: 0f850513 addi a0,a0,248 # 7090 + 3fa0: 214010ef jal 51b4 + exit(1); + 3fa4: 4505 li a0,1 + 3fa6: 5cf000ef jal 4d74 + printf("%s: fork failed\n", s); + 3faa: 85ce mv a1,s3 + 3fac: 00002517 auipc a0,0x2 + 3fb0: c7c50513 addi a0,a0,-900 # 5c28 + 3fb4: 200010ef jal 51b4 + exit(1); + 3fb8: 4505 li a0,1 + 3fba: 5bb000ef jal 4d74 + close(open(file, 0)); + 3fbe: 4581 li a1,0 + 3fc0: fa840513 addi a0,s0,-88 + 3fc4: 5f1000ef jal 4db4 + 3fc8: 5d5000ef jal 4d9c + close(open(file, 0)); + 3fcc: 4581 li a1,0 + 3fce: fa840513 addi a0,s0,-88 + 3fd2: 5e3000ef jal 4db4 + 3fd6: 5c7000ef jal 4d9c + close(open(file, 0)); + 3fda: 4581 li a1,0 + 3fdc: fa840513 addi a0,s0,-88 + 3fe0: 5d5000ef jal 4db4 + 3fe4: 5b9000ef jal 4d9c + close(open(file, 0)); + 3fe8: 4581 li a1,0 + 3fea: fa840513 addi a0,s0,-88 + 3fee: 5c7000ef jal 4db4 + 3ff2: 5ab000ef jal 4d9c + close(open(file, 0)); + 3ff6: 4581 li a1,0 + 3ff8: fa840513 addi a0,s0,-88 + 3ffc: 5b9000ef jal 4db4 + 4000: 59d000ef jal 4d9c + close(open(file, 0)); + 4004: 4581 li a1,0 + 4006: fa840513 addi a0,s0,-88 + 400a: 5ab000ef jal 4db4 + 400e: 58f000ef jal 4d9c + if(pid == 0) + 4012: 06090363 beqz s2,4078 + wait(0); + 4016: 4501 li a0,0 + 4018: 565000ef jal 4d7c + for(i = 0; i < N; i++){ + 401c: 2485 addiw s1,s1,1 + 401e: 0b448963 beq s1,s4,40d0 + file[1] = '0' + i; + 4022: 0304879b addiw a5,s1,48 + 4026: faf404a3 sb a5,-87(s0) + pid = fork(); + 402a: 543000ef jal 4d6c + 402e: 892a mv s2,a0 + if(pid < 0){ + 4030: f6054de3 bltz a0,3faa + if(((i % 3) == 0 && pid == 0) || + 4034: 0354e73b remw a4,s1,s5 + 4038: 00a767b3 or a5,a4,a0 + 403c: 2781 sext.w a5,a5 + 403e: d3c1 beqz a5,3fbe + 4040: 01671363 bne a4,s6,4046 + ((i % 3) == 1 && pid != 0)){ + 4044: fd2d bnez a0,3fbe + unlink(file); + 4046: fa840513 addi a0,s0,-88 + 404a: 57b000ef jal 4dc4 + unlink(file); + 404e: fa840513 addi a0,s0,-88 + 4052: 573000ef jal 4dc4 + unlink(file); + 4056: fa840513 addi a0,s0,-88 + 405a: 56b000ef jal 4dc4 + unlink(file); + 405e: fa840513 addi a0,s0,-88 + 4062: 563000ef jal 4dc4 + unlink(file); + 4066: fa840513 addi a0,s0,-88 + 406a: 55b000ef jal 4dc4 + unlink(file); + 406e: fa840513 addi a0,s0,-88 + 4072: 553000ef jal 4dc4 + 4076: bf71 j 4012 + exit(0); + 4078: 4501 li a0,0 + 407a: 4fb000ef jal 4d74 + close(fd); + 407e: 51f000ef jal 4d9c + if(pid == 0) { + 4082: b599 j 3ec8 + close(fd); + 4084: 519000ef jal 4d9c + wait(&xstatus); + 4088: f6c40513 addi a0,s0,-148 + 408c: 4f1000ef jal 4d7c + if(xstatus != 0) + 4090: f6c42483 lw s1,-148(s0) + 4094: e2049de3 bnez s1,3ece + for(i = 0; i < N; i++){ + 4098: 2905 addiw s2,s2,1 + 409a: e3490de3 beq s2,s4,3ed4 + file[1] = '0' + i; + 409e: 0309079b addiw a5,s2,48 + 40a2: faf404a3 sb a5,-87(s0) + unlink(file); + 40a6: fa840513 addi a0,s0,-88 + 40aa: 51b000ef jal 4dc4 + pid = fork(); + 40ae: 4bf000ef jal 4d6c + if(pid && (i % 3) == 1){ + 40b2: dc050ae3 beqz a0,3e86 + 40b6: 036967bb remw a5,s2,s6 + 40ba: dd5780e3 beq a5,s5,3e7a + fd = open(file, O_CREATE | O_RDWR); + 40be: 20200593 li a1,514 + 40c2: fa840513 addi a0,s0,-88 + 40c6: 4ef000ef jal 4db4 + if(fd < 0){ + 40ca: fa055de3 bgez a0,4084 + 40ce: bbd1 j 3ea2 +} + 40d0: 60ea ld ra,152(sp) + 40d2: 644a ld s0,144(sp) + 40d4: 64aa ld s1,136(sp) + 40d6: 690a ld s2,128(sp) + 40d8: 79e6 ld s3,120(sp) + 40da: 7a46 ld s4,112(sp) + 40dc: 7aa6 ld s5,104(sp) + 40de: 7b06 ld s6,96(sp) + 40e0: 6be6 ld s7,88(sp) + 40e2: 610d addi sp,sp,160 + 40e4: 8082 ret + +00000000000040e6 : +{ + 40e6: 7139 addi sp,sp,-64 + 40e8: fc06 sd ra,56(sp) + 40ea: f822 sd s0,48(sp) + 40ec: f426 sd s1,40(sp) + 40ee: f04a sd s2,32(sp) + 40f0: ec4e sd s3,24(sp) + 40f2: e852 sd s4,16(sp) + 40f4: e456 sd s5,8(sp) + 40f6: 0080 addi s0,sp,64 + 40f8: 8aaa mv s5,a0 + unlink("bigfile.dat"); + 40fa: 00003517 auipc a0,0x3 + 40fe: fce50513 addi a0,a0,-50 # 70c8 + 4102: 4c3000ef jal 4dc4 + fd = open("bigfile.dat", O_CREATE | O_RDWR); + 4106: 20200593 li a1,514 + 410a: 00003517 auipc a0,0x3 + 410e: fbe50513 addi a0,a0,-66 # 70c8 + 4112: 4a3000ef jal 4db4 + 4116: 89aa mv s3,a0 + for(i = 0; i < N; i++){ + 4118: 4481 li s1,0 + memset(buf, i, SZ); + 411a: 00009917 auipc s2,0x9 + 411e: b9e90913 addi s2,s2,-1122 # ccb8 + for(i = 0; i < N; i++){ + 4122: 4a51 li s4,20 + if(fd < 0){ + 4124: 08054663 bltz a0,41b0 + memset(buf, i, SZ); + 4128: 25800613 li a2,600 + 412c: 85a6 mv a1,s1 + 412e: 854a mv a0,s2 + 4130: 233000ef jal 4b62 + if(write(fd, buf, SZ) != SZ){ + 4134: 25800613 li a2,600 + 4138: 85ca mv a1,s2 + 413a: 854e mv a0,s3 + 413c: 459000ef jal 4d94 + 4140: 25800793 li a5,600 + 4144: 08f51063 bne a0,a5,41c4 + for(i = 0; i < N; i++){ + 4148: 2485 addiw s1,s1,1 + 414a: fd449fe3 bne s1,s4,4128 + close(fd); + 414e: 854e mv a0,s3 + 4150: 44d000ef jal 4d9c + fd = open("bigfile.dat", 0); + 4154: 4581 li a1,0 + 4156: 00003517 auipc a0,0x3 + 415a: f7250513 addi a0,a0,-142 # 70c8 + 415e: 457000ef jal 4db4 + 4162: 8a2a mv s4,a0 + total = 0; + 4164: 4981 li s3,0 + for(i = 0; ; i++){ + 4166: 4481 li s1,0 + cc = read(fd, buf, SZ/2); + 4168: 00009917 auipc s2,0x9 + 416c: b5090913 addi s2,s2,-1200 # ccb8 + if(fd < 0){ + 4170: 06054463 bltz a0,41d8 + cc = read(fd, buf, SZ/2); + 4174: 12c00613 li a2,300 + 4178: 85ca mv a1,s2 + 417a: 8552 mv a0,s4 + 417c: 411000ef jal 4d8c + if(cc < 0){ + 4180: 06054663 bltz a0,41ec + if(cc == 0) + 4184: c155 beqz a0,4228 + if(cc != SZ/2){ + 4186: 12c00793 li a5,300 + 418a: 06f51b63 bne a0,a5,4200 + if(buf[0] != i/2 || buf[SZ/2-1] != i/2){ + 418e: 01f4d79b srliw a5,s1,0x1f + 4192: 9fa5 addw a5,a5,s1 + 4194: 4017d79b sraiw a5,a5,0x1 + 4198: 00094703 lbu a4,0(s2) + 419c: 06f71c63 bne a4,a5,4214 + 41a0: 12b94703 lbu a4,299(s2) + 41a4: 06f71863 bne a4,a5,4214 + total += cc; + 41a8: 12c9899b addiw s3,s3,300 + for(i = 0; ; i++){ + 41ac: 2485 addiw s1,s1,1 + cc = read(fd, buf, SZ/2); + 41ae: b7d9 j 4174 + printf("%s: cannot create bigfile", s); + 41b0: 85d6 mv a1,s5 + 41b2: 00003517 auipc a0,0x3 + 41b6: f2650513 addi a0,a0,-218 # 70d8 + 41ba: 7fb000ef jal 51b4 + exit(1); + 41be: 4505 li a0,1 + 41c0: 3b5000ef jal 4d74 + printf("%s: write bigfile failed\n", s); + 41c4: 85d6 mv a1,s5 + 41c6: 00003517 auipc a0,0x3 + 41ca: f3250513 addi a0,a0,-206 # 70f8 + 41ce: 7e7000ef jal 51b4 + exit(1); + 41d2: 4505 li a0,1 + 41d4: 3a1000ef jal 4d74 + printf("%s: cannot open bigfile\n", s); + 41d8: 85d6 mv a1,s5 + 41da: 00003517 auipc a0,0x3 + 41de: f3e50513 addi a0,a0,-194 # 7118 + 41e2: 7d3000ef jal 51b4 + exit(1); + 41e6: 4505 li a0,1 + 41e8: 38d000ef jal 4d74 + printf("%s: read bigfile failed\n", s); + 41ec: 85d6 mv a1,s5 + 41ee: 00003517 auipc a0,0x3 + 41f2: f4a50513 addi a0,a0,-182 # 7138 + 41f6: 7bf000ef jal 51b4 + exit(1); + 41fa: 4505 li a0,1 + 41fc: 379000ef jal 4d74 + printf("%s: short read bigfile\n", s); + 4200: 85d6 mv a1,s5 + 4202: 00003517 auipc a0,0x3 + 4206: f5650513 addi a0,a0,-170 # 7158 + 420a: 7ab000ef jal 51b4 + exit(1); + 420e: 4505 li a0,1 + 4210: 365000ef jal 4d74 + printf("%s: read bigfile wrong data\n", s); + 4214: 85d6 mv a1,s5 + 4216: 00003517 auipc a0,0x3 + 421a: f5a50513 addi a0,a0,-166 # 7170 + 421e: 797000ef jal 51b4 + exit(1); + 4222: 4505 li a0,1 + 4224: 351000ef jal 4d74 + close(fd); + 4228: 8552 mv a0,s4 + 422a: 373000ef jal 4d9c + if(total != N*SZ){ + 422e: 678d lui a5,0x3 + 4230: ee078793 addi a5,a5,-288 # 2ee0 + 4234: 02f99163 bne s3,a5,4256 + unlink("bigfile.dat"); + 4238: 00003517 auipc a0,0x3 + 423c: e9050513 addi a0,a0,-368 # 70c8 + 4240: 385000ef jal 4dc4 +} + 4244: 70e2 ld ra,56(sp) + 4246: 7442 ld s0,48(sp) + 4248: 74a2 ld s1,40(sp) + 424a: 7902 ld s2,32(sp) + 424c: 69e2 ld s3,24(sp) + 424e: 6a42 ld s4,16(sp) + 4250: 6aa2 ld s5,8(sp) + 4252: 6121 addi sp,sp,64 + 4254: 8082 ret + printf("%s: read bigfile wrong total\n", s); + 4256: 85d6 mv a1,s5 + 4258: 00003517 auipc a0,0x3 + 425c: f3850513 addi a0,a0,-200 # 7190 + 4260: 755000ef jal 51b4 + exit(1); + 4264: 4505 li a0,1 + 4266: 30f000ef jal 4d74 + +000000000000426a : +{ + 426a: 7121 addi sp,sp,-448 + 426c: ff06 sd ra,440(sp) + 426e: fb22 sd s0,432(sp) + 4270: f726 sd s1,424(sp) + 4272: 0380 addi s0,sp,448 + 4274: 84aa mv s1,a0 + unlink("bigarg-ok"); + 4276: 00003517 auipc a0,0x3 + 427a: f3a50513 addi a0,a0,-198 # 71b0 + 427e: 347000ef jal 4dc4 + pid = fork(); + 4282: 2eb000ef jal 4d6c + if(pid == 0){ + 4286: c915 beqz a0,42ba + } else if(pid < 0){ + 4288: 08054a63 bltz a0,431c + wait(&xstatus); + 428c: fdc40513 addi a0,s0,-36 + 4290: 2ed000ef jal 4d7c + if(xstatus != 0) + 4294: fdc42503 lw a0,-36(s0) + 4298: ed41 bnez a0,4330 + fd = open("bigarg-ok", 0); + 429a: 4581 li a1,0 + 429c: 00003517 auipc a0,0x3 + 42a0: f1450513 addi a0,a0,-236 # 71b0 + 42a4: 311000ef jal 4db4 + if(fd < 0){ + 42a8: 08054663 bltz a0,4334 + close(fd); + 42ac: 2f1000ef jal 4d9c +} + 42b0: 70fa ld ra,440(sp) + 42b2: 745a ld s0,432(sp) + 42b4: 74ba ld s1,424(sp) + 42b6: 6139 addi sp,sp,448 + 42b8: 8082 ret + memset(big, ' ', sizeof(big)); + 42ba: 19000613 li a2,400 + 42be: 02000593 li a1,32 + 42c2: e4840513 addi a0,s0,-440 + 42c6: 09d000ef jal 4b62 + big[sizeof(big)-1] = '\0'; + 42ca: fc040ba3 sb zero,-41(s0) + for(i = 0; i < MAXARG-1; i++) + 42ce: 00005797 auipc a5,0x5 + 42d2: 1d278793 addi a5,a5,466 # 94a0 + 42d6: 00005697 auipc a3,0x5 + 42da: 2c268693 addi a3,a3,706 # 9598 + args[i] = big; + 42de: e4840713 addi a4,s0,-440 + 42e2: e398 sd a4,0(a5) + for(i = 0; i < MAXARG-1; i++) + 42e4: 07a1 addi a5,a5,8 + 42e6: fed79ee3 bne a5,a3,42e2 + args[MAXARG-1] = 0; + 42ea: 00005597 auipc a1,0x5 + 42ee: 1b658593 addi a1,a1,438 # 94a0 + 42f2: 0e05bc23 sd zero,248(a1) + exec("echo", args); + 42f6: 00001517 auipc a0,0x1 + 42fa: 0a250513 addi a0,a0,162 # 5398 + 42fe: 2af000ef jal 4dac + fd = open("bigarg-ok", O_CREATE); + 4302: 20000593 li a1,512 + 4306: 00003517 auipc a0,0x3 + 430a: eaa50513 addi a0,a0,-342 # 71b0 + 430e: 2a7000ef jal 4db4 + close(fd); + 4312: 28b000ef jal 4d9c + exit(0); + 4316: 4501 li a0,0 + 4318: 25d000ef jal 4d74 + printf("%s: bigargtest: fork failed\n", s); + 431c: 85a6 mv a1,s1 + 431e: 00003517 auipc a0,0x3 + 4322: ea250513 addi a0,a0,-350 # 71c0 + 4326: 68f000ef jal 51b4 + exit(1); + 432a: 4505 li a0,1 + 432c: 249000ef jal 4d74 + exit(xstatus); + 4330: 245000ef jal 4d74 + printf("%s: bigarg test failed!\n", s); + 4334: 85a6 mv a1,s1 + 4336: 00003517 auipc a0,0x3 + 433a: eaa50513 addi a0,a0,-342 # 71e0 + 433e: 677000ef jal 51b4 + exit(1); + 4342: 4505 li a0,1 + 4344: 231000ef jal 4d74 + +0000000000004348 : +{ + 4348: 1141 addi sp,sp,-16 + 434a: e406 sd ra,8(sp) + 434c: e022 sd s0,0(sp) + 434e: 0800 addi s0,sp,16 + prev_end = sbrklazy(REGION_SZ); + 4350: 40000537 lui a0,0x40000 + 4354: 203000ef jal 4d56 + if (prev_end == (char *) SBRK_ERROR) { + 4358: 57fd li a5,-1 + 435a: 02f50a63 beq a0,a5,438e + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) + 435e: 6605 lui a2,0x1 + 4360: 962a add a2,a2,a0 + 4362: 400017b7 lui a5,0x40001 + 4366: 00f50733 add a4,a0,a5 + 436a: 87b2 mv a5,a2 + 436c: 000406b7 lui a3,0x40 + *(char **)i = i; + 4370: e39c sd a5,0(a5) + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) + 4372: 97b6 add a5,a5,a3 + 4374: fee79ee3 bne a5,a4,4370 + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) { + 4378: 000406b7 lui a3,0x40 + if (*(char **)i != i) { + 437c: 621c ld a5,0(a2) + 437e: 02c79163 bne a5,a2,43a0 + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) { + 4382: 9636 add a2,a2,a3 + 4384: fee61ce3 bne a2,a4,437c + exit(0); + 4388: 4501 li a0,0 + 438a: 1eb000ef jal 4d74 + printf("sbrklazy() failed\n"); + 438e: 00003517 auipc a0,0x3 + 4392: e7250513 addi a0,a0,-398 # 7200 + 4396: 61f000ef jal 51b4 + exit(1); + 439a: 4505 li a0,1 + 439c: 1d9000ef jal 4d74 + printf("failed to read value from memory\n"); + 43a0: 00003517 auipc a0,0x3 + 43a4: e7850513 addi a0,a0,-392 # 7218 + 43a8: 60d000ef jal 51b4 + exit(1); + 43ac: 4505 li a0,1 + 43ae: 1c7000ef jal 4d74 + +00000000000043b2 : +{ + 43b2: 7139 addi sp,sp,-64 + 43b4: fc06 sd ra,56(sp) + 43b6: f822 sd s0,48(sp) + 43b8: 0080 addi s0,sp,64 + prev_end = sbrklazy(REGION_SZ); + 43ba: 40000537 lui a0,0x40000 + 43be: 199000ef jal 4d56 + if (prev_end == (char*)SBRK_ERROR) { + 43c2: 57fd li a5,-1 + 43c4: 04f50663 beq a0,a5,4410 + 43c8: f426 sd s1,40(sp) + 43ca: f04a sd s2,32(sp) + 43cc: ec4e sd s3,24(sp) + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) + 43ce: 6905 lui s2,0x1 + 43d0: 992a add s2,s2,a0 + 43d2: 400017b7 lui a5,0x40001 + 43d6: 00f504b3 add s1,a0,a5 + 43da: 87ca mv a5,s2 + 43dc: 01000737 lui a4,0x1000 + *(char **)i = i; + 43e0: e39c sd a5,0(a5) + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) + 43e2: 97ba add a5,a5,a4 + 43e4: fe979ee3 bne a5,s1,43e0 + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) { + 43e8: 010009b7 lui s3,0x1000 + pid = fork(); + 43ec: 181000ef jal 4d6c + if (pid < 0) { + 43f0: 02054c63 bltz a0,4428 + } else if (pid == 0) { + 43f4: c139 beqz a0,443a + wait(&status); + 43f6: fcc40513 addi a0,s0,-52 + 43fa: 183000ef jal 4d7c + if (status == 0) { + 43fe: fcc42783 lw a5,-52(s0) + 4402: c7a9 beqz a5,444c + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) { + 4404: 994e add s2,s2,s3 + 4406: fe9913e3 bne s2,s1,43ec + exit(0); + 440a: 4501 li a0,0 + 440c: 169000ef jal 4d74 + 4410: f426 sd s1,40(sp) + 4412: f04a sd s2,32(sp) + 4414: ec4e sd s3,24(sp) + printf("sbrklazy() failed\n"); + 4416: 00003517 auipc a0,0x3 + 441a: dea50513 addi a0,a0,-534 # 7200 + 441e: 597000ef jal 51b4 + exit(1); + 4422: 4505 li a0,1 + 4424: 151000ef jal 4d74 + printf("error forking\n"); + 4428: 00003517 auipc a0,0x3 + 442c: e1850513 addi a0,a0,-488 # 7240 + 4430: 585000ef jal 51b4 + exit(1); + 4434: 4505 li a0,1 + 4436: 13f000ef jal 4d74 + sbrklazy(-1L * REGION_SZ); + 443a: c0000537 lui a0,0xc0000 + 443e: 119000ef jal 4d56 + *(char **)i = i; + 4442: 01293023 sd s2,0(s2) # 1000 + exit(0); + 4446: 4501 li a0,0 + 4448: 12d000ef jal 4d74 + printf("memory not unmapped\n"); + 444c: 00003517 auipc a0,0x3 + 4450: e0450513 addi a0,a0,-508 # 7250 + 4454: 561000ef jal 51b4 + exit(1); + 4458: 4505 li a0,1 + 445a: 11b000ef jal 4d74 + +000000000000445e : +{ + 445e: 7159 addi sp,sp,-112 + 4460: f486 sd ra,104(sp) + 4462: f0a2 sd s0,96(sp) + 4464: eca6 sd s1,88(sp) + 4466: e8ca sd s2,80(sp) + 4468: e4ce sd s3,72(sp) + 446a: e0d2 sd s4,64(sp) + 446c: fc56 sd s5,56(sp) + 446e: f85a sd s6,48(sp) + 4470: 1880 addi s0,sp,112 + char *p = sbrk(0); + 4472: 4501 li a0,0 + 4474: 0cd000ef jal 4d40 + 4478: 84aa mv s1,a0 + sbrklazy(4*PGSIZE); + 447a: 6511 lui a0,0x4 + 447c: 0db000ef jal 4d56 + open(p + 8192, 0); + 4480: 4581 li a1,0 + 4482: 6509 lui a0,0x2 + 4484: 9526 add a0,a0,s1 + 4486: 12f000ef jal 4db4 + void *xx = sbrk(0); + 448a: 4501 li a0,0 + 448c: 0b5000ef jal 4d40 + 4490: 84aa mv s1,a0 + void *ret = sbrk(-(((uint64) xx)+1)); + 4492: fff54513 not a0,a0 + 4496: 2501 sext.w a0,a0 + 4498: 0a9000ef jal 4d40 + if(ret != xx){ + 449c: 00a48c63 beq s1,a0,44b4 + 44a0: 85aa mv a1,a0 + printf("sbrk(sbrk(0)+1) returned %p, not old sz\n", ret); + 44a2: 00003517 auipc a0,0x3 + 44a6: dc650513 addi a0,a0,-570 # 7268 + 44aa: 50b000ef jal 51b4 + exit(1); + 44ae: 4505 li a0,1 + 44b0: 0c5000ef jal 4d74 + unsigned long bad[] = { + 44b4: 00003797 auipc a5,0x3 + 44b8: 42c78793 addi a5,a5,1068 # 78e0 + 44bc: 7fa8 ld a0,120(a5) + 44be: 63cc ld a1,128(a5) + 44c0: 67d0 ld a2,136(a5) + 44c2: 6bd4 ld a3,144(a5) + 44c4: 6fd8 ld a4,152(a5) + 44c6: 73dc ld a5,160(a5) + 44c8: f8a43823 sd a0,-112(s0) + 44cc: f8b43c23 sd a1,-104(s0) + 44d0: fac43023 sd a2,-96(s0) + 44d4: fad43423 sd a3,-88(s0) + 44d8: fae43823 sd a4,-80(s0) + 44dc: faf43c23 sd a5,-72(s0) + for(int i = 0; i < sizeof(bad)/sizeof(bad[0]); i++){ + 44e0: f9040913 addi s2,s0,-112 + 44e4: fc040b13 addi s6,s0,-64 + int fd = open("README", 0); + 44e8: 00001a17 auipc s4,0x1 + 44ec: 088a0a13 addi s4,s4,136 # 5570 + fd = open("junk", O_CREATE|O_RDWR|O_TRUNC); + 44f0: 00001a97 auipc s5,0x1 + 44f4: f90a8a93 addi s5,s5,-112 # 5480 + int fd = open("README", 0); + 44f8: 4581 li a1,0 + 44fa: 8552 mv a0,s4 + 44fc: 0b9000ef jal 4db4 + 4500: 84aa mv s1,a0 + if(fd < 0) { printf("cannot open README\n"); exit(1); } + 4502: 04054663 bltz a0,454e + if(read(fd, (char*)bad[i], 512) >= 0) { printf("read succeeded\n"); exit(1); } + 4506: 00093983 ld s3,0(s2) + 450a: 20000613 li a2,512 + 450e: 85ce mv a1,s3 + 4510: 07d000ef jal 4d8c + 4514: 04055663 bgez a0,4560 + close(fd); + 4518: 8526 mv a0,s1 + 451a: 083000ef jal 4d9c + fd = open("junk", O_CREATE|O_RDWR|O_TRUNC); + 451e: 60200593 li a1,1538 + 4522: 8556 mv a0,s5 + 4524: 091000ef jal 4db4 + 4528: 84aa mv s1,a0 + if(fd < 0) { printf("cannot open junk\n"); exit(1); } + 452a: 04054463 bltz a0,4572 + if(write(fd, (char*)bad[i], 512) >= 0) { printf("write succeeded\n"); exit(1); } + 452e: 20000613 li a2,512 + 4532: 85ce mv a1,s3 + 4534: 061000ef jal 4d94 + 4538: 04055663 bgez a0,4584 + close(fd); + 453c: 8526 mv a0,s1 + 453e: 05f000ef jal 4d9c + for(int i = 0; i < sizeof(bad)/sizeof(bad[0]); i++){ + 4542: 0921 addi s2,s2,8 + 4544: fb691ae3 bne s2,s6,44f8 + exit(0); + 4548: 4501 li a0,0 + 454a: 02b000ef jal 4d74 + if(fd < 0) { printf("cannot open README\n"); exit(1); } + 454e: 00003517 auipc a0,0x3 + 4552: d4a50513 addi a0,a0,-694 # 7298 + 4556: 45f000ef jal 51b4 + 455a: 4505 li a0,1 + 455c: 019000ef jal 4d74 + if(read(fd, (char*)bad[i], 512) >= 0) { printf("read succeeded\n"); exit(1); } + 4560: 00003517 auipc a0,0x3 + 4564: d5050513 addi a0,a0,-688 # 72b0 + 4568: 44d000ef jal 51b4 + 456c: 4505 li a0,1 + 456e: 007000ef jal 4d74 + if(fd < 0) { printf("cannot open junk\n"); exit(1); } + 4572: 00003517 auipc a0,0x3 + 4576: d4e50513 addi a0,a0,-690 # 72c0 + 457a: 43b000ef jal 51b4 + 457e: 4505 li a0,1 + 4580: 7f4000ef jal 4d74 + if(write(fd, (char*)bad[i], 512) >= 0) { printf("write succeeded\n"); exit(1); } + 4584: 00003517 auipc a0,0x3 + 4588: d5450513 addi a0,a0,-684 # 72d8 + 458c: 429000ef jal 51b4 + 4590: 4505 li a0,1 + 4592: 7e2000ef jal 4d74 + +0000000000004596 : +{ + 4596: 1101 addi sp,sp,-32 + 4598: ec06 sd ra,24(sp) + 459a: e822 sd s0,16(sp) + 459c: e426 sd s1,8(sp) + 459e: e04a sd s2,0(sp) + 45a0: 1000 addi s0,sp,32 + char *p = sbrk(0); + 45a2: 4501 li a0,0 + 45a4: 79c000ef jal 4d40 + 45a8: 84aa mv s1,a0 + while ((uint64)p < MAXVA-(1<<30)) { + 45aa: 0ff00793 li a5,255 + 45ae: 07fa slli a5,a5,0x1e + 45b0: 00f57d63 bgeu a0,a5,45ca + 45b4: 893e mv s2,a5 + p = sbrklazy(1<<30); + 45b6: 40000537 lui a0,0x40000 + 45ba: 79c000ef jal 4d56 + p = sbrklazy(0); + 45be: 4501 li a0,0 + 45c0: 796000ef jal 4d56 + 45c4: 84aa mv s1,a0 + while ((uint64)p < MAXVA-(1<<30)) { + 45c6: ff2568e3 bltu a0,s2,45b6 + int n = TRAPFRAME-PGSIZE-(uint64)p; + 45ca: 7975 lui s2,0xffffd + 45cc: 4099093b subw s2,s2,s1 + char *p1 = sbrklazy(n); + 45d0: 854a mv a0,s2 + 45d2: 784000ef jal 4d56 + 45d6: 862a mv a2,a0 + if (p1 < 0 || p1 != p) { + 45d8: 00950d63 beq a0,s1,45f2 + printf("sbrklazy(%d) returned %p, not expected %p\n", n, p1, p); + 45dc: 86a6 mv a3,s1 + 45de: 85ca mv a1,s2 + 45e0: 00003517 auipc a0,0x3 + 45e4: d1050513 addi a0,a0,-752 # 72f0 + 45e8: 3cd000ef jal 51b4 + exit(1); + 45ec: 4505 li a0,1 + 45ee: 786000ef jal 4d74 + p = sbrk(PGSIZE); + 45f2: 6505 lui a0,0x1 + 45f4: 74c000ef jal 4d40 + 45f8: 862a mv a2,a0 + if (p < 0 || (uint64)p != TRAPFRAME-PGSIZE) { + 45fa: 040007b7 lui a5,0x4000 + 45fe: 17f5 addi a5,a5,-3 # 3fffffd + 4600: 07b2 slli a5,a5,0xc + 4602: 00f50c63 beq a0,a5,461a + printf("sbrk(%d) returned %p, not expected TRAPFRAME-PGSIZE\n", PGSIZE, p); + 4606: 6585 lui a1,0x1 + 4608: 00003517 auipc a0,0x3 + 460c: d1850513 addi a0,a0,-744 # 7320 + 4610: 3a5000ef jal 51b4 + exit(1); + 4614: 4505 li a0,1 + 4616: 75e000ef jal 4d74 + p[0] = 1; + 461a: 040007b7 lui a5,0x4000 + 461e: 17f5 addi a5,a5,-3 # 3fffffd + 4620: 07b2 slli a5,a5,0xc + 4622: 4705 li a4,1 + 4624: 00e78023 sb a4,0(a5) + if (p[1] != 0) { + 4628: 0017c783 lbu a5,1(a5) + 462c: cb91 beqz a5,4640 + printf("sbrk() returned non-zero-filled memory\n"); + 462e: 00003517 auipc a0,0x3 + 4632: d2a50513 addi a0,a0,-726 # 7358 + 4636: 37f000ef jal 51b4 + exit(1); + 463a: 4505 li a0,1 + 463c: 738000ef jal 4d74 + p = sbrk(1); + 4640: 4505 li a0,1 + 4642: 6fe000ef jal 4d40 + 4646: 85aa mv a1,a0 + if ((uint64)p != -1) { + 4648: 57fd li a5,-1 + 464a: 00f50b63 beq a0,a5,4660 + printf("sbrk(1) returned %p, expected error\n", p); + 464e: 00003517 auipc a0,0x3 + 4652: d3250513 addi a0,a0,-718 # 7380 + 4656: 35f000ef jal 51b4 + exit(1); + 465a: 4505 li a0,1 + 465c: 718000ef jal 4d74 + p = sbrklazy(1); + 4660: 4505 li a0,1 + 4662: 6f4000ef jal 4d56 + 4666: 85aa mv a1,a0 + if ((uint64)p != -1) { + 4668: 57fd li a5,-1 + 466a: 00f50b63 beq a0,a5,4680 + printf("sbrklazy(1) returned %p, expected error\n", p); + 466e: 00003517 auipc a0,0x3 + 4672: d3a50513 addi a0,a0,-710 # 73a8 + 4676: 33f000ef jal 51b4 + exit(1); + 467a: 4505 li a0,1 + 467c: 6f8000ef jal 4d74 + exit(0); + 4680: 4501 li a0,0 + 4682: 6f2000ef jal 4d74 + +0000000000004686 : +{ + 4686: 7135 addi sp,sp,-160 + 4688: ed06 sd ra,152(sp) + 468a: e922 sd s0,144(sp) + 468c: e526 sd s1,136(sp) + 468e: e14a sd s2,128(sp) + 4690: fcce sd s3,120(sp) + 4692: f8d2 sd s4,112(sp) + 4694: f4d6 sd s5,104(sp) + 4696: f0da sd s6,96(sp) + 4698: ecde sd s7,88(sp) + 469a: e8e2 sd s8,80(sp) + 469c: e4e6 sd s9,72(sp) + 469e: e0ea sd s10,64(sp) + 46a0: 1100 addi s0,sp,160 + printf("fsfull test\n"); + 46a2: 00003517 auipc a0,0x3 + 46a6: d3650513 addi a0,a0,-714 # 73d8 + 46aa: 30b000ef jal 51b4 + for(nfiles = 0; ; nfiles++){ + 46ae: 4481 li s1,0 + name[0] = 'f'; + 46b0: 06600d13 li s10,102 + name[1] = '0' + nfiles / 1000; + 46b4: 3e800c13 li s8,1000 + name[2] = '0' + (nfiles % 1000) / 100; + 46b8: 06400b93 li s7,100 + name[3] = '0' + (nfiles % 100) / 10; + 46bc: 4b29 li s6,10 + printf("writing %s\n", name); + 46be: 00003c97 auipc s9,0x3 + 46c2: d2ac8c93 addi s9,s9,-726 # 73e8 + name[0] = 'f'; + 46c6: f7a40023 sb s10,-160(s0) + name[1] = '0' + nfiles / 1000; + 46ca: 0384c7bb divw a5,s1,s8 + 46ce: 0307879b addiw a5,a5,48 + 46d2: f6f400a3 sb a5,-159(s0) + name[2] = '0' + (nfiles % 1000) / 100; + 46d6: 0384e7bb remw a5,s1,s8 + 46da: 0377c7bb divw a5,a5,s7 + 46de: 0307879b addiw a5,a5,48 + 46e2: f6f40123 sb a5,-158(s0) + name[3] = '0' + (nfiles % 100) / 10; + 46e6: 0374e7bb remw a5,s1,s7 + 46ea: 0367c7bb divw a5,a5,s6 + 46ee: 0307879b addiw a5,a5,48 + 46f2: f6f401a3 sb a5,-157(s0) + name[4] = '0' + (nfiles % 10); + 46f6: 0364e7bb remw a5,s1,s6 + 46fa: 0307879b addiw a5,a5,48 + 46fe: f6f40223 sb a5,-156(s0) + name[5] = '\0'; + 4702: f60402a3 sb zero,-155(s0) + printf("writing %s\n", name); + 4706: f6040593 addi a1,s0,-160 + 470a: 8566 mv a0,s9 + 470c: 2a9000ef jal 51b4 + int fd = open(name, O_CREATE|O_RDWR); + 4710: 20200593 li a1,514 + 4714: f6040513 addi a0,s0,-160 + 4718: 69c000ef jal 4db4 + 471c: 892a mv s2,a0 + if(fd < 0){ + 471e: 08055f63 bgez a0,47bc + printf("open %s failed\n", name); + 4722: f6040593 addi a1,s0,-160 + 4726: 00003517 auipc a0,0x3 + 472a: cd250513 addi a0,a0,-814 # 73f8 + 472e: 287000ef jal 51b4 + while(nfiles >= 0){ + 4732: 0604c163 bltz s1,4794 + name[0] = 'f'; + 4736: 06600b13 li s6,102 + name[1] = '0' + nfiles / 1000; + 473a: 3e800a13 li s4,1000 + name[2] = '0' + (nfiles % 1000) / 100; + 473e: 06400993 li s3,100 + name[3] = '0' + (nfiles % 100) / 10; + 4742: 4929 li s2,10 + while(nfiles >= 0){ + 4744: 5afd li s5,-1 + name[0] = 'f'; + 4746: f7640023 sb s6,-160(s0) + name[1] = '0' + nfiles / 1000; + 474a: 0344c7bb divw a5,s1,s4 + 474e: 0307879b addiw a5,a5,48 + 4752: f6f400a3 sb a5,-159(s0) + name[2] = '0' + (nfiles % 1000) / 100; + 4756: 0344e7bb remw a5,s1,s4 + 475a: 0337c7bb divw a5,a5,s3 + 475e: 0307879b addiw a5,a5,48 + 4762: f6f40123 sb a5,-158(s0) + name[3] = '0' + (nfiles % 100) / 10; + 4766: 0334e7bb remw a5,s1,s3 + 476a: 0327c7bb divw a5,a5,s2 + 476e: 0307879b addiw a5,a5,48 + 4772: f6f401a3 sb a5,-157(s0) + name[4] = '0' + (nfiles % 10); + 4776: 0324e7bb remw a5,s1,s2 + 477a: 0307879b addiw a5,a5,48 + 477e: f6f40223 sb a5,-156(s0) + name[5] = '\0'; + 4782: f60402a3 sb zero,-155(s0) + unlink(name); + 4786: f6040513 addi a0,s0,-160 + 478a: 63a000ef jal 4dc4 + nfiles--; + 478e: 34fd addiw s1,s1,-1 + while(nfiles >= 0){ + 4790: fb549be3 bne s1,s5,4746 + printf("fsfull test finished\n"); + 4794: 00003517 auipc a0,0x3 + 4798: c8450513 addi a0,a0,-892 # 7418 + 479c: 219000ef jal 51b4 +} + 47a0: 60ea ld ra,152(sp) + 47a2: 644a ld s0,144(sp) + 47a4: 64aa ld s1,136(sp) + 47a6: 690a ld s2,128(sp) + 47a8: 79e6 ld s3,120(sp) + 47aa: 7a46 ld s4,112(sp) + 47ac: 7aa6 ld s5,104(sp) + 47ae: 7b06 ld s6,96(sp) + 47b0: 6be6 ld s7,88(sp) + 47b2: 6c46 ld s8,80(sp) + 47b4: 6ca6 ld s9,72(sp) + 47b6: 6d06 ld s10,64(sp) + 47b8: 610d addi sp,sp,160 + 47ba: 8082 ret + int total = 0; + 47bc: 4981 li s3,0 + int cc = write(fd, buf, BSIZE); + 47be: 00008a97 auipc s5,0x8 + 47c2: 4faa8a93 addi s5,s5,1274 # ccb8 + if(cc < BSIZE) + 47c6: 3ff00a13 li s4,1023 + int cc = write(fd, buf, BSIZE); + 47ca: 40000613 li a2,1024 + 47ce: 85d6 mv a1,s5 + 47d0: 854a mv a0,s2 + 47d2: 5c2000ef jal 4d94 + if(cc < BSIZE) + 47d6: 00aa5563 bge s4,a0,47e0 + total += cc; + 47da: 00a989bb addw s3,s3,a0 + while(1){ + 47de: b7f5 j 47ca + printf("wrote %d bytes\n", total); + 47e0: 85ce mv a1,s3 + 47e2: 00003517 auipc a0,0x3 + 47e6: c2650513 addi a0,a0,-986 # 7408 + 47ea: 1cb000ef jal 51b4 + close(fd); + 47ee: 854a mv a0,s2 + 47f0: 5ac000ef jal 4d9c + if(total == 0) + 47f4: f2098fe3 beqz s3,4732 + for(nfiles = 0; ; nfiles++){ + 47f8: 2485 addiw s1,s1,1 + 47fa: b5f1 j 46c6 + +00000000000047fc : +// + +// run each test in its own process. run returns 1 if child's exit() +// indicates success. +int +run(void f(char *), char *s) { + 47fc: 7179 addi sp,sp,-48 + 47fe: f406 sd ra,40(sp) + 4800: f022 sd s0,32(sp) + 4802: ec26 sd s1,24(sp) + 4804: e84a sd s2,16(sp) + 4806: 1800 addi s0,sp,48 + 4808: 84aa mv s1,a0 + 480a: 892e mv s2,a1 + int pid; + int xstatus; + + printf("test %s: ", s); + 480c: 00003517 auipc a0,0x3 + 4810: c2450513 addi a0,a0,-988 # 7430 + 4814: 1a1000ef jal 51b4 + if((pid = fork()) < 0) { + 4818: 554000ef jal 4d6c + 481c: 02054a63 bltz a0,4850 + printf("runtest: fork error\n"); + exit(1); + } + if(pid == 0) { + 4820: c129 beqz a0,4862 + f(s); + exit(0); + } else { + wait(&xstatus); + 4822: fdc40513 addi a0,s0,-36 + 4826: 556000ef jal 4d7c + if(xstatus != 0) + 482a: fdc42783 lw a5,-36(s0) + 482e: cf9d beqz a5,486c + printf("FAILED\n"); + 4830: 00003517 auipc a0,0x3 + 4834: c2850513 addi a0,a0,-984 # 7458 + 4838: 17d000ef jal 51b4 + else + printf("OK\n"); + return xstatus == 0; + 483c: fdc42503 lw a0,-36(s0) + } +} + 4840: 00153513 seqz a0,a0 + 4844: 70a2 ld ra,40(sp) + 4846: 7402 ld s0,32(sp) + 4848: 64e2 ld s1,24(sp) + 484a: 6942 ld s2,16(sp) + 484c: 6145 addi sp,sp,48 + 484e: 8082 ret + printf("runtest: fork error\n"); + 4850: 00003517 auipc a0,0x3 + 4854: bf050513 addi a0,a0,-1040 # 7440 + 4858: 15d000ef jal 51b4 + exit(1); + 485c: 4505 li a0,1 + 485e: 516000ef jal 4d74 + f(s); + 4862: 854a mv a0,s2 + 4864: 9482 jalr s1 + exit(0); + 4866: 4501 li a0,0 + 4868: 50c000ef jal 4d74 + printf("OK\n"); + 486c: 00003517 auipc a0,0x3 + 4870: bf450513 addi a0,a0,-1036 # 7460 + 4874: 141000ef jal 51b4 + 4878: b7d1 j 483c + +000000000000487a : + +int +runtests(struct test *tests, char *justone, int continuous) { + 487a: 7139 addi sp,sp,-64 + 487c: fc06 sd ra,56(sp) + 487e: f822 sd s0,48(sp) + 4880: f426 sd s1,40(sp) + 4882: ec4e sd s3,24(sp) + 4884: 0080 addi s0,sp,64 + 4886: 84aa mv s1,a0 + int ntests = 0; + for (struct test *t = tests; t->s != 0; t++) { + 4888: 6508 ld a0,8(a0) + 488a: cd39 beqz a0,48e8 + 488c: f04a sd s2,32(sp) + 488e: e852 sd s4,16(sp) + 4890: e456 sd s5,8(sp) + 4892: 892e mv s2,a1 + 4894: 8a32 mv s4,a2 + int ntests = 0; + 4896: 4981 li s3,0 + if((justone == 0) || strcmp(t->s, justone) == 0) { + ntests++; + if(!run(t->f, t->s)){ + if(continuous != 2){ + 4898: 4a89 li s5,2 + 489a: a021 j 48a2 + for (struct test *t = tests; t->s != 0; t++) { + 489c: 04c1 addi s1,s1,16 + 489e: 6488 ld a0,8(s1) + 48a0: c915 beqz a0,48d4 + if((justone == 0) || strcmp(t->s, justone) == 0) { + 48a2: 00090663 beqz s2,48ae + 48a6: 85ca mv a1,s2 + 48a8: 264000ef jal 4b0c + 48ac: f965 bnez a0,489c + ntests++; + 48ae: 2985 addiw s3,s3,1 # 1000001 + if(!run(t->f, t->s)){ + 48b0: 648c ld a1,8(s1) + 48b2: 6088 ld a0,0(s1) + 48b4: f49ff0ef jal 47fc + 48b8: f175 bnez a0,489c + if(continuous != 2){ + 48ba: ff5a01e3 beq s4,s5,489c + printf("SOME TESTS FAILED\n"); + 48be: 00003517 auipc a0,0x3 + 48c2: baa50513 addi a0,a0,-1110 # 7468 + 48c6: 0ef000ef jal 51b4 + return -1; + 48ca: 59fd li s3,-1 + 48cc: 7902 ld s2,32(sp) + 48ce: 6a42 ld s4,16(sp) + 48d0: 6aa2 ld s5,8(sp) + 48d2: a021 j 48da + 48d4: 7902 ld s2,32(sp) + 48d6: 6a42 ld s4,16(sp) + 48d8: 6aa2 ld s5,8(sp) + } + } + } + } + return ntests; +} + 48da: 854e mv a0,s3 + 48dc: 70e2 ld ra,56(sp) + 48de: 7442 ld s0,48(sp) + 48e0: 74a2 ld s1,40(sp) + 48e2: 69e2 ld s3,24(sp) + 48e4: 6121 addi sp,sp,64 + 48e6: 8082 ret + return ntests; + 48e8: 4981 li s3,0 + 48ea: bfc5 j 48da + +00000000000048ec : + + +// use sbrk() to count how many free physical memory pages there are. +int +countfree() +{ + 48ec: 7179 addi sp,sp,-48 + 48ee: f406 sd ra,40(sp) + 48f0: f022 sd s0,32(sp) + 48f2: ec26 sd s1,24(sp) + 48f4: e84a sd s2,16(sp) + 48f6: e44e sd s3,8(sp) + 48f8: 1800 addi s0,sp,48 + int n = 0; + uint64 sz0 = (uint64)sbrk(0); + 48fa: 4501 li a0,0 + 48fc: 444000ef jal 4d40 + 4900: 89aa mv s3,a0 + int n = 0; + 4902: 4481 li s1,0 + while(1){ + char *a = sbrk(PGSIZE); + if(a == SBRK_ERROR){ + 4904: 597d li s2,-1 + 4906: a011 j 490a + break; + } + n += 1; + 4908: 2485 addiw s1,s1,1 + char *a = sbrk(PGSIZE); + 490a: 6505 lui a0,0x1 + 490c: 434000ef jal 4d40 + if(a == SBRK_ERROR){ + 4910: ff251ce3 bne a0,s2,4908 + } + sbrk(-((uint64)sbrk(0) - sz0)); + 4914: 4501 li a0,0 + 4916: 42a000ef jal 4d40 + 491a: 40a9853b subw a0,s3,a0 + 491e: 422000ef jal 4d40 + return n; +} + 4922: 8526 mv a0,s1 + 4924: 70a2 ld ra,40(sp) + 4926: 7402 ld s0,32(sp) + 4928: 64e2 ld s1,24(sp) + 492a: 6942 ld s2,16(sp) + 492c: 69a2 ld s3,8(sp) + 492e: 6145 addi sp,sp,48 + 4930: 8082 ret + +0000000000004932 : + +int +drivetests(int quick, int continuous, char *justone) { + 4932: 7159 addi sp,sp,-112 + 4934: f486 sd ra,104(sp) + 4936: f0a2 sd s0,96(sp) + 4938: eca6 sd s1,88(sp) + 493a: e8ca sd s2,80(sp) + 493c: e4ce sd s3,72(sp) + 493e: e0d2 sd s4,64(sp) + 4940: fc56 sd s5,56(sp) + 4942: f85a sd s6,48(sp) + 4944: f45e sd s7,40(sp) + 4946: f062 sd s8,32(sp) + 4948: ec66 sd s9,24(sp) + 494a: e86a sd s10,16(sp) + 494c: e46e sd s11,8(sp) + 494e: 1880 addi s0,sp,112 + 4950: 8aaa mv s5,a0 + 4952: 89ae mv s3,a1 + 4954: 8a32 mv s4,a2 + do { + printf("usertests starting\n"); + 4956: 00003c17 auipc s8,0x3 + 495a: b2ac0c13 addi s8,s8,-1238 # 7480 + int free0 = countfree(); + int free1 = 0; + int ntests = 0; + int n; + n = runtests(quicktests, justone, continuous); + 495e: 00004b97 auipc s7,0x4 + 4962: 6b2b8b93 addi s7,s7,1714 # 9010 + if (n < 0) { + if(continuous != 2) { + 4966: 4b09 li s6,2 + ntests += n; + } + if(!quick) { + if (justone == 0) + printf("usertests slow tests starting\n"); + n = runtests(slowtests, justone, continuous); + 4968: 00005c97 auipc s9,0x5 + 496c: ab8c8c93 addi s9,s9,-1352 # 9420 + printf("usertests slow tests starting\n"); + 4970: 00003d97 auipc s11,0x3 + 4974: b28d8d93 addi s11,s11,-1240 # 7498 + } else { + ntests += n; + } + } + if((free1 = countfree()) < free0) { + printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); + 4978: 00003d17 auipc s10,0x3 + 497c: b40d0d13 addi s10,s10,-1216 # 74b8 + 4980: a025 j 49a8 + if(continuous != 2) { + 4982: 09699063 bne s3,s6,4a02 + int ntests = 0; + 4986: 4481 li s1,0 + 4988: a835 j 49c4 + printf("usertests slow tests starting\n"); + 498a: 856e mv a0,s11 + 498c: 029000ef jal 51b4 + 4990: a835 j 49cc + if(continuous != 2) { + 4992: 07699a63 bne s3,s6,4a06 + if((free1 = countfree()) < free0) { + 4996: f57ff0ef jal 48ec + 499a: 05254263 blt a0,s2,49de + if(continuous != 2) { + return 1; + } + } + if (justone != 0 && ntests == 0) { + 499e: 000a0363 beqz s4,49a4 + 49a2: c8a1 beqz s1,49f2 + printf("NO TESTS EXECUTED\n"); + return 1; + } + } while(continuous); + 49a4: 06098563 beqz s3,4a0e + printf("usertests starting\n"); + 49a8: 8562 mv a0,s8 + 49aa: 00b000ef jal 51b4 + int free0 = countfree(); + 49ae: f3fff0ef jal 48ec + 49b2: 892a mv s2,a0 + n = runtests(quicktests, justone, continuous); + 49b4: 864e mv a2,s3 + 49b6: 85d2 mv a1,s4 + 49b8: 855e mv a0,s7 + 49ba: ec1ff0ef jal 487a + 49be: 84aa mv s1,a0 + if (n < 0) { + 49c0: fc0541e3 bltz a0,4982 + if(!quick) { + 49c4: fc0a99e3 bnez s5,4996 + if (justone == 0) + 49c8: fc0a01e3 beqz s4,498a + n = runtests(slowtests, justone, continuous); + 49cc: 864e mv a2,s3 + 49ce: 85d2 mv a1,s4 + 49d0: 8566 mv a0,s9 + 49d2: ea9ff0ef jal 487a + if (n < 0) { + 49d6: fa054ee3 bltz a0,4992 + ntests += n; + 49da: 9ca9 addw s1,s1,a0 + 49dc: bf6d j 4996 + printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); + 49de: 864a mv a2,s2 + 49e0: 85aa mv a1,a0 + 49e2: 856a mv a0,s10 + 49e4: 7d0000ef jal 51b4 + if(continuous != 2) { + 49e8: 03699163 bne s3,s6,4a0a + if (justone != 0 && ntests == 0) { + 49ec: fa0a1be3 bnez s4,49a2 + 49f0: bf65 j 49a8 + printf("NO TESTS EXECUTED\n"); + 49f2: 00003517 auipc a0,0x3 + 49f6: af650513 addi a0,a0,-1290 # 74e8 + 49fa: 7ba000ef jal 51b4 + return 1; + 49fe: 4505 li a0,1 + 4a00: a801 j 4a10 + return 1; + 4a02: 4505 li a0,1 + 4a04: a031 j 4a10 + return 1; + 4a06: 4505 li a0,1 + 4a08: a021 j 4a10 + return 1; + 4a0a: 4505 li a0,1 + 4a0c: a011 j 4a10 + return 0; + 4a0e: 854e mv a0,s3 +} + 4a10: 70a6 ld ra,104(sp) + 4a12: 7406 ld s0,96(sp) + 4a14: 64e6 ld s1,88(sp) + 4a16: 6946 ld s2,80(sp) + 4a18: 69a6 ld s3,72(sp) + 4a1a: 6a06 ld s4,64(sp) + 4a1c: 7ae2 ld s5,56(sp) + 4a1e: 7b42 ld s6,48(sp) + 4a20: 7ba2 ld s7,40(sp) + 4a22: 7c02 ld s8,32(sp) + 4a24: 6ce2 ld s9,24(sp) + 4a26: 6d42 ld s10,16(sp) + 4a28: 6da2 ld s11,8(sp) + 4a2a: 6165 addi sp,sp,112 + 4a2c: 8082 ret + +0000000000004a2e
: + +int +main(int argc, char *argv[]) +{ + 4a2e: 1101 addi sp,sp,-32 + 4a30: ec06 sd ra,24(sp) + 4a32: e822 sd s0,16(sp) + 4a34: e426 sd s1,8(sp) + 4a36: e04a sd s2,0(sp) + 4a38: 1000 addi s0,sp,32 + 4a3a: 84aa mv s1,a0 + int continuous = 0; + int quick = 0; + char *justone = 0; + + if(argc == 2 && strcmp(argv[1], "-q") == 0){ + 4a3c: 4789 li a5,2 + 4a3e: 00f50e63 beq a0,a5,4a5a + 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){ + 4a42: 4785 li a5,1 + 4a44: 06a7c663 blt a5,a0,4ab0 + char *justone = 0; + 4a48: 4601 li a2,0 + int quick = 0; + 4a4a: 4501 li a0,0 + int continuous = 0; + 4a4c: 4581 li a1,0 + printf("Usage: usertests [-c] [-C] [-q] [testname]\n"); + exit(1); + } + if (drivetests(quick, continuous, justone)) { + 4a4e: ee5ff0ef jal 4932 + 4a52: cd35 beqz a0,4ace + exit(1); + 4a54: 4505 li a0,1 + 4a56: 31e000ef jal 4d74 + 4a5a: 892e mv s2,a1 + if(argc == 2 && strcmp(argv[1], "-q") == 0){ + 4a5c: 00003597 auipc a1,0x3 + 4a60: aa458593 addi a1,a1,-1372 # 7500 + 4a64: 00893503 ld a0,8(s2) # ffffffffffffd008 + 4a68: 0a4000ef jal 4b0c + 4a6c: 85aa mv a1,a0 + 4a6e: e501 bnez a0,4a76 + char *justone = 0; + 4a70: 4601 li a2,0 + quick = 1; + 4a72: 4505 li a0,1 + 4a74: bfe9 j 4a4e + } else if(argc == 2 && strcmp(argv[1], "-c") == 0){ + 4a76: 00003597 auipc a1,0x3 + 4a7a: a9258593 addi a1,a1,-1390 # 7508 + 4a7e: 00893503 ld a0,8(s2) + 4a82: 08a000ef jal 4b0c + 4a86: cd15 beqz a0,4ac2 + } else if(argc == 2 && strcmp(argv[1], "-C") == 0){ + 4a88: 00003597 auipc a1,0x3 + 4a8c: ad058593 addi a1,a1,-1328 # 7558 + 4a90: 00893503 ld a0,8(s2) + 4a94: 078000ef jal 4b0c + 4a98: c905 beqz a0,4ac8 + } else if(argc == 2 && argv[1][0] != '-'){ + 4a9a: 00893603 ld a2,8(s2) + 4a9e: 00064703 lbu a4,0(a2) # 1000 + 4aa2: 02d00793 li a5,45 + 4aa6: 00f70563 beq a4,a5,4ab0 + int quick = 0; + 4aaa: 4501 li a0,0 + int continuous = 0; + 4aac: 4581 li a1,0 + 4aae: b745 j 4a4e + printf("Usage: usertests [-c] [-C] [-q] [testname]\n"); + 4ab0: 00003517 auipc a0,0x3 + 4ab4: a6050513 addi a0,a0,-1440 # 7510 + 4ab8: 6fc000ef jal 51b4 + exit(1); + 4abc: 4505 li a0,1 + 4abe: 2b6000ef jal 4d74 + char *justone = 0; + 4ac2: 4601 li a2,0 + continuous = 1; + 4ac4: 4585 li a1,1 + 4ac6: b761 j 4a4e + continuous = 2; + 4ac8: 85a6 mv a1,s1 + char *justone = 0; + 4aca: 4601 li a2,0 + 4acc: b749 j 4a4e + } + printf("ALL TESTS PASSED\n"); + 4ace: 00003517 auipc a0,0x3 + 4ad2: a7250513 addi a0,a0,-1422 # 7540 + 4ad6: 6de000ef jal 51b4 + exit(0); + 4ada: 4501 li a0,0 + 4adc: 298000ef jal 4d74 + +0000000000004ae0 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 4ae0: 1141 addi sp,sp,-16 + 4ae2: e406 sd ra,8(sp) + 4ae4: e022 sd s0,0(sp) + 4ae6: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 4ae8: f47ff0ef jal 4a2e
+ exit(r); + 4aec: 288000ef jal 4d74 + +0000000000004af0 : +} + +char* +strcpy(char *s, const char *t) +{ + 4af0: 1141 addi sp,sp,-16 + 4af2: e422 sd s0,8(sp) + 4af4: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 4af6: 87aa mv a5,a0 + 4af8: 0585 addi a1,a1,1 + 4afa: 0785 addi a5,a5,1 + 4afc: fff5c703 lbu a4,-1(a1) + 4b00: fee78fa3 sb a4,-1(a5) + 4b04: fb75 bnez a4,4af8 + ; + return os; +} + 4b06: 6422 ld s0,8(sp) + 4b08: 0141 addi sp,sp,16 + 4b0a: 8082 ret + +0000000000004b0c : + +int +strcmp(const char *p, const char *q) +{ + 4b0c: 1141 addi sp,sp,-16 + 4b0e: e422 sd s0,8(sp) + 4b10: 0800 addi s0,sp,16 + while(*p && *p == *q) + 4b12: 00054783 lbu a5,0(a0) + 4b16: cb91 beqz a5,4b2a + 4b18: 0005c703 lbu a4,0(a1) + 4b1c: 00f71763 bne a4,a5,4b2a + p++, q++; + 4b20: 0505 addi a0,a0,1 + 4b22: 0585 addi a1,a1,1 + while(*p && *p == *q) + 4b24: 00054783 lbu a5,0(a0) + 4b28: fbe5 bnez a5,4b18 + return (uchar)*p - (uchar)*q; + 4b2a: 0005c503 lbu a0,0(a1) +} + 4b2e: 40a7853b subw a0,a5,a0 + 4b32: 6422 ld s0,8(sp) + 4b34: 0141 addi sp,sp,16 + 4b36: 8082 ret + +0000000000004b38 : + +uint +strlen(const char *s) +{ + 4b38: 1141 addi sp,sp,-16 + 4b3a: e422 sd s0,8(sp) + 4b3c: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 4b3e: 00054783 lbu a5,0(a0) + 4b42: cf91 beqz a5,4b5e + 4b44: 0505 addi a0,a0,1 + 4b46: 87aa mv a5,a0 + 4b48: 86be mv a3,a5 + 4b4a: 0785 addi a5,a5,1 + 4b4c: fff7c703 lbu a4,-1(a5) + 4b50: ff65 bnez a4,4b48 + 4b52: 40a6853b subw a0,a3,a0 + 4b56: 2505 addiw a0,a0,1 + ; + return n; +} + 4b58: 6422 ld s0,8(sp) + 4b5a: 0141 addi sp,sp,16 + 4b5c: 8082 ret + for(n = 0; s[n]; n++) + 4b5e: 4501 li a0,0 + 4b60: bfe5 j 4b58 + +0000000000004b62 : + +void* +memset(void *dst, int c, uint n) +{ + 4b62: 1141 addi sp,sp,-16 + 4b64: e422 sd s0,8(sp) + 4b66: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 4b68: ca19 beqz a2,4b7e + 4b6a: 87aa mv a5,a0 + 4b6c: 1602 slli a2,a2,0x20 + 4b6e: 9201 srli a2,a2,0x20 + 4b70: 00a60733 add a4,a2,a0 + cdst[i] = c; + 4b74: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 4b78: 0785 addi a5,a5,1 + 4b7a: fee79de3 bne a5,a4,4b74 + } + return dst; +} + 4b7e: 6422 ld s0,8(sp) + 4b80: 0141 addi sp,sp,16 + 4b82: 8082 ret + +0000000000004b84 : + +char* +strchr(const char *s, char c) +{ + 4b84: 1141 addi sp,sp,-16 + 4b86: e422 sd s0,8(sp) + 4b88: 0800 addi s0,sp,16 + for(; *s; s++) + 4b8a: 00054783 lbu a5,0(a0) + 4b8e: cb99 beqz a5,4ba4 + if(*s == c) + 4b90: 00f58763 beq a1,a5,4b9e + for(; *s; s++) + 4b94: 0505 addi a0,a0,1 + 4b96: 00054783 lbu a5,0(a0) + 4b9a: fbfd bnez a5,4b90 + return (char*)s; + return 0; + 4b9c: 4501 li a0,0 +} + 4b9e: 6422 ld s0,8(sp) + 4ba0: 0141 addi sp,sp,16 + 4ba2: 8082 ret + return 0; + 4ba4: 4501 li a0,0 + 4ba6: bfe5 j 4b9e + +0000000000004ba8 : + +char* +gets(char *buf, int max) +{ + 4ba8: 711d addi sp,sp,-96 + 4baa: ec86 sd ra,88(sp) + 4bac: e8a2 sd s0,80(sp) + 4bae: e4a6 sd s1,72(sp) + 4bb0: e0ca sd s2,64(sp) + 4bb2: fc4e sd s3,56(sp) + 4bb4: f852 sd s4,48(sp) + 4bb6: f456 sd s5,40(sp) + 4bb8: f05a sd s6,32(sp) + 4bba: ec5e sd s7,24(sp) + 4bbc: 1080 addi s0,sp,96 + 4bbe: 8baa mv s7,a0 + 4bc0: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 4bc2: 892a mv s2,a0 + 4bc4: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 4bc6: 4aa9 li s5,10 + 4bc8: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 4bca: 89a6 mv s3,s1 + 4bcc: 2485 addiw s1,s1,1 + 4bce: 0344d663 bge s1,s4,4bfa + cc = read(0, &c, 1); + 4bd2: 4605 li a2,1 + 4bd4: faf40593 addi a1,s0,-81 + 4bd8: 4501 li a0,0 + 4bda: 1b2000ef jal 4d8c + if(cc < 1) + 4bde: 00a05e63 blez a0,4bfa + buf[i++] = c; + 4be2: faf44783 lbu a5,-81(s0) + 4be6: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 4bea: 01578763 beq a5,s5,4bf8 + 4bee: 0905 addi s2,s2,1 + 4bf0: fd679de3 bne a5,s6,4bca + buf[i++] = c; + 4bf4: 89a6 mv s3,s1 + 4bf6: a011 j 4bfa + 4bf8: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 4bfa: 99de add s3,s3,s7 + 4bfc: 00098023 sb zero,0(s3) + return buf; +} + 4c00: 855e mv a0,s7 + 4c02: 60e6 ld ra,88(sp) + 4c04: 6446 ld s0,80(sp) + 4c06: 64a6 ld s1,72(sp) + 4c08: 6906 ld s2,64(sp) + 4c0a: 79e2 ld s3,56(sp) + 4c0c: 7a42 ld s4,48(sp) + 4c0e: 7aa2 ld s5,40(sp) + 4c10: 7b02 ld s6,32(sp) + 4c12: 6be2 ld s7,24(sp) + 4c14: 6125 addi sp,sp,96 + 4c16: 8082 ret + +0000000000004c18 : + +int +stat(const char *n, struct stat *st) +{ + 4c18: 1101 addi sp,sp,-32 + 4c1a: ec06 sd ra,24(sp) + 4c1c: e822 sd s0,16(sp) + 4c1e: e04a sd s2,0(sp) + 4c20: 1000 addi s0,sp,32 + 4c22: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 4c24: 4581 li a1,0 + 4c26: 18e000ef jal 4db4 + if(fd < 0) + 4c2a: 02054263 bltz a0,4c4e + 4c2e: e426 sd s1,8(sp) + 4c30: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 4c32: 85ca mv a1,s2 + 4c34: 198000ef jal 4dcc + 4c38: 892a mv s2,a0 + close(fd); + 4c3a: 8526 mv a0,s1 + 4c3c: 160000ef jal 4d9c + return r; + 4c40: 64a2 ld s1,8(sp) +} + 4c42: 854a mv a0,s2 + 4c44: 60e2 ld ra,24(sp) + 4c46: 6442 ld s0,16(sp) + 4c48: 6902 ld s2,0(sp) + 4c4a: 6105 addi sp,sp,32 + 4c4c: 8082 ret + return -1; + 4c4e: 597d li s2,-1 + 4c50: bfcd j 4c42 + +0000000000004c52 : + +int +atoi(const char *s) +{ + 4c52: 1141 addi sp,sp,-16 + 4c54: e422 sd s0,8(sp) + 4c56: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 4c58: 00054683 lbu a3,0(a0) + 4c5c: fd06879b addiw a5,a3,-48 # 3ffd0 + 4c60: 0ff7f793 zext.b a5,a5 + 4c64: 4625 li a2,9 + 4c66: 02f66863 bltu a2,a5,4c96 + 4c6a: 872a mv a4,a0 + n = 0; + 4c6c: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 4c6e: 0705 addi a4,a4,1 # 1000001 + 4c70: 0025179b slliw a5,a0,0x2 + 4c74: 9fa9 addw a5,a5,a0 + 4c76: 0017979b slliw a5,a5,0x1 + 4c7a: 9fb5 addw a5,a5,a3 + 4c7c: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 4c80: 00074683 lbu a3,0(a4) + 4c84: fd06879b addiw a5,a3,-48 + 4c88: 0ff7f793 zext.b a5,a5 + 4c8c: fef671e3 bgeu a2,a5,4c6e + return n; +} + 4c90: 6422 ld s0,8(sp) + 4c92: 0141 addi sp,sp,16 + 4c94: 8082 ret + n = 0; + 4c96: 4501 li a0,0 + 4c98: bfe5 j 4c90 + +0000000000004c9a : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 4c9a: 1141 addi sp,sp,-16 + 4c9c: e422 sd s0,8(sp) + 4c9e: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 4ca0: 02b57463 bgeu a0,a1,4cc8 + while(n-- > 0) + 4ca4: 00c05f63 blez a2,4cc2 + 4ca8: 1602 slli a2,a2,0x20 + 4caa: 9201 srli a2,a2,0x20 + 4cac: 00c507b3 add a5,a0,a2 + dst = vdst; + 4cb0: 872a mv a4,a0 + *dst++ = *src++; + 4cb2: 0585 addi a1,a1,1 + 4cb4: 0705 addi a4,a4,1 + 4cb6: fff5c683 lbu a3,-1(a1) + 4cba: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 4cbe: fef71ae3 bne a4,a5,4cb2 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 4cc2: 6422 ld s0,8(sp) + 4cc4: 0141 addi sp,sp,16 + 4cc6: 8082 ret + dst += n; + 4cc8: 00c50733 add a4,a0,a2 + src += n; + 4ccc: 95b2 add a1,a1,a2 + while(n-- > 0) + 4cce: fec05ae3 blez a2,4cc2 + 4cd2: fff6079b addiw a5,a2,-1 + 4cd6: 1782 slli a5,a5,0x20 + 4cd8: 9381 srli a5,a5,0x20 + 4cda: fff7c793 not a5,a5 + 4cde: 97ba add a5,a5,a4 + *--dst = *--src; + 4ce0: 15fd addi a1,a1,-1 + 4ce2: 177d addi a4,a4,-1 + 4ce4: 0005c683 lbu a3,0(a1) + 4ce8: 00d70023 sb a3,0(a4) + while(n-- > 0) + 4cec: fee79ae3 bne a5,a4,4ce0 + 4cf0: bfc9 j 4cc2 + +0000000000004cf2 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 4cf2: 1141 addi sp,sp,-16 + 4cf4: e422 sd s0,8(sp) + 4cf6: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 4cf8: ca05 beqz a2,4d28 + 4cfa: fff6069b addiw a3,a2,-1 + 4cfe: 1682 slli a3,a3,0x20 + 4d00: 9281 srli a3,a3,0x20 + 4d02: 0685 addi a3,a3,1 + 4d04: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 4d06: 00054783 lbu a5,0(a0) + 4d0a: 0005c703 lbu a4,0(a1) + 4d0e: 00e79863 bne a5,a4,4d1e + return *p1 - *p2; + } + p1++; + 4d12: 0505 addi a0,a0,1 + p2++; + 4d14: 0585 addi a1,a1,1 + while (n-- > 0) { + 4d16: fed518e3 bne a0,a3,4d06 + } + return 0; + 4d1a: 4501 li a0,0 + 4d1c: a019 j 4d22 + return *p1 - *p2; + 4d1e: 40e7853b subw a0,a5,a4 +} + 4d22: 6422 ld s0,8(sp) + 4d24: 0141 addi sp,sp,16 + 4d26: 8082 ret + return 0; + 4d28: 4501 li a0,0 + 4d2a: bfe5 j 4d22 + +0000000000004d2c : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 4d2c: 1141 addi sp,sp,-16 + 4d2e: e406 sd ra,8(sp) + 4d30: e022 sd s0,0(sp) + 4d32: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 4d34: f67ff0ef jal 4c9a +} + 4d38: 60a2 ld ra,8(sp) + 4d3a: 6402 ld s0,0(sp) + 4d3c: 0141 addi sp,sp,16 + 4d3e: 8082 ret + +0000000000004d40 : + +char * +sbrk(int n) { + 4d40: 1141 addi sp,sp,-16 + 4d42: e406 sd ra,8(sp) + 4d44: e022 sd s0,0(sp) + 4d46: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 4d48: 4585 li a1,1 + 4d4a: 0b2000ef jal 4dfc +} + 4d4e: 60a2 ld ra,8(sp) + 4d50: 6402 ld s0,0(sp) + 4d52: 0141 addi sp,sp,16 + 4d54: 8082 ret + +0000000000004d56 : + +char * +sbrklazy(int n) { + 4d56: 1141 addi sp,sp,-16 + 4d58: e406 sd ra,8(sp) + 4d5a: e022 sd s0,0(sp) + 4d5c: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 4d5e: 4589 li a1,2 + 4d60: 09c000ef jal 4dfc +} + 4d64: 60a2 ld ra,8(sp) + 4d66: 6402 ld s0,0(sp) + 4d68: 0141 addi sp,sp,16 + 4d6a: 8082 ret + +0000000000004d6c : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 4d6c: 4885 li a7,1 + ecall + 4d6e: 00000073 ecall + ret + 4d72: 8082 ret + +0000000000004d74 : +.global exit +exit: + li a7, SYS_exit + 4d74: 4889 li a7,2 + ecall + 4d76: 00000073 ecall + ret + 4d7a: 8082 ret + +0000000000004d7c : +.global wait +wait: + li a7, SYS_wait + 4d7c: 488d li a7,3 + ecall + 4d7e: 00000073 ecall + ret + 4d82: 8082 ret + +0000000000004d84 : +.global pipe +pipe: + li a7, SYS_pipe + 4d84: 4891 li a7,4 + ecall + 4d86: 00000073 ecall + ret + 4d8a: 8082 ret + +0000000000004d8c : +.global read +read: + li a7, SYS_read + 4d8c: 4895 li a7,5 + ecall + 4d8e: 00000073 ecall + ret + 4d92: 8082 ret + +0000000000004d94 : +.global write +write: + li a7, SYS_write + 4d94: 48c1 li a7,16 + ecall + 4d96: 00000073 ecall + ret + 4d9a: 8082 ret + +0000000000004d9c : +.global close +close: + li a7, SYS_close + 4d9c: 48d5 li a7,21 + ecall + 4d9e: 00000073 ecall + ret + 4da2: 8082 ret + +0000000000004da4 : +.global kill +kill: + li a7, SYS_kill + 4da4: 4899 li a7,6 + ecall + 4da6: 00000073 ecall + ret + 4daa: 8082 ret + +0000000000004dac : +.global exec +exec: + li a7, SYS_exec + 4dac: 489d li a7,7 + ecall + 4dae: 00000073 ecall + ret + 4db2: 8082 ret + +0000000000004db4 : +.global open +open: + li a7, SYS_open + 4db4: 48bd li a7,15 + ecall + 4db6: 00000073 ecall + ret + 4dba: 8082 ret + +0000000000004dbc : +.global mknod +mknod: + li a7, SYS_mknod + 4dbc: 48c5 li a7,17 + ecall + 4dbe: 00000073 ecall + ret + 4dc2: 8082 ret + +0000000000004dc4 : +.global unlink +unlink: + li a7, SYS_unlink + 4dc4: 48c9 li a7,18 + ecall + 4dc6: 00000073 ecall + ret + 4dca: 8082 ret + +0000000000004dcc : +.global fstat +fstat: + li a7, SYS_fstat + 4dcc: 48a1 li a7,8 + ecall + 4dce: 00000073 ecall + ret + 4dd2: 8082 ret + +0000000000004dd4 : +.global link +link: + li a7, SYS_link + 4dd4: 48cd li a7,19 + ecall + 4dd6: 00000073 ecall + ret + 4dda: 8082 ret + +0000000000004ddc : +.global mkdir +mkdir: + li a7, SYS_mkdir + 4ddc: 48d1 li a7,20 + ecall + 4dde: 00000073 ecall + ret + 4de2: 8082 ret + +0000000000004de4 : +.global chdir +chdir: + li a7, SYS_chdir + 4de4: 48a5 li a7,9 + ecall + 4de6: 00000073 ecall + ret + 4dea: 8082 ret + +0000000000004dec : +.global dup +dup: + li a7, SYS_dup + 4dec: 48a9 li a7,10 + ecall + 4dee: 00000073 ecall + ret + 4df2: 8082 ret + +0000000000004df4 : +.global getpid +getpid: + li a7, SYS_getpid + 4df4: 48ad li a7,11 + ecall + 4df6: 00000073 ecall + ret + 4dfa: 8082 ret + +0000000000004dfc : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 4dfc: 48b1 li a7,12 + ecall + 4dfe: 00000073 ecall + ret + 4e02: 8082 ret + +0000000000004e04 : +.global pause +pause: + li a7, SYS_pause + 4e04: 48b5 li a7,13 + ecall + 4e06: 00000073 ecall + ret + 4e0a: 8082 ret + +0000000000004e0c : +.global uptime +uptime: + li a7, SYS_uptime + 4e0c: 48b9 li a7,14 + ecall + 4e0e: 00000073 ecall + ret + 4e12: 8082 ret + +0000000000004e14 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 4e14: 48d9 li a7,22 + ecall + 4e16: 00000073 ecall + ret + 4e1a: 8082 ret + +0000000000004e1c : +.global getppid +getppid: + li a7, SYS_getppid + 4e1c: 48dd li a7,23 + ecall + 4e1e: 00000073 ecall + ret + 4e22: 8082 ret + +0000000000004e24 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 4e24: 48e1 li a7,24 + ecall + 4e26: 00000073 ecall + ret + 4e2a: 8082 ret + +0000000000004e2c : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 4e2c: 1101 addi sp,sp,-32 + 4e2e: ec06 sd ra,24(sp) + 4e30: e822 sd s0,16(sp) + 4e32: 1000 addi s0,sp,32 + 4e34: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 4e38: 4605 li a2,1 + 4e3a: fef40593 addi a1,s0,-17 + 4e3e: f57ff0ef jal 4d94 +} + 4e42: 60e2 ld ra,24(sp) + 4e44: 6442 ld s0,16(sp) + 4e46: 6105 addi sp,sp,32 + 4e48: 8082 ret + +0000000000004e4a : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 4e4a: 715d addi sp,sp,-80 + 4e4c: e486 sd ra,72(sp) + 4e4e: e0a2 sd s0,64(sp) + 4e50: f84a sd s2,48(sp) + 4e52: 0880 addi s0,sp,80 + 4e54: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 4e56: c299 beqz a3,4e5c + 4e58: 0805c363 bltz a1,4ede + neg = 0; + 4e5c: 4881 li a7,0 + 4e5e: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 4e62: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 4e64: 00003517 auipc a0,0x3 + 4e68: b2450513 addi a0,a0,-1244 # 7988 + 4e6c: 883e mv a6,a5 + 4e6e: 2785 addiw a5,a5,1 + 4e70: 02c5f733 remu a4,a1,a2 + 4e74: 972a add a4,a4,a0 + 4e76: 00074703 lbu a4,0(a4) + 4e7a: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 4e7e: 872e mv a4,a1 + 4e80: 02c5d5b3 divu a1,a1,a2 + 4e84: 0685 addi a3,a3,1 + 4e86: fec773e3 bgeu a4,a2,4e6c + if(neg) + 4e8a: 00088b63 beqz a7,4ea0 + buf[i++] = '-'; + 4e8e: fd078793 addi a5,a5,-48 + 4e92: 97a2 add a5,a5,s0 + 4e94: 02d00713 li a4,45 + 4e98: fee78423 sb a4,-24(a5) + 4e9c: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 4ea0: 02f05a63 blez a5,4ed4 + 4ea4: fc26 sd s1,56(sp) + 4ea6: f44e sd s3,40(sp) + 4ea8: fb840713 addi a4,s0,-72 + 4eac: 00f704b3 add s1,a4,a5 + 4eb0: fff70993 addi s3,a4,-1 + 4eb4: 99be add s3,s3,a5 + 4eb6: 37fd addiw a5,a5,-1 + 4eb8: 1782 slli a5,a5,0x20 + 4eba: 9381 srli a5,a5,0x20 + 4ebc: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 4ec0: fff4c583 lbu a1,-1(s1) + 4ec4: 854a mv a0,s2 + 4ec6: f67ff0ef jal 4e2c + while(--i >= 0) + 4eca: 14fd addi s1,s1,-1 + 4ecc: ff349ae3 bne s1,s3,4ec0 + 4ed0: 74e2 ld s1,56(sp) + 4ed2: 79a2 ld s3,40(sp) +} + 4ed4: 60a6 ld ra,72(sp) + 4ed6: 6406 ld s0,64(sp) + 4ed8: 7942 ld s2,48(sp) + 4eda: 6161 addi sp,sp,80 + 4edc: 8082 ret + x = -xx; + 4ede: 40b005b3 neg a1,a1 + neg = 1; + 4ee2: 4885 li a7,1 + x = -xx; + 4ee4: bfad j 4e5e + +0000000000004ee6 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4ee6: 711d addi sp,sp,-96 + 4ee8: ec86 sd ra,88(sp) + 4eea: e8a2 sd s0,80(sp) + 4eec: e0ca sd s2,64(sp) + 4eee: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4ef0: 0005c903 lbu s2,0(a1) + 4ef4: 28090663 beqz s2,5180 + 4ef8: e4a6 sd s1,72(sp) + 4efa: fc4e sd s3,56(sp) + 4efc: f852 sd s4,48(sp) + 4efe: f456 sd s5,40(sp) + 4f00: f05a sd s6,32(sp) + 4f02: ec5e sd s7,24(sp) + 4f04: e862 sd s8,16(sp) + 4f06: e466 sd s9,8(sp) + 4f08: 8b2a mv s6,a0 + 4f0a: 8a2e mv s4,a1 + 4f0c: 8bb2 mv s7,a2 + state = 0; + 4f0e: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4f10: 4481 li s1,0 + 4f12: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4f14: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4f18: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4f1c: 06c00c93 li s9,108 + 4f20: a005 j 4f40 + putc(fd, c0); + 4f22: 85ca mv a1,s2 + 4f24: 855a mv a0,s6 + 4f26: f07ff0ef jal 4e2c + 4f2a: a019 j 4f30 + } else if(state == '%'){ + 4f2c: 03598263 beq s3,s5,4f50 + for(i = 0; fmt[i]; i++){ + 4f30: 2485 addiw s1,s1,1 + 4f32: 8726 mv a4,s1 + 4f34: 009a07b3 add a5,s4,s1 + 4f38: 0007c903 lbu s2,0(a5) + 4f3c: 22090a63 beqz s2,5170 + c0 = fmt[i] & 0xff; + 4f40: 0009079b sext.w a5,s2 + if(state == 0){ + 4f44: fe0994e3 bnez s3,4f2c + if(c0 == '%'){ + 4f48: fd579de3 bne a5,s5,4f22 + state = '%'; + 4f4c: 89be mv s3,a5 + 4f4e: b7cd j 4f30 + if(c0) c1 = fmt[i+1] & 0xff; + 4f50: 00ea06b3 add a3,s4,a4 + 4f54: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4f58: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4f5a: c681 beqz a3,4f62 + 4f5c: 9752 add a4,a4,s4 + 4f5e: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4f62: 05878363 beq a5,s8,4fa8 + } else if(c0 == 'l' && c1 == 'd'){ + 4f66: 05978d63 beq a5,s9,4fc0 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4f6a: 07500713 li a4,117 + 4f6e: 0ee78763 beq a5,a4,505c + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4f72: 07800713 li a4,120 + 4f76: 12e78963 beq a5,a4,50a8 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4f7a: 07000713 li a4,112 + 4f7e: 14e78e63 beq a5,a4,50da + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4f82: 06300713 li a4,99 + 4f86: 18e78e63 beq a5,a4,5122 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4f8a: 07300713 li a4,115 + 4f8e: 1ae78463 beq a5,a4,5136 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4f92: 02500713 li a4,37 + 4f96: 04e79563 bne a5,a4,4fe0 + putc(fd, '%'); + 4f9a: 02500593 li a1,37 + 4f9e: 855a mv a0,s6 + 4fa0: e8dff0ef jal 4e2c + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 4fa4: 4981 li s3,0 + 4fa6: b769 j 4f30 + printint(fd, va_arg(ap, int), 10, 1); + 4fa8: 008b8913 addi s2,s7,8 + 4fac: 4685 li a3,1 + 4fae: 4629 li a2,10 + 4fb0: 000ba583 lw a1,0(s7) + 4fb4: 855a mv a0,s6 + 4fb6: e95ff0ef jal 4e4a + 4fba: 8bca mv s7,s2 + state = 0; + 4fbc: 4981 li s3,0 + 4fbe: bf8d j 4f30 + } else if(c0 == 'l' && c1 == 'd'){ + 4fc0: 06400793 li a5,100 + 4fc4: 02f68963 beq a3,a5,4ff6 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 4fc8: 06c00793 li a5,108 + 4fcc: 04f68263 beq a3,a5,5010 + } else if(c0 == 'l' && c1 == 'u'){ + 4fd0: 07500793 li a5,117 + 4fd4: 0af68063 beq a3,a5,5074 + } else if(c0 == 'l' && c1 == 'x'){ + 4fd8: 07800793 li a5,120 + 4fdc: 0ef68263 beq a3,a5,50c0 + putc(fd, '%'); + 4fe0: 02500593 li a1,37 + 4fe4: 855a mv a0,s6 + 4fe6: e47ff0ef jal 4e2c + putc(fd, c0); + 4fea: 85ca mv a1,s2 + 4fec: 855a mv a0,s6 + 4fee: e3fff0ef jal 4e2c + state = 0; + 4ff2: 4981 li s3,0 + 4ff4: bf35 j 4f30 + printint(fd, va_arg(ap, uint64), 10, 1); + 4ff6: 008b8913 addi s2,s7,8 + 4ffa: 4685 li a3,1 + 4ffc: 4629 li a2,10 + 4ffe: 000bb583 ld a1,0(s7) + 5002: 855a mv a0,s6 + 5004: e47ff0ef jal 4e4a + i += 1; + 5008: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 500a: 8bca mv s7,s2 + state = 0; + 500c: 4981 li s3,0 + i += 1; + 500e: b70d j 4f30 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5010: 06400793 li a5,100 + 5014: 02f60763 beq a2,a5,5042 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5018: 07500793 li a5,117 + 501c: 06f60963 beq a2,a5,508e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5020: 07800793 li a5,120 + 5024: faf61ee3 bne a2,a5,4fe0 + printint(fd, va_arg(ap, uint64), 16, 0); + 5028: 008b8913 addi s2,s7,8 + 502c: 4681 li a3,0 + 502e: 4641 li a2,16 + 5030: 000bb583 ld a1,0(s7) + 5034: 855a mv a0,s6 + 5036: e15ff0ef jal 4e4a + i += 2; + 503a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 503c: 8bca mv s7,s2 + state = 0; + 503e: 4981 li s3,0 + i += 2; + 5040: bdc5 j 4f30 + printint(fd, va_arg(ap, uint64), 10, 1); + 5042: 008b8913 addi s2,s7,8 + 5046: 4685 li a3,1 + 5048: 4629 li a2,10 + 504a: 000bb583 ld a1,0(s7) + 504e: 855a mv a0,s6 + 5050: dfbff0ef jal 4e4a + i += 2; + 5054: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5056: 8bca mv s7,s2 + state = 0; + 5058: 4981 li s3,0 + i += 2; + 505a: bdd9 j 4f30 + printint(fd, va_arg(ap, uint32), 10, 0); + 505c: 008b8913 addi s2,s7,8 + 5060: 4681 li a3,0 + 5062: 4629 li a2,10 + 5064: 000be583 lwu a1,0(s7) + 5068: 855a mv a0,s6 + 506a: de1ff0ef jal 4e4a + 506e: 8bca mv s7,s2 + state = 0; + 5070: 4981 li s3,0 + 5072: bd7d j 4f30 + printint(fd, va_arg(ap, uint64), 10, 0); + 5074: 008b8913 addi s2,s7,8 + 5078: 4681 li a3,0 + 507a: 4629 li a2,10 + 507c: 000bb583 ld a1,0(s7) + 5080: 855a mv a0,s6 + 5082: dc9ff0ef jal 4e4a + i += 1; + 5086: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5088: 8bca mv s7,s2 + state = 0; + 508a: 4981 li s3,0 + i += 1; + 508c: b555 j 4f30 + printint(fd, va_arg(ap, uint64), 10, 0); + 508e: 008b8913 addi s2,s7,8 + 5092: 4681 li a3,0 + 5094: 4629 li a2,10 + 5096: 000bb583 ld a1,0(s7) + 509a: 855a mv a0,s6 + 509c: dafff0ef jal 4e4a + i += 2; + 50a0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 50a2: 8bca mv s7,s2 + state = 0; + 50a4: 4981 li s3,0 + i += 2; + 50a6: b569 j 4f30 + printint(fd, va_arg(ap, uint32), 16, 0); + 50a8: 008b8913 addi s2,s7,8 + 50ac: 4681 li a3,0 + 50ae: 4641 li a2,16 + 50b0: 000be583 lwu a1,0(s7) + 50b4: 855a mv a0,s6 + 50b6: d95ff0ef jal 4e4a + 50ba: 8bca mv s7,s2 + state = 0; + 50bc: 4981 li s3,0 + 50be: bd8d j 4f30 + printint(fd, va_arg(ap, uint64), 16, 0); + 50c0: 008b8913 addi s2,s7,8 + 50c4: 4681 li a3,0 + 50c6: 4641 li a2,16 + 50c8: 000bb583 ld a1,0(s7) + 50cc: 855a mv a0,s6 + 50ce: d7dff0ef jal 4e4a + i += 1; + 50d2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 50d4: 8bca mv s7,s2 + state = 0; + 50d6: 4981 li s3,0 + i += 1; + 50d8: bda1 j 4f30 + 50da: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 50dc: 008b8d13 addi s10,s7,8 + 50e0: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 50e4: 03000593 li a1,48 + 50e8: 855a mv a0,s6 + 50ea: d43ff0ef jal 4e2c + putc(fd, 'x'); + 50ee: 07800593 li a1,120 + 50f2: 855a mv a0,s6 + 50f4: d39ff0ef jal 4e2c + 50f8: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 50fa: 00003b97 auipc s7,0x3 + 50fe: 88eb8b93 addi s7,s7,-1906 # 7988 + 5102: 03c9d793 srli a5,s3,0x3c + 5106: 97de add a5,a5,s7 + 5108: 0007c583 lbu a1,0(a5) + 510c: 855a mv a0,s6 + 510e: d1fff0ef jal 4e2c + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 5112: 0992 slli s3,s3,0x4 + 5114: 397d addiw s2,s2,-1 + 5116: fe0916e3 bnez s2,5102 + printptr(fd, va_arg(ap, uint64)); + 511a: 8bea mv s7,s10 + state = 0; + 511c: 4981 li s3,0 + 511e: 6d02 ld s10,0(sp) + 5120: bd01 j 4f30 + putc(fd, va_arg(ap, uint32)); + 5122: 008b8913 addi s2,s7,8 + 5126: 000bc583 lbu a1,0(s7) + 512a: 855a mv a0,s6 + 512c: d01ff0ef jal 4e2c + 5130: 8bca mv s7,s2 + state = 0; + 5132: 4981 li s3,0 + 5134: bbf5 j 4f30 + if((s = va_arg(ap, char*)) == 0) + 5136: 008b8993 addi s3,s7,8 + 513a: 000bb903 ld s2,0(s7) + 513e: 00090f63 beqz s2,515c + for(; *s; s++) + 5142: 00094583 lbu a1,0(s2) + 5146: c195 beqz a1,516a + putc(fd, *s); + 5148: 855a mv a0,s6 + 514a: ce3ff0ef jal 4e2c + for(; *s; s++) + 514e: 0905 addi s2,s2,1 + 5150: 00094583 lbu a1,0(s2) + 5154: f9f5 bnez a1,5148 + if((s = va_arg(ap, char*)) == 0) + 5156: 8bce mv s7,s3 + state = 0; + 5158: 4981 li s3,0 + 515a: bbd9 j 4f30 + s = "(null)"; + 515c: 00002917 auipc s2,0x2 + 5160: 77c90913 addi s2,s2,1916 # 78d8 + for(; *s; s++) + 5164: 02800593 li a1,40 + 5168: b7c5 j 5148 + if((s = va_arg(ap, char*)) == 0) + 516a: 8bce mv s7,s3 + state = 0; + 516c: 4981 li s3,0 + 516e: b3c9 j 4f30 + 5170: 64a6 ld s1,72(sp) + 5172: 79e2 ld s3,56(sp) + 5174: 7a42 ld s4,48(sp) + 5176: 7aa2 ld s5,40(sp) + 5178: 7b02 ld s6,32(sp) + 517a: 6be2 ld s7,24(sp) + 517c: 6c42 ld s8,16(sp) + 517e: 6ca2 ld s9,8(sp) + } + } +} + 5180: 60e6 ld ra,88(sp) + 5182: 6446 ld s0,80(sp) + 5184: 6906 ld s2,64(sp) + 5186: 6125 addi sp,sp,96 + 5188: 8082 ret + +000000000000518a : + +void +fprintf(int fd, const char *fmt, ...) +{ + 518a: 715d addi sp,sp,-80 + 518c: ec06 sd ra,24(sp) + 518e: e822 sd s0,16(sp) + 5190: 1000 addi s0,sp,32 + 5192: e010 sd a2,0(s0) + 5194: e414 sd a3,8(s0) + 5196: e818 sd a4,16(s0) + 5198: ec1c sd a5,24(s0) + 519a: 03043023 sd a6,32(s0) + 519e: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 51a2: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 51a6: 8622 mv a2,s0 + 51a8: d3fff0ef jal 4ee6 +} + 51ac: 60e2 ld ra,24(sp) + 51ae: 6442 ld s0,16(sp) + 51b0: 6161 addi sp,sp,80 + 51b2: 8082 ret + +00000000000051b4 : + +void +printf(const char *fmt, ...) +{ + 51b4: 711d addi sp,sp,-96 + 51b6: ec06 sd ra,24(sp) + 51b8: e822 sd s0,16(sp) + 51ba: 1000 addi s0,sp,32 + 51bc: e40c sd a1,8(s0) + 51be: e810 sd a2,16(s0) + 51c0: ec14 sd a3,24(s0) + 51c2: f018 sd a4,32(s0) + 51c4: f41c sd a5,40(s0) + 51c6: 03043823 sd a6,48(s0) + 51ca: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 51ce: 00840613 addi a2,s0,8 + 51d2: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 51d6: 85aa mv a1,a0 + 51d8: 4505 li a0,1 + 51da: d0dff0ef jal 4ee6 +} + 51de: 60e2 ld ra,24(sp) + 51e0: 6442 ld s0,16(sp) + 51e2: 6125 addi sp,sp,96 + 51e4: 8082 ret + +00000000000051e6 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 51e6: 1141 addi sp,sp,-16 + 51e8: e422 sd s0,8(sp) + 51ea: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 51ec: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 51f0: 00004797 auipc a5,0x4 + 51f4: 2a07b783 ld a5,672(a5) # 9490 + 51f8: a02d j 5222 + 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; + 51fa: 4618 lw a4,8(a2) + 51fc: 9f2d addw a4,a4,a1 + 51fe: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 5202: 6398 ld a4,0(a5) + 5204: 6310 ld a2,0(a4) + 5206: a83d j 5244 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 5208: ff852703 lw a4,-8(a0) + 520c: 9f31 addw a4,a4,a2 + 520e: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 5210: ff053683 ld a3,-16(a0) + 5214: a091 j 5258 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 5216: 6398 ld a4,0(a5) + 5218: 00e7e463 bltu a5,a4,5220 + 521c: 00e6ea63 bltu a3,a4,5230 +{ + 5220: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 5222: fed7fae3 bgeu a5,a3,5216 + 5226: 6398 ld a4,0(a5) + 5228: 00e6e463 bltu a3,a4,5230 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 522c: fee7eae3 bltu a5,a4,5220 + if(bp + bp->s.size == p->s.ptr){ + 5230: ff852583 lw a1,-8(a0) + 5234: 6390 ld a2,0(a5) + 5236: 02059813 slli a6,a1,0x20 + 523a: 01c85713 srli a4,a6,0x1c + 523e: 9736 add a4,a4,a3 + 5240: fae60de3 beq a2,a4,51fa + bp->s.ptr = p->s.ptr->s.ptr; + 5244: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 5248: 4790 lw a2,8(a5) + 524a: 02061593 slli a1,a2,0x20 + 524e: 01c5d713 srli a4,a1,0x1c + 5252: 973e add a4,a4,a5 + 5254: fae68ae3 beq a3,a4,5208 + p->s.ptr = bp->s.ptr; + 5258: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 525a: 00004717 auipc a4,0x4 + 525e: 22f73b23 sd a5,566(a4) # 9490 +} + 5262: 6422 ld s0,8(sp) + 5264: 0141 addi sp,sp,16 + 5266: 8082 ret + +0000000000005268 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 5268: 7139 addi sp,sp,-64 + 526a: fc06 sd ra,56(sp) + 526c: f822 sd s0,48(sp) + 526e: f426 sd s1,40(sp) + 5270: ec4e sd s3,24(sp) + 5272: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 5274: 02051493 slli s1,a0,0x20 + 5278: 9081 srli s1,s1,0x20 + 527a: 04bd addi s1,s1,15 + 527c: 8091 srli s1,s1,0x4 + 527e: 0014899b addiw s3,s1,1 + 5282: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 5284: 00004517 auipc a0,0x4 + 5288: 20c53503 ld a0,524(a0) # 9490 + 528c: c915 beqz a0,52c0 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 528e: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 5290: 4798 lw a4,8(a5) + 5292: 08977a63 bgeu a4,s1,5326 + 5296: f04a sd s2,32(sp) + 5298: e852 sd s4,16(sp) + 529a: e456 sd s5,8(sp) + 529c: e05a sd s6,0(sp) + if(nu < 4096) + 529e: 8a4e mv s4,s3 + 52a0: 0009871b sext.w a4,s3 + 52a4: 6685 lui a3,0x1 + 52a6: 00d77363 bgeu a4,a3,52ac + 52aa: 6a05 lui s4,0x1 + 52ac: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 52b0: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 52b4: 00004917 auipc s2,0x4 + 52b8: 1dc90913 addi s2,s2,476 # 9490 + if(p == SBRK_ERROR) + 52bc: 5afd li s5,-1 + 52be: a081 j 52fe + 52c0: f04a sd s2,32(sp) + 52c2: e852 sd s4,16(sp) + 52c4: e456 sd s5,8(sp) + 52c6: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 52c8: 0000b797 auipc a5,0xb + 52cc: 9f078793 addi a5,a5,-1552 # fcb8 + 52d0: 00004717 auipc a4,0x4 + 52d4: 1cf73023 sd a5,448(a4) # 9490 + 52d8: e39c sd a5,0(a5) + base.s.size = 0; + 52da: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 52de: b7c1 j 529e + prevp->s.ptr = p->s.ptr; + 52e0: 6398 ld a4,0(a5) + 52e2: e118 sd a4,0(a0) + 52e4: a8a9 j 533e + hp->s.size = nu; + 52e6: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 52ea: 0541 addi a0,a0,16 + 52ec: efbff0ef jal 51e6 + return freep; + 52f0: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 52f4: c12d beqz a0,5356 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 52f6: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 52f8: 4798 lw a4,8(a5) + 52fa: 02977263 bgeu a4,s1,531e + if(p == freep) + 52fe: 00093703 ld a4,0(s2) + 5302: 853e mv a0,a5 + 5304: fef719e3 bne a4,a5,52f6 + p = sbrk(nu * sizeof(Header)); + 5308: 8552 mv a0,s4 + 530a: a37ff0ef jal 4d40 + if(p == SBRK_ERROR) + 530e: fd551ce3 bne a0,s5,52e6 + return 0; + 5312: 4501 li a0,0 + 5314: 7902 ld s2,32(sp) + 5316: 6a42 ld s4,16(sp) + 5318: 6aa2 ld s5,8(sp) + 531a: 6b02 ld s6,0(sp) + 531c: a03d j 534a + 531e: 7902 ld s2,32(sp) + 5320: 6a42 ld s4,16(sp) + 5322: 6aa2 ld s5,8(sp) + 5324: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 5326: fae48de3 beq s1,a4,52e0 + p->s.size -= nunits; + 532a: 4137073b subw a4,a4,s3 + 532e: c798 sw a4,8(a5) + p += p->s.size; + 5330: 02071693 slli a3,a4,0x20 + 5334: 01c6d713 srli a4,a3,0x1c + 5338: 97ba add a5,a5,a4 + p->s.size = nunits; + 533a: 0137a423 sw s3,8(a5) + freep = prevp; + 533e: 00004717 auipc a4,0x4 + 5342: 14a73923 sd a0,338(a4) # 9490 + return (void*)(p + 1); + 5346: 01078513 addi a0,a5,16 + } +} + 534a: 70e2 ld ra,56(sp) + 534c: 7442 ld s0,48(sp) + 534e: 74a2 ld s1,40(sp) + 5350: 69e2 ld s3,24(sp) + 5352: 6121 addi sp,sp,64 + 5354: 8082 ret + 5356: 7902 ld s2,32(sp) + 5358: 6a42 ld s4,16(sp) + 535a: 6aa2 ld s5,8(sp) + 535c: 6b02 ld s6,0(sp) + 535e: b7f5 j 534a diff --git a/user/usertests.c b/G12_Project1_xv6CustomizeSystemCalls/user/usertests.c similarity index 100% rename from user/usertests.c rename to G12_Project1_xv6CustomizeSystemCalls/user/usertests.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/usertests.d b/G12_Project1_xv6CustomizeSystemCalls/user/usertests.d new file mode 100644 index 0000000000..c76551d18b --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/usertests.d @@ -0,0 +1,3 @@ +user/usertests.o: user/usertests.c kernel/param.h kernel/types.h \ + kernel/stat.h user/user.h kernel/fs.h kernel/fcntl.h kernel/syscall.h \ + kernel/memlayout.h kernel/riscv.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/usertests.o b/G12_Project1_xv6CustomizeSystemCalls/user/usertests.o new file mode 100644 index 0000000000..345fb9ea64 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/usertests.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/usertests.sym b/G12_Project1_xv6CustomizeSystemCalls/user/usertests.sym new file mode 100644 index 0000000000..1ec34b7a10 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/usertests.sym @@ -0,0 +1,150 @@ +0000000000000000 .text +0000000000005360 .rodata +00000000000079a0 .eh_frame +0000000000009000 .data +0000000000009490 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 usertests.c +00000000000095a0 big.0 +00000000000094a0 args.1 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000004e2c putc +0000000000004e4a printint +0000000000007988 digits +0000000000000000 umalloc.c +0000000000009490 freep +000000000000fcb8 base +00000000000009be writebig +00000000000025b0 sbrk8000 +0000000000004af0 strcpy +0000000000001650 exitwait +0000000000001db6 manywrites +0000000000004e04 pause +00000000000051b4 printf +0000000000004dfc sys_sbrk +00000000000003be outofinodes +000000000000426a bigargtest +0000000000004c9a memmove +0000000000003580 openiputtest +0000000000004dbc mknod +0000000000003886 reparent +0000000000004ba8 gets +000000000000445e lazy_copy +0000000000004df4 getpid +00000000000014b4 pipe1 +0000000000004d2c memcpy +0000000000003486 iref +0000000000000fd4 pgbug +0000000000001d12 nowrite +0000000000005268 malloc +00000000000005aa copyout +0000000000001cae stacktest +00000000000025de execout +0000000000002452 sbrkbugs +0000000000002a70 exitiputtest +0000000000004686 fsfull +0000000000000e9e bigdir +0000000000001ae4 forktest +0000000000004d56 sbrklazy +0000000000001fce rwsbrk +00000000000011dc truncate3 +000000000000022c bigwrite +0000000000003b02 sharedfd +0000000000004d84 pipe +00000000000036d0 killstatus +000000000000a5a8 uninit +00000000000032d6 dirfile +0000000000004d94 write +0000000000000078 bsstest +0000000000004dcc fstat +000000000000518a fprintf +0000000000004da4 kill +00000000000027b6 diskfull +0000000000000e3c validatetest +0000000000009010 quicktests +00000000000031b0 rmdot +000000000000047e copyin +0000000000004ee6 vprintf +0000000000000118 truncate2 +0000000000004de4 chdir +0000000000009000 big +000000000000133e exectest +0000000000004dac exec +00000000000002ee badwrite +0000000000004d7c wait +0000000000004e14 getprocsinfo +0000000000004d8c read +0000000000004596 lazy_sbrk +00000000000043b2 lazy_unmap +000000000000374a preempt +0000000000004dc4 unlink +0000000000001000 badarg +00000000000023f8 argptest +0000000000003a8a mem +000000000000487a runtests +0000000000004cf2 memcmp +0000000000004d6c fork +000000000000250e sbrklast +0000000000001eca copyinstr3 +0000000000001752 forkfork +0000000000004d40 sbrk +0000000000009420 slowtests +0000000000004e0c uptime +00000000000016e0 twochildren +0000000000001c1c MAXVAplus +0000000000004b62 memset +0000000000001b8c kernmem +00000000000001b8 createtest +0000000000004a2e main +0000000000001830 createdelete +0000000000004e1c getppid +0000000000003632 forkforkfork +0000000000003906 sbrkfail +0000000000004b0c strcmp +000000000000087e writetest +0000000000004dec dup +00000000000006e0 truncate1 +00000000000000b2 opentest +00000000000047fc run +0000000000004348 lazy_alloc +0000000000002bc2 subdir +000000000000103e copyinstr2 +0000000000000c74 linktest +000000000000ccb8 buf +0000000000002b1c dirtest +0000000000004932 drivetests +0000000000002354 sbrkarg +00000000000029ca iputtest +0000000000004c18 stat +0000000000004e24 sleep2 +00000000000040e6 bigfile +00000000000048ec countfree +0000000000000b1e unlinkread +0000000000004dd4 link +0000000000004d74 exit +0000000000004ae0 start +0000000000004c52 atoi +0000000000000000 copyinstr1 +0000000000001a08 linkunlink +00000000000020d4 sbrkbasic +0000000000004b38 strlen +0000000000004db4 open +0000000000004b84 strchr +0000000000003e42 concreate +000000000000267a fourteen +0000000000003c6e fourfiles +0000000000002216 sbrkmuch +0000000000004ddc mkdir +0000000000004d9c close +00000000000017e8 reparent2 +00000000000051e6 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/usys.S b/G12_Project1_xv6CustomizeSystemCalls/user/usys.S new file mode 100644 index 0000000000..c816bc80d3 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/usys.S @@ -0,0 +1,122 @@ +# generated by usys.pl - do not edit +#include "kernel/syscall.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 mknod +mknod: + li a7, SYS_mknod + ecall + ret +.global unlink +unlink: + li a7, SYS_unlink + ecall + ret +.global fstat +fstat: + li a7, SYS_fstat + ecall + ret +.global link +link: + li a7, SYS_link + 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 sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + ecall + ret +.global pause +pause: + li a7, SYS_pause + ecall + ret +.global uptime +uptime: + li a7, SYS_uptime + ecall + ret +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + ecall + ret +.global getppid +getppid: + li a7, SYS_getppid + ecall + ret +.global sleep2 +sleep2: + li a7, SYS_sleep2 + ecall + ret diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/usys.d b/G12_Project1_xv6CustomizeSystemCalls/user/usys.d new file mode 100644 index 0000000000..80c63fdf89 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/usys.d @@ -0,0 +1 @@ +user/usys.o: user/usys.S kernel/syscall.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/usys.o b/G12_Project1_xv6CustomizeSystemCalls/user/usys.o new file mode 100644 index 0000000000..e405f927f4 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/usys.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/usys.pl b/G12_Project1_xv6CustomizeSystemCalls/user/usys.pl new file mode 100755 index 0000000000..bf54407164 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/usys.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl -w + +# Generate usys.S, the stubs for syscalls. + +print "# generated by usys.pl - do not edit\n"; + +print "#include \"kernel/syscall.h\"\n"; + +sub entry { + my $prefix = "sys_"; + my $name = shift; + if ($name eq "sbrk") { + print ".global $prefix$name\n"; + print "$prefix$name:\n"; + } else { + 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("mknod"); +entry("unlink"); +entry("fstat"); +entry("link"); +entry("mkdir"); +entry("chdir"); +entry("dup"); +entry("getpid"); +entry("sbrk"); +entry("pause"); +entry("uptime"); +entry("getprocsinfo"); +entry("getppid"); +entry("sleep2"); diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/wc.asm b/G12_Project1_xv6CustomizeSystemCalls/user/wc.asm new file mode 100644 index 0000000000..af7d8b6851 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/wc.asm @@ -0,0 +1,1672 @@ + +user/_wc: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + +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: 4901 li s2,0 + l = w = c = 0; + 28: 4d01 li s10,0 + 2a: 4c81 li s9,0 + 2c: 4c01 li s8,0 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 2e: 00001d97 auipc s11,0x1 + 32: fe2d8d93 addi s11,s11,-30 # 1010 + for(i=0; i + inword = 0; + 40: 4b81 li s7,0 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 42: a035 j 6e + if(strchr(" \r\t\n\v", buf[i])) + 44: 8552 mv a0,s4 + 46: 1ba000ef jal 200 + 4a: c919 beqz a0,60 + inword = 0; + 4c: 895e mv s2,s7 + for(i=0; i + if(buf[i] == '\n') + 54: 0004c583 lbu a1,0(s1) + 58: ff5596e3 bne a1,s5,44 + l++; + 5c: 2c05 addiw s8,s8,1 + 5e: b7dd j 44 + else if(!inword){ + 60: fe0917e3 bnez s2,4e + w++; + 64: 2c85 addiw s9,s9,1 + inword = 1; + 66: 4905 li s2,1 + 68: b7dd j 4e + 6a: 01ab0d3b addw s10,s6,s10 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 6e: 20000613 li a2,512 + 72: 85ee mv a1,s11 + 74: f8843503 ld a0,-120(s0) + 78: 390000ef jal 408 + 7c: 8b2a mv s6,a0 + 7e: 00a05963 blez a0,90 + for(i=0; i + 8a: 009509b3 add s3,a0,s1 + 8e: b7d9 j 54 + } + } + } + if(n < 0){ + 90: 02054c63 bltz a0,c8 + printf("wc: read error\n"); + exit(1); + } + printf("%d %d %d %s\n", l, w, c, name); + 94: f8043703 ld a4,-128(s0) + 98: 86ea mv a3,s10 + 9a: 8666 mv a2,s9 + 9c: 85e2 mv a1,s8 + 9e: 00001517 auipc a0,0x1 + a2: 96250513 addi a0,a0,-1694 # a00 + a6: 78a000ef jal 830 +} + aa: 70e6 ld ra,120(sp) + ac: 7446 ld s0,112(sp) + ae: 74a6 ld s1,104(sp) + b0: 7906 ld s2,96(sp) + b2: 69e6 ld s3,88(sp) + b4: 6a46 ld s4,80(sp) + b6: 6aa6 ld s5,72(sp) + b8: 6b06 ld s6,64(sp) + ba: 7be2 ld s7,56(sp) + bc: 7c42 ld s8,48(sp) + be: 7ca2 ld s9,40(sp) + c0: 7d02 ld s10,32(sp) + c2: 6de2 ld s11,24(sp) + c4: 6109 addi sp,sp,128 + c6: 8082 ret + printf("wc: read error\n"); + c8: 00001517 auipc a0,0x1 + cc: 92850513 addi a0,a0,-1752 # 9f0 + d0: 760000ef jal 830 + exit(1); + d4: 4505 li a0,1 + d6: 31a000ef jal 3f0 + +00000000000000da
: + +int +main(int argc, char *argv[]) +{ + da: 7179 addi sp,sp,-48 + dc: f406 sd ra,40(sp) + de: f022 sd s0,32(sp) + e0: 1800 addi s0,sp,48 + int fd, i; + + if(argc <= 1){ + e2: 4785 li a5,1 + e4: 04a7d463 bge a5,a0,12c + e8: ec26 sd s1,24(sp) + ea: e84a sd s2,16(sp) + ec: e44e sd s3,8(sp) + ee: 00858913 addi s2,a1,8 + f2: ffe5099b addiw s3,a0,-2 + f6: 02099793 slli a5,s3,0x20 + fa: 01d7d993 srli s3,a5,0x1d + fe: 05c1 addi a1,a1,16 + 100: 99ae add s3,s3,a1 + wc(0, ""); + exit(0); + } + + for(i = 1; i < argc; i++){ + if((fd = open(argv[i], O_RDONLY)) < 0){ + 102: 4581 li a1,0 + 104: 00093503 ld a0,0(s2) + 108: 328000ef jal 430 + 10c: 84aa mv s1,a0 + 10e: 02054c63 bltz a0,146 + printf("wc: cannot open %s\n", argv[i]); + exit(1); + } + wc(fd, argv[i]); + 112: 00093583 ld a1,0(s2) + 116: eebff0ef jal 0 + close(fd); + 11a: 8526 mv a0,s1 + 11c: 2fc000ef jal 418 + for(i = 1; i < argc; i++){ + 120: 0921 addi s2,s2,8 + 122: ff3910e3 bne s2,s3,102 + } + exit(0); + 126: 4501 li a0,0 + 128: 2c8000ef jal 3f0 + 12c: ec26 sd s1,24(sp) + 12e: e84a sd s2,16(sp) + 130: e44e sd s3,8(sp) + wc(0, ""); + 132: 00001597 auipc a1,0x1 + 136: 8b658593 addi a1,a1,-1866 # 9e8 + 13a: 4501 li a0,0 + 13c: ec5ff0ef jal 0 + exit(0); + 140: 4501 li a0,0 + 142: 2ae000ef jal 3f0 + printf("wc: cannot open %s\n", argv[i]); + 146: 00093583 ld a1,0(s2) + 14a: 00001517 auipc a0,0x1 + 14e: 8c650513 addi a0,a0,-1850 # a10 + 152: 6de000ef jal 830 + exit(1); + 156: 4505 li a0,1 + 158: 298000ef jal 3f0 + +000000000000015c : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 15c: 1141 addi sp,sp,-16 + 15e: e406 sd ra,8(sp) + 160: e022 sd s0,0(sp) + 162: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 164: f77ff0ef jal da
+ exit(r); + 168: 288000ef jal 3f0 + +000000000000016c : +} + +char* +strcpy(char *s, const char *t) +{ + 16c: 1141 addi sp,sp,-16 + 16e: e422 sd s0,8(sp) + 170: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 172: 87aa mv a5,a0 + 174: 0585 addi a1,a1,1 + 176: 0785 addi a5,a5,1 + 178: fff5c703 lbu a4,-1(a1) + 17c: fee78fa3 sb a4,-1(a5) + 180: fb75 bnez a4,174 + ; + return os; +} + 182: 6422 ld s0,8(sp) + 184: 0141 addi sp,sp,16 + 186: 8082 ret + +0000000000000188 : + +int +strcmp(const char *p, const char *q) +{ + 188: 1141 addi sp,sp,-16 + 18a: e422 sd s0,8(sp) + 18c: 0800 addi s0,sp,16 + while(*p && *p == *q) + 18e: 00054783 lbu a5,0(a0) + 192: cb91 beqz a5,1a6 + 194: 0005c703 lbu a4,0(a1) + 198: 00f71763 bne a4,a5,1a6 + p++, q++; + 19c: 0505 addi a0,a0,1 + 19e: 0585 addi a1,a1,1 + while(*p && *p == *q) + 1a0: 00054783 lbu a5,0(a0) + 1a4: fbe5 bnez a5,194 + return (uchar)*p - (uchar)*q; + 1a6: 0005c503 lbu a0,0(a1) +} + 1aa: 40a7853b subw a0,a5,a0 + 1ae: 6422 ld s0,8(sp) + 1b0: 0141 addi sp,sp,16 + 1b2: 8082 ret + +00000000000001b4 : + +uint +strlen(const char *s) +{ + 1b4: 1141 addi sp,sp,-16 + 1b6: e422 sd s0,8(sp) + 1b8: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 1ba: 00054783 lbu a5,0(a0) + 1be: cf91 beqz a5,1da + 1c0: 0505 addi a0,a0,1 + 1c2: 87aa mv a5,a0 + 1c4: 86be mv a3,a5 + 1c6: 0785 addi a5,a5,1 + 1c8: fff7c703 lbu a4,-1(a5) + 1cc: ff65 bnez a4,1c4 + 1ce: 40a6853b subw a0,a3,a0 + 1d2: 2505 addiw a0,a0,1 + ; + return n; +} + 1d4: 6422 ld s0,8(sp) + 1d6: 0141 addi sp,sp,16 + 1d8: 8082 ret + for(n = 0; s[n]; n++) + 1da: 4501 li a0,0 + 1dc: bfe5 j 1d4 + +00000000000001de : + +void* +memset(void *dst, int c, uint n) +{ + 1de: 1141 addi sp,sp,-16 + 1e0: e422 sd s0,8(sp) + 1e2: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 1e4: ca19 beqz a2,1fa + 1e6: 87aa mv a5,a0 + 1e8: 1602 slli a2,a2,0x20 + 1ea: 9201 srli a2,a2,0x20 + 1ec: 00a60733 add a4,a2,a0 + cdst[i] = c; + 1f0: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 1f4: 0785 addi a5,a5,1 + 1f6: fee79de3 bne a5,a4,1f0 + } + return dst; +} + 1fa: 6422 ld s0,8(sp) + 1fc: 0141 addi sp,sp,16 + 1fe: 8082 ret + +0000000000000200 : + +char* +strchr(const char *s, char c) +{ + 200: 1141 addi sp,sp,-16 + 202: e422 sd s0,8(sp) + 204: 0800 addi s0,sp,16 + for(; *s; s++) + 206: 00054783 lbu a5,0(a0) + 20a: cb99 beqz a5,220 + if(*s == c) + 20c: 00f58763 beq a1,a5,21a + for(; *s; s++) + 210: 0505 addi a0,a0,1 + 212: 00054783 lbu a5,0(a0) + 216: fbfd bnez a5,20c + return (char*)s; + return 0; + 218: 4501 li a0,0 +} + 21a: 6422 ld s0,8(sp) + 21c: 0141 addi sp,sp,16 + 21e: 8082 ret + return 0; + 220: 4501 li a0,0 + 222: bfe5 j 21a + +0000000000000224 : + +char* +gets(char *buf, int max) +{ + 224: 711d addi sp,sp,-96 + 226: ec86 sd ra,88(sp) + 228: e8a2 sd s0,80(sp) + 22a: e4a6 sd s1,72(sp) + 22c: e0ca sd s2,64(sp) + 22e: fc4e sd s3,56(sp) + 230: f852 sd s4,48(sp) + 232: f456 sd s5,40(sp) + 234: f05a sd s6,32(sp) + 236: ec5e sd s7,24(sp) + 238: 1080 addi s0,sp,96 + 23a: 8baa mv s7,a0 + 23c: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 23e: 892a mv s2,a0 + 240: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 242: 4aa9 li s5,10 + 244: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 246: 89a6 mv s3,s1 + 248: 2485 addiw s1,s1,1 + 24a: 0344d663 bge s1,s4,276 + cc = read(0, &c, 1); + 24e: 4605 li a2,1 + 250: faf40593 addi a1,s0,-81 + 254: 4501 li a0,0 + 256: 1b2000ef jal 408 + if(cc < 1) + 25a: 00a05e63 blez a0,276 + buf[i++] = c; + 25e: faf44783 lbu a5,-81(s0) + 262: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 266: 01578763 beq a5,s5,274 + 26a: 0905 addi s2,s2,1 + 26c: fd679de3 bne a5,s6,246 + buf[i++] = c; + 270: 89a6 mv s3,s1 + 272: a011 j 276 + 274: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 276: 99de add s3,s3,s7 + 278: 00098023 sb zero,0(s3) + return buf; +} + 27c: 855e mv a0,s7 + 27e: 60e6 ld ra,88(sp) + 280: 6446 ld s0,80(sp) + 282: 64a6 ld s1,72(sp) + 284: 6906 ld s2,64(sp) + 286: 79e2 ld s3,56(sp) + 288: 7a42 ld s4,48(sp) + 28a: 7aa2 ld s5,40(sp) + 28c: 7b02 ld s6,32(sp) + 28e: 6be2 ld s7,24(sp) + 290: 6125 addi sp,sp,96 + 292: 8082 ret + +0000000000000294 : + +int +stat(const char *n, struct stat *st) +{ + 294: 1101 addi sp,sp,-32 + 296: ec06 sd ra,24(sp) + 298: e822 sd s0,16(sp) + 29a: e04a sd s2,0(sp) + 29c: 1000 addi s0,sp,32 + 29e: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 2a0: 4581 li a1,0 + 2a2: 18e000ef jal 430 + if(fd < 0) + 2a6: 02054263 bltz a0,2ca + 2aa: e426 sd s1,8(sp) + 2ac: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 2ae: 85ca mv a1,s2 + 2b0: 198000ef jal 448 + 2b4: 892a mv s2,a0 + close(fd); + 2b6: 8526 mv a0,s1 + 2b8: 160000ef jal 418 + return r; + 2bc: 64a2 ld s1,8(sp) +} + 2be: 854a mv a0,s2 + 2c0: 60e2 ld ra,24(sp) + 2c2: 6442 ld s0,16(sp) + 2c4: 6902 ld s2,0(sp) + 2c6: 6105 addi sp,sp,32 + 2c8: 8082 ret + return -1; + 2ca: 597d li s2,-1 + 2cc: bfcd j 2be + +00000000000002ce : + +int +atoi(const char *s) +{ + 2ce: 1141 addi sp,sp,-16 + 2d0: e422 sd s0,8(sp) + 2d2: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 2d4: 00054683 lbu a3,0(a0) + 2d8: fd06879b addiw a5,a3,-48 + 2dc: 0ff7f793 zext.b a5,a5 + 2e0: 4625 li a2,9 + 2e2: 02f66863 bltu a2,a5,312 + 2e6: 872a mv a4,a0 + n = 0; + 2e8: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 2ea: 0705 addi a4,a4,1 + 2ec: 0025179b slliw a5,a0,0x2 + 2f0: 9fa9 addw a5,a5,a0 + 2f2: 0017979b slliw a5,a5,0x1 + 2f6: 9fb5 addw a5,a5,a3 + 2f8: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 2fc: 00074683 lbu a3,0(a4) + 300: fd06879b addiw a5,a3,-48 + 304: 0ff7f793 zext.b a5,a5 + 308: fef671e3 bgeu a2,a5,2ea + return n; +} + 30c: 6422 ld s0,8(sp) + 30e: 0141 addi sp,sp,16 + 310: 8082 ret + n = 0; + 312: 4501 li a0,0 + 314: bfe5 j 30c + +0000000000000316 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 316: 1141 addi sp,sp,-16 + 318: e422 sd s0,8(sp) + 31a: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 31c: 02b57463 bgeu a0,a1,344 + while(n-- > 0) + 320: 00c05f63 blez a2,33e + 324: 1602 slli a2,a2,0x20 + 326: 9201 srli a2,a2,0x20 + 328: 00c507b3 add a5,a0,a2 + dst = vdst; + 32c: 872a mv a4,a0 + *dst++ = *src++; + 32e: 0585 addi a1,a1,1 + 330: 0705 addi a4,a4,1 + 332: fff5c683 lbu a3,-1(a1) + 336: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 33a: fef71ae3 bne a4,a5,32e + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 33e: 6422 ld s0,8(sp) + 340: 0141 addi sp,sp,16 + 342: 8082 ret + dst += n; + 344: 00c50733 add a4,a0,a2 + src += n; + 348: 95b2 add a1,a1,a2 + while(n-- > 0) + 34a: fec05ae3 blez a2,33e + 34e: fff6079b addiw a5,a2,-1 + 352: 1782 slli a5,a5,0x20 + 354: 9381 srli a5,a5,0x20 + 356: fff7c793 not a5,a5 + 35a: 97ba add a5,a5,a4 + *--dst = *--src; + 35c: 15fd addi a1,a1,-1 + 35e: 177d addi a4,a4,-1 + 360: 0005c683 lbu a3,0(a1) + 364: 00d70023 sb a3,0(a4) + while(n-- > 0) + 368: fee79ae3 bne a5,a4,35c + 36c: bfc9 j 33e + +000000000000036e : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 36e: 1141 addi sp,sp,-16 + 370: e422 sd s0,8(sp) + 372: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 374: ca05 beqz a2,3a4 + 376: fff6069b addiw a3,a2,-1 + 37a: 1682 slli a3,a3,0x20 + 37c: 9281 srli a3,a3,0x20 + 37e: 0685 addi a3,a3,1 + 380: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 382: 00054783 lbu a5,0(a0) + 386: 0005c703 lbu a4,0(a1) + 38a: 00e79863 bne a5,a4,39a + return *p1 - *p2; + } + p1++; + 38e: 0505 addi a0,a0,1 + p2++; + 390: 0585 addi a1,a1,1 + while (n-- > 0) { + 392: fed518e3 bne a0,a3,382 + } + return 0; + 396: 4501 li a0,0 + 398: a019 j 39e + return *p1 - *p2; + 39a: 40e7853b subw a0,a5,a4 +} + 39e: 6422 ld s0,8(sp) + 3a0: 0141 addi sp,sp,16 + 3a2: 8082 ret + return 0; + 3a4: 4501 li a0,0 + 3a6: bfe5 j 39e + +00000000000003a8 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 3a8: 1141 addi sp,sp,-16 + 3aa: e406 sd ra,8(sp) + 3ac: e022 sd s0,0(sp) + 3ae: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 3b0: f67ff0ef jal 316 +} + 3b4: 60a2 ld ra,8(sp) + 3b6: 6402 ld s0,0(sp) + 3b8: 0141 addi sp,sp,16 + 3ba: 8082 ret + +00000000000003bc : + +char * +sbrk(int n) { + 3bc: 1141 addi sp,sp,-16 + 3be: e406 sd ra,8(sp) + 3c0: e022 sd s0,0(sp) + 3c2: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 3c4: 4585 li a1,1 + 3c6: 0b2000ef jal 478 +} + 3ca: 60a2 ld ra,8(sp) + 3cc: 6402 ld s0,0(sp) + 3ce: 0141 addi sp,sp,16 + 3d0: 8082 ret + +00000000000003d2 : + +char * +sbrklazy(int n) { + 3d2: 1141 addi sp,sp,-16 + 3d4: e406 sd ra,8(sp) + 3d6: e022 sd s0,0(sp) + 3d8: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 3da: 4589 li a1,2 + 3dc: 09c000ef jal 478 +} + 3e0: 60a2 ld ra,8(sp) + 3e2: 6402 ld s0,0(sp) + 3e4: 0141 addi sp,sp,16 + 3e6: 8082 ret + +00000000000003e8 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 3e8: 4885 li a7,1 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 : +.global exit +exit: + li a7, SYS_exit + 3f0: 4889 li a7,2 + ecall + 3f2: 00000073 ecall + ret + 3f6: 8082 ret + +00000000000003f8 : +.global wait +wait: + li a7, SYS_wait + 3f8: 488d li a7,3 + ecall + 3fa: 00000073 ecall + ret + 3fe: 8082 ret + +0000000000000400 : +.global pipe +pipe: + li a7, SYS_pipe + 400: 4891 li a7,4 + ecall + 402: 00000073 ecall + ret + 406: 8082 ret + +0000000000000408 : +.global read +read: + li a7, SYS_read + 408: 4895 li a7,5 + ecall + 40a: 00000073 ecall + ret + 40e: 8082 ret + +0000000000000410 : +.global write +write: + li a7, SYS_write + 410: 48c1 li a7,16 + ecall + 412: 00000073 ecall + ret + 416: 8082 ret + +0000000000000418 : +.global close +close: + li a7, SYS_close + 418: 48d5 li a7,21 + ecall + 41a: 00000073 ecall + ret + 41e: 8082 ret + +0000000000000420 : +.global kill +kill: + li a7, SYS_kill + 420: 4899 li a7,6 + ecall + 422: 00000073 ecall + ret + 426: 8082 ret + +0000000000000428 : +.global exec +exec: + li a7, SYS_exec + 428: 489d li a7,7 + ecall + 42a: 00000073 ecall + ret + 42e: 8082 ret + +0000000000000430 : +.global open +open: + li a7, SYS_open + 430: 48bd li a7,15 + ecall + 432: 00000073 ecall + ret + 436: 8082 ret + +0000000000000438 : +.global mknod +mknod: + li a7, SYS_mknod + 438: 48c5 li a7,17 + ecall + 43a: 00000073 ecall + ret + 43e: 8082 ret + +0000000000000440 : +.global unlink +unlink: + li a7, SYS_unlink + 440: 48c9 li a7,18 + ecall + 442: 00000073 ecall + ret + 446: 8082 ret + +0000000000000448 : +.global fstat +fstat: + li a7, SYS_fstat + 448: 48a1 li a7,8 + ecall + 44a: 00000073 ecall + ret + 44e: 8082 ret + +0000000000000450 : +.global link +link: + li a7, SYS_link + 450: 48cd li a7,19 + ecall + 452: 00000073 ecall + ret + 456: 8082 ret + +0000000000000458 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 458: 48d1 li a7,20 + ecall + 45a: 00000073 ecall + ret + 45e: 8082 ret + +0000000000000460 : +.global chdir +chdir: + li a7, SYS_chdir + 460: 48a5 li a7,9 + ecall + 462: 00000073 ecall + ret + 466: 8082 ret + +0000000000000468 : +.global dup +dup: + li a7, SYS_dup + 468: 48a9 li a7,10 + ecall + 46a: 00000073 ecall + ret + 46e: 8082 ret + +0000000000000470 : +.global getpid +getpid: + li a7, SYS_getpid + 470: 48ad li a7,11 + ecall + 472: 00000073 ecall + ret + 476: 8082 ret + +0000000000000478 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 478: 48b1 li a7,12 + ecall + 47a: 00000073 ecall + ret + 47e: 8082 ret + +0000000000000480 : +.global pause +pause: + li a7, SYS_pause + 480: 48b5 li a7,13 + ecall + 482: 00000073 ecall + ret + 486: 8082 ret + +0000000000000488 : +.global uptime +uptime: + li a7, SYS_uptime + 488: 48b9 li a7,14 + ecall + 48a: 00000073 ecall + ret + 48e: 8082 ret + +0000000000000490 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 490: 48d9 li a7,22 + ecall + 492: 00000073 ecall + ret + 496: 8082 ret + +0000000000000498 : +.global getppid +getppid: + li a7, SYS_getppid + 498: 48dd li a7,23 + ecall + 49a: 00000073 ecall + ret + 49e: 8082 ret + +00000000000004a0 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 4a0: 48e1 li a7,24 + ecall + 4a2: 00000073 ecall + ret + 4a6: 8082 ret + +00000000000004a8 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 4a8: 1101 addi sp,sp,-32 + 4aa: ec06 sd ra,24(sp) + 4ac: e822 sd s0,16(sp) + 4ae: 1000 addi s0,sp,32 + 4b0: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 4b4: 4605 li a2,1 + 4b6: fef40593 addi a1,s0,-17 + 4ba: f57ff0ef jal 410 +} + 4be: 60e2 ld ra,24(sp) + 4c0: 6442 ld s0,16(sp) + 4c2: 6105 addi sp,sp,32 + 4c4: 8082 ret + +00000000000004c6 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 4c6: 715d addi sp,sp,-80 + 4c8: e486 sd ra,72(sp) + 4ca: e0a2 sd s0,64(sp) + 4cc: f84a sd s2,48(sp) + 4ce: 0880 addi s0,sp,80 + 4d0: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 4d2: c299 beqz a3,4d8 + 4d4: 0805c363 bltz a1,55a + neg = 0; + 4d8: 4881 li a7,0 + 4da: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 4de: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 4e0: 00000517 auipc a0,0x0 + 4e4: 55050513 addi a0,a0,1360 # a30 + 4e8: 883e mv a6,a5 + 4ea: 2785 addiw a5,a5,1 + 4ec: 02c5f733 remu a4,a1,a2 + 4f0: 972a add a4,a4,a0 + 4f2: 00074703 lbu a4,0(a4) + 4f6: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 4fa: 872e mv a4,a1 + 4fc: 02c5d5b3 divu a1,a1,a2 + 500: 0685 addi a3,a3,1 + 502: fec773e3 bgeu a4,a2,4e8 + if(neg) + 506: 00088b63 beqz a7,51c + buf[i++] = '-'; + 50a: fd078793 addi a5,a5,-48 + 50e: 97a2 add a5,a5,s0 + 510: 02d00713 li a4,45 + 514: fee78423 sb a4,-24(a5) + 518: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 51c: 02f05a63 blez a5,550 + 520: fc26 sd s1,56(sp) + 522: f44e sd s3,40(sp) + 524: fb840713 addi a4,s0,-72 + 528: 00f704b3 add s1,a4,a5 + 52c: fff70993 addi s3,a4,-1 + 530: 99be add s3,s3,a5 + 532: 37fd addiw a5,a5,-1 + 534: 1782 slli a5,a5,0x20 + 536: 9381 srli a5,a5,0x20 + 538: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 53c: fff4c583 lbu a1,-1(s1) + 540: 854a mv a0,s2 + 542: f67ff0ef jal 4a8 + while(--i >= 0) + 546: 14fd addi s1,s1,-1 + 548: ff349ae3 bne s1,s3,53c + 54c: 74e2 ld s1,56(sp) + 54e: 79a2 ld s3,40(sp) +} + 550: 60a6 ld ra,72(sp) + 552: 6406 ld s0,64(sp) + 554: 7942 ld s2,48(sp) + 556: 6161 addi sp,sp,80 + 558: 8082 ret + x = -xx; + 55a: 40b005b3 neg a1,a1 + neg = 1; + 55e: 4885 li a7,1 + x = -xx; + 560: bfad j 4da + +0000000000000562 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 562: 711d addi sp,sp,-96 + 564: ec86 sd ra,88(sp) + 566: e8a2 sd s0,80(sp) + 568: e0ca sd s2,64(sp) + 56a: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 56c: 0005c903 lbu s2,0(a1) + 570: 28090663 beqz s2,7fc + 574: e4a6 sd s1,72(sp) + 576: fc4e sd s3,56(sp) + 578: f852 sd s4,48(sp) + 57a: f456 sd s5,40(sp) + 57c: f05a sd s6,32(sp) + 57e: ec5e sd s7,24(sp) + 580: e862 sd s8,16(sp) + 582: e466 sd s9,8(sp) + 584: 8b2a mv s6,a0 + 586: 8a2e mv s4,a1 + 588: 8bb2 mv s7,a2 + state = 0; + 58a: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 58c: 4481 li s1,0 + 58e: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 590: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 594: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 598: 06c00c93 li s9,108 + 59c: a005 j 5bc + putc(fd, c0); + 59e: 85ca mv a1,s2 + 5a0: 855a mv a0,s6 + 5a2: f07ff0ef jal 4a8 + 5a6: a019 j 5ac + } else if(state == '%'){ + 5a8: 03598263 beq s3,s5,5cc + for(i = 0; fmt[i]; i++){ + 5ac: 2485 addiw s1,s1,1 + 5ae: 8726 mv a4,s1 + 5b0: 009a07b3 add a5,s4,s1 + 5b4: 0007c903 lbu s2,0(a5) + 5b8: 22090a63 beqz s2,7ec + c0 = fmt[i] & 0xff; + 5bc: 0009079b sext.w a5,s2 + if(state == 0){ + 5c0: fe0994e3 bnez s3,5a8 + if(c0 == '%'){ + 5c4: fd579de3 bne a5,s5,59e + state = '%'; + 5c8: 89be mv s3,a5 + 5ca: b7cd j 5ac + if(c0) c1 = fmt[i+1] & 0xff; + 5cc: 00ea06b3 add a3,s4,a4 + 5d0: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 5d4: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 5d6: c681 beqz a3,5de + 5d8: 9752 add a4,a4,s4 + 5da: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 5de: 05878363 beq a5,s8,624 + } else if(c0 == 'l' && c1 == 'd'){ + 5e2: 05978d63 beq a5,s9,63c + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 5e6: 07500713 li a4,117 + 5ea: 0ee78763 beq a5,a4,6d8 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 5ee: 07800713 li a4,120 + 5f2: 12e78963 beq a5,a4,724 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 5f6: 07000713 li a4,112 + 5fa: 14e78e63 beq a5,a4,756 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 5fe: 06300713 li a4,99 + 602: 18e78e63 beq a5,a4,79e + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 606: 07300713 li a4,115 + 60a: 1ae78463 beq a5,a4,7b2 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 60e: 02500713 li a4,37 + 612: 04e79563 bne a5,a4,65c + putc(fd, '%'); + 616: 02500593 li a1,37 + 61a: 855a mv a0,s6 + 61c: e8dff0ef jal 4a8 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 620: 4981 li s3,0 + 622: b769 j 5ac + printint(fd, va_arg(ap, int), 10, 1); + 624: 008b8913 addi s2,s7,8 + 628: 4685 li a3,1 + 62a: 4629 li a2,10 + 62c: 000ba583 lw a1,0(s7) + 630: 855a mv a0,s6 + 632: e95ff0ef jal 4c6 + 636: 8bca mv s7,s2 + state = 0; + 638: 4981 li s3,0 + 63a: bf8d j 5ac + } else if(c0 == 'l' && c1 == 'd'){ + 63c: 06400793 li a5,100 + 640: 02f68963 beq a3,a5,672 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 644: 06c00793 li a5,108 + 648: 04f68263 beq a3,a5,68c + } else if(c0 == 'l' && c1 == 'u'){ + 64c: 07500793 li a5,117 + 650: 0af68063 beq a3,a5,6f0 + } else if(c0 == 'l' && c1 == 'x'){ + 654: 07800793 li a5,120 + 658: 0ef68263 beq a3,a5,73c + putc(fd, '%'); + 65c: 02500593 li a1,37 + 660: 855a mv a0,s6 + 662: e47ff0ef jal 4a8 + putc(fd, c0); + 666: 85ca mv a1,s2 + 668: 855a mv a0,s6 + 66a: e3fff0ef jal 4a8 + state = 0; + 66e: 4981 li s3,0 + 670: bf35 j 5ac + printint(fd, va_arg(ap, uint64), 10, 1); + 672: 008b8913 addi s2,s7,8 + 676: 4685 li a3,1 + 678: 4629 li a2,10 + 67a: 000bb583 ld a1,0(s7) + 67e: 855a mv a0,s6 + 680: e47ff0ef jal 4c6 + i += 1; + 684: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 686: 8bca mv s7,s2 + state = 0; + 688: 4981 li s3,0 + i += 1; + 68a: b70d j 5ac + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 68c: 06400793 li a5,100 + 690: 02f60763 beq a2,a5,6be + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 694: 07500793 li a5,117 + 698: 06f60963 beq a2,a5,70a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 69c: 07800793 li a5,120 + 6a0: faf61ee3 bne a2,a5,65c + printint(fd, va_arg(ap, uint64), 16, 0); + 6a4: 008b8913 addi s2,s7,8 + 6a8: 4681 li a3,0 + 6aa: 4641 li a2,16 + 6ac: 000bb583 ld a1,0(s7) + 6b0: 855a mv a0,s6 + 6b2: e15ff0ef jal 4c6 + i += 2; + 6b6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 6b8: 8bca mv s7,s2 + state = 0; + 6ba: 4981 li s3,0 + i += 2; + 6bc: bdc5 j 5ac + printint(fd, va_arg(ap, uint64), 10, 1); + 6be: 008b8913 addi s2,s7,8 + 6c2: 4685 li a3,1 + 6c4: 4629 li a2,10 + 6c6: 000bb583 ld a1,0(s7) + 6ca: 855a mv a0,s6 + 6cc: dfbff0ef jal 4c6 + i += 2; + 6d0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 6d2: 8bca mv s7,s2 + state = 0; + 6d4: 4981 li s3,0 + i += 2; + 6d6: bdd9 j 5ac + printint(fd, va_arg(ap, uint32), 10, 0); + 6d8: 008b8913 addi s2,s7,8 + 6dc: 4681 li a3,0 + 6de: 4629 li a2,10 + 6e0: 000be583 lwu a1,0(s7) + 6e4: 855a mv a0,s6 + 6e6: de1ff0ef jal 4c6 + 6ea: 8bca mv s7,s2 + state = 0; + 6ec: 4981 li s3,0 + 6ee: bd7d j 5ac + printint(fd, va_arg(ap, uint64), 10, 0); + 6f0: 008b8913 addi s2,s7,8 + 6f4: 4681 li a3,0 + 6f6: 4629 li a2,10 + 6f8: 000bb583 ld a1,0(s7) + 6fc: 855a mv a0,s6 + 6fe: dc9ff0ef jal 4c6 + i += 1; + 702: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 704: 8bca mv s7,s2 + state = 0; + 706: 4981 li s3,0 + i += 1; + 708: b555 j 5ac + printint(fd, va_arg(ap, uint64), 10, 0); + 70a: 008b8913 addi s2,s7,8 + 70e: 4681 li a3,0 + 710: 4629 li a2,10 + 712: 000bb583 ld a1,0(s7) + 716: 855a mv a0,s6 + 718: dafff0ef jal 4c6 + i += 2; + 71c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 71e: 8bca mv s7,s2 + state = 0; + 720: 4981 li s3,0 + i += 2; + 722: b569 j 5ac + printint(fd, va_arg(ap, uint32), 16, 0); + 724: 008b8913 addi s2,s7,8 + 728: 4681 li a3,0 + 72a: 4641 li a2,16 + 72c: 000be583 lwu a1,0(s7) + 730: 855a mv a0,s6 + 732: d95ff0ef jal 4c6 + 736: 8bca mv s7,s2 + state = 0; + 738: 4981 li s3,0 + 73a: bd8d j 5ac + printint(fd, va_arg(ap, uint64), 16, 0); + 73c: 008b8913 addi s2,s7,8 + 740: 4681 li a3,0 + 742: 4641 li a2,16 + 744: 000bb583 ld a1,0(s7) + 748: 855a mv a0,s6 + 74a: d7dff0ef jal 4c6 + i += 1; + 74e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 750: 8bca mv s7,s2 + state = 0; + 752: 4981 li s3,0 + i += 1; + 754: bda1 j 5ac + 756: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 758: 008b8d13 addi s10,s7,8 + 75c: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 760: 03000593 li a1,48 + 764: 855a mv a0,s6 + 766: d43ff0ef jal 4a8 + putc(fd, 'x'); + 76a: 07800593 li a1,120 + 76e: 855a mv a0,s6 + 770: d39ff0ef jal 4a8 + 774: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 776: 00000b97 auipc s7,0x0 + 77a: 2bab8b93 addi s7,s7,698 # a30 + 77e: 03c9d793 srli a5,s3,0x3c + 782: 97de add a5,a5,s7 + 784: 0007c583 lbu a1,0(a5) + 788: 855a mv a0,s6 + 78a: d1fff0ef jal 4a8 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 78e: 0992 slli s3,s3,0x4 + 790: 397d addiw s2,s2,-1 + 792: fe0916e3 bnez s2,77e + printptr(fd, va_arg(ap, uint64)); + 796: 8bea mv s7,s10 + state = 0; + 798: 4981 li s3,0 + 79a: 6d02 ld s10,0(sp) + 79c: bd01 j 5ac + putc(fd, va_arg(ap, uint32)); + 79e: 008b8913 addi s2,s7,8 + 7a2: 000bc583 lbu a1,0(s7) + 7a6: 855a mv a0,s6 + 7a8: d01ff0ef jal 4a8 + 7ac: 8bca mv s7,s2 + state = 0; + 7ae: 4981 li s3,0 + 7b0: bbf5 j 5ac + if((s = va_arg(ap, char*)) == 0) + 7b2: 008b8993 addi s3,s7,8 + 7b6: 000bb903 ld s2,0(s7) + 7ba: 00090f63 beqz s2,7d8 + for(; *s; s++) + 7be: 00094583 lbu a1,0(s2) + 7c2: c195 beqz a1,7e6 + putc(fd, *s); + 7c4: 855a mv a0,s6 + 7c6: ce3ff0ef jal 4a8 + for(; *s; s++) + 7ca: 0905 addi s2,s2,1 + 7cc: 00094583 lbu a1,0(s2) + 7d0: f9f5 bnez a1,7c4 + if((s = va_arg(ap, char*)) == 0) + 7d2: 8bce mv s7,s3 + state = 0; + 7d4: 4981 li s3,0 + 7d6: bbd9 j 5ac + s = "(null)"; + 7d8: 00000917 auipc s2,0x0 + 7dc: 25090913 addi s2,s2,592 # a28 + for(; *s; s++) + 7e0: 02800593 li a1,40 + 7e4: b7c5 j 7c4 + if((s = va_arg(ap, char*)) == 0) + 7e6: 8bce mv s7,s3 + state = 0; + 7e8: 4981 li s3,0 + 7ea: b3c9 j 5ac + 7ec: 64a6 ld s1,72(sp) + 7ee: 79e2 ld s3,56(sp) + 7f0: 7a42 ld s4,48(sp) + 7f2: 7aa2 ld s5,40(sp) + 7f4: 7b02 ld s6,32(sp) + 7f6: 6be2 ld s7,24(sp) + 7f8: 6c42 ld s8,16(sp) + 7fa: 6ca2 ld s9,8(sp) + } + } +} + 7fc: 60e6 ld ra,88(sp) + 7fe: 6446 ld s0,80(sp) + 800: 6906 ld s2,64(sp) + 802: 6125 addi sp,sp,96 + 804: 8082 ret + +0000000000000806 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 806: 715d addi sp,sp,-80 + 808: ec06 sd ra,24(sp) + 80a: e822 sd s0,16(sp) + 80c: 1000 addi s0,sp,32 + 80e: e010 sd a2,0(s0) + 810: e414 sd a3,8(s0) + 812: e818 sd a4,16(s0) + 814: ec1c sd a5,24(s0) + 816: 03043023 sd a6,32(s0) + 81a: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 81e: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 822: 8622 mv a2,s0 + 824: d3fff0ef jal 562 +} + 828: 60e2 ld ra,24(sp) + 82a: 6442 ld s0,16(sp) + 82c: 6161 addi sp,sp,80 + 82e: 8082 ret + +0000000000000830 : + +void +printf(const char *fmt, ...) +{ + 830: 711d addi sp,sp,-96 + 832: ec06 sd ra,24(sp) + 834: e822 sd s0,16(sp) + 836: 1000 addi s0,sp,32 + 838: e40c sd a1,8(s0) + 83a: e810 sd a2,16(s0) + 83c: ec14 sd a3,24(s0) + 83e: f018 sd a4,32(s0) + 840: f41c sd a5,40(s0) + 842: 03043823 sd a6,48(s0) + 846: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 84a: 00840613 addi a2,s0,8 + 84e: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 852: 85aa mv a1,a0 + 854: 4505 li a0,1 + 856: d0dff0ef jal 562 +} + 85a: 60e2 ld ra,24(sp) + 85c: 6442 ld s0,16(sp) + 85e: 6125 addi sp,sp,96 + 860: 8082 ret + +0000000000000862 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 862: 1141 addi sp,sp,-16 + 864: e422 sd s0,8(sp) + 866: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 868: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 86c: 00000797 auipc a5,0x0 + 870: 7947b783 ld a5,1940(a5) # 1000 + 874: a02d j 89e + 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; + 876: 4618 lw a4,8(a2) + 878: 9f2d addw a4,a4,a1 + 87a: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 87e: 6398 ld a4,0(a5) + 880: 6310 ld a2,0(a4) + 882: a83d j 8c0 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 884: ff852703 lw a4,-8(a0) + 888: 9f31 addw a4,a4,a2 + 88a: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 88c: ff053683 ld a3,-16(a0) + 890: a091 j 8d4 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 892: 6398 ld a4,0(a5) + 894: 00e7e463 bltu a5,a4,89c + 898: 00e6ea63 bltu a3,a4,8ac +{ + 89c: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 89e: fed7fae3 bgeu a5,a3,892 + 8a2: 6398 ld a4,0(a5) + 8a4: 00e6e463 bltu a3,a4,8ac + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 8a8: fee7eae3 bltu a5,a4,89c + if(bp + bp->s.size == p->s.ptr){ + 8ac: ff852583 lw a1,-8(a0) + 8b0: 6390 ld a2,0(a5) + 8b2: 02059813 slli a6,a1,0x20 + 8b6: 01c85713 srli a4,a6,0x1c + 8ba: 9736 add a4,a4,a3 + 8bc: fae60de3 beq a2,a4,876 + bp->s.ptr = p->s.ptr->s.ptr; + 8c0: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 8c4: 4790 lw a2,8(a5) + 8c6: 02061593 slli a1,a2,0x20 + 8ca: 01c5d713 srli a4,a1,0x1c + 8ce: 973e add a4,a4,a5 + 8d0: fae68ae3 beq a3,a4,884 + p->s.ptr = bp->s.ptr; + 8d4: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 8d6: 00000717 auipc a4,0x0 + 8da: 72f73523 sd a5,1834(a4) # 1000 +} + 8de: 6422 ld s0,8(sp) + 8e0: 0141 addi sp,sp,16 + 8e2: 8082 ret + +00000000000008e4 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 8e4: 7139 addi sp,sp,-64 + 8e6: fc06 sd ra,56(sp) + 8e8: f822 sd s0,48(sp) + 8ea: f426 sd s1,40(sp) + 8ec: ec4e sd s3,24(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: 0014899b addiw s3,s1,1 + 8fe: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 900: 00000517 auipc a0,0x0 + 904: 70053503 ld a0,1792(a0) # 1000 + 908: c915 beqz a0,93c + 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: 08977a63 bgeu a4,s1,9a2 + 912: f04a sd s2,32(sp) + 914: e852 sd s4,16(sp) + 916: e456 sd s5,8(sp) + 918: e05a sd s6,0(sp) + if(nu < 4096) + 91a: 8a4e mv s4,s3 + 91c: 0009871b sext.w a4,s3 + 920: 6685 lui a3,0x1 + 922: 00d77363 bgeu a4,a3,928 + 926: 6a05 lui s4,0x1 + 928: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 92c: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 930: 00000917 auipc s2,0x0 + 934: 6d090913 addi s2,s2,1744 # 1000 + if(p == SBRK_ERROR) + 938: 5afd li s5,-1 + 93a: a081 j 97a + 93c: f04a sd s2,32(sp) + 93e: e852 sd s4,16(sp) + 940: e456 sd s5,8(sp) + 942: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 944: 00001797 auipc a5,0x1 + 948: 8cc78793 addi a5,a5,-1844 # 1210 + 94c: 00000717 auipc a4,0x0 + 950: 6af73a23 sd a5,1716(a4) # 1000 + 954: e39c sd a5,0(a5) + base.s.size = 0; + 956: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 95a: b7c1 j 91a + prevp->s.ptr = p->s.ptr; + 95c: 6398 ld a4,0(a5) + 95e: e118 sd a4,0(a0) + 960: a8a9 j 9ba + hp->s.size = nu; + 962: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 966: 0541 addi a0,a0,16 + 968: efbff0ef jal 862 + return freep; + 96c: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 970: c12d beqz a0,9d2 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 972: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 974: 4798 lw a4,8(a5) + 976: 02977263 bgeu a4,s1,99a + if(p == freep) + 97a: 00093703 ld a4,0(s2) + 97e: 853e mv a0,a5 + 980: fef719e3 bne a4,a5,972 + p = sbrk(nu * sizeof(Header)); + 984: 8552 mv a0,s4 + 986: a37ff0ef jal 3bc + if(p == SBRK_ERROR) + 98a: fd551ce3 bne a0,s5,962 + return 0; + 98e: 4501 li a0,0 + 990: 7902 ld s2,32(sp) + 992: 6a42 ld s4,16(sp) + 994: 6aa2 ld s5,8(sp) + 996: 6b02 ld s6,0(sp) + 998: a03d j 9c6 + 99a: 7902 ld s2,32(sp) + 99c: 6a42 ld s4,16(sp) + 99e: 6aa2 ld s5,8(sp) + 9a0: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 9a2: fae48de3 beq s1,a4,95c + p->s.size -= nunits; + 9a6: 4137073b subw a4,a4,s3 + 9aa: c798 sw a4,8(a5) + p += p->s.size; + 9ac: 02071693 slli a3,a4,0x20 + 9b0: 01c6d713 srli a4,a3,0x1c + 9b4: 97ba add a5,a5,a4 + p->s.size = nunits; + 9b6: 0137a423 sw s3,8(a5) + freep = prevp; + 9ba: 00000717 auipc a4,0x0 + 9be: 64a73323 sd a0,1606(a4) # 1000 + return (void*)(p + 1); + 9c2: 01078513 addi a0,a5,16 + } +} + 9c6: 70e2 ld ra,56(sp) + 9c8: 7442 ld s0,48(sp) + 9ca: 74a2 ld s1,40(sp) + 9cc: 69e2 ld s3,24(sp) + 9ce: 6121 addi sp,sp,64 + 9d0: 8082 ret + 9d2: 7902 ld s2,32(sp) + 9d4: 6a42 ld s4,16(sp) + 9d6: 6aa2 ld s5,8(sp) + 9d8: 6b02 ld s6,0(sp) + 9da: b7f5 j 9c6 diff --git a/user/wc.c b/G12_Project1_xv6CustomizeSystemCalls/user/wc.c similarity index 100% rename from user/wc.c rename to G12_Project1_xv6CustomizeSystemCalls/user/wc.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/wc.d b/G12_Project1_xv6CustomizeSystemCalls/user/wc.d new file mode 100644 index 0000000000..813c90b087 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/wc.d @@ -0,0 +1,2 @@ +user/wc.o: user/wc.c kernel/types.h kernel/stat.h kernel/fcntl.h \ + user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/wc.o b/G12_Project1_xv6CustomizeSystemCalls/user/wc.o new file mode 100644 index 0000000000..b170a78c12 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/wc.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/wc.sym b/G12_Project1_xv6CustomizeSystemCalls/user/wc.sym new file mode 100644 index 0000000000..4f09c31e04 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/wc.sym @@ -0,0 +1,70 @@ +0000000000000000 .text +00000000000009e0 .rodata +0000000000000a48 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 wc.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000004a8 putc +00000000000004c6 printint +0000000000000a30 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001210 base +000000000000016c strcpy +0000000000000480 pause +0000000000000830 printf +0000000000000478 sys_sbrk +0000000000000316 memmove +0000000000000438 mknod +0000000000000224 gets +0000000000000470 getpid +00000000000003a8 memcpy +00000000000008e4 malloc +00000000000003d2 sbrklazy +0000000000000400 pipe +0000000000000410 write +0000000000000448 fstat +0000000000000806 fprintf +0000000000000420 kill +0000000000000562 vprintf +0000000000000460 chdir +0000000000000428 exec +00000000000003f8 wait +0000000000000490 getprocsinfo +0000000000000408 read +0000000000000440 unlink +0000000000000000 wc +000000000000036e memcmp +00000000000003e8 fork +00000000000003bc sbrk +0000000000000488 uptime +00000000000001de memset +00000000000000da main +0000000000000498 getppid +0000000000000188 strcmp +0000000000000468 dup +0000000000001010 buf +0000000000000294 stat +00000000000004a0 sleep2 +0000000000000450 link +00000000000003f0 exit +000000000000015c start +00000000000002ce atoi +00000000000001b4 strlen +0000000000000430 open +0000000000000200 strchr +0000000000000458 mkdir +0000000000000418 close +0000000000000862 free diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/zombie.asm b/G12_Project1_xv6CustomizeSystemCalls/user/zombie.asm new file mode 100644 index 0000000000..e2e4b5d3c9 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/zombie.asm @@ -0,0 +1,1501 @@ + +user/_zombie: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(void) +{ + 0: 1141 addi sp,sp,-16 + 2: e406 sd ra,8(sp) + 4: e022 sd s0,0(sp) + 6: 0800 addi s0,sp,16 + if(fork() > 0) + 8: 2a2000ef jal 2aa + c: 00a04563 bgtz a0,16 + pause(5); // Let child exit before parent. + exit(0); + 10: 4501 li a0,0 + 12: 2a0000ef jal 2b2 + pause(5); // Let child exit before parent. + 16: 4515 li a0,5 + 18: 32a000ef jal 342 + 1c: bfd5 j 10 + +000000000000001e : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 1e: 1141 addi sp,sp,-16 + 20: e406 sd ra,8(sp) + 22: e022 sd s0,0(sp) + 24: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 26: fdbff0ef jal 0
+ exit(r); + 2a: 288000ef jal 2b2 + +000000000000002e : +} + +char* +strcpy(char *s, const char *t) +{ + 2e: 1141 addi sp,sp,-16 + 30: e422 sd s0,8(sp) + 32: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 34: 87aa mv a5,a0 + 36: 0585 addi a1,a1,1 + 38: 0785 addi a5,a5,1 + 3a: fff5c703 lbu a4,-1(a1) + 3e: fee78fa3 sb a4,-1(a5) + 42: fb75 bnez a4,36 + ; + return os; +} + 44: 6422 ld s0,8(sp) + 46: 0141 addi sp,sp,16 + 48: 8082 ret + +000000000000004a : + +int +strcmp(const char *p, const char *q) +{ + 4a: 1141 addi sp,sp,-16 + 4c: e422 sd s0,8(sp) + 4e: 0800 addi s0,sp,16 + while(*p && *p == *q) + 50: 00054783 lbu a5,0(a0) + 54: cb91 beqz a5,68 + 56: 0005c703 lbu a4,0(a1) + 5a: 00f71763 bne a4,a5,68 + p++, q++; + 5e: 0505 addi a0,a0,1 + 60: 0585 addi a1,a1,1 + while(*p && *p == *q) + 62: 00054783 lbu a5,0(a0) + 66: fbe5 bnez a5,56 + return (uchar)*p - (uchar)*q; + 68: 0005c503 lbu a0,0(a1) +} + 6c: 40a7853b subw a0,a5,a0 + 70: 6422 ld s0,8(sp) + 72: 0141 addi sp,sp,16 + 74: 8082 ret + +0000000000000076 : + +uint +strlen(const char *s) +{ + 76: 1141 addi sp,sp,-16 + 78: e422 sd s0,8(sp) + 7a: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 7c: 00054783 lbu a5,0(a0) + 80: cf91 beqz a5,9c + 82: 0505 addi a0,a0,1 + 84: 87aa mv a5,a0 + 86: 86be mv a3,a5 + 88: 0785 addi a5,a5,1 + 8a: fff7c703 lbu a4,-1(a5) + 8e: ff65 bnez a4,86 + 90: 40a6853b subw a0,a3,a0 + 94: 2505 addiw a0,a0,1 + ; + return n; +} + 96: 6422 ld s0,8(sp) + 98: 0141 addi sp,sp,16 + 9a: 8082 ret + for(n = 0; s[n]; n++) + 9c: 4501 li a0,0 + 9e: bfe5 j 96 + +00000000000000a0 : + +void* +memset(void *dst, int c, uint n) +{ + a0: 1141 addi sp,sp,-16 + a2: e422 sd s0,8(sp) + a4: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + a6: ca19 beqz a2,bc + a8: 87aa mv a5,a0 + aa: 1602 slli a2,a2,0x20 + ac: 9201 srli a2,a2,0x20 + ae: 00a60733 add a4,a2,a0 + cdst[i] = c; + b2: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + b6: 0785 addi a5,a5,1 + b8: fee79de3 bne a5,a4,b2 + } + return dst; +} + bc: 6422 ld s0,8(sp) + be: 0141 addi sp,sp,16 + c0: 8082 ret + +00000000000000c2 : + +char* +strchr(const char *s, char c) +{ + c2: 1141 addi sp,sp,-16 + c4: e422 sd s0,8(sp) + c6: 0800 addi s0,sp,16 + for(; *s; s++) + c8: 00054783 lbu a5,0(a0) + cc: cb99 beqz a5,e2 + if(*s == c) + ce: 00f58763 beq a1,a5,dc + for(; *s; s++) + d2: 0505 addi a0,a0,1 + d4: 00054783 lbu a5,0(a0) + d8: fbfd bnez a5,ce + return (char*)s; + return 0; + da: 4501 li a0,0 +} + dc: 6422 ld s0,8(sp) + de: 0141 addi sp,sp,16 + e0: 8082 ret + return 0; + e2: 4501 li a0,0 + e4: bfe5 j dc + +00000000000000e6 : + +char* +gets(char *buf, int max) +{ + e6: 711d addi sp,sp,-96 + e8: ec86 sd ra,88(sp) + ea: e8a2 sd s0,80(sp) + ec: e4a6 sd s1,72(sp) + ee: e0ca sd s2,64(sp) + f0: fc4e sd s3,56(sp) + f2: f852 sd s4,48(sp) + f4: f456 sd s5,40(sp) + f6: f05a sd s6,32(sp) + f8: ec5e sd s7,24(sp) + fa: 1080 addi s0,sp,96 + fc: 8baa mv s7,a0 + fe: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 100: 892a mv s2,a0 + 102: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 104: 4aa9 li s5,10 + 106: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 108: 89a6 mv s3,s1 + 10a: 2485 addiw s1,s1,1 + 10c: 0344d663 bge s1,s4,138 + cc = read(0, &c, 1); + 110: 4605 li a2,1 + 112: faf40593 addi a1,s0,-81 + 116: 4501 li a0,0 + 118: 1b2000ef jal 2ca + if(cc < 1) + 11c: 00a05e63 blez a0,138 + buf[i++] = c; + 120: faf44783 lbu a5,-81(s0) + 124: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 128: 01578763 beq a5,s5,136 + 12c: 0905 addi s2,s2,1 + 12e: fd679de3 bne a5,s6,108 + buf[i++] = c; + 132: 89a6 mv s3,s1 + 134: a011 j 138 + 136: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 138: 99de add s3,s3,s7 + 13a: 00098023 sb zero,0(s3) + return buf; +} + 13e: 855e mv a0,s7 + 140: 60e6 ld ra,88(sp) + 142: 6446 ld s0,80(sp) + 144: 64a6 ld s1,72(sp) + 146: 6906 ld s2,64(sp) + 148: 79e2 ld s3,56(sp) + 14a: 7a42 ld s4,48(sp) + 14c: 7aa2 ld s5,40(sp) + 14e: 7b02 ld s6,32(sp) + 150: 6be2 ld s7,24(sp) + 152: 6125 addi sp,sp,96 + 154: 8082 ret + +0000000000000156 : + +int +stat(const char *n, struct stat *st) +{ + 156: 1101 addi sp,sp,-32 + 158: ec06 sd ra,24(sp) + 15a: e822 sd s0,16(sp) + 15c: e04a sd s2,0(sp) + 15e: 1000 addi s0,sp,32 + 160: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 162: 4581 li a1,0 + 164: 18e000ef jal 2f2 + if(fd < 0) + 168: 02054263 bltz a0,18c + 16c: e426 sd s1,8(sp) + 16e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 170: 85ca mv a1,s2 + 172: 198000ef jal 30a + 176: 892a mv s2,a0 + close(fd); + 178: 8526 mv a0,s1 + 17a: 160000ef jal 2da + return r; + 17e: 64a2 ld s1,8(sp) +} + 180: 854a mv a0,s2 + 182: 60e2 ld ra,24(sp) + 184: 6442 ld s0,16(sp) + 186: 6902 ld s2,0(sp) + 188: 6105 addi sp,sp,32 + 18a: 8082 ret + return -1; + 18c: 597d li s2,-1 + 18e: bfcd j 180 + +0000000000000190 : + +int +atoi(const char *s) +{ + 190: 1141 addi sp,sp,-16 + 192: e422 sd s0,8(sp) + 194: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 196: 00054683 lbu a3,0(a0) + 19a: fd06879b addiw a5,a3,-48 + 19e: 0ff7f793 zext.b a5,a5 + 1a2: 4625 li a2,9 + 1a4: 02f66863 bltu a2,a5,1d4 + 1a8: 872a mv a4,a0 + n = 0; + 1aa: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1ac: 0705 addi a4,a4,1 + 1ae: 0025179b slliw a5,a0,0x2 + 1b2: 9fa9 addw a5,a5,a0 + 1b4: 0017979b slliw a5,a5,0x1 + 1b8: 9fb5 addw a5,a5,a3 + 1ba: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1be: 00074683 lbu a3,0(a4) + 1c2: fd06879b addiw a5,a3,-48 + 1c6: 0ff7f793 zext.b a5,a5 + 1ca: fef671e3 bgeu a2,a5,1ac + return n; +} + 1ce: 6422 ld s0,8(sp) + 1d0: 0141 addi sp,sp,16 + 1d2: 8082 ret + n = 0; + 1d4: 4501 li a0,0 + 1d6: bfe5 j 1ce + +00000000000001d8 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 1d8: 1141 addi sp,sp,-16 + 1da: e422 sd s0,8(sp) + 1dc: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 1de: 02b57463 bgeu a0,a1,206 + while(n-- > 0) + 1e2: 00c05f63 blez a2,200 + 1e6: 1602 slli a2,a2,0x20 + 1e8: 9201 srli a2,a2,0x20 + 1ea: 00c507b3 add a5,a0,a2 + dst = vdst; + 1ee: 872a mv a4,a0 + *dst++ = *src++; + 1f0: 0585 addi a1,a1,1 + 1f2: 0705 addi a4,a4,1 + 1f4: fff5c683 lbu a3,-1(a1) + 1f8: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 1fc: fef71ae3 bne a4,a5,1f0 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 200: 6422 ld s0,8(sp) + 202: 0141 addi sp,sp,16 + 204: 8082 ret + dst += n; + 206: 00c50733 add a4,a0,a2 + src += n; + 20a: 95b2 add a1,a1,a2 + while(n-- > 0) + 20c: fec05ae3 blez a2,200 + 210: fff6079b addiw a5,a2,-1 + 214: 1782 slli a5,a5,0x20 + 216: 9381 srli a5,a5,0x20 + 218: fff7c793 not a5,a5 + 21c: 97ba add a5,a5,a4 + *--dst = *--src; + 21e: 15fd addi a1,a1,-1 + 220: 177d addi a4,a4,-1 + 222: 0005c683 lbu a3,0(a1) + 226: 00d70023 sb a3,0(a4) + while(n-- > 0) + 22a: fee79ae3 bne a5,a4,21e + 22e: bfc9 j 200 + +0000000000000230 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 230: 1141 addi sp,sp,-16 + 232: e422 sd s0,8(sp) + 234: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 236: ca05 beqz a2,266 + 238: fff6069b addiw a3,a2,-1 + 23c: 1682 slli a3,a3,0x20 + 23e: 9281 srli a3,a3,0x20 + 240: 0685 addi a3,a3,1 + 242: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 244: 00054783 lbu a5,0(a0) + 248: 0005c703 lbu a4,0(a1) + 24c: 00e79863 bne a5,a4,25c + return *p1 - *p2; + } + p1++; + 250: 0505 addi a0,a0,1 + p2++; + 252: 0585 addi a1,a1,1 + while (n-- > 0) { + 254: fed518e3 bne a0,a3,244 + } + return 0; + 258: 4501 li a0,0 + 25a: a019 j 260 + return *p1 - *p2; + 25c: 40e7853b subw a0,a5,a4 +} + 260: 6422 ld s0,8(sp) + 262: 0141 addi sp,sp,16 + 264: 8082 ret + return 0; + 266: 4501 li a0,0 + 268: bfe5 j 260 + +000000000000026a : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 26a: 1141 addi sp,sp,-16 + 26c: e406 sd ra,8(sp) + 26e: e022 sd s0,0(sp) + 270: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 272: f67ff0ef jal 1d8 +} + 276: 60a2 ld ra,8(sp) + 278: 6402 ld s0,0(sp) + 27a: 0141 addi sp,sp,16 + 27c: 8082 ret + +000000000000027e : + +char * +sbrk(int n) { + 27e: 1141 addi sp,sp,-16 + 280: e406 sd ra,8(sp) + 282: e022 sd s0,0(sp) + 284: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 286: 4585 li a1,1 + 288: 0b2000ef jal 33a +} + 28c: 60a2 ld ra,8(sp) + 28e: 6402 ld s0,0(sp) + 290: 0141 addi sp,sp,16 + 292: 8082 ret + +0000000000000294 : + +char * +sbrklazy(int n) { + 294: 1141 addi sp,sp,-16 + 296: e406 sd ra,8(sp) + 298: e022 sd s0,0(sp) + 29a: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 29c: 4589 li a1,2 + 29e: 09c000ef jal 33a +} + 2a2: 60a2 ld ra,8(sp) + 2a4: 6402 ld s0,0(sp) + 2a6: 0141 addi sp,sp,16 + 2a8: 8082 ret + +00000000000002aa : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2aa: 4885 li a7,1 + ecall + 2ac: 00000073 ecall + ret + 2b0: 8082 ret + +00000000000002b2 : +.global exit +exit: + li a7, SYS_exit + 2b2: 4889 li a7,2 + ecall + 2b4: 00000073 ecall + ret + 2b8: 8082 ret + +00000000000002ba : +.global wait +wait: + li a7, SYS_wait + 2ba: 488d li a7,3 + ecall + 2bc: 00000073 ecall + ret + 2c0: 8082 ret + +00000000000002c2 : +.global pipe +pipe: + li a7, SYS_pipe + 2c2: 4891 li a7,4 + ecall + 2c4: 00000073 ecall + ret + 2c8: 8082 ret + +00000000000002ca : +.global read +read: + li a7, SYS_read + 2ca: 4895 li a7,5 + ecall + 2cc: 00000073 ecall + ret + 2d0: 8082 ret + +00000000000002d2 : +.global write +write: + li a7, SYS_write + 2d2: 48c1 li a7,16 + ecall + 2d4: 00000073 ecall + ret + 2d8: 8082 ret + +00000000000002da : +.global close +close: + li a7, SYS_close + 2da: 48d5 li a7,21 + ecall + 2dc: 00000073 ecall + ret + 2e0: 8082 ret + +00000000000002e2 : +.global kill +kill: + li a7, SYS_kill + 2e2: 4899 li a7,6 + ecall + 2e4: 00000073 ecall + ret + 2e8: 8082 ret + +00000000000002ea : +.global exec +exec: + li a7, SYS_exec + 2ea: 489d li a7,7 + ecall + 2ec: 00000073 ecall + ret + 2f0: 8082 ret + +00000000000002f2 : +.global open +open: + li a7, SYS_open + 2f2: 48bd li a7,15 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa : +.global mknod +mknod: + li a7, SYS_mknod + 2fa: 48c5 li a7,17 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 : +.global unlink +unlink: + li a7, SYS_unlink + 302: 48c9 li a7,18 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a : +.global fstat +fstat: + li a7, SYS_fstat + 30a: 48a1 li a7,8 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 : +.global link +link: + li a7, SYS_link + 312: 48cd li a7,19 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a : +.global mkdir +mkdir: + li a7, SYS_mkdir + 31a: 48d1 li a7,20 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 : +.global chdir +chdir: + li a7, SYS_chdir + 322: 48a5 li a7,9 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a : +.global dup +dup: + li a7, SYS_dup + 32a: 48a9 li a7,10 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 : +.global getpid +getpid: + li a7, SYS_getpid + 332: 48ad li a7,11 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 33a: 48b1 li a7,12 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 : +.global pause +pause: + li a7, SYS_pause + 342: 48b5 li a7,13 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a : +.global uptime +uptime: + li a7, SYS_uptime + 34a: 48b9 li a7,14 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 : +.global getprocsinfo +getprocsinfo: + li a7, SYS_getprocsinfo + 352: 48d9 li a7,22 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a : +.global getppid +getppid: + li a7, SYS_getppid + 35a: 48dd li a7,23 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 : +.global sleep2 +sleep2: + li a7, SYS_sleep2 + 362: 48e1 li a7,24 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 36a: 1101 addi sp,sp,-32 + 36c: ec06 sd ra,24(sp) + 36e: e822 sd s0,16(sp) + 370: 1000 addi s0,sp,32 + 372: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 376: 4605 li a2,1 + 378: fef40593 addi a1,s0,-17 + 37c: f57ff0ef jal 2d2 +} + 380: 60e2 ld ra,24(sp) + 382: 6442 ld s0,16(sp) + 384: 6105 addi sp,sp,32 + 386: 8082 ret + +0000000000000388 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 388: 715d addi sp,sp,-80 + 38a: e486 sd ra,72(sp) + 38c: e0a2 sd s0,64(sp) + 38e: f84a sd s2,48(sp) + 390: 0880 addi s0,sp,80 + 392: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 394: c299 beqz a3,39a + 396: 0805c363 bltz a1,41c + neg = 0; + 39a: 4881 li a7,0 + 39c: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3a0: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3a2: 00000517 auipc a0,0x0 + 3a6: 50650513 addi a0,a0,1286 # 8a8 + 3aa: 883e mv a6,a5 + 3ac: 2785 addiw a5,a5,1 + 3ae: 02c5f733 remu a4,a1,a2 + 3b2: 972a add a4,a4,a0 + 3b4: 00074703 lbu a4,0(a4) + 3b8: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3bc: 872e mv a4,a1 + 3be: 02c5d5b3 divu a1,a1,a2 + 3c2: 0685 addi a3,a3,1 + 3c4: fec773e3 bgeu a4,a2,3aa + if(neg) + 3c8: 00088b63 beqz a7,3de + buf[i++] = '-'; + 3cc: fd078793 addi a5,a5,-48 + 3d0: 97a2 add a5,a5,s0 + 3d2: 02d00713 li a4,45 + 3d6: fee78423 sb a4,-24(a5) + 3da: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 3de: 02f05a63 blez a5,412 + 3e2: fc26 sd s1,56(sp) + 3e4: f44e sd s3,40(sp) + 3e6: fb840713 addi a4,s0,-72 + 3ea: 00f704b3 add s1,a4,a5 + 3ee: fff70993 addi s3,a4,-1 + 3f2: 99be add s3,s3,a5 + 3f4: 37fd addiw a5,a5,-1 + 3f6: 1782 slli a5,a5,0x20 + 3f8: 9381 srli a5,a5,0x20 + 3fa: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 3fe: fff4c583 lbu a1,-1(s1) + 402: 854a mv a0,s2 + 404: f67ff0ef jal 36a + while(--i >= 0) + 408: 14fd addi s1,s1,-1 + 40a: ff349ae3 bne s1,s3,3fe + 40e: 74e2 ld s1,56(sp) + 410: 79a2 ld s3,40(sp) +} + 412: 60a6 ld ra,72(sp) + 414: 6406 ld s0,64(sp) + 416: 7942 ld s2,48(sp) + 418: 6161 addi sp,sp,80 + 41a: 8082 ret + x = -xx; + 41c: 40b005b3 neg a1,a1 + neg = 1; + 420: 4885 li a7,1 + x = -xx; + 422: bfad j 39c + +0000000000000424 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 424: 711d addi sp,sp,-96 + 426: ec86 sd ra,88(sp) + 428: e8a2 sd s0,80(sp) + 42a: e0ca sd s2,64(sp) + 42c: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 42e: 0005c903 lbu s2,0(a1) + 432: 28090663 beqz s2,6be + 436: e4a6 sd s1,72(sp) + 438: fc4e sd s3,56(sp) + 43a: f852 sd s4,48(sp) + 43c: f456 sd s5,40(sp) + 43e: f05a sd s6,32(sp) + 440: ec5e sd s7,24(sp) + 442: e862 sd s8,16(sp) + 444: e466 sd s9,8(sp) + 446: 8b2a mv s6,a0 + 448: 8a2e mv s4,a1 + 44a: 8bb2 mv s7,a2 + state = 0; + 44c: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 44e: 4481 li s1,0 + 450: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 452: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 456: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 45a: 06c00c93 li s9,108 + 45e: a005 j 47e + putc(fd, c0); + 460: 85ca mv a1,s2 + 462: 855a mv a0,s6 + 464: f07ff0ef jal 36a + 468: a019 j 46e + } else if(state == '%'){ + 46a: 03598263 beq s3,s5,48e + for(i = 0; fmt[i]; i++){ + 46e: 2485 addiw s1,s1,1 + 470: 8726 mv a4,s1 + 472: 009a07b3 add a5,s4,s1 + 476: 0007c903 lbu s2,0(a5) + 47a: 22090a63 beqz s2,6ae + c0 = fmt[i] & 0xff; + 47e: 0009079b sext.w a5,s2 + if(state == 0){ + 482: fe0994e3 bnez s3,46a + if(c0 == '%'){ + 486: fd579de3 bne a5,s5,460 + state = '%'; + 48a: 89be mv s3,a5 + 48c: b7cd j 46e + if(c0) c1 = fmt[i+1] & 0xff; + 48e: 00ea06b3 add a3,s4,a4 + 492: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 496: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 498: c681 beqz a3,4a0 + 49a: 9752 add a4,a4,s4 + 49c: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4a0: 05878363 beq a5,s8,4e6 + } else if(c0 == 'l' && c1 == 'd'){ + 4a4: 05978d63 beq a5,s9,4fe + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4a8: 07500713 li a4,117 + 4ac: 0ee78763 beq a5,a4,59a + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4b0: 07800713 li a4,120 + 4b4: 12e78963 beq a5,a4,5e6 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4b8: 07000713 li a4,112 + 4bc: 14e78e63 beq a5,a4,618 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4c0: 06300713 li a4,99 + 4c4: 18e78e63 beq a5,a4,660 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4c8: 07300713 li a4,115 + 4cc: 1ae78463 beq a5,a4,674 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4d0: 02500713 li a4,37 + 4d4: 04e79563 bne a5,a4,51e + putc(fd, '%'); + 4d8: 02500593 li a1,37 + 4dc: 855a mv a0,s6 + 4de: e8dff0ef jal 36a + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 4e2: 4981 li s3,0 + 4e4: b769 j 46e + printint(fd, va_arg(ap, int), 10, 1); + 4e6: 008b8913 addi s2,s7,8 + 4ea: 4685 li a3,1 + 4ec: 4629 li a2,10 + 4ee: 000ba583 lw a1,0(s7) + 4f2: 855a mv a0,s6 + 4f4: e95ff0ef jal 388 + 4f8: 8bca mv s7,s2 + state = 0; + 4fa: 4981 li s3,0 + 4fc: bf8d j 46e + } else if(c0 == 'l' && c1 == 'd'){ + 4fe: 06400793 li a5,100 + 502: 02f68963 beq a3,a5,534 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 506: 06c00793 li a5,108 + 50a: 04f68263 beq a3,a5,54e + } else if(c0 == 'l' && c1 == 'u'){ + 50e: 07500793 li a5,117 + 512: 0af68063 beq a3,a5,5b2 + } else if(c0 == 'l' && c1 == 'x'){ + 516: 07800793 li a5,120 + 51a: 0ef68263 beq a3,a5,5fe + putc(fd, '%'); + 51e: 02500593 li a1,37 + 522: 855a mv a0,s6 + 524: e47ff0ef jal 36a + putc(fd, c0); + 528: 85ca mv a1,s2 + 52a: 855a mv a0,s6 + 52c: e3fff0ef jal 36a + state = 0; + 530: 4981 li s3,0 + 532: bf35 j 46e + printint(fd, va_arg(ap, uint64), 10, 1); + 534: 008b8913 addi s2,s7,8 + 538: 4685 li a3,1 + 53a: 4629 li a2,10 + 53c: 000bb583 ld a1,0(s7) + 540: 855a mv a0,s6 + 542: e47ff0ef jal 388 + i += 1; + 546: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 548: 8bca mv s7,s2 + state = 0; + 54a: 4981 li s3,0 + i += 1; + 54c: b70d j 46e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 54e: 06400793 li a5,100 + 552: 02f60763 beq a2,a5,580 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 556: 07500793 li a5,117 + 55a: 06f60963 beq a2,a5,5cc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 55e: 07800793 li a5,120 + 562: faf61ee3 bne a2,a5,51e + printint(fd, va_arg(ap, uint64), 16, 0); + 566: 008b8913 addi s2,s7,8 + 56a: 4681 li a3,0 + 56c: 4641 li a2,16 + 56e: 000bb583 ld a1,0(s7) + 572: 855a mv a0,s6 + 574: e15ff0ef jal 388 + i += 2; + 578: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 57a: 8bca mv s7,s2 + state = 0; + 57c: 4981 li s3,0 + i += 2; + 57e: bdc5 j 46e + printint(fd, va_arg(ap, uint64), 10, 1); + 580: 008b8913 addi s2,s7,8 + 584: 4685 li a3,1 + 586: 4629 li a2,10 + 588: 000bb583 ld a1,0(s7) + 58c: 855a mv a0,s6 + 58e: dfbff0ef jal 388 + i += 2; + 592: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 594: 8bca mv s7,s2 + state = 0; + 596: 4981 li s3,0 + i += 2; + 598: bdd9 j 46e + printint(fd, va_arg(ap, uint32), 10, 0); + 59a: 008b8913 addi s2,s7,8 + 59e: 4681 li a3,0 + 5a0: 4629 li a2,10 + 5a2: 000be583 lwu a1,0(s7) + 5a6: 855a mv a0,s6 + 5a8: de1ff0ef jal 388 + 5ac: 8bca mv s7,s2 + state = 0; + 5ae: 4981 li s3,0 + 5b0: bd7d j 46e + printint(fd, va_arg(ap, uint64), 10, 0); + 5b2: 008b8913 addi s2,s7,8 + 5b6: 4681 li a3,0 + 5b8: 4629 li a2,10 + 5ba: 000bb583 ld a1,0(s7) + 5be: 855a mv a0,s6 + 5c0: dc9ff0ef jal 388 + i += 1; + 5c4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5c6: 8bca mv s7,s2 + state = 0; + 5c8: 4981 li s3,0 + i += 1; + 5ca: b555 j 46e + printint(fd, va_arg(ap, uint64), 10, 0); + 5cc: 008b8913 addi s2,s7,8 + 5d0: 4681 li a3,0 + 5d2: 4629 li a2,10 + 5d4: 000bb583 ld a1,0(s7) + 5d8: 855a mv a0,s6 + 5da: dafff0ef jal 388 + i += 2; + 5de: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5e0: 8bca mv s7,s2 + state = 0; + 5e2: 4981 li s3,0 + i += 2; + 5e4: b569 j 46e + printint(fd, va_arg(ap, uint32), 16, 0); + 5e6: 008b8913 addi s2,s7,8 + 5ea: 4681 li a3,0 + 5ec: 4641 li a2,16 + 5ee: 000be583 lwu a1,0(s7) + 5f2: 855a mv a0,s6 + 5f4: d95ff0ef jal 388 + 5f8: 8bca mv s7,s2 + state = 0; + 5fa: 4981 li s3,0 + 5fc: bd8d j 46e + printint(fd, va_arg(ap, uint64), 16, 0); + 5fe: 008b8913 addi s2,s7,8 + 602: 4681 li a3,0 + 604: 4641 li a2,16 + 606: 000bb583 ld a1,0(s7) + 60a: 855a mv a0,s6 + 60c: d7dff0ef jal 388 + i += 1; + 610: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 612: 8bca mv s7,s2 + state = 0; + 614: 4981 li s3,0 + i += 1; + 616: bda1 j 46e + 618: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 61a: 008b8d13 addi s10,s7,8 + 61e: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 622: 03000593 li a1,48 + 626: 855a mv a0,s6 + 628: d43ff0ef jal 36a + putc(fd, 'x'); + 62c: 07800593 li a1,120 + 630: 855a mv a0,s6 + 632: d39ff0ef jal 36a + 636: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 638: 00000b97 auipc s7,0x0 + 63c: 270b8b93 addi s7,s7,624 # 8a8 + 640: 03c9d793 srli a5,s3,0x3c + 644: 97de add a5,a5,s7 + 646: 0007c583 lbu a1,0(a5) + 64a: 855a mv a0,s6 + 64c: d1fff0ef jal 36a + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 650: 0992 slli s3,s3,0x4 + 652: 397d addiw s2,s2,-1 + 654: fe0916e3 bnez s2,640 + printptr(fd, va_arg(ap, uint64)); + 658: 8bea mv s7,s10 + state = 0; + 65a: 4981 li s3,0 + 65c: 6d02 ld s10,0(sp) + 65e: bd01 j 46e + putc(fd, va_arg(ap, uint32)); + 660: 008b8913 addi s2,s7,8 + 664: 000bc583 lbu a1,0(s7) + 668: 855a mv a0,s6 + 66a: d01ff0ef jal 36a + 66e: 8bca mv s7,s2 + state = 0; + 670: 4981 li s3,0 + 672: bbf5 j 46e + if((s = va_arg(ap, char*)) == 0) + 674: 008b8993 addi s3,s7,8 + 678: 000bb903 ld s2,0(s7) + 67c: 00090f63 beqz s2,69a + for(; *s; s++) + 680: 00094583 lbu a1,0(s2) + 684: c195 beqz a1,6a8 + putc(fd, *s); + 686: 855a mv a0,s6 + 688: ce3ff0ef jal 36a + for(; *s; s++) + 68c: 0905 addi s2,s2,1 + 68e: 00094583 lbu a1,0(s2) + 692: f9f5 bnez a1,686 + if((s = va_arg(ap, char*)) == 0) + 694: 8bce mv s7,s3 + state = 0; + 696: 4981 li s3,0 + 698: bbd9 j 46e + s = "(null)"; + 69a: 00000917 auipc s2,0x0 + 69e: 20690913 addi s2,s2,518 # 8a0 + for(; *s; s++) + 6a2: 02800593 li a1,40 + 6a6: b7c5 j 686 + if((s = va_arg(ap, char*)) == 0) + 6a8: 8bce mv s7,s3 + state = 0; + 6aa: 4981 li s3,0 + 6ac: b3c9 j 46e + 6ae: 64a6 ld s1,72(sp) + 6b0: 79e2 ld s3,56(sp) + 6b2: 7a42 ld s4,48(sp) + 6b4: 7aa2 ld s5,40(sp) + 6b6: 7b02 ld s6,32(sp) + 6b8: 6be2 ld s7,24(sp) + 6ba: 6c42 ld s8,16(sp) + 6bc: 6ca2 ld s9,8(sp) + } + } +} + 6be: 60e6 ld ra,88(sp) + 6c0: 6446 ld s0,80(sp) + 6c2: 6906 ld s2,64(sp) + 6c4: 6125 addi sp,sp,96 + 6c6: 8082 ret + +00000000000006c8 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6c8: 715d addi sp,sp,-80 + 6ca: ec06 sd ra,24(sp) + 6cc: e822 sd s0,16(sp) + 6ce: 1000 addi s0,sp,32 + 6d0: e010 sd a2,0(s0) + 6d2: e414 sd a3,8(s0) + 6d4: e818 sd a4,16(s0) + 6d6: ec1c sd a5,24(s0) + 6d8: 03043023 sd a6,32(s0) + 6dc: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6e0: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6e4: 8622 mv a2,s0 + 6e6: d3fff0ef jal 424 +} + 6ea: 60e2 ld ra,24(sp) + 6ec: 6442 ld s0,16(sp) + 6ee: 6161 addi sp,sp,80 + 6f0: 8082 ret + +00000000000006f2 : + +void +printf(const char *fmt, ...) +{ + 6f2: 711d addi sp,sp,-96 + 6f4: ec06 sd ra,24(sp) + 6f6: e822 sd s0,16(sp) + 6f8: 1000 addi s0,sp,32 + 6fa: e40c sd a1,8(s0) + 6fc: e810 sd a2,16(s0) + 6fe: ec14 sd a3,24(s0) + 700: f018 sd a4,32(s0) + 702: f41c sd a5,40(s0) + 704: 03043823 sd a6,48(s0) + 708: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 70c: 00840613 addi a2,s0,8 + 710: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 714: 85aa mv a1,a0 + 716: 4505 li a0,1 + 718: d0dff0ef jal 424 +} + 71c: 60e2 ld ra,24(sp) + 71e: 6442 ld s0,16(sp) + 720: 6125 addi sp,sp,96 + 722: 8082 ret + +0000000000000724 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 724: 1141 addi sp,sp,-16 + 726: e422 sd s0,8(sp) + 728: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 72a: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 72e: 00001797 auipc a5,0x1 + 732: 8d27b783 ld a5,-1838(a5) # 1000 + 736: a02d j 760 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + break; + if(bp + bp->s.size == p->s.ptr){ + bp->s.size += p->s.ptr->s.size; + 738: 4618 lw a4,8(a2) + 73a: 9f2d addw a4,a4,a1 + 73c: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 740: 6398 ld a4,0(a5) + 742: 6310 ld a2,0(a4) + 744: a83d j 782 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 746: ff852703 lw a4,-8(a0) + 74a: 9f31 addw a4,a4,a2 + 74c: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 74e: ff053683 ld a3,-16(a0) + 752: a091 j 796 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 754: 6398 ld a4,0(a5) + 756: 00e7e463 bltu a5,a4,75e + 75a: 00e6ea63 bltu a3,a4,76e +{ + 75e: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 760: fed7fae3 bgeu a5,a3,754 + 764: 6398 ld a4,0(a5) + 766: 00e6e463 bltu a3,a4,76e + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 76a: fee7eae3 bltu a5,a4,75e + if(bp + bp->s.size == p->s.ptr){ + 76e: ff852583 lw a1,-8(a0) + 772: 6390 ld a2,0(a5) + 774: 02059813 slli a6,a1,0x20 + 778: 01c85713 srli a4,a6,0x1c + 77c: 9736 add a4,a4,a3 + 77e: fae60de3 beq a2,a4,738 + bp->s.ptr = p->s.ptr->s.ptr; + 782: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 786: 4790 lw a2,8(a5) + 788: 02061593 slli a1,a2,0x20 + 78c: 01c5d713 srli a4,a1,0x1c + 790: 973e add a4,a4,a5 + 792: fae68ae3 beq a3,a4,746 + p->s.ptr = bp->s.ptr; + 796: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 798: 00001717 auipc a4,0x1 + 79c: 86f73423 sd a5,-1944(a4) # 1000 +} + 7a0: 6422 ld s0,8(sp) + 7a2: 0141 addi sp,sp,16 + 7a4: 8082 ret + +00000000000007a6 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7a6: 7139 addi sp,sp,-64 + 7a8: fc06 sd ra,56(sp) + 7aa: f822 sd s0,48(sp) + 7ac: f426 sd s1,40(sp) + 7ae: ec4e sd s3,24(sp) + 7b0: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7b2: 02051493 slli s1,a0,0x20 + 7b6: 9081 srli s1,s1,0x20 + 7b8: 04bd addi s1,s1,15 + 7ba: 8091 srli s1,s1,0x4 + 7bc: 0014899b addiw s3,s1,1 + 7c0: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7c2: 00001517 auipc a0,0x1 + 7c6: 83e53503 ld a0,-1986(a0) # 1000 + 7ca: c915 beqz a0,7fe + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7cc: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7ce: 4798 lw a4,8(a5) + 7d0: 08977a63 bgeu a4,s1,864 + 7d4: f04a sd s2,32(sp) + 7d6: e852 sd s4,16(sp) + 7d8: e456 sd s5,8(sp) + 7da: e05a sd s6,0(sp) + if(nu < 4096) + 7dc: 8a4e mv s4,s3 + 7de: 0009871b sext.w a4,s3 + 7e2: 6685 lui a3,0x1 + 7e4: 00d77363 bgeu a4,a3,7ea + 7e8: 6a05 lui s4,0x1 + 7ea: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7ee: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7f2: 00001917 auipc s2,0x1 + 7f6: 80e90913 addi s2,s2,-2034 # 1000 + if(p == SBRK_ERROR) + 7fa: 5afd li s5,-1 + 7fc: a081 j 83c + 7fe: f04a sd s2,32(sp) + 800: e852 sd s4,16(sp) + 802: e456 sd s5,8(sp) + 804: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 806: 00001797 auipc a5,0x1 + 80a: 80a78793 addi a5,a5,-2038 # 1010 + 80e: 00000717 auipc a4,0x0 + 812: 7ef73923 sd a5,2034(a4) # 1000 + 816: e39c sd a5,0(a5) + base.s.size = 0; + 818: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 81c: b7c1 j 7dc + prevp->s.ptr = p->s.ptr; + 81e: 6398 ld a4,0(a5) + 820: e118 sd a4,0(a0) + 822: a8a9 j 87c + hp->s.size = nu; + 824: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 828: 0541 addi a0,a0,16 + 82a: efbff0ef jal 724 + return freep; + 82e: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 832: c12d beqz a0,894 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 834: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 836: 4798 lw a4,8(a5) + 838: 02977263 bgeu a4,s1,85c + if(p == freep) + 83c: 00093703 ld a4,0(s2) + 840: 853e mv a0,a5 + 842: fef719e3 bne a4,a5,834 + p = sbrk(nu * sizeof(Header)); + 846: 8552 mv a0,s4 + 848: a37ff0ef jal 27e + if(p == SBRK_ERROR) + 84c: fd551ce3 bne a0,s5,824 + return 0; + 850: 4501 li a0,0 + 852: 7902 ld s2,32(sp) + 854: 6a42 ld s4,16(sp) + 856: 6aa2 ld s5,8(sp) + 858: 6b02 ld s6,0(sp) + 85a: a03d j 888 + 85c: 7902 ld s2,32(sp) + 85e: 6a42 ld s4,16(sp) + 860: 6aa2 ld s5,8(sp) + 862: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 864: fae48de3 beq s1,a4,81e + p->s.size -= nunits; + 868: 4137073b subw a4,a4,s3 + 86c: c798 sw a4,8(a5) + p += p->s.size; + 86e: 02071693 slli a3,a4,0x20 + 872: 01c6d713 srli a4,a3,0x1c + 876: 97ba add a5,a5,a4 + p->s.size = nunits; + 878: 0137a423 sw s3,8(a5) + freep = prevp; + 87c: 00000717 auipc a4,0x0 + 880: 78a73223 sd a0,1924(a4) # 1000 + return (void*)(p + 1); + 884: 01078513 addi a0,a5,16 + } +} + 888: 70e2 ld ra,56(sp) + 88a: 7442 ld s0,48(sp) + 88c: 74a2 ld s1,40(sp) + 88e: 69e2 ld s3,24(sp) + 890: 6121 addi sp,sp,64 + 892: 8082 ret + 894: 7902 ld s2,32(sp) + 896: 6a42 ld s4,16(sp) + 898: 6aa2 ld s5,8(sp) + 89a: 6b02 ld s6,0(sp) + 89c: b7f5 j 888 diff --git a/user/zombie.c b/G12_Project1_xv6CustomizeSystemCalls/user/zombie.c similarity index 100% rename from user/zombie.c rename to G12_Project1_xv6CustomizeSystemCalls/user/zombie.c diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/zombie.d b/G12_Project1_xv6CustomizeSystemCalls/user/zombie.d new file mode 100644 index 0000000000..588534d858 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/zombie.d @@ -0,0 +1 @@ +user/zombie.o: user/zombie.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/zombie.o b/G12_Project1_xv6CustomizeSystemCalls/user/zombie.o new file mode 100644 index 0000000000..ed2eee82e8 Binary files /dev/null and b/G12_Project1_xv6CustomizeSystemCalls/user/zombie.o differ diff --git a/G12_Project1_xv6CustomizeSystemCalls/user/zombie.sym b/G12_Project1_xv6CustomizeSystemCalls/user/zombie.sym new file mode 100644 index 0000000000..f353263022 --- /dev/null +++ b/G12_Project1_xv6CustomizeSystemCalls/user/zombie.sym @@ -0,0 +1,68 @@ +0000000000000000 .text +00000000000008a0 .rodata +00000000000008c0 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 zombie.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000036a putc +0000000000000388 printint +00000000000008a8 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +000000000000002e strcpy +0000000000000342 pause +00000000000006f2 printf +000000000000033a sys_sbrk +00000000000001d8 memmove +00000000000002fa mknod +00000000000000e6 gets +0000000000000332 getpid +000000000000026a memcpy +00000000000007a6 malloc +0000000000000294 sbrklazy +00000000000002c2 pipe +00000000000002d2 write +000000000000030a fstat +00000000000006c8 fprintf +00000000000002e2 kill +0000000000000424 vprintf +0000000000000322 chdir +00000000000002ea exec +00000000000002ba wait +0000000000000352 getprocsinfo +00000000000002ca read +0000000000000302 unlink +0000000000000230 memcmp +00000000000002aa fork +000000000000027e sbrk +000000000000034a uptime +00000000000000a0 memset +0000000000000000 main +000000000000035a getppid +000000000000004a strcmp +000000000000032a dup +0000000000000156 stat +0000000000000362 sleep2 +0000000000000312 link +00000000000002b2 exit +000000000000001e start +0000000000000190 atoi +0000000000000076 strlen +00000000000002f2 open +00000000000000c2 strchr +000000000000031a mkdir +00000000000002da close +0000000000000724 free diff --git a/G12_Project2_2/LICENSE b/G12_Project2_2/LICENSE new file mode 100644 index 0000000000..af50cb2508 --- /dev/null +++ b/G12_Project2_2/LICENSE @@ -0,0 +1,24 @@ +The xv6 software is: + +Copyright (c) 2006-2024 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. + diff --git a/Makefile b/G12_Project2_2/Makefile similarity index 100% rename from Makefile rename to G12_Project2_2/Makefile diff --git a/G12_Project2_2/README b/G12_Project2_2/README new file mode 100644 index 0000000000..2f6c48d9b8 --- /dev/null +++ b/G12_Project2_2/README @@ -0,0 +1,48 @@ +xv6 is a re-implementation of Dennis Ritchie's and Ken Thompson's Unix +Version 6 (v6). xv6 loosely follows the structure and style of v6, +but is implemented for a modern RISC-V multiprocessor using ANSI C. + +ACKNOWLEDGMENTS + +xv6 is inspired by John Lions's Commentary on UNIX 6th Edition (Peer +to Peer Communications; ISBN: 1-57398-013-7; 1st edition (June 14, +2000)). See also https://pdos.csail.mit.edu/6.1810/, which provides +pointers to on-line resources for v6. + +The following people have made contributions: Russ Cox (context switching, +locking), Cliff Frey (MP), Xiao Yu (MP), Nickolai Zeldovich, and Austin +Clements. + +We are also grateful for the bug reports and patches contributed by +Abhinavpatel00, Takahiro Aoyagi, Marcelo Arroyo, Hirbod Behnam, Silas +Boyd-Wickizer, Anton Burtsev, carlclone, Ian Chen, clivezeng, Dan +Cross, Cody Cutler, Mike CAT, Tej Chajed, Asami Doi,Wenyang Duan, +echtwerner, eyalz800, Nelson Elhage, Saar Ettinger, Alice Ferrazzi, +Nathaniel Filardo, flespark, Peter Froehlich, Yakir Goaron, Shivam +Handa, Matt Harvey, Bryan Henry, jaichenhengjie, Jim Huang, Matúš +Jókay, John Jolly, Alexander Kapshuk, Anders Kaseorg, kehao95, +Wolfgang Keller, Jungwoo Kim, Jonathan Kimmitt, Eddie Kohler, Vadim +Kolontsov, Austin Liew, l0stman, Pavan Maddamsetti, Imbar Marinescu, +Yandong Mao, Matan Shabtay, Hitoshi Mitake, Carmi Merimovich, +mes900903, Mark Morrissey, mtasm, Joel Nider, Hayato Ohhashi, +OptimisticSide, papparapa, phosphagos, Harry Porter, Greg Price, Zheng +qhuo, Quancheng, RayAndrew, Jude Rich, segfault, Ayan Shafqat, Eldar +Sehayek, Yongming Shen, Fumiya Shigemitsu, snoire, Taojie, Cam Tenny, +tyfkda, Warren Toomey, Stephen Tu, Alissa Tung, Rafael Ubal, unicornx, +Amane Uehara, Pablo Ventura, Luc Videau, Xi Wang, WaheedHafez, Keiichi +Watanabe, Lucas Wolf, Nicolas Wolovick, wxdao, Grant Wu, x653, Andy +Zhang, Jindong Zhang, Icenowy Zheng, ZhUyU1997, and Zou Chang Wei. + +ERROR REPORTS + +Please send errors and suggestions to Frans Kaashoek and Robert Morris +(kaashoek,rtm@mit.edu). The main purpose of xv6 is as a teaching +operating system for MIT's 6.1810, so we are more interested in +simplifications and clarifications than new features. + +BUILDING AND RUNNING XV6 + +You will need a RISC-V "newlib" tool chain from +https://github.com/riscv/riscv-gnu-toolchain, and qemu compiled for +riscv64-softmmu. Once they are installed, and in your shell +search path, you can run "make qemu". diff --git a/G12_Project2_2/fs.img b/G12_Project2_2/fs.img new file mode 100644 index 0000000000..b47a31d53e Binary files /dev/null and b/G12_Project2_2/fs.img differ diff --git a/G12_Project2_2/kernel/bio.c b/G12_Project2_2/kernel/bio.c new file mode 100644 index 0000000000..60d91a6d74 --- /dev/null +++ b/G12_Project2_2/kernel/bio.c @@ -0,0 +1,153 @@ +// Buffer cache. +// +// The buffer cache is a linked list of buf structures holding +// cached copies of disk block contents. Caching disk blocks +// in memory reduces the number of disk reads and also provides +// a synchronization point for disk blocks used by multiple processes. +// +// Interface: +// * To get a buffer for a particular disk block, call bread. +// * After changing buffer data, call bwrite to write it to disk. +// * When done with the buffer, call brelse. +// * Do not use the buffer after calling brelse. +// * Only one process at a time can use a buffer, +// so do not keep them longer than necessary. + + +#include "types.h" +#include "param.h" +#include "spinlock.h" +#include "sleeplock.h" +#include "riscv.h" +#include "defs.h" +#include "fs.h" +#include "buf.h" + +struct { + struct spinlock lock; + struct buf buf[NBUF]; + + // Linked list of all buffers, through prev/next. + // Sorted by how recently the buffer was used. + // head.next is most recent, head.prev is least. + struct buf head; +} bcache; + +void +binit(void) +{ + struct buf *b; + + initlock(&bcache.lock, "bcache"); + + // Create linked list of buffers + bcache.head.prev = &bcache.head; + bcache.head.next = &bcache.head; + for(b = bcache.buf; b < bcache.buf+NBUF; b++){ + b->next = bcache.head.next; + b->prev = &bcache.head; + initsleeplock(&b->lock, "buffer"); + bcache.head.next->prev = b; + bcache.head.next = b; + } +} + +// Look through buffer cache for block on device dev. +// If not found, allocate a buffer. +// In either case, return locked buffer. +static struct buf* +bget(uint dev, uint blockno) +{ + struct buf *b; + + acquire(&bcache.lock); + + // Is the block already cached? + for(b = bcache.head.next; b != &bcache.head; b = b->next){ + if(b->dev == dev && b->blockno == blockno){ + b->refcnt++; + release(&bcache.lock); + acquiresleep(&b->lock); + return b; + } + } + + // Not cached. + // Recycle the least recently used (LRU) unused buffer. + for(b = bcache.head.prev; b != &bcache.head; b = b->prev){ + if(b->refcnt == 0) { + b->dev = dev; + b->blockno = blockno; + b->valid = 0; + b->refcnt = 1; + release(&bcache.lock); + acquiresleep(&b->lock); + return b; + } + } + panic("bget: no buffers"); +} + +// Return a locked buf with the contents of the indicated block. +struct buf* +bread(uint dev, uint blockno) +{ + struct buf *b; + + b = bget(dev, blockno); + if(!b->valid) { + virtio_disk_rw(b, 0); + b->valid = 1; + } + return b; +} + +// Write b's contents to disk. Must be locked. +void +bwrite(struct buf *b) +{ + if(!holdingsleep(&b->lock)) + panic("bwrite"); + virtio_disk_rw(b, 1); +} + +// Release a locked buffer. +// Move to the head of the most-recently-used list. +void +brelse(struct buf *b) +{ + if(!holdingsleep(&b->lock)) + panic("brelse"); + + releasesleep(&b->lock); + + acquire(&bcache.lock); + b->refcnt--; + if (b->refcnt == 0) { + // no one is waiting for it. + b->next->prev = b->prev; + b->prev->next = b->next; + b->next = bcache.head.next; + b->prev = &bcache.head; + bcache.head.next->prev = b; + bcache.head.next = b; + } + + release(&bcache.lock); +} + +void +bpin(struct buf *b) { + acquire(&bcache.lock); + b->refcnt++; + release(&bcache.lock); +} + +void +bunpin(struct buf *b) { + acquire(&bcache.lock); + b->refcnt--; + release(&bcache.lock); +} + + diff --git a/G12_Project2_2/kernel/bio.d b/G12_Project2_2/kernel/bio.d new file mode 100644 index 0000000000..63aa36fdf2 --- /dev/null +++ b/G12_Project2_2/kernel/bio.d @@ -0,0 +1,3 @@ +kernel/bio.o: kernel/bio.c kernel/types.h kernel/param.h \ + kernel/spinlock.h kernel/sleeplock.h kernel/riscv.h kernel/defs.h \ + kernel/fs.h kernel/buf.h diff --git a/G12_Project2_2/kernel/bio.o b/G12_Project2_2/kernel/bio.o new file mode 100644 index 0000000000..592fb6eebc Binary files /dev/null and b/G12_Project2_2/kernel/bio.o differ diff --git a/G12_Project2_2/kernel/buf.h b/G12_Project2_2/kernel/buf.h new file mode 100644 index 0000000000..4616e9ecc9 --- /dev/null +++ b/G12_Project2_2/kernel/buf.h @@ -0,0 +1,12 @@ +struct buf { + int valid; // has data been read from disk? + int disk; // does disk "own" buf? + uint dev; + uint blockno; + struct sleeplock lock; + uint refcnt; + struct buf *prev; // LRU cache list + struct buf *next; + uchar data[BSIZE]; +}; + diff --git a/G12_Project2_2/kernel/console.c b/G12_Project2_2/kernel/console.c new file mode 100644 index 0000000000..4deeac6417 --- /dev/null +++ b/G12_Project2_2/kernel/console.c @@ -0,0 +1,198 @@ +// +// Console input and output, to the uart. +// Reads are line at a time. +// Implements special input characters: +// newline -- end of line +// control-h -- backspace +// control-u -- kill line +// control-d -- end of file +// control-p -- print process list +// + +#include + +#include "types.h" +#include "param.h" +#include "spinlock.h" +#include "sleeplock.h" +#include "fs.h" +#include "file.h" +#include "memlayout.h" +#include "riscv.h" +#include "defs.h" +#include "proc.h" + +#define BACKSPACE 0x100 // erase the last output character +#define C(x) ((x)-'@') // Control-x + +// +// send one character to the uart, but don't use +// interrupts or sleep(). safe to be called from +// interrupts, e.g. by printf and to echo input +// characters. +// +void +consputc(int c) +{ + if(c == BACKSPACE){ + // if the user typed backspace, overwrite with a space. + uartputc_sync('\b'); uartputc_sync(' '); uartputc_sync('\b'); + } else { + uartputc_sync(c); + } +} + +struct { + struct spinlock lock; + + // input circular buffer +#define INPUT_BUF_SIZE 128 + char buf[INPUT_BUF_SIZE]; + uint r; // Read index + uint w; // Write index + uint e; // Edit index +} cons; + +// +// user write() system calls to the console go here. +// uses sleep() and UART interrupts. +// +int +consolewrite(int user_src, uint64 src, int n) +{ + char buf[32]; // move batches from user space to uart. + int i = 0; + + while(i < n){ + int nn = sizeof(buf); + if(nn > n - i) + nn = n - i; + if(either_copyin(buf, user_src, src+i, nn) == -1) + break; + uartwrite(buf, nn); + i += nn; + } + + return i; +} + +// +// user read()s from the console go here. +// copy (up to) a whole input line to dst. +// user_dst indicates whether dst is a user +// or kernel address. +// +int +consoleread(int user_dst, uint64 dst, int n) +{ + uint target; + int c; + char cbuf; + + target = n; + acquire(&cons.lock); + while(n > 0){ + // wait until interrupt handler has put some + // input into cons.buffer. + while(cons.r == cons.w){ + if(killed(myproc())){ + release(&cons.lock); + return -1; + } + sleep(&cons.r, &cons.lock); + } + + c = cons.buf[cons.r++ % INPUT_BUF_SIZE]; + + if(c == C('D')){ // end-of-file + if(n < target){ + // Save ^D for next time, to make sure + // caller gets a 0-byte result. + cons.r--; + } + break; + } + + // copy the input byte to the user-space buffer. + cbuf = c; + if(either_copyout(user_dst, dst, &cbuf, 1) == -1) + break; + + dst++; + --n; + + if(c == '\n'){ + // a whole line has arrived, return to + // the user-level read(). + break; + } + } + release(&cons.lock); + + return target - n; +} + +// +// the console input interrupt handler. +// uartintr() calls this for each input character. +// do erase/kill processing, append to cons.buf, +// wake up consoleread() if a whole line has arrived. +// +void +consoleintr(int c) +{ + acquire(&cons.lock); + + switch(c){ + case C('P'): // Print process list. + procdump(); + break; + case C('U'): // Kill line. + while(cons.e != cons.w && + cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){ + cons.e--; + consputc(BACKSPACE); + } + break; + case C('H'): // Backspace + case '\x7f': // Delete key + if(cons.e != cons.w){ + cons.e--; + consputc(BACKSPACE); + } + break; + default: + if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){ + c = (c == '\r') ? '\n' : c; + + // echo back to the user. + consputc(c); + + // store for consumption by consoleread(). + cons.buf[cons.e++ % INPUT_BUF_SIZE] = c; + + if(c == '\n' || c == C('D') || cons.e-cons.r == INPUT_BUF_SIZE){ + // wake up consoleread() if a whole line (or end-of-file) + // has arrived. + cons.w = cons.e; + wakeup(&cons.r); + } + } + break; + } + + release(&cons.lock); +} + +void +consoleinit(void) +{ + initlock(&cons.lock, "cons"); + + uartinit(); + + // connect read and write system calls + // to consoleread and consolewrite. + devsw[CONSOLE].read = consoleread; + devsw[CONSOLE].write = consolewrite; +} diff --git a/G12_Project2_2/kernel/console.d b/G12_Project2_2/kernel/console.d new file mode 100644 index 0000000000..af8fd03afb --- /dev/null +++ b/G12_Project2_2/kernel/console.d @@ -0,0 +1,5 @@ +kernel/console.o: kernel/console.c \ + /usr/lib/gcc-cross/riscv64-linux-gnu/13/include/stdarg.h kernel/types.h \ + kernel/param.h kernel/spinlock.h kernel/sleeplock.h kernel/fs.h \ + kernel/file.h kernel/memlayout.h kernel/riscv.h kernel/defs.h \ + kernel/proc.h diff --git a/G12_Project2_2/kernel/console.o b/G12_Project2_2/kernel/console.o new file mode 100644 index 0000000000..30ca37b45e Binary files /dev/null and b/G12_Project2_2/kernel/console.o differ diff --git a/G12_Project2_2/kernel/defs.h b/G12_Project2_2/kernel/defs.h new file mode 100644 index 0000000000..122d9cae89 --- /dev/null +++ b/G12_Project2_2/kernel/defs.h @@ -0,0 +1,185 @@ +struct buf; +struct context; +struct file; +struct inode; +struct pipe; +struct proc; +struct spinlock; +struct sleeplock; +struct stat; +struct superblock; + +// bio.c +void binit(void); +struct buf* bread(uint, uint); +void brelse(struct buf*); +void bwrite(struct buf*); +void bpin(struct buf*); +void bunpin(struct buf*); + +// console.c +void consoleinit(void); +void consoleintr(int); +void consputc(int); + +// exec.c +int kexec(char*, char**); + +// file.c +struct file* filealloc(void); +void fileclose(struct file*); +struct file* filedup(struct file*); +void fileinit(void); +int fileread(struct file*, uint64, int n); +int filestat(struct file*, uint64 addr); +int filewrite(struct file*, uint64, int n); + +// fs.c +void fsinit(int); +int dirlink(struct inode*, char*, uint); +struct inode* dirlookup(struct inode*, char*, uint*); +struct inode* ialloc(uint, short); +struct inode* idup(struct inode*); +void iinit(); +void ilock(struct inode*); +void iput(struct inode*); +void iunlock(struct inode*); +void iunlockput(struct inode*); +void iupdate(struct inode*); +int namecmp(const char*, const char*); +struct inode* namei(char*); +struct inode* nameiparent(char*, char*); +int readi(struct inode*, int, uint64, uint, uint); +void stati(struct inode*, struct stat*); +int writei(struct inode*, int, uint64, uint, uint); +void itrunc(struct inode*); +void ireclaim(int); + +// kalloc.c +void* kalloc(void); +void kfree(void *); +void kinit(void); + +// log.c +void initlog(int, struct superblock*); +void log_write(struct buf*); +void begin_op(void); +void end_op(void); + +// pipe.c +int pipealloc(struct file**, struct file**); +void pipeclose(struct pipe*, int); +int piperead(struct pipe*, uint64, int); +int pipewrite(struct pipe*, uint64, int); + +// printf.c +int printf(char*, ...) __attribute__ ((format (printf, 1, 2))); +void panic(char*) __attribute__((noreturn)); +void printfinit(void); + +// proc.c +int cpuid(void); +void kexit(int); +int kfork(void); +int growproc(int); +void proc_mapstacks(pagetable_t); +pagetable_t proc_pagetable(struct proc *); +void proc_freepagetable(pagetable_t, uint64); +int kkill(int); +int killed(struct proc*); +void setkilled(struct proc*); +struct cpu* mycpu(void); +struct proc* myproc(); +void procinit(void); +void scheduler(void) __attribute__((noreturn)); +void sched(void); +void sleep(void*, struct spinlock*); +void userinit(void); +int kwait(uint64); +void wakeup(void*); +void yield(void); +int either_copyout(int user_dst, uint64 dst, void *src, uint64 len); +int either_copyin(void *dst, int user_src, uint64 src, uint64 len); +void procdump(void); + +// swtch.S +void swtch(struct context*, struct context*); + +// spinlock.c +void acquire(struct spinlock*); +int holding(struct spinlock*); +void initlock(struct spinlock*, char*); +void release(struct spinlock*); +void push_off(void); +void pop_off(void); + +// sleeplock.c +void acquiresleep(struct sleeplock*); +void releasesleep(struct sleeplock*); +int holdingsleep(struct sleeplock*); +void initsleeplock(struct sleeplock*, char*); + +// string.c +int memcmp(const void*, const void*, uint); +void* memmove(void*, const void*, uint); +void* memset(void*, int, uint); +char* safestrcpy(char*, const char*, int); +int strlen(const char*); +int strncmp(const char*, const char*, uint); +char* strncpy(char*, const char*, int); + +// syscall.c +void argint(int, int*); +int argstr(int, char*, int); +void argaddr(int, uint64 *); +int fetchstr(uint64, char*, int); +int fetchaddr(uint64, uint64*); +void syscall(); + +// trap.c +extern uint ticks; +void trapinit(void); +void trapinithart(void); +extern struct spinlock tickslock; +void prepare_return(void); + +// uart.c +void uartinit(void); +void uartintr(void); +void uartwrite(char [], int); +void uartputc_sync(int); +int uartgetc(void); + +// vm.c +void kvminit(void); +void kvminithart(void); +void kvmmap(pagetable_t, uint64, uint64, uint64, int); +int mappages(pagetable_t, uint64, uint64, uint64, int); +pagetable_t uvmcreate(void); +uint64 uvmalloc(pagetable_t, uint64, uint64, int); +uint64 uvmdealloc(pagetable_t, uint64, uint64); +int uvmcopy(pagetable_t, pagetable_t, uint64); +void uvmfree(pagetable_t, uint64); +void uvmunmap(pagetable_t, uint64, uint64, int); +void uvmclear(pagetable_t, uint64); +pte_t * walk(pagetable_t, uint64, int); +uint64 walkaddr(pagetable_t, uint64); +int copyout(pagetable_t, uint64, char *, uint64); +int copyin(pagetable_t, char *, uint64, uint64); +int copyinstr(pagetable_t, char *, uint64, uint64); +int ismapped(pagetable_t, uint64); +uint64 vmfault(pagetable_t, uint64, int); + +// plic.c +void plicinit(void); +void plicinithart(void); +int plic_claim(void); +void plic_complete(int); + +// virtio_disk.c +void virtio_disk_init(void); +void virtio_disk_rw(struct buf *, int); +void virtio_disk_intr(void); + +// number of elements in fixed-size array +#define NELEM(x) (sizeof(x)/sizeof((x)[0])) diff --git a/G12_Project2_2/kernel/elf.h b/G12_Project2_2/kernel/elf.h new file mode 100644 index 0000000000..84555fafd7 --- /dev/null +++ b/G12_Project2_2/kernel/elf.h @@ -0,0 +1,42 @@ +// Format of an ELF executable file + +#define ELF_MAGIC 0x464C457FU // "\x7FELF" in little endian + +// File header +struct elfhdr { + uint magic; // must equal ELF_MAGIC + uchar elf[12]; + ushort type; + ushort machine; + uint version; + uint64 entry; + uint64 phoff; + uint64 shoff; + uint flags; + ushort ehsize; + ushort phentsize; + ushort phnum; + ushort shentsize; + ushort shnum; + ushort shstrndx; +}; + +// Program section header +struct proghdr { + uint32 type; + uint32 flags; + uint64 off; + uint64 vaddr; + uint64 paddr; + uint64 filesz; + uint64 memsz; + uint64 align; +}; + +// Values for Proghdr type +#define ELF_PROG_LOAD 1 + +// Flag bits for Proghdr flags +#define ELF_PROG_FLAG_EXEC 1 +#define ELF_PROG_FLAG_WRITE 2 +#define ELF_PROG_FLAG_READ 4 diff --git a/G12_Project2_2/kernel/entry.S b/G12_Project2_2/kernel/entry.S new file mode 100644 index 0000000000..6e26fbe108 --- /dev/null +++ b/G12_Project2_2/kernel/entry.S @@ -0,0 +1,21 @@ + # qemu -kernel loads the kernel at 0x80000000 + # and causes each hart (i.e. CPU) to jump there. + # kernel.ld causes the following code to + # be placed at 0x80000000. +.section .text +.global _entry +_entry: + # set up a stack for C. + # stack0 is declared in start.c, + # with a 4096-byte stack per CPU. + # sp = stack0 + ((hartid + 1) * 4096) + la sp, stack0 + li a0, 1024*4 + csrr a1, mhartid + addi a1, a1, 1 + mul a0, a0, a1 + add sp, sp, a0 + # jump to start() in start.c + call start +spin: + j spin diff --git a/G12_Project2_2/kernel/entry.o b/G12_Project2_2/kernel/entry.o new file mode 100644 index 0000000000..ab4c0b0bc4 Binary files /dev/null and b/G12_Project2_2/kernel/entry.o differ diff --git a/G12_Project2_2/kernel/exec.c b/G12_Project2_2/kernel/exec.c new file mode 100644 index 0000000000..08bfbe8c63 --- /dev/null +++ b/G12_Project2_2/kernel/exec.c @@ -0,0 +1,173 @@ +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "riscv.h" +#include "spinlock.h" +#include "proc.h" +#include "defs.h" +#include "elf.h" + +static int loadseg(pde_t *, uint64, struct inode *, uint, uint); + +// map ELF permissions to PTE permission bits. +int flags2perm(int flags) +{ + int perm = 0; + if(flags & 0x1) + perm = PTE_X; + if(flags & 0x2) + perm |= PTE_W; + return perm; +} + +// +// the implementation of the exec() system call +// +int +kexec(char *path, char **argv) +{ + char *s, *last; + int i, off; + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + struct elfhdr elf; + struct inode *ip; + struct proghdr ph; + pagetable_t pagetable = 0, oldpagetable; + struct proc *p = myproc(); + + begin_op(); + + // Open the executable file. + if((ip = namei(path)) == 0){ + end_op(); + return -1; + } + ilock(ip); + + // Read the ELF header. + if(readi(ip, 0, (uint64)&elf, 0, sizeof(elf)) != sizeof(elf)) + goto bad; + + // Is this really an ELF file? + if(elf.magic != ELF_MAGIC) + goto bad; + + if((pagetable = proc_pagetable(p)) == 0) + goto bad; + + // Load program into memory. + for(i=0, off=elf.phoff; isz; + + // Allocate some pages at the next page boundary. + // Make the first inaccessible as a stack guard. + // Use the rest as the user stack. + sz = PGROUNDUP(sz); + uint64 sz1; + if((sz1 = uvmalloc(pagetable, sz, sz + (USERSTACK+1)*PGSIZE, PTE_W)) == 0) + goto bad; + sz = sz1; + uvmclear(pagetable, sz-(USERSTACK+1)*PGSIZE); + sp = sz; + stackbase = sp - USERSTACK*PGSIZE; + + // Copy argument strings into new stack, remember their + // addresses in ustack[]. + for(argc = 0; argv[argc]; argc++) { + if(argc >= MAXARG) + goto bad; + sp -= strlen(argv[argc]) + 1; + sp -= sp % 16; // riscv sp must be 16-byte aligned + if(sp < stackbase) + goto bad; + if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0) + goto bad; + ustack[argc] = sp; + } + ustack[argc] = 0; + + // push a copy of ustack[], the array of argv[] pointers. + sp -= (argc+1) * sizeof(uint64); + sp -= sp % 16; + if(sp < stackbase) + goto bad; + if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0) + goto bad; + + // a0 and a1 contain arguments to user main(argc, argv) + // argc is returned via the system call return + // value, which goes in a0. + p->trapframe->a1 = sp; + + // Save program name for debugging. + for(last=s=path; *s; s++) + if(*s == '/') + last = s+1; + safestrcpy(p->name, last, sizeof(p->name)); + + // Commit to the user image. + oldpagetable = p->pagetable; + p->pagetable = pagetable; + p->sz = sz; + p->trapframe->epc = elf.entry; // initial program counter = ulib.c:start() + p->trapframe->sp = sp; // initial stack pointer + proc_freepagetable(oldpagetable, oldsz); + + return argc; // this ends up in a0, the first argument to main(argc, argv) + + bad: + if(pagetable) + proc_freepagetable(pagetable, sz); + if(ip){ + iunlockput(ip); + end_op(); + } + return -1; +} + +// Load an ELF program segment into pagetable at virtual address va. +// va must be page-aligned +// and the pages from va to va+sz must already be mapped. +// Returns 0 on success, -1 on failure. +static int +loadseg(pagetable_t pagetable, uint64 va, struct inode *ip, uint offset, uint sz) +{ + uint i, n; + uint64 pa; + + for(i = 0; i < sz; i += PGSIZE){ + pa = walkaddr(pagetable, va + i); + if(pa == 0) + panic("loadseg: address should exist"); + if(sz - i < PGSIZE) + n = sz - i; + else + n = PGSIZE; + if(readi(ip, 0, (uint64)pa, offset+i, n) != n) + return -1; + } + + return 0; +} diff --git a/G12_Project2_2/kernel/exec.d b/G12_Project2_2/kernel/exec.d new file mode 100644 index 0000000000..f162b3b2e6 --- /dev/null +++ b/G12_Project2_2/kernel/exec.d @@ -0,0 +1,3 @@ +kernel/exec.o: kernel/exec.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/defs.h kernel/elf.h diff --git a/G12_Project2_2/kernel/exec.o b/G12_Project2_2/kernel/exec.o new file mode 100644 index 0000000000..4d18c168d4 Binary files /dev/null and b/G12_Project2_2/kernel/exec.o differ diff --git a/G12_Project2_2/kernel/fcntl.h b/G12_Project2_2/kernel/fcntl.h new file mode 100644 index 0000000000..44861b9a23 --- /dev/null +++ b/G12_Project2_2/kernel/fcntl.h @@ -0,0 +1,5 @@ +#define O_RDONLY 0x000 +#define O_WRONLY 0x001 +#define O_RDWR 0x002 +#define O_CREATE 0x200 +#define O_TRUNC 0x400 diff --git a/G12_Project2_2/kernel/file.c b/G12_Project2_2/kernel/file.c new file mode 100644 index 0000000000..8912b7e3f0 --- /dev/null +++ b/G12_Project2_2/kernel/file.c @@ -0,0 +1,180 @@ +// +// Support functions for system calls that involve file descriptors. +// + +#include "types.h" +#include "riscv.h" +#include "defs.h" +#include "param.h" +#include "fs.h" +#include "spinlock.h" +#include "sleeplock.h" +#include "file.h" +#include "stat.h" +#include "proc.h" + +struct devsw devsw[NDEV]; +struct { + struct spinlock lock; + struct file file[NFILE]; +} ftable; + +void +fileinit(void) +{ + initlock(&ftable.lock, "ftable"); +} + +// Allocate a file structure. +struct file* +filealloc(void) +{ + struct file *f; + + acquire(&ftable.lock); + for(f = ftable.file; f < ftable.file + NFILE; f++){ + if(f->ref == 0){ + f->ref = 1; + release(&ftable.lock); + return f; + } + } + release(&ftable.lock); + return 0; +} + +// Increment ref count for file f. +struct file* +filedup(struct file *f) +{ + acquire(&ftable.lock); + if(f->ref < 1) + panic("filedup"); + f->ref++; + release(&ftable.lock); + return f; +} + +// Close file f. (Decrement ref count, close when reaches 0.) +void +fileclose(struct file *f) +{ + struct file ff; + + acquire(&ftable.lock); + if(f->ref < 1) + panic("fileclose"); + if(--f->ref > 0){ + release(&ftable.lock); + return; + } + ff = *f; + f->ref = 0; + f->type = FD_NONE; + release(&ftable.lock); + + if(ff.type == FD_PIPE){ + pipeclose(ff.pipe, ff.writable); + } else if(ff.type == FD_INODE || ff.type == FD_DEVICE){ + begin_op(); + iput(ff.ip); + end_op(); + } +} + +// Get metadata about file f. +// addr is a user virtual address, pointing to a struct stat. +int +filestat(struct file *f, uint64 addr) +{ + struct proc *p = myproc(); + struct stat st; + + if(f->type == FD_INODE || f->type == FD_DEVICE){ + ilock(f->ip); + stati(f->ip, &st); + iunlock(f->ip); + if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0) + return -1; + return 0; + } + return -1; +} + +// Read from file f. +// addr is a user virtual address. +int +fileread(struct file *f, uint64 addr, int n) +{ + int r = 0; + + if(f->readable == 0) + return -1; + + if(f->type == FD_PIPE){ + r = piperead(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read) + return -1; + r = devsw[f->major].read(1, addr, n); + } else if(f->type == FD_INODE){ + ilock(f->ip); + if((r = readi(f->ip, 1, addr, f->off, n)) > 0) + f->off += r; + iunlock(f->ip); + } else { + panic("fileread"); + } + + return r; +} + +// Write to file f. +// addr is a user virtual address. +int +filewrite(struct file *f, uint64 addr, int n) +{ + int r, ret = 0; + + if(f->writable == 0) + return -1; + + if(f->type == FD_PIPE){ + ret = pipewrite(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write) + return -1; + ret = devsw[f->major].write(1, addr, n); + } else if(f->type == FD_INODE){ + // write a few blocks at a time to avoid exceeding + // the maximum log transaction size, including + // i-node, indirect block, allocation blocks, + // and 2 blocks of slop for non-aligned writes. + int max = ((MAXOPBLOCKS-1-1-2) / 2) * BSIZE; + int i = 0; + while(i < n){ + int n1 = n - i; + if(n1 > max) + n1 = max; + + begin_op(); + ilock(f->ip); + if ((r = writei(f->ip, 1, addr + i, f->off, n1)) > 0) + f->off += r; + iunlock(f->ip); + end_op(); + + if(r != n1){ + // error from writei + break; + } + i += r; + } + ret = (i == n ? n : -1); + } else { + panic("filewrite"); + } + + return ret; +} + diff --git a/G12_Project2_2/kernel/file.d b/G12_Project2_2/kernel/file.d new file mode 100644 index 0000000000..222a010087 --- /dev/null +++ b/G12_Project2_2/kernel/file.d @@ -0,0 +1,3 @@ +kernel/file.o: kernel/file.c kernel/types.h kernel/riscv.h kernel/defs.h \ + kernel/param.h kernel/fs.h kernel/spinlock.h kernel/sleeplock.h \ + kernel/file.h kernel/stat.h kernel/proc.h diff --git a/G12_Project2_2/kernel/file.h b/G12_Project2_2/kernel/file.h new file mode 100644 index 0000000000..b076d1d806 --- /dev/null +++ b/G12_Project2_2/kernel/file.h @@ -0,0 +1,40 @@ +struct file { + enum { FD_NONE, FD_PIPE, FD_INODE, FD_DEVICE } type; + int ref; // reference count + char readable; + char writable; + struct pipe *pipe; // FD_PIPE + struct inode *ip; // FD_INODE and FD_DEVICE + uint off; // FD_INODE + short major; // FD_DEVICE +}; + +#define major(dev) ((dev) >> 16 & 0xFFFF) +#define minor(dev) ((dev) & 0xFFFF) +#define mkdev(m,n) ((uint)((m)<<16| (n))) + +// in-memory copy of an inode +struct inode { + uint dev; // Device number + uint inum; // Inode number + int ref; // Reference count + struct sleeplock lock; // protects everything below here + int valid; // inode has been read from disk? + + short type; // copy of disk inode + short major; + short minor; + short nlink; + uint size; + uint addrs[NDIRECT+1]; +}; + +// map major device number to device functions. +struct devsw { + int (*read)(int, uint64, int); + int (*write)(int, uint64, int); +}; + +extern struct devsw devsw[]; + +#define CONSOLE 1 diff --git a/G12_Project2_2/kernel/file.o b/G12_Project2_2/kernel/file.o new file mode 100644 index 0000000000..d7dc8498e7 Binary files /dev/null and b/G12_Project2_2/kernel/file.o differ diff --git a/G12_Project2_2/kernel/fs.c b/G12_Project2_2/kernel/fs.c new file mode 100644 index 0000000000..92746789f3 --- /dev/null +++ b/G12_Project2_2/kernel/fs.c @@ -0,0 +1,720 @@ +// File system implementation. Five layers: +// + Blocks: allocator for raw disk blocks. +// + Log: crash recovery for multi-step updates. +// + Files: inode allocator, reading, writing, metadata. +// + Directories: inode with special contents (list of other inodes!) +// + Names: paths like /usr/rtm/xv6/fs.c for convenient naming. +// +// This file contains the low-level file system manipulation +// routines. The (higher-level) system call implementations +// are in sysfile.c. + +#include "types.h" +#include "riscv.h" +#include "defs.h" +#include "param.h" +#include "stat.h" +#include "spinlock.h" +#include "proc.h" +#include "sleeplock.h" +#include "fs.h" +#include "buf.h" +#include "file.h" + +#define min(a, b) ((a) < (b) ? (a) : (b)) +// there should be one superblock per disk device, but we run with +// only one device +struct superblock sb; + +// Read the super block. +static void +readsb(int dev, struct superblock *sb) +{ + struct buf *bp; + + bp = bread(dev, 1); + memmove(sb, bp->data, sizeof(*sb)); + brelse(bp); +} + +// Init fs +void +fsinit(int dev) { + readsb(dev, &sb); + if(sb.magic != FSMAGIC) + panic("invalid file system"); + initlog(dev, &sb); + ireclaim(dev); +} + +// Zero a block. +static void +bzero(int dev, int bno) +{ + struct buf *bp; + + bp = bread(dev, bno); + memset(bp->data, 0, BSIZE); + log_write(bp); + brelse(bp); +} + +// Blocks. + +// Allocate a zeroed disk block. +// returns 0 if out of disk space. +static uint +balloc(uint dev) +{ + int b, bi, m; + struct buf *bp; + + bp = 0; + for(b = 0; b < sb.size; b += BPB){ + bp = bread(dev, BBLOCK(b, sb)); + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + m = 1 << (bi % 8); + if((bp->data[bi/8] & m) == 0){ // Is block free? + bp->data[bi/8] |= m; // Mark block in use. + log_write(bp); + brelse(bp); + bzero(dev, b + bi); + return b + bi; + } + } + brelse(bp); + } + printf("balloc: out of blocks\n"); + return 0; +} + +// Free a disk block. +static void +bfree(int dev, uint b) +{ + struct buf *bp; + int bi, m; + + bp = bread(dev, BBLOCK(b, sb)); + bi = b % BPB; + m = 1 << (bi % 8); + if((bp->data[bi/8] & m) == 0) + panic("freeing free block"); + bp->data[bi/8] &= ~m; + log_write(bp); + brelse(bp); +} + +// Inodes. +// +// An inode describes a single unnamed file. +// The inode disk structure holds metadata: the file's type, +// its size, the number of links referring to it, and the +// list of blocks holding the file's content. +// +// The inodes are laid out sequentially on disk at block +// sb.inodestart. Each inode has a number, indicating its +// position on the disk. +// +// The kernel keeps a table of in-use inodes in memory +// to provide a place for synchronizing access +// to inodes used by multiple processes. The in-memory +// inodes include book-keeping information that is +// not stored on disk: ip->ref and ip->valid. +// +// An inode and its in-memory representation go through a +// sequence of states before they can be used by the +// rest of the file system code. +// +// * Allocation: an inode is allocated if its type (on disk) +// is non-zero. ialloc() allocates, and iput() frees if +// the reference and link counts have fallen to zero. +// +// * Referencing in table: an entry in the inode table +// is free if ip->ref is zero. Otherwise ip->ref tracks +// the number of in-memory pointers to the entry (open +// files and current directories). iget() finds or +// creates a table entry and increments its ref; iput() +// decrements ref. +// +// * Valid: the information (type, size, &c) in an inode +// table entry is only correct when ip->valid is 1. +// ilock() reads the inode from +// the disk and sets ip->valid, while iput() clears +// ip->valid if ip->ref has fallen to zero. +// +// * Locked: file system code may only examine and modify +// the information in an inode and its content if it +// has first locked the inode. +// +// Thus a typical sequence is: +// ip = iget(dev, inum) +// ilock(ip) +// ... examine and modify ip->xxx ... +// iunlock(ip) +// iput(ip) +// +// ilock() is separate from iget() so that system calls can +// get a long-term reference to an inode (as for an open file) +// and only lock it for short periods (e.g., in read()). +// The separation also helps avoid deadlock and races during +// pathname lookup. iget() increments ip->ref so that the inode +// stays in the table and pointers to it remain valid. +// +// Many internal file system functions expect the caller to +// have locked the inodes involved; this lets callers create +// multi-step atomic operations. +// +// The itable.lock spin-lock protects the allocation of itable +// entries. Since ip->ref indicates whether an entry is free, +// and ip->dev and ip->inum indicate which i-node an entry +// holds, one must hold itable.lock while using any of those fields. +// +// An ip->lock sleep-lock protects all ip-> fields other than ref, +// dev, and inum. One must hold ip->lock in order to +// read or write that inode's ip->valid, ip->size, ip->type, &c. + +struct { + struct spinlock lock; + struct inode inode[NINODE]; +} itable; + +void +iinit() +{ + int i = 0; + + initlock(&itable.lock, "itable"); + for(i = 0; i < NINODE; i++) { + initsleeplock(&itable.inode[i].lock, "inode"); + } +} + +static struct inode* iget(uint dev, uint inum); + +// Allocate an inode on device dev. +// Mark it as allocated by giving it type type. +// Returns an unlocked but allocated and referenced inode, +// or NULL if there is no free inode. +struct inode* +ialloc(uint dev, short type) +{ + int inum; + struct buf *bp; + struct dinode *dip; + + for(inum = 1; inum < sb.ninodes; inum++){ + bp = bread(dev, IBLOCK(inum, sb)); + dip = (struct dinode*)bp->data + inum%IPB; + if(dip->type == 0){ // a free inode + memset(dip, 0, sizeof(*dip)); + dip->type = type; + log_write(bp); // mark it allocated on the disk + brelse(bp); + return iget(dev, inum); + } + brelse(bp); + } + printf("ialloc: no inodes\n"); + return 0; +} + +// Copy a modified in-memory inode to disk. +// Must be called after every change to an ip->xxx field +// that lives on disk. +// Caller must hold ip->lock. +void +iupdate(struct inode *ip) +{ + struct buf *bp; + struct dinode *dip; + + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); + dip = (struct dinode*)bp->data + ip->inum%IPB; + dip->type = ip->type; + dip->major = ip->major; + dip->minor = ip->minor; + dip->nlink = ip->nlink; + dip->size = ip->size; + memmove(dip->addrs, ip->addrs, sizeof(ip->addrs)); + log_write(bp); + brelse(bp); +} + +// Find the inode with number inum on device dev +// and return the in-memory copy. Does not lock +// the inode and does not read it from disk. +static struct inode* +iget(uint dev, uint inum) +{ + struct inode *ip, *empty; + + acquire(&itable.lock); + + // Is the inode already in the table? + empty = 0; + for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){ + if(ip->ref > 0 && ip->dev == dev && ip->inum == inum){ + ip->ref++; + release(&itable.lock); + return ip; + } + if(empty == 0 && ip->ref == 0) // Remember empty slot. + empty = ip; + } + + // Recycle an inode entry. + if(empty == 0) + panic("iget: no inodes"); + + ip = empty; + ip->dev = dev; + ip->inum = inum; + ip->ref = 1; + ip->valid = 0; + release(&itable.lock); + + return ip; +} + +// Increment reference count for ip. +// Returns ip to enable ip = idup(ip1) idiom. +struct inode* +idup(struct inode *ip) +{ + acquire(&itable.lock); + ip->ref++; + release(&itable.lock); + return ip; +} + +// Lock the given inode. +// Reads the inode from disk if necessary. +void +ilock(struct inode *ip) +{ + struct buf *bp; + struct dinode *dip; + + if(ip == 0 || ip->ref < 1) + panic("ilock"); + + acquiresleep(&ip->lock); + + if(ip->valid == 0){ + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); + dip = (struct dinode*)bp->data + ip->inum%IPB; + ip->type = dip->type; + ip->major = dip->major; + ip->minor = dip->minor; + ip->nlink = dip->nlink; + ip->size = dip->size; + memmove(ip->addrs, dip->addrs, sizeof(ip->addrs)); + brelse(bp); + ip->valid = 1; + if(ip->type == 0) + panic("ilock: no type"); + } +} + +// Unlock the given inode. +void +iunlock(struct inode *ip) +{ + if(ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) + panic("iunlock"); + + releasesleep(&ip->lock); +} + +// Drop a reference to an in-memory inode. +// If that was the last reference, the inode table entry can +// be recycled. +// If that was the last reference and the inode has no links +// to it, free the inode (and its content) on disk. +// All calls to iput() must be inside a transaction in +// case it has to free the inode. +void +iput(struct inode *ip) +{ + acquire(&itable.lock); + + if(ip->ref == 1 && ip->valid && ip->nlink == 0){ + // inode has no links and no other references: truncate and free. + + // ip->ref == 1 means no other process can have ip locked, + // so this acquiresleep() won't block (or deadlock). + acquiresleep(&ip->lock); + + release(&itable.lock); + + itrunc(ip); + ip->type = 0; + iupdate(ip); + ip->valid = 0; + + releasesleep(&ip->lock); + + acquire(&itable.lock); + } + + ip->ref--; + release(&itable.lock); +} + +// Common idiom: unlock, then put. +void +iunlockput(struct inode *ip) +{ + iunlock(ip); + iput(ip); +} + +void +ireclaim(int dev) +{ + for (int inum = 1; inum < sb.ninodes; inum++) { + struct inode *ip = 0; + struct buf *bp = bread(dev, IBLOCK(inum, sb)); + struct dinode *dip = (struct dinode *)bp->data + inum % IPB; + if (dip->type != 0 && dip->nlink == 0) { // is an orphaned inode + printf("ireclaim: orphaned inode %d\n", inum); + ip = iget(dev, inum); + } + brelse(bp); + if (ip) { + begin_op(); + ilock(ip); + iunlock(ip); + iput(ip); + end_op(); + } + } +} + +// Inode content +// +// The content (data) associated with each inode is stored +// in blocks on the disk. The first NDIRECT block numbers +// are listed in ip->addrs[]. The next NINDIRECT blocks are +// listed in block ip->addrs[NDIRECT]. + +// Return the disk block address of the nth block in inode ip. +// If there is no such block, bmap allocates one. +// returns 0 if out of disk space. +static uint +bmap(struct inode *ip, uint bn) +{ + uint addr, *a; + struct buf *bp; + + if(bn < NDIRECT){ + if((addr = ip->addrs[bn]) == 0){ + addr = balloc(ip->dev); + if(addr == 0) + return 0; + ip->addrs[bn] = addr; + } + return addr; + } + bn -= NDIRECT; + + if(bn < NINDIRECT){ + // Load indirect block, allocating if necessary. + if((addr = ip->addrs[NDIRECT]) == 0){ + addr = balloc(ip->dev); + if(addr == 0) + return 0; + ip->addrs[NDIRECT] = addr; + } + bp = bread(ip->dev, addr); + a = (uint*)bp->data; + if((addr = a[bn]) == 0){ + addr = balloc(ip->dev); + if(addr){ + a[bn] = addr; + log_write(bp); + } + } + brelse(bp); + return addr; + } + + panic("bmap: out of range"); +} + +// Truncate inode (discard contents). +// Caller must hold ip->lock. +void +itrunc(struct inode *ip) +{ + int i, j; + struct buf *bp; + uint *a; + + for(i = 0; i < NDIRECT; i++){ + if(ip->addrs[i]){ + bfree(ip->dev, ip->addrs[i]); + ip->addrs[i] = 0; + } + } + + if(ip->addrs[NDIRECT]){ + bp = bread(ip->dev, ip->addrs[NDIRECT]); + a = (uint*)bp->data; + for(j = 0; j < NINDIRECT; j++){ + if(a[j]) + bfree(ip->dev, a[j]); + } + brelse(bp); + bfree(ip->dev, ip->addrs[NDIRECT]); + ip->addrs[NDIRECT] = 0; + } + + ip->size = 0; + iupdate(ip); +} + +// Copy stat information from inode. +// Caller must hold ip->lock. +void +stati(struct inode *ip, struct stat *st) +{ + st->dev = ip->dev; + st->ino = ip->inum; + st->type = ip->type; + st->nlink = ip->nlink; + st->size = ip->size; +} + +// Read data from inode. +// Caller must hold ip->lock. +// If user_dst==1, then dst is a user virtual address; +// otherwise, dst is a kernel address. +int +readi(struct inode *ip, int user_dst, uint64 dst, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) + return 0; + if(off + n > ip->size) + n = ip->size - off; + + for(tot=0; totdev, addr); + m = min(n - tot, BSIZE - off%BSIZE); + if(either_copyout(user_dst, dst, bp->data + (off % BSIZE), m) == -1) { + brelse(bp); + tot = -1; + break; + } + brelse(bp); + } + return tot; +} + +// Write data to inode. +// Caller must hold ip->lock. +// If user_src==1, then src is a user virtual address; +// otherwise, src is a kernel address. +// Returns the number of bytes successfully written. +// If the return value is less than the requested n, +// there was an error of some kind. +int +writei(struct inode *ip, int user_src, uint64 src, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) + return -1; + if(off + n > MAXFILE*BSIZE) + return -1; + + for(tot=0; totdev, addr); + m = min(n - tot, BSIZE - off%BSIZE); + if(either_copyin(bp->data + (off % BSIZE), user_src, src, m) == -1) { + brelse(bp); + break; + } + log_write(bp); + brelse(bp); + } + + if(off > ip->size) + ip->size = off; + + // write the i-node back to disk even if the size didn't change + // because the loop above might have called bmap() and added a new + // block to ip->addrs[]. + iupdate(ip); + + return tot; +} + +// Directories + +int +namecmp(const char *s, const char *t) +{ + return strncmp(s, t, DIRSIZ); +} + +// Look for a directory entry in a directory. +// If found, set *poff to byte offset of entry. +struct inode* +dirlookup(struct inode *dp, char *name, uint *poff) +{ + uint off, inum; + struct dirent de; + + if(dp->type != T_DIR) + panic("dirlookup not DIR"); + + for(off = 0; off < dp->size; off += sizeof(de)){ + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + panic("dirlookup read"); + if(de.inum == 0) + continue; + if(namecmp(name, de.name) == 0){ + // entry matches path element + if(poff) + *poff = off; + inum = de.inum; + return iget(dp->dev, inum); + } + } + + return 0; +} + +// Write a new directory entry (name, inum) into the directory dp. +// Returns 0 on success, -1 on failure (e.g. out of disk blocks). +int +dirlink(struct inode *dp, char *name, uint inum) +{ + int off; + struct dirent de; + struct inode *ip; + + // Check that name is not present. + if((ip = dirlookup(dp, name, 0)) != 0){ + iput(ip); + return -1; + } + + // Look for an empty dirent. + for(off = 0; off < dp->size; off += sizeof(de)){ + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + panic("dirlink read"); + if(de.inum == 0) + break; + } + + strncpy(de.name, name, DIRSIZ); + de.inum = inum; + if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + return -1; + + return 0; +} + +// Paths + +// Copy the next path element from path into name. +// Return a pointer to the element following the copied one. +// The returned path has no leading slashes, +// so the caller can check *path=='\0' to see if the name is the last one. +// If no name to remove, return 0. +// +// Examples: +// skipelem("a/bb/c", name) = "bb/c", setting name = "a" +// skipelem("///a//bb", name) = "bb", setting name = "a" +// skipelem("a", name) = "", setting name = "a" +// skipelem("", name) = skipelem("////", name) = 0 +// +static char* +skipelem(char *path, char *name) +{ + char *s; + int len; + + while(*path == '/') + path++; + if(*path == 0) + return 0; + s = path; + while(*path != '/' && *path != 0) + path++; + len = path - s; + if(len >= DIRSIZ) + memmove(name, s, DIRSIZ); + else { + memmove(name, s, len); + name[len] = 0; + } + while(*path == '/') + path++; + return path; +} + +// Look up and return the inode for a path name. +// If parent != 0, return the inode for the parent and copy the final +// path element into name, which must have room for DIRSIZ bytes. +// Must be called inside a transaction since it calls iput(). +static struct inode* +namex(char *path, int nameiparent, char *name) +{ + struct inode *ip, *next; + + if(*path == '/') + ip = iget(ROOTDEV, ROOTINO); + else + ip = idup(myproc()->cwd); + + while((path = skipelem(path, name)) != 0){ + ilock(ip); + if(ip->type != T_DIR){ + iunlockput(ip); + return 0; + } + if(nameiparent && *path == '\0'){ + // Stop one level early. + iunlock(ip); + return ip; + } + if((next = dirlookup(ip, name, 0)) == 0){ + iunlockput(ip); + return 0; + } + iunlockput(ip); + ip = next; + } + if(nameiparent){ + iput(ip); + return 0; + } + return ip; +} + +struct inode* +namei(char *path) +{ + char name[DIRSIZ]; + return namex(path, 0, name); +} + +struct inode* +nameiparent(char *path, char *name) +{ + return namex(path, 1, name); +} diff --git a/G12_Project2_2/kernel/fs.d b/G12_Project2_2/kernel/fs.d new file mode 100644 index 0000000000..9e5d3ff277 --- /dev/null +++ b/G12_Project2_2/kernel/fs.d @@ -0,0 +1,3 @@ +kernel/fs.o: kernel/fs.c kernel/types.h kernel/riscv.h kernel/defs.h \ + kernel/param.h kernel/stat.h kernel/spinlock.h kernel/proc.h \ + kernel/sleeplock.h kernel/fs.h kernel/buf.h kernel/file.h diff --git a/G12_Project2_2/kernel/fs.h b/G12_Project2_2/kernel/fs.h new file mode 100644 index 0000000000..18d0dd0390 --- /dev/null +++ b/G12_Project2_2/kernel/fs.h @@ -0,0 +1,62 @@ +// On-disk file system format. +// Both the kernel and user programs use this header file. + + +#define ROOTINO 1 // root i-number +#define BSIZE 1024 // block size + +// Disk layout: +// [ boot block | super block | log | inode blocks | +// free bit map | data blocks] +// +// mkfs computes the super block and builds an initial file system. The +// super block describes the disk layout: +struct superblock { + uint magic; // Must be FSMAGIC + uint size; // Size of file system image (blocks) + uint nblocks; // Number of data blocks + uint ninodes; // Number of inodes. + uint nlog; // Number of log blocks + uint logstart; // Block number of first log block + uint inodestart; // Block number of first inode block + uint bmapstart; // Block number of first free map block +}; + +#define FSMAGIC 0x10203040 + +#define NDIRECT 12 +#define NINDIRECT (BSIZE / sizeof(uint)) +#define MAXFILE (NDIRECT + NINDIRECT) + +// On-disk inode structure +struct dinode { + short type; // File type + short major; // Major device number (T_DEVICE only) + short minor; // Minor device number (T_DEVICE only) + short nlink; // Number of links to inode in file system + uint size; // Size of file (bytes) + uint addrs[NDIRECT+1]; // Data block addresses +}; + +// Inodes per block. +#define IPB (BSIZE / sizeof(struct dinode)) + +// Block containing inode i +#define IBLOCK(i, sb) ((i) / IPB + sb.inodestart) + +// Bitmap bits per block +#define BPB (BSIZE*8) + +// Block of free map containing bit for block b +#define BBLOCK(b, sb) ((b)/BPB + sb.bmapstart) + +// Directory is a file containing a sequence of dirent structures. +#define DIRSIZ 14 + +// The name field may have DIRSIZ characters and not end in a NUL +// character. +struct dirent { + ushort inum; + char name[DIRSIZ] __attribute__((nonstring)); +}; + diff --git a/G12_Project2_2/kernel/fs.o b/G12_Project2_2/kernel/fs.o new file mode 100644 index 0000000000..44145e9343 Binary files /dev/null and b/G12_Project2_2/kernel/fs.o differ diff --git a/G12_Project2_2/kernel/kalloc.c b/G12_Project2_2/kernel/kalloc.c new file mode 100644 index 0000000000..0699e7eed4 --- /dev/null +++ b/G12_Project2_2/kernel/kalloc.c @@ -0,0 +1,82 @@ +// Physical memory allocator, for user processes, +// kernel stacks, page-table pages, +// and pipe buffers. Allocates whole 4096-byte pages. + +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "spinlock.h" +#include "riscv.h" +#include "defs.h" + +void freerange(void *pa_start, void *pa_end); + +extern char end[]; // first address after kernel. + // defined by kernel.ld. + +struct run { + struct run *next; +}; + +struct { + struct spinlock lock; + struct run *freelist; +} kmem; + +void +kinit() +{ + initlock(&kmem.lock, "kmem"); + freerange(end, (void*)PHYSTOP); +} + +void +freerange(void *pa_start, void *pa_end) +{ + char *p; + p = (char*)PGROUNDUP((uint64)pa_start); + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + kfree(p); +} + +// Free the page of physical memory pointed at by pa, +// 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) +{ + struct run *r; + + if(((uint64)pa % PGSIZE) != 0 || (char*)pa < end || (uint64)pa >= PHYSTOP) + panic("kfree"); + + // Fill with junk to catch dangling refs. + memset(pa, 1, PGSIZE); + + r = (struct run*)pa; + + acquire(&kmem.lock); + r->next = kmem.freelist; + kmem.freelist = r; + release(&kmem.lock); +} + +// 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) +{ + struct run *r; + + acquire(&kmem.lock); + r = kmem.freelist; + if(r) + kmem.freelist = r->next; + release(&kmem.lock); + + if(r) + memset((char*)r, 5, PGSIZE); // fill with junk + return (void*)r; +} diff --git a/G12_Project2_2/kernel/kalloc.d b/G12_Project2_2/kernel/kalloc.d new file mode 100644 index 0000000000..d495b70fd8 --- /dev/null +++ b/G12_Project2_2/kernel/kalloc.d @@ -0,0 +1,2 @@ +kernel/kalloc.o: kernel/kalloc.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/spinlock.h kernel/riscv.h kernel/defs.h diff --git a/G12_Project2_2/kernel/kalloc.o b/G12_Project2_2/kernel/kalloc.o new file mode 100644 index 0000000000..62989dca43 Binary files /dev/null and b/G12_Project2_2/kernel/kalloc.o differ diff --git a/G12_Project2_2/kernel/kernel b/G12_Project2_2/kernel/kernel new file mode 100755 index 0000000000..5508f9047d Binary files /dev/null and b/G12_Project2_2/kernel/kernel differ diff --git a/G12_Project2_2/kernel/kernel.asm b/G12_Project2_2/kernel/kernel.asm new file mode 100644 index 0000000000..17fb86aeae --- /dev/null +++ b/G12_Project2_2/kernel/kernel.asm @@ -0,0 +1,12872 @@ + +kernel/kernel: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000080000000 <_entry>: +_entry: + # set up a stack for C. + # stack0 is declared in start.c, + # with a 4096-byte stack per CPU. + # sp = stack0 + ((hartid + 1) * 4096) + la sp, stack0 + 80000000: 0000a117 auipc sp,0xa + 80000004: 17813103 ld sp,376(sp) # 8000a178 <_GLOBAL_OFFSET_TABLE_+0x8> + li a0, 1024*4 + 80000008: 6505 lui a0,0x1 + csrr a1, mhartid + 8000000a: f14025f3 csrr a1,mhartid + addi a1, a1, 1 + 8000000e: 0585 addi a1,a1,1 + mul a0, a0, a1 + 80000010: 02b50533 mul a0,a0,a1 + add sp, sp, a0 + 80000014: 912a add sp,sp,a0 + # jump to start() in start.c + call start + 80000016: 04a000ef jal 80000060 + +000000008000001a : +spin: + j spin + 8000001a: a001 j 8000001a + +000000008000001c : +} + +// ask each hart to generate timer interrupts. +void +timerinit() +{ + 8000001c: 1141 addi sp,sp,-16 + 8000001e: e422 sd s0,8(sp) + 80000020: 0800 addi s0,sp,16 +#define MIE_STIE (1L << 5) // supervisor timer +static inline uint64 +r_mie() +{ + uint64 x; + asm volatile("csrr %0, mie" : "=r" (x) ); + 80000022: 304027f3 csrr a5,mie + // enable supervisor-mode timer interrupts. + w_mie(r_mie() | MIE_STIE); + 80000026: 0207e793 ori a5,a5,32 +} + +static inline void +w_mie(uint64 x) +{ + asm volatile("csrw mie, %0" : : "r" (x)); + 8000002a: 30479073 csrw mie,a5 +static inline uint64 +r_menvcfg() +{ + uint64 x; + // asm volatile("csrr %0, menvcfg" : "=r" (x) ); + asm volatile("csrr %0, 0x30a" : "=r" (x) ); + 8000002e: 30a027f3 csrr a5,0x30a + + // enable the sstc extension (i.e. stimecmp). + w_menvcfg(r_menvcfg() | (1L << 63)); + 80000032: 577d li a4,-1 + 80000034: 177e slli a4,a4,0x3f + 80000036: 8fd9 or a5,a5,a4 + +static inline void +w_menvcfg(uint64 x) +{ + // asm volatile("csrw menvcfg, %0" : : "r" (x)); + asm volatile("csrw 0x30a, %0" : : "r" (x)); + 80000038: 30a79073 csrw 0x30a,a5 + +static inline uint64 +r_mcounteren() +{ + uint64 x; + asm volatile("csrr %0, mcounteren" : "=r" (x) ); + 8000003c: 306027f3 csrr a5,mcounteren + + // allow supervisor to use stimecmp and time. + w_mcounteren(r_mcounteren() | 2); + 80000040: 0027e793 ori a5,a5,2 + asm volatile("csrw mcounteren, %0" : : "r" (x)); + 80000044: 30679073 csrw mcounteren,a5 +// machine-mode cycle counter +static inline uint64 +r_time() +{ + uint64 x; + asm volatile("csrr %0, time" : "=r" (x) ); + 80000048: c01027f3 rdtime a5 + + // ask for the very first timer interrupt. + w_stimecmp(r_time() + 1000000); + 8000004c: 000f4737 lui a4,0xf4 + 80000050: 24070713 addi a4,a4,576 # f4240 <_entry-0x7ff0bdc0> + 80000054: 97ba add a5,a5,a4 + asm volatile("csrw 0x14d, %0" : : "r" (x)); + 80000056: 14d79073 csrw stimecmp,a5 +} + 8000005a: 6422 ld s0,8(sp) + 8000005c: 0141 addi sp,sp,16 + 8000005e: 8082 ret + +0000000080000060 : +{ + 80000060: 1141 addi sp,sp,-16 + 80000062: e406 sd ra,8(sp) + 80000064: e022 sd s0,0(sp) + 80000066: 0800 addi s0,sp,16 + asm volatile("csrr %0, mstatus" : "=r" (x) ); + 80000068: 300027f3 csrr a5,mstatus + x &= ~MSTATUS_MPP_MASK; + 8000006c: 7779 lui a4,0xffffe + 8000006e: 7ff70713 addi a4,a4,2047 # ffffffffffffe7ff + 80000072: 8ff9 and a5,a5,a4 + x |= MSTATUS_MPP_S; + 80000074: 6705 lui a4,0x1 + 80000076: 80070713 addi a4,a4,-2048 # 800 <_entry-0x7ffff800> + 8000007a: 8fd9 or a5,a5,a4 + asm volatile("csrw mstatus, %0" : : "r" (x)); + 8000007c: 30079073 csrw mstatus,a5 + asm volatile("csrw mepc, %0" : : "r" (x)); + 80000080: 00001797 auipc a5,0x1 + 80000084: dbc78793 addi a5,a5,-580 # 80000e3c
+ 80000088: 34179073 csrw mepc,a5 + asm volatile("csrw satp, %0" : : "r" (x)); + 8000008c: 4781 li a5,0 + 8000008e: 18079073 csrw satp,a5 + asm volatile("csrw medeleg, %0" : : "r" (x)); + 80000092: 67c1 lui a5,0x10 + 80000094: 17fd addi a5,a5,-1 # ffff <_entry-0x7fff0001> + 80000096: 30279073 csrw medeleg,a5 + asm volatile("csrw mideleg, %0" : : "r" (x)); + 8000009a: 30379073 csrw mideleg,a5 + asm volatile("csrr %0, sie" : "=r" (x) ); + 8000009e: 104027f3 csrr a5,sie + w_sie(r_sie() | SIE_SEIE | SIE_STIE); + 800000a2: 2207e793 ori a5,a5,544 + asm volatile("csrw sie, %0" : : "r" (x)); + 800000a6: 10479073 csrw sie,a5 + asm volatile("csrw pmpaddr0, %0" : : "r" (x)); + 800000aa: 57fd li a5,-1 + 800000ac: 83a9 srli a5,a5,0xa + 800000ae: 3b079073 csrw pmpaddr0,a5 + asm volatile("csrw pmpcfg0, %0" : : "r" (x)); + 800000b2: 47bd li a5,15 + 800000b4: 3a079073 csrw pmpcfg0,a5 + timerinit(); + 800000b8: f65ff0ef jal 8000001c + asm volatile("csrr %0, mhartid" : "=r" (x) ); + 800000bc: f14027f3 csrr a5,mhartid + w_tp(id); + 800000c0: 2781 sext.w a5,a5 +} + +static inline void +w_tp(uint64 x) +{ + asm volatile("mv tp, %0" : : "r" (x)); + 800000c2: 823e mv tp,a5 + asm volatile("mret"); + 800000c4: 30200073 mret +} + 800000c8: 60a2 ld ra,8(sp) + 800000ca: 6402 ld s0,0(sp) + 800000cc: 0141 addi sp,sp,16 + 800000ce: 8082 ret + +00000000800000d0 : +// user write() system calls to the console go here. +// uses sleep() and UART interrupts. +// +int +consolewrite(int user_src, uint64 src, int n) +{ + 800000d0: 7119 addi sp,sp,-128 + 800000d2: fc86 sd ra,120(sp) + 800000d4: f8a2 sd s0,112(sp) + 800000d6: f4a6 sd s1,104(sp) + 800000d8: 0100 addi s0,sp,128 + char buf[32]; // move batches from user space to uart. + int i = 0; + + while(i < n){ + 800000da: 06c05a63 blez a2,8000014e + 800000de: f0ca sd s2,96(sp) + 800000e0: ecce sd s3,88(sp) + 800000e2: e8d2 sd s4,80(sp) + 800000e4: e4d6 sd s5,72(sp) + 800000e6: e0da sd s6,64(sp) + 800000e8: fc5e sd s7,56(sp) + 800000ea: f862 sd s8,48(sp) + 800000ec: f466 sd s9,40(sp) + 800000ee: 8aaa mv s5,a0 + 800000f0: 8b2e mv s6,a1 + 800000f2: 8a32 mv s4,a2 + int i = 0; + 800000f4: 4481 li s1,0 + int nn = sizeof(buf); + if(nn > n - i) + 800000f6: 02000c13 li s8,32 + 800000fa: 02000c93 li s9,32 + nn = n - i; + if(either_copyin(buf, user_src, src+i, nn) == -1) + 800000fe: 5bfd li s7,-1 + 80000100: a035 j 8000012c + if(nn > n - i) + 80000102: 0009099b sext.w s3,s2 + if(either_copyin(buf, user_src, src+i, nn) == -1) + 80000106: 86ce mv a3,s3 + 80000108: 01648633 add a2,s1,s6 + 8000010c: 85d6 mv a1,s5 + 8000010e: f8040513 addi a0,s0,-128 + 80000112: 16c020ef jal 8000227e + 80000116: 03750e63 beq a0,s7,80000152 + break; + uartwrite(buf, nn); + 8000011a: 85ce mv a1,s3 + 8000011c: f8040513 addi a0,s0,-128 + 80000120: 778000ef jal 80000898 + i += nn; + 80000124: 009904bb addw s1,s2,s1 + while(i < n){ + 80000128: 0144da63 bge s1,s4,8000013c + if(nn > n - i) + 8000012c: 409a093b subw s2,s4,s1 + 80000130: 0009079b sext.w a5,s2 + 80000134: fcfc57e3 bge s8,a5,80000102 + 80000138: 8966 mv s2,s9 + 8000013a: b7e1 j 80000102 + 8000013c: 7906 ld s2,96(sp) + 8000013e: 69e6 ld s3,88(sp) + 80000140: 6a46 ld s4,80(sp) + 80000142: 6aa6 ld s5,72(sp) + 80000144: 6b06 ld s6,64(sp) + 80000146: 7be2 ld s7,56(sp) + 80000148: 7c42 ld s8,48(sp) + 8000014a: 7ca2 ld s9,40(sp) + 8000014c: a819 j 80000162 + int i = 0; + 8000014e: 4481 li s1,0 + 80000150: a809 j 80000162 + 80000152: 7906 ld s2,96(sp) + 80000154: 69e6 ld s3,88(sp) + 80000156: 6a46 ld s4,80(sp) + 80000158: 6aa6 ld s5,72(sp) + 8000015a: 6b06 ld s6,64(sp) + 8000015c: 7be2 ld s7,56(sp) + 8000015e: 7c42 ld s8,48(sp) + 80000160: 7ca2 ld s9,40(sp) + } + + return i; +} + 80000162: 8526 mv a0,s1 + 80000164: 70e6 ld ra,120(sp) + 80000166: 7446 ld s0,112(sp) + 80000168: 74a6 ld s1,104(sp) + 8000016a: 6109 addi sp,sp,128 + 8000016c: 8082 ret + +000000008000016e : +// user_dst indicates whether dst is a user +// or kernel address. +// +int +consoleread(int user_dst, uint64 dst, int n) +{ + 8000016e: 711d addi sp,sp,-96 + 80000170: ec86 sd ra,88(sp) + 80000172: e8a2 sd s0,80(sp) + 80000174: e4a6 sd s1,72(sp) + 80000176: e0ca sd s2,64(sp) + 80000178: fc4e sd s3,56(sp) + 8000017a: f852 sd s4,48(sp) + 8000017c: f456 sd s5,40(sp) + 8000017e: f05a sd s6,32(sp) + 80000180: 1080 addi s0,sp,96 + 80000182: 8aaa mv s5,a0 + 80000184: 8a2e mv s4,a1 + 80000186: 89b2 mv s3,a2 + uint target; + int c; + char cbuf; + + target = n; + 80000188: 00060b1b sext.w s6,a2 + acquire(&cons.lock); + 8000018c: 00012517 auipc a0,0x12 + 80000190: 03450513 addi a0,a0,52 # 800121c0 + 80000194: 23b000ef jal 80000bce + while(n > 0){ + // wait until interrupt handler has put some + // input into cons.buffer. + while(cons.r == cons.w){ + 80000198: 00012497 auipc s1,0x12 + 8000019c: 02848493 addi s1,s1,40 # 800121c0 + if(killed(myproc())){ + release(&cons.lock); + return -1; + } + sleep(&cons.r, &cons.lock); + 800001a0: 00012917 auipc s2,0x12 + 800001a4: 0b890913 addi s2,s2,184 # 80012258 + while(n > 0){ + 800001a8: 0b305d63 blez s3,80000262 + while(cons.r == cons.w){ + 800001ac: 0984a783 lw a5,152(s1) + 800001b0: 09c4a703 lw a4,156(s1) + 800001b4: 0af71263 bne a4,a5,80000258 + if(killed(myproc())){ + 800001b8: 716010ef jal 800018ce + 800001bc: 755010ef jal 80002110 + 800001c0: e12d bnez a0,80000222 + sleep(&cons.r, &cons.lock); + 800001c2: 85a6 mv a1,s1 + 800001c4: 854a mv a0,s2 + 800001c6: 513010ef jal 80001ed8 + while(cons.r == cons.w){ + 800001ca: 0984a783 lw a5,152(s1) + 800001ce: 09c4a703 lw a4,156(s1) + 800001d2: fef703e3 beq a4,a5,800001b8 + 800001d6: ec5e sd s7,24(sp) + } + + c = cons.buf[cons.r++ % INPUT_BUF_SIZE]; + 800001d8: 00012717 auipc a4,0x12 + 800001dc: fe870713 addi a4,a4,-24 # 800121c0 + 800001e0: 0017869b addiw a3,a5,1 + 800001e4: 08d72c23 sw a3,152(a4) + 800001e8: 07f7f693 andi a3,a5,127 + 800001ec: 9736 add a4,a4,a3 + 800001ee: 01874703 lbu a4,24(a4) + 800001f2: 00070b9b sext.w s7,a4 + + if(c == C('D')){ // end-of-file + 800001f6: 4691 li a3,4 + 800001f8: 04db8663 beq s7,a3,80000244 + } + break; + } + + // copy the input byte to the user-space buffer. + cbuf = c; + 800001fc: fae407a3 sb a4,-81(s0) + if(either_copyout(user_dst, dst, &cbuf, 1) == -1) + 80000200: 4685 li a3,1 + 80000202: faf40613 addi a2,s0,-81 + 80000206: 85d2 mv a1,s4 + 80000208: 8556 mv a0,s5 + 8000020a: 02a020ef jal 80002234 + 8000020e: 57fd li a5,-1 + 80000210: 04f50863 beq a0,a5,80000260 + break; + + dst++; + 80000214: 0a05 addi s4,s4,1 + --n; + 80000216: 39fd addiw s3,s3,-1 + + if(c == '\n'){ + 80000218: 47a9 li a5,10 + 8000021a: 04fb8d63 beq s7,a5,80000274 + 8000021e: 6be2 ld s7,24(sp) + 80000220: b761 j 800001a8 + release(&cons.lock); + 80000222: 00012517 auipc a0,0x12 + 80000226: f9e50513 addi a0,a0,-98 # 800121c0 + 8000022a: 23d000ef jal 80000c66 + return -1; + 8000022e: 557d li a0,-1 + } + } + release(&cons.lock); + + return target - n; +} + 80000230: 60e6 ld ra,88(sp) + 80000232: 6446 ld s0,80(sp) + 80000234: 64a6 ld s1,72(sp) + 80000236: 6906 ld s2,64(sp) + 80000238: 79e2 ld s3,56(sp) + 8000023a: 7a42 ld s4,48(sp) + 8000023c: 7aa2 ld s5,40(sp) + 8000023e: 7b02 ld s6,32(sp) + 80000240: 6125 addi sp,sp,96 + 80000242: 8082 ret + if(n < target){ + 80000244: 0009871b sext.w a4,s3 + 80000248: 01677a63 bgeu a4,s6,8000025c + cons.r--; + 8000024c: 00012717 auipc a4,0x12 + 80000250: 00f72623 sw a5,12(a4) # 80012258 + 80000254: 6be2 ld s7,24(sp) + 80000256: a031 j 80000262 + 80000258: ec5e sd s7,24(sp) + 8000025a: bfbd j 800001d8 + 8000025c: 6be2 ld s7,24(sp) + 8000025e: a011 j 80000262 + 80000260: 6be2 ld s7,24(sp) + release(&cons.lock); + 80000262: 00012517 auipc a0,0x12 + 80000266: f5e50513 addi a0,a0,-162 # 800121c0 + 8000026a: 1fd000ef jal 80000c66 + return target - n; + 8000026e: 413b053b subw a0,s6,s3 + 80000272: bf7d j 80000230 + 80000274: 6be2 ld s7,24(sp) + 80000276: b7f5 j 80000262 + +0000000080000278 : +{ + 80000278: 1141 addi sp,sp,-16 + 8000027a: e406 sd ra,8(sp) + 8000027c: e022 sd s0,0(sp) + 8000027e: 0800 addi s0,sp,16 + if(c == BACKSPACE){ + 80000280: 10000793 li a5,256 + 80000284: 00f50863 beq a0,a5,80000294 + uartputc_sync(c); + 80000288: 6a4000ef jal 8000092c +} + 8000028c: 60a2 ld ra,8(sp) + 8000028e: 6402 ld s0,0(sp) + 80000290: 0141 addi sp,sp,16 + 80000292: 8082 ret + uartputc_sync('\b'); uartputc_sync(' '); uartputc_sync('\b'); + 80000294: 4521 li a0,8 + 80000296: 696000ef jal 8000092c + 8000029a: 02000513 li a0,32 + 8000029e: 68e000ef jal 8000092c + 800002a2: 4521 li a0,8 + 800002a4: 688000ef jal 8000092c + 800002a8: b7d5 j 8000028c + +00000000800002aa : +// do erase/kill processing, append to cons.buf, +// wake up consoleread() if a whole line has arrived. +// +void +consoleintr(int c) +{ + 800002aa: 1101 addi sp,sp,-32 + 800002ac: ec06 sd ra,24(sp) + 800002ae: e822 sd s0,16(sp) + 800002b0: e426 sd s1,8(sp) + 800002b2: 1000 addi s0,sp,32 + 800002b4: 84aa mv s1,a0 + acquire(&cons.lock); + 800002b6: 00012517 auipc a0,0x12 + 800002ba: f0a50513 addi a0,a0,-246 # 800121c0 + 800002be: 111000ef jal 80000bce + + switch(c){ + 800002c2: 47d5 li a5,21 + 800002c4: 08f48f63 beq s1,a5,80000362 + 800002c8: 0297c563 blt a5,s1,800002f2 + 800002cc: 47a1 li a5,8 + 800002ce: 0ef48463 beq s1,a5,800003b6 + 800002d2: 47c1 li a5,16 + 800002d4: 10f49563 bne s1,a5,800003de + case C('P'): // Print process list. + procdump(); + 800002d8: 7f1010ef jal 800022c8 + } + } + break; + } + + release(&cons.lock); + 800002dc: 00012517 auipc a0,0x12 + 800002e0: ee450513 addi a0,a0,-284 # 800121c0 + 800002e4: 183000ef jal 80000c66 +} + 800002e8: 60e2 ld ra,24(sp) + 800002ea: 6442 ld s0,16(sp) + 800002ec: 64a2 ld s1,8(sp) + 800002ee: 6105 addi sp,sp,32 + 800002f0: 8082 ret + switch(c){ + 800002f2: 07f00793 li a5,127 + 800002f6: 0cf48063 beq s1,a5,800003b6 + if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){ + 800002fa: 00012717 auipc a4,0x12 + 800002fe: ec670713 addi a4,a4,-314 # 800121c0 + 80000302: 0a072783 lw a5,160(a4) + 80000306: 09872703 lw a4,152(a4) + 8000030a: 9f99 subw a5,a5,a4 + 8000030c: 07f00713 li a4,127 + 80000310: fcf766e3 bltu a4,a5,800002dc + c = (c == '\r') ? '\n' : c; + 80000314: 47b5 li a5,13 + 80000316: 0cf48763 beq s1,a5,800003e4 + consputc(c); + 8000031a: 8526 mv a0,s1 + 8000031c: f5dff0ef jal 80000278 + cons.buf[cons.e++ % INPUT_BUF_SIZE] = c; + 80000320: 00012797 auipc a5,0x12 + 80000324: ea078793 addi a5,a5,-352 # 800121c0 + 80000328: 0a07a683 lw a3,160(a5) + 8000032c: 0016871b addiw a4,a3,1 + 80000330: 0007061b sext.w a2,a4 + 80000334: 0ae7a023 sw a4,160(a5) + 80000338: 07f6f693 andi a3,a3,127 + 8000033c: 97b6 add a5,a5,a3 + 8000033e: 00978c23 sb s1,24(a5) + if(c == '\n' || c == C('D') || cons.e-cons.r == INPUT_BUF_SIZE){ + 80000342: 47a9 li a5,10 + 80000344: 0cf48563 beq s1,a5,8000040e + 80000348: 4791 li a5,4 + 8000034a: 0cf48263 beq s1,a5,8000040e + 8000034e: 00012797 auipc a5,0x12 + 80000352: f0a7a783 lw a5,-246(a5) # 80012258 + 80000356: 9f1d subw a4,a4,a5 + 80000358: 08000793 li a5,128 + 8000035c: f8f710e3 bne a4,a5,800002dc + 80000360: a07d j 8000040e + 80000362: e04a sd s2,0(sp) + while(cons.e != cons.w && + 80000364: 00012717 auipc a4,0x12 + 80000368: e5c70713 addi a4,a4,-420 # 800121c0 + 8000036c: 0a072783 lw a5,160(a4) + 80000370: 09c72703 lw a4,156(a4) + cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){ + 80000374: 00012497 auipc s1,0x12 + 80000378: e4c48493 addi s1,s1,-436 # 800121c0 + while(cons.e != cons.w && + 8000037c: 4929 li s2,10 + 8000037e: 02f70863 beq a4,a5,800003ae + cons.buf[(cons.e-1) % INPUT_BUF_SIZE] != '\n'){ + 80000382: 37fd addiw a5,a5,-1 + 80000384: 07f7f713 andi a4,a5,127 + 80000388: 9726 add a4,a4,s1 + while(cons.e != cons.w && + 8000038a: 01874703 lbu a4,24(a4) + 8000038e: 03270263 beq a4,s2,800003b2 + cons.e--; + 80000392: 0af4a023 sw a5,160(s1) + consputc(BACKSPACE); + 80000396: 10000513 li a0,256 + 8000039a: edfff0ef jal 80000278 + while(cons.e != cons.w && + 8000039e: 0a04a783 lw a5,160(s1) + 800003a2: 09c4a703 lw a4,156(s1) + 800003a6: fcf71ee3 bne a4,a5,80000382 + 800003aa: 6902 ld s2,0(sp) + 800003ac: bf05 j 800002dc + 800003ae: 6902 ld s2,0(sp) + 800003b0: b735 j 800002dc + 800003b2: 6902 ld s2,0(sp) + 800003b4: b725 j 800002dc + if(cons.e != cons.w){ + 800003b6: 00012717 auipc a4,0x12 + 800003ba: e0a70713 addi a4,a4,-502 # 800121c0 + 800003be: 0a072783 lw a5,160(a4) + 800003c2: 09c72703 lw a4,156(a4) + 800003c6: f0f70be3 beq a4,a5,800002dc + cons.e--; + 800003ca: 37fd addiw a5,a5,-1 + 800003cc: 00012717 auipc a4,0x12 + 800003d0: e8f72a23 sw a5,-364(a4) # 80012260 + consputc(BACKSPACE); + 800003d4: 10000513 li a0,256 + 800003d8: ea1ff0ef jal 80000278 + 800003dc: b701 j 800002dc + if(c != 0 && cons.e-cons.r < INPUT_BUF_SIZE){ + 800003de: ee048fe3 beqz s1,800002dc + 800003e2: bf21 j 800002fa + consputc(c); + 800003e4: 4529 li a0,10 + 800003e6: e93ff0ef jal 80000278 + cons.buf[cons.e++ % INPUT_BUF_SIZE] = c; + 800003ea: 00012797 auipc a5,0x12 + 800003ee: dd678793 addi a5,a5,-554 # 800121c0 + 800003f2: 0a07a703 lw a4,160(a5) + 800003f6: 0017069b addiw a3,a4,1 + 800003fa: 0006861b sext.w a2,a3 + 800003fe: 0ad7a023 sw a3,160(a5) + 80000402: 07f77713 andi a4,a4,127 + 80000406: 97ba add a5,a5,a4 + 80000408: 4729 li a4,10 + 8000040a: 00e78c23 sb a4,24(a5) + cons.w = cons.e; + 8000040e: 00012797 auipc a5,0x12 + 80000412: e4c7a723 sw a2,-434(a5) # 8001225c + wakeup(&cons.r); + 80000416: 00012517 auipc a0,0x12 + 8000041a: e4250513 addi a0,a0,-446 # 80012258 + 8000041e: 307010ef jal 80001f24 + 80000422: bd6d j 800002dc + +0000000080000424 : + +void +consoleinit(void) +{ + 80000424: 1141 addi sp,sp,-16 + 80000426: e406 sd ra,8(sp) + 80000428: e022 sd s0,0(sp) + 8000042a: 0800 addi s0,sp,16 + initlock(&cons.lock, "cons"); + 8000042c: 00007597 auipc a1,0x7 + 80000430: bd458593 addi a1,a1,-1068 # 80007000 + 80000434: 00012517 auipc a0,0x12 + 80000438: d8c50513 addi a0,a0,-628 # 800121c0 + 8000043c: 712000ef jal 80000b4e + + uartinit(); + 80000440: 400000ef jal 80000840 + + // connect read and write system calls + // to consoleread and consolewrite. + devsw[CONSOLE].read = consoleread; + 80000444: 00022797 auipc a5,0x22 + 80000448: eec78793 addi a5,a5,-276 # 80022330 + 8000044c: 00000717 auipc a4,0x0 + 80000450: d2270713 addi a4,a4,-734 # 8000016e + 80000454: eb98 sd a4,16(a5) + devsw[CONSOLE].write = consolewrite; + 80000456: 00000717 auipc a4,0x0 + 8000045a: c7a70713 addi a4,a4,-902 # 800000d0 + 8000045e: ef98 sd a4,24(a5) +} + 80000460: 60a2 ld ra,8(sp) + 80000462: 6402 ld s0,0(sp) + 80000464: 0141 addi sp,sp,16 + 80000466: 8082 ret + +0000000080000468 : + +static char digits[] = "0123456789abcdef"; + +static void +printint(long long xx, int base, int sign) +{ + 80000468: 7139 addi sp,sp,-64 + 8000046a: fc06 sd ra,56(sp) + 8000046c: f822 sd s0,48(sp) + 8000046e: 0080 addi s0,sp,64 + char buf[20]; + int i; + unsigned long long x; + + if(sign && (sign = (xx < 0))) + 80000470: c219 beqz a2,80000476 + 80000472: 08054063 bltz a0,800004f2 + x = -xx; + else + x = xx; + 80000476: 4881 li a7,0 + 80000478: fc840693 addi a3,s0,-56 + + i = 0; + 8000047c: 4781 li a5,0 + do { + buf[i++] = digits[x % base]; + 8000047e: 00007617 auipc a2,0x7 + 80000482: 29260613 addi a2,a2,658 # 80007710 + 80000486: 883e mv a6,a5 + 80000488: 2785 addiw a5,a5,1 + 8000048a: 02b57733 remu a4,a0,a1 + 8000048e: 9732 add a4,a4,a2 + 80000490: 00074703 lbu a4,0(a4) + 80000494: 00e68023 sb a4,0(a3) + } while((x /= base) != 0); + 80000498: 872a mv a4,a0 + 8000049a: 02b55533 divu a0,a0,a1 + 8000049e: 0685 addi a3,a3,1 + 800004a0: feb773e3 bgeu a4,a1,80000486 + + if(sign) + 800004a4: 00088a63 beqz a7,800004b8 + buf[i++] = '-'; + 800004a8: 1781 addi a5,a5,-32 + 800004aa: 97a2 add a5,a5,s0 + 800004ac: 02d00713 li a4,45 + 800004b0: fee78423 sb a4,-24(a5) + 800004b4: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 800004b8: 02f05963 blez a5,800004ea + 800004bc: f426 sd s1,40(sp) + 800004be: f04a sd s2,32(sp) + 800004c0: fc840713 addi a4,s0,-56 + 800004c4: 00f704b3 add s1,a4,a5 + 800004c8: fff70913 addi s2,a4,-1 + 800004cc: 993e add s2,s2,a5 + 800004ce: 37fd addiw a5,a5,-1 + 800004d0: 1782 slli a5,a5,0x20 + 800004d2: 9381 srli a5,a5,0x20 + 800004d4: 40f90933 sub s2,s2,a5 + consputc(buf[i]); + 800004d8: fff4c503 lbu a0,-1(s1) + 800004dc: d9dff0ef jal 80000278 + while(--i >= 0) + 800004e0: 14fd addi s1,s1,-1 + 800004e2: ff249be3 bne s1,s2,800004d8 + 800004e6: 74a2 ld s1,40(sp) + 800004e8: 7902 ld s2,32(sp) +} + 800004ea: 70e2 ld ra,56(sp) + 800004ec: 7442 ld s0,48(sp) + 800004ee: 6121 addi sp,sp,64 + 800004f0: 8082 ret + x = -xx; + 800004f2: 40a00533 neg a0,a0 + if(sign && (sign = (xx < 0))) + 800004f6: 4885 li a7,1 + x = -xx; + 800004f8: b741 j 80000478 + +00000000800004fa : +} + +// Print to the console. +int +printf(char *fmt, ...) +{ + 800004fa: 7131 addi sp,sp,-192 + 800004fc: fc86 sd ra,120(sp) + 800004fe: f8a2 sd s0,112(sp) + 80000500: e8d2 sd s4,80(sp) + 80000502: 0100 addi s0,sp,128 + 80000504: 8a2a mv s4,a0 + 80000506: e40c sd a1,8(s0) + 80000508: e810 sd a2,16(s0) + 8000050a: ec14 sd a3,24(s0) + 8000050c: f018 sd a4,32(s0) + 8000050e: f41c sd a5,40(s0) + 80000510: 03043823 sd a6,48(s0) + 80000514: 03143c23 sd a7,56(s0) + va_list ap; + int i, cx, c0, c1, c2; + char *s; + + if(panicking == 0) + 80000518: 0000a797 auipc a5,0xa + 8000051c: c7c7a783 lw a5,-900(a5) # 8000a194 + 80000520: c3a1 beqz a5,80000560 + acquire(&pr.lock); + + va_start(ap, fmt); + 80000522: 00840793 addi a5,s0,8 + 80000526: f8f43423 sd a5,-120(s0) + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ + 8000052a: 000a4503 lbu a0,0(s4) + 8000052e: 28050763 beqz a0,800007bc + 80000532: f4a6 sd s1,104(sp) + 80000534: f0ca sd s2,96(sp) + 80000536: ecce sd s3,88(sp) + 80000538: e4d6 sd s5,72(sp) + 8000053a: e0da sd s6,64(sp) + 8000053c: f862 sd s8,48(sp) + 8000053e: f466 sd s9,40(sp) + 80000540: f06a sd s10,32(sp) + 80000542: ec6e sd s11,24(sp) + 80000544: 4981 li s3,0 + if(cx != '%'){ + 80000546: 02500a93 li s5,37 + i++; + c0 = fmt[i+0] & 0xff; + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 8000054a: 06400b13 li s6,100 + printint(va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 8000054e: 06c00c13 li s8,108 + printint(va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 80000552: 07500c93 li s9,117 + printint(va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 80000556: 07800d13 li s10,120 + printint(va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 8000055a: 07000d93 li s11,112 + 8000055e: a01d j 80000584 + acquire(&pr.lock); + 80000560: 00012517 auipc a0,0x12 + 80000564: d0850513 addi a0,a0,-760 # 80012268 + 80000568: 666000ef jal 80000bce + 8000056c: bf5d j 80000522 + consputc(cx); + 8000056e: d0bff0ef jal 80000278 + continue; + 80000572: 84ce mv s1,s3 + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ + 80000574: 0014899b addiw s3,s1,1 + 80000578: 013a07b3 add a5,s4,s3 + 8000057c: 0007c503 lbu a0,0(a5) + 80000580: 20050b63 beqz a0,80000796 + if(cx != '%'){ + 80000584: ff5515e3 bne a0,s5,8000056e + i++; + 80000588: 0019849b addiw s1,s3,1 + c0 = fmt[i+0] & 0xff; + 8000058c: 009a07b3 add a5,s4,s1 + 80000590: 0007c903 lbu s2,0(a5) + if(c0) c1 = fmt[i+1] & 0xff; + 80000594: 20090b63 beqz s2,800007aa + 80000598: 0017c783 lbu a5,1(a5) + c1 = c2 = 0; + 8000059c: 86be mv a3,a5 + if(c1) c2 = fmt[i+2] & 0xff; + 8000059e: c789 beqz a5,800005a8 + 800005a0: 009a0733 add a4,s4,s1 + 800005a4: 00274683 lbu a3,2(a4) + if(c0 == 'd'){ + 800005a8: 03690963 beq s2,s6,800005da + } else if(c0 == 'l' && c1 == 'd'){ + 800005ac: 05890363 beq s2,s8,800005f2 + } else if(c0 == 'u'){ + 800005b0: 0d990663 beq s2,s9,8000067c + } else if(c0 == 'x'){ + 800005b4: 11a90d63 beq s2,s10,800006ce + } else if(c0 == 'p'){ + 800005b8: 15b90663 beq s2,s11,80000704 + printptr(va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 800005bc: 06300793 li a5,99 + 800005c0: 18f90563 beq s2,a5,8000074a + consputc(va_arg(ap, uint)); + } else if(c0 == 's'){ + 800005c4: 07300793 li a5,115 + 800005c8: 18f90b63 beq s2,a5,8000075e + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + consputc(*s); + } else if(c0 == '%'){ + 800005cc: 03591b63 bne s2,s5,80000602 + consputc('%'); + 800005d0: 02500513 li a0,37 + 800005d4: ca5ff0ef jal 80000278 + 800005d8: bf71 j 80000574 + printint(va_arg(ap, int), 10, 1); + 800005da: f8843783 ld a5,-120(s0) + 800005de: 00878713 addi a4,a5,8 + 800005e2: f8e43423 sd a4,-120(s0) + 800005e6: 4605 li a2,1 + 800005e8: 45a9 li a1,10 + 800005ea: 4388 lw a0,0(a5) + 800005ec: e7dff0ef jal 80000468 + 800005f0: b751 j 80000574 + } else if(c0 == 'l' && c1 == 'd'){ + 800005f2: 01678f63 beq a5,s6,80000610 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 800005f6: 03878b63 beq a5,s8,8000062c + } else if(c0 == 'l' && c1 == 'u'){ + 800005fa: 09978e63 beq a5,s9,80000696 + } else if(c0 == 'l' && c1 == 'x'){ + 800005fe: 0fa78563 beq a5,s10,800006e8 + } else if(c0 == 0){ + break; + } else { + // Print unknown % sequence to draw attention. + consputc('%'); + 80000602: 8556 mv a0,s5 + 80000604: c75ff0ef jal 80000278 + consputc(c0); + 80000608: 854a mv a0,s2 + 8000060a: c6fff0ef jal 80000278 + 8000060e: b79d j 80000574 + printint(va_arg(ap, uint64), 10, 1); + 80000610: f8843783 ld a5,-120(s0) + 80000614: 00878713 addi a4,a5,8 + 80000618: f8e43423 sd a4,-120(s0) + 8000061c: 4605 li a2,1 + 8000061e: 45a9 li a1,10 + 80000620: 6388 ld a0,0(a5) + 80000622: e47ff0ef jal 80000468 + i += 1; + 80000626: 0029849b addiw s1,s3,2 + 8000062a: b7a9 j 80000574 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 8000062c: 06400793 li a5,100 + 80000630: 02f68863 beq a3,a5,80000660 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 80000634: 07500793 li a5,117 + 80000638: 06f68d63 beq a3,a5,800006b2 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 8000063c: 07800793 li a5,120 + 80000640: fcf691e3 bne a3,a5,80000602 + printint(va_arg(ap, uint64), 16, 0); + 80000644: f8843783 ld a5,-120(s0) + 80000648: 00878713 addi a4,a5,8 + 8000064c: f8e43423 sd a4,-120(s0) + 80000650: 4601 li a2,0 + 80000652: 45c1 li a1,16 + 80000654: 6388 ld a0,0(a5) + 80000656: e13ff0ef jal 80000468 + i += 2; + 8000065a: 0039849b addiw s1,s3,3 + 8000065e: bf19 j 80000574 + printint(va_arg(ap, uint64), 10, 1); + 80000660: f8843783 ld a5,-120(s0) + 80000664: 00878713 addi a4,a5,8 + 80000668: f8e43423 sd a4,-120(s0) + 8000066c: 4605 li a2,1 + 8000066e: 45a9 li a1,10 + 80000670: 6388 ld a0,0(a5) + 80000672: df7ff0ef jal 80000468 + i += 2; + 80000676: 0039849b addiw s1,s3,3 + 8000067a: bded j 80000574 + printint(va_arg(ap, uint32), 10, 0); + 8000067c: f8843783 ld a5,-120(s0) + 80000680: 00878713 addi a4,a5,8 + 80000684: f8e43423 sd a4,-120(s0) + 80000688: 4601 li a2,0 + 8000068a: 45a9 li a1,10 + 8000068c: 0007e503 lwu a0,0(a5) + 80000690: dd9ff0ef jal 80000468 + 80000694: b5c5 j 80000574 + printint(va_arg(ap, uint64), 10, 0); + 80000696: f8843783 ld a5,-120(s0) + 8000069a: 00878713 addi a4,a5,8 + 8000069e: f8e43423 sd a4,-120(s0) + 800006a2: 4601 li a2,0 + 800006a4: 45a9 li a1,10 + 800006a6: 6388 ld a0,0(a5) + 800006a8: dc1ff0ef jal 80000468 + i += 1; + 800006ac: 0029849b addiw s1,s3,2 + 800006b0: b5d1 j 80000574 + printint(va_arg(ap, uint64), 10, 0); + 800006b2: f8843783 ld a5,-120(s0) + 800006b6: 00878713 addi a4,a5,8 + 800006ba: f8e43423 sd a4,-120(s0) + 800006be: 4601 li a2,0 + 800006c0: 45a9 li a1,10 + 800006c2: 6388 ld a0,0(a5) + 800006c4: da5ff0ef jal 80000468 + i += 2; + 800006c8: 0039849b addiw s1,s3,3 + 800006cc: b565 j 80000574 + printint(va_arg(ap, uint32), 16, 0); + 800006ce: f8843783 ld a5,-120(s0) + 800006d2: 00878713 addi a4,a5,8 + 800006d6: f8e43423 sd a4,-120(s0) + 800006da: 4601 li a2,0 + 800006dc: 45c1 li a1,16 + 800006de: 0007e503 lwu a0,0(a5) + 800006e2: d87ff0ef jal 80000468 + 800006e6: b579 j 80000574 + printint(va_arg(ap, uint64), 16, 0); + 800006e8: f8843783 ld a5,-120(s0) + 800006ec: 00878713 addi a4,a5,8 + 800006f0: f8e43423 sd a4,-120(s0) + 800006f4: 4601 li a2,0 + 800006f6: 45c1 li a1,16 + 800006f8: 6388 ld a0,0(a5) + 800006fa: d6fff0ef jal 80000468 + i += 1; + 800006fe: 0029849b addiw s1,s3,2 + 80000702: bd8d j 80000574 + 80000704: fc5e sd s7,56(sp) + printptr(va_arg(ap, uint64)); + 80000706: f8843783 ld a5,-120(s0) + 8000070a: 00878713 addi a4,a5,8 + 8000070e: f8e43423 sd a4,-120(s0) + 80000712: 0007b983 ld s3,0(a5) + consputc('0'); + 80000716: 03000513 li a0,48 + 8000071a: b5fff0ef jal 80000278 + consputc('x'); + 8000071e: 07800513 li a0,120 + 80000722: b57ff0ef jal 80000278 + 80000726: 4941 li s2,16 + consputc(digits[x >> (sizeof(uint64) * 8 - 4)]); + 80000728: 00007b97 auipc s7,0x7 + 8000072c: fe8b8b93 addi s7,s7,-24 # 80007710 + 80000730: 03c9d793 srli a5,s3,0x3c + 80000734: 97de add a5,a5,s7 + 80000736: 0007c503 lbu a0,0(a5) + 8000073a: b3fff0ef jal 80000278 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 8000073e: 0992 slli s3,s3,0x4 + 80000740: 397d addiw s2,s2,-1 + 80000742: fe0917e3 bnez s2,80000730 + 80000746: 7be2 ld s7,56(sp) + 80000748: b535 j 80000574 + consputc(va_arg(ap, uint)); + 8000074a: f8843783 ld a5,-120(s0) + 8000074e: 00878713 addi a4,a5,8 + 80000752: f8e43423 sd a4,-120(s0) + 80000756: 4388 lw a0,0(a5) + 80000758: b21ff0ef jal 80000278 + 8000075c: bd21 j 80000574 + if((s = va_arg(ap, char*)) == 0) + 8000075e: f8843783 ld a5,-120(s0) + 80000762: 00878713 addi a4,a5,8 + 80000766: f8e43423 sd a4,-120(s0) + 8000076a: 0007b903 ld s2,0(a5) + 8000076e: 00090d63 beqz s2,80000788 + for(; *s; s++) + 80000772: 00094503 lbu a0,0(s2) + 80000776: de050fe3 beqz a0,80000574 + consputc(*s); + 8000077a: affff0ef jal 80000278 + for(; *s; s++) + 8000077e: 0905 addi s2,s2,1 + 80000780: 00094503 lbu a0,0(s2) + 80000784: f97d bnez a0,8000077a + 80000786: b3fd j 80000574 + s = "(null)"; + 80000788: 00007917 auipc s2,0x7 + 8000078c: 88090913 addi s2,s2,-1920 # 80007008 + for(; *s; s++) + 80000790: 02800513 li a0,40 + 80000794: b7dd j 8000077a + 80000796: 74a6 ld s1,104(sp) + 80000798: 7906 ld s2,96(sp) + 8000079a: 69e6 ld s3,88(sp) + 8000079c: 6aa6 ld s5,72(sp) + 8000079e: 6b06 ld s6,64(sp) + 800007a0: 7c42 ld s8,48(sp) + 800007a2: 7ca2 ld s9,40(sp) + 800007a4: 7d02 ld s10,32(sp) + 800007a6: 6de2 ld s11,24(sp) + 800007a8: a811 j 800007bc + 800007aa: 74a6 ld s1,104(sp) + 800007ac: 7906 ld s2,96(sp) + 800007ae: 69e6 ld s3,88(sp) + 800007b0: 6aa6 ld s5,72(sp) + 800007b2: 6b06 ld s6,64(sp) + 800007b4: 7c42 ld s8,48(sp) + 800007b6: 7ca2 ld s9,40(sp) + 800007b8: 7d02 ld s10,32(sp) + 800007ba: 6de2 ld s11,24(sp) + } + + } + va_end(ap); + + if(panicking == 0) + 800007bc: 0000a797 auipc a5,0xa + 800007c0: 9d87a783 lw a5,-1576(a5) # 8000a194 + 800007c4: c799 beqz a5,800007d2 + release(&pr.lock); + + return 0; +} + 800007c6: 4501 li a0,0 + 800007c8: 70e6 ld ra,120(sp) + 800007ca: 7446 ld s0,112(sp) + 800007cc: 6a46 ld s4,80(sp) + 800007ce: 6129 addi sp,sp,192 + 800007d0: 8082 ret + release(&pr.lock); + 800007d2: 00012517 auipc a0,0x12 + 800007d6: a9650513 addi a0,a0,-1386 # 80012268 + 800007da: 48c000ef jal 80000c66 + return 0; + 800007de: b7e5 j 800007c6 + +00000000800007e0 : + +void +panic(char *s) +{ + 800007e0: 1101 addi sp,sp,-32 + 800007e2: ec06 sd ra,24(sp) + 800007e4: e822 sd s0,16(sp) + 800007e6: e426 sd s1,8(sp) + 800007e8: e04a sd s2,0(sp) + 800007ea: 1000 addi s0,sp,32 + 800007ec: 84aa mv s1,a0 + panicking = 1; + 800007ee: 4905 li s2,1 + 800007f0: 0000a797 auipc a5,0xa + 800007f4: 9b27a223 sw s2,-1628(a5) # 8000a194 + printf("panic: "); + 800007f8: 00007517 auipc a0,0x7 + 800007fc: 82050513 addi a0,a0,-2016 # 80007018 + 80000800: cfbff0ef jal 800004fa + printf("%s\n", s); + 80000804: 85a6 mv a1,s1 + 80000806: 00007517 auipc a0,0x7 + 8000080a: 81a50513 addi a0,a0,-2022 # 80007020 + 8000080e: cedff0ef jal 800004fa + panicked = 1; // freeze uart output from other CPUs + 80000812: 0000a797 auipc a5,0xa + 80000816: 9727af23 sw s2,-1666(a5) # 8000a190 + for(;;) + 8000081a: a001 j 8000081a + +000000008000081c : + ; +} + +void +printfinit(void) +{ + 8000081c: 1141 addi sp,sp,-16 + 8000081e: e406 sd ra,8(sp) + 80000820: e022 sd s0,0(sp) + 80000822: 0800 addi s0,sp,16 + initlock(&pr.lock, "pr"); + 80000824: 00007597 auipc a1,0x7 + 80000828: 80458593 addi a1,a1,-2044 # 80007028 + 8000082c: 00012517 auipc a0,0x12 + 80000830: a3c50513 addi a0,a0,-1476 # 80012268 + 80000834: 31a000ef jal 80000b4e +} + 80000838: 60a2 ld ra,8(sp) + 8000083a: 6402 ld s0,0(sp) + 8000083c: 0141 addi sp,sp,16 + 8000083e: 8082 ret + +0000000080000840 : +extern volatile int panicking; // from printf.c +extern volatile int panicked; // from printf.c + +void +uartinit(void) +{ + 80000840: 1141 addi sp,sp,-16 + 80000842: e406 sd ra,8(sp) + 80000844: e022 sd s0,0(sp) + 80000846: 0800 addi s0,sp,16 + // disable interrupts. + WriteReg(IER, 0x00); + 80000848: 100007b7 lui a5,0x10000 + 8000084c: 000780a3 sb zero,1(a5) # 10000001 <_entry-0x6fffffff> + + // special mode to set baud rate. + WriteReg(LCR, LCR_BAUD_LATCH); + 80000850: 10000737 lui a4,0x10000 + 80000854: f8000693 li a3,-128 + 80000858: 00d701a3 sb a3,3(a4) # 10000003 <_entry-0x6ffffffd> + + // LSB for baud rate of 38.4K. + WriteReg(0, 0x03); + 8000085c: 468d li a3,3 + 8000085e: 10000637 lui a2,0x10000 + 80000862: 00d60023 sb a3,0(a2) # 10000000 <_entry-0x70000000> + + // MSB for baud rate of 38.4K. + WriteReg(1, 0x00); + 80000866: 000780a3 sb zero,1(a5) + + // leave set-baud mode, + // and set word length to 8 bits, no parity. + WriteReg(LCR, LCR_EIGHT_BITS); + 8000086a: 00d701a3 sb a3,3(a4) + + // reset and enable FIFOs. + WriteReg(FCR, FCR_FIFO_ENABLE | FCR_FIFO_CLEAR); + 8000086e: 10000737 lui a4,0x10000 + 80000872: 461d li a2,7 + 80000874: 00c70123 sb a2,2(a4) # 10000002 <_entry-0x6ffffffe> + + // enable transmit and receive interrupts. + WriteReg(IER, IER_TX_ENABLE | IER_RX_ENABLE); + 80000878: 00d780a3 sb a3,1(a5) + + initlock(&tx_lock, "uart"); + 8000087c: 00006597 auipc a1,0x6 + 80000880: 7b458593 addi a1,a1,1972 # 80007030 + 80000884: 00012517 auipc a0,0x12 + 80000888: 9fc50513 addi a0,a0,-1540 # 80012280 + 8000088c: 2c2000ef jal 80000b4e +} + 80000890: 60a2 ld ra,8(sp) + 80000892: 6402 ld s0,0(sp) + 80000894: 0141 addi sp,sp,16 + 80000896: 8082 ret + +0000000080000898 : +// transmit buf[] to the uart. it blocks if the +// uart is busy, so it cannot be called from +// interrupts, only from write() system calls. +void +uartwrite(char buf[], int n) +{ + 80000898: 715d addi sp,sp,-80 + 8000089a: e486 sd ra,72(sp) + 8000089c: e0a2 sd s0,64(sp) + 8000089e: fc26 sd s1,56(sp) + 800008a0: ec56 sd s5,24(sp) + 800008a2: 0880 addi s0,sp,80 + 800008a4: 8aaa mv s5,a0 + 800008a6: 84ae mv s1,a1 + acquire(&tx_lock); + 800008a8: 00012517 auipc a0,0x12 + 800008ac: 9d850513 addi a0,a0,-1576 # 80012280 + 800008b0: 31e000ef jal 80000bce + + int i = 0; + while(i < n){ + 800008b4: 06905063 blez s1,80000914 + 800008b8: f84a sd s2,48(sp) + 800008ba: f44e sd s3,40(sp) + 800008bc: f052 sd s4,32(sp) + 800008be: e85a sd s6,16(sp) + 800008c0: e45e sd s7,8(sp) + 800008c2: 8a56 mv s4,s5 + 800008c4: 9aa6 add s5,s5,s1 + while(tx_busy != 0){ + 800008c6: 0000a497 auipc s1,0xa + 800008ca: 8d648493 addi s1,s1,-1834 # 8000a19c + // wait for a UART transmit-complete interrupt + // to set tx_busy to 0. + sleep(&tx_chan, &tx_lock); + 800008ce: 00012997 auipc s3,0x12 + 800008d2: 9b298993 addi s3,s3,-1614 # 80012280 + 800008d6: 0000a917 auipc s2,0xa + 800008da: 8c290913 addi s2,s2,-1854 # 8000a198 + } + + WriteReg(THR, buf[i]); + 800008de: 10000bb7 lui s7,0x10000 + i += 1; + tx_busy = 1; + 800008e2: 4b05 li s6,1 + 800008e4: a005 j 80000904 + sleep(&tx_chan, &tx_lock); + 800008e6: 85ce mv a1,s3 + 800008e8: 854a mv a0,s2 + 800008ea: 5ee010ef jal 80001ed8 + while(tx_busy != 0){ + 800008ee: 409c lw a5,0(s1) + 800008f0: fbfd bnez a5,800008e6 + WriteReg(THR, buf[i]); + 800008f2: 000a4783 lbu a5,0(s4) + 800008f6: 00fb8023 sb a5,0(s7) # 10000000 <_entry-0x70000000> + tx_busy = 1; + 800008fa: 0164a023 sw s6,0(s1) + while(i < n){ + 800008fe: 0a05 addi s4,s4,1 + 80000900: 015a0563 beq s4,s5,8000090a + while(tx_busy != 0){ + 80000904: 409c lw a5,0(s1) + 80000906: f3e5 bnez a5,800008e6 + 80000908: b7ed j 800008f2 + 8000090a: 7942 ld s2,48(sp) + 8000090c: 79a2 ld s3,40(sp) + 8000090e: 7a02 ld s4,32(sp) + 80000910: 6b42 ld s6,16(sp) + 80000912: 6ba2 ld s7,8(sp) + } + + release(&tx_lock); + 80000914: 00012517 auipc a0,0x12 + 80000918: 96c50513 addi a0,a0,-1684 # 80012280 + 8000091c: 34a000ef jal 80000c66 +} + 80000920: 60a6 ld ra,72(sp) + 80000922: 6406 ld s0,64(sp) + 80000924: 74e2 ld s1,56(sp) + 80000926: 6ae2 ld s5,24(sp) + 80000928: 6161 addi sp,sp,80 + 8000092a: 8082 ret + +000000008000092c : +// interrupts, for use by kernel printf() and +// to echo characters. it spins waiting for the uart's +// output register to be empty. +void +uartputc_sync(int c) +{ + 8000092c: 1101 addi sp,sp,-32 + 8000092e: ec06 sd ra,24(sp) + 80000930: e822 sd s0,16(sp) + 80000932: e426 sd s1,8(sp) + 80000934: 1000 addi s0,sp,32 + 80000936: 84aa mv s1,a0 + if(panicking == 0) + 80000938: 0000a797 auipc a5,0xa + 8000093c: 85c7a783 lw a5,-1956(a5) # 8000a194 + 80000940: cf95 beqz a5,8000097c + push_off(); + + if(panicked){ + 80000942: 0000a797 auipc a5,0xa + 80000946: 84e7a783 lw a5,-1970(a5) # 8000a190 + 8000094a: ef85 bnez a5,80000982 + for(;;) + ; + } + + // wait for UART to set Transmit Holding Empty in LSR. + while((ReadReg(LSR) & LSR_TX_IDLE) == 0) + 8000094c: 10000737 lui a4,0x10000 + 80000950: 0715 addi a4,a4,5 # 10000005 <_entry-0x6ffffffb> + 80000952: 00074783 lbu a5,0(a4) + 80000956: 0207f793 andi a5,a5,32 + 8000095a: dfe5 beqz a5,80000952 + ; + WriteReg(THR, c); + 8000095c: 0ff4f513 zext.b a0,s1 + 80000960: 100007b7 lui a5,0x10000 + 80000964: 00a78023 sb a0,0(a5) # 10000000 <_entry-0x70000000> + + if(panicking == 0) + 80000968: 0000a797 auipc a5,0xa + 8000096c: 82c7a783 lw a5,-2004(a5) # 8000a194 + 80000970: cb91 beqz a5,80000984 + pop_off(); +} + 80000972: 60e2 ld ra,24(sp) + 80000974: 6442 ld s0,16(sp) + 80000976: 64a2 ld s1,8(sp) + 80000978: 6105 addi sp,sp,32 + 8000097a: 8082 ret + push_off(); + 8000097c: 212000ef jal 80000b8e + 80000980: b7c9 j 80000942 + for(;;) + 80000982: a001 j 80000982 + pop_off(); + 80000984: 28e000ef jal 80000c12 +} + 80000988: b7ed j 80000972 + +000000008000098a : + +// try to read one input character from the UART. +// return -1 if none is waiting. +int +uartgetc(void) +{ + 8000098a: 1141 addi sp,sp,-16 + 8000098c: e422 sd s0,8(sp) + 8000098e: 0800 addi s0,sp,16 + if(ReadReg(LSR) & LSR_RX_READY){ + 80000990: 100007b7 lui a5,0x10000 + 80000994: 0795 addi a5,a5,5 # 10000005 <_entry-0x6ffffffb> + 80000996: 0007c783 lbu a5,0(a5) + 8000099a: 8b85 andi a5,a5,1 + 8000099c: cb81 beqz a5,800009ac + // input data is ready. + return ReadReg(RHR); + 8000099e: 100007b7 lui a5,0x10000 + 800009a2: 0007c503 lbu a0,0(a5) # 10000000 <_entry-0x70000000> + } else { + return -1; + } +} + 800009a6: 6422 ld s0,8(sp) + 800009a8: 0141 addi sp,sp,16 + 800009aa: 8082 ret + return -1; + 800009ac: 557d li a0,-1 + 800009ae: bfe5 j 800009a6 + +00000000800009b0 : +// handle a uart interrupt, raised because input has +// arrived, or the uart is ready for more output, or +// both. called from devintr(). +void +uartintr(void) +{ + 800009b0: 1101 addi sp,sp,-32 + 800009b2: ec06 sd ra,24(sp) + 800009b4: e822 sd s0,16(sp) + 800009b6: e426 sd s1,8(sp) + 800009b8: 1000 addi s0,sp,32 + ReadReg(ISR); // acknowledge the interrupt + 800009ba: 100007b7 lui a5,0x10000 + 800009be: 0789 addi a5,a5,2 # 10000002 <_entry-0x6ffffffe> + 800009c0: 0007c783 lbu a5,0(a5) + + acquire(&tx_lock); + 800009c4: 00012517 auipc a0,0x12 + 800009c8: 8bc50513 addi a0,a0,-1860 # 80012280 + 800009cc: 202000ef jal 80000bce + if(ReadReg(LSR) & LSR_TX_IDLE){ + 800009d0: 100007b7 lui a5,0x10000 + 800009d4: 0795 addi a5,a5,5 # 10000005 <_entry-0x6ffffffb> + 800009d6: 0007c783 lbu a5,0(a5) + 800009da: 0207f793 andi a5,a5,32 + 800009de: eb89 bnez a5,800009f0 + // UART finished transmitting; wake up sending thread. + tx_busy = 0; + wakeup(&tx_chan); + } + release(&tx_lock); + 800009e0: 00012517 auipc a0,0x12 + 800009e4: 8a050513 addi a0,a0,-1888 # 80012280 + 800009e8: 27e000ef jal 80000c66 + + // read and process incoming characters, if any. + while(1){ + int c = uartgetc(); + if(c == -1) + 800009ec: 54fd li s1,-1 + 800009ee: a831 j 80000a0a + tx_busy = 0; + 800009f0: 00009797 auipc a5,0x9 + 800009f4: 7a07a623 sw zero,1964(a5) # 8000a19c + wakeup(&tx_chan); + 800009f8: 00009517 auipc a0,0x9 + 800009fc: 7a050513 addi a0,a0,1952 # 8000a198 + 80000a00: 524010ef jal 80001f24 + 80000a04: bff1 j 800009e0 + break; + consoleintr(c); + 80000a06: 8a5ff0ef jal 800002aa + int c = uartgetc(); + 80000a0a: f81ff0ef jal 8000098a + if(c == -1) + 80000a0e: fe951ce3 bne a0,s1,80000a06 + } +} + 80000a12: 60e2 ld ra,24(sp) + 80000a14: 6442 ld s0,16(sp) + 80000a16: 64a2 ld s1,8(sp) + 80000a18: 6105 addi sp,sp,32 + 80000a1a: 8082 ret + +0000000080000a1c : +// 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) +{ + 80000a1c: 1101 addi sp,sp,-32 + 80000a1e: ec06 sd ra,24(sp) + 80000a20: e822 sd s0,16(sp) + 80000a22: e426 sd s1,8(sp) + 80000a24: e04a sd s2,0(sp) + 80000a26: 1000 addi s0,sp,32 + struct run *r; + + if(((uint64)pa % PGSIZE) != 0 || (char*)pa < end || (uint64)pa >= PHYSTOP) + 80000a28: 03451793 slli a5,a0,0x34 + 80000a2c: e7a9 bnez a5,80000a76 + 80000a2e: 84aa mv s1,a0 + 80000a30: 00023797 auipc a5,0x23 + 80000a34: a9878793 addi a5,a5,-1384 # 800234c8 + 80000a38: 02f56f63 bltu a0,a5,80000a76 + 80000a3c: 47c5 li a5,17 + 80000a3e: 07ee slli a5,a5,0x1b + 80000a40: 02f57b63 bgeu a0,a5,80000a76 + panic("kfree"); + + // Fill with junk to catch dangling refs. + memset(pa, 1, PGSIZE); + 80000a44: 6605 lui a2,0x1 + 80000a46: 4585 li a1,1 + 80000a48: 25a000ef jal 80000ca2 + + r = (struct run*)pa; + + acquire(&kmem.lock); + 80000a4c: 00012917 auipc s2,0x12 + 80000a50: 84c90913 addi s2,s2,-1972 # 80012298 + 80000a54: 854a mv a0,s2 + 80000a56: 178000ef jal 80000bce + r->next = kmem.freelist; + 80000a5a: 01893783 ld a5,24(s2) + 80000a5e: e09c sd a5,0(s1) + kmem.freelist = r; + 80000a60: 00993c23 sd s1,24(s2) + release(&kmem.lock); + 80000a64: 854a mv a0,s2 + 80000a66: 200000ef jal 80000c66 +} + 80000a6a: 60e2 ld ra,24(sp) + 80000a6c: 6442 ld s0,16(sp) + 80000a6e: 64a2 ld s1,8(sp) + 80000a70: 6902 ld s2,0(sp) + 80000a72: 6105 addi sp,sp,32 + 80000a74: 8082 ret + panic("kfree"); + 80000a76: 00006517 auipc a0,0x6 + 80000a7a: 5c250513 addi a0,a0,1474 # 80007038 + 80000a7e: d63ff0ef jal 800007e0 + +0000000080000a82 : +{ + 80000a82: 7179 addi sp,sp,-48 + 80000a84: f406 sd ra,40(sp) + 80000a86: f022 sd s0,32(sp) + 80000a88: ec26 sd s1,24(sp) + 80000a8a: 1800 addi s0,sp,48 + p = (char*)PGROUNDUP((uint64)pa_start); + 80000a8c: 6785 lui a5,0x1 + 80000a8e: fff78713 addi a4,a5,-1 # fff <_entry-0x7ffff001> + 80000a92: 00e504b3 add s1,a0,a4 + 80000a96: 777d lui a4,0xfffff + 80000a98: 8cf9 and s1,s1,a4 + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + 80000a9a: 94be add s1,s1,a5 + 80000a9c: 0295e263 bltu a1,s1,80000ac0 + 80000aa0: e84a sd s2,16(sp) + 80000aa2: e44e sd s3,8(sp) + 80000aa4: e052 sd s4,0(sp) + 80000aa6: 892e mv s2,a1 + kfree(p); + 80000aa8: 7a7d lui s4,0xfffff + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + 80000aaa: 6985 lui s3,0x1 + kfree(p); + 80000aac: 01448533 add a0,s1,s4 + 80000ab0: f6dff0ef jal 80000a1c + for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE) + 80000ab4: 94ce add s1,s1,s3 + 80000ab6: fe997be3 bgeu s2,s1,80000aac + 80000aba: 6942 ld s2,16(sp) + 80000abc: 69a2 ld s3,8(sp) + 80000abe: 6a02 ld s4,0(sp) +} + 80000ac0: 70a2 ld ra,40(sp) + 80000ac2: 7402 ld s0,32(sp) + 80000ac4: 64e2 ld s1,24(sp) + 80000ac6: 6145 addi sp,sp,48 + 80000ac8: 8082 ret + +0000000080000aca : +{ + 80000aca: 1141 addi sp,sp,-16 + 80000acc: e406 sd ra,8(sp) + 80000ace: e022 sd s0,0(sp) + 80000ad0: 0800 addi s0,sp,16 + initlock(&kmem.lock, "kmem"); + 80000ad2: 00006597 auipc a1,0x6 + 80000ad6: 56e58593 addi a1,a1,1390 # 80007040 + 80000ada: 00011517 auipc a0,0x11 + 80000ade: 7be50513 addi a0,a0,1982 # 80012298 + 80000ae2: 06c000ef jal 80000b4e + freerange(end, (void*)PHYSTOP); + 80000ae6: 45c5 li a1,17 + 80000ae8: 05ee slli a1,a1,0x1b + 80000aea: 00023517 auipc a0,0x23 + 80000aee: 9de50513 addi a0,a0,-1570 # 800234c8 + 80000af2: f91ff0ef jal 80000a82 +} + 80000af6: 60a2 ld ra,8(sp) + 80000af8: 6402 ld s0,0(sp) + 80000afa: 0141 addi sp,sp,16 + 80000afc: 8082 ret + +0000000080000afe : +// 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) +{ + 80000afe: 1101 addi sp,sp,-32 + 80000b00: ec06 sd ra,24(sp) + 80000b02: e822 sd s0,16(sp) + 80000b04: e426 sd s1,8(sp) + 80000b06: 1000 addi s0,sp,32 + struct run *r; + + acquire(&kmem.lock); + 80000b08: 00011497 auipc s1,0x11 + 80000b0c: 79048493 addi s1,s1,1936 # 80012298 + 80000b10: 8526 mv a0,s1 + 80000b12: 0bc000ef jal 80000bce + r = kmem.freelist; + 80000b16: 6c84 ld s1,24(s1) + if(r) + 80000b18: c485 beqz s1,80000b40 + kmem.freelist = r->next; + 80000b1a: 609c ld a5,0(s1) + 80000b1c: 00011517 auipc a0,0x11 + 80000b20: 77c50513 addi a0,a0,1916 # 80012298 + 80000b24: ed1c sd a5,24(a0) + release(&kmem.lock); + 80000b26: 140000ef jal 80000c66 + + if(r) + memset((char*)r, 5, PGSIZE); // fill with junk + 80000b2a: 6605 lui a2,0x1 + 80000b2c: 4595 li a1,5 + 80000b2e: 8526 mv a0,s1 + 80000b30: 172000ef jal 80000ca2 + return (void*)r; +} + 80000b34: 8526 mv a0,s1 + 80000b36: 60e2 ld ra,24(sp) + 80000b38: 6442 ld s0,16(sp) + 80000b3a: 64a2 ld s1,8(sp) + 80000b3c: 6105 addi sp,sp,32 + 80000b3e: 8082 ret + release(&kmem.lock); + 80000b40: 00011517 auipc a0,0x11 + 80000b44: 75850513 addi a0,a0,1880 # 80012298 + 80000b48: 11e000ef jal 80000c66 + if(r) + 80000b4c: b7e5 j 80000b34 + +0000000080000b4e : +#include "proc.h" +#include "defs.h" + +void +initlock(struct spinlock *lk, char *name) +{ + 80000b4e: 1141 addi sp,sp,-16 + 80000b50: e422 sd s0,8(sp) + 80000b52: 0800 addi s0,sp,16 + lk->name = name; + 80000b54: e50c sd a1,8(a0) + lk->locked = 0; + 80000b56: 00052023 sw zero,0(a0) + lk->cpu = 0; + 80000b5a: 00053823 sd zero,16(a0) +} + 80000b5e: 6422 ld s0,8(sp) + 80000b60: 0141 addi sp,sp,16 + 80000b62: 8082 ret + +0000000080000b64 : +// Interrupts must be off. +int +holding(struct spinlock *lk) +{ + int r; + r = (lk->locked && lk->cpu == mycpu()); + 80000b64: 411c lw a5,0(a0) + 80000b66: e399 bnez a5,80000b6c + 80000b68: 4501 li a0,0 + return r; +} + 80000b6a: 8082 ret +{ + 80000b6c: 1101 addi sp,sp,-32 + 80000b6e: ec06 sd ra,24(sp) + 80000b70: e822 sd s0,16(sp) + 80000b72: e426 sd s1,8(sp) + 80000b74: 1000 addi s0,sp,32 + r = (lk->locked && lk->cpu == mycpu()); + 80000b76: 6904 ld s1,16(a0) + 80000b78: 53b000ef jal 800018b2 + 80000b7c: 40a48533 sub a0,s1,a0 + 80000b80: 00153513 seqz a0,a0 +} + 80000b84: 60e2 ld ra,24(sp) + 80000b86: 6442 ld s0,16(sp) + 80000b88: 64a2 ld s1,8(sp) + 80000b8a: 6105 addi sp,sp,32 + 80000b8c: 8082 ret + +0000000080000b8e : +// 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) +{ + 80000b8e: 1101 addi sp,sp,-32 + 80000b90: ec06 sd ra,24(sp) + 80000b92: e822 sd s0,16(sp) + 80000b94: e426 sd s1,8(sp) + 80000b96: 1000 addi s0,sp,32 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80000b98: 100024f3 csrr s1,sstatus + 80000b9c: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() & ~SSTATUS_SIE); + 80000ba0: 9bf5 andi a5,a5,-3 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80000ba2: 10079073 csrw sstatus,a5 + + // disable interrupts to prevent an involuntary context + // switch while using mycpu(). + intr_off(); + + if(mycpu()->noff == 0) + 80000ba6: 50d000ef jal 800018b2 + 80000baa: 5d3c lw a5,120(a0) + 80000bac: cb99 beqz a5,80000bc2 + mycpu()->intena = old; + mycpu()->noff += 1; + 80000bae: 505000ef jal 800018b2 + 80000bb2: 5d3c lw a5,120(a0) + 80000bb4: 2785 addiw a5,a5,1 + 80000bb6: dd3c sw a5,120(a0) +} + 80000bb8: 60e2 ld ra,24(sp) + 80000bba: 6442 ld s0,16(sp) + 80000bbc: 64a2 ld s1,8(sp) + 80000bbe: 6105 addi sp,sp,32 + 80000bc0: 8082 ret + mycpu()->intena = old; + 80000bc2: 4f1000ef jal 800018b2 + return (x & SSTATUS_SIE) != 0; + 80000bc6: 8085 srli s1,s1,0x1 + 80000bc8: 8885 andi s1,s1,1 + 80000bca: dd64 sw s1,124(a0) + 80000bcc: b7cd j 80000bae + +0000000080000bce : +{ + 80000bce: 1101 addi sp,sp,-32 + 80000bd0: ec06 sd ra,24(sp) + 80000bd2: e822 sd s0,16(sp) + 80000bd4: e426 sd s1,8(sp) + 80000bd6: 1000 addi s0,sp,32 + 80000bd8: 84aa mv s1,a0 + push_off(); // disable interrupts to avoid deadlock. + 80000bda: fb5ff0ef jal 80000b8e + if(holding(lk)) + 80000bde: 8526 mv a0,s1 + 80000be0: f85ff0ef jal 80000b64 + while(__sync_lock_test_and_set(&lk->locked, 1) != 0) + 80000be4: 4705 li a4,1 + if(holding(lk)) + 80000be6: e105 bnez a0,80000c06 + while(__sync_lock_test_and_set(&lk->locked, 1) != 0) + 80000be8: 87ba mv a5,a4 + 80000bea: 0cf4a7af amoswap.w.aq a5,a5,(s1) + 80000bee: 2781 sext.w a5,a5 + 80000bf0: ffe5 bnez a5,80000be8 + __sync_synchronize(); + 80000bf2: 0330000f fence rw,rw + lk->cpu = mycpu(); + 80000bf6: 4bd000ef jal 800018b2 + 80000bfa: e888 sd a0,16(s1) +} + 80000bfc: 60e2 ld ra,24(sp) + 80000bfe: 6442 ld s0,16(sp) + 80000c00: 64a2 ld s1,8(sp) + 80000c02: 6105 addi sp,sp,32 + 80000c04: 8082 ret + panic("acquire"); + 80000c06: 00006517 auipc a0,0x6 + 80000c0a: 44250513 addi a0,a0,1090 # 80007048 + 80000c0e: bd3ff0ef jal 800007e0 + +0000000080000c12 : + +void +pop_off(void) +{ + 80000c12: 1141 addi sp,sp,-16 + 80000c14: e406 sd ra,8(sp) + 80000c16: e022 sd s0,0(sp) + 80000c18: 0800 addi s0,sp,16 + struct cpu *c = mycpu(); + 80000c1a: 499000ef jal 800018b2 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80000c1e: 100027f3 csrr a5,sstatus + return (x & SSTATUS_SIE) != 0; + 80000c22: 8b89 andi a5,a5,2 + if(intr_get()) + 80000c24: e78d bnez a5,80000c4e + panic("pop_off - interruptible"); + if(c->noff < 1) + 80000c26: 5d3c lw a5,120(a0) + 80000c28: 02f05963 blez a5,80000c5a + panic("pop_off"); + c->noff -= 1; + 80000c2c: 37fd addiw a5,a5,-1 + 80000c2e: 0007871b sext.w a4,a5 + 80000c32: dd3c sw a5,120(a0) + if(c->noff == 0 && c->intena) + 80000c34: eb09 bnez a4,80000c46 + 80000c36: 5d7c lw a5,124(a0) + 80000c38: c799 beqz a5,80000c46 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80000c3a: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 80000c3e: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80000c42: 10079073 csrw sstatus,a5 + intr_on(); +} + 80000c46: 60a2 ld ra,8(sp) + 80000c48: 6402 ld s0,0(sp) + 80000c4a: 0141 addi sp,sp,16 + 80000c4c: 8082 ret + panic("pop_off - interruptible"); + 80000c4e: 00006517 auipc a0,0x6 + 80000c52: 40250513 addi a0,a0,1026 # 80007050 + 80000c56: b8bff0ef jal 800007e0 + panic("pop_off"); + 80000c5a: 00006517 auipc a0,0x6 + 80000c5e: 40e50513 addi a0,a0,1038 # 80007068 + 80000c62: b7fff0ef jal 800007e0 + +0000000080000c66 : +{ + 80000c66: 1101 addi sp,sp,-32 + 80000c68: ec06 sd ra,24(sp) + 80000c6a: e822 sd s0,16(sp) + 80000c6c: e426 sd s1,8(sp) + 80000c6e: 1000 addi s0,sp,32 + 80000c70: 84aa mv s1,a0 + if(!holding(lk)) + 80000c72: ef3ff0ef jal 80000b64 + 80000c76: c105 beqz a0,80000c96 + lk->cpu = 0; + 80000c78: 0004b823 sd zero,16(s1) + __sync_synchronize(); + 80000c7c: 0330000f fence rw,rw + __sync_lock_release(&lk->locked); + 80000c80: 0310000f fence rw,w + 80000c84: 0004a023 sw zero,0(s1) + pop_off(); + 80000c88: f8bff0ef jal 80000c12 +} + 80000c8c: 60e2 ld ra,24(sp) + 80000c8e: 6442 ld s0,16(sp) + 80000c90: 64a2 ld s1,8(sp) + 80000c92: 6105 addi sp,sp,32 + 80000c94: 8082 ret + panic("release"); + 80000c96: 00006517 auipc a0,0x6 + 80000c9a: 3da50513 addi a0,a0,986 # 80007070 + 80000c9e: b43ff0ef jal 800007e0 + +0000000080000ca2 : +#include "types.h" + +void* +memset(void *dst, int c, uint n) +{ + 80000ca2: 1141 addi sp,sp,-16 + 80000ca4: e422 sd s0,8(sp) + 80000ca6: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 80000ca8: ca19 beqz a2,80000cbe + 80000caa: 87aa mv a5,a0 + 80000cac: 1602 slli a2,a2,0x20 + 80000cae: 9201 srli a2,a2,0x20 + 80000cb0: 00a60733 add a4,a2,a0 + cdst[i] = c; + 80000cb4: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 80000cb8: 0785 addi a5,a5,1 + 80000cba: fee79de3 bne a5,a4,80000cb4 + } + return dst; +} + 80000cbe: 6422 ld s0,8(sp) + 80000cc0: 0141 addi sp,sp,16 + 80000cc2: 8082 ret + +0000000080000cc4 : + +int +memcmp(const void *v1, const void *v2, uint n) +{ + 80000cc4: 1141 addi sp,sp,-16 + 80000cc6: e422 sd s0,8(sp) + 80000cc8: 0800 addi s0,sp,16 + const uchar *s1, *s2; + + s1 = v1; + s2 = v2; + while(n-- > 0){ + 80000cca: ca05 beqz a2,80000cfa + 80000ccc: fff6069b addiw a3,a2,-1 # fff <_entry-0x7ffff001> + 80000cd0: 1682 slli a3,a3,0x20 + 80000cd2: 9281 srli a3,a3,0x20 + 80000cd4: 0685 addi a3,a3,1 + 80000cd6: 96aa add a3,a3,a0 + if(*s1 != *s2) + 80000cd8: 00054783 lbu a5,0(a0) + 80000cdc: 0005c703 lbu a4,0(a1) + 80000ce0: 00e79863 bne a5,a4,80000cf0 + return *s1 - *s2; + s1++, s2++; + 80000ce4: 0505 addi a0,a0,1 + 80000ce6: 0585 addi a1,a1,1 + while(n-- > 0){ + 80000ce8: fed518e3 bne a0,a3,80000cd8 + } + + return 0; + 80000cec: 4501 li a0,0 + 80000cee: a019 j 80000cf4 + return *s1 - *s2; + 80000cf0: 40e7853b subw a0,a5,a4 +} + 80000cf4: 6422 ld s0,8(sp) + 80000cf6: 0141 addi sp,sp,16 + 80000cf8: 8082 ret + return 0; + 80000cfa: 4501 li a0,0 + 80000cfc: bfe5 j 80000cf4 + +0000000080000cfe : + +void* +memmove(void *dst, const void *src, uint n) +{ + 80000cfe: 1141 addi sp,sp,-16 + 80000d00: e422 sd s0,8(sp) + 80000d02: 0800 addi s0,sp,16 + const char *s; + char *d; + + if(n == 0) + 80000d04: c205 beqz a2,80000d24 + return dst; + + s = src; + d = dst; + if(s < d && s + n > d){ + 80000d06: 02a5e263 bltu a1,a0,80000d2a + s += n; + d += n; + while(n-- > 0) + *--d = *--s; + } else + while(n-- > 0) + 80000d0a: 1602 slli a2,a2,0x20 + 80000d0c: 9201 srli a2,a2,0x20 + 80000d0e: 00c587b3 add a5,a1,a2 +{ + 80000d12: 872a mv a4,a0 + *d++ = *s++; + 80000d14: 0585 addi a1,a1,1 + 80000d16: 0705 addi a4,a4,1 # fffffffffffff001 + 80000d18: fff5c683 lbu a3,-1(a1) + 80000d1c: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 80000d20: feb79ae3 bne a5,a1,80000d14 + + return dst; +} + 80000d24: 6422 ld s0,8(sp) + 80000d26: 0141 addi sp,sp,16 + 80000d28: 8082 ret + if(s < d && s + n > d){ + 80000d2a: 02061693 slli a3,a2,0x20 + 80000d2e: 9281 srli a3,a3,0x20 + 80000d30: 00d58733 add a4,a1,a3 + 80000d34: fce57be3 bgeu a0,a4,80000d0a + d += n; + 80000d38: 96aa add a3,a3,a0 + while(n-- > 0) + 80000d3a: fff6079b addiw a5,a2,-1 + 80000d3e: 1782 slli a5,a5,0x20 + 80000d40: 9381 srli a5,a5,0x20 + 80000d42: fff7c793 not a5,a5 + 80000d46: 97ba add a5,a5,a4 + *--d = *--s; + 80000d48: 177d addi a4,a4,-1 + 80000d4a: 16fd addi a3,a3,-1 + 80000d4c: 00074603 lbu a2,0(a4) + 80000d50: 00c68023 sb a2,0(a3) + while(n-- > 0) + 80000d54: fef71ae3 bne a4,a5,80000d48 + 80000d58: b7f1 j 80000d24 + +0000000080000d5a : + +// memcpy exists to placate GCC. Use memmove. +void* +memcpy(void *dst, const void *src, uint n) +{ + 80000d5a: 1141 addi sp,sp,-16 + 80000d5c: e406 sd ra,8(sp) + 80000d5e: e022 sd s0,0(sp) + 80000d60: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 80000d62: f9dff0ef jal 80000cfe +} + 80000d66: 60a2 ld ra,8(sp) + 80000d68: 6402 ld s0,0(sp) + 80000d6a: 0141 addi sp,sp,16 + 80000d6c: 8082 ret + +0000000080000d6e : + +int +strncmp(const char *p, const char *q, uint n) +{ + 80000d6e: 1141 addi sp,sp,-16 + 80000d70: e422 sd s0,8(sp) + 80000d72: 0800 addi s0,sp,16 + while(n > 0 && *p && *p == *q) + 80000d74: ce11 beqz a2,80000d90 + 80000d76: 00054783 lbu a5,0(a0) + 80000d7a: cf89 beqz a5,80000d94 + 80000d7c: 0005c703 lbu a4,0(a1) + 80000d80: 00f71a63 bne a4,a5,80000d94 + n--, p++, q++; + 80000d84: 367d addiw a2,a2,-1 + 80000d86: 0505 addi a0,a0,1 + 80000d88: 0585 addi a1,a1,1 + while(n > 0 && *p && *p == *q) + 80000d8a: f675 bnez a2,80000d76 + if(n == 0) + return 0; + 80000d8c: 4501 li a0,0 + 80000d8e: a801 j 80000d9e + 80000d90: 4501 li a0,0 + 80000d92: a031 j 80000d9e + return (uchar)*p - (uchar)*q; + 80000d94: 00054503 lbu a0,0(a0) + 80000d98: 0005c783 lbu a5,0(a1) + 80000d9c: 9d1d subw a0,a0,a5 +} + 80000d9e: 6422 ld s0,8(sp) + 80000da0: 0141 addi sp,sp,16 + 80000da2: 8082 ret + +0000000080000da4 : + +char* +strncpy(char *s, const char *t, int n) +{ + 80000da4: 1141 addi sp,sp,-16 + 80000da6: e422 sd s0,8(sp) + 80000da8: 0800 addi s0,sp,16 + char *os; + + os = s; + while(n-- > 0 && (*s++ = *t++) != 0) + 80000daa: 87aa mv a5,a0 + 80000dac: 86b2 mv a3,a2 + 80000dae: 367d addiw a2,a2,-1 + 80000db0: 02d05563 blez a3,80000dda + 80000db4: 0785 addi a5,a5,1 + 80000db6: 0005c703 lbu a4,0(a1) + 80000dba: fee78fa3 sb a4,-1(a5) + 80000dbe: 0585 addi a1,a1,1 + 80000dc0: f775 bnez a4,80000dac + ; + while(n-- > 0) + 80000dc2: 873e mv a4,a5 + 80000dc4: 9fb5 addw a5,a5,a3 + 80000dc6: 37fd addiw a5,a5,-1 + 80000dc8: 00c05963 blez a2,80000dda + *s++ = 0; + 80000dcc: 0705 addi a4,a4,1 + 80000dce: fe070fa3 sb zero,-1(a4) + while(n-- > 0) + 80000dd2: 40e786bb subw a3,a5,a4 + 80000dd6: fed04be3 bgtz a3,80000dcc + return os; +} + 80000dda: 6422 ld s0,8(sp) + 80000ddc: 0141 addi sp,sp,16 + 80000dde: 8082 ret + +0000000080000de0 : + +// Like strncpy but guaranteed to NUL-terminate. +char* +safestrcpy(char *s, const char *t, int n) +{ + 80000de0: 1141 addi sp,sp,-16 + 80000de2: e422 sd s0,8(sp) + 80000de4: 0800 addi s0,sp,16 + char *os; + + os = s; + if(n <= 0) + 80000de6: 02c05363 blez a2,80000e0c + 80000dea: fff6069b addiw a3,a2,-1 + 80000dee: 1682 slli a3,a3,0x20 + 80000df0: 9281 srli a3,a3,0x20 + 80000df2: 96ae add a3,a3,a1 + 80000df4: 87aa mv a5,a0 + return os; + while(--n > 0 && (*s++ = *t++) != 0) + 80000df6: 00d58963 beq a1,a3,80000e08 + 80000dfa: 0585 addi a1,a1,1 + 80000dfc: 0785 addi a5,a5,1 + 80000dfe: fff5c703 lbu a4,-1(a1) + 80000e02: fee78fa3 sb a4,-1(a5) + 80000e06: fb65 bnez a4,80000df6 + ; + *s = 0; + 80000e08: 00078023 sb zero,0(a5) + return os; +} + 80000e0c: 6422 ld s0,8(sp) + 80000e0e: 0141 addi sp,sp,16 + 80000e10: 8082 ret + +0000000080000e12 : + +int +strlen(const char *s) +{ + 80000e12: 1141 addi sp,sp,-16 + 80000e14: e422 sd s0,8(sp) + 80000e16: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 80000e18: 00054783 lbu a5,0(a0) + 80000e1c: cf91 beqz a5,80000e38 + 80000e1e: 0505 addi a0,a0,1 + 80000e20: 87aa mv a5,a0 + 80000e22: 86be mv a3,a5 + 80000e24: 0785 addi a5,a5,1 + 80000e26: fff7c703 lbu a4,-1(a5) + 80000e2a: ff65 bnez a4,80000e22 + 80000e2c: 40a6853b subw a0,a3,a0 + 80000e30: 2505 addiw a0,a0,1 + ; + return n; +} + 80000e32: 6422 ld s0,8(sp) + 80000e34: 0141 addi sp,sp,16 + 80000e36: 8082 ret + for(n = 0; s[n]; n++) + 80000e38: 4501 li a0,0 + 80000e3a: bfe5 j 80000e32 + +0000000080000e3c
: +volatile static int started = 0; + +// start() jumps here in supervisor mode on all CPUs. +void +main() +{ + 80000e3c: 1141 addi sp,sp,-16 + 80000e3e: e406 sd ra,8(sp) + 80000e40: e022 sd s0,0(sp) + 80000e42: 0800 addi s0,sp,16 + if(cpuid() == 0){ + 80000e44: 25f000ef jal 800018a2 + virtio_disk_init(); // emulated hard disk + userinit(); // first user process + __sync_synchronize(); + started = 1; + } else { + while(started == 0) + 80000e48: 00009717 auipc a4,0x9 + 80000e4c: 35870713 addi a4,a4,856 # 8000a1a0 + if(cpuid() == 0){ + 80000e50: c51d beqz a0,80000e7e + while(started == 0) + 80000e52: 431c lw a5,0(a4) + 80000e54: 2781 sext.w a5,a5 + 80000e56: dff5 beqz a5,80000e52 + ; + __sync_synchronize(); + 80000e58: 0330000f fence rw,rw + printf("hart %d starting\n", cpuid()); + 80000e5c: 247000ef jal 800018a2 + 80000e60: 85aa mv a1,a0 + 80000e62: 00006517 auipc a0,0x6 + 80000e66: 23650513 addi a0,a0,566 # 80007098 + 80000e6a: e90ff0ef jal 800004fa + kvminithart(); // turn on paging + 80000e6e: 080000ef jal 80000eee + trapinithart(); // install kernel trap vector + 80000e72: 588010ef jal 800023fa + plicinithart(); // ask PLIC for device interrupts + 80000e76: 552040ef jal 800053c8 + } + + scheduler(); + 80000e7a: 6c7000ef jal 80001d40 + consoleinit(); + 80000e7e: da6ff0ef jal 80000424 + printfinit(); + 80000e82: 99bff0ef jal 8000081c + printf("\n"); + 80000e86: 00006517 auipc a0,0x6 + 80000e8a: 1f250513 addi a0,a0,498 # 80007078 + 80000e8e: e6cff0ef jal 800004fa + printf("xv6 kernel is booting\n"); + 80000e92: 00006517 auipc a0,0x6 + 80000e96: 1ee50513 addi a0,a0,494 # 80007080 + 80000e9a: e60ff0ef jal 800004fa + printf("\n"); + 80000e9e: 00006517 auipc a0,0x6 + 80000ea2: 1da50513 addi a0,a0,474 # 80007078 + 80000ea6: e54ff0ef jal 800004fa + kinit(); // physical page allocator + 80000eaa: c21ff0ef jal 80000aca + kvminit(); // create kernel page table + 80000eae: 2ca000ef jal 80001178 + kvminithart(); // turn on paging + 80000eb2: 03c000ef jal 80000eee + procinit(); // process table + 80000eb6: 137000ef jal 800017ec + trapinit(); // trap vectors + 80000eba: 51c010ef jal 800023d6 + trapinithart(); // install kernel trap vector + 80000ebe: 53c010ef jal 800023fa + plicinit(); // set up interrupt controller + 80000ec2: 4ec040ef jal 800053ae + plicinithart(); // ask PLIC for device interrupts + 80000ec6: 502040ef jal 800053c8 + binit(); // buffer cache + 80000eca: 3c7010ef jal 80002a90 + iinit(); // inode table + 80000ece: 14c020ef jal 8000301a + fileinit(); // file table + 80000ed2: 03e030ef jal 80003f10 + virtio_disk_init(); // emulated hard disk + 80000ed6: 5e2040ef jal 800054b8 + userinit(); // first user process + 80000eda: 4bb000ef jal 80001b94 + __sync_synchronize(); + 80000ede: 0330000f fence rw,rw + started = 1; + 80000ee2: 4785 li a5,1 + 80000ee4: 00009717 auipc a4,0x9 + 80000ee8: 2af72e23 sw a5,700(a4) # 8000a1a0 + 80000eec: b779 j 80000e7a + +0000000080000eee : + +// Switch the current CPU's h/w page table register to +// the kernel's page table, and enable paging. +void +kvminithart() +{ + 80000eee: 1141 addi sp,sp,-16 + 80000ef0: e422 sd s0,8(sp) + 80000ef2: 0800 addi s0,sp,16 +// flush the TLB. +static inline void +sfence_vma() +{ + // the zero, zero means flush all TLB entries. + asm volatile("sfence.vma zero, zero"); + 80000ef4: 12000073 sfence.vma + // wait for any previous writes to the page table memory to finish. + sfence_vma(); + + w_satp(MAKE_SATP(kernel_pagetable)); + 80000ef8: 00009797 auipc a5,0x9 + 80000efc: 2b07b783 ld a5,688(a5) # 8000a1a8 + 80000f00: 83b1 srli a5,a5,0xc + 80000f02: 577d li a4,-1 + 80000f04: 177e slli a4,a4,0x3f + 80000f06: 8fd9 or a5,a5,a4 + asm volatile("csrw satp, %0" : : "r" (x)); + 80000f08: 18079073 csrw satp,a5 + asm volatile("sfence.vma zero, zero"); + 80000f0c: 12000073 sfence.vma + + // flush stale entries from the TLB. + sfence_vma(); +} + 80000f10: 6422 ld s0,8(sp) + 80000f12: 0141 addi sp,sp,16 + 80000f14: 8082 ret + +0000000080000f16 : +// 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) +{ + 80000f16: 7139 addi sp,sp,-64 + 80000f18: fc06 sd ra,56(sp) + 80000f1a: f822 sd s0,48(sp) + 80000f1c: f426 sd s1,40(sp) + 80000f1e: f04a sd s2,32(sp) + 80000f20: ec4e sd s3,24(sp) + 80000f22: e852 sd s4,16(sp) + 80000f24: e456 sd s5,8(sp) + 80000f26: e05a sd s6,0(sp) + 80000f28: 0080 addi s0,sp,64 + 80000f2a: 84aa mv s1,a0 + 80000f2c: 89ae mv s3,a1 + 80000f2e: 8ab2 mv s5,a2 + if(va >= MAXVA) + 80000f30: 57fd li a5,-1 + 80000f32: 83e9 srli a5,a5,0x1a + 80000f34: 4a79 li s4,30 + panic("walk"); + + for(int level = 2; level > 0; level--) { + 80000f36: 4b31 li s6,12 + if(va >= MAXVA) + 80000f38: 02b7fc63 bgeu a5,a1,80000f70 + panic("walk"); + 80000f3c: 00006517 auipc a0,0x6 + 80000f40: 17450513 addi a0,a0,372 # 800070b0 + 80000f44: 89dff0ef jal 800007e0 + pte_t *pte = &pagetable[PX(level, va)]; + if(*pte & PTE_V) { + pagetable = (pagetable_t)PTE2PA(*pte); + } else { + if(!alloc || (pagetable = (pde_t*)kalloc()) == 0) + 80000f48: 060a8263 beqz s5,80000fac + 80000f4c: bb3ff0ef jal 80000afe + 80000f50: 84aa mv s1,a0 + 80000f52: c139 beqz a0,80000f98 + return 0; + memset(pagetable, 0, PGSIZE); + 80000f54: 6605 lui a2,0x1 + 80000f56: 4581 li a1,0 + 80000f58: d4bff0ef jal 80000ca2 + *pte = PA2PTE(pagetable) | PTE_V; + 80000f5c: 00c4d793 srli a5,s1,0xc + 80000f60: 07aa slli a5,a5,0xa + 80000f62: 0017e793 ori a5,a5,1 + 80000f66: 00f93023 sd a5,0(s2) + for(int level = 2; level > 0; level--) { + 80000f6a: 3a5d addiw s4,s4,-9 # ffffffffffffeff7 + 80000f6c: 036a0063 beq s4,s6,80000f8c + pte_t *pte = &pagetable[PX(level, va)]; + 80000f70: 0149d933 srl s2,s3,s4 + 80000f74: 1ff97913 andi s2,s2,511 + 80000f78: 090e slli s2,s2,0x3 + 80000f7a: 9926 add s2,s2,s1 + if(*pte & PTE_V) { + 80000f7c: 00093483 ld s1,0(s2) + 80000f80: 0014f793 andi a5,s1,1 + 80000f84: d3f1 beqz a5,80000f48 + pagetable = (pagetable_t)PTE2PA(*pte); + 80000f86: 80a9 srli s1,s1,0xa + 80000f88: 04b2 slli s1,s1,0xc + 80000f8a: b7c5 j 80000f6a + } + } + return &pagetable[PX(0, va)]; + 80000f8c: 00c9d513 srli a0,s3,0xc + 80000f90: 1ff57513 andi a0,a0,511 + 80000f94: 050e slli a0,a0,0x3 + 80000f96: 9526 add a0,a0,s1 +} + 80000f98: 70e2 ld ra,56(sp) + 80000f9a: 7442 ld s0,48(sp) + 80000f9c: 74a2 ld s1,40(sp) + 80000f9e: 7902 ld s2,32(sp) + 80000fa0: 69e2 ld s3,24(sp) + 80000fa2: 6a42 ld s4,16(sp) + 80000fa4: 6aa2 ld s5,8(sp) + 80000fa6: 6b02 ld s6,0(sp) + 80000fa8: 6121 addi sp,sp,64 + 80000faa: 8082 ret + return 0; + 80000fac: 4501 li a0,0 + 80000fae: b7ed j 80000f98 + +0000000080000fb0 : +walkaddr(pagetable_t pagetable, uint64 va) +{ + pte_t *pte; + uint64 pa; + + if(va >= MAXVA) + 80000fb0: 57fd li a5,-1 + 80000fb2: 83e9 srli a5,a5,0x1a + 80000fb4: 00b7f463 bgeu a5,a1,80000fbc + return 0; + 80000fb8: 4501 li a0,0 + return 0; + if((*pte & PTE_U) == 0) + return 0; + pa = PTE2PA(*pte); + return pa; +} + 80000fba: 8082 ret +{ + 80000fbc: 1141 addi sp,sp,-16 + 80000fbe: e406 sd ra,8(sp) + 80000fc0: e022 sd s0,0(sp) + 80000fc2: 0800 addi s0,sp,16 + pte = walk(pagetable, va, 0); + 80000fc4: 4601 li a2,0 + 80000fc6: f51ff0ef jal 80000f16 + if(pte == 0) + 80000fca: c105 beqz a0,80000fea + if((*pte & PTE_V) == 0) + 80000fcc: 611c ld a5,0(a0) + if((*pte & PTE_U) == 0) + 80000fce: 0117f693 andi a3,a5,17 + 80000fd2: 4745 li a4,17 + return 0; + 80000fd4: 4501 li a0,0 + if((*pte & PTE_U) == 0) + 80000fd6: 00e68663 beq a3,a4,80000fe2 +} + 80000fda: 60a2 ld ra,8(sp) + 80000fdc: 6402 ld s0,0(sp) + 80000fde: 0141 addi sp,sp,16 + 80000fe0: 8082 ret + pa = PTE2PA(*pte); + 80000fe2: 83a9 srli a5,a5,0xa + 80000fe4: 00c79513 slli a0,a5,0xc + return pa; + 80000fe8: bfcd j 80000fda + return 0; + 80000fea: 4501 li a0,0 + 80000fec: b7fd j 80000fda + +0000000080000fee : +// va and size MUST be page-aligned. +// Returns 0 on success, -1 if walk() couldn't +// allocate a needed page-table page. +int +mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) +{ + 80000fee: 715d addi sp,sp,-80 + 80000ff0: e486 sd ra,72(sp) + 80000ff2: e0a2 sd s0,64(sp) + 80000ff4: fc26 sd s1,56(sp) + 80000ff6: f84a sd s2,48(sp) + 80000ff8: f44e sd s3,40(sp) + 80000ffa: f052 sd s4,32(sp) + 80000ffc: ec56 sd s5,24(sp) + 80000ffe: e85a sd s6,16(sp) + 80001000: e45e sd s7,8(sp) + 80001002: 0880 addi s0,sp,80 + uint64 a, last; + pte_t *pte; + + if((va % PGSIZE) != 0) + 80001004: 03459793 slli a5,a1,0x34 + 80001008: e7a9 bnez a5,80001052 + 8000100a: 8aaa mv s5,a0 + 8000100c: 8b3a mv s6,a4 + panic("mappages: va not aligned"); + + if((size % PGSIZE) != 0) + 8000100e: 03461793 slli a5,a2,0x34 + 80001012: e7b1 bnez a5,8000105e + panic("mappages: size not aligned"); + + if(size == 0) + 80001014: ca39 beqz a2,8000106a + panic("mappages: size"); + + a = va; + last = va + size - PGSIZE; + 80001016: 77fd lui a5,0xfffff + 80001018: 963e add a2,a2,a5 + 8000101a: 00b609b3 add s3,a2,a1 + a = va; + 8000101e: 892e mv s2,a1 + 80001020: 40b68a33 sub s4,a3,a1 + if(*pte & PTE_V) + panic("mappages: remap"); + *pte = PA2PTE(pa) | perm | PTE_V; + if(a == last) + break; + a += PGSIZE; + 80001024: 6b85 lui s7,0x1 + 80001026: 014904b3 add s1,s2,s4 + if((pte = walk(pagetable, a, 1)) == 0) + 8000102a: 4605 li a2,1 + 8000102c: 85ca mv a1,s2 + 8000102e: 8556 mv a0,s5 + 80001030: ee7ff0ef jal 80000f16 + 80001034: c539 beqz a0,80001082 + if(*pte & PTE_V) + 80001036: 611c ld a5,0(a0) + 80001038: 8b85 andi a5,a5,1 + 8000103a: ef95 bnez a5,80001076 + *pte = PA2PTE(pa) | perm | PTE_V; + 8000103c: 80b1 srli s1,s1,0xc + 8000103e: 04aa slli s1,s1,0xa + 80001040: 0164e4b3 or s1,s1,s6 + 80001044: 0014e493 ori s1,s1,1 + 80001048: e104 sd s1,0(a0) + if(a == last) + 8000104a: 05390863 beq s2,s3,8000109a + a += PGSIZE; + 8000104e: 995e add s2,s2,s7 + if((pte = walk(pagetable, a, 1)) == 0) + 80001050: bfd9 j 80001026 + panic("mappages: va not aligned"); + 80001052: 00006517 auipc a0,0x6 + 80001056: 06650513 addi a0,a0,102 # 800070b8 + 8000105a: f86ff0ef jal 800007e0 + panic("mappages: size not aligned"); + 8000105e: 00006517 auipc a0,0x6 + 80001062: 07a50513 addi a0,a0,122 # 800070d8 + 80001066: f7aff0ef jal 800007e0 + panic("mappages: size"); + 8000106a: 00006517 auipc a0,0x6 + 8000106e: 08e50513 addi a0,a0,142 # 800070f8 + 80001072: f6eff0ef jal 800007e0 + panic("mappages: remap"); + 80001076: 00006517 auipc a0,0x6 + 8000107a: 09250513 addi a0,a0,146 # 80007108 + 8000107e: f62ff0ef jal 800007e0 + return -1; + 80001082: 557d li a0,-1 + pa += PGSIZE; + } + return 0; +} + 80001084: 60a6 ld ra,72(sp) + 80001086: 6406 ld s0,64(sp) + 80001088: 74e2 ld s1,56(sp) + 8000108a: 7942 ld s2,48(sp) + 8000108c: 79a2 ld s3,40(sp) + 8000108e: 7a02 ld s4,32(sp) + 80001090: 6ae2 ld s5,24(sp) + 80001092: 6b42 ld s6,16(sp) + 80001094: 6ba2 ld s7,8(sp) + 80001096: 6161 addi sp,sp,80 + 80001098: 8082 ret + return 0; + 8000109a: 4501 li a0,0 + 8000109c: b7e5 j 80001084 + +000000008000109e : +{ + 8000109e: 1141 addi sp,sp,-16 + 800010a0: e406 sd ra,8(sp) + 800010a2: e022 sd s0,0(sp) + 800010a4: 0800 addi s0,sp,16 + 800010a6: 87b6 mv a5,a3 + if(mappages(kpgtbl, va, sz, pa, perm) != 0) + 800010a8: 86b2 mv a3,a2 + 800010aa: 863e mv a2,a5 + 800010ac: f43ff0ef jal 80000fee + 800010b0: e509 bnez a0,800010ba +} + 800010b2: 60a2 ld ra,8(sp) + 800010b4: 6402 ld s0,0(sp) + 800010b6: 0141 addi sp,sp,16 + 800010b8: 8082 ret + panic("kvmmap"); + 800010ba: 00006517 auipc a0,0x6 + 800010be: 05e50513 addi a0,a0,94 # 80007118 + 800010c2: f1eff0ef jal 800007e0 + +00000000800010c6 : +{ + 800010c6: 1101 addi sp,sp,-32 + 800010c8: ec06 sd ra,24(sp) + 800010ca: e822 sd s0,16(sp) + 800010cc: e426 sd s1,8(sp) + 800010ce: e04a sd s2,0(sp) + 800010d0: 1000 addi s0,sp,32 + kpgtbl = (pagetable_t) kalloc(); + 800010d2: a2dff0ef jal 80000afe + 800010d6: 84aa mv s1,a0 + memset(kpgtbl, 0, PGSIZE); + 800010d8: 6605 lui a2,0x1 + 800010da: 4581 li a1,0 + 800010dc: bc7ff0ef jal 80000ca2 + kvmmap(kpgtbl, UART0, UART0, PGSIZE, PTE_R | PTE_W); + 800010e0: 4719 li a4,6 + 800010e2: 6685 lui a3,0x1 + 800010e4: 10000637 lui a2,0x10000 + 800010e8: 100005b7 lui a1,0x10000 + 800010ec: 8526 mv a0,s1 + 800010ee: fb1ff0ef jal 8000109e + kvmmap(kpgtbl, VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W); + 800010f2: 4719 li a4,6 + 800010f4: 6685 lui a3,0x1 + 800010f6: 10001637 lui a2,0x10001 + 800010fa: 100015b7 lui a1,0x10001 + 800010fe: 8526 mv a0,s1 + 80001100: f9fff0ef jal 8000109e + kvmmap(kpgtbl, PLIC, PLIC, 0x4000000, PTE_R | PTE_W); + 80001104: 4719 li a4,6 + 80001106: 040006b7 lui a3,0x4000 + 8000110a: 0c000637 lui a2,0xc000 + 8000110e: 0c0005b7 lui a1,0xc000 + 80001112: 8526 mv a0,s1 + 80001114: f8bff0ef jal 8000109e + kvmmap(kpgtbl, KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X); + 80001118: 00006917 auipc s2,0x6 + 8000111c: ee890913 addi s2,s2,-280 # 80007000 + 80001120: 4729 li a4,10 + 80001122: 80006697 auipc a3,0x80006 + 80001126: ede68693 addi a3,a3,-290 # 7000 <_entry-0x7fff9000> + 8000112a: 4605 li a2,1 + 8000112c: 067e slli a2,a2,0x1f + 8000112e: 85b2 mv a1,a2 + 80001130: 8526 mv a0,s1 + 80001132: f6dff0ef jal 8000109e + kvmmap(kpgtbl, (uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W); + 80001136: 46c5 li a3,17 + 80001138: 06ee slli a3,a3,0x1b + 8000113a: 4719 li a4,6 + 8000113c: 412686b3 sub a3,a3,s2 + 80001140: 864a mv a2,s2 + 80001142: 85ca mv a1,s2 + 80001144: 8526 mv a0,s1 + 80001146: f59ff0ef jal 8000109e + kvmmap(kpgtbl, TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X); + 8000114a: 4729 li a4,10 + 8000114c: 6685 lui a3,0x1 + 8000114e: 00005617 auipc a2,0x5 + 80001152: eb260613 addi a2,a2,-334 # 80006000 <_trampoline> + 80001156: 040005b7 lui a1,0x4000 + 8000115a: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 8000115c: 05b2 slli a1,a1,0xc + 8000115e: 8526 mv a0,s1 + 80001160: f3fff0ef jal 8000109e + proc_mapstacks(kpgtbl); + 80001164: 8526 mv a0,s1 + 80001166: 5ee000ef jal 80001754 +} + 8000116a: 8526 mv a0,s1 + 8000116c: 60e2 ld ra,24(sp) + 8000116e: 6442 ld s0,16(sp) + 80001170: 64a2 ld s1,8(sp) + 80001172: 6902 ld s2,0(sp) + 80001174: 6105 addi sp,sp,32 + 80001176: 8082 ret + +0000000080001178 : +{ + 80001178: 1141 addi sp,sp,-16 + 8000117a: e406 sd ra,8(sp) + 8000117c: e022 sd s0,0(sp) + 8000117e: 0800 addi s0,sp,16 + kernel_pagetable = kvmmake(); + 80001180: f47ff0ef jal 800010c6 + 80001184: 00009797 auipc a5,0x9 + 80001188: 02a7b223 sd a0,36(a5) # 8000a1a8 +} + 8000118c: 60a2 ld ra,8(sp) + 8000118e: 6402 ld s0,0(sp) + 80001190: 0141 addi sp,sp,16 + 80001192: 8082 ret + +0000000080001194 : + +// create an empty user page table. +// returns 0 if out of memory. +pagetable_t +uvmcreate() +{ + 80001194: 1101 addi sp,sp,-32 + 80001196: ec06 sd ra,24(sp) + 80001198: e822 sd s0,16(sp) + 8000119a: e426 sd s1,8(sp) + 8000119c: 1000 addi s0,sp,32 + pagetable_t pagetable; + pagetable = (pagetable_t) kalloc(); + 8000119e: 961ff0ef jal 80000afe + 800011a2: 84aa mv s1,a0 + if(pagetable == 0) + 800011a4: c509 beqz a0,800011ae + return 0; + memset(pagetable, 0, PGSIZE); + 800011a6: 6605 lui a2,0x1 + 800011a8: 4581 li a1,0 + 800011aa: af9ff0ef jal 80000ca2 + return pagetable; +} + 800011ae: 8526 mv a0,s1 + 800011b0: 60e2 ld ra,24(sp) + 800011b2: 6442 ld s0,16(sp) + 800011b4: 64a2 ld s1,8(sp) + 800011b6: 6105 addi sp,sp,32 + 800011b8: 8082 ret + +00000000800011ba : +// Remove npages of mappings starting from va. va must be +// page-aligned. It's OK if the mappings don't exist. +// Optionally free the physical memory. +void +uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) +{ + 800011ba: 7139 addi sp,sp,-64 + 800011bc: fc06 sd ra,56(sp) + 800011be: f822 sd s0,48(sp) + 800011c0: 0080 addi s0,sp,64 + uint64 a; + pte_t *pte; + + if((va % PGSIZE) != 0) + 800011c2: 03459793 slli a5,a1,0x34 + 800011c6: e38d bnez a5,800011e8 + 800011c8: f04a sd s2,32(sp) + 800011ca: ec4e sd s3,24(sp) + 800011cc: e852 sd s4,16(sp) + 800011ce: e456 sd s5,8(sp) + 800011d0: e05a sd s6,0(sp) + 800011d2: 8a2a mv s4,a0 + 800011d4: 892e mv s2,a1 + 800011d6: 8ab6 mv s5,a3 + panic("uvmunmap: not aligned"); + + for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ + 800011d8: 0632 slli a2,a2,0xc + 800011da: 00b609b3 add s3,a2,a1 + 800011de: 6b05 lui s6,0x1 + 800011e0: 0535f963 bgeu a1,s3,80001232 + 800011e4: f426 sd s1,40(sp) + 800011e6: a015 j 8000120a + 800011e8: f426 sd s1,40(sp) + 800011ea: f04a sd s2,32(sp) + 800011ec: ec4e sd s3,24(sp) + 800011ee: e852 sd s4,16(sp) + 800011f0: e456 sd s5,8(sp) + 800011f2: e05a sd s6,0(sp) + panic("uvmunmap: not aligned"); + 800011f4: 00006517 auipc a0,0x6 + 800011f8: f2c50513 addi a0,a0,-212 # 80007120 + 800011fc: de4ff0ef jal 800007e0 + continue; + if(do_free){ + uint64 pa = PTE2PA(*pte); + kfree((void*)pa); + } + *pte = 0; + 80001200: 0004b023 sd zero,0(s1) + for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ + 80001204: 995a add s2,s2,s6 + 80001206: 03397563 bgeu s2,s3,80001230 + if((pte = walk(pagetable, a, 0)) == 0) // leaf page table entry allocated? + 8000120a: 4601 li a2,0 + 8000120c: 85ca mv a1,s2 + 8000120e: 8552 mv a0,s4 + 80001210: d07ff0ef jal 80000f16 + 80001214: 84aa mv s1,a0 + 80001216: d57d beqz a0,80001204 + if((*pte & PTE_V) == 0) // has physical page been allocated? + 80001218: 611c ld a5,0(a0) + 8000121a: 0017f713 andi a4,a5,1 + 8000121e: d37d beqz a4,80001204 + if(do_free){ + 80001220: fe0a80e3 beqz s5,80001200 + uint64 pa = PTE2PA(*pte); + 80001224: 83a9 srli a5,a5,0xa + kfree((void*)pa); + 80001226: 00c79513 slli a0,a5,0xc + 8000122a: ff2ff0ef jal 80000a1c + 8000122e: bfc9 j 80001200 + 80001230: 74a2 ld s1,40(sp) + 80001232: 7902 ld s2,32(sp) + 80001234: 69e2 ld s3,24(sp) + 80001236: 6a42 ld s4,16(sp) + 80001238: 6aa2 ld s5,8(sp) + 8000123a: 6b02 ld s6,0(sp) + } +} + 8000123c: 70e2 ld ra,56(sp) + 8000123e: 7442 ld s0,48(sp) + 80001240: 6121 addi sp,sp,64 + 80001242: 8082 ret + +0000000080001244 : +// newsz. oldsz and newsz need not be page-aligned, nor does newsz +// need to be less than oldsz. oldsz can be larger than the actual +// process size. Returns the new process size. +uint64 +uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) +{ + 80001244: 1101 addi sp,sp,-32 + 80001246: ec06 sd ra,24(sp) + 80001248: e822 sd s0,16(sp) + 8000124a: e426 sd s1,8(sp) + 8000124c: 1000 addi s0,sp,32 + if(newsz >= oldsz) + return oldsz; + 8000124e: 84ae mv s1,a1 + if(newsz >= oldsz) + 80001250: 00b67d63 bgeu a2,a1,8000126a + 80001254: 84b2 mv s1,a2 + + if(PGROUNDUP(newsz) < PGROUNDUP(oldsz)){ + 80001256: 6785 lui a5,0x1 + 80001258: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 8000125a: 00f60733 add a4,a2,a5 + 8000125e: 76fd lui a3,0xfffff + 80001260: 8f75 and a4,a4,a3 + 80001262: 97ae add a5,a5,a1 + 80001264: 8ff5 and a5,a5,a3 + 80001266: 00f76863 bltu a4,a5,80001276 + int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE; + uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1); + } + + return newsz; +} + 8000126a: 8526 mv a0,s1 + 8000126c: 60e2 ld ra,24(sp) + 8000126e: 6442 ld s0,16(sp) + 80001270: 64a2 ld s1,8(sp) + 80001272: 6105 addi sp,sp,32 + 80001274: 8082 ret + int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE; + 80001276: 8f99 sub a5,a5,a4 + 80001278: 83b1 srli a5,a5,0xc + uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1); + 8000127a: 4685 li a3,1 + 8000127c: 0007861b sext.w a2,a5 + 80001280: 85ba mv a1,a4 + 80001282: f39ff0ef jal 800011ba + 80001286: b7d5 j 8000126a + +0000000080001288 : + if(newsz < oldsz) + 80001288: 08b66f63 bltu a2,a1,80001326 +{ + 8000128c: 7139 addi sp,sp,-64 + 8000128e: fc06 sd ra,56(sp) + 80001290: f822 sd s0,48(sp) + 80001292: ec4e sd s3,24(sp) + 80001294: e852 sd s4,16(sp) + 80001296: e456 sd s5,8(sp) + 80001298: 0080 addi s0,sp,64 + 8000129a: 8aaa mv s5,a0 + 8000129c: 8a32 mv s4,a2 + oldsz = PGROUNDUP(oldsz); + 8000129e: 6785 lui a5,0x1 + 800012a0: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 800012a2: 95be add a1,a1,a5 + 800012a4: 77fd lui a5,0xfffff + 800012a6: 00f5f9b3 and s3,a1,a5 + for(a = oldsz; a < newsz; a += PGSIZE){ + 800012aa: 08c9f063 bgeu s3,a2,8000132a + 800012ae: f426 sd s1,40(sp) + 800012b0: f04a sd s2,32(sp) + 800012b2: e05a sd s6,0(sp) + 800012b4: 894e mv s2,s3 + if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){ + 800012b6: 0126eb13 ori s6,a3,18 + mem = kalloc(); + 800012ba: 845ff0ef jal 80000afe + 800012be: 84aa mv s1,a0 + if(mem == 0){ + 800012c0: c515 beqz a0,800012ec + memset(mem, 0, PGSIZE); + 800012c2: 6605 lui a2,0x1 + 800012c4: 4581 li a1,0 + 800012c6: 9ddff0ef jal 80000ca2 + if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){ + 800012ca: 875a mv a4,s6 + 800012cc: 86a6 mv a3,s1 + 800012ce: 6605 lui a2,0x1 + 800012d0: 85ca mv a1,s2 + 800012d2: 8556 mv a0,s5 + 800012d4: d1bff0ef jal 80000fee + 800012d8: e915 bnez a0,8000130c + for(a = oldsz; a < newsz; a += PGSIZE){ + 800012da: 6785 lui a5,0x1 + 800012dc: 993e add s2,s2,a5 + 800012de: fd496ee3 bltu s2,s4,800012ba + return newsz; + 800012e2: 8552 mv a0,s4 + 800012e4: 74a2 ld s1,40(sp) + 800012e6: 7902 ld s2,32(sp) + 800012e8: 6b02 ld s6,0(sp) + 800012ea: a811 j 800012fe + uvmdealloc(pagetable, a, oldsz); + 800012ec: 864e mv a2,s3 + 800012ee: 85ca mv a1,s2 + 800012f0: 8556 mv a0,s5 + 800012f2: f53ff0ef jal 80001244 + return 0; + 800012f6: 4501 li a0,0 + 800012f8: 74a2 ld s1,40(sp) + 800012fa: 7902 ld s2,32(sp) + 800012fc: 6b02 ld s6,0(sp) +} + 800012fe: 70e2 ld ra,56(sp) + 80001300: 7442 ld s0,48(sp) + 80001302: 69e2 ld s3,24(sp) + 80001304: 6a42 ld s4,16(sp) + 80001306: 6aa2 ld s5,8(sp) + 80001308: 6121 addi sp,sp,64 + 8000130a: 8082 ret + kfree(mem); + 8000130c: 8526 mv a0,s1 + 8000130e: f0eff0ef jal 80000a1c + uvmdealloc(pagetable, a, oldsz); + 80001312: 864e mv a2,s3 + 80001314: 85ca mv a1,s2 + 80001316: 8556 mv a0,s5 + 80001318: f2dff0ef jal 80001244 + return 0; + 8000131c: 4501 li a0,0 + 8000131e: 74a2 ld s1,40(sp) + 80001320: 7902 ld s2,32(sp) + 80001322: 6b02 ld s6,0(sp) + 80001324: bfe9 j 800012fe + return oldsz; + 80001326: 852e mv a0,a1 +} + 80001328: 8082 ret + return newsz; + 8000132a: 8532 mv a0,a2 + 8000132c: bfc9 j 800012fe + +000000008000132e : + +// Recursively free page-table pages. +// All leaf mappings must already have been removed. +void +freewalk(pagetable_t pagetable) +{ + 8000132e: 7179 addi sp,sp,-48 + 80001330: f406 sd ra,40(sp) + 80001332: f022 sd s0,32(sp) + 80001334: ec26 sd s1,24(sp) + 80001336: e84a sd s2,16(sp) + 80001338: e44e sd s3,8(sp) + 8000133a: e052 sd s4,0(sp) + 8000133c: 1800 addi s0,sp,48 + 8000133e: 8a2a mv s4,a0 + // there are 2^9 = 512 PTEs in a page table. + for(int i = 0; i < 512; i++){ + 80001340: 84aa mv s1,a0 + 80001342: 6905 lui s2,0x1 + 80001344: 992a add s2,s2,a0 + pte_t pte = pagetable[i]; + if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ + 80001346: 4985 li s3,1 + 80001348: a819 j 8000135e + // this PTE points to a lower-level page table. + uint64 child = PTE2PA(pte); + 8000134a: 83a9 srli a5,a5,0xa + freewalk((pagetable_t)child); + 8000134c: 00c79513 slli a0,a5,0xc + 80001350: fdfff0ef jal 8000132e + pagetable[i] = 0; + 80001354: 0004b023 sd zero,0(s1) + for(int i = 0; i < 512; i++){ + 80001358: 04a1 addi s1,s1,8 + 8000135a: 01248f63 beq s1,s2,80001378 + pte_t pte = pagetable[i]; + 8000135e: 609c ld a5,0(s1) + if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ + 80001360: 00f7f713 andi a4,a5,15 + 80001364: ff3703e3 beq a4,s3,8000134a + } else if(pte & PTE_V){ + 80001368: 8b85 andi a5,a5,1 + 8000136a: d7fd beqz a5,80001358 + panic("freewalk: leaf"); + 8000136c: 00006517 auipc a0,0x6 + 80001370: dcc50513 addi a0,a0,-564 # 80007138 + 80001374: c6cff0ef jal 800007e0 + } + } + kfree((void*)pagetable); + 80001378: 8552 mv a0,s4 + 8000137a: ea2ff0ef jal 80000a1c +} + 8000137e: 70a2 ld ra,40(sp) + 80001380: 7402 ld s0,32(sp) + 80001382: 64e2 ld s1,24(sp) + 80001384: 6942 ld s2,16(sp) + 80001386: 69a2 ld s3,8(sp) + 80001388: 6a02 ld s4,0(sp) + 8000138a: 6145 addi sp,sp,48 + 8000138c: 8082 ret + +000000008000138e : + +// Free user memory pages, +// then free page-table pages. +void +uvmfree(pagetable_t pagetable, uint64 sz) +{ + 8000138e: 1101 addi sp,sp,-32 + 80001390: ec06 sd ra,24(sp) + 80001392: e822 sd s0,16(sp) + 80001394: e426 sd s1,8(sp) + 80001396: 1000 addi s0,sp,32 + 80001398: 84aa mv s1,a0 + if(sz > 0) + 8000139a: e989 bnez a1,800013ac + uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1); + freewalk(pagetable); + 8000139c: 8526 mv a0,s1 + 8000139e: f91ff0ef jal 8000132e +} + 800013a2: 60e2 ld ra,24(sp) + 800013a4: 6442 ld s0,16(sp) + 800013a6: 64a2 ld s1,8(sp) + 800013a8: 6105 addi sp,sp,32 + 800013aa: 8082 ret + uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1); + 800013ac: 6785 lui a5,0x1 + 800013ae: 17fd addi a5,a5,-1 # fff <_entry-0x7ffff001> + 800013b0: 95be add a1,a1,a5 + 800013b2: 4685 li a3,1 + 800013b4: 00c5d613 srli a2,a1,0xc + 800013b8: 4581 li a1,0 + 800013ba: e01ff0ef jal 800011ba + 800013be: bff9 j 8000139c + +00000000800013c0 : + pte_t *pte; + uint64 pa, i; + uint flags; + char *mem; + + for(i = 0; i < sz; i += PGSIZE){ + 800013c0: ce49 beqz a2,8000145a +{ + 800013c2: 715d addi sp,sp,-80 + 800013c4: e486 sd ra,72(sp) + 800013c6: e0a2 sd s0,64(sp) + 800013c8: fc26 sd s1,56(sp) + 800013ca: f84a sd s2,48(sp) + 800013cc: f44e sd s3,40(sp) + 800013ce: f052 sd s4,32(sp) + 800013d0: ec56 sd s5,24(sp) + 800013d2: e85a sd s6,16(sp) + 800013d4: e45e sd s7,8(sp) + 800013d6: 0880 addi s0,sp,80 + 800013d8: 8aaa mv s5,a0 + 800013da: 8b2e mv s6,a1 + 800013dc: 8a32 mv s4,a2 + for(i = 0; i < sz; i += PGSIZE){ + 800013de: 4481 li s1,0 + 800013e0: a029 j 800013ea + 800013e2: 6785 lui a5,0x1 + 800013e4: 94be add s1,s1,a5 + 800013e6: 0544fe63 bgeu s1,s4,80001442 + if((pte = walk(old, i, 0)) == 0) + 800013ea: 4601 li a2,0 + 800013ec: 85a6 mv a1,s1 + 800013ee: 8556 mv a0,s5 + 800013f0: b27ff0ef jal 80000f16 + 800013f4: d57d beqz a0,800013e2 + continue; // page table entry hasn't been allocated + if((*pte & PTE_V) == 0) + 800013f6: 6118 ld a4,0(a0) + 800013f8: 00177793 andi a5,a4,1 + 800013fc: d3fd beqz a5,800013e2 + continue; // physical page hasn't been allocated + pa = PTE2PA(*pte); + 800013fe: 00a75593 srli a1,a4,0xa + 80001402: 00c59b93 slli s7,a1,0xc + flags = PTE_FLAGS(*pte); + 80001406: 3ff77913 andi s2,a4,1023 + if((mem = kalloc()) == 0) + 8000140a: ef4ff0ef jal 80000afe + 8000140e: 89aa mv s3,a0 + 80001410: c105 beqz a0,80001430 + goto err; + memmove(mem, (char*)pa, PGSIZE); + 80001412: 6605 lui a2,0x1 + 80001414: 85de mv a1,s7 + 80001416: 8e9ff0ef jal 80000cfe + if(mappages(new, i, PGSIZE, (uint64)mem, flags) != 0){ + 8000141a: 874a mv a4,s2 + 8000141c: 86ce mv a3,s3 + 8000141e: 6605 lui a2,0x1 + 80001420: 85a6 mv a1,s1 + 80001422: 855a mv a0,s6 + 80001424: bcbff0ef jal 80000fee + 80001428: dd4d beqz a0,800013e2 + kfree(mem); + 8000142a: 854e mv a0,s3 + 8000142c: df0ff0ef jal 80000a1c + } + } + return 0; + + err: + uvmunmap(new, 0, i / PGSIZE, 1); + 80001430: 4685 li a3,1 + 80001432: 00c4d613 srli a2,s1,0xc + 80001436: 4581 li a1,0 + 80001438: 855a mv a0,s6 + 8000143a: d81ff0ef jal 800011ba + return -1; + 8000143e: 557d li a0,-1 + 80001440: a011 j 80001444 + return 0; + 80001442: 4501 li a0,0 +} + 80001444: 60a6 ld ra,72(sp) + 80001446: 6406 ld s0,64(sp) + 80001448: 74e2 ld s1,56(sp) + 8000144a: 7942 ld s2,48(sp) + 8000144c: 79a2 ld s3,40(sp) + 8000144e: 7a02 ld s4,32(sp) + 80001450: 6ae2 ld s5,24(sp) + 80001452: 6b42 ld s6,16(sp) + 80001454: 6ba2 ld s7,8(sp) + 80001456: 6161 addi sp,sp,80 + 80001458: 8082 ret + return 0; + 8000145a: 4501 li a0,0 +} + 8000145c: 8082 ret + +000000008000145e : + +// mark a PTE invalid for user access. +// used by exec for the user stack guard page. +void +uvmclear(pagetable_t pagetable, uint64 va) +{ + 8000145e: 1141 addi sp,sp,-16 + 80001460: e406 sd ra,8(sp) + 80001462: e022 sd s0,0(sp) + 80001464: 0800 addi s0,sp,16 + pte_t *pte; + + pte = walk(pagetable, va, 0); + 80001466: 4601 li a2,0 + 80001468: aafff0ef jal 80000f16 + if(pte == 0) + 8000146c: c901 beqz a0,8000147c + panic("uvmclear"); + *pte &= ~PTE_U; + 8000146e: 611c ld a5,0(a0) + 80001470: 9bbd andi a5,a5,-17 + 80001472: e11c sd a5,0(a0) +} + 80001474: 60a2 ld ra,8(sp) + 80001476: 6402 ld s0,0(sp) + 80001478: 0141 addi sp,sp,16 + 8000147a: 8082 ret + panic("uvmclear"); + 8000147c: 00006517 auipc a0,0x6 + 80001480: ccc50513 addi a0,a0,-820 # 80007148 + 80001484: b5cff0ef jal 800007e0 + +0000000080001488 : +copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) +{ + uint64 n, va0, pa0; + int got_null = 0; + + while(got_null == 0 && max > 0){ + 80001488: c6dd beqz a3,80001536 +{ + 8000148a: 715d addi sp,sp,-80 + 8000148c: e486 sd ra,72(sp) + 8000148e: e0a2 sd s0,64(sp) + 80001490: fc26 sd s1,56(sp) + 80001492: f84a sd s2,48(sp) + 80001494: f44e sd s3,40(sp) + 80001496: f052 sd s4,32(sp) + 80001498: ec56 sd s5,24(sp) + 8000149a: e85a sd s6,16(sp) + 8000149c: e45e sd s7,8(sp) + 8000149e: 0880 addi s0,sp,80 + 800014a0: 8a2a mv s4,a0 + 800014a2: 8b2e mv s6,a1 + 800014a4: 8bb2 mv s7,a2 + 800014a6: 8936 mv s2,a3 + va0 = PGROUNDDOWN(srcva); + 800014a8: 7afd lui s5,0xfffff + pa0 = walkaddr(pagetable, va0); + if(pa0 == 0) + return -1; + n = PGSIZE - (srcva - va0); + 800014aa: 6985 lui s3,0x1 + 800014ac: a825 j 800014e4 + n = max; + + char *p = (char *) (pa0 + (srcva - va0)); + while(n > 0){ + if(*p == '\0'){ + *dst = '\0'; + 800014ae: 00078023 sb zero,0(a5) # 1000 <_entry-0x7ffff000> + 800014b2: 4785 li a5,1 + dst++; + } + + srcva = va0 + PGSIZE; + } + if(got_null){ + 800014b4: 37fd addiw a5,a5,-1 + 800014b6: 0007851b sext.w a0,a5 + return 0; + } else { + return -1; + } +} + 800014ba: 60a6 ld ra,72(sp) + 800014bc: 6406 ld s0,64(sp) + 800014be: 74e2 ld s1,56(sp) + 800014c0: 7942 ld s2,48(sp) + 800014c2: 79a2 ld s3,40(sp) + 800014c4: 7a02 ld s4,32(sp) + 800014c6: 6ae2 ld s5,24(sp) + 800014c8: 6b42 ld s6,16(sp) + 800014ca: 6ba2 ld s7,8(sp) + 800014cc: 6161 addi sp,sp,80 + 800014ce: 8082 ret + 800014d0: fff90713 addi a4,s2,-1 # fff <_entry-0x7ffff001> + 800014d4: 9742 add a4,a4,a6 + --max; + 800014d6: 40b70933 sub s2,a4,a1 + srcva = va0 + PGSIZE; + 800014da: 01348bb3 add s7,s1,s3 + while(got_null == 0 && max > 0){ + 800014de: 04e58463 beq a1,a4,80001526 +{ + 800014e2: 8b3e mv s6,a5 + va0 = PGROUNDDOWN(srcva); + 800014e4: 015bf4b3 and s1,s7,s5 + pa0 = walkaddr(pagetable, va0); + 800014e8: 85a6 mv a1,s1 + 800014ea: 8552 mv a0,s4 + 800014ec: ac5ff0ef jal 80000fb0 + if(pa0 == 0) + 800014f0: cd0d beqz a0,8000152a + n = PGSIZE - (srcva - va0); + 800014f2: 417486b3 sub a3,s1,s7 + 800014f6: 96ce add a3,a3,s3 + if(n > max) + 800014f8: 00d97363 bgeu s2,a3,800014fe + 800014fc: 86ca mv a3,s2 + char *p = (char *) (pa0 + (srcva - va0)); + 800014fe: 955e add a0,a0,s7 + 80001500: 8d05 sub a0,a0,s1 + while(n > 0){ + 80001502: c695 beqz a3,8000152e + 80001504: 87da mv a5,s6 + 80001506: 885a mv a6,s6 + if(*p == '\0'){ + 80001508: 41650633 sub a2,a0,s6 + while(n > 0){ + 8000150c: 96da add a3,a3,s6 + 8000150e: 85be mv a1,a5 + if(*p == '\0'){ + 80001510: 00f60733 add a4,a2,a5 + 80001514: 00074703 lbu a4,0(a4) + 80001518: db59 beqz a4,800014ae + *dst = *p; + 8000151a: 00e78023 sb a4,0(a5) + dst++; + 8000151e: 0785 addi a5,a5,1 + while(n > 0){ + 80001520: fed797e3 bne a5,a3,8000150e + 80001524: b775 j 800014d0 + 80001526: 4781 li a5,0 + 80001528: b771 j 800014b4 + return -1; + 8000152a: 557d li a0,-1 + 8000152c: b779 j 800014ba + srcva = va0 + PGSIZE; + 8000152e: 6b85 lui s7,0x1 + 80001530: 9ba6 add s7,s7,s1 + 80001532: 87da mv a5,s6 + 80001534: b77d j 800014e2 + int got_null = 0; + 80001536: 4781 li a5,0 + if(got_null){ + 80001538: 37fd addiw a5,a5,-1 + 8000153a: 0007851b sext.w a0,a5 +} + 8000153e: 8082 ret + +0000000080001540 : + return mem; +} + +int +ismapped(pagetable_t pagetable, uint64 va) +{ + 80001540: 1141 addi sp,sp,-16 + 80001542: e406 sd ra,8(sp) + 80001544: e022 sd s0,0(sp) + 80001546: 0800 addi s0,sp,16 + pte_t *pte = walk(pagetable, va, 0); + 80001548: 4601 li a2,0 + 8000154a: 9cdff0ef jal 80000f16 + if (pte == 0) { + 8000154e: c519 beqz a0,8000155c + return 0; + } + if (*pte & PTE_V){ + 80001550: 6108 ld a0,0(a0) + 80001552: 8905 andi a0,a0,1 + return 1; + } + return 0; +} + 80001554: 60a2 ld ra,8(sp) + 80001556: 6402 ld s0,0(sp) + 80001558: 0141 addi sp,sp,16 + 8000155a: 8082 ret + return 0; + 8000155c: 4501 li a0,0 + 8000155e: bfdd j 80001554 + +0000000080001560 : +{ + 80001560: 7179 addi sp,sp,-48 + 80001562: f406 sd ra,40(sp) + 80001564: f022 sd s0,32(sp) + 80001566: ec26 sd s1,24(sp) + 80001568: e44e sd s3,8(sp) + 8000156a: 1800 addi s0,sp,48 + 8000156c: 89aa mv s3,a0 + 8000156e: 84ae mv s1,a1 + struct proc *p = myproc(); + 80001570: 35e000ef jal 800018ce + if (va >= p->sz) + 80001574: 653c ld a5,72(a0) + 80001576: 00f4ea63 bltu s1,a5,8000158a + return 0; + 8000157a: 4981 li s3,0 +} + 8000157c: 854e mv a0,s3 + 8000157e: 70a2 ld ra,40(sp) + 80001580: 7402 ld s0,32(sp) + 80001582: 64e2 ld s1,24(sp) + 80001584: 69a2 ld s3,8(sp) + 80001586: 6145 addi sp,sp,48 + 80001588: 8082 ret + 8000158a: e84a sd s2,16(sp) + 8000158c: 892a mv s2,a0 + va = PGROUNDDOWN(va); + 8000158e: 77fd lui a5,0xfffff + 80001590: 8cfd and s1,s1,a5 + if(ismapped(pagetable, va)) { + 80001592: 85a6 mv a1,s1 + 80001594: 854e mv a0,s3 + 80001596: fabff0ef jal 80001540 + return 0; + 8000159a: 4981 li s3,0 + if(ismapped(pagetable, va)) { + 8000159c: c119 beqz a0,800015a2 + 8000159e: 6942 ld s2,16(sp) + 800015a0: bff1 j 8000157c + 800015a2: e052 sd s4,0(sp) + mem = (uint64) kalloc(); + 800015a4: d5aff0ef jal 80000afe + 800015a8: 8a2a mv s4,a0 + if(mem == 0) + 800015aa: c90d beqz a0,800015dc + mem = (uint64) kalloc(); + 800015ac: 89aa mv s3,a0 + memset((void *) mem, 0, PGSIZE); + 800015ae: 6605 lui a2,0x1 + 800015b0: 4581 li a1,0 + 800015b2: ef0ff0ef jal 80000ca2 + if (mappages(p->pagetable, va, PGSIZE, mem, PTE_W|PTE_U|PTE_R) != 0) { + 800015b6: 4759 li a4,22 + 800015b8: 86d2 mv a3,s4 + 800015ba: 6605 lui a2,0x1 + 800015bc: 85a6 mv a1,s1 + 800015be: 05093503 ld a0,80(s2) + 800015c2: a2dff0ef jal 80000fee + 800015c6: e501 bnez a0,800015ce + 800015c8: 6942 ld s2,16(sp) + 800015ca: 6a02 ld s4,0(sp) + 800015cc: bf45 j 8000157c + kfree((void *)mem); + 800015ce: 8552 mv a0,s4 + 800015d0: c4cff0ef jal 80000a1c + return 0; + 800015d4: 4981 li s3,0 + 800015d6: 6942 ld s2,16(sp) + 800015d8: 6a02 ld s4,0(sp) + 800015da: b74d j 8000157c + 800015dc: 6942 ld s2,16(sp) + 800015de: 6a02 ld s4,0(sp) + 800015e0: bf71 j 8000157c + +00000000800015e2 : + while(len > 0){ + 800015e2: c2cd beqz a3,80001684 +{ + 800015e4: 711d addi sp,sp,-96 + 800015e6: ec86 sd ra,88(sp) + 800015e8: e8a2 sd s0,80(sp) + 800015ea: e4a6 sd s1,72(sp) + 800015ec: f852 sd s4,48(sp) + 800015ee: f05a sd s6,32(sp) + 800015f0: ec5e sd s7,24(sp) + 800015f2: e862 sd s8,16(sp) + 800015f4: 1080 addi s0,sp,96 + 800015f6: 8c2a mv s8,a0 + 800015f8: 8b2e mv s6,a1 + 800015fa: 8bb2 mv s7,a2 + 800015fc: 8a36 mv s4,a3 + va0 = PGROUNDDOWN(dstva); + 800015fe: 74fd lui s1,0xfffff + 80001600: 8ced and s1,s1,a1 + if(va0 >= MAXVA) + 80001602: 57fd li a5,-1 + 80001604: 83e9 srli a5,a5,0x1a + 80001606: 0897e163 bltu a5,s1,80001688 + 8000160a: e0ca sd s2,64(sp) + 8000160c: fc4e sd s3,56(sp) + 8000160e: f456 sd s5,40(sp) + 80001610: e466 sd s9,8(sp) + 80001612: e06a sd s10,0(sp) + 80001614: 6d05 lui s10,0x1 + 80001616: 8cbe mv s9,a5 + 80001618: a015 j 8000163c + memmove((void *)(pa0 + (dstva - va0)), src, n); + 8000161a: 409b0533 sub a0,s6,s1 + 8000161e: 0009861b sext.w a2,s3 + 80001622: 85de mv a1,s7 + 80001624: 954a add a0,a0,s2 + 80001626: ed8ff0ef jal 80000cfe + len -= n; + 8000162a: 413a0a33 sub s4,s4,s3 + src += n; + 8000162e: 9bce add s7,s7,s3 + while(len > 0){ + 80001630: 040a0363 beqz s4,80001676 + if(va0 >= MAXVA) + 80001634: 055cec63 bltu s9,s5,8000168c + 80001638: 84d6 mv s1,s5 + 8000163a: 8b56 mv s6,s5 + pa0 = walkaddr(pagetable, va0); + 8000163c: 85a6 mv a1,s1 + 8000163e: 8562 mv a0,s8 + 80001640: 971ff0ef jal 80000fb0 + 80001644: 892a mv s2,a0 + if(pa0 == 0) { + 80001646: e901 bnez a0,80001656 + if((pa0 = vmfault(pagetable, va0, 0)) == 0) { + 80001648: 4601 li a2,0 + 8000164a: 85a6 mv a1,s1 + 8000164c: 8562 mv a0,s8 + 8000164e: f13ff0ef jal 80001560 + 80001652: 892a mv s2,a0 + 80001654: c139 beqz a0,8000169a + pte = walk(pagetable, va0, 0); + 80001656: 4601 li a2,0 + 80001658: 85a6 mv a1,s1 + 8000165a: 8562 mv a0,s8 + 8000165c: 8bbff0ef jal 80000f16 + if((*pte & PTE_W) == 0) + 80001660: 611c ld a5,0(a0) + 80001662: 8b91 andi a5,a5,4 + 80001664: c3b1 beqz a5,800016a8 + n = PGSIZE - (dstva - va0); + 80001666: 01a48ab3 add s5,s1,s10 + 8000166a: 416a89b3 sub s3,s5,s6 + if(n > len) + 8000166e: fb3a76e3 bgeu s4,s3,8000161a + 80001672: 89d2 mv s3,s4 + 80001674: b75d j 8000161a + return 0; + 80001676: 4501 li a0,0 + 80001678: 6906 ld s2,64(sp) + 8000167a: 79e2 ld s3,56(sp) + 8000167c: 7aa2 ld s5,40(sp) + 8000167e: 6ca2 ld s9,8(sp) + 80001680: 6d02 ld s10,0(sp) + 80001682: a80d j 800016b4 + 80001684: 4501 li a0,0 +} + 80001686: 8082 ret + return -1; + 80001688: 557d li a0,-1 + 8000168a: a02d j 800016b4 + 8000168c: 557d li a0,-1 + 8000168e: 6906 ld s2,64(sp) + 80001690: 79e2 ld s3,56(sp) + 80001692: 7aa2 ld s5,40(sp) + 80001694: 6ca2 ld s9,8(sp) + 80001696: 6d02 ld s10,0(sp) + 80001698: a831 j 800016b4 + return -1; + 8000169a: 557d li a0,-1 + 8000169c: 6906 ld s2,64(sp) + 8000169e: 79e2 ld s3,56(sp) + 800016a0: 7aa2 ld s5,40(sp) + 800016a2: 6ca2 ld s9,8(sp) + 800016a4: 6d02 ld s10,0(sp) + 800016a6: a039 j 800016b4 + return -1; + 800016a8: 557d li a0,-1 + 800016aa: 6906 ld s2,64(sp) + 800016ac: 79e2 ld s3,56(sp) + 800016ae: 7aa2 ld s5,40(sp) + 800016b0: 6ca2 ld s9,8(sp) + 800016b2: 6d02 ld s10,0(sp) +} + 800016b4: 60e6 ld ra,88(sp) + 800016b6: 6446 ld s0,80(sp) + 800016b8: 64a6 ld s1,72(sp) + 800016ba: 7a42 ld s4,48(sp) + 800016bc: 7b02 ld s6,32(sp) + 800016be: 6be2 ld s7,24(sp) + 800016c0: 6c42 ld s8,16(sp) + 800016c2: 6125 addi sp,sp,96 + 800016c4: 8082 ret + +00000000800016c6 : + while(len > 0){ + 800016c6: c6c9 beqz a3,80001750 +{ + 800016c8: 715d addi sp,sp,-80 + 800016ca: e486 sd ra,72(sp) + 800016cc: e0a2 sd s0,64(sp) + 800016ce: fc26 sd s1,56(sp) + 800016d0: f84a sd s2,48(sp) + 800016d2: f44e sd s3,40(sp) + 800016d4: f052 sd s4,32(sp) + 800016d6: ec56 sd s5,24(sp) + 800016d8: e85a sd s6,16(sp) + 800016da: e45e sd s7,8(sp) + 800016dc: e062 sd s8,0(sp) + 800016de: 0880 addi s0,sp,80 + 800016e0: 8baa mv s7,a0 + 800016e2: 8aae mv s5,a1 + 800016e4: 8932 mv s2,a2 + 800016e6: 8a36 mv s4,a3 + va0 = PGROUNDDOWN(srcva); + 800016e8: 7c7d lui s8,0xfffff + n = PGSIZE - (srcva - va0); + 800016ea: 6b05 lui s6,0x1 + 800016ec: a035 j 80001718 + 800016ee: 412984b3 sub s1,s3,s2 + 800016f2: 94da add s1,s1,s6 + if(n > len) + 800016f4: 009a7363 bgeu s4,s1,800016fa + 800016f8: 84d2 mv s1,s4 + memmove(dst, (void *)(pa0 + (srcva - va0)), n); + 800016fa: 413905b3 sub a1,s2,s3 + 800016fe: 0004861b sext.w a2,s1 + 80001702: 95aa add a1,a1,a0 + 80001704: 8556 mv a0,s5 + 80001706: df8ff0ef jal 80000cfe + len -= n; + 8000170a: 409a0a33 sub s4,s4,s1 + dst += n; + 8000170e: 9aa6 add s5,s5,s1 + srcva = va0 + PGSIZE; + 80001710: 01698933 add s2,s3,s6 + while(len > 0){ + 80001714: 020a0163 beqz s4,80001736 + va0 = PGROUNDDOWN(srcva); + 80001718: 018979b3 and s3,s2,s8 + pa0 = walkaddr(pagetable, va0); + 8000171c: 85ce mv a1,s3 + 8000171e: 855e mv a0,s7 + 80001720: 891ff0ef jal 80000fb0 + if(pa0 == 0) { + 80001724: f569 bnez a0,800016ee + if((pa0 = vmfault(pagetable, va0, 0)) == 0) { + 80001726: 4601 li a2,0 + 80001728: 85ce mv a1,s3 + 8000172a: 855e mv a0,s7 + 8000172c: e35ff0ef jal 80001560 + 80001730: fd5d bnez a0,800016ee + return -1; + 80001732: 557d li a0,-1 + 80001734: a011 j 80001738 + return 0; + 80001736: 4501 li a0,0 +} + 80001738: 60a6 ld ra,72(sp) + 8000173a: 6406 ld s0,64(sp) + 8000173c: 74e2 ld s1,56(sp) + 8000173e: 7942 ld s2,48(sp) + 80001740: 79a2 ld s3,40(sp) + 80001742: 7a02 ld s4,32(sp) + 80001744: 6ae2 ld s5,24(sp) + 80001746: 6b42 ld s6,16(sp) + 80001748: 6ba2 ld s7,8(sp) + 8000174a: 6c02 ld s8,0(sp) + 8000174c: 6161 addi sp,sp,80 + 8000174e: 8082 ret + return 0; + 80001750: 4501 li a0,0 +} + 80001752: 8082 ret + +0000000080001754 : +// Allocate a page for each process's kernel stack. +// Map it high in memory, followed by an invalid +// guard page. +void +proc_mapstacks(pagetable_t kpgtbl) +{ + 80001754: 7139 addi sp,sp,-64 + 80001756: fc06 sd ra,56(sp) + 80001758: f822 sd s0,48(sp) + 8000175a: f426 sd s1,40(sp) + 8000175c: f04a sd s2,32(sp) + 8000175e: ec4e sd s3,24(sp) + 80001760: e852 sd s4,16(sp) + 80001762: e456 sd s5,8(sp) + 80001764: e05a sd s6,0(sp) + 80001766: 0080 addi s0,sp,64 + 80001768: 8a2a mv s4,a0 + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + 8000176a: 00011497 auipc s1,0x11 + 8000176e: f7e48493 addi s1,s1,-130 # 800126e8 + char *pa = kalloc(); + if(pa == 0) + panic("kalloc"); + uint64 va = KSTACK((int) (p - proc)); + 80001772: 8b26 mv s6,s1 + 80001774: 04fa5937 lui s2,0x4fa5 + 80001778: fa590913 addi s2,s2,-91 # 4fa4fa5 <_entry-0x7b05b05b> + 8000177c: 0932 slli s2,s2,0xc + 8000177e: fa590913 addi s2,s2,-91 + 80001782: 0932 slli s2,s2,0xc + 80001784: fa590913 addi s2,s2,-91 + 80001788: 0932 slli s2,s2,0xc + 8000178a: fa590913 addi s2,s2,-91 + 8000178e: 040009b7 lui s3,0x4000 + 80001792: 19fd addi s3,s3,-1 # 3ffffff <_entry-0x7c000001> + 80001794: 09b2 slli s3,s3,0xc + for(p = proc; p < &proc[NPROC]; p++) { + 80001796: 00017a97 auipc s5,0x17 + 8000179a: 952a8a93 addi s5,s5,-1710 # 800180e8 + char *pa = kalloc(); + 8000179e: b60ff0ef jal 80000afe + 800017a2: 862a mv a2,a0 + if(pa == 0) + 800017a4: cd15 beqz a0,800017e0 + uint64 va = KSTACK((int) (p - proc)); + 800017a6: 416485b3 sub a1,s1,s6 + 800017aa: 858d srai a1,a1,0x3 + 800017ac: 032585b3 mul a1,a1,s2 + 800017b0: 2585 addiw a1,a1,1 + 800017b2: 00d5959b slliw a1,a1,0xd + kvmmap(kpgtbl, va, (uint64)pa, PGSIZE, PTE_R | PTE_W); + 800017b6: 4719 li a4,6 + 800017b8: 6685 lui a3,0x1 + 800017ba: 40b985b3 sub a1,s3,a1 + 800017be: 8552 mv a0,s4 + 800017c0: 8dfff0ef jal 8000109e + for(p = proc; p < &proc[NPROC]; p++) { + 800017c4: 16848493 addi s1,s1,360 + 800017c8: fd549be3 bne s1,s5,8000179e + } +} + 800017cc: 70e2 ld ra,56(sp) + 800017ce: 7442 ld s0,48(sp) + 800017d0: 74a2 ld s1,40(sp) + 800017d2: 7902 ld s2,32(sp) + 800017d4: 69e2 ld s3,24(sp) + 800017d6: 6a42 ld s4,16(sp) + 800017d8: 6aa2 ld s5,8(sp) + 800017da: 6b02 ld s6,0(sp) + 800017dc: 6121 addi sp,sp,64 + 800017de: 8082 ret + panic("kalloc"); + 800017e0: 00006517 auipc a0,0x6 + 800017e4: 97850513 addi a0,a0,-1672 # 80007158 + 800017e8: ff9fe0ef jal 800007e0 + +00000000800017ec : + +// initialize the proc table. +void +procinit(void) +{ + 800017ec: 7139 addi sp,sp,-64 + 800017ee: fc06 sd ra,56(sp) + 800017f0: f822 sd s0,48(sp) + 800017f2: f426 sd s1,40(sp) + 800017f4: f04a sd s2,32(sp) + 800017f6: ec4e sd s3,24(sp) + 800017f8: e852 sd s4,16(sp) + 800017fa: e456 sd s5,8(sp) + 800017fc: e05a sd s6,0(sp) + 800017fe: 0080 addi s0,sp,64 + struct proc *p; + + initlock(&pid_lock, "nextpid"); + 80001800: 00006597 auipc a1,0x6 + 80001804: 96058593 addi a1,a1,-1696 # 80007160 + 80001808: 00011517 auipc a0,0x11 + 8000180c: ab050513 addi a0,a0,-1360 # 800122b8 + 80001810: b3eff0ef jal 80000b4e + initlock(&wait_lock, "wait_lock"); + 80001814: 00006597 auipc a1,0x6 + 80001818: 95458593 addi a1,a1,-1708 # 80007168 + 8000181c: 00011517 auipc a0,0x11 + 80001820: ab450513 addi a0,a0,-1356 # 800122d0 + 80001824: b2aff0ef jal 80000b4e + for(p = proc; p < &proc[NPROC]; p++) { + 80001828: 00011497 auipc s1,0x11 + 8000182c: ec048493 addi s1,s1,-320 # 800126e8 + initlock(&p->lock, "proc"); + 80001830: 00006b17 auipc s6,0x6 + 80001834: 948b0b13 addi s6,s6,-1720 # 80007178 + p->state = UNUSED; + p->kstack = KSTACK((int) (p - proc)); + 80001838: 8aa6 mv s5,s1 + 8000183a: 04fa5937 lui s2,0x4fa5 + 8000183e: fa590913 addi s2,s2,-91 # 4fa4fa5 <_entry-0x7b05b05b> + 80001842: 0932 slli s2,s2,0xc + 80001844: fa590913 addi s2,s2,-91 + 80001848: 0932 slli s2,s2,0xc + 8000184a: fa590913 addi s2,s2,-91 + 8000184e: 0932 slli s2,s2,0xc + 80001850: fa590913 addi s2,s2,-91 + 80001854: 040009b7 lui s3,0x4000 + 80001858: 19fd addi s3,s3,-1 # 3ffffff <_entry-0x7c000001> + 8000185a: 09b2 slli s3,s3,0xc + for(p = proc; p < &proc[NPROC]; p++) { + 8000185c: 00017a17 auipc s4,0x17 + 80001860: 88ca0a13 addi s4,s4,-1908 # 800180e8 + initlock(&p->lock, "proc"); + 80001864: 85da mv a1,s6 + 80001866: 8526 mv a0,s1 + 80001868: ae6ff0ef jal 80000b4e + p->state = UNUSED; + 8000186c: 0004ac23 sw zero,24(s1) + p->kstack = KSTACK((int) (p - proc)); + 80001870: 415487b3 sub a5,s1,s5 + 80001874: 878d srai a5,a5,0x3 + 80001876: 032787b3 mul a5,a5,s2 + 8000187a: 2785 addiw a5,a5,1 # fffffffffffff001 + 8000187c: 00d7979b slliw a5,a5,0xd + 80001880: 40f987b3 sub a5,s3,a5 + 80001884: e0bc sd a5,64(s1) + for(p = proc; p < &proc[NPROC]; p++) { + 80001886: 16848493 addi s1,s1,360 + 8000188a: fd449de3 bne s1,s4,80001864 + } +} + 8000188e: 70e2 ld ra,56(sp) + 80001890: 7442 ld s0,48(sp) + 80001892: 74a2 ld s1,40(sp) + 80001894: 7902 ld s2,32(sp) + 80001896: 69e2 ld s3,24(sp) + 80001898: 6a42 ld s4,16(sp) + 8000189a: 6aa2 ld s5,8(sp) + 8000189c: 6b02 ld s6,0(sp) + 8000189e: 6121 addi sp,sp,64 + 800018a0: 8082 ret + +00000000800018a2 : +// Must be called with interrupts disabled, +// to prevent race with process being moved +// to a different CPU. +int +cpuid() +{ + 800018a2: 1141 addi sp,sp,-16 + 800018a4: e422 sd s0,8(sp) + 800018a6: 0800 addi s0,sp,16 + asm volatile("mv %0, tp" : "=r" (x) ); + 800018a8: 8512 mv a0,tp + int id = r_tp(); + return id; +} + 800018aa: 2501 sext.w a0,a0 + 800018ac: 6422 ld s0,8(sp) + 800018ae: 0141 addi sp,sp,16 + 800018b0: 8082 ret + +00000000800018b2 : + +// Return this CPU's cpu struct. +// Interrupts must be disabled. +struct cpu* +mycpu(void) +{ + 800018b2: 1141 addi sp,sp,-16 + 800018b4: e422 sd s0,8(sp) + 800018b6: 0800 addi s0,sp,16 + 800018b8: 8792 mv a5,tp + int id = cpuid(); + struct cpu *c = &cpus[id]; + 800018ba: 2781 sext.w a5,a5 + 800018bc: 079e slli a5,a5,0x7 + return c; +} + 800018be: 00011517 auipc a0,0x11 + 800018c2: a2a50513 addi a0,a0,-1494 # 800122e8 + 800018c6: 953e add a0,a0,a5 + 800018c8: 6422 ld s0,8(sp) + 800018ca: 0141 addi sp,sp,16 + 800018cc: 8082 ret + +00000000800018ce : + +// Return the current struct proc *, or zero if none. +struct proc* +myproc(void) +{ + 800018ce: 1101 addi sp,sp,-32 + 800018d0: ec06 sd ra,24(sp) + 800018d2: e822 sd s0,16(sp) + 800018d4: e426 sd s1,8(sp) + 800018d6: 1000 addi s0,sp,32 + push_off(); + 800018d8: ab6ff0ef jal 80000b8e + 800018dc: 8792 mv a5,tp + struct cpu *c = mycpu(); + struct proc *p = c->proc; + 800018de: 2781 sext.w a5,a5 + 800018e0: 079e slli a5,a5,0x7 + 800018e2: 00011717 auipc a4,0x11 + 800018e6: 9d670713 addi a4,a4,-1578 # 800122b8 + 800018ea: 97ba add a5,a5,a4 + 800018ec: 7b84 ld s1,48(a5) + pop_off(); + 800018ee: b24ff0ef jal 80000c12 + return p; +} + 800018f2: 8526 mv a0,s1 + 800018f4: 60e2 ld ra,24(sp) + 800018f6: 6442 ld s0,16(sp) + 800018f8: 64a2 ld s1,8(sp) + 800018fa: 6105 addi sp,sp,32 + 800018fc: 8082 ret + +00000000800018fe : + +// A fork child's very first scheduling by scheduler() +// will swtch to forkret. +void +forkret(void) +{ + 800018fe: 7179 addi sp,sp,-48 + 80001900: f406 sd ra,40(sp) + 80001902: f022 sd s0,32(sp) + 80001904: ec26 sd s1,24(sp) + 80001906: 1800 addi s0,sp,48 + extern char userret[]; + static int first = 1; + struct proc *p = myproc(); + 80001908: fc7ff0ef jal 800018ce + 8000190c: 84aa mv s1,a0 + + // Still holding p->lock from scheduler. + release(&p->lock); + 8000190e: b58ff0ef jal 80000c66 + + if (first) { + 80001912: 00009797 auipc a5,0x9 + 80001916: 84e7a783 lw a5,-1970(a5) # 8000a160 + 8000191a: cf8d beqz a5,80001954 + // File system initialization must be run in the context of a + // regular process (e.g., because it calls sleep), and thus cannot + // be run from main(). + fsinit(ROOTDEV); + 8000191c: 4505 li a0,1 + 8000191e: 3b9010ef jal 800034d6 + + first = 0; + 80001922: 00009797 auipc a5,0x9 + 80001926: 8207af23 sw zero,-1986(a5) # 8000a160 + // ensure other cores see first=0. + __sync_synchronize(); + 8000192a: 0330000f fence rw,rw + + // We can invoke kexec() now that file system is initialized. + // Put the return value (argc) of kexec into a0. + p->trapframe->a0 = kexec("/init", (char *[]){ "/init", 0 }); + 8000192e: 00006517 auipc a0,0x6 + 80001932: 85250513 addi a0,a0,-1966 # 80007180 + 80001936: fca43823 sd a0,-48(s0) + 8000193a: fc043c23 sd zero,-40(s0) + 8000193e: fd040593 addi a1,s0,-48 + 80001942: 49f020ef jal 800045e0 + 80001946: 6cbc ld a5,88(s1) + 80001948: fba8 sd a0,112(a5) + if (p->trapframe->a0 == -1) { + 8000194a: 6cbc ld a5,88(s1) + 8000194c: 7bb8 ld a4,112(a5) + 8000194e: 57fd li a5,-1 + 80001950: 02f70d63 beq a4,a5,8000198a + panic("exec"); + } + } + + // return to user space, mimicing usertrap()'s return. + prepare_return(); + 80001954: 2bf000ef jal 80002412 + uint64 satp = MAKE_SATP(p->pagetable); + 80001958: 68a8 ld a0,80(s1) + 8000195a: 8131 srli a0,a0,0xc + uint64 trampoline_userret = TRAMPOLINE + (userret - trampoline); + 8000195c: 04000737 lui a4,0x4000 + 80001960: 177d addi a4,a4,-1 # 3ffffff <_entry-0x7c000001> + 80001962: 0732 slli a4,a4,0xc + 80001964: 00004797 auipc a5,0x4 + 80001968: 73878793 addi a5,a5,1848 # 8000609c + 8000196c: 00004697 auipc a3,0x4 + 80001970: 69468693 addi a3,a3,1684 # 80006000 <_trampoline> + 80001974: 8f95 sub a5,a5,a3 + 80001976: 97ba add a5,a5,a4 + ((void (*)(uint64))trampoline_userret)(satp); + 80001978: 577d li a4,-1 + 8000197a: 177e slli a4,a4,0x3f + 8000197c: 8d59 or a0,a0,a4 + 8000197e: 9782 jalr a5 +} + 80001980: 70a2 ld ra,40(sp) + 80001982: 7402 ld s0,32(sp) + 80001984: 64e2 ld s1,24(sp) + 80001986: 6145 addi sp,sp,48 + 80001988: 8082 ret + panic("exec"); + 8000198a: 00005517 auipc a0,0x5 + 8000198e: 7fe50513 addi a0,a0,2046 # 80007188 + 80001992: e4ffe0ef jal 800007e0 + +0000000080001996 : +{ + 80001996: 1101 addi sp,sp,-32 + 80001998: ec06 sd ra,24(sp) + 8000199a: e822 sd s0,16(sp) + 8000199c: e426 sd s1,8(sp) + 8000199e: e04a sd s2,0(sp) + 800019a0: 1000 addi s0,sp,32 + acquire(&pid_lock); + 800019a2: 00011917 auipc s2,0x11 + 800019a6: 91690913 addi s2,s2,-1770 # 800122b8 + 800019aa: 854a mv a0,s2 + 800019ac: a22ff0ef jal 80000bce + pid = nextpid; + 800019b0: 00008797 auipc a5,0x8 + 800019b4: 7b478793 addi a5,a5,1972 # 8000a164 + 800019b8: 4384 lw s1,0(a5) + nextpid = nextpid + 1; + 800019ba: 0014871b addiw a4,s1,1 + 800019be: c398 sw a4,0(a5) + release(&pid_lock); + 800019c0: 854a mv a0,s2 + 800019c2: aa4ff0ef jal 80000c66 +} + 800019c6: 8526 mv a0,s1 + 800019c8: 60e2 ld ra,24(sp) + 800019ca: 6442 ld s0,16(sp) + 800019cc: 64a2 ld s1,8(sp) + 800019ce: 6902 ld s2,0(sp) + 800019d0: 6105 addi sp,sp,32 + 800019d2: 8082 ret + +00000000800019d4 : +{ + 800019d4: 1101 addi sp,sp,-32 + 800019d6: ec06 sd ra,24(sp) + 800019d8: e822 sd s0,16(sp) + 800019da: e426 sd s1,8(sp) + 800019dc: e04a sd s2,0(sp) + 800019de: 1000 addi s0,sp,32 + 800019e0: 892a mv s2,a0 + pagetable = uvmcreate(); + 800019e2: fb2ff0ef jal 80001194 + 800019e6: 84aa mv s1,a0 + if(pagetable == 0) + 800019e8: cd05 beqz a0,80001a20 + if(mappages(pagetable, TRAMPOLINE, PGSIZE, + 800019ea: 4729 li a4,10 + 800019ec: 00004697 auipc a3,0x4 + 800019f0: 61468693 addi a3,a3,1556 # 80006000 <_trampoline> + 800019f4: 6605 lui a2,0x1 + 800019f6: 040005b7 lui a1,0x4000 + 800019fa: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 800019fc: 05b2 slli a1,a1,0xc + 800019fe: df0ff0ef jal 80000fee + 80001a02: 02054663 bltz a0,80001a2e + if(mappages(pagetable, TRAPFRAME, PGSIZE, + 80001a06: 4719 li a4,6 + 80001a08: 05893683 ld a3,88(s2) + 80001a0c: 6605 lui a2,0x1 + 80001a0e: 020005b7 lui a1,0x2000 + 80001a12: 15fd addi a1,a1,-1 # 1ffffff <_entry-0x7e000001> + 80001a14: 05b6 slli a1,a1,0xd + 80001a16: 8526 mv a0,s1 + 80001a18: dd6ff0ef jal 80000fee + 80001a1c: 00054f63 bltz a0,80001a3a +} + 80001a20: 8526 mv a0,s1 + 80001a22: 60e2 ld ra,24(sp) + 80001a24: 6442 ld s0,16(sp) + 80001a26: 64a2 ld s1,8(sp) + 80001a28: 6902 ld s2,0(sp) + 80001a2a: 6105 addi sp,sp,32 + 80001a2c: 8082 ret + uvmfree(pagetable, 0); + 80001a2e: 4581 li a1,0 + 80001a30: 8526 mv a0,s1 + 80001a32: 95dff0ef jal 8000138e + return 0; + 80001a36: 4481 li s1,0 + 80001a38: b7e5 j 80001a20 + uvmunmap(pagetable, TRAMPOLINE, 1, 0); + 80001a3a: 4681 li a3,0 + 80001a3c: 4605 li a2,1 + 80001a3e: 040005b7 lui a1,0x4000 + 80001a42: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 80001a44: 05b2 slli a1,a1,0xc + 80001a46: 8526 mv a0,s1 + 80001a48: f72ff0ef jal 800011ba + uvmfree(pagetable, 0); + 80001a4c: 4581 li a1,0 + 80001a4e: 8526 mv a0,s1 + 80001a50: 93fff0ef jal 8000138e + return 0; + 80001a54: 4481 li s1,0 + 80001a56: b7e9 j 80001a20 + +0000000080001a58 : +{ + 80001a58: 1101 addi sp,sp,-32 + 80001a5a: ec06 sd ra,24(sp) + 80001a5c: e822 sd s0,16(sp) + 80001a5e: e426 sd s1,8(sp) + 80001a60: e04a sd s2,0(sp) + 80001a62: 1000 addi s0,sp,32 + 80001a64: 84aa mv s1,a0 + 80001a66: 892e mv s2,a1 + uvmunmap(pagetable, TRAMPOLINE, 1, 0); + 80001a68: 4681 li a3,0 + 80001a6a: 4605 li a2,1 + 80001a6c: 040005b7 lui a1,0x4000 + 80001a70: 15fd addi a1,a1,-1 # 3ffffff <_entry-0x7c000001> + 80001a72: 05b2 slli a1,a1,0xc + 80001a74: f46ff0ef jal 800011ba + uvmunmap(pagetable, TRAPFRAME, 1, 0); + 80001a78: 4681 li a3,0 + 80001a7a: 4605 li a2,1 + 80001a7c: 020005b7 lui a1,0x2000 + 80001a80: 15fd addi a1,a1,-1 # 1ffffff <_entry-0x7e000001> + 80001a82: 05b6 slli a1,a1,0xd + 80001a84: 8526 mv a0,s1 + 80001a86: f34ff0ef jal 800011ba + uvmfree(pagetable, sz); + 80001a8a: 85ca mv a1,s2 + 80001a8c: 8526 mv a0,s1 + 80001a8e: 901ff0ef jal 8000138e +} + 80001a92: 60e2 ld ra,24(sp) + 80001a94: 6442 ld s0,16(sp) + 80001a96: 64a2 ld s1,8(sp) + 80001a98: 6902 ld s2,0(sp) + 80001a9a: 6105 addi sp,sp,32 + 80001a9c: 8082 ret + +0000000080001a9e : +{ + 80001a9e: 1101 addi sp,sp,-32 + 80001aa0: ec06 sd ra,24(sp) + 80001aa2: e822 sd s0,16(sp) + 80001aa4: e426 sd s1,8(sp) + 80001aa6: 1000 addi s0,sp,32 + 80001aa8: 84aa mv s1,a0 + if(p->trapframe) + 80001aaa: 6d28 ld a0,88(a0) + 80001aac: c119 beqz a0,80001ab2 + kfree((void*)p->trapframe); + 80001aae: f6ffe0ef jal 80000a1c + p->trapframe = 0; + 80001ab2: 0404bc23 sd zero,88(s1) + if(p->pagetable) + 80001ab6: 68a8 ld a0,80(s1) + 80001ab8: c501 beqz a0,80001ac0 + proc_freepagetable(p->pagetable, p->sz); + 80001aba: 64ac ld a1,72(s1) + 80001abc: f9dff0ef jal 80001a58 + p->pagetable = 0; + 80001ac0: 0404b823 sd zero,80(s1) + p->sz = 0; + 80001ac4: 0404b423 sd zero,72(s1) + p->pid = 0; + 80001ac8: 0204a823 sw zero,48(s1) + p->parent = 0; + 80001acc: 0204bc23 sd zero,56(s1) + p->name[0] = 0; + 80001ad0: 14048c23 sb zero,344(s1) + p->chan = 0; + 80001ad4: 0204b023 sd zero,32(s1) + p->killed = 0; + 80001ad8: 0204a423 sw zero,40(s1) + p->xstate = 0; + 80001adc: 0204a623 sw zero,44(s1) + p->state = UNUSED; + 80001ae0: 0004ac23 sw zero,24(s1) +} + 80001ae4: 60e2 ld ra,24(sp) + 80001ae6: 6442 ld s0,16(sp) + 80001ae8: 64a2 ld s1,8(sp) + 80001aea: 6105 addi sp,sp,32 + 80001aec: 8082 ret + +0000000080001aee : +{ + 80001aee: 1101 addi sp,sp,-32 + 80001af0: ec06 sd ra,24(sp) + 80001af2: e822 sd s0,16(sp) + 80001af4: e426 sd s1,8(sp) + 80001af6: e04a sd s2,0(sp) + 80001af8: 1000 addi s0,sp,32 + for(p = proc; p < &proc[NPROC]; p++) { + 80001afa: 00011497 auipc s1,0x11 + 80001afe: bee48493 addi s1,s1,-1042 # 800126e8 + 80001b02: 00016917 auipc s2,0x16 + 80001b06: 5e690913 addi s2,s2,1510 # 800180e8 + acquire(&p->lock); + 80001b0a: 8526 mv a0,s1 + 80001b0c: 8c2ff0ef jal 80000bce + if(p->state == UNUSED) { + 80001b10: 4c9c lw a5,24(s1) + 80001b12: cb91 beqz a5,80001b26 + release(&p->lock); + 80001b14: 8526 mv a0,s1 + 80001b16: 950ff0ef jal 80000c66 + for(p = proc; p < &proc[NPROC]; p++) { + 80001b1a: 16848493 addi s1,s1,360 + 80001b1e: ff2496e3 bne s1,s2,80001b0a + return 0; + 80001b22: 4481 li s1,0 + 80001b24: a089 j 80001b66 + p->pid = allocpid(); + 80001b26: e71ff0ef jal 80001996 + 80001b2a: d888 sw a0,48(s1) + p->state = USED; + 80001b2c: 4785 li a5,1 + 80001b2e: cc9c sw a5,24(s1) + if((p->trapframe = (struct trapframe *)kalloc()) == 0){ + 80001b30: fcffe0ef jal 80000afe + 80001b34: 892a mv s2,a0 + 80001b36: eca8 sd a0,88(s1) + 80001b38: cd15 beqz a0,80001b74 + p->pagetable = proc_pagetable(p); + 80001b3a: 8526 mv a0,s1 + 80001b3c: e99ff0ef jal 800019d4 + 80001b40: 892a mv s2,a0 + 80001b42: e8a8 sd a0,80(s1) + if(p->pagetable == 0){ + 80001b44: c121 beqz a0,80001b84 + memset(&p->context, 0, sizeof(p->context)); + 80001b46: 07000613 li a2,112 + 80001b4a: 4581 li a1,0 + 80001b4c: 06048513 addi a0,s1,96 + 80001b50: 952ff0ef jal 80000ca2 + p->context.ra = (uint64)forkret; + 80001b54: 00000797 auipc a5,0x0 + 80001b58: daa78793 addi a5,a5,-598 # 800018fe + 80001b5c: f0bc sd a5,96(s1) + p->context.sp = p->kstack + PGSIZE; + 80001b5e: 60bc ld a5,64(s1) + 80001b60: 6705 lui a4,0x1 + 80001b62: 97ba add a5,a5,a4 + 80001b64: f4bc sd a5,104(s1) +} + 80001b66: 8526 mv a0,s1 + 80001b68: 60e2 ld ra,24(sp) + 80001b6a: 6442 ld s0,16(sp) + 80001b6c: 64a2 ld s1,8(sp) + 80001b6e: 6902 ld s2,0(sp) + 80001b70: 6105 addi sp,sp,32 + 80001b72: 8082 ret + freeproc(p); + 80001b74: 8526 mv a0,s1 + 80001b76: f29ff0ef jal 80001a9e + release(&p->lock); + 80001b7a: 8526 mv a0,s1 + 80001b7c: 8eaff0ef jal 80000c66 + return 0; + 80001b80: 84ca mv s1,s2 + 80001b82: b7d5 j 80001b66 + freeproc(p); + 80001b84: 8526 mv a0,s1 + 80001b86: f19ff0ef jal 80001a9e + release(&p->lock); + 80001b8a: 8526 mv a0,s1 + 80001b8c: 8daff0ef jal 80000c66 + return 0; + 80001b90: 84ca mv s1,s2 + 80001b92: bfd1 j 80001b66 + +0000000080001b94 : +{ + 80001b94: 1101 addi sp,sp,-32 + 80001b96: ec06 sd ra,24(sp) + 80001b98: e822 sd s0,16(sp) + 80001b9a: e426 sd s1,8(sp) + 80001b9c: 1000 addi s0,sp,32 + p = allocproc(); + 80001b9e: f51ff0ef jal 80001aee + 80001ba2: 84aa mv s1,a0 + initproc = p; + 80001ba4: 00008797 auipc a5,0x8 + 80001ba8: 60a7b623 sd a0,1548(a5) # 8000a1b0 + p->cwd = namei("/"); + 80001bac: 00005517 auipc a0,0x5 + 80001bb0: 5e450513 addi a0,a0,1508 # 80007190 + 80001bb4: 645010ef jal 800039f8 + 80001bb8: 14a4b823 sd a0,336(s1) + p->state = RUNNABLE; + 80001bbc: 478d li a5,3 + 80001bbe: cc9c sw a5,24(s1) + release(&p->lock); + 80001bc0: 8526 mv a0,s1 + 80001bc2: 8a4ff0ef jal 80000c66 +} + 80001bc6: 60e2 ld ra,24(sp) + 80001bc8: 6442 ld s0,16(sp) + 80001bca: 64a2 ld s1,8(sp) + 80001bcc: 6105 addi sp,sp,32 + 80001bce: 8082 ret + +0000000080001bd0 : +{ + 80001bd0: 1101 addi sp,sp,-32 + 80001bd2: ec06 sd ra,24(sp) + 80001bd4: e822 sd s0,16(sp) + 80001bd6: e426 sd s1,8(sp) + 80001bd8: e04a sd s2,0(sp) + 80001bda: 1000 addi s0,sp,32 + 80001bdc: 84aa mv s1,a0 + struct proc *p = myproc(); + 80001bde: cf1ff0ef jal 800018ce + 80001be2: 892a mv s2,a0 + sz = p->sz; + 80001be4: 652c ld a1,72(a0) + if(n > 0){ + 80001be6: 02905963 blez s1,80001c18 + if(sz + n > TRAPFRAME) { + 80001bea: 00b48633 add a2,s1,a1 + 80001bee: 020007b7 lui a5,0x2000 + 80001bf2: 17fd addi a5,a5,-1 # 1ffffff <_entry-0x7e000001> + 80001bf4: 07b6 slli a5,a5,0xd + 80001bf6: 02c7ea63 bltu a5,a2,80001c2a + if((sz = uvmalloc(p->pagetable, sz, sz + n, PTE_W)) == 0) { + 80001bfa: 4691 li a3,4 + 80001bfc: 6928 ld a0,80(a0) + 80001bfe: e8aff0ef jal 80001288 + 80001c02: 85aa mv a1,a0 + 80001c04: c50d beqz a0,80001c2e + p->sz = sz; + 80001c06: 04b93423 sd a1,72(s2) + return 0; + 80001c0a: 4501 li a0,0 +} + 80001c0c: 60e2 ld ra,24(sp) + 80001c0e: 6442 ld s0,16(sp) + 80001c10: 64a2 ld s1,8(sp) + 80001c12: 6902 ld s2,0(sp) + 80001c14: 6105 addi sp,sp,32 + 80001c16: 8082 ret + } else if(n < 0){ + 80001c18: fe04d7e3 bgez s1,80001c06 + sz = uvmdealloc(p->pagetable, sz, sz + n); + 80001c1c: 00b48633 add a2,s1,a1 + 80001c20: 6928 ld a0,80(a0) + 80001c22: e22ff0ef jal 80001244 + 80001c26: 85aa mv a1,a0 + 80001c28: bff9 j 80001c06 + return -1; + 80001c2a: 557d li a0,-1 + 80001c2c: b7c5 j 80001c0c + return -1; + 80001c2e: 557d li a0,-1 + 80001c30: bff1 j 80001c0c + +0000000080001c32 : +{ + 80001c32: 7139 addi sp,sp,-64 + 80001c34: fc06 sd ra,56(sp) + 80001c36: f822 sd s0,48(sp) + 80001c38: f04a sd s2,32(sp) + 80001c3a: e456 sd s5,8(sp) + 80001c3c: 0080 addi s0,sp,64 + struct proc *p = myproc(); + 80001c3e: c91ff0ef jal 800018ce + 80001c42: 8aaa mv s5,a0 + if((np = allocproc()) == 0){ + 80001c44: eabff0ef jal 80001aee + 80001c48: 0e050a63 beqz a0,80001d3c + 80001c4c: e852 sd s4,16(sp) + 80001c4e: 8a2a mv s4,a0 + if(uvmcopy(p->pagetable, np->pagetable, p->sz) < 0){ + 80001c50: 048ab603 ld a2,72(s5) + 80001c54: 692c ld a1,80(a0) + 80001c56: 050ab503 ld a0,80(s5) + 80001c5a: f66ff0ef jal 800013c0 + 80001c5e: 04054a63 bltz a0,80001cb2 + 80001c62: f426 sd s1,40(sp) + 80001c64: ec4e sd s3,24(sp) + np->sz = p->sz; + 80001c66: 048ab783 ld a5,72(s5) + 80001c6a: 04fa3423 sd a5,72(s4) + *(np->trapframe) = *(p->trapframe); + 80001c6e: 058ab683 ld a3,88(s5) + 80001c72: 87b6 mv a5,a3 + 80001c74: 058a3703 ld a4,88(s4) + 80001c78: 12068693 addi a3,a3,288 + 80001c7c: 0007b803 ld a6,0(a5) + 80001c80: 6788 ld a0,8(a5) + 80001c82: 6b8c ld a1,16(a5) + 80001c84: 6f90 ld a2,24(a5) + 80001c86: 01073023 sd a6,0(a4) # 1000 <_entry-0x7ffff000> + 80001c8a: e708 sd a0,8(a4) + 80001c8c: eb0c sd a1,16(a4) + 80001c8e: ef10 sd a2,24(a4) + 80001c90: 02078793 addi a5,a5,32 + 80001c94: 02070713 addi a4,a4,32 + 80001c98: fed792e3 bne a5,a3,80001c7c + np->trapframe->a0 = 0; + 80001c9c: 058a3783 ld a5,88(s4) + 80001ca0: 0607b823 sd zero,112(a5) + for(i = 0; i < NOFILE; i++) + 80001ca4: 0d0a8493 addi s1,s5,208 + 80001ca8: 0d0a0913 addi s2,s4,208 + 80001cac: 150a8993 addi s3,s5,336 + 80001cb0: a831 j 80001ccc + freeproc(np); + 80001cb2: 8552 mv a0,s4 + 80001cb4: debff0ef jal 80001a9e + release(&np->lock); + 80001cb8: 8552 mv a0,s4 + 80001cba: fadfe0ef jal 80000c66 + return -1; + 80001cbe: 597d li s2,-1 + 80001cc0: 6a42 ld s4,16(sp) + 80001cc2: a0b5 j 80001d2e + for(i = 0; i < NOFILE; i++) + 80001cc4: 04a1 addi s1,s1,8 + 80001cc6: 0921 addi s2,s2,8 + 80001cc8: 01348963 beq s1,s3,80001cda + if(p->ofile[i]) + 80001ccc: 6088 ld a0,0(s1) + 80001cce: d97d beqz a0,80001cc4 + np->ofile[i] = filedup(p->ofile[i]); + 80001cd0: 2c2020ef jal 80003f92 + 80001cd4: 00a93023 sd a0,0(s2) + 80001cd8: b7f5 j 80001cc4 + np->cwd = idup(p->cwd); + 80001cda: 150ab503 ld a0,336(s5) + 80001cde: 4ce010ef jal 800031ac + 80001ce2: 14aa3823 sd a0,336(s4) + safestrcpy(np->name, p->name, sizeof(p->name)); + 80001ce6: 4641 li a2,16 + 80001ce8: 158a8593 addi a1,s5,344 + 80001cec: 158a0513 addi a0,s4,344 + 80001cf0: 8f0ff0ef jal 80000de0 + pid = np->pid; + 80001cf4: 030a2903 lw s2,48(s4) + release(&np->lock); + 80001cf8: 8552 mv a0,s4 + 80001cfa: f6dfe0ef jal 80000c66 + acquire(&wait_lock); + 80001cfe: 00010497 auipc s1,0x10 + 80001d02: 5d248493 addi s1,s1,1490 # 800122d0 + 80001d06: 8526 mv a0,s1 + 80001d08: ec7fe0ef jal 80000bce + np->parent = p; + 80001d0c: 035a3c23 sd s5,56(s4) + release(&wait_lock); + 80001d10: 8526 mv a0,s1 + 80001d12: f55fe0ef jal 80000c66 + acquire(&np->lock); + 80001d16: 8552 mv a0,s4 + 80001d18: eb7fe0ef jal 80000bce + np->state = RUNNABLE; + 80001d1c: 478d li a5,3 + 80001d1e: 00fa2c23 sw a5,24(s4) + release(&np->lock); + 80001d22: 8552 mv a0,s4 + 80001d24: f43fe0ef jal 80000c66 + return pid; + 80001d28: 74a2 ld s1,40(sp) + 80001d2a: 69e2 ld s3,24(sp) + 80001d2c: 6a42 ld s4,16(sp) +} + 80001d2e: 854a mv a0,s2 + 80001d30: 70e2 ld ra,56(sp) + 80001d32: 7442 ld s0,48(sp) + 80001d34: 7902 ld s2,32(sp) + 80001d36: 6aa2 ld s5,8(sp) + 80001d38: 6121 addi sp,sp,64 + 80001d3a: 8082 ret + return -1; + 80001d3c: 597d li s2,-1 + 80001d3e: bfc5 j 80001d2e + +0000000080001d40 : +{ + 80001d40: 715d addi sp,sp,-80 + 80001d42: e486 sd ra,72(sp) + 80001d44: e0a2 sd s0,64(sp) + 80001d46: fc26 sd s1,56(sp) + 80001d48: f84a sd s2,48(sp) + 80001d4a: f44e sd s3,40(sp) + 80001d4c: f052 sd s4,32(sp) + 80001d4e: ec56 sd s5,24(sp) + 80001d50: e85a sd s6,16(sp) + 80001d52: e45e sd s7,8(sp) + 80001d54: e062 sd s8,0(sp) + 80001d56: 0880 addi s0,sp,80 + 80001d58: 8792 mv a5,tp + int id = r_tp(); + 80001d5a: 2781 sext.w a5,a5 + c->proc = 0; + 80001d5c: 00779b13 slli s6,a5,0x7 + 80001d60: 00010717 auipc a4,0x10 + 80001d64: 55870713 addi a4,a4,1368 # 800122b8 + 80001d68: 975a add a4,a4,s6 + 80001d6a: 02073823 sd zero,48(a4) + swtch(&c->context, &p->context); + 80001d6e: 00010717 auipc a4,0x10 + 80001d72: 58270713 addi a4,a4,1410 # 800122f0 + 80001d76: 9b3a add s6,s6,a4 + p->state = RUNNING; + 80001d78: 4c11 li s8,4 + c->proc = p; + 80001d7a: 079e slli a5,a5,0x7 + 80001d7c: 00010a17 auipc s4,0x10 + 80001d80: 53ca0a13 addi s4,s4,1340 # 800122b8 + 80001d84: 9a3e add s4,s4,a5 + found = 1; + 80001d86: 4b85 li s7,1 + for(p = proc; p < &proc[NPROC]; p++) { + 80001d88: 00016997 auipc s3,0x16 + 80001d8c: 36098993 addi s3,s3,864 # 800180e8 + 80001d90: a83d j 80001dce + release(&p->lock); + 80001d92: 8526 mv a0,s1 + 80001d94: ed3fe0ef jal 80000c66 + for(p = proc; p < &proc[NPROC]; p++) { + 80001d98: 16848493 addi s1,s1,360 + 80001d9c: 03348563 beq s1,s3,80001dc6 + acquire(&p->lock); + 80001da0: 8526 mv a0,s1 + 80001da2: e2dfe0ef jal 80000bce + if(p->state == RUNNABLE) { + 80001da6: 4c9c lw a5,24(s1) + 80001da8: ff2795e3 bne a5,s2,80001d92 + p->state = RUNNING; + 80001dac: 0184ac23 sw s8,24(s1) + c->proc = p; + 80001db0: 029a3823 sd s1,48(s4) + swtch(&c->context, &p->context); + 80001db4: 06048593 addi a1,s1,96 + 80001db8: 855a mv a0,s6 + 80001dba: 5b2000ef jal 8000236c + c->proc = 0; + 80001dbe: 020a3823 sd zero,48(s4) + found = 1; + 80001dc2: 8ade mv s5,s7 + 80001dc4: b7f9 j 80001d92 + if(found == 0) { + 80001dc6: 000a9463 bnez s5,80001dce + asm volatile("wfi"); + 80001dca: 10500073 wfi + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80001dce: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 80001dd2: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80001dd6: 10079073 csrw sstatus,a5 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80001dda: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() & ~SSTATUS_SIE); + 80001dde: 9bf5 andi a5,a5,-3 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80001de0: 10079073 csrw sstatus,a5 + int found = 0; + 80001de4: 4a81 li s5,0 + for(p = proc; p < &proc[NPROC]; p++) { + 80001de6: 00011497 auipc s1,0x11 + 80001dea: 90248493 addi s1,s1,-1790 # 800126e8 + if(p->state == RUNNABLE) { + 80001dee: 490d li s2,3 + 80001df0: bf45 j 80001da0 + +0000000080001df2 : +{ + 80001df2: 7179 addi sp,sp,-48 + 80001df4: f406 sd ra,40(sp) + 80001df6: f022 sd s0,32(sp) + 80001df8: ec26 sd s1,24(sp) + 80001dfa: e84a sd s2,16(sp) + 80001dfc: e44e sd s3,8(sp) + 80001dfe: 1800 addi s0,sp,48 + struct proc *p = myproc(); + 80001e00: acfff0ef jal 800018ce + 80001e04: 84aa mv s1,a0 + if(!holding(&p->lock)) + 80001e06: d5ffe0ef jal 80000b64 + 80001e0a: c92d beqz a0,80001e7c + asm volatile("mv %0, tp" : "=r" (x) ); + 80001e0c: 8792 mv a5,tp + if(mycpu()->noff != 1) + 80001e0e: 2781 sext.w a5,a5 + 80001e10: 079e slli a5,a5,0x7 + 80001e12: 00010717 auipc a4,0x10 + 80001e16: 4a670713 addi a4,a4,1190 # 800122b8 + 80001e1a: 97ba add a5,a5,a4 + 80001e1c: 0a87a703 lw a4,168(a5) + 80001e20: 4785 li a5,1 + 80001e22: 06f71363 bne a4,a5,80001e88 + if(p->state == RUNNING) + 80001e26: 4c98 lw a4,24(s1) + 80001e28: 4791 li a5,4 + 80001e2a: 06f70563 beq a4,a5,80001e94 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80001e2e: 100027f3 csrr a5,sstatus + return (x & SSTATUS_SIE) != 0; + 80001e32: 8b89 andi a5,a5,2 + if(intr_get()) + 80001e34: e7b5 bnez a5,80001ea0 + asm volatile("mv %0, tp" : "=r" (x) ); + 80001e36: 8792 mv a5,tp + intena = mycpu()->intena; + 80001e38: 00010917 auipc s2,0x10 + 80001e3c: 48090913 addi s2,s2,1152 # 800122b8 + 80001e40: 2781 sext.w a5,a5 + 80001e42: 079e slli a5,a5,0x7 + 80001e44: 97ca add a5,a5,s2 + 80001e46: 0ac7a983 lw s3,172(a5) + 80001e4a: 8792 mv a5,tp + swtch(&p->context, &mycpu()->context); + 80001e4c: 2781 sext.w a5,a5 + 80001e4e: 079e slli a5,a5,0x7 + 80001e50: 00010597 auipc a1,0x10 + 80001e54: 4a058593 addi a1,a1,1184 # 800122f0 + 80001e58: 95be add a1,a1,a5 + 80001e5a: 06048513 addi a0,s1,96 + 80001e5e: 50e000ef jal 8000236c + 80001e62: 8792 mv a5,tp + mycpu()->intena = intena; + 80001e64: 2781 sext.w a5,a5 + 80001e66: 079e slli a5,a5,0x7 + 80001e68: 993e add s2,s2,a5 + 80001e6a: 0b392623 sw s3,172(s2) +} + 80001e6e: 70a2 ld ra,40(sp) + 80001e70: 7402 ld s0,32(sp) + 80001e72: 64e2 ld s1,24(sp) + 80001e74: 6942 ld s2,16(sp) + 80001e76: 69a2 ld s3,8(sp) + 80001e78: 6145 addi sp,sp,48 + 80001e7a: 8082 ret + panic("sched p->lock"); + 80001e7c: 00005517 auipc a0,0x5 + 80001e80: 31c50513 addi a0,a0,796 # 80007198 + 80001e84: 95dfe0ef jal 800007e0 + panic("sched locks"); + 80001e88: 00005517 auipc a0,0x5 + 80001e8c: 32050513 addi a0,a0,800 # 800071a8 + 80001e90: 951fe0ef jal 800007e0 + panic("sched RUNNING"); + 80001e94: 00005517 auipc a0,0x5 + 80001e98: 32450513 addi a0,a0,804 # 800071b8 + 80001e9c: 945fe0ef jal 800007e0 + panic("sched interruptible"); + 80001ea0: 00005517 auipc a0,0x5 + 80001ea4: 32850513 addi a0,a0,808 # 800071c8 + 80001ea8: 939fe0ef jal 800007e0 + +0000000080001eac : +{ + 80001eac: 1101 addi sp,sp,-32 + 80001eae: ec06 sd ra,24(sp) + 80001eb0: e822 sd s0,16(sp) + 80001eb2: e426 sd s1,8(sp) + 80001eb4: 1000 addi s0,sp,32 + struct proc *p = myproc(); + 80001eb6: a19ff0ef jal 800018ce + 80001eba: 84aa mv s1,a0 + acquire(&p->lock); + 80001ebc: d13fe0ef jal 80000bce + p->state = RUNNABLE; + 80001ec0: 478d li a5,3 + 80001ec2: cc9c sw a5,24(s1) + sched(); + 80001ec4: f2fff0ef jal 80001df2 + release(&p->lock); + 80001ec8: 8526 mv a0,s1 + 80001eca: d9dfe0ef jal 80000c66 +} + 80001ece: 60e2 ld ra,24(sp) + 80001ed0: 6442 ld s0,16(sp) + 80001ed2: 64a2 ld s1,8(sp) + 80001ed4: 6105 addi sp,sp,32 + 80001ed6: 8082 ret + +0000000080001ed8 : + +// Sleep on channel chan, releasing condition lock lk. +// Re-acquires lk when awakened. +void +sleep(void *chan, struct spinlock *lk) +{ + 80001ed8: 7179 addi sp,sp,-48 + 80001eda: f406 sd ra,40(sp) + 80001edc: f022 sd s0,32(sp) + 80001ede: ec26 sd s1,24(sp) + 80001ee0: e84a sd s2,16(sp) + 80001ee2: e44e sd s3,8(sp) + 80001ee4: 1800 addi s0,sp,48 + 80001ee6: 89aa mv s3,a0 + 80001ee8: 892e mv s2,a1 + struct proc *p = myproc(); + 80001eea: 9e5ff0ef jal 800018ce + 80001eee: 84aa mv s1,a0 + // Once we hold p->lock, we can be + // guaranteed that we won't miss any wakeup + // (wakeup locks p->lock), + // so it's okay to release lk. + + acquire(&p->lock); //DOC: sleeplock1 + 80001ef0: cdffe0ef jal 80000bce + release(lk); + 80001ef4: 854a mv a0,s2 + 80001ef6: d71fe0ef jal 80000c66 + + // Go to sleep. + p->chan = chan; + 80001efa: 0334b023 sd s3,32(s1) + p->state = SLEEPING; + 80001efe: 4789 li a5,2 + 80001f00: cc9c sw a5,24(s1) + + sched(); + 80001f02: ef1ff0ef jal 80001df2 + + // Tidy up. + p->chan = 0; + 80001f06: 0204b023 sd zero,32(s1) + + // Reacquire original lock. + release(&p->lock); + 80001f0a: 8526 mv a0,s1 + 80001f0c: d5bfe0ef jal 80000c66 + acquire(lk); + 80001f10: 854a mv a0,s2 + 80001f12: cbdfe0ef jal 80000bce +} + 80001f16: 70a2 ld ra,40(sp) + 80001f18: 7402 ld s0,32(sp) + 80001f1a: 64e2 ld s1,24(sp) + 80001f1c: 6942 ld s2,16(sp) + 80001f1e: 69a2 ld s3,8(sp) + 80001f20: 6145 addi sp,sp,48 + 80001f22: 8082 ret + +0000000080001f24 : + +// Wake up all processes sleeping on channel chan. +// Caller should hold the condition lock. +void +wakeup(void *chan) +{ + 80001f24: 7139 addi sp,sp,-64 + 80001f26: fc06 sd ra,56(sp) + 80001f28: f822 sd s0,48(sp) + 80001f2a: f426 sd s1,40(sp) + 80001f2c: f04a sd s2,32(sp) + 80001f2e: ec4e sd s3,24(sp) + 80001f30: e852 sd s4,16(sp) + 80001f32: e456 sd s5,8(sp) + 80001f34: 0080 addi s0,sp,64 + 80001f36: 8a2a mv s4,a0 + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + 80001f38: 00010497 auipc s1,0x10 + 80001f3c: 7b048493 addi s1,s1,1968 # 800126e8 + if(p != myproc()){ + acquire(&p->lock); + if(p->state == SLEEPING && p->chan == chan) { + 80001f40: 4989 li s3,2 + p->state = RUNNABLE; + 80001f42: 4a8d li s5,3 + for(p = proc; p < &proc[NPROC]; p++) { + 80001f44: 00016917 auipc s2,0x16 + 80001f48: 1a490913 addi s2,s2,420 # 800180e8 + 80001f4c: a801 j 80001f5c + } + release(&p->lock); + 80001f4e: 8526 mv a0,s1 + 80001f50: d17fe0ef jal 80000c66 + for(p = proc; p < &proc[NPROC]; p++) { + 80001f54: 16848493 addi s1,s1,360 + 80001f58: 03248263 beq s1,s2,80001f7c + if(p != myproc()){ + 80001f5c: 973ff0ef jal 800018ce + 80001f60: fea48ae3 beq s1,a0,80001f54 + acquire(&p->lock); + 80001f64: 8526 mv a0,s1 + 80001f66: c69fe0ef jal 80000bce + if(p->state == SLEEPING && p->chan == chan) { + 80001f6a: 4c9c lw a5,24(s1) + 80001f6c: ff3791e3 bne a5,s3,80001f4e + 80001f70: 709c ld a5,32(s1) + 80001f72: fd479ee3 bne a5,s4,80001f4e + p->state = RUNNABLE; + 80001f76: 0154ac23 sw s5,24(s1) + 80001f7a: bfd1 j 80001f4e + } + } +} + 80001f7c: 70e2 ld ra,56(sp) + 80001f7e: 7442 ld s0,48(sp) + 80001f80: 74a2 ld s1,40(sp) + 80001f82: 7902 ld s2,32(sp) + 80001f84: 69e2 ld s3,24(sp) + 80001f86: 6a42 ld s4,16(sp) + 80001f88: 6aa2 ld s5,8(sp) + 80001f8a: 6121 addi sp,sp,64 + 80001f8c: 8082 ret + +0000000080001f8e : +{ + 80001f8e: 7179 addi sp,sp,-48 + 80001f90: f406 sd ra,40(sp) + 80001f92: f022 sd s0,32(sp) + 80001f94: ec26 sd s1,24(sp) + 80001f96: e84a sd s2,16(sp) + 80001f98: e44e sd s3,8(sp) + 80001f9a: e052 sd s4,0(sp) + 80001f9c: 1800 addi s0,sp,48 + 80001f9e: 892a mv s2,a0 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 80001fa0: 00010497 auipc s1,0x10 + 80001fa4: 74848493 addi s1,s1,1864 # 800126e8 + pp->parent = initproc; + 80001fa8: 00008a17 auipc s4,0x8 + 80001fac: 208a0a13 addi s4,s4,520 # 8000a1b0 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 80001fb0: 00016997 auipc s3,0x16 + 80001fb4: 13898993 addi s3,s3,312 # 800180e8 + 80001fb8: a029 j 80001fc2 + 80001fba: 16848493 addi s1,s1,360 + 80001fbe: 01348b63 beq s1,s3,80001fd4 + if(pp->parent == p){ + 80001fc2: 7c9c ld a5,56(s1) + 80001fc4: ff279be3 bne a5,s2,80001fba + pp->parent = initproc; + 80001fc8: 000a3503 ld a0,0(s4) + 80001fcc: fc88 sd a0,56(s1) + wakeup(initproc); + 80001fce: f57ff0ef jal 80001f24 + 80001fd2: b7e5 j 80001fba +} + 80001fd4: 70a2 ld ra,40(sp) + 80001fd6: 7402 ld s0,32(sp) + 80001fd8: 64e2 ld s1,24(sp) + 80001fda: 6942 ld s2,16(sp) + 80001fdc: 69a2 ld s3,8(sp) + 80001fde: 6a02 ld s4,0(sp) + 80001fe0: 6145 addi sp,sp,48 + 80001fe2: 8082 ret + +0000000080001fe4 : +{ + 80001fe4: 7179 addi sp,sp,-48 + 80001fe6: f406 sd ra,40(sp) + 80001fe8: f022 sd s0,32(sp) + 80001fea: ec26 sd s1,24(sp) + 80001fec: e84a sd s2,16(sp) + 80001fee: e44e sd s3,8(sp) + 80001ff0: e052 sd s4,0(sp) + 80001ff2: 1800 addi s0,sp,48 + 80001ff4: 8a2a mv s4,a0 + struct proc *p = myproc(); + 80001ff6: 8d9ff0ef jal 800018ce + 80001ffa: 89aa mv s3,a0 + if(p == initproc) + 80001ffc: 00008797 auipc a5,0x8 + 80002000: 1b47b783 ld a5,436(a5) # 8000a1b0 + 80002004: 0d050493 addi s1,a0,208 + 80002008: 15050913 addi s2,a0,336 + 8000200c: 00a79f63 bne a5,a0,8000202a + panic("init exiting"); + 80002010: 00005517 auipc a0,0x5 + 80002014: 1d050513 addi a0,a0,464 # 800071e0 + 80002018: fc8fe0ef jal 800007e0 + fileclose(f); + 8000201c: 7bd010ef jal 80003fd8 + p->ofile[fd] = 0; + 80002020: 0004b023 sd zero,0(s1) + for(int fd = 0; fd < NOFILE; fd++){ + 80002024: 04a1 addi s1,s1,8 + 80002026: 01248563 beq s1,s2,80002030 + if(p->ofile[fd]){ + 8000202a: 6088 ld a0,0(s1) + 8000202c: f965 bnez a0,8000201c + 8000202e: bfdd j 80002024 + begin_op(); + 80002030: 39d010ef jal 80003bcc + iput(p->cwd); + 80002034: 1509b503 ld a0,336(s3) + 80002038: 32c010ef jal 80003364 + end_op(); + 8000203c: 3fb010ef jal 80003c36 + p->cwd = 0; + 80002040: 1409b823 sd zero,336(s3) + acquire(&wait_lock); + 80002044: 00010497 auipc s1,0x10 + 80002048: 28c48493 addi s1,s1,652 # 800122d0 + 8000204c: 8526 mv a0,s1 + 8000204e: b81fe0ef jal 80000bce + reparent(p); + 80002052: 854e mv a0,s3 + 80002054: f3bff0ef jal 80001f8e + wakeup(p->parent); + 80002058: 0389b503 ld a0,56(s3) + 8000205c: ec9ff0ef jal 80001f24 + acquire(&p->lock); + 80002060: 854e mv a0,s3 + 80002062: b6dfe0ef jal 80000bce + p->xstate = status; + 80002066: 0349a623 sw s4,44(s3) + p->state = ZOMBIE; + 8000206a: 4795 li a5,5 + 8000206c: 00f9ac23 sw a5,24(s3) + release(&wait_lock); + 80002070: 8526 mv a0,s1 + 80002072: bf5fe0ef jal 80000c66 + sched(); + 80002076: d7dff0ef jal 80001df2 + panic("zombie exit"); + 8000207a: 00005517 auipc a0,0x5 + 8000207e: 17650513 addi a0,a0,374 # 800071f0 + 80002082: f5efe0ef jal 800007e0 + +0000000080002086 : +// 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 +kkill(int pid) +{ + 80002086: 7179 addi sp,sp,-48 + 80002088: f406 sd ra,40(sp) + 8000208a: f022 sd s0,32(sp) + 8000208c: ec26 sd s1,24(sp) + 8000208e: e84a sd s2,16(sp) + 80002090: e44e sd s3,8(sp) + 80002092: 1800 addi s0,sp,48 + 80002094: 892a mv s2,a0 + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++){ + 80002096: 00010497 auipc s1,0x10 + 8000209a: 65248493 addi s1,s1,1618 # 800126e8 + 8000209e: 00016997 auipc s3,0x16 + 800020a2: 04a98993 addi s3,s3,74 # 800180e8 + acquire(&p->lock); + 800020a6: 8526 mv a0,s1 + 800020a8: b27fe0ef jal 80000bce + if(p->pid == pid){ + 800020ac: 589c lw a5,48(s1) + 800020ae: 01278b63 beq a5,s2,800020c4 + p->state = RUNNABLE; + } + release(&p->lock); + return 0; + } + release(&p->lock); + 800020b2: 8526 mv a0,s1 + 800020b4: bb3fe0ef jal 80000c66 + for(p = proc; p < &proc[NPROC]; p++){ + 800020b8: 16848493 addi s1,s1,360 + 800020bc: ff3495e3 bne s1,s3,800020a6 + } + return -1; + 800020c0: 557d li a0,-1 + 800020c2: a819 j 800020d8 + p->killed = 1; + 800020c4: 4785 li a5,1 + 800020c6: d49c sw a5,40(s1) + if(p->state == SLEEPING){ + 800020c8: 4c98 lw a4,24(s1) + 800020ca: 4789 li a5,2 + 800020cc: 00f70d63 beq a4,a5,800020e6 + release(&p->lock); + 800020d0: 8526 mv a0,s1 + 800020d2: b95fe0ef jal 80000c66 + return 0; + 800020d6: 4501 li a0,0 +} + 800020d8: 70a2 ld ra,40(sp) + 800020da: 7402 ld s0,32(sp) + 800020dc: 64e2 ld s1,24(sp) + 800020de: 6942 ld s2,16(sp) + 800020e0: 69a2 ld s3,8(sp) + 800020e2: 6145 addi sp,sp,48 + 800020e4: 8082 ret + p->state = RUNNABLE; + 800020e6: 478d li a5,3 + 800020e8: cc9c sw a5,24(s1) + 800020ea: b7dd j 800020d0 + +00000000800020ec : + +void +setkilled(struct proc *p) +{ + 800020ec: 1101 addi sp,sp,-32 + 800020ee: ec06 sd ra,24(sp) + 800020f0: e822 sd s0,16(sp) + 800020f2: e426 sd s1,8(sp) + 800020f4: 1000 addi s0,sp,32 + 800020f6: 84aa mv s1,a0 + acquire(&p->lock); + 800020f8: ad7fe0ef jal 80000bce + p->killed = 1; + 800020fc: 4785 li a5,1 + 800020fe: d49c sw a5,40(s1) + release(&p->lock); + 80002100: 8526 mv a0,s1 + 80002102: b65fe0ef jal 80000c66 +} + 80002106: 60e2 ld ra,24(sp) + 80002108: 6442 ld s0,16(sp) + 8000210a: 64a2 ld s1,8(sp) + 8000210c: 6105 addi sp,sp,32 + 8000210e: 8082 ret + +0000000080002110 : + +int +killed(struct proc *p) +{ + 80002110: 1101 addi sp,sp,-32 + 80002112: ec06 sd ra,24(sp) + 80002114: e822 sd s0,16(sp) + 80002116: e426 sd s1,8(sp) + 80002118: e04a sd s2,0(sp) + 8000211a: 1000 addi s0,sp,32 + 8000211c: 84aa mv s1,a0 + int k; + + acquire(&p->lock); + 8000211e: ab1fe0ef jal 80000bce + k = p->killed; + 80002122: 0284a903 lw s2,40(s1) + release(&p->lock); + 80002126: 8526 mv a0,s1 + 80002128: b3ffe0ef jal 80000c66 + return k; +} + 8000212c: 854a mv a0,s2 + 8000212e: 60e2 ld ra,24(sp) + 80002130: 6442 ld s0,16(sp) + 80002132: 64a2 ld s1,8(sp) + 80002134: 6902 ld s2,0(sp) + 80002136: 6105 addi sp,sp,32 + 80002138: 8082 ret + +000000008000213a : +{ + 8000213a: 715d addi sp,sp,-80 + 8000213c: e486 sd ra,72(sp) + 8000213e: e0a2 sd s0,64(sp) + 80002140: fc26 sd s1,56(sp) + 80002142: f84a sd s2,48(sp) + 80002144: f44e sd s3,40(sp) + 80002146: f052 sd s4,32(sp) + 80002148: ec56 sd s5,24(sp) + 8000214a: e85a sd s6,16(sp) + 8000214c: e45e sd s7,8(sp) + 8000214e: e062 sd s8,0(sp) + 80002150: 0880 addi s0,sp,80 + 80002152: 8b2a mv s6,a0 + struct proc *p = myproc(); + 80002154: f7aff0ef jal 800018ce + 80002158: 892a mv s2,a0 + acquire(&wait_lock); + 8000215a: 00010517 auipc a0,0x10 + 8000215e: 17650513 addi a0,a0,374 # 800122d0 + 80002162: a6dfe0ef jal 80000bce + havekids = 0; + 80002166: 4b81 li s7,0 + if(pp->state == ZOMBIE){ + 80002168: 4a15 li s4,5 + havekids = 1; + 8000216a: 4a85 li s5,1 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 8000216c: 00016997 auipc s3,0x16 + 80002170: f7c98993 addi s3,s3,-132 # 800180e8 + sleep(p, &wait_lock); //DOC: wait-sleep + 80002174: 00010c17 auipc s8,0x10 + 80002178: 15cc0c13 addi s8,s8,348 # 800122d0 + 8000217c: a871 j 80002218 + pid = pp->pid; + 8000217e: 0304a983 lw s3,48(s1) + if(addr != 0 && copyout(p->pagetable, addr, (char *)&pp->xstate, + 80002182: 000b0c63 beqz s6,8000219a + 80002186: 4691 li a3,4 + 80002188: 02c48613 addi a2,s1,44 + 8000218c: 85da mv a1,s6 + 8000218e: 05093503 ld a0,80(s2) + 80002192: c50ff0ef jal 800015e2 + 80002196: 02054b63 bltz a0,800021cc + freeproc(pp); + 8000219a: 8526 mv a0,s1 + 8000219c: 903ff0ef jal 80001a9e + release(&pp->lock); + 800021a0: 8526 mv a0,s1 + 800021a2: ac5fe0ef jal 80000c66 + release(&wait_lock); + 800021a6: 00010517 auipc a0,0x10 + 800021aa: 12a50513 addi a0,a0,298 # 800122d0 + 800021ae: ab9fe0ef jal 80000c66 +} + 800021b2: 854e mv a0,s3 + 800021b4: 60a6 ld ra,72(sp) + 800021b6: 6406 ld s0,64(sp) + 800021b8: 74e2 ld s1,56(sp) + 800021ba: 7942 ld s2,48(sp) + 800021bc: 79a2 ld s3,40(sp) + 800021be: 7a02 ld s4,32(sp) + 800021c0: 6ae2 ld s5,24(sp) + 800021c2: 6b42 ld s6,16(sp) + 800021c4: 6ba2 ld s7,8(sp) + 800021c6: 6c02 ld s8,0(sp) + 800021c8: 6161 addi sp,sp,80 + 800021ca: 8082 ret + release(&pp->lock); + 800021cc: 8526 mv a0,s1 + 800021ce: a99fe0ef jal 80000c66 + release(&wait_lock); + 800021d2: 00010517 auipc a0,0x10 + 800021d6: 0fe50513 addi a0,a0,254 # 800122d0 + 800021da: a8dfe0ef jal 80000c66 + return -1; + 800021de: 59fd li s3,-1 + 800021e0: bfc9 j 800021b2 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 800021e2: 16848493 addi s1,s1,360 + 800021e6: 03348063 beq s1,s3,80002206 + if(pp->parent == p){ + 800021ea: 7c9c ld a5,56(s1) + 800021ec: ff279be3 bne a5,s2,800021e2 + acquire(&pp->lock); + 800021f0: 8526 mv a0,s1 + 800021f2: 9ddfe0ef jal 80000bce + if(pp->state == ZOMBIE){ + 800021f6: 4c9c lw a5,24(s1) + 800021f8: f94783e3 beq a5,s4,8000217e + release(&pp->lock); + 800021fc: 8526 mv a0,s1 + 800021fe: a69fe0ef jal 80000c66 + havekids = 1; + 80002202: 8756 mv a4,s5 + 80002204: bff9 j 800021e2 + if(!havekids || killed(p)){ + 80002206: cf19 beqz a4,80002224 + 80002208: 854a mv a0,s2 + 8000220a: f07ff0ef jal 80002110 + 8000220e: e919 bnez a0,80002224 + sleep(p, &wait_lock); //DOC: wait-sleep + 80002210: 85e2 mv a1,s8 + 80002212: 854a mv a0,s2 + 80002214: cc5ff0ef jal 80001ed8 + havekids = 0; + 80002218: 875e mv a4,s7 + for(pp = proc; pp < &proc[NPROC]; pp++){ + 8000221a: 00010497 auipc s1,0x10 + 8000221e: 4ce48493 addi s1,s1,1230 # 800126e8 + 80002222: b7e1 j 800021ea + release(&wait_lock); + 80002224: 00010517 auipc a0,0x10 + 80002228: 0ac50513 addi a0,a0,172 # 800122d0 + 8000222c: a3bfe0ef jal 80000c66 + return -1; + 80002230: 59fd li s3,-1 + 80002232: b741 j 800021b2 + +0000000080002234 : +// 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) +{ + 80002234: 7179 addi sp,sp,-48 + 80002236: f406 sd ra,40(sp) + 80002238: f022 sd s0,32(sp) + 8000223a: ec26 sd s1,24(sp) + 8000223c: e84a sd s2,16(sp) + 8000223e: e44e sd s3,8(sp) + 80002240: e052 sd s4,0(sp) + 80002242: 1800 addi s0,sp,48 + 80002244: 84aa mv s1,a0 + 80002246: 892e mv s2,a1 + 80002248: 89b2 mv s3,a2 + 8000224a: 8a36 mv s4,a3 + struct proc *p = myproc(); + 8000224c: e82ff0ef jal 800018ce + if(user_dst){ + 80002250: cc99 beqz s1,8000226e + return copyout(p->pagetable, dst, src, len); + 80002252: 86d2 mv a3,s4 + 80002254: 864e mv a2,s3 + 80002256: 85ca mv a1,s2 + 80002258: 6928 ld a0,80(a0) + 8000225a: b88ff0ef jal 800015e2 + } else { + memmove((char *)dst, src, len); + return 0; + } +} + 8000225e: 70a2 ld ra,40(sp) + 80002260: 7402 ld s0,32(sp) + 80002262: 64e2 ld s1,24(sp) + 80002264: 6942 ld s2,16(sp) + 80002266: 69a2 ld s3,8(sp) + 80002268: 6a02 ld s4,0(sp) + 8000226a: 6145 addi sp,sp,48 + 8000226c: 8082 ret + memmove((char *)dst, src, len); + 8000226e: 000a061b sext.w a2,s4 + 80002272: 85ce mv a1,s3 + 80002274: 854a mv a0,s2 + 80002276: a89fe0ef jal 80000cfe + return 0; + 8000227a: 8526 mv a0,s1 + 8000227c: b7cd j 8000225e + +000000008000227e : +// 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) +{ + 8000227e: 7179 addi sp,sp,-48 + 80002280: f406 sd ra,40(sp) + 80002282: f022 sd s0,32(sp) + 80002284: ec26 sd s1,24(sp) + 80002286: e84a sd s2,16(sp) + 80002288: e44e sd s3,8(sp) + 8000228a: e052 sd s4,0(sp) + 8000228c: 1800 addi s0,sp,48 + 8000228e: 892a mv s2,a0 + 80002290: 84ae mv s1,a1 + 80002292: 89b2 mv s3,a2 + 80002294: 8a36 mv s4,a3 + struct proc *p = myproc(); + 80002296: e38ff0ef jal 800018ce + if(user_src){ + 8000229a: cc99 beqz s1,800022b8 + return copyin(p->pagetable, dst, src, len); + 8000229c: 86d2 mv a3,s4 + 8000229e: 864e mv a2,s3 + 800022a0: 85ca mv a1,s2 + 800022a2: 6928 ld a0,80(a0) + 800022a4: c22ff0ef jal 800016c6 + } else { + memmove(dst, (char*)src, len); + return 0; + } +} + 800022a8: 70a2 ld ra,40(sp) + 800022aa: 7402 ld s0,32(sp) + 800022ac: 64e2 ld s1,24(sp) + 800022ae: 6942 ld s2,16(sp) + 800022b0: 69a2 ld s3,8(sp) + 800022b2: 6a02 ld s4,0(sp) + 800022b4: 6145 addi sp,sp,48 + 800022b6: 8082 ret + memmove(dst, (char*)src, len); + 800022b8: 000a061b sext.w a2,s4 + 800022bc: 85ce mv a1,s3 + 800022be: 854a mv a0,s2 + 800022c0: a3ffe0ef jal 80000cfe + return 0; + 800022c4: 8526 mv a0,s1 + 800022c6: b7cd j 800022a8 + +00000000800022c8 : +// 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) +{ + 800022c8: 715d addi sp,sp,-80 + 800022ca: e486 sd ra,72(sp) + 800022cc: e0a2 sd s0,64(sp) + 800022ce: fc26 sd s1,56(sp) + 800022d0: f84a sd s2,48(sp) + 800022d2: f44e sd s3,40(sp) + 800022d4: f052 sd s4,32(sp) + 800022d6: ec56 sd s5,24(sp) + 800022d8: e85a sd s6,16(sp) + 800022da: e45e sd s7,8(sp) + 800022dc: 0880 addi s0,sp,80 + [ZOMBIE] "zombie" + }; + struct proc *p; + char *state; + + printf("\n"); + 800022de: 00005517 auipc a0,0x5 + 800022e2: d9a50513 addi a0,a0,-614 # 80007078 + 800022e6: a14fe0ef jal 800004fa + for(p = proc; p < &proc[NPROC]; p++){ + 800022ea: 00010497 auipc s1,0x10 + 800022ee: 55648493 addi s1,s1,1366 # 80012840 + 800022f2: 00016917 auipc s2,0x16 + 800022f6: f4e90913 addi s2,s2,-178 # 80018240 + if(p->state == UNUSED) + continue; + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + 800022fa: 4b15 li s6,5 + state = states[p->state]; + else + state = "???"; + 800022fc: 00005997 auipc s3,0x5 + 80002300: f0498993 addi s3,s3,-252 # 80007200 + printf("%d %s %s", p->pid, state, p->name); + 80002304: 00005a97 auipc s5,0x5 + 80002308: f04a8a93 addi s5,s5,-252 # 80007208 + printf("\n"); + 8000230c: 00005a17 auipc s4,0x5 + 80002310: d6ca0a13 addi s4,s4,-660 # 80007078 + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + 80002314: 00005b97 auipc s7,0x5 + 80002318: 414b8b93 addi s7,s7,1044 # 80007728 + 8000231c: a829 j 80002336 + printf("%d %s %s", p->pid, state, p->name); + 8000231e: ed86a583 lw a1,-296(a3) + 80002322: 8556 mv a0,s5 + 80002324: 9d6fe0ef jal 800004fa + printf("\n"); + 80002328: 8552 mv a0,s4 + 8000232a: 9d0fe0ef jal 800004fa + for(p = proc; p < &proc[NPROC]; p++){ + 8000232e: 16848493 addi s1,s1,360 + 80002332: 03248263 beq s1,s2,80002356 + if(p->state == UNUSED) + 80002336: 86a6 mv a3,s1 + 80002338: ec04a783 lw a5,-320(s1) + 8000233c: dbed beqz a5,8000232e + state = "???"; + 8000233e: 864e mv a2,s3 + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + 80002340: fcfb6fe3 bltu s6,a5,8000231e + 80002344: 02079713 slli a4,a5,0x20 + 80002348: 01d75793 srli a5,a4,0x1d + 8000234c: 97de add a5,a5,s7 + 8000234e: 6390 ld a2,0(a5) + 80002350: f679 bnez a2,8000231e + state = "???"; + 80002352: 864e mv a2,s3 + 80002354: b7e9 j 8000231e + } +} + 80002356: 60a6 ld ra,72(sp) + 80002358: 6406 ld s0,64(sp) + 8000235a: 74e2 ld s1,56(sp) + 8000235c: 7942 ld s2,48(sp) + 8000235e: 79a2 ld s3,40(sp) + 80002360: 7a02 ld s4,32(sp) + 80002362: 6ae2 ld s5,24(sp) + 80002364: 6b42 ld s6,16(sp) + 80002366: 6ba2 ld s7,8(sp) + 80002368: 6161 addi sp,sp,80 + 8000236a: 8082 ret + +000000008000236c : +# Save current registers in old. Load from new. + + +.globl swtch +swtch: + sd ra, 0(a0) + 8000236c: 00153023 sd ra,0(a0) + sd sp, 8(a0) + 80002370: 00253423 sd sp,8(a0) + sd s0, 16(a0) + 80002374: e900 sd s0,16(a0) + sd s1, 24(a0) + 80002376: ed04 sd s1,24(a0) + sd s2, 32(a0) + 80002378: 03253023 sd s2,32(a0) + sd s3, 40(a0) + 8000237c: 03353423 sd s3,40(a0) + sd s4, 48(a0) + 80002380: 03453823 sd s4,48(a0) + sd s5, 56(a0) + 80002384: 03553c23 sd s5,56(a0) + sd s6, 64(a0) + 80002388: 05653023 sd s6,64(a0) + sd s7, 72(a0) + 8000238c: 05753423 sd s7,72(a0) + sd s8, 80(a0) + 80002390: 05853823 sd s8,80(a0) + sd s9, 88(a0) + 80002394: 05953c23 sd s9,88(a0) + sd s10, 96(a0) + 80002398: 07a53023 sd s10,96(a0) + sd s11, 104(a0) + 8000239c: 07b53423 sd s11,104(a0) + + ld ra, 0(a1) + 800023a0: 0005b083 ld ra,0(a1) + ld sp, 8(a1) + 800023a4: 0085b103 ld sp,8(a1) + ld s0, 16(a1) + 800023a8: 6980 ld s0,16(a1) + ld s1, 24(a1) + 800023aa: 6d84 ld s1,24(a1) + ld s2, 32(a1) + 800023ac: 0205b903 ld s2,32(a1) + ld s3, 40(a1) + 800023b0: 0285b983 ld s3,40(a1) + ld s4, 48(a1) + 800023b4: 0305ba03 ld s4,48(a1) + ld s5, 56(a1) + 800023b8: 0385ba83 ld s5,56(a1) + ld s6, 64(a1) + 800023bc: 0405bb03 ld s6,64(a1) + ld s7, 72(a1) + 800023c0: 0485bb83 ld s7,72(a1) + ld s8, 80(a1) + 800023c4: 0505bc03 ld s8,80(a1) + ld s9, 88(a1) + 800023c8: 0585bc83 ld s9,88(a1) + ld s10, 96(a1) + 800023cc: 0605bd03 ld s10,96(a1) + ld s11, 104(a1) + 800023d0: 0685bd83 ld s11,104(a1) + + ret + 800023d4: 8082 ret + +00000000800023d6 : + +extern int devintr(); + +void +trapinit(void) +{ + 800023d6: 1141 addi sp,sp,-16 + 800023d8: e406 sd ra,8(sp) + 800023da: e022 sd s0,0(sp) + 800023dc: 0800 addi s0,sp,16 + initlock(&tickslock, "time"); + 800023de: 00005597 auipc a1,0x5 + 800023e2: e6a58593 addi a1,a1,-406 # 80007248 + 800023e6: 00016517 auipc a0,0x16 + 800023ea: d0250513 addi a0,a0,-766 # 800180e8 + 800023ee: f60fe0ef jal 80000b4e +} + 800023f2: 60a2 ld ra,8(sp) + 800023f4: 6402 ld s0,0(sp) + 800023f6: 0141 addi sp,sp,16 + 800023f8: 8082 ret + +00000000800023fa : + +// set up to take exceptions and traps while in the kernel. +void +trapinithart(void) +{ + 800023fa: 1141 addi sp,sp,-16 + 800023fc: e422 sd s0,8(sp) + 800023fe: 0800 addi s0,sp,16 + asm volatile("csrw stvec, %0" : : "r" (x)); + 80002400: 00003797 auipc a5,0x3 + 80002404: f5078793 addi a5,a5,-176 # 80005350 + 80002408: 10579073 csrw stvec,a5 + w_stvec((uint64)kernelvec); +} + 8000240c: 6422 ld s0,8(sp) + 8000240e: 0141 addi sp,sp,16 + 80002410: 8082 ret + +0000000080002412 : +// +// set up trapframe and control registers for a return to user space +// +void +prepare_return(void) +{ + 80002412: 1141 addi sp,sp,-16 + 80002414: e406 sd ra,8(sp) + 80002416: e022 sd s0,0(sp) + 80002418: 0800 addi s0,sp,16 + struct proc *p = myproc(); + 8000241a: cb4ff0ef jal 800018ce + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 8000241e: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() & ~SSTATUS_SIE); + 80002422: 9bf5 andi a5,a5,-3 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80002424: 10079073 csrw sstatus,a5 + // kerneltrap() to usertrap(). because a trap from kernel + // code to usertrap would be a disaster, turn off interrupts. + intr_off(); + + // send syscalls, interrupts, and exceptions to uservec in trampoline.S + uint64 trampoline_uservec = TRAMPOLINE + (uservec - trampoline); + 80002428: 04000737 lui a4,0x4000 + 8000242c: 177d addi a4,a4,-1 # 3ffffff <_entry-0x7c000001> + 8000242e: 0732 slli a4,a4,0xc + 80002430: 00004797 auipc a5,0x4 + 80002434: bd078793 addi a5,a5,-1072 # 80006000 <_trampoline> + 80002438: 00004697 auipc a3,0x4 + 8000243c: bc868693 addi a3,a3,-1080 # 80006000 <_trampoline> + 80002440: 8f95 sub a5,a5,a3 + 80002442: 97ba add a5,a5,a4 + asm volatile("csrw stvec, %0" : : "r" (x)); + 80002444: 10579073 csrw stvec,a5 + w_stvec(trampoline_uservec); + + // set up trapframe values that uservec will need when + // the process next traps into the kernel. + p->trapframe->kernel_satp = r_satp(); // kernel page table + 80002448: 6d3c ld a5,88(a0) + asm volatile("csrr %0, satp" : "=r" (x) ); + 8000244a: 18002773 csrr a4,satp + 8000244e: e398 sd a4,0(a5) + p->trapframe->kernel_sp = p->kstack + PGSIZE; // process's kernel stack + 80002450: 6d38 ld a4,88(a0) + 80002452: 613c ld a5,64(a0) + 80002454: 6685 lui a3,0x1 + 80002456: 97b6 add a5,a5,a3 + 80002458: e71c sd a5,8(a4) + p->trapframe->kernel_trap = (uint64)usertrap; + 8000245a: 6d3c ld a5,88(a0) + 8000245c: 00000717 auipc a4,0x0 + 80002460: 0f870713 addi a4,a4,248 # 80002554 + 80002464: eb98 sd a4,16(a5) + p->trapframe->kernel_hartid = r_tp(); // hartid for cpuid() + 80002466: 6d3c ld a5,88(a0) + asm volatile("mv %0, tp" : "=r" (x) ); + 80002468: 8712 mv a4,tp + 8000246a: f398 sd a4,32(a5) + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 8000246c: 100027f3 csrr a5,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 + 80002470: eff7f793 andi a5,a5,-257 + x |= SSTATUS_SPIE; // enable interrupts in user mode + 80002474: 0207e793 ori a5,a5,32 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 80002478: 10079073 csrw sstatus,a5 + w_sstatus(x); + + // set S Exception Program Counter to the saved user pc. + w_sepc(p->trapframe->epc); + 8000247c: 6d3c ld a5,88(a0) + asm volatile("csrw sepc, %0" : : "r" (x)); + 8000247e: 6f9c ld a5,24(a5) + 80002480: 14179073 csrw sepc,a5 +} + 80002484: 60a2 ld ra,8(sp) + 80002486: 6402 ld s0,0(sp) + 80002488: 0141 addi sp,sp,16 + 8000248a: 8082 ret + +000000008000248c : + w_sstatus(sstatus); +} + +void +clockintr() +{ + 8000248c: 1101 addi sp,sp,-32 + 8000248e: ec06 sd ra,24(sp) + 80002490: e822 sd s0,16(sp) + 80002492: 1000 addi s0,sp,32 + if(cpuid() == 0){ + 80002494: c0eff0ef jal 800018a2 + 80002498: cd11 beqz a0,800024b4 + asm volatile("csrr %0, time" : "=r" (x) ); + 8000249a: c01027f3 rdtime a5 + } + + // ask for the next timer interrupt. this also clears + // the interrupt request. 1000000 is about a tenth + // of a second. + w_stimecmp(r_time() + 1000000); + 8000249e: 000f4737 lui a4,0xf4 + 800024a2: 24070713 addi a4,a4,576 # f4240 <_entry-0x7ff0bdc0> + 800024a6: 97ba add a5,a5,a4 + asm volatile("csrw 0x14d, %0" : : "r" (x)); + 800024a8: 14d79073 csrw stimecmp,a5 +} + 800024ac: 60e2 ld ra,24(sp) + 800024ae: 6442 ld s0,16(sp) + 800024b0: 6105 addi sp,sp,32 + 800024b2: 8082 ret + 800024b4: e426 sd s1,8(sp) + acquire(&tickslock); + 800024b6: 00016497 auipc s1,0x16 + 800024ba: c3248493 addi s1,s1,-974 # 800180e8 + 800024be: 8526 mv a0,s1 + 800024c0: f0efe0ef jal 80000bce + ticks++; + 800024c4: 00008517 auipc a0,0x8 + 800024c8: cf450513 addi a0,a0,-780 # 8000a1b8 + 800024cc: 411c lw a5,0(a0) + 800024ce: 2785 addiw a5,a5,1 + 800024d0: c11c sw a5,0(a0) + wakeup(&ticks); + 800024d2: a53ff0ef jal 80001f24 + release(&tickslock); + 800024d6: 8526 mv a0,s1 + 800024d8: f8efe0ef jal 80000c66 + 800024dc: 64a2 ld s1,8(sp) + 800024de: bf75 j 8000249a + +00000000800024e0 : +// returns 2 if timer interrupt, +// 1 if other device, +// 0 if not recognized. +int +devintr() +{ + 800024e0: 1101 addi sp,sp,-32 + 800024e2: ec06 sd ra,24(sp) + 800024e4: e822 sd s0,16(sp) + 800024e6: 1000 addi s0,sp,32 + asm volatile("csrr %0, scause" : "=r" (x) ); + 800024e8: 14202773 csrr a4,scause + uint64 scause = r_scause(); + + if(scause == 0x8000000000000009L){ + 800024ec: 57fd li a5,-1 + 800024ee: 17fe slli a5,a5,0x3f + 800024f0: 07a5 addi a5,a5,9 + 800024f2: 00f70c63 beq a4,a5,8000250a + // now allowed to interrupt again. + if(irq) + plic_complete(irq); + + return 1; + } else if(scause == 0x8000000000000005L){ + 800024f6: 57fd li a5,-1 + 800024f8: 17fe slli a5,a5,0x3f + 800024fa: 0795 addi a5,a5,5 + // timer interrupt. + clockintr(); + return 2; + } else { + return 0; + 800024fc: 4501 li a0,0 + } else if(scause == 0x8000000000000005L){ + 800024fe: 04f70763 beq a4,a5,8000254c + } +} + 80002502: 60e2 ld ra,24(sp) + 80002504: 6442 ld s0,16(sp) + 80002506: 6105 addi sp,sp,32 + 80002508: 8082 ret + 8000250a: e426 sd s1,8(sp) + int irq = plic_claim(); + 8000250c: 6f1020ef jal 800053fc + 80002510: 84aa mv s1,a0 + if(irq == UART0_IRQ){ + 80002512: 47a9 li a5,10 + 80002514: 00f50963 beq a0,a5,80002526 + } else if(irq == VIRTIO0_IRQ){ + 80002518: 4785 li a5,1 + 8000251a: 00f50963 beq a0,a5,8000252c + return 1; + 8000251e: 4505 li a0,1 + } else if(irq){ + 80002520: e889 bnez s1,80002532 + 80002522: 64a2 ld s1,8(sp) + 80002524: bff9 j 80002502 + uartintr(); + 80002526: c8afe0ef jal 800009b0 + if(irq) + 8000252a: a819 j 80002540 + virtio_disk_intr(); + 8000252c: 396030ef jal 800058c2 + if(irq) + 80002530: a801 j 80002540 + printf("unexpected interrupt irq=%d\n", irq); + 80002532: 85a6 mv a1,s1 + 80002534: 00005517 auipc a0,0x5 + 80002538: d1c50513 addi a0,a0,-740 # 80007250 + 8000253c: fbffd0ef jal 800004fa + plic_complete(irq); + 80002540: 8526 mv a0,s1 + 80002542: 6db020ef jal 8000541c + return 1; + 80002546: 4505 li a0,1 + 80002548: 64a2 ld s1,8(sp) + 8000254a: bf65 j 80002502 + clockintr(); + 8000254c: f41ff0ef jal 8000248c + return 2; + 80002550: 4509 li a0,2 + 80002552: bf45 j 80002502 + +0000000080002554 : +{ + 80002554: 1101 addi sp,sp,-32 + 80002556: ec06 sd ra,24(sp) + 80002558: e822 sd s0,16(sp) + 8000255a: e426 sd s1,8(sp) + 8000255c: e04a sd s2,0(sp) + 8000255e: 1000 addi s0,sp,32 + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80002560: 100027f3 csrr a5,sstatus + if((r_sstatus() & SSTATUS_SPP) != 0) + 80002564: 1007f793 andi a5,a5,256 + 80002568: eba5 bnez a5,800025d8 + asm volatile("csrw stvec, %0" : : "r" (x)); + 8000256a: 00003797 auipc a5,0x3 + 8000256e: de678793 addi a5,a5,-538 # 80005350 + 80002572: 10579073 csrw stvec,a5 + struct proc *p = myproc(); + 80002576: b58ff0ef jal 800018ce + 8000257a: 84aa mv s1,a0 + p->trapframe->epc = r_sepc(); + 8000257c: 6d3c ld a5,88(a0) + asm volatile("csrr %0, sepc" : "=r" (x) ); + 8000257e: 14102773 csrr a4,sepc + 80002582: ef98 sd a4,24(a5) + asm volatile("csrr %0, scause" : "=r" (x) ); + 80002584: 14202773 csrr a4,scause + if(r_scause() == 8){ + 80002588: 47a1 li a5,8 + 8000258a: 04f70d63 beq a4,a5,800025e4 + } else if((which_dev = devintr()) != 0){ + 8000258e: f53ff0ef jal 800024e0 + 80002592: 892a mv s2,a0 + 80002594: e945 bnez a0,80002644 + 80002596: 14202773 csrr a4,scause + } else if((r_scause() == 15 || r_scause() == 13) && + 8000259a: 47bd li a5,15 + 8000259c: 08f70863 beq a4,a5,8000262c + 800025a0: 14202773 csrr a4,scause + 800025a4: 47b5 li a5,13 + 800025a6: 08f70363 beq a4,a5,8000262c + 800025aa: 142025f3 csrr a1,scause + printf("usertrap(): unexpected scause 0x%lx pid=%d\n", r_scause(), p->pid); + 800025ae: 5890 lw a2,48(s1) + 800025b0: 00005517 auipc a0,0x5 + 800025b4: ce050513 addi a0,a0,-800 # 80007290 + 800025b8: f43fd0ef jal 800004fa + asm volatile("csrr %0, sepc" : "=r" (x) ); + 800025bc: 141025f3 csrr a1,sepc + asm volatile("csrr %0, stval" : "=r" (x) ); + 800025c0: 14302673 csrr a2,stval + printf(" sepc=0x%lx stval=0x%lx\n", r_sepc(), r_stval()); + 800025c4: 00005517 auipc a0,0x5 + 800025c8: cfc50513 addi a0,a0,-772 # 800072c0 + 800025cc: f2ffd0ef jal 800004fa + setkilled(p); + 800025d0: 8526 mv a0,s1 + 800025d2: b1bff0ef jal 800020ec + 800025d6: a035 j 80002602 + panic("usertrap: not from user mode"); + 800025d8: 00005517 auipc a0,0x5 + 800025dc: c9850513 addi a0,a0,-872 # 80007270 + 800025e0: a00fe0ef jal 800007e0 + if(killed(p)) + 800025e4: b2dff0ef jal 80002110 + 800025e8: ed15 bnez a0,80002624 + p->trapframe->epc += 4; + 800025ea: 6cb8 ld a4,88(s1) + 800025ec: 6f1c ld a5,24(a4) + 800025ee: 0791 addi a5,a5,4 + 800025f0: ef1c sd a5,24(a4) + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 800025f2: 100027f3 csrr a5,sstatus + w_sstatus(r_sstatus() | SSTATUS_SIE); + 800025f6: 0027e793 ori a5,a5,2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 800025fa: 10079073 csrw sstatus,a5 + syscall(); + 800025fe: 246000ef jal 80002844 + if(killed(p)) + 80002602: 8526 mv a0,s1 + 80002604: b0dff0ef jal 80002110 + 80002608: e139 bnez a0,8000264e + prepare_return(); + 8000260a: e09ff0ef jal 80002412 + uint64 satp = MAKE_SATP(p->pagetable); + 8000260e: 68a8 ld a0,80(s1) + 80002610: 8131 srli a0,a0,0xc + 80002612: 57fd li a5,-1 + 80002614: 17fe slli a5,a5,0x3f + 80002616: 8d5d or a0,a0,a5 +} + 80002618: 60e2 ld ra,24(sp) + 8000261a: 6442 ld s0,16(sp) + 8000261c: 64a2 ld s1,8(sp) + 8000261e: 6902 ld s2,0(sp) + 80002620: 6105 addi sp,sp,32 + 80002622: 8082 ret + kexit(-1); + 80002624: 557d li a0,-1 + 80002626: 9bfff0ef jal 80001fe4 + 8000262a: b7c1 j 800025ea + asm volatile("csrr %0, stval" : "=r" (x) ); + 8000262c: 143025f3 csrr a1,stval + asm volatile("csrr %0, scause" : "=r" (x) ); + 80002630: 14202673 csrr a2,scause + vmfault(p->pagetable, r_stval(), (r_scause() == 13)? 1 : 0) != 0) { + 80002634: 164d addi a2,a2,-13 # ff3 <_entry-0x7ffff00d> + 80002636: 00163613 seqz a2,a2 + 8000263a: 68a8 ld a0,80(s1) + 8000263c: f25fe0ef jal 80001560 + } else if((r_scause() == 15 || r_scause() == 13) && + 80002640: f169 bnez a0,80002602 + 80002642: b7a5 j 800025aa + if(killed(p)) + 80002644: 8526 mv a0,s1 + 80002646: acbff0ef jal 80002110 + 8000264a: c511 beqz a0,80002656 + 8000264c: a011 j 80002650 + 8000264e: 4901 li s2,0 + kexit(-1); + 80002650: 557d li a0,-1 + 80002652: 993ff0ef jal 80001fe4 + if(which_dev == 2) + 80002656: 4789 li a5,2 + 80002658: faf919e3 bne s2,a5,8000260a + yield(); + 8000265c: 851ff0ef jal 80001eac + 80002660: b76d j 8000260a + +0000000080002662 : +{ + 80002662: 7179 addi sp,sp,-48 + 80002664: f406 sd ra,40(sp) + 80002666: f022 sd s0,32(sp) + 80002668: ec26 sd s1,24(sp) + 8000266a: e84a sd s2,16(sp) + 8000266c: e44e sd s3,8(sp) + 8000266e: 1800 addi s0,sp,48 + asm volatile("csrr %0, sepc" : "=r" (x) ); + 80002670: 14102973 csrr s2,sepc + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80002674: 100024f3 csrr s1,sstatus + asm volatile("csrr %0, scause" : "=r" (x) ); + 80002678: 142029f3 csrr s3,scause + if((sstatus & SSTATUS_SPP) == 0) + 8000267c: 1004f793 andi a5,s1,256 + 80002680: c795 beqz a5,800026ac + asm volatile("csrr %0, sstatus" : "=r" (x) ); + 80002682: 100027f3 csrr a5,sstatus + return (x & SSTATUS_SIE) != 0; + 80002686: 8b89 andi a5,a5,2 + if(intr_get() != 0) + 80002688: eb85 bnez a5,800026b8 + if((which_dev = devintr()) == 0){ + 8000268a: e57ff0ef jal 800024e0 + 8000268e: c91d beqz a0,800026c4 + if(which_dev == 2 && myproc() != 0) + 80002690: 4789 li a5,2 + 80002692: 04f50a63 beq a0,a5,800026e6 + asm volatile("csrw sepc, %0" : : "r" (x)); + 80002696: 14191073 csrw sepc,s2 + asm volatile("csrw sstatus, %0" : : "r" (x)); + 8000269a: 10049073 csrw sstatus,s1 +} + 8000269e: 70a2 ld ra,40(sp) + 800026a0: 7402 ld s0,32(sp) + 800026a2: 64e2 ld s1,24(sp) + 800026a4: 6942 ld s2,16(sp) + 800026a6: 69a2 ld s3,8(sp) + 800026a8: 6145 addi sp,sp,48 + 800026aa: 8082 ret + panic("kerneltrap: not from supervisor mode"); + 800026ac: 00005517 auipc a0,0x5 + 800026b0: c3c50513 addi a0,a0,-964 # 800072e8 + 800026b4: 92cfe0ef jal 800007e0 + panic("kerneltrap: interrupts enabled"); + 800026b8: 00005517 auipc a0,0x5 + 800026bc: c5850513 addi a0,a0,-936 # 80007310 + 800026c0: 920fe0ef jal 800007e0 + asm volatile("csrr %0, sepc" : "=r" (x) ); + 800026c4: 14102673 csrr a2,sepc + asm volatile("csrr %0, stval" : "=r" (x) ); + 800026c8: 143026f3 csrr a3,stval + printf("scause=0x%lx sepc=0x%lx stval=0x%lx\n", scause, r_sepc(), r_stval()); + 800026cc: 85ce mv a1,s3 + 800026ce: 00005517 auipc a0,0x5 + 800026d2: c6250513 addi a0,a0,-926 # 80007330 + 800026d6: e25fd0ef jal 800004fa + panic("kerneltrap"); + 800026da: 00005517 auipc a0,0x5 + 800026de: c7e50513 addi a0,a0,-898 # 80007358 + 800026e2: 8fefe0ef jal 800007e0 + if(which_dev == 2 && myproc() != 0) + 800026e6: 9e8ff0ef jal 800018ce + 800026ea: d555 beqz a0,80002696 + yield(); + 800026ec: fc0ff0ef jal 80001eac + 800026f0: b75d j 80002696 + +00000000800026f2 : + return strlen(buf); +} + +static uint64 +argraw(int n) +{ + 800026f2: 1101 addi sp,sp,-32 + 800026f4: ec06 sd ra,24(sp) + 800026f6: e822 sd s0,16(sp) + 800026f8: e426 sd s1,8(sp) + 800026fa: 1000 addi s0,sp,32 + 800026fc: 84aa mv s1,a0 + struct proc *p = myproc(); + 800026fe: 9d0ff0ef jal 800018ce + switch (n) { + 80002702: 4795 li a5,5 + 80002704: 0497e163 bltu a5,s1,80002746 + 80002708: 048a slli s1,s1,0x2 + 8000270a: 00005717 auipc a4,0x5 + 8000270e: 04e70713 addi a4,a4,78 # 80007758 + 80002712: 94ba add s1,s1,a4 + 80002714: 409c lw a5,0(s1) + 80002716: 97ba add a5,a5,a4 + 80002718: 8782 jr a5 + case 0: + return p->trapframe->a0; + 8000271a: 6d3c ld a5,88(a0) + 8000271c: 7ba8 ld a0,112(a5) + case 5: + return p->trapframe->a5; + } + panic("argraw"); + return -1; +} + 8000271e: 60e2 ld ra,24(sp) + 80002720: 6442 ld s0,16(sp) + 80002722: 64a2 ld s1,8(sp) + 80002724: 6105 addi sp,sp,32 + 80002726: 8082 ret + return p->trapframe->a1; + 80002728: 6d3c ld a5,88(a0) + 8000272a: 7fa8 ld a0,120(a5) + 8000272c: bfcd j 8000271e + return p->trapframe->a2; + 8000272e: 6d3c ld a5,88(a0) + 80002730: 63c8 ld a0,128(a5) + 80002732: b7f5 j 8000271e + return p->trapframe->a3; + 80002734: 6d3c ld a5,88(a0) + 80002736: 67c8 ld a0,136(a5) + 80002738: b7dd j 8000271e + return p->trapframe->a4; + 8000273a: 6d3c ld a5,88(a0) + 8000273c: 6bc8 ld a0,144(a5) + 8000273e: b7c5 j 8000271e + return p->trapframe->a5; + 80002740: 6d3c ld a5,88(a0) + 80002742: 6fc8 ld a0,152(a5) + 80002744: bfe9 j 8000271e + panic("argraw"); + 80002746: 00005517 auipc a0,0x5 + 8000274a: c2250513 addi a0,a0,-990 # 80007368 + 8000274e: 892fe0ef jal 800007e0 + +0000000080002752 : +{ + 80002752: 1101 addi sp,sp,-32 + 80002754: ec06 sd ra,24(sp) + 80002756: e822 sd s0,16(sp) + 80002758: e426 sd s1,8(sp) + 8000275a: e04a sd s2,0(sp) + 8000275c: 1000 addi s0,sp,32 + 8000275e: 84aa mv s1,a0 + 80002760: 892e mv s2,a1 + struct proc *p = myproc(); + 80002762: 96cff0ef jal 800018ce + if(addr >= p->sz || addr+sizeof(uint64) > p->sz) // both tests needed, in case of overflow + 80002766: 653c ld a5,72(a0) + 80002768: 02f4f663 bgeu s1,a5,80002794 + 8000276c: 00848713 addi a4,s1,8 + 80002770: 02e7e463 bltu a5,a4,80002798 + if(copyin(p->pagetable, (char *)ip, addr, sizeof(*ip)) != 0) + 80002774: 46a1 li a3,8 + 80002776: 8626 mv a2,s1 + 80002778: 85ca mv a1,s2 + 8000277a: 6928 ld a0,80(a0) + 8000277c: f4bfe0ef jal 800016c6 + 80002780: 00a03533 snez a0,a0 + 80002784: 40a00533 neg a0,a0 +} + 80002788: 60e2 ld ra,24(sp) + 8000278a: 6442 ld s0,16(sp) + 8000278c: 64a2 ld s1,8(sp) + 8000278e: 6902 ld s2,0(sp) + 80002790: 6105 addi sp,sp,32 + 80002792: 8082 ret + return -1; + 80002794: 557d li a0,-1 + 80002796: bfcd j 80002788 + 80002798: 557d li a0,-1 + 8000279a: b7fd j 80002788 + +000000008000279c : +{ + 8000279c: 7179 addi sp,sp,-48 + 8000279e: f406 sd ra,40(sp) + 800027a0: f022 sd s0,32(sp) + 800027a2: ec26 sd s1,24(sp) + 800027a4: e84a sd s2,16(sp) + 800027a6: e44e sd s3,8(sp) + 800027a8: 1800 addi s0,sp,48 + 800027aa: 892a mv s2,a0 + 800027ac: 84ae mv s1,a1 + 800027ae: 89b2 mv s3,a2 + struct proc *p = myproc(); + 800027b0: 91eff0ef jal 800018ce + if(copyinstr(p->pagetable, buf, addr, max) < 0) + 800027b4: 86ce mv a3,s3 + 800027b6: 864a mv a2,s2 + 800027b8: 85a6 mv a1,s1 + 800027ba: 6928 ld a0,80(a0) + 800027bc: ccdfe0ef jal 80001488 + 800027c0: 00054c63 bltz a0,800027d8 + return strlen(buf); + 800027c4: 8526 mv a0,s1 + 800027c6: e4cfe0ef jal 80000e12 +} + 800027ca: 70a2 ld ra,40(sp) + 800027cc: 7402 ld s0,32(sp) + 800027ce: 64e2 ld s1,24(sp) + 800027d0: 6942 ld s2,16(sp) + 800027d2: 69a2 ld s3,8(sp) + 800027d4: 6145 addi sp,sp,48 + 800027d6: 8082 ret + return -1; + 800027d8: 557d li a0,-1 + 800027da: bfc5 j 800027ca + +00000000800027dc : + +// Fetch the nth 32-bit system call argument. +void +argint(int n, int *ip) +{ + 800027dc: 1101 addi sp,sp,-32 + 800027de: ec06 sd ra,24(sp) + 800027e0: e822 sd s0,16(sp) + 800027e2: e426 sd s1,8(sp) + 800027e4: 1000 addi s0,sp,32 + 800027e6: 84ae mv s1,a1 + *ip = argraw(n); + 800027e8: f0bff0ef jal 800026f2 + 800027ec: c088 sw a0,0(s1) +} + 800027ee: 60e2 ld ra,24(sp) + 800027f0: 6442 ld s0,16(sp) + 800027f2: 64a2 ld s1,8(sp) + 800027f4: 6105 addi sp,sp,32 + 800027f6: 8082 ret + +00000000800027f8 : +// Retrieve an argument as a pointer. +// Doesn't check for legality, since +// copyin/copyout will do that. +void +argaddr(int n, uint64 *ip) +{ + 800027f8: 1101 addi sp,sp,-32 + 800027fa: ec06 sd ra,24(sp) + 800027fc: e822 sd s0,16(sp) + 800027fe: e426 sd s1,8(sp) + 80002800: 1000 addi s0,sp,32 + 80002802: 84ae mv s1,a1 + *ip = argraw(n); + 80002804: eefff0ef jal 800026f2 + 80002808: e088 sd a0,0(s1) +} + 8000280a: 60e2 ld ra,24(sp) + 8000280c: 6442 ld s0,16(sp) + 8000280e: 64a2 ld s1,8(sp) + 80002810: 6105 addi sp,sp,32 + 80002812: 8082 ret + +0000000080002814 : +// Fetch the nth word-sized system call argument as a null-terminated string. +// Copies into buf, at most max. +// Returns string length if OK (including nul), -1 if error. +int +argstr(int n, char *buf, int max) +{ + 80002814: 7179 addi sp,sp,-48 + 80002816: f406 sd ra,40(sp) + 80002818: f022 sd s0,32(sp) + 8000281a: ec26 sd s1,24(sp) + 8000281c: e84a sd s2,16(sp) + 8000281e: 1800 addi s0,sp,48 + 80002820: 84ae mv s1,a1 + 80002822: 8932 mv s2,a2 + uint64 addr; + argaddr(n, &addr); + 80002824: fd840593 addi a1,s0,-40 + 80002828: fd1ff0ef jal 800027f8 + return fetchstr(addr, buf, max); + 8000282c: 864a mv a2,s2 + 8000282e: 85a6 mv a1,s1 + 80002830: fd843503 ld a0,-40(s0) + 80002834: f69ff0ef jal 8000279c +} + 80002838: 70a2 ld ra,40(sp) + 8000283a: 7402 ld s0,32(sp) + 8000283c: 64e2 ld s1,24(sp) + 8000283e: 6942 ld s2,16(sp) + 80002840: 6145 addi sp,sp,48 + 80002842: 8082 ret + +0000000080002844 : +[SYS_close] sys_close, +}; + +void +syscall(void) +{ + 80002844: 1101 addi sp,sp,-32 + 80002846: ec06 sd ra,24(sp) + 80002848: e822 sd s0,16(sp) + 8000284a: e426 sd s1,8(sp) + 8000284c: e04a sd s2,0(sp) + 8000284e: 1000 addi s0,sp,32 + int num; + struct proc *p = myproc(); + 80002850: 87eff0ef jal 800018ce + 80002854: 84aa mv s1,a0 + + num = p->trapframe->a7; + 80002856: 05853903 ld s2,88(a0) + 8000285a: 0a893783 ld a5,168(s2) + 8000285e: 0007869b sext.w a3,a5 + if(num > 0 && num < NELEM(syscalls) && syscalls[num]) { + 80002862: 37fd addiw a5,a5,-1 + 80002864: 4751 li a4,20 + 80002866: 00f76f63 bltu a4,a5,80002884 + 8000286a: 00369713 slli a4,a3,0x3 + 8000286e: 00005797 auipc a5,0x5 + 80002872: f0278793 addi a5,a5,-254 # 80007770 + 80002876: 97ba add a5,a5,a4 + 80002878: 639c ld a5,0(a5) + 8000287a: c789 beqz a5,80002884 + // Use num to lookup the system call function for num, call it, + // and store its return value in p->trapframe->a0 + p->trapframe->a0 = syscalls[num](); + 8000287c: 9782 jalr a5 + 8000287e: 06a93823 sd a0,112(s2) + 80002882: a829 j 8000289c + } else { + printf("%d %s: unknown sys call %d\n", + 80002884: 15848613 addi a2,s1,344 + 80002888: 588c lw a1,48(s1) + 8000288a: 00005517 auipc a0,0x5 + 8000288e: ae650513 addi a0,a0,-1306 # 80007370 + 80002892: c69fd0ef jal 800004fa + p->pid, p->name, num); + p->trapframe->a0 = -1; + 80002896: 6cbc ld a5,88(s1) + 80002898: 577d li a4,-1 + 8000289a: fbb8 sd a4,112(a5) + } +} + 8000289c: 60e2 ld ra,24(sp) + 8000289e: 6442 ld s0,16(sp) + 800028a0: 64a2 ld s1,8(sp) + 800028a2: 6902 ld s2,0(sp) + 800028a4: 6105 addi sp,sp,32 + 800028a6: 8082 ret + +00000000800028a8 : +#include "proc.h" +#include "vm.h" + +uint64 +sys_exit(void) +{ + 800028a8: 1101 addi sp,sp,-32 + 800028aa: ec06 sd ra,24(sp) + 800028ac: e822 sd s0,16(sp) + 800028ae: 1000 addi s0,sp,32 + int n; + argint(0, &n); + 800028b0: fec40593 addi a1,s0,-20 + 800028b4: 4501 li a0,0 + 800028b6: f27ff0ef jal 800027dc + kexit(n); + 800028ba: fec42503 lw a0,-20(s0) + 800028be: f26ff0ef jal 80001fe4 + return 0; // not reached +} + 800028c2: 4501 li a0,0 + 800028c4: 60e2 ld ra,24(sp) + 800028c6: 6442 ld s0,16(sp) + 800028c8: 6105 addi sp,sp,32 + 800028ca: 8082 ret + +00000000800028cc : + +uint64 +sys_getpid(void) +{ + 800028cc: 1141 addi sp,sp,-16 + 800028ce: e406 sd ra,8(sp) + 800028d0: e022 sd s0,0(sp) + 800028d2: 0800 addi s0,sp,16 + return myproc()->pid; + 800028d4: ffbfe0ef jal 800018ce +} + 800028d8: 5908 lw a0,48(a0) + 800028da: 60a2 ld ra,8(sp) + 800028dc: 6402 ld s0,0(sp) + 800028de: 0141 addi sp,sp,16 + 800028e0: 8082 ret + +00000000800028e2 : + +uint64 +sys_fork(void) +{ + 800028e2: 1141 addi sp,sp,-16 + 800028e4: e406 sd ra,8(sp) + 800028e6: e022 sd s0,0(sp) + 800028e8: 0800 addi s0,sp,16 + return kfork(); + 800028ea: b48ff0ef jal 80001c32 +} + 800028ee: 60a2 ld ra,8(sp) + 800028f0: 6402 ld s0,0(sp) + 800028f2: 0141 addi sp,sp,16 + 800028f4: 8082 ret + +00000000800028f6 : + +uint64 +sys_wait(void) +{ + 800028f6: 1101 addi sp,sp,-32 + 800028f8: ec06 sd ra,24(sp) + 800028fa: e822 sd s0,16(sp) + 800028fc: 1000 addi s0,sp,32 + uint64 p; + argaddr(0, &p); + 800028fe: fe840593 addi a1,s0,-24 + 80002902: 4501 li a0,0 + 80002904: ef5ff0ef jal 800027f8 + return kwait(p); + 80002908: fe843503 ld a0,-24(s0) + 8000290c: 82fff0ef jal 8000213a +} + 80002910: 60e2 ld ra,24(sp) + 80002912: 6442 ld s0,16(sp) + 80002914: 6105 addi sp,sp,32 + 80002916: 8082 ret + +0000000080002918 : + +uint64 +sys_sbrk(void) +{ + 80002918: 7179 addi sp,sp,-48 + 8000291a: f406 sd ra,40(sp) + 8000291c: f022 sd s0,32(sp) + 8000291e: ec26 sd s1,24(sp) + 80002920: 1800 addi s0,sp,48 + uint64 addr; + int t; + int n; + + argint(0, &n); + 80002922: fd840593 addi a1,s0,-40 + 80002926: 4501 li a0,0 + 80002928: eb5ff0ef jal 800027dc + argint(1, &t); + 8000292c: fdc40593 addi a1,s0,-36 + 80002930: 4505 li a0,1 + 80002932: eabff0ef jal 800027dc + addr = myproc()->sz; + 80002936: f99fe0ef jal 800018ce + 8000293a: 6524 ld s1,72(a0) + + if(t == SBRK_EAGER || n < 0) { + 8000293c: fdc42703 lw a4,-36(s0) + 80002940: 4785 li a5,1 + 80002942: 02f70763 beq a4,a5,80002970 + 80002946: fd842783 lw a5,-40(s0) + 8000294a: 0207c363 bltz a5,80002970 + } + } else { + // Lazily allocate memory for this process: increase its memory + // size but don't allocate memory. If the processes uses the + // memory, vmfault() will allocate it. + if(addr + n < addr) + 8000294e: 97a6 add a5,a5,s1 + 80002950: 0297ee63 bltu a5,s1,8000298c + return -1; + if(addr + n > TRAPFRAME) + 80002954: 02000737 lui a4,0x2000 + 80002958: 177d addi a4,a4,-1 # 1ffffff <_entry-0x7e000001> + 8000295a: 0736 slli a4,a4,0xd + 8000295c: 02f76a63 bltu a4,a5,80002990 + return -1; + myproc()->sz += n; + 80002960: f6ffe0ef jal 800018ce + 80002964: fd842703 lw a4,-40(s0) + 80002968: 653c ld a5,72(a0) + 8000296a: 97ba add a5,a5,a4 + 8000296c: e53c sd a5,72(a0) + 8000296e: a039 j 8000297c + if(growproc(n) < 0) { + 80002970: fd842503 lw a0,-40(s0) + 80002974: a5cff0ef jal 80001bd0 + 80002978: 00054863 bltz a0,80002988 + } + return addr; +} + 8000297c: 8526 mv a0,s1 + 8000297e: 70a2 ld ra,40(sp) + 80002980: 7402 ld s0,32(sp) + 80002982: 64e2 ld s1,24(sp) + 80002984: 6145 addi sp,sp,48 + 80002986: 8082 ret + return -1; + 80002988: 54fd li s1,-1 + 8000298a: bfcd j 8000297c + return -1; + 8000298c: 54fd li s1,-1 + 8000298e: b7fd j 8000297c + return -1; + 80002990: 54fd li s1,-1 + 80002992: b7ed j 8000297c + +0000000080002994 : + +uint64 +sys_pause(void) +{ + 80002994: 7139 addi sp,sp,-64 + 80002996: fc06 sd ra,56(sp) + 80002998: f822 sd s0,48(sp) + 8000299a: f04a sd s2,32(sp) + 8000299c: 0080 addi s0,sp,64 + int n; + uint ticks0; + + argint(0, &n); + 8000299e: fcc40593 addi a1,s0,-52 + 800029a2: 4501 li a0,0 + 800029a4: e39ff0ef jal 800027dc + if(n < 0) + 800029a8: fcc42783 lw a5,-52(s0) + 800029ac: 0607c763 bltz a5,80002a1a + n = 0; + acquire(&tickslock); + 800029b0: 00015517 auipc a0,0x15 + 800029b4: 73850513 addi a0,a0,1848 # 800180e8 + 800029b8: a16fe0ef jal 80000bce + ticks0 = ticks; + 800029bc: 00007917 auipc s2,0x7 + 800029c0: 7fc92903 lw s2,2044(s2) # 8000a1b8 + while(ticks - ticks0 < n){ + 800029c4: fcc42783 lw a5,-52(s0) + 800029c8: cf8d beqz a5,80002a02 + 800029ca: f426 sd s1,40(sp) + 800029cc: ec4e sd s3,24(sp) + if(killed(myproc())){ + release(&tickslock); + return -1; + } + sleep(&ticks, &tickslock); + 800029ce: 00015997 auipc s3,0x15 + 800029d2: 71a98993 addi s3,s3,1818 # 800180e8 + 800029d6: 00007497 auipc s1,0x7 + 800029da: 7e248493 addi s1,s1,2018 # 8000a1b8 + if(killed(myproc())){ + 800029de: ef1fe0ef jal 800018ce + 800029e2: f2eff0ef jal 80002110 + 800029e6: ed0d bnez a0,80002a20 + sleep(&ticks, &tickslock); + 800029e8: 85ce mv a1,s3 + 800029ea: 8526 mv a0,s1 + 800029ec: cecff0ef jal 80001ed8 + while(ticks - ticks0 < n){ + 800029f0: 409c lw a5,0(s1) + 800029f2: 412787bb subw a5,a5,s2 + 800029f6: fcc42703 lw a4,-52(s0) + 800029fa: fee7e2e3 bltu a5,a4,800029de + 800029fe: 74a2 ld s1,40(sp) + 80002a00: 69e2 ld s3,24(sp) + } + release(&tickslock); + 80002a02: 00015517 auipc a0,0x15 + 80002a06: 6e650513 addi a0,a0,1766 # 800180e8 + 80002a0a: a5cfe0ef jal 80000c66 + return 0; + 80002a0e: 4501 li a0,0 +} + 80002a10: 70e2 ld ra,56(sp) + 80002a12: 7442 ld s0,48(sp) + 80002a14: 7902 ld s2,32(sp) + 80002a16: 6121 addi sp,sp,64 + 80002a18: 8082 ret + n = 0; + 80002a1a: fc042623 sw zero,-52(s0) + 80002a1e: bf49 j 800029b0 + release(&tickslock); + 80002a20: 00015517 auipc a0,0x15 + 80002a24: 6c850513 addi a0,a0,1736 # 800180e8 + 80002a28: a3efe0ef jal 80000c66 + return -1; + 80002a2c: 557d li a0,-1 + 80002a2e: 74a2 ld s1,40(sp) + 80002a30: 69e2 ld s3,24(sp) + 80002a32: bff9 j 80002a10 + +0000000080002a34 : + +uint64 +sys_kill(void) +{ + 80002a34: 1101 addi sp,sp,-32 + 80002a36: ec06 sd ra,24(sp) + 80002a38: e822 sd s0,16(sp) + 80002a3a: 1000 addi s0,sp,32 + int pid; + + argint(0, &pid); + 80002a3c: fec40593 addi a1,s0,-20 + 80002a40: 4501 li a0,0 + 80002a42: d9bff0ef jal 800027dc + return kkill(pid); + 80002a46: fec42503 lw a0,-20(s0) + 80002a4a: e3cff0ef jal 80002086 +} + 80002a4e: 60e2 ld ra,24(sp) + 80002a50: 6442 ld s0,16(sp) + 80002a52: 6105 addi sp,sp,32 + 80002a54: 8082 ret + +0000000080002a56 : + +// return how many clock tick interrupts have occurred +// since start. +uint64 +sys_uptime(void) +{ + 80002a56: 1101 addi sp,sp,-32 + 80002a58: ec06 sd ra,24(sp) + 80002a5a: e822 sd s0,16(sp) + 80002a5c: e426 sd s1,8(sp) + 80002a5e: 1000 addi s0,sp,32 + uint xticks; + + acquire(&tickslock); + 80002a60: 00015517 auipc a0,0x15 + 80002a64: 68850513 addi a0,a0,1672 # 800180e8 + 80002a68: 966fe0ef jal 80000bce + xticks = ticks; + 80002a6c: 00007497 auipc s1,0x7 + 80002a70: 74c4a483 lw s1,1868(s1) # 8000a1b8 + release(&tickslock); + 80002a74: 00015517 auipc a0,0x15 + 80002a78: 67450513 addi a0,a0,1652 # 800180e8 + 80002a7c: 9eafe0ef jal 80000c66 + return xticks; +} + 80002a80: 02049513 slli a0,s1,0x20 + 80002a84: 9101 srli a0,a0,0x20 + 80002a86: 60e2 ld ra,24(sp) + 80002a88: 6442 ld s0,16(sp) + 80002a8a: 64a2 ld s1,8(sp) + 80002a8c: 6105 addi sp,sp,32 + 80002a8e: 8082 ret + +0000000080002a90 : + struct buf head; +} bcache; + +void +binit(void) +{ + 80002a90: 7179 addi sp,sp,-48 + 80002a92: f406 sd ra,40(sp) + 80002a94: f022 sd s0,32(sp) + 80002a96: ec26 sd s1,24(sp) + 80002a98: e84a sd s2,16(sp) + 80002a9a: e44e sd s3,8(sp) + 80002a9c: e052 sd s4,0(sp) + 80002a9e: 1800 addi s0,sp,48 + struct buf *b; + + initlock(&bcache.lock, "bcache"); + 80002aa0: 00005597 auipc a1,0x5 + 80002aa4: 8f058593 addi a1,a1,-1808 # 80007390 + 80002aa8: 00015517 auipc a0,0x15 + 80002aac: 65850513 addi a0,a0,1624 # 80018100 + 80002ab0: 89efe0ef jal 80000b4e + + // Create linked list of buffers + bcache.head.prev = &bcache.head; + 80002ab4: 0001d797 auipc a5,0x1d + 80002ab8: 64c78793 addi a5,a5,1612 # 80020100 + 80002abc: 0001e717 auipc a4,0x1e + 80002ac0: 8ac70713 addi a4,a4,-1876 # 80020368 + 80002ac4: 2ae7b823 sd a4,688(a5) + bcache.head.next = &bcache.head; + 80002ac8: 2ae7bc23 sd a4,696(a5) + for(b = bcache.buf; b < bcache.buf+NBUF; b++){ + 80002acc: 00015497 auipc s1,0x15 + 80002ad0: 64c48493 addi s1,s1,1612 # 80018118 + b->next = bcache.head.next; + 80002ad4: 893e mv s2,a5 + b->prev = &bcache.head; + 80002ad6: 89ba mv s3,a4 + initsleeplock(&b->lock, "buffer"); + 80002ad8: 00005a17 auipc s4,0x5 + 80002adc: 8c0a0a13 addi s4,s4,-1856 # 80007398 + b->next = bcache.head.next; + 80002ae0: 2b893783 ld a5,696(s2) + 80002ae4: e8bc sd a5,80(s1) + b->prev = &bcache.head; + 80002ae6: 0534b423 sd s3,72(s1) + initsleeplock(&b->lock, "buffer"); + 80002aea: 85d2 mv a1,s4 + 80002aec: 01048513 addi a0,s1,16 + 80002af0: 322010ef jal 80003e12 + bcache.head.next->prev = b; + 80002af4: 2b893783 ld a5,696(s2) + 80002af8: e7a4 sd s1,72(a5) + bcache.head.next = b; + 80002afa: 2a993c23 sd s1,696(s2) + for(b = bcache.buf; b < bcache.buf+NBUF; b++){ + 80002afe: 45848493 addi s1,s1,1112 + 80002b02: fd349fe3 bne s1,s3,80002ae0 + } +} + 80002b06: 70a2 ld ra,40(sp) + 80002b08: 7402 ld s0,32(sp) + 80002b0a: 64e2 ld s1,24(sp) + 80002b0c: 6942 ld s2,16(sp) + 80002b0e: 69a2 ld s3,8(sp) + 80002b10: 6a02 ld s4,0(sp) + 80002b12: 6145 addi sp,sp,48 + 80002b14: 8082 ret + +0000000080002b16 : +} + +// Return a locked buf with the contents of the indicated block. +struct buf* +bread(uint dev, uint blockno) +{ + 80002b16: 7179 addi sp,sp,-48 + 80002b18: f406 sd ra,40(sp) + 80002b1a: f022 sd s0,32(sp) + 80002b1c: ec26 sd s1,24(sp) + 80002b1e: e84a sd s2,16(sp) + 80002b20: e44e sd s3,8(sp) + 80002b22: 1800 addi s0,sp,48 + 80002b24: 892a mv s2,a0 + 80002b26: 89ae mv s3,a1 + acquire(&bcache.lock); + 80002b28: 00015517 auipc a0,0x15 + 80002b2c: 5d850513 addi a0,a0,1496 # 80018100 + 80002b30: 89efe0ef jal 80000bce + for(b = bcache.head.next; b != &bcache.head; b = b->next){ + 80002b34: 0001e497 auipc s1,0x1e + 80002b38: 8844b483 ld s1,-1916(s1) # 800203b8 + 80002b3c: 0001e797 auipc a5,0x1e + 80002b40: 82c78793 addi a5,a5,-2004 # 80020368 + 80002b44: 02f48b63 beq s1,a5,80002b7a + 80002b48: 873e mv a4,a5 + 80002b4a: a021 j 80002b52 + 80002b4c: 68a4 ld s1,80(s1) + 80002b4e: 02e48663 beq s1,a4,80002b7a + if(b->dev == dev && b->blockno == blockno){ + 80002b52: 449c lw a5,8(s1) + 80002b54: ff279ce3 bne a5,s2,80002b4c + 80002b58: 44dc lw a5,12(s1) + 80002b5a: ff3799e3 bne a5,s3,80002b4c + b->refcnt++; + 80002b5e: 40bc lw a5,64(s1) + 80002b60: 2785 addiw a5,a5,1 + 80002b62: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002b64: 00015517 auipc a0,0x15 + 80002b68: 59c50513 addi a0,a0,1436 # 80018100 + 80002b6c: 8fafe0ef jal 80000c66 + acquiresleep(&b->lock); + 80002b70: 01048513 addi a0,s1,16 + 80002b74: 2d4010ef jal 80003e48 + return b; + 80002b78: a889 j 80002bca + for(b = bcache.head.prev; b != &bcache.head; b = b->prev){ + 80002b7a: 0001e497 auipc s1,0x1e + 80002b7e: 8364b483 ld s1,-1994(s1) # 800203b0 + 80002b82: 0001d797 auipc a5,0x1d + 80002b86: 7e678793 addi a5,a5,2022 # 80020368 + 80002b8a: 00f48863 beq s1,a5,80002b9a + 80002b8e: 873e mv a4,a5 + if(b->refcnt == 0) { + 80002b90: 40bc lw a5,64(s1) + 80002b92: cb91 beqz a5,80002ba6 + for(b = bcache.head.prev; b != &bcache.head; b = b->prev){ + 80002b94: 64a4 ld s1,72(s1) + 80002b96: fee49de3 bne s1,a4,80002b90 + panic("bget: no buffers"); + 80002b9a: 00005517 auipc a0,0x5 + 80002b9e: 80650513 addi a0,a0,-2042 # 800073a0 + 80002ba2: c3ffd0ef jal 800007e0 + b->dev = dev; + 80002ba6: 0124a423 sw s2,8(s1) + b->blockno = blockno; + 80002baa: 0134a623 sw s3,12(s1) + b->valid = 0; + 80002bae: 0004a023 sw zero,0(s1) + b->refcnt = 1; + 80002bb2: 4785 li a5,1 + 80002bb4: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002bb6: 00015517 auipc a0,0x15 + 80002bba: 54a50513 addi a0,a0,1354 # 80018100 + 80002bbe: 8a8fe0ef jal 80000c66 + acquiresleep(&b->lock); + 80002bc2: 01048513 addi a0,s1,16 + 80002bc6: 282010ef jal 80003e48 + struct buf *b; + + b = bget(dev, blockno); + if(!b->valid) { + 80002bca: 409c lw a5,0(s1) + 80002bcc: cb89 beqz a5,80002bde + virtio_disk_rw(b, 0); + b->valid = 1; + } + return b; +} + 80002bce: 8526 mv a0,s1 + 80002bd0: 70a2 ld ra,40(sp) + 80002bd2: 7402 ld s0,32(sp) + 80002bd4: 64e2 ld s1,24(sp) + 80002bd6: 6942 ld s2,16(sp) + 80002bd8: 69a2 ld s3,8(sp) + 80002bda: 6145 addi sp,sp,48 + 80002bdc: 8082 ret + virtio_disk_rw(b, 0); + 80002bde: 4581 li a1,0 + 80002be0: 8526 mv a0,s1 + 80002be2: 2cf020ef jal 800056b0 + b->valid = 1; + 80002be6: 4785 li a5,1 + 80002be8: c09c sw a5,0(s1) + return b; + 80002bea: b7d5 j 80002bce + +0000000080002bec : + +// Write b's contents to disk. Must be locked. +void +bwrite(struct buf *b) +{ + 80002bec: 1101 addi sp,sp,-32 + 80002bee: ec06 sd ra,24(sp) + 80002bf0: e822 sd s0,16(sp) + 80002bf2: e426 sd s1,8(sp) + 80002bf4: 1000 addi s0,sp,32 + 80002bf6: 84aa mv s1,a0 + if(!holdingsleep(&b->lock)) + 80002bf8: 0541 addi a0,a0,16 + 80002bfa: 2cc010ef jal 80003ec6 + 80002bfe: c911 beqz a0,80002c12 + panic("bwrite"); + virtio_disk_rw(b, 1); + 80002c00: 4585 li a1,1 + 80002c02: 8526 mv a0,s1 + 80002c04: 2ad020ef jal 800056b0 +} + 80002c08: 60e2 ld ra,24(sp) + 80002c0a: 6442 ld s0,16(sp) + 80002c0c: 64a2 ld s1,8(sp) + 80002c0e: 6105 addi sp,sp,32 + 80002c10: 8082 ret + panic("bwrite"); + 80002c12: 00004517 auipc a0,0x4 + 80002c16: 7a650513 addi a0,a0,1958 # 800073b8 + 80002c1a: bc7fd0ef jal 800007e0 + +0000000080002c1e : + +// Release a locked buffer. +// Move to the head of the most-recently-used list. +void +brelse(struct buf *b) +{ + 80002c1e: 1101 addi sp,sp,-32 + 80002c20: ec06 sd ra,24(sp) + 80002c22: e822 sd s0,16(sp) + 80002c24: e426 sd s1,8(sp) + 80002c26: e04a sd s2,0(sp) + 80002c28: 1000 addi s0,sp,32 + 80002c2a: 84aa mv s1,a0 + if(!holdingsleep(&b->lock)) + 80002c2c: 01050913 addi s2,a0,16 + 80002c30: 854a mv a0,s2 + 80002c32: 294010ef jal 80003ec6 + 80002c36: c135 beqz a0,80002c9a + panic("brelse"); + + releasesleep(&b->lock); + 80002c38: 854a mv a0,s2 + 80002c3a: 254010ef jal 80003e8e + + acquire(&bcache.lock); + 80002c3e: 00015517 auipc a0,0x15 + 80002c42: 4c250513 addi a0,a0,1218 # 80018100 + 80002c46: f89fd0ef jal 80000bce + b->refcnt--; + 80002c4a: 40bc lw a5,64(s1) + 80002c4c: 37fd addiw a5,a5,-1 + 80002c4e: 0007871b sext.w a4,a5 + 80002c52: c0bc sw a5,64(s1) + if (b->refcnt == 0) { + 80002c54: e71d bnez a4,80002c82 + // no one is waiting for it. + b->next->prev = b->prev; + 80002c56: 68b8 ld a4,80(s1) + 80002c58: 64bc ld a5,72(s1) + 80002c5a: e73c sd a5,72(a4) + b->prev->next = b->next; + 80002c5c: 68b8 ld a4,80(s1) + 80002c5e: ebb8 sd a4,80(a5) + b->next = bcache.head.next; + 80002c60: 0001d797 auipc a5,0x1d + 80002c64: 4a078793 addi a5,a5,1184 # 80020100 + 80002c68: 2b87b703 ld a4,696(a5) + 80002c6c: e8b8 sd a4,80(s1) + b->prev = &bcache.head; + 80002c6e: 0001d717 auipc a4,0x1d + 80002c72: 6fa70713 addi a4,a4,1786 # 80020368 + 80002c76: e4b8 sd a4,72(s1) + bcache.head.next->prev = b; + 80002c78: 2b87b703 ld a4,696(a5) + 80002c7c: e724 sd s1,72(a4) + bcache.head.next = b; + 80002c7e: 2a97bc23 sd s1,696(a5) + } + + release(&bcache.lock); + 80002c82: 00015517 auipc a0,0x15 + 80002c86: 47e50513 addi a0,a0,1150 # 80018100 + 80002c8a: fddfd0ef jal 80000c66 +} + 80002c8e: 60e2 ld ra,24(sp) + 80002c90: 6442 ld s0,16(sp) + 80002c92: 64a2 ld s1,8(sp) + 80002c94: 6902 ld s2,0(sp) + 80002c96: 6105 addi sp,sp,32 + 80002c98: 8082 ret + panic("brelse"); + 80002c9a: 00004517 auipc a0,0x4 + 80002c9e: 72650513 addi a0,a0,1830 # 800073c0 + 80002ca2: b3ffd0ef jal 800007e0 + +0000000080002ca6 : + +void +bpin(struct buf *b) { + 80002ca6: 1101 addi sp,sp,-32 + 80002ca8: ec06 sd ra,24(sp) + 80002caa: e822 sd s0,16(sp) + 80002cac: e426 sd s1,8(sp) + 80002cae: 1000 addi s0,sp,32 + 80002cb0: 84aa mv s1,a0 + acquire(&bcache.lock); + 80002cb2: 00015517 auipc a0,0x15 + 80002cb6: 44e50513 addi a0,a0,1102 # 80018100 + 80002cba: f15fd0ef jal 80000bce + b->refcnt++; + 80002cbe: 40bc lw a5,64(s1) + 80002cc0: 2785 addiw a5,a5,1 + 80002cc2: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002cc4: 00015517 auipc a0,0x15 + 80002cc8: 43c50513 addi a0,a0,1084 # 80018100 + 80002ccc: f9bfd0ef jal 80000c66 +} + 80002cd0: 60e2 ld ra,24(sp) + 80002cd2: 6442 ld s0,16(sp) + 80002cd4: 64a2 ld s1,8(sp) + 80002cd6: 6105 addi sp,sp,32 + 80002cd8: 8082 ret + +0000000080002cda : + +void +bunpin(struct buf *b) { + 80002cda: 1101 addi sp,sp,-32 + 80002cdc: ec06 sd ra,24(sp) + 80002cde: e822 sd s0,16(sp) + 80002ce0: e426 sd s1,8(sp) + 80002ce2: 1000 addi s0,sp,32 + 80002ce4: 84aa mv s1,a0 + acquire(&bcache.lock); + 80002ce6: 00015517 auipc a0,0x15 + 80002cea: 41a50513 addi a0,a0,1050 # 80018100 + 80002cee: ee1fd0ef jal 80000bce + b->refcnt--; + 80002cf2: 40bc lw a5,64(s1) + 80002cf4: 37fd addiw a5,a5,-1 + 80002cf6: c0bc sw a5,64(s1) + release(&bcache.lock); + 80002cf8: 00015517 auipc a0,0x15 + 80002cfc: 40850513 addi a0,a0,1032 # 80018100 + 80002d00: f67fd0ef jal 80000c66 +} + 80002d04: 60e2 ld ra,24(sp) + 80002d06: 6442 ld s0,16(sp) + 80002d08: 64a2 ld s1,8(sp) + 80002d0a: 6105 addi sp,sp,32 + 80002d0c: 8082 ret + +0000000080002d0e : +} + +// Free a disk block. +static void +bfree(int dev, uint b) +{ + 80002d0e: 1101 addi sp,sp,-32 + 80002d10: ec06 sd ra,24(sp) + 80002d12: e822 sd s0,16(sp) + 80002d14: e426 sd s1,8(sp) + 80002d16: e04a sd s2,0(sp) + 80002d18: 1000 addi s0,sp,32 + 80002d1a: 84ae mv s1,a1 + struct buf *bp; + int bi, m; + + bp = bread(dev, BBLOCK(b, sb)); + 80002d1c: 00d5d59b srliw a1,a1,0xd + 80002d20: 0001e797 auipc a5,0x1e + 80002d24: abc7a783 lw a5,-1348(a5) # 800207dc + 80002d28: 9dbd addw a1,a1,a5 + 80002d2a: dedff0ef jal 80002b16 + bi = b % BPB; + m = 1 << (bi % 8); + 80002d2e: 0074f713 andi a4,s1,7 + 80002d32: 4785 li a5,1 + 80002d34: 00e797bb sllw a5,a5,a4 + if((bp->data[bi/8] & m) == 0) + 80002d38: 14ce slli s1,s1,0x33 + 80002d3a: 90d9 srli s1,s1,0x36 + 80002d3c: 00950733 add a4,a0,s1 + 80002d40: 05874703 lbu a4,88(a4) + 80002d44: 00e7f6b3 and a3,a5,a4 + 80002d48: c29d beqz a3,80002d6e + 80002d4a: 892a mv s2,a0 + panic("freeing free block"); + bp->data[bi/8] &= ~m; + 80002d4c: 94aa add s1,s1,a0 + 80002d4e: fff7c793 not a5,a5 + 80002d52: 8f7d and a4,a4,a5 + 80002d54: 04e48c23 sb a4,88(s1) + log_write(bp); + 80002d58: 7f9000ef jal 80003d50 + brelse(bp); + 80002d5c: 854a mv a0,s2 + 80002d5e: ec1ff0ef jal 80002c1e +} + 80002d62: 60e2 ld ra,24(sp) + 80002d64: 6442 ld s0,16(sp) + 80002d66: 64a2 ld s1,8(sp) + 80002d68: 6902 ld s2,0(sp) + 80002d6a: 6105 addi sp,sp,32 + 80002d6c: 8082 ret + panic("freeing free block"); + 80002d6e: 00004517 auipc a0,0x4 + 80002d72: 65a50513 addi a0,a0,1626 # 800073c8 + 80002d76: a6bfd0ef jal 800007e0 + +0000000080002d7a : +{ + 80002d7a: 711d addi sp,sp,-96 + 80002d7c: ec86 sd ra,88(sp) + 80002d7e: e8a2 sd s0,80(sp) + 80002d80: e4a6 sd s1,72(sp) + 80002d82: 1080 addi s0,sp,96 + for(b = 0; b < sb.size; b += BPB){ + 80002d84: 0001e797 auipc a5,0x1e + 80002d88: a407a783 lw a5,-1472(a5) # 800207c4 + 80002d8c: 0e078f63 beqz a5,80002e8a + 80002d90: e0ca sd s2,64(sp) + 80002d92: fc4e sd s3,56(sp) + 80002d94: f852 sd s4,48(sp) + 80002d96: f456 sd s5,40(sp) + 80002d98: f05a sd s6,32(sp) + 80002d9a: ec5e sd s7,24(sp) + 80002d9c: e862 sd s8,16(sp) + 80002d9e: e466 sd s9,8(sp) + 80002da0: 8baa mv s7,a0 + 80002da2: 4a81 li s5,0 + bp = bread(dev, BBLOCK(b, sb)); + 80002da4: 0001eb17 auipc s6,0x1e + 80002da8: a1cb0b13 addi s6,s6,-1508 # 800207c0 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002dac: 4c01 li s8,0 + m = 1 << (bi % 8); + 80002dae: 4985 li s3,1 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002db0: 6a09 lui s4,0x2 + for(b = 0; b < sb.size; b += BPB){ + 80002db2: 6c89 lui s9,0x2 + 80002db4: a0b5 j 80002e20 + bp->data[bi/8] |= m; // Mark block in use. + 80002db6: 97ca add a5,a5,s2 + 80002db8: 8e55 or a2,a2,a3 + 80002dba: 04c78c23 sb a2,88(a5) + log_write(bp); + 80002dbe: 854a mv a0,s2 + 80002dc0: 791000ef jal 80003d50 + brelse(bp); + 80002dc4: 854a mv a0,s2 + 80002dc6: e59ff0ef jal 80002c1e + bp = bread(dev, bno); + 80002dca: 85a6 mv a1,s1 + 80002dcc: 855e mv a0,s7 + 80002dce: d49ff0ef jal 80002b16 + 80002dd2: 892a mv s2,a0 + memset(bp->data, 0, BSIZE); + 80002dd4: 40000613 li a2,1024 + 80002dd8: 4581 li a1,0 + 80002dda: 05850513 addi a0,a0,88 + 80002dde: ec5fd0ef jal 80000ca2 + log_write(bp); + 80002de2: 854a mv a0,s2 + 80002de4: 76d000ef jal 80003d50 + brelse(bp); + 80002de8: 854a mv a0,s2 + 80002dea: e35ff0ef jal 80002c1e +} + 80002dee: 6906 ld s2,64(sp) + 80002df0: 79e2 ld s3,56(sp) + 80002df2: 7a42 ld s4,48(sp) + 80002df4: 7aa2 ld s5,40(sp) + 80002df6: 7b02 ld s6,32(sp) + 80002df8: 6be2 ld s7,24(sp) + 80002dfa: 6c42 ld s8,16(sp) + 80002dfc: 6ca2 ld s9,8(sp) +} + 80002dfe: 8526 mv a0,s1 + 80002e00: 60e6 ld ra,88(sp) + 80002e02: 6446 ld s0,80(sp) + 80002e04: 64a6 ld s1,72(sp) + 80002e06: 6125 addi sp,sp,96 + 80002e08: 8082 ret + brelse(bp); + 80002e0a: 854a mv a0,s2 + 80002e0c: e13ff0ef jal 80002c1e + for(b = 0; b < sb.size; b += BPB){ + 80002e10: 015c87bb addw a5,s9,s5 + 80002e14: 00078a9b sext.w s5,a5 + 80002e18: 004b2703 lw a4,4(s6) + 80002e1c: 04eaff63 bgeu s5,a4,80002e7a + bp = bread(dev, BBLOCK(b, sb)); + 80002e20: 41fad79b sraiw a5,s5,0x1f + 80002e24: 0137d79b srliw a5,a5,0x13 + 80002e28: 015787bb addw a5,a5,s5 + 80002e2c: 40d7d79b sraiw a5,a5,0xd + 80002e30: 01cb2583 lw a1,28(s6) + 80002e34: 9dbd addw a1,a1,a5 + 80002e36: 855e mv a0,s7 + 80002e38: cdfff0ef jal 80002b16 + 80002e3c: 892a mv s2,a0 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002e3e: 004b2503 lw a0,4(s6) + 80002e42: 000a849b sext.w s1,s5 + 80002e46: 8762 mv a4,s8 + 80002e48: fca4f1e3 bgeu s1,a0,80002e0a + m = 1 << (bi % 8); + 80002e4c: 00777693 andi a3,a4,7 + 80002e50: 00d996bb sllw a3,s3,a3 + if((bp->data[bi/8] & m) == 0){ // Is block free? + 80002e54: 41f7579b sraiw a5,a4,0x1f + 80002e58: 01d7d79b srliw a5,a5,0x1d + 80002e5c: 9fb9 addw a5,a5,a4 + 80002e5e: 4037d79b sraiw a5,a5,0x3 + 80002e62: 00f90633 add a2,s2,a5 + 80002e66: 05864603 lbu a2,88(a2) + 80002e6a: 00c6f5b3 and a1,a3,a2 + 80002e6e: d5a1 beqz a1,80002db6 + for(bi = 0; bi < BPB && b + bi < sb.size; bi++){ + 80002e70: 2705 addiw a4,a4,1 + 80002e72: 2485 addiw s1,s1,1 + 80002e74: fd471ae3 bne a4,s4,80002e48 + 80002e78: bf49 j 80002e0a + 80002e7a: 6906 ld s2,64(sp) + 80002e7c: 79e2 ld s3,56(sp) + 80002e7e: 7a42 ld s4,48(sp) + 80002e80: 7aa2 ld s5,40(sp) + 80002e82: 7b02 ld s6,32(sp) + 80002e84: 6be2 ld s7,24(sp) + 80002e86: 6c42 ld s8,16(sp) + 80002e88: 6ca2 ld s9,8(sp) + printf("balloc: out of blocks\n"); + 80002e8a: 00004517 auipc a0,0x4 + 80002e8e: 55650513 addi a0,a0,1366 # 800073e0 + 80002e92: e68fd0ef jal 800004fa + return 0; + 80002e96: 4481 li s1,0 + 80002e98: b79d j 80002dfe + +0000000080002e9a : +// Return the disk block address of the nth block in inode ip. +// If there is no such block, bmap allocates one. +// returns 0 if out of disk space. +static uint +bmap(struct inode *ip, uint bn) +{ + 80002e9a: 7179 addi sp,sp,-48 + 80002e9c: f406 sd ra,40(sp) + 80002e9e: f022 sd s0,32(sp) + 80002ea0: ec26 sd s1,24(sp) + 80002ea2: e84a sd s2,16(sp) + 80002ea4: e44e sd s3,8(sp) + 80002ea6: 1800 addi s0,sp,48 + 80002ea8: 89aa mv s3,a0 + uint addr, *a; + struct buf *bp; + + if(bn < NDIRECT){ + 80002eaa: 47ad li a5,11 + 80002eac: 02b7e663 bltu a5,a1,80002ed8 + if((addr = ip->addrs[bn]) == 0){ + 80002eb0: 02059793 slli a5,a1,0x20 + 80002eb4: 01e7d593 srli a1,a5,0x1e + 80002eb8: 00b504b3 add s1,a0,a1 + 80002ebc: 0504a903 lw s2,80(s1) + 80002ec0: 06091a63 bnez s2,80002f34 + addr = balloc(ip->dev); + 80002ec4: 4108 lw a0,0(a0) + 80002ec6: eb5ff0ef jal 80002d7a + 80002eca: 0005091b sext.w s2,a0 + if(addr == 0) + 80002ece: 06090363 beqz s2,80002f34 + return 0; + ip->addrs[bn] = addr; + 80002ed2: 0524a823 sw s2,80(s1) + 80002ed6: a8b9 j 80002f34 + } + return addr; + } + bn -= NDIRECT; + 80002ed8: ff45849b addiw s1,a1,-12 + 80002edc: 0004871b sext.w a4,s1 + + if(bn < NINDIRECT){ + 80002ee0: 0ff00793 li a5,255 + 80002ee4: 06e7ee63 bltu a5,a4,80002f60 + // Load indirect block, allocating if necessary. + if((addr = ip->addrs[NDIRECT]) == 0){ + 80002ee8: 08052903 lw s2,128(a0) + 80002eec: 00091d63 bnez s2,80002f06 + addr = balloc(ip->dev); + 80002ef0: 4108 lw a0,0(a0) + 80002ef2: e89ff0ef jal 80002d7a + 80002ef6: 0005091b sext.w s2,a0 + if(addr == 0) + 80002efa: 02090d63 beqz s2,80002f34 + 80002efe: e052 sd s4,0(sp) + return 0; + ip->addrs[NDIRECT] = addr; + 80002f00: 0929a023 sw s2,128(s3) + 80002f04: a011 j 80002f08 + 80002f06: e052 sd s4,0(sp) + } + bp = bread(ip->dev, addr); + 80002f08: 85ca mv a1,s2 + 80002f0a: 0009a503 lw a0,0(s3) + 80002f0e: c09ff0ef jal 80002b16 + 80002f12: 8a2a mv s4,a0 + a = (uint*)bp->data; + 80002f14: 05850793 addi a5,a0,88 + if((addr = a[bn]) == 0){ + 80002f18: 02049713 slli a4,s1,0x20 + 80002f1c: 01e75593 srli a1,a4,0x1e + 80002f20: 00b784b3 add s1,a5,a1 + 80002f24: 0004a903 lw s2,0(s1) + 80002f28: 00090e63 beqz s2,80002f44 + if(addr){ + a[bn] = addr; + log_write(bp); + } + } + brelse(bp); + 80002f2c: 8552 mv a0,s4 + 80002f2e: cf1ff0ef jal 80002c1e + return addr; + 80002f32: 6a02 ld s4,0(sp) + } + + panic("bmap: out of range"); +} + 80002f34: 854a mv a0,s2 + 80002f36: 70a2 ld ra,40(sp) + 80002f38: 7402 ld s0,32(sp) + 80002f3a: 64e2 ld s1,24(sp) + 80002f3c: 6942 ld s2,16(sp) + 80002f3e: 69a2 ld s3,8(sp) + 80002f40: 6145 addi sp,sp,48 + 80002f42: 8082 ret + addr = balloc(ip->dev); + 80002f44: 0009a503 lw a0,0(s3) + 80002f48: e33ff0ef jal 80002d7a + 80002f4c: 0005091b sext.w s2,a0 + if(addr){ + 80002f50: fc090ee3 beqz s2,80002f2c + a[bn] = addr; + 80002f54: 0124a023 sw s2,0(s1) + log_write(bp); + 80002f58: 8552 mv a0,s4 + 80002f5a: 5f7000ef jal 80003d50 + 80002f5e: b7f9 j 80002f2c + 80002f60: e052 sd s4,0(sp) + panic("bmap: out of range"); + 80002f62: 00004517 auipc a0,0x4 + 80002f66: 49650513 addi a0,a0,1174 # 800073f8 + 80002f6a: 877fd0ef jal 800007e0 + +0000000080002f6e : +{ + 80002f6e: 7179 addi sp,sp,-48 + 80002f70: f406 sd ra,40(sp) + 80002f72: f022 sd s0,32(sp) + 80002f74: ec26 sd s1,24(sp) + 80002f76: e84a sd s2,16(sp) + 80002f78: e44e sd s3,8(sp) + 80002f7a: e052 sd s4,0(sp) + 80002f7c: 1800 addi s0,sp,48 + 80002f7e: 89aa mv s3,a0 + 80002f80: 8a2e mv s4,a1 + acquire(&itable.lock); + 80002f82: 0001e517 auipc a0,0x1e + 80002f86: 85e50513 addi a0,a0,-1954 # 800207e0 + 80002f8a: c45fd0ef jal 80000bce + empty = 0; + 80002f8e: 4901 li s2,0 + for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){ + 80002f90: 0001e497 auipc s1,0x1e + 80002f94: 86848493 addi s1,s1,-1944 # 800207f8 + 80002f98: 0001f697 auipc a3,0x1f + 80002f9c: 2f068693 addi a3,a3,752 # 80022288 + 80002fa0: a039 j 80002fae + if(empty == 0 && ip->ref == 0) // Remember empty slot. + 80002fa2: 02090963 beqz s2,80002fd4 + for(ip = &itable.inode[0]; ip < &itable.inode[NINODE]; ip++){ + 80002fa6: 08848493 addi s1,s1,136 + 80002faa: 02d48863 beq s1,a3,80002fda + if(ip->ref > 0 && ip->dev == dev && ip->inum == inum){ + 80002fae: 449c lw a5,8(s1) + 80002fb0: fef059e3 blez a5,80002fa2 + 80002fb4: 4098 lw a4,0(s1) + 80002fb6: ff3716e3 bne a4,s3,80002fa2 + 80002fba: 40d8 lw a4,4(s1) + 80002fbc: ff4713e3 bne a4,s4,80002fa2 + ip->ref++; + 80002fc0: 2785 addiw a5,a5,1 + 80002fc2: c49c sw a5,8(s1) + release(&itable.lock); + 80002fc4: 0001e517 auipc a0,0x1e + 80002fc8: 81c50513 addi a0,a0,-2020 # 800207e0 + 80002fcc: c9bfd0ef jal 80000c66 + return ip; + 80002fd0: 8926 mv s2,s1 + 80002fd2: a02d j 80002ffc + if(empty == 0 && ip->ref == 0) // Remember empty slot. + 80002fd4: fbe9 bnez a5,80002fa6 + empty = ip; + 80002fd6: 8926 mv s2,s1 + 80002fd8: b7f9 j 80002fa6 + if(empty == 0) + 80002fda: 02090a63 beqz s2,8000300e + ip->dev = dev; + 80002fde: 01392023 sw s3,0(s2) + ip->inum = inum; + 80002fe2: 01492223 sw s4,4(s2) + ip->ref = 1; + 80002fe6: 4785 li a5,1 + 80002fe8: 00f92423 sw a5,8(s2) + ip->valid = 0; + 80002fec: 04092023 sw zero,64(s2) + release(&itable.lock); + 80002ff0: 0001d517 auipc a0,0x1d + 80002ff4: 7f050513 addi a0,a0,2032 # 800207e0 + 80002ff8: c6ffd0ef jal 80000c66 +} + 80002ffc: 854a mv a0,s2 + 80002ffe: 70a2 ld ra,40(sp) + 80003000: 7402 ld s0,32(sp) + 80003002: 64e2 ld s1,24(sp) + 80003004: 6942 ld s2,16(sp) + 80003006: 69a2 ld s3,8(sp) + 80003008: 6a02 ld s4,0(sp) + 8000300a: 6145 addi sp,sp,48 + 8000300c: 8082 ret + panic("iget: no inodes"); + 8000300e: 00004517 auipc a0,0x4 + 80003012: 40250513 addi a0,a0,1026 # 80007410 + 80003016: fcafd0ef jal 800007e0 + +000000008000301a : +{ + 8000301a: 7179 addi sp,sp,-48 + 8000301c: f406 sd ra,40(sp) + 8000301e: f022 sd s0,32(sp) + 80003020: ec26 sd s1,24(sp) + 80003022: e84a sd s2,16(sp) + 80003024: e44e sd s3,8(sp) + 80003026: 1800 addi s0,sp,48 + initlock(&itable.lock, "itable"); + 80003028: 00004597 auipc a1,0x4 + 8000302c: 3f858593 addi a1,a1,1016 # 80007420 + 80003030: 0001d517 auipc a0,0x1d + 80003034: 7b050513 addi a0,a0,1968 # 800207e0 + 80003038: b17fd0ef jal 80000b4e + for(i = 0; i < NINODE; i++) { + 8000303c: 0001d497 auipc s1,0x1d + 80003040: 7cc48493 addi s1,s1,1996 # 80020808 + 80003044: 0001f997 auipc s3,0x1f + 80003048: 25498993 addi s3,s3,596 # 80022298 + initsleeplock(&itable.inode[i].lock, "inode"); + 8000304c: 00004917 auipc s2,0x4 + 80003050: 3dc90913 addi s2,s2,988 # 80007428 + 80003054: 85ca mv a1,s2 + 80003056: 8526 mv a0,s1 + 80003058: 5bb000ef jal 80003e12 + for(i = 0; i < NINODE; i++) { + 8000305c: 08848493 addi s1,s1,136 + 80003060: ff349ae3 bne s1,s3,80003054 +} + 80003064: 70a2 ld ra,40(sp) + 80003066: 7402 ld s0,32(sp) + 80003068: 64e2 ld s1,24(sp) + 8000306a: 6942 ld s2,16(sp) + 8000306c: 69a2 ld s3,8(sp) + 8000306e: 6145 addi sp,sp,48 + 80003070: 8082 ret + +0000000080003072 : +{ + 80003072: 7139 addi sp,sp,-64 + 80003074: fc06 sd ra,56(sp) + 80003076: f822 sd s0,48(sp) + 80003078: 0080 addi s0,sp,64 + for(inum = 1; inum < sb.ninodes; inum++){ + 8000307a: 0001d717 auipc a4,0x1d + 8000307e: 75272703 lw a4,1874(a4) # 800207cc + 80003082: 4785 li a5,1 + 80003084: 06e7f063 bgeu a5,a4,800030e4 + 80003088: f426 sd s1,40(sp) + 8000308a: f04a sd s2,32(sp) + 8000308c: ec4e sd s3,24(sp) + 8000308e: e852 sd s4,16(sp) + 80003090: e456 sd s5,8(sp) + 80003092: e05a sd s6,0(sp) + 80003094: 8aaa mv s5,a0 + 80003096: 8b2e mv s6,a1 + 80003098: 4905 li s2,1 + bp = bread(dev, IBLOCK(inum, sb)); + 8000309a: 0001da17 auipc s4,0x1d + 8000309e: 726a0a13 addi s4,s4,1830 # 800207c0 + 800030a2: 00495593 srli a1,s2,0x4 + 800030a6: 018a2783 lw a5,24(s4) + 800030aa: 9dbd addw a1,a1,a5 + 800030ac: 8556 mv a0,s5 + 800030ae: a69ff0ef jal 80002b16 + 800030b2: 84aa mv s1,a0 + dip = (struct dinode*)bp->data + inum%IPB; + 800030b4: 05850993 addi s3,a0,88 + 800030b8: 00f97793 andi a5,s2,15 + 800030bc: 079a slli a5,a5,0x6 + 800030be: 99be add s3,s3,a5 + if(dip->type == 0){ // a free inode + 800030c0: 00099783 lh a5,0(s3) + 800030c4: cb9d beqz a5,800030fa + brelse(bp); + 800030c6: b59ff0ef jal 80002c1e + for(inum = 1; inum < sb.ninodes; inum++){ + 800030ca: 0905 addi s2,s2,1 + 800030cc: 00ca2703 lw a4,12(s4) + 800030d0: 0009079b sext.w a5,s2 + 800030d4: fce7e7e3 bltu a5,a4,800030a2 + 800030d8: 74a2 ld s1,40(sp) + 800030da: 7902 ld s2,32(sp) + 800030dc: 69e2 ld s3,24(sp) + 800030de: 6a42 ld s4,16(sp) + 800030e0: 6aa2 ld s5,8(sp) + 800030e2: 6b02 ld s6,0(sp) + printf("ialloc: no inodes\n"); + 800030e4: 00004517 auipc a0,0x4 + 800030e8: 34c50513 addi a0,a0,844 # 80007430 + 800030ec: c0efd0ef jal 800004fa + return 0; + 800030f0: 4501 li a0,0 +} + 800030f2: 70e2 ld ra,56(sp) + 800030f4: 7442 ld s0,48(sp) + 800030f6: 6121 addi sp,sp,64 + 800030f8: 8082 ret + memset(dip, 0, sizeof(*dip)); + 800030fa: 04000613 li a2,64 + 800030fe: 4581 li a1,0 + 80003100: 854e mv a0,s3 + 80003102: ba1fd0ef jal 80000ca2 + dip->type = type; + 80003106: 01699023 sh s6,0(s3) + log_write(bp); // mark it allocated on the disk + 8000310a: 8526 mv a0,s1 + 8000310c: 445000ef jal 80003d50 + brelse(bp); + 80003110: 8526 mv a0,s1 + 80003112: b0dff0ef jal 80002c1e + return iget(dev, inum); + 80003116: 0009059b sext.w a1,s2 + 8000311a: 8556 mv a0,s5 + 8000311c: e53ff0ef jal 80002f6e + 80003120: 74a2 ld s1,40(sp) + 80003122: 7902 ld s2,32(sp) + 80003124: 69e2 ld s3,24(sp) + 80003126: 6a42 ld s4,16(sp) + 80003128: 6aa2 ld s5,8(sp) + 8000312a: 6b02 ld s6,0(sp) + 8000312c: b7d9 j 800030f2 + +000000008000312e : +{ + 8000312e: 1101 addi sp,sp,-32 + 80003130: ec06 sd ra,24(sp) + 80003132: e822 sd s0,16(sp) + 80003134: e426 sd s1,8(sp) + 80003136: e04a sd s2,0(sp) + 80003138: 1000 addi s0,sp,32 + 8000313a: 84aa mv s1,a0 + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); + 8000313c: 415c lw a5,4(a0) + 8000313e: 0047d79b srliw a5,a5,0x4 + 80003142: 0001d597 auipc a1,0x1d + 80003146: 6965a583 lw a1,1686(a1) # 800207d8 + 8000314a: 9dbd addw a1,a1,a5 + 8000314c: 4108 lw a0,0(a0) + 8000314e: 9c9ff0ef jal 80002b16 + 80003152: 892a mv s2,a0 + dip = (struct dinode*)bp->data + ip->inum%IPB; + 80003154: 05850793 addi a5,a0,88 + 80003158: 40d8 lw a4,4(s1) + 8000315a: 8b3d andi a4,a4,15 + 8000315c: 071a slli a4,a4,0x6 + 8000315e: 97ba add a5,a5,a4 + dip->type = ip->type; + 80003160: 04449703 lh a4,68(s1) + 80003164: 00e79023 sh a4,0(a5) + dip->major = ip->major; + 80003168: 04649703 lh a4,70(s1) + 8000316c: 00e79123 sh a4,2(a5) + dip->minor = ip->minor; + 80003170: 04849703 lh a4,72(s1) + 80003174: 00e79223 sh a4,4(a5) + dip->nlink = ip->nlink; + 80003178: 04a49703 lh a4,74(s1) + 8000317c: 00e79323 sh a4,6(a5) + dip->size = ip->size; + 80003180: 44f8 lw a4,76(s1) + 80003182: c798 sw a4,8(a5) + memmove(dip->addrs, ip->addrs, sizeof(ip->addrs)); + 80003184: 03400613 li a2,52 + 80003188: 05048593 addi a1,s1,80 + 8000318c: 00c78513 addi a0,a5,12 + 80003190: b6ffd0ef jal 80000cfe + log_write(bp); + 80003194: 854a mv a0,s2 + 80003196: 3bb000ef jal 80003d50 + brelse(bp); + 8000319a: 854a mv a0,s2 + 8000319c: a83ff0ef jal 80002c1e +} + 800031a0: 60e2 ld ra,24(sp) + 800031a2: 6442 ld s0,16(sp) + 800031a4: 64a2 ld s1,8(sp) + 800031a6: 6902 ld s2,0(sp) + 800031a8: 6105 addi sp,sp,32 + 800031aa: 8082 ret + +00000000800031ac : +{ + 800031ac: 1101 addi sp,sp,-32 + 800031ae: ec06 sd ra,24(sp) + 800031b0: e822 sd s0,16(sp) + 800031b2: e426 sd s1,8(sp) + 800031b4: 1000 addi s0,sp,32 + 800031b6: 84aa mv s1,a0 + acquire(&itable.lock); + 800031b8: 0001d517 auipc a0,0x1d + 800031bc: 62850513 addi a0,a0,1576 # 800207e0 + 800031c0: a0ffd0ef jal 80000bce + ip->ref++; + 800031c4: 449c lw a5,8(s1) + 800031c6: 2785 addiw a5,a5,1 + 800031c8: c49c sw a5,8(s1) + release(&itable.lock); + 800031ca: 0001d517 auipc a0,0x1d + 800031ce: 61650513 addi a0,a0,1558 # 800207e0 + 800031d2: a95fd0ef jal 80000c66 +} + 800031d6: 8526 mv a0,s1 + 800031d8: 60e2 ld ra,24(sp) + 800031da: 6442 ld s0,16(sp) + 800031dc: 64a2 ld s1,8(sp) + 800031de: 6105 addi sp,sp,32 + 800031e0: 8082 ret + +00000000800031e2 : +{ + 800031e2: 1101 addi sp,sp,-32 + 800031e4: ec06 sd ra,24(sp) + 800031e6: e822 sd s0,16(sp) + 800031e8: e426 sd s1,8(sp) + 800031ea: 1000 addi s0,sp,32 + if(ip == 0 || ip->ref < 1) + 800031ec: cd19 beqz a0,8000320a + 800031ee: 84aa mv s1,a0 + 800031f0: 451c lw a5,8(a0) + 800031f2: 00f05c63 blez a5,8000320a + acquiresleep(&ip->lock); + 800031f6: 0541 addi a0,a0,16 + 800031f8: 451000ef jal 80003e48 + if(ip->valid == 0){ + 800031fc: 40bc lw a5,64(s1) + 800031fe: cf89 beqz a5,80003218 +} + 80003200: 60e2 ld ra,24(sp) + 80003202: 6442 ld s0,16(sp) + 80003204: 64a2 ld s1,8(sp) + 80003206: 6105 addi sp,sp,32 + 80003208: 8082 ret + 8000320a: e04a sd s2,0(sp) + panic("ilock"); + 8000320c: 00004517 auipc a0,0x4 + 80003210: 23c50513 addi a0,a0,572 # 80007448 + 80003214: dccfd0ef jal 800007e0 + 80003218: e04a sd s2,0(sp) + bp = bread(ip->dev, IBLOCK(ip->inum, sb)); + 8000321a: 40dc lw a5,4(s1) + 8000321c: 0047d79b srliw a5,a5,0x4 + 80003220: 0001d597 auipc a1,0x1d + 80003224: 5b85a583 lw a1,1464(a1) # 800207d8 + 80003228: 9dbd addw a1,a1,a5 + 8000322a: 4088 lw a0,0(s1) + 8000322c: 8ebff0ef jal 80002b16 + 80003230: 892a mv s2,a0 + dip = (struct dinode*)bp->data + ip->inum%IPB; + 80003232: 05850593 addi a1,a0,88 + 80003236: 40dc lw a5,4(s1) + 80003238: 8bbd andi a5,a5,15 + 8000323a: 079a slli a5,a5,0x6 + 8000323c: 95be add a1,a1,a5 + ip->type = dip->type; + 8000323e: 00059783 lh a5,0(a1) + 80003242: 04f49223 sh a5,68(s1) + ip->major = dip->major; + 80003246: 00259783 lh a5,2(a1) + 8000324a: 04f49323 sh a5,70(s1) + ip->minor = dip->minor; + 8000324e: 00459783 lh a5,4(a1) + 80003252: 04f49423 sh a5,72(s1) + ip->nlink = dip->nlink; + 80003256: 00659783 lh a5,6(a1) + 8000325a: 04f49523 sh a5,74(s1) + ip->size = dip->size; + 8000325e: 459c lw a5,8(a1) + 80003260: c4fc sw a5,76(s1) + memmove(ip->addrs, dip->addrs, sizeof(ip->addrs)); + 80003262: 03400613 li a2,52 + 80003266: 05b1 addi a1,a1,12 + 80003268: 05048513 addi a0,s1,80 + 8000326c: a93fd0ef jal 80000cfe + brelse(bp); + 80003270: 854a mv a0,s2 + 80003272: 9adff0ef jal 80002c1e + ip->valid = 1; + 80003276: 4785 li a5,1 + 80003278: c0bc sw a5,64(s1) + if(ip->type == 0) + 8000327a: 04449783 lh a5,68(s1) + 8000327e: c399 beqz a5,80003284 + 80003280: 6902 ld s2,0(sp) + 80003282: bfbd j 80003200 + panic("ilock: no type"); + 80003284: 00004517 auipc a0,0x4 + 80003288: 1cc50513 addi a0,a0,460 # 80007450 + 8000328c: d54fd0ef jal 800007e0 + +0000000080003290 : +{ + 80003290: 1101 addi sp,sp,-32 + 80003292: ec06 sd ra,24(sp) + 80003294: e822 sd s0,16(sp) + 80003296: e426 sd s1,8(sp) + 80003298: e04a sd s2,0(sp) + 8000329a: 1000 addi s0,sp,32 + if(ip == 0 || !holdingsleep(&ip->lock) || ip->ref < 1) + 8000329c: c505 beqz a0,800032c4 + 8000329e: 84aa mv s1,a0 + 800032a0: 01050913 addi s2,a0,16 + 800032a4: 854a mv a0,s2 + 800032a6: 421000ef jal 80003ec6 + 800032aa: cd09 beqz a0,800032c4 + 800032ac: 449c lw a5,8(s1) + 800032ae: 00f05b63 blez a5,800032c4 + releasesleep(&ip->lock); + 800032b2: 854a mv a0,s2 + 800032b4: 3db000ef jal 80003e8e +} + 800032b8: 60e2 ld ra,24(sp) + 800032ba: 6442 ld s0,16(sp) + 800032bc: 64a2 ld s1,8(sp) + 800032be: 6902 ld s2,0(sp) + 800032c0: 6105 addi sp,sp,32 + 800032c2: 8082 ret + panic("iunlock"); + 800032c4: 00004517 auipc a0,0x4 + 800032c8: 19c50513 addi a0,a0,412 # 80007460 + 800032cc: d14fd0ef jal 800007e0 + +00000000800032d0 : + +// Truncate inode (discard contents). +// Caller must hold ip->lock. +void +itrunc(struct inode *ip) +{ + 800032d0: 7179 addi sp,sp,-48 + 800032d2: f406 sd ra,40(sp) + 800032d4: f022 sd s0,32(sp) + 800032d6: ec26 sd s1,24(sp) + 800032d8: e84a sd s2,16(sp) + 800032da: e44e sd s3,8(sp) + 800032dc: 1800 addi s0,sp,48 + 800032de: 89aa mv s3,a0 + int i, j; + struct buf *bp; + uint *a; + + for(i = 0; i < NDIRECT; i++){ + 800032e0: 05050493 addi s1,a0,80 + 800032e4: 08050913 addi s2,a0,128 + 800032e8: a021 j 800032f0 + 800032ea: 0491 addi s1,s1,4 + 800032ec: 01248b63 beq s1,s2,80003302 + if(ip->addrs[i]){ + 800032f0: 408c lw a1,0(s1) + 800032f2: dde5 beqz a1,800032ea + bfree(ip->dev, ip->addrs[i]); + 800032f4: 0009a503 lw a0,0(s3) + 800032f8: a17ff0ef jal 80002d0e + ip->addrs[i] = 0; + 800032fc: 0004a023 sw zero,0(s1) + 80003300: b7ed j 800032ea + } + } + + if(ip->addrs[NDIRECT]){ + 80003302: 0809a583 lw a1,128(s3) + 80003306: ed89 bnez a1,80003320 + brelse(bp); + bfree(ip->dev, ip->addrs[NDIRECT]); + ip->addrs[NDIRECT] = 0; + } + + ip->size = 0; + 80003308: 0409a623 sw zero,76(s3) + iupdate(ip); + 8000330c: 854e mv a0,s3 + 8000330e: e21ff0ef jal 8000312e +} + 80003312: 70a2 ld ra,40(sp) + 80003314: 7402 ld s0,32(sp) + 80003316: 64e2 ld s1,24(sp) + 80003318: 6942 ld s2,16(sp) + 8000331a: 69a2 ld s3,8(sp) + 8000331c: 6145 addi sp,sp,48 + 8000331e: 8082 ret + 80003320: e052 sd s4,0(sp) + bp = bread(ip->dev, ip->addrs[NDIRECT]); + 80003322: 0009a503 lw a0,0(s3) + 80003326: ff0ff0ef jal 80002b16 + 8000332a: 8a2a mv s4,a0 + for(j = 0; j < NINDIRECT; j++){ + 8000332c: 05850493 addi s1,a0,88 + 80003330: 45850913 addi s2,a0,1112 + 80003334: a021 j 8000333c + 80003336: 0491 addi s1,s1,4 + 80003338: 01248963 beq s1,s2,8000334a + if(a[j]) + 8000333c: 408c lw a1,0(s1) + 8000333e: dde5 beqz a1,80003336 + bfree(ip->dev, a[j]); + 80003340: 0009a503 lw a0,0(s3) + 80003344: 9cbff0ef jal 80002d0e + 80003348: b7fd j 80003336 + brelse(bp); + 8000334a: 8552 mv a0,s4 + 8000334c: 8d3ff0ef jal 80002c1e + bfree(ip->dev, ip->addrs[NDIRECT]); + 80003350: 0809a583 lw a1,128(s3) + 80003354: 0009a503 lw a0,0(s3) + 80003358: 9b7ff0ef jal 80002d0e + ip->addrs[NDIRECT] = 0; + 8000335c: 0809a023 sw zero,128(s3) + 80003360: 6a02 ld s4,0(sp) + 80003362: b75d j 80003308 + +0000000080003364 : +{ + 80003364: 1101 addi sp,sp,-32 + 80003366: ec06 sd ra,24(sp) + 80003368: e822 sd s0,16(sp) + 8000336a: e426 sd s1,8(sp) + 8000336c: 1000 addi s0,sp,32 + 8000336e: 84aa mv s1,a0 + acquire(&itable.lock); + 80003370: 0001d517 auipc a0,0x1d + 80003374: 47050513 addi a0,a0,1136 # 800207e0 + 80003378: 857fd0ef jal 80000bce + if(ip->ref == 1 && ip->valid && ip->nlink == 0){ + 8000337c: 4498 lw a4,8(s1) + 8000337e: 4785 li a5,1 + 80003380: 02f70063 beq a4,a5,800033a0 + ip->ref--; + 80003384: 449c lw a5,8(s1) + 80003386: 37fd addiw a5,a5,-1 + 80003388: c49c sw a5,8(s1) + release(&itable.lock); + 8000338a: 0001d517 auipc a0,0x1d + 8000338e: 45650513 addi a0,a0,1110 # 800207e0 + 80003392: 8d5fd0ef jal 80000c66 +} + 80003396: 60e2 ld ra,24(sp) + 80003398: 6442 ld s0,16(sp) + 8000339a: 64a2 ld s1,8(sp) + 8000339c: 6105 addi sp,sp,32 + 8000339e: 8082 ret + if(ip->ref == 1 && ip->valid && ip->nlink == 0){ + 800033a0: 40bc lw a5,64(s1) + 800033a2: d3ed beqz a5,80003384 + 800033a4: 04a49783 lh a5,74(s1) + 800033a8: fff1 bnez a5,80003384 + 800033aa: e04a sd s2,0(sp) + acquiresleep(&ip->lock); + 800033ac: 01048913 addi s2,s1,16 + 800033b0: 854a mv a0,s2 + 800033b2: 297000ef jal 80003e48 + release(&itable.lock); + 800033b6: 0001d517 auipc a0,0x1d + 800033ba: 42a50513 addi a0,a0,1066 # 800207e0 + 800033be: 8a9fd0ef jal 80000c66 + itrunc(ip); + 800033c2: 8526 mv a0,s1 + 800033c4: f0dff0ef jal 800032d0 + ip->type = 0; + 800033c8: 04049223 sh zero,68(s1) + iupdate(ip); + 800033cc: 8526 mv a0,s1 + 800033ce: d61ff0ef jal 8000312e + ip->valid = 0; + 800033d2: 0404a023 sw zero,64(s1) + releasesleep(&ip->lock); + 800033d6: 854a mv a0,s2 + 800033d8: 2b7000ef jal 80003e8e + acquire(&itable.lock); + 800033dc: 0001d517 auipc a0,0x1d + 800033e0: 40450513 addi a0,a0,1028 # 800207e0 + 800033e4: feafd0ef jal 80000bce + 800033e8: 6902 ld s2,0(sp) + 800033ea: bf69 j 80003384 + +00000000800033ec : +{ + 800033ec: 1101 addi sp,sp,-32 + 800033ee: ec06 sd ra,24(sp) + 800033f0: e822 sd s0,16(sp) + 800033f2: e426 sd s1,8(sp) + 800033f4: 1000 addi s0,sp,32 + 800033f6: 84aa mv s1,a0 + iunlock(ip); + 800033f8: e99ff0ef jal 80003290 + iput(ip); + 800033fc: 8526 mv a0,s1 + 800033fe: f67ff0ef jal 80003364 +} + 80003402: 60e2 ld ra,24(sp) + 80003404: 6442 ld s0,16(sp) + 80003406: 64a2 ld s1,8(sp) + 80003408: 6105 addi sp,sp,32 + 8000340a: 8082 ret + +000000008000340c : + for (int inum = 1; inum < sb.ninodes; inum++) { + 8000340c: 0001d717 auipc a4,0x1d + 80003410: 3c072703 lw a4,960(a4) # 800207cc + 80003414: 4785 li a5,1 + 80003416: 0ae7ff63 bgeu a5,a4,800034d4 +{ + 8000341a: 7139 addi sp,sp,-64 + 8000341c: fc06 sd ra,56(sp) + 8000341e: f822 sd s0,48(sp) + 80003420: f426 sd s1,40(sp) + 80003422: f04a sd s2,32(sp) + 80003424: ec4e sd s3,24(sp) + 80003426: e852 sd s4,16(sp) + 80003428: e456 sd s5,8(sp) + 8000342a: e05a sd s6,0(sp) + 8000342c: 0080 addi s0,sp,64 + for (int inum = 1; inum < sb.ninodes; inum++) { + 8000342e: 4485 li s1,1 + struct buf *bp = bread(dev, IBLOCK(inum, sb)); + 80003430: 00050a1b sext.w s4,a0 + 80003434: 0001da97 auipc s5,0x1d + 80003438: 38ca8a93 addi s5,s5,908 # 800207c0 + printf("ireclaim: orphaned inode %d\n", inum); + 8000343c: 00004b17 auipc s6,0x4 + 80003440: 02cb0b13 addi s6,s6,44 # 80007468 + 80003444: a099 j 8000348a + 80003446: 85ce mv a1,s3 + 80003448: 855a mv a0,s6 + 8000344a: 8b0fd0ef jal 800004fa + ip = iget(dev, inum); + 8000344e: 85ce mv a1,s3 + 80003450: 8552 mv a0,s4 + 80003452: b1dff0ef jal 80002f6e + 80003456: 89aa mv s3,a0 + brelse(bp); + 80003458: 854a mv a0,s2 + 8000345a: fc4ff0ef jal 80002c1e + if (ip) { + 8000345e: 00098f63 beqz s3,8000347c + begin_op(); + 80003462: 76a000ef jal 80003bcc + ilock(ip); + 80003466: 854e mv a0,s3 + 80003468: d7bff0ef jal 800031e2 + iunlock(ip); + 8000346c: 854e mv a0,s3 + 8000346e: e23ff0ef jal 80003290 + iput(ip); + 80003472: 854e mv a0,s3 + 80003474: ef1ff0ef jal 80003364 + end_op(); + 80003478: 7be000ef jal 80003c36 + for (int inum = 1; inum < sb.ninodes; inum++) { + 8000347c: 0485 addi s1,s1,1 + 8000347e: 00caa703 lw a4,12(s5) + 80003482: 0004879b sext.w a5,s1 + 80003486: 02e7fd63 bgeu a5,a4,800034c0 + 8000348a: 0004899b sext.w s3,s1 + struct buf *bp = bread(dev, IBLOCK(inum, sb)); + 8000348e: 0044d593 srli a1,s1,0x4 + 80003492: 018aa783 lw a5,24(s5) + 80003496: 9dbd addw a1,a1,a5 + 80003498: 8552 mv a0,s4 + 8000349a: e7cff0ef jal 80002b16 + 8000349e: 892a mv s2,a0 + struct dinode *dip = (struct dinode *)bp->data + inum % IPB; + 800034a0: 05850793 addi a5,a0,88 + 800034a4: 00f9f713 andi a4,s3,15 + 800034a8: 071a slli a4,a4,0x6 + 800034aa: 97ba add a5,a5,a4 + if (dip->type != 0 && dip->nlink == 0) { // is an orphaned inode + 800034ac: 00079703 lh a4,0(a5) + 800034b0: c701 beqz a4,800034b8 + 800034b2: 00679783 lh a5,6(a5) + 800034b6: dbc1 beqz a5,80003446 + brelse(bp); + 800034b8: 854a mv a0,s2 + 800034ba: f64ff0ef jal 80002c1e + if (ip) { + 800034be: bf7d j 8000347c +} + 800034c0: 70e2 ld ra,56(sp) + 800034c2: 7442 ld s0,48(sp) + 800034c4: 74a2 ld s1,40(sp) + 800034c6: 7902 ld s2,32(sp) + 800034c8: 69e2 ld s3,24(sp) + 800034ca: 6a42 ld s4,16(sp) + 800034cc: 6aa2 ld s5,8(sp) + 800034ce: 6b02 ld s6,0(sp) + 800034d0: 6121 addi sp,sp,64 + 800034d2: 8082 ret + 800034d4: 8082 ret + +00000000800034d6 : +fsinit(int dev) { + 800034d6: 7179 addi sp,sp,-48 + 800034d8: f406 sd ra,40(sp) + 800034da: f022 sd s0,32(sp) + 800034dc: ec26 sd s1,24(sp) + 800034de: e84a sd s2,16(sp) + 800034e0: e44e sd s3,8(sp) + 800034e2: 1800 addi s0,sp,48 + 800034e4: 84aa mv s1,a0 + bp = bread(dev, 1); + 800034e6: 4585 li a1,1 + 800034e8: e2eff0ef jal 80002b16 + 800034ec: 892a mv s2,a0 + memmove(sb, bp->data, sizeof(*sb)); + 800034ee: 0001d997 auipc s3,0x1d + 800034f2: 2d298993 addi s3,s3,722 # 800207c0 + 800034f6: 02000613 li a2,32 + 800034fa: 05850593 addi a1,a0,88 + 800034fe: 854e mv a0,s3 + 80003500: ffefd0ef jal 80000cfe + brelse(bp); + 80003504: 854a mv a0,s2 + 80003506: f18ff0ef jal 80002c1e + if(sb.magic != FSMAGIC) + 8000350a: 0009a703 lw a4,0(s3) + 8000350e: 102037b7 lui a5,0x10203 + 80003512: 04078793 addi a5,a5,64 # 10203040 <_entry-0x6fdfcfc0> + 80003516: 02f71363 bne a4,a5,8000353c + initlog(dev, &sb); + 8000351a: 0001d597 auipc a1,0x1d + 8000351e: 2a658593 addi a1,a1,678 # 800207c0 + 80003522: 8526 mv a0,s1 + 80003524: 62a000ef jal 80003b4e + ireclaim(dev); + 80003528: 8526 mv a0,s1 + 8000352a: ee3ff0ef jal 8000340c +} + 8000352e: 70a2 ld ra,40(sp) + 80003530: 7402 ld s0,32(sp) + 80003532: 64e2 ld s1,24(sp) + 80003534: 6942 ld s2,16(sp) + 80003536: 69a2 ld s3,8(sp) + 80003538: 6145 addi sp,sp,48 + 8000353a: 8082 ret + panic("invalid file system"); + 8000353c: 00004517 auipc a0,0x4 + 80003540: f4c50513 addi a0,a0,-180 # 80007488 + 80003544: a9cfd0ef jal 800007e0 + +0000000080003548 : + +// Copy stat information from inode. +// Caller must hold ip->lock. +void +stati(struct inode *ip, struct stat *st) +{ + 80003548: 1141 addi sp,sp,-16 + 8000354a: e422 sd s0,8(sp) + 8000354c: 0800 addi s0,sp,16 + st->dev = ip->dev; + 8000354e: 411c lw a5,0(a0) + 80003550: c19c sw a5,0(a1) + st->ino = ip->inum; + 80003552: 415c lw a5,4(a0) + 80003554: c1dc sw a5,4(a1) + st->type = ip->type; + 80003556: 04451783 lh a5,68(a0) + 8000355a: 00f59423 sh a5,8(a1) + st->nlink = ip->nlink; + 8000355e: 04a51783 lh a5,74(a0) + 80003562: 00f59523 sh a5,10(a1) + st->size = ip->size; + 80003566: 04c56783 lwu a5,76(a0) + 8000356a: e99c sd a5,16(a1) +} + 8000356c: 6422 ld s0,8(sp) + 8000356e: 0141 addi sp,sp,16 + 80003570: 8082 ret + +0000000080003572 : +readi(struct inode *ip, int user_dst, uint64 dst, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) + 80003572: 457c lw a5,76(a0) + 80003574: 0ed7eb63 bltu a5,a3,8000366a +{ + 80003578: 7159 addi sp,sp,-112 + 8000357a: f486 sd ra,104(sp) + 8000357c: f0a2 sd s0,96(sp) + 8000357e: eca6 sd s1,88(sp) + 80003580: e0d2 sd s4,64(sp) + 80003582: fc56 sd s5,56(sp) + 80003584: f85a sd s6,48(sp) + 80003586: f45e sd s7,40(sp) + 80003588: 1880 addi s0,sp,112 + 8000358a: 8b2a mv s6,a0 + 8000358c: 8bae mv s7,a1 + 8000358e: 8a32 mv s4,a2 + 80003590: 84b6 mv s1,a3 + 80003592: 8aba mv s5,a4 + if(off > ip->size || off + n < off) + 80003594: 9f35 addw a4,a4,a3 + return 0; + 80003596: 4501 li a0,0 + if(off > ip->size || off + n < off) + 80003598: 0cd76063 bltu a4,a3,80003658 + 8000359c: e4ce sd s3,72(sp) + if(off + n > ip->size) + 8000359e: 00e7f463 bgeu a5,a4,800035a6 + n = ip->size - off; + 800035a2: 40d78abb subw s5,a5,a3 + + for(tot=0; tot + 800035aa: e8ca sd s2,80(sp) + 800035ac: f062 sd s8,32(sp) + 800035ae: ec66 sd s9,24(sp) + 800035b0: e86a sd s10,16(sp) + 800035b2: e46e sd s11,8(sp) + 800035b4: 4981 li s3,0 + uint addr = bmap(ip, off/BSIZE); + if(addr == 0) + break; + bp = bread(ip->dev, addr); + m = min(n - tot, BSIZE - off%BSIZE); + 800035b6: 40000c93 li s9,1024 + if(either_copyout(user_dst, dst, bp->data + (off % BSIZE), m) == -1) { + 800035ba: 5c7d li s8,-1 + 800035bc: a80d j 800035ee + 800035be: 020d1d93 slli s11,s10,0x20 + 800035c2: 020ddd93 srli s11,s11,0x20 + 800035c6: 05890613 addi a2,s2,88 + 800035ca: 86ee mv a3,s11 + 800035cc: 963a add a2,a2,a4 + 800035ce: 85d2 mv a1,s4 + 800035d0: 855e mv a0,s7 + 800035d2: c63fe0ef jal 80002234 + 800035d6: 05850763 beq a0,s8,80003624 + brelse(bp); + tot = -1; + break; + } + brelse(bp); + 800035da: 854a mv a0,s2 + 800035dc: e42ff0ef jal 80002c1e + for(tot=0; tot + uint addr = bmap(ip, off/BSIZE); + 800035ee: 00a4d59b srliw a1,s1,0xa + 800035f2: 855a mv a0,s6 + 800035f4: 8a7ff0ef jal 80002e9a + 800035f8: 0005059b sext.w a1,a0 + if(addr == 0) + 800035fc: c5b1 beqz a1,80003648 + bp = bread(ip->dev, addr); + 800035fe: 000b2503 lw a0,0(s6) + 80003602: d14ff0ef jal 80002b16 + 80003606: 892a mv s2,a0 + m = min(n - tot, BSIZE - off%BSIZE); + 80003608: 3ff4f713 andi a4,s1,1023 + 8000360c: 40ec87bb subw a5,s9,a4 + 80003610: 413a86bb subw a3,s5,s3 + 80003614: 8d3e mv s10,a5 + 80003616: 2781 sext.w a5,a5 + 80003618: 0006861b sext.w a2,a3 + 8000361c: faf671e3 bgeu a2,a5,800035be + 80003620: 8d36 mv s10,a3 + 80003622: bf71 j 800035be + brelse(bp); + 80003624: 854a mv a0,s2 + 80003626: df8ff0ef jal 80002c1e + tot = -1; + 8000362a: 59fd li s3,-1 + break; + 8000362c: 6946 ld s2,80(sp) + 8000362e: 7c02 ld s8,32(sp) + 80003630: 6ce2 ld s9,24(sp) + 80003632: 6d42 ld s10,16(sp) + 80003634: 6da2 ld s11,8(sp) + 80003636: a831 j 80003652 + 80003638: 6946 ld s2,80(sp) + 8000363a: 7c02 ld s8,32(sp) + 8000363c: 6ce2 ld s9,24(sp) + 8000363e: 6d42 ld s10,16(sp) + 80003640: 6da2 ld s11,8(sp) + 80003642: a801 j 80003652 + for(tot=0; tot + 80003648: 6946 ld s2,80(sp) + 8000364a: 7c02 ld s8,32(sp) + 8000364c: 6ce2 ld s9,24(sp) + 8000364e: 6d42 ld s10,16(sp) + 80003650: 6da2 ld s11,8(sp) + } + return tot; + 80003652: 0009851b sext.w a0,s3 + 80003656: 69a6 ld s3,72(sp) +} + 80003658: 70a6 ld ra,104(sp) + 8000365a: 7406 ld s0,96(sp) + 8000365c: 64e6 ld s1,88(sp) + 8000365e: 6a06 ld s4,64(sp) + 80003660: 7ae2 ld s5,56(sp) + 80003662: 7b42 ld s6,48(sp) + 80003664: 7ba2 ld s7,40(sp) + 80003666: 6165 addi sp,sp,112 + 80003668: 8082 ret + return 0; + 8000366a: 4501 li a0,0 +} + 8000366c: 8082 ret + +000000008000366e : +writei(struct inode *ip, int user_src, uint64 src, uint off, uint n) +{ + uint tot, m; + struct buf *bp; + + if(off > ip->size || off + n < off) + 8000366e: 457c lw a5,76(a0) + 80003670: 10d7e063 bltu a5,a3,80003770 +{ + 80003674: 7159 addi sp,sp,-112 + 80003676: f486 sd ra,104(sp) + 80003678: f0a2 sd s0,96(sp) + 8000367a: e8ca sd s2,80(sp) + 8000367c: e0d2 sd s4,64(sp) + 8000367e: fc56 sd s5,56(sp) + 80003680: f85a sd s6,48(sp) + 80003682: f45e sd s7,40(sp) + 80003684: 1880 addi s0,sp,112 + 80003686: 8aaa mv s5,a0 + 80003688: 8bae mv s7,a1 + 8000368a: 8a32 mv s4,a2 + 8000368c: 8936 mv s2,a3 + 8000368e: 8b3a mv s6,a4 + if(off > ip->size || off + n < off) + 80003690: 00e687bb addw a5,a3,a4 + 80003694: 0ed7e063 bltu a5,a3,80003774 + return -1; + if(off + n > MAXFILE*BSIZE) + 80003698: 00043737 lui a4,0x43 + 8000369c: 0cf76e63 bltu a4,a5,80003778 + 800036a0: e4ce sd s3,72(sp) + return -1; + + for(tot=0; tot + 800036a6: eca6 sd s1,88(sp) + 800036a8: f062 sd s8,32(sp) + 800036aa: ec66 sd s9,24(sp) + 800036ac: e86a sd s10,16(sp) + 800036ae: e46e sd s11,8(sp) + 800036b0: 4981 li s3,0 + uint addr = bmap(ip, off/BSIZE); + if(addr == 0) + break; + bp = bread(ip->dev, addr); + m = min(n - tot, BSIZE - off%BSIZE); + 800036b2: 40000c93 li s9,1024 + if(either_copyin(bp->data + (off % BSIZE), user_src, src, m) == -1) { + 800036b6: 5c7d li s8,-1 + 800036b8: a825 j 800036f0 + 800036ba: 020d1d93 slli s11,s10,0x20 + 800036be: 020ddd93 srli s11,s11,0x20 + 800036c2: 05848513 addi a0,s1,88 + 800036c6: 86ee mv a3,s11 + 800036c8: 8652 mv a2,s4 + 800036ca: 85de mv a1,s7 + 800036cc: 953a add a0,a0,a4 + 800036ce: bb1fe0ef jal 8000227e + 800036d2: 05850a63 beq a0,s8,80003726 + brelse(bp); + break; + } + log_write(bp); + 800036d6: 8526 mv a0,s1 + 800036d8: 678000ef jal 80003d50 + brelse(bp); + 800036dc: 8526 mv a0,s1 + 800036de: d40ff0ef jal 80002c1e + for(tot=0; tot + uint addr = bmap(ip, off/BSIZE); + 800036f0: 00a9559b srliw a1,s2,0xa + 800036f4: 8556 mv a0,s5 + 800036f6: fa4ff0ef jal 80002e9a + 800036fa: 0005059b sext.w a1,a0 + if(addr == 0) + 800036fe: c59d beqz a1,8000372c + bp = bread(ip->dev, addr); + 80003700: 000aa503 lw a0,0(s5) + 80003704: c12ff0ef jal 80002b16 + 80003708: 84aa mv s1,a0 + m = min(n - tot, BSIZE - off%BSIZE); + 8000370a: 3ff97713 andi a4,s2,1023 + 8000370e: 40ec87bb subw a5,s9,a4 + 80003712: 413b06bb subw a3,s6,s3 + 80003716: 8d3e mv s10,a5 + 80003718: 2781 sext.w a5,a5 + 8000371a: 0006861b sext.w a2,a3 + 8000371e: f8f67ee3 bgeu a2,a5,800036ba + 80003722: 8d36 mv s10,a3 + 80003724: bf59 j 800036ba + brelse(bp); + 80003726: 8526 mv a0,s1 + 80003728: cf6ff0ef jal 80002c1e + } + + if(off > ip->size) + 8000372c: 04caa783 lw a5,76(s5) + 80003730: 0327fa63 bgeu a5,s2,80003764 + ip->size = off; + 80003734: 052aa623 sw s2,76(s5) + 80003738: 64e6 ld s1,88(sp) + 8000373a: 7c02 ld s8,32(sp) + 8000373c: 6ce2 ld s9,24(sp) + 8000373e: 6d42 ld s10,16(sp) + 80003740: 6da2 ld s11,8(sp) + + // write the i-node back to disk even if the size didn't change + // because the loop above might have called bmap() and added a new + // block to ip->addrs[]. + iupdate(ip); + 80003742: 8556 mv a0,s5 + 80003744: 9ebff0ef jal 8000312e + + return tot; + 80003748: 0009851b sext.w a0,s3 + 8000374c: 69a6 ld s3,72(sp) +} + 8000374e: 70a6 ld ra,104(sp) + 80003750: 7406 ld s0,96(sp) + 80003752: 6946 ld s2,80(sp) + 80003754: 6a06 ld s4,64(sp) + 80003756: 7ae2 ld s5,56(sp) + 80003758: 7b42 ld s6,48(sp) + 8000375a: 7ba2 ld s7,40(sp) + 8000375c: 6165 addi sp,sp,112 + 8000375e: 8082 ret + for(tot=0; tot + 80003764: 64e6 ld s1,88(sp) + 80003766: 7c02 ld s8,32(sp) + 80003768: 6ce2 ld s9,24(sp) + 8000376a: 6d42 ld s10,16(sp) + 8000376c: 6da2 ld s11,8(sp) + 8000376e: bfd1 j 80003742 + return -1; + 80003770: 557d li a0,-1 +} + 80003772: 8082 ret + return -1; + 80003774: 557d li a0,-1 + 80003776: bfe1 j 8000374e + return -1; + 80003778: 557d li a0,-1 + 8000377a: bfd1 j 8000374e + +000000008000377c : + +// Directories + +int +namecmp(const char *s, const char *t) +{ + 8000377c: 1141 addi sp,sp,-16 + 8000377e: e406 sd ra,8(sp) + 80003780: e022 sd s0,0(sp) + 80003782: 0800 addi s0,sp,16 + return strncmp(s, t, DIRSIZ); + 80003784: 4639 li a2,14 + 80003786: de8fd0ef jal 80000d6e +} + 8000378a: 60a2 ld ra,8(sp) + 8000378c: 6402 ld s0,0(sp) + 8000378e: 0141 addi sp,sp,16 + 80003790: 8082 ret + +0000000080003792 : + +// Look for a directory entry in a directory. +// If found, set *poff to byte offset of entry. +struct inode* +dirlookup(struct inode *dp, char *name, uint *poff) +{ + 80003792: 7139 addi sp,sp,-64 + 80003794: fc06 sd ra,56(sp) + 80003796: f822 sd s0,48(sp) + 80003798: f426 sd s1,40(sp) + 8000379a: f04a sd s2,32(sp) + 8000379c: ec4e sd s3,24(sp) + 8000379e: e852 sd s4,16(sp) + 800037a0: 0080 addi s0,sp,64 + uint off, inum; + struct dirent de; + + if(dp->type != T_DIR) + 800037a2: 04451703 lh a4,68(a0) + 800037a6: 4785 li a5,1 + 800037a8: 00f71a63 bne a4,a5,800037bc + 800037ac: 892a mv s2,a0 + 800037ae: 89ae mv s3,a1 + 800037b0: 8a32 mv s4,a2 + panic("dirlookup not DIR"); + + for(off = 0; off < dp->size; off += sizeof(de)){ + 800037b2: 457c lw a5,76(a0) + 800037b4: 4481 li s1,0 + inum = de.inum; + return iget(dp->dev, inum); + } + } + + return 0; + 800037b6: 4501 li a0,0 + for(off = 0; off < dp->size; off += sizeof(de)){ + 800037b8: e39d bnez a5,800037de + 800037ba: a095 j 8000381e + panic("dirlookup not DIR"); + 800037bc: 00004517 auipc a0,0x4 + 800037c0: ce450513 addi a0,a0,-796 # 800074a0 + 800037c4: 81cfd0ef jal 800007e0 + panic("dirlookup read"); + 800037c8: 00004517 auipc a0,0x4 + 800037cc: cf050513 addi a0,a0,-784 # 800074b8 + 800037d0: 810fd0ef jal 800007e0 + for(off = 0; off < dp->size; off += sizeof(de)){ + 800037d4: 24c1 addiw s1,s1,16 + 800037d6: 04c92783 lw a5,76(s2) + 800037da: 04f4f163 bgeu s1,a5,8000381c + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 800037de: 4741 li a4,16 + 800037e0: 86a6 mv a3,s1 + 800037e2: fc040613 addi a2,s0,-64 + 800037e6: 4581 li a1,0 + 800037e8: 854a mv a0,s2 + 800037ea: d89ff0ef jal 80003572 + 800037ee: 47c1 li a5,16 + 800037f0: fcf51ce3 bne a0,a5,800037c8 + if(de.inum == 0) + 800037f4: fc045783 lhu a5,-64(s0) + 800037f8: dff1 beqz a5,800037d4 + if(namecmp(name, de.name) == 0){ + 800037fa: fc240593 addi a1,s0,-62 + 800037fe: 854e mv a0,s3 + 80003800: f7dff0ef jal 8000377c + 80003804: f961 bnez a0,800037d4 + if(poff) + 80003806: 000a0463 beqz s4,8000380e + *poff = off; + 8000380a: 009a2023 sw s1,0(s4) + return iget(dp->dev, inum); + 8000380e: fc045583 lhu a1,-64(s0) + 80003812: 00092503 lw a0,0(s2) + 80003816: f58ff0ef jal 80002f6e + 8000381a: a011 j 8000381e + return 0; + 8000381c: 4501 li a0,0 +} + 8000381e: 70e2 ld ra,56(sp) + 80003820: 7442 ld s0,48(sp) + 80003822: 74a2 ld s1,40(sp) + 80003824: 7902 ld s2,32(sp) + 80003826: 69e2 ld s3,24(sp) + 80003828: 6a42 ld s4,16(sp) + 8000382a: 6121 addi sp,sp,64 + 8000382c: 8082 ret + +000000008000382e : +// If parent != 0, return the inode for the parent and copy the final +// path element into name, which must have room for DIRSIZ bytes. +// Must be called inside a transaction since it calls iput(). +static struct inode* +namex(char *path, int nameiparent, char *name) +{ + 8000382e: 711d addi sp,sp,-96 + 80003830: ec86 sd ra,88(sp) + 80003832: e8a2 sd s0,80(sp) + 80003834: e4a6 sd s1,72(sp) + 80003836: e0ca sd s2,64(sp) + 80003838: fc4e sd s3,56(sp) + 8000383a: f852 sd s4,48(sp) + 8000383c: f456 sd s5,40(sp) + 8000383e: f05a sd s6,32(sp) + 80003840: ec5e sd s7,24(sp) + 80003842: e862 sd s8,16(sp) + 80003844: e466 sd s9,8(sp) + 80003846: 1080 addi s0,sp,96 + 80003848: 84aa mv s1,a0 + 8000384a: 8b2e mv s6,a1 + 8000384c: 8ab2 mv s5,a2 + struct inode *ip, *next; + + if(*path == '/') + 8000384e: 00054703 lbu a4,0(a0) + 80003852: 02f00793 li a5,47 + 80003856: 00f70e63 beq a4,a5,80003872 + ip = iget(ROOTDEV, ROOTINO); + else + ip = idup(myproc()->cwd); + 8000385a: 874fe0ef jal 800018ce + 8000385e: 15053503 ld a0,336(a0) + 80003862: 94bff0ef jal 800031ac + 80003866: 8a2a mv s4,a0 + while(*path == '/') + 80003868: 02f00913 li s2,47 + if(len >= DIRSIZ) + 8000386c: 4c35 li s8,13 + + while((path = skipelem(path, name)) != 0){ + ilock(ip); + if(ip->type != T_DIR){ + 8000386e: 4b85 li s7,1 + 80003870: a871 j 8000390c + ip = iget(ROOTDEV, ROOTINO); + 80003872: 4585 li a1,1 + 80003874: 4505 li a0,1 + 80003876: ef8ff0ef jal 80002f6e + 8000387a: 8a2a mv s4,a0 + 8000387c: b7f5 j 80003868 + iunlockput(ip); + 8000387e: 8552 mv a0,s4 + 80003880: b6dff0ef jal 800033ec + return 0; + 80003884: 4a01 li s4,0 + if(nameiparent){ + iput(ip); + return 0; + } + return ip; +} + 80003886: 8552 mv a0,s4 + 80003888: 60e6 ld ra,88(sp) + 8000388a: 6446 ld s0,80(sp) + 8000388c: 64a6 ld s1,72(sp) + 8000388e: 6906 ld s2,64(sp) + 80003890: 79e2 ld s3,56(sp) + 80003892: 7a42 ld s4,48(sp) + 80003894: 7aa2 ld s5,40(sp) + 80003896: 7b02 ld s6,32(sp) + 80003898: 6be2 ld s7,24(sp) + 8000389a: 6c42 ld s8,16(sp) + 8000389c: 6ca2 ld s9,8(sp) + 8000389e: 6125 addi sp,sp,96 + 800038a0: 8082 ret + iunlock(ip); + 800038a2: 8552 mv a0,s4 + 800038a4: 9edff0ef jal 80003290 + return ip; + 800038a8: bff9 j 80003886 + iunlockput(ip); + 800038aa: 8552 mv a0,s4 + 800038ac: b41ff0ef jal 800033ec + return 0; + 800038b0: 8a4e mv s4,s3 + 800038b2: bfd1 j 80003886 + len = path - s; + 800038b4: 40998633 sub a2,s3,s1 + 800038b8: 00060c9b sext.w s9,a2 + if(len >= DIRSIZ) + 800038bc: 099c5063 bge s8,s9,8000393c + memmove(name, s, DIRSIZ); + 800038c0: 4639 li a2,14 + 800038c2: 85a6 mv a1,s1 + 800038c4: 8556 mv a0,s5 + 800038c6: c38fd0ef jal 80000cfe + 800038ca: 84ce mv s1,s3 + while(*path == '/') + 800038cc: 0004c783 lbu a5,0(s1) + 800038d0: 01279763 bne a5,s2,800038de + path++; + 800038d4: 0485 addi s1,s1,1 + while(*path == '/') + 800038d6: 0004c783 lbu a5,0(s1) + 800038da: ff278de3 beq a5,s2,800038d4 + ilock(ip); + 800038de: 8552 mv a0,s4 + 800038e0: 903ff0ef jal 800031e2 + if(ip->type != T_DIR){ + 800038e4: 044a1783 lh a5,68(s4) + 800038e8: f9779be3 bne a5,s7,8000387e + if(nameiparent && *path == '\0'){ + 800038ec: 000b0563 beqz s6,800038f6 + 800038f0: 0004c783 lbu a5,0(s1) + 800038f4: d7dd beqz a5,800038a2 + if((next = dirlookup(ip, name, 0)) == 0){ + 800038f6: 4601 li a2,0 + 800038f8: 85d6 mv a1,s5 + 800038fa: 8552 mv a0,s4 + 800038fc: e97ff0ef jal 80003792 + 80003900: 89aa mv s3,a0 + 80003902: d545 beqz a0,800038aa + iunlockput(ip); + 80003904: 8552 mv a0,s4 + 80003906: ae7ff0ef jal 800033ec + ip = next; + 8000390a: 8a4e mv s4,s3 + while(*path == '/') + 8000390c: 0004c783 lbu a5,0(s1) + 80003910: 01279763 bne a5,s2,8000391e + path++; + 80003914: 0485 addi s1,s1,1 + while(*path == '/') + 80003916: 0004c783 lbu a5,0(s1) + 8000391a: ff278de3 beq a5,s2,80003914 + if(*path == 0) + 8000391e: cb8d beqz a5,80003950 + while(*path != '/' && *path != 0) + 80003920: 0004c783 lbu a5,0(s1) + 80003924: 89a6 mv s3,s1 + len = path - s; + 80003926: 4c81 li s9,0 + 80003928: 4601 li a2,0 + while(*path != '/' && *path != 0) + 8000392a: 01278963 beq a5,s2,8000393c + 8000392e: d3d9 beqz a5,800038b4 + path++; + 80003930: 0985 addi s3,s3,1 + while(*path != '/' && *path != 0) + 80003932: 0009c783 lbu a5,0(s3) + 80003936: ff279ce3 bne a5,s2,8000392e + 8000393a: bfad j 800038b4 + memmove(name, s, len); + 8000393c: 2601 sext.w a2,a2 + 8000393e: 85a6 mv a1,s1 + 80003940: 8556 mv a0,s5 + 80003942: bbcfd0ef jal 80000cfe + name[len] = 0; + 80003946: 9cd6 add s9,s9,s5 + 80003948: 000c8023 sb zero,0(s9) # 2000 <_entry-0x7fffe000> + 8000394c: 84ce mv s1,s3 + 8000394e: bfbd j 800038cc + if(nameiparent){ + 80003950: f20b0be3 beqz s6,80003886 + iput(ip); + 80003954: 8552 mv a0,s4 + 80003956: a0fff0ef jal 80003364 + return 0; + 8000395a: 4a01 li s4,0 + 8000395c: b72d j 80003886 + +000000008000395e : +{ + 8000395e: 7139 addi sp,sp,-64 + 80003960: fc06 sd ra,56(sp) + 80003962: f822 sd s0,48(sp) + 80003964: f04a sd s2,32(sp) + 80003966: ec4e sd s3,24(sp) + 80003968: e852 sd s4,16(sp) + 8000396a: 0080 addi s0,sp,64 + 8000396c: 892a mv s2,a0 + 8000396e: 8a2e mv s4,a1 + 80003970: 89b2 mv s3,a2 + if((ip = dirlookup(dp, name, 0)) != 0){ + 80003972: 4601 li a2,0 + 80003974: e1fff0ef jal 80003792 + 80003978: e535 bnez a0,800039e4 + 8000397a: f426 sd s1,40(sp) + for(off = 0; off < dp->size; off += sizeof(de)){ + 8000397c: 04c92483 lw s1,76(s2) + 80003980: c48d beqz s1,800039aa + 80003982: 4481 li s1,0 + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80003984: 4741 li a4,16 + 80003986: 86a6 mv a3,s1 + 80003988: fc040613 addi a2,s0,-64 + 8000398c: 4581 li a1,0 + 8000398e: 854a mv a0,s2 + 80003990: be3ff0ef jal 80003572 + 80003994: 47c1 li a5,16 + 80003996: 04f51b63 bne a0,a5,800039ec + if(de.inum == 0) + 8000399a: fc045783 lhu a5,-64(s0) + 8000399e: c791 beqz a5,800039aa + for(off = 0; off < dp->size; off += sizeof(de)){ + 800039a0: 24c1 addiw s1,s1,16 + 800039a2: 04c92783 lw a5,76(s2) + 800039a6: fcf4efe3 bltu s1,a5,80003984 + strncpy(de.name, name, DIRSIZ); + 800039aa: 4639 li a2,14 + 800039ac: 85d2 mv a1,s4 + 800039ae: fc240513 addi a0,s0,-62 + 800039b2: bf2fd0ef jal 80000da4 + de.inum = inum; + 800039b6: fd341023 sh s3,-64(s0) + if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 800039ba: 4741 li a4,16 + 800039bc: 86a6 mv a3,s1 + 800039be: fc040613 addi a2,s0,-64 + 800039c2: 4581 li a1,0 + 800039c4: 854a mv a0,s2 + 800039c6: ca9ff0ef jal 8000366e + 800039ca: 1541 addi a0,a0,-16 + 800039cc: 00a03533 snez a0,a0 + 800039d0: 40a00533 neg a0,a0 + 800039d4: 74a2 ld s1,40(sp) +} + 800039d6: 70e2 ld ra,56(sp) + 800039d8: 7442 ld s0,48(sp) + 800039da: 7902 ld s2,32(sp) + 800039dc: 69e2 ld s3,24(sp) + 800039de: 6a42 ld s4,16(sp) + 800039e0: 6121 addi sp,sp,64 + 800039e2: 8082 ret + iput(ip); + 800039e4: 981ff0ef jal 80003364 + return -1; + 800039e8: 557d li a0,-1 + 800039ea: b7f5 j 800039d6 + panic("dirlink read"); + 800039ec: 00004517 auipc a0,0x4 + 800039f0: adc50513 addi a0,a0,-1316 # 800074c8 + 800039f4: dedfc0ef jal 800007e0 + +00000000800039f8 : + +struct inode* +namei(char *path) +{ + 800039f8: 1101 addi sp,sp,-32 + 800039fa: ec06 sd ra,24(sp) + 800039fc: e822 sd s0,16(sp) + 800039fe: 1000 addi s0,sp,32 + char name[DIRSIZ]; + return namex(path, 0, name); + 80003a00: fe040613 addi a2,s0,-32 + 80003a04: 4581 li a1,0 + 80003a06: e29ff0ef jal 8000382e +} + 80003a0a: 60e2 ld ra,24(sp) + 80003a0c: 6442 ld s0,16(sp) + 80003a0e: 6105 addi sp,sp,32 + 80003a10: 8082 ret + +0000000080003a12 : + +struct inode* +nameiparent(char *path, char *name) +{ + 80003a12: 1141 addi sp,sp,-16 + 80003a14: e406 sd ra,8(sp) + 80003a16: e022 sd s0,0(sp) + 80003a18: 0800 addi s0,sp,16 + 80003a1a: 862e mv a2,a1 + return namex(path, 1, name); + 80003a1c: 4585 li a1,1 + 80003a1e: e11ff0ef jal 8000382e +} + 80003a22: 60a2 ld ra,8(sp) + 80003a24: 6402 ld s0,0(sp) + 80003a26: 0141 addi sp,sp,16 + 80003a28: 8082 ret + +0000000080003a2a : +// Write in-memory log header to disk. +// This is the true point at which the +// current transaction commits. +static void +write_head(void) +{ + 80003a2a: 1101 addi sp,sp,-32 + 80003a2c: ec06 sd ra,24(sp) + 80003a2e: e822 sd s0,16(sp) + 80003a30: e426 sd s1,8(sp) + 80003a32: e04a sd s2,0(sp) + 80003a34: 1000 addi s0,sp,32 + struct buf *buf = bread(log.dev, log.start); + 80003a36: 0001f917 auipc s2,0x1f + 80003a3a: 85290913 addi s2,s2,-1966 # 80022288 + 80003a3e: 01892583 lw a1,24(s2) + 80003a42: 02492503 lw a0,36(s2) + 80003a46: 8d0ff0ef jal 80002b16 + 80003a4a: 84aa mv s1,a0 + struct logheader *hb = (struct logheader *) (buf->data); + int i; + hb->n = log.lh.n; + 80003a4c: 02892603 lw a2,40(s2) + 80003a50: cd30 sw a2,88(a0) + for (i = 0; i < log.lh.n; i++) { + 80003a52: 00c05f63 blez a2,80003a70 + 80003a56: 0001f717 auipc a4,0x1f + 80003a5a: 85e70713 addi a4,a4,-1954 # 800222b4 + 80003a5e: 87aa mv a5,a0 + 80003a60: 060a slli a2,a2,0x2 + 80003a62: 962a add a2,a2,a0 + hb->block[i] = log.lh.block[i]; + 80003a64: 4314 lw a3,0(a4) + 80003a66: cff4 sw a3,92(a5) + for (i = 0; i < log.lh.n; i++) { + 80003a68: 0711 addi a4,a4,4 + 80003a6a: 0791 addi a5,a5,4 + 80003a6c: fec79ce3 bne a5,a2,80003a64 + } + bwrite(buf); + 80003a70: 8526 mv a0,s1 + 80003a72: 97aff0ef jal 80002bec + brelse(buf); + 80003a76: 8526 mv a0,s1 + 80003a78: 9a6ff0ef jal 80002c1e +} + 80003a7c: 60e2 ld ra,24(sp) + 80003a7e: 6442 ld s0,16(sp) + 80003a80: 64a2 ld s1,8(sp) + 80003a82: 6902 ld s2,0(sp) + 80003a84: 6105 addi sp,sp,32 + 80003a86: 8082 ret + +0000000080003a88 : + for (tail = 0; tail < log.lh.n; tail++) { + 80003a88: 0001f797 auipc a5,0x1f + 80003a8c: 8287a783 lw a5,-2008(a5) # 800222b0 + 80003a90: 0af05e63 blez a5,80003b4c +{ + 80003a94: 715d addi sp,sp,-80 + 80003a96: e486 sd ra,72(sp) + 80003a98: e0a2 sd s0,64(sp) + 80003a9a: fc26 sd s1,56(sp) + 80003a9c: f84a sd s2,48(sp) + 80003a9e: f44e sd s3,40(sp) + 80003aa0: f052 sd s4,32(sp) + 80003aa2: ec56 sd s5,24(sp) + 80003aa4: e85a sd s6,16(sp) + 80003aa6: e45e sd s7,8(sp) + 80003aa8: 0880 addi s0,sp,80 + 80003aaa: 8b2a mv s6,a0 + 80003aac: 0001fa97 auipc s5,0x1f + 80003ab0: 808a8a93 addi s5,s5,-2040 # 800222b4 + for (tail = 0; tail < log.lh.n; tail++) { + 80003ab4: 4981 li s3,0 + printf("recovering tail %d dst %d\n", tail, log.lh.block[tail]); + 80003ab6: 00004b97 auipc s7,0x4 + 80003aba: a22b8b93 addi s7,s7,-1502 # 800074d8 + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block + 80003abe: 0001ea17 auipc s4,0x1e + 80003ac2: 7caa0a13 addi s4,s4,1994 # 80022288 + 80003ac6: a025 j 80003aee + printf("recovering tail %d dst %d\n", tail, log.lh.block[tail]); + 80003ac8: 000aa603 lw a2,0(s5) + 80003acc: 85ce mv a1,s3 + 80003ace: 855e mv a0,s7 + 80003ad0: a2bfc0ef jal 800004fa + 80003ad4: a839 j 80003af2 + brelse(lbuf); + 80003ad6: 854a mv a0,s2 + 80003ad8: 946ff0ef jal 80002c1e + brelse(dbuf); + 80003adc: 8526 mv a0,s1 + 80003ade: 940ff0ef jal 80002c1e + for (tail = 0; tail < log.lh.n; tail++) { + 80003ae2: 2985 addiw s3,s3,1 + 80003ae4: 0a91 addi s5,s5,4 + 80003ae6: 028a2783 lw a5,40(s4) + 80003aea: 04f9d663 bge s3,a5,80003b36 + if(recovering) { + 80003aee: fc0b1de3 bnez s6,80003ac8 + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block + 80003af2: 018a2583 lw a1,24(s4) + 80003af6: 013585bb addw a1,a1,s3 + 80003afa: 2585 addiw a1,a1,1 + 80003afc: 024a2503 lw a0,36(s4) + 80003b00: 816ff0ef jal 80002b16 + 80003b04: 892a mv s2,a0 + struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst + 80003b06: 000aa583 lw a1,0(s5) + 80003b0a: 024a2503 lw a0,36(s4) + 80003b0e: 808ff0ef jal 80002b16 + 80003b12: 84aa mv s1,a0 + memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst + 80003b14: 40000613 li a2,1024 + 80003b18: 05890593 addi a1,s2,88 + 80003b1c: 05850513 addi a0,a0,88 + 80003b20: 9defd0ef jal 80000cfe + bwrite(dbuf); // write dst to disk + 80003b24: 8526 mv a0,s1 + 80003b26: 8c6ff0ef jal 80002bec + if(recovering == 0) + 80003b2a: fa0b16e3 bnez s6,80003ad6 + bunpin(dbuf); + 80003b2e: 8526 mv a0,s1 + 80003b30: 9aaff0ef jal 80002cda + 80003b34: b74d j 80003ad6 +} + 80003b36: 60a6 ld ra,72(sp) + 80003b38: 6406 ld s0,64(sp) + 80003b3a: 74e2 ld s1,56(sp) + 80003b3c: 7942 ld s2,48(sp) + 80003b3e: 79a2 ld s3,40(sp) + 80003b40: 7a02 ld s4,32(sp) + 80003b42: 6ae2 ld s5,24(sp) + 80003b44: 6b42 ld s6,16(sp) + 80003b46: 6ba2 ld s7,8(sp) + 80003b48: 6161 addi sp,sp,80 + 80003b4a: 8082 ret + 80003b4c: 8082 ret + +0000000080003b4e : +{ + 80003b4e: 7179 addi sp,sp,-48 + 80003b50: f406 sd ra,40(sp) + 80003b52: f022 sd s0,32(sp) + 80003b54: ec26 sd s1,24(sp) + 80003b56: e84a sd s2,16(sp) + 80003b58: e44e sd s3,8(sp) + 80003b5a: 1800 addi s0,sp,48 + 80003b5c: 892a mv s2,a0 + 80003b5e: 89ae mv s3,a1 + initlock(&log.lock, "log"); + 80003b60: 0001e497 auipc s1,0x1e + 80003b64: 72848493 addi s1,s1,1832 # 80022288 + 80003b68: 00004597 auipc a1,0x4 + 80003b6c: 99058593 addi a1,a1,-1648 # 800074f8 + 80003b70: 8526 mv a0,s1 + 80003b72: fddfc0ef jal 80000b4e + log.start = sb->logstart; + 80003b76: 0149a583 lw a1,20(s3) + 80003b7a: cc8c sw a1,24(s1) + log.dev = dev; + 80003b7c: 0324a223 sw s2,36(s1) + struct buf *buf = bread(log.dev, log.start); + 80003b80: 854a mv a0,s2 + 80003b82: f95fe0ef jal 80002b16 + log.lh.n = lh->n; + 80003b86: 4d30 lw a2,88(a0) + 80003b88: d490 sw a2,40(s1) + for (i = 0; i < log.lh.n; i++) { + 80003b8a: 00c05f63 blez a2,80003ba8 + 80003b8e: 87aa mv a5,a0 + 80003b90: 0001e717 auipc a4,0x1e + 80003b94: 72470713 addi a4,a4,1828 # 800222b4 + 80003b98: 060a slli a2,a2,0x2 + 80003b9a: 962a add a2,a2,a0 + log.lh.block[i] = lh->block[i]; + 80003b9c: 4ff4 lw a3,92(a5) + 80003b9e: c314 sw a3,0(a4) + for (i = 0; i < log.lh.n; i++) { + 80003ba0: 0791 addi a5,a5,4 + 80003ba2: 0711 addi a4,a4,4 + 80003ba4: fec79ce3 bne a5,a2,80003b9c + brelse(buf); + 80003ba8: 876ff0ef jal 80002c1e + +static void +recover_from_log(void) +{ + read_head(); + install_trans(1); // if committed, copy from log to disk + 80003bac: 4505 li a0,1 + 80003bae: edbff0ef jal 80003a88 + log.lh.n = 0; + 80003bb2: 0001e797 auipc a5,0x1e + 80003bb6: 6e07af23 sw zero,1790(a5) # 800222b0 + write_head(); // clear the log + 80003bba: e71ff0ef jal 80003a2a +} + 80003bbe: 70a2 ld ra,40(sp) + 80003bc0: 7402 ld s0,32(sp) + 80003bc2: 64e2 ld s1,24(sp) + 80003bc4: 6942 ld s2,16(sp) + 80003bc6: 69a2 ld s3,8(sp) + 80003bc8: 6145 addi sp,sp,48 + 80003bca: 8082 ret + +0000000080003bcc : +} + +// called at the start of each FS system call. +void +begin_op(void) +{ + 80003bcc: 1101 addi sp,sp,-32 + 80003bce: ec06 sd ra,24(sp) + 80003bd0: e822 sd s0,16(sp) + 80003bd2: e426 sd s1,8(sp) + 80003bd4: e04a sd s2,0(sp) + 80003bd6: 1000 addi s0,sp,32 + acquire(&log.lock); + 80003bd8: 0001e517 auipc a0,0x1e + 80003bdc: 6b050513 addi a0,a0,1712 # 80022288 + 80003be0: feffc0ef jal 80000bce + while(1){ + if(log.committing){ + 80003be4: 0001e497 auipc s1,0x1e + 80003be8: 6a448493 addi s1,s1,1700 # 80022288 + sleep(&log, &log.lock); + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGBLOCKS){ + 80003bec: 4979 li s2,30 + 80003bee: a029 j 80003bf8 + sleep(&log, &log.lock); + 80003bf0: 85a6 mv a1,s1 + 80003bf2: 8526 mv a0,s1 + 80003bf4: ae4fe0ef jal 80001ed8 + if(log.committing){ + 80003bf8: 509c lw a5,32(s1) + 80003bfa: fbfd bnez a5,80003bf0 + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGBLOCKS){ + 80003bfc: 4cd8 lw a4,28(s1) + 80003bfe: 2705 addiw a4,a4,1 + 80003c00: 0027179b slliw a5,a4,0x2 + 80003c04: 9fb9 addw a5,a5,a4 + 80003c06: 0017979b slliw a5,a5,0x1 + 80003c0a: 5494 lw a3,40(s1) + 80003c0c: 9fb5 addw a5,a5,a3 + 80003c0e: 00f95763 bge s2,a5,80003c1c + // this op might exhaust log space; wait for commit. + sleep(&log, &log.lock); + 80003c12: 85a6 mv a1,s1 + 80003c14: 8526 mv a0,s1 + 80003c16: ac2fe0ef jal 80001ed8 + 80003c1a: bff9 j 80003bf8 + } else { + log.outstanding += 1; + 80003c1c: 0001e517 auipc a0,0x1e + 80003c20: 66c50513 addi a0,a0,1644 # 80022288 + 80003c24: cd58 sw a4,28(a0) + release(&log.lock); + 80003c26: 840fd0ef jal 80000c66 + break; + } + } +} + 80003c2a: 60e2 ld ra,24(sp) + 80003c2c: 6442 ld s0,16(sp) + 80003c2e: 64a2 ld s1,8(sp) + 80003c30: 6902 ld s2,0(sp) + 80003c32: 6105 addi sp,sp,32 + 80003c34: 8082 ret + +0000000080003c36 : + +// called at the end of each FS system call. +// commits if this was the last outstanding operation. +void +end_op(void) +{ + 80003c36: 7139 addi sp,sp,-64 + 80003c38: fc06 sd ra,56(sp) + 80003c3a: f822 sd s0,48(sp) + 80003c3c: f426 sd s1,40(sp) + 80003c3e: f04a sd s2,32(sp) + 80003c40: 0080 addi s0,sp,64 + int do_commit = 0; + + acquire(&log.lock); + 80003c42: 0001e497 auipc s1,0x1e + 80003c46: 64648493 addi s1,s1,1606 # 80022288 + 80003c4a: 8526 mv a0,s1 + 80003c4c: f83fc0ef jal 80000bce + log.outstanding -= 1; + 80003c50: 4cdc lw a5,28(s1) + 80003c52: 37fd addiw a5,a5,-1 + 80003c54: 0007891b sext.w s2,a5 + 80003c58: ccdc sw a5,28(s1) + if(log.committing) + 80003c5a: 509c lw a5,32(s1) + 80003c5c: ef9d bnez a5,80003c9a + panic("log.committing"); + if(log.outstanding == 0){ + 80003c5e: 04091763 bnez s2,80003cac + do_commit = 1; + log.committing = 1; + 80003c62: 0001e497 auipc s1,0x1e + 80003c66: 62648493 addi s1,s1,1574 # 80022288 + 80003c6a: 4785 li a5,1 + 80003c6c: d09c sw a5,32(s1) + // begin_op() may be waiting for log space, + // and decrementing log.outstanding has decreased + // the amount of reserved space. + wakeup(&log); + } + release(&log.lock); + 80003c6e: 8526 mv a0,s1 + 80003c70: ff7fc0ef jal 80000c66 +} + +static void +commit() +{ + if (log.lh.n > 0) { + 80003c74: 549c lw a5,40(s1) + 80003c76: 04f04b63 bgtz a5,80003ccc + acquire(&log.lock); + 80003c7a: 0001e497 auipc s1,0x1e + 80003c7e: 60e48493 addi s1,s1,1550 # 80022288 + 80003c82: 8526 mv a0,s1 + 80003c84: f4bfc0ef jal 80000bce + log.committing = 0; + 80003c88: 0204a023 sw zero,32(s1) + wakeup(&log); + 80003c8c: 8526 mv a0,s1 + 80003c8e: a96fe0ef jal 80001f24 + release(&log.lock); + 80003c92: 8526 mv a0,s1 + 80003c94: fd3fc0ef jal 80000c66 +} + 80003c98: a025 j 80003cc0 + 80003c9a: ec4e sd s3,24(sp) + 80003c9c: e852 sd s4,16(sp) + 80003c9e: e456 sd s5,8(sp) + panic("log.committing"); + 80003ca0: 00004517 auipc a0,0x4 + 80003ca4: 86050513 addi a0,a0,-1952 # 80007500 + 80003ca8: b39fc0ef jal 800007e0 + wakeup(&log); + 80003cac: 0001e497 auipc s1,0x1e + 80003cb0: 5dc48493 addi s1,s1,1500 # 80022288 + 80003cb4: 8526 mv a0,s1 + 80003cb6: a6efe0ef jal 80001f24 + release(&log.lock); + 80003cba: 8526 mv a0,s1 + 80003cbc: fabfc0ef jal 80000c66 +} + 80003cc0: 70e2 ld ra,56(sp) + 80003cc2: 7442 ld s0,48(sp) + 80003cc4: 74a2 ld s1,40(sp) + 80003cc6: 7902 ld s2,32(sp) + 80003cc8: 6121 addi sp,sp,64 + 80003cca: 8082 ret + 80003ccc: ec4e sd s3,24(sp) + 80003cce: e852 sd s4,16(sp) + 80003cd0: e456 sd s5,8(sp) + for (tail = 0; tail < log.lh.n; tail++) { + 80003cd2: 0001ea97 auipc s5,0x1e + 80003cd6: 5e2a8a93 addi s5,s5,1506 # 800222b4 + struct buf *to = bread(log.dev, log.start+tail+1); // log block + 80003cda: 0001ea17 auipc s4,0x1e + 80003cde: 5aea0a13 addi s4,s4,1454 # 80022288 + 80003ce2: 018a2583 lw a1,24(s4) + 80003ce6: 012585bb addw a1,a1,s2 + 80003cea: 2585 addiw a1,a1,1 + 80003cec: 024a2503 lw a0,36(s4) + 80003cf0: e27fe0ef jal 80002b16 + 80003cf4: 84aa mv s1,a0 + struct buf *from = bread(log.dev, log.lh.block[tail]); // cache block + 80003cf6: 000aa583 lw a1,0(s5) + 80003cfa: 024a2503 lw a0,36(s4) + 80003cfe: e19fe0ef jal 80002b16 + 80003d02: 89aa mv s3,a0 + memmove(to->data, from->data, BSIZE); + 80003d04: 40000613 li a2,1024 + 80003d08: 05850593 addi a1,a0,88 + 80003d0c: 05848513 addi a0,s1,88 + 80003d10: feffc0ef jal 80000cfe + bwrite(to); // write the log + 80003d14: 8526 mv a0,s1 + 80003d16: ed7fe0ef jal 80002bec + brelse(from); + 80003d1a: 854e mv a0,s3 + 80003d1c: f03fe0ef jal 80002c1e + brelse(to); + 80003d20: 8526 mv a0,s1 + 80003d22: efdfe0ef jal 80002c1e + for (tail = 0; tail < log.lh.n; tail++) { + 80003d26: 2905 addiw s2,s2,1 + 80003d28: 0a91 addi s5,s5,4 + 80003d2a: 028a2783 lw a5,40(s4) + 80003d2e: faf94ae3 blt s2,a5,80003ce2 + write_log(); // Write modified blocks from cache to log + write_head(); // Write header to disk -- the real commit + 80003d32: cf9ff0ef jal 80003a2a + install_trans(0); // Now install writes to home locations + 80003d36: 4501 li a0,0 + 80003d38: d51ff0ef jal 80003a88 + log.lh.n = 0; + 80003d3c: 0001e797 auipc a5,0x1e + 80003d40: 5607aa23 sw zero,1396(a5) # 800222b0 + write_head(); // Erase the transaction from the log + 80003d44: ce7ff0ef jal 80003a2a + 80003d48: 69e2 ld s3,24(sp) + 80003d4a: 6a42 ld s4,16(sp) + 80003d4c: 6aa2 ld s5,8(sp) + 80003d4e: b735 j 80003c7a + +0000000080003d50 : +// modify bp->data[] +// log_write(bp) +// brelse(bp) +void +log_write(struct buf *b) +{ + 80003d50: 1101 addi sp,sp,-32 + 80003d52: ec06 sd ra,24(sp) + 80003d54: e822 sd s0,16(sp) + 80003d56: e426 sd s1,8(sp) + 80003d58: e04a sd s2,0(sp) + 80003d5a: 1000 addi s0,sp,32 + 80003d5c: 84aa mv s1,a0 + int i; + + acquire(&log.lock); + 80003d5e: 0001e917 auipc s2,0x1e + 80003d62: 52a90913 addi s2,s2,1322 # 80022288 + 80003d66: 854a mv a0,s2 + 80003d68: e67fc0ef jal 80000bce + if (log.lh.n >= LOGBLOCKS) + 80003d6c: 02892603 lw a2,40(s2) + 80003d70: 47f5 li a5,29 + 80003d72: 04c7cc63 blt a5,a2,80003dca + panic("too big a transaction"); + if (log.outstanding < 1) + 80003d76: 0001e797 auipc a5,0x1e + 80003d7a: 52e7a783 lw a5,1326(a5) # 800222a4 + 80003d7e: 04f05c63 blez a5,80003dd6 + panic("log_write outside of trans"); + + for (i = 0; i < log.lh.n; i++) { + 80003d82: 4781 li a5,0 + 80003d84: 04c05f63 blez a2,80003de2 + if (log.lh.block[i] == b->blockno) // log absorption + 80003d88: 44cc lw a1,12(s1) + 80003d8a: 0001e717 auipc a4,0x1e + 80003d8e: 52a70713 addi a4,a4,1322 # 800222b4 + for (i = 0; i < log.lh.n; i++) { + 80003d92: 4781 li a5,0 + if (log.lh.block[i] == b->blockno) // log absorption + 80003d94: 4314 lw a3,0(a4) + 80003d96: 04b68663 beq a3,a1,80003de2 + for (i = 0; i < log.lh.n; i++) { + 80003d9a: 2785 addiw a5,a5,1 + 80003d9c: 0711 addi a4,a4,4 + 80003d9e: fef61be3 bne a2,a5,80003d94 + break; + } + log.lh.block[i] = b->blockno; + 80003da2: 0621 addi a2,a2,8 + 80003da4: 060a slli a2,a2,0x2 + 80003da6: 0001e797 auipc a5,0x1e + 80003daa: 4e278793 addi a5,a5,1250 # 80022288 + 80003dae: 97b2 add a5,a5,a2 + 80003db0: 44d8 lw a4,12(s1) + 80003db2: c7d8 sw a4,12(a5) + if (i == log.lh.n) { // Add new block to log? + bpin(b); + 80003db4: 8526 mv a0,s1 + 80003db6: ef1fe0ef jal 80002ca6 + log.lh.n++; + 80003dba: 0001e717 auipc a4,0x1e + 80003dbe: 4ce70713 addi a4,a4,1230 # 80022288 + 80003dc2: 571c lw a5,40(a4) + 80003dc4: 2785 addiw a5,a5,1 + 80003dc6: d71c sw a5,40(a4) + 80003dc8: a80d j 80003dfa + panic("too big a transaction"); + 80003dca: 00003517 auipc a0,0x3 + 80003dce: 74650513 addi a0,a0,1862 # 80007510 + 80003dd2: a0ffc0ef jal 800007e0 + panic("log_write outside of trans"); + 80003dd6: 00003517 auipc a0,0x3 + 80003dda: 75250513 addi a0,a0,1874 # 80007528 + 80003dde: a03fc0ef jal 800007e0 + log.lh.block[i] = b->blockno; + 80003de2: 00878693 addi a3,a5,8 + 80003de6: 068a slli a3,a3,0x2 + 80003de8: 0001e717 auipc a4,0x1e + 80003dec: 4a070713 addi a4,a4,1184 # 80022288 + 80003df0: 9736 add a4,a4,a3 + 80003df2: 44d4 lw a3,12(s1) + 80003df4: c754 sw a3,12(a4) + if (i == log.lh.n) { // Add new block to log? + 80003df6: faf60fe3 beq a2,a5,80003db4 + } + release(&log.lock); + 80003dfa: 0001e517 auipc a0,0x1e + 80003dfe: 48e50513 addi a0,a0,1166 # 80022288 + 80003e02: e65fc0ef jal 80000c66 +} + 80003e06: 60e2 ld ra,24(sp) + 80003e08: 6442 ld s0,16(sp) + 80003e0a: 64a2 ld s1,8(sp) + 80003e0c: 6902 ld s2,0(sp) + 80003e0e: 6105 addi sp,sp,32 + 80003e10: 8082 ret + +0000000080003e12 : +#include "proc.h" +#include "sleeplock.h" + +void +initsleeplock(struct sleeplock *lk, char *name) +{ + 80003e12: 1101 addi sp,sp,-32 + 80003e14: ec06 sd ra,24(sp) + 80003e16: e822 sd s0,16(sp) + 80003e18: e426 sd s1,8(sp) + 80003e1a: e04a sd s2,0(sp) + 80003e1c: 1000 addi s0,sp,32 + 80003e1e: 84aa mv s1,a0 + 80003e20: 892e mv s2,a1 + initlock(&lk->lk, "sleep lock"); + 80003e22: 00003597 auipc a1,0x3 + 80003e26: 72658593 addi a1,a1,1830 # 80007548 + 80003e2a: 0521 addi a0,a0,8 + 80003e2c: d23fc0ef jal 80000b4e + lk->name = name; + 80003e30: 0324b023 sd s2,32(s1) + lk->locked = 0; + 80003e34: 0004a023 sw zero,0(s1) + lk->pid = 0; + 80003e38: 0204a423 sw zero,40(s1) +} + 80003e3c: 60e2 ld ra,24(sp) + 80003e3e: 6442 ld s0,16(sp) + 80003e40: 64a2 ld s1,8(sp) + 80003e42: 6902 ld s2,0(sp) + 80003e44: 6105 addi sp,sp,32 + 80003e46: 8082 ret + +0000000080003e48 : + +void +acquiresleep(struct sleeplock *lk) +{ + 80003e48: 1101 addi sp,sp,-32 + 80003e4a: ec06 sd ra,24(sp) + 80003e4c: e822 sd s0,16(sp) + 80003e4e: e426 sd s1,8(sp) + 80003e50: e04a sd s2,0(sp) + 80003e52: 1000 addi s0,sp,32 + 80003e54: 84aa mv s1,a0 + acquire(&lk->lk); + 80003e56: 00850913 addi s2,a0,8 + 80003e5a: 854a mv a0,s2 + 80003e5c: d73fc0ef jal 80000bce + while (lk->locked) { + 80003e60: 409c lw a5,0(s1) + 80003e62: c799 beqz a5,80003e70 + sleep(lk, &lk->lk); + 80003e64: 85ca mv a1,s2 + 80003e66: 8526 mv a0,s1 + 80003e68: 870fe0ef jal 80001ed8 + while (lk->locked) { + 80003e6c: 409c lw a5,0(s1) + 80003e6e: fbfd bnez a5,80003e64 + } + lk->locked = 1; + 80003e70: 4785 li a5,1 + 80003e72: c09c sw a5,0(s1) + lk->pid = myproc()->pid; + 80003e74: a5bfd0ef jal 800018ce + 80003e78: 591c lw a5,48(a0) + 80003e7a: d49c sw a5,40(s1) + release(&lk->lk); + 80003e7c: 854a mv a0,s2 + 80003e7e: de9fc0ef jal 80000c66 +} + 80003e82: 60e2 ld ra,24(sp) + 80003e84: 6442 ld s0,16(sp) + 80003e86: 64a2 ld s1,8(sp) + 80003e88: 6902 ld s2,0(sp) + 80003e8a: 6105 addi sp,sp,32 + 80003e8c: 8082 ret + +0000000080003e8e : + +void +releasesleep(struct sleeplock *lk) +{ + 80003e8e: 1101 addi sp,sp,-32 + 80003e90: ec06 sd ra,24(sp) + 80003e92: e822 sd s0,16(sp) + 80003e94: e426 sd s1,8(sp) + 80003e96: e04a sd s2,0(sp) + 80003e98: 1000 addi s0,sp,32 + 80003e9a: 84aa mv s1,a0 + acquire(&lk->lk); + 80003e9c: 00850913 addi s2,a0,8 + 80003ea0: 854a mv a0,s2 + 80003ea2: d2dfc0ef jal 80000bce + lk->locked = 0; + 80003ea6: 0004a023 sw zero,0(s1) + lk->pid = 0; + 80003eaa: 0204a423 sw zero,40(s1) + wakeup(lk); + 80003eae: 8526 mv a0,s1 + 80003eb0: 874fe0ef jal 80001f24 + release(&lk->lk); + 80003eb4: 854a mv a0,s2 + 80003eb6: db1fc0ef jal 80000c66 +} + 80003eba: 60e2 ld ra,24(sp) + 80003ebc: 6442 ld s0,16(sp) + 80003ebe: 64a2 ld s1,8(sp) + 80003ec0: 6902 ld s2,0(sp) + 80003ec2: 6105 addi sp,sp,32 + 80003ec4: 8082 ret + +0000000080003ec6 : + +int +holdingsleep(struct sleeplock *lk) +{ + 80003ec6: 7179 addi sp,sp,-48 + 80003ec8: f406 sd ra,40(sp) + 80003eca: f022 sd s0,32(sp) + 80003ecc: ec26 sd s1,24(sp) + 80003ece: e84a sd s2,16(sp) + 80003ed0: 1800 addi s0,sp,48 + 80003ed2: 84aa mv s1,a0 + int r; + + acquire(&lk->lk); + 80003ed4: 00850913 addi s2,a0,8 + 80003ed8: 854a mv a0,s2 + 80003eda: cf5fc0ef jal 80000bce + r = lk->locked && (lk->pid == myproc()->pid); + 80003ede: 409c lw a5,0(s1) + 80003ee0: ef81 bnez a5,80003ef8 + 80003ee2: 4481 li s1,0 + release(&lk->lk); + 80003ee4: 854a mv a0,s2 + 80003ee6: d81fc0ef jal 80000c66 + return r; +} + 80003eea: 8526 mv a0,s1 + 80003eec: 70a2 ld ra,40(sp) + 80003eee: 7402 ld s0,32(sp) + 80003ef0: 64e2 ld s1,24(sp) + 80003ef2: 6942 ld s2,16(sp) + 80003ef4: 6145 addi sp,sp,48 + 80003ef6: 8082 ret + 80003ef8: e44e sd s3,8(sp) + r = lk->locked && (lk->pid == myproc()->pid); + 80003efa: 0284a983 lw s3,40(s1) + 80003efe: 9d1fd0ef jal 800018ce + 80003f02: 5904 lw s1,48(a0) + 80003f04: 413484b3 sub s1,s1,s3 + 80003f08: 0014b493 seqz s1,s1 + 80003f0c: 69a2 ld s3,8(sp) + 80003f0e: bfd9 j 80003ee4 + +0000000080003f10 : + struct file file[NFILE]; +} ftable; + +void +fileinit(void) +{ + 80003f10: 1141 addi sp,sp,-16 + 80003f12: e406 sd ra,8(sp) + 80003f14: e022 sd s0,0(sp) + 80003f16: 0800 addi s0,sp,16 + initlock(&ftable.lock, "ftable"); + 80003f18: 00003597 auipc a1,0x3 + 80003f1c: 64058593 addi a1,a1,1600 # 80007558 + 80003f20: 0001e517 auipc a0,0x1e + 80003f24: 4b050513 addi a0,a0,1200 # 800223d0 + 80003f28: c27fc0ef jal 80000b4e +} + 80003f2c: 60a2 ld ra,8(sp) + 80003f2e: 6402 ld s0,0(sp) + 80003f30: 0141 addi sp,sp,16 + 80003f32: 8082 ret + +0000000080003f34 : + +// Allocate a file structure. +struct file* +filealloc(void) +{ + 80003f34: 1101 addi sp,sp,-32 + 80003f36: ec06 sd ra,24(sp) + 80003f38: e822 sd s0,16(sp) + 80003f3a: e426 sd s1,8(sp) + 80003f3c: 1000 addi s0,sp,32 + struct file *f; + + acquire(&ftable.lock); + 80003f3e: 0001e517 auipc a0,0x1e + 80003f42: 49250513 addi a0,a0,1170 # 800223d0 + 80003f46: c89fc0ef jal 80000bce + for(f = ftable.file; f < ftable.file + NFILE; f++){ + 80003f4a: 0001e497 auipc s1,0x1e + 80003f4e: 49e48493 addi s1,s1,1182 # 800223e8 + 80003f52: 0001f717 auipc a4,0x1f + 80003f56: 43670713 addi a4,a4,1078 # 80023388 + if(f->ref == 0){ + 80003f5a: 40dc lw a5,4(s1) + 80003f5c: cf89 beqz a5,80003f76 + for(f = ftable.file; f < ftable.file + NFILE; f++){ + 80003f5e: 02848493 addi s1,s1,40 + 80003f62: fee49ce3 bne s1,a4,80003f5a + f->ref = 1; + release(&ftable.lock); + return f; + } + } + release(&ftable.lock); + 80003f66: 0001e517 auipc a0,0x1e + 80003f6a: 46a50513 addi a0,a0,1130 # 800223d0 + 80003f6e: cf9fc0ef jal 80000c66 + return 0; + 80003f72: 4481 li s1,0 + 80003f74: a809 j 80003f86 + f->ref = 1; + 80003f76: 4785 li a5,1 + 80003f78: c0dc sw a5,4(s1) + release(&ftable.lock); + 80003f7a: 0001e517 auipc a0,0x1e + 80003f7e: 45650513 addi a0,a0,1110 # 800223d0 + 80003f82: ce5fc0ef jal 80000c66 +} + 80003f86: 8526 mv a0,s1 + 80003f88: 60e2 ld ra,24(sp) + 80003f8a: 6442 ld s0,16(sp) + 80003f8c: 64a2 ld s1,8(sp) + 80003f8e: 6105 addi sp,sp,32 + 80003f90: 8082 ret + +0000000080003f92 : + +// Increment ref count for file f. +struct file* +filedup(struct file *f) +{ + 80003f92: 1101 addi sp,sp,-32 + 80003f94: ec06 sd ra,24(sp) + 80003f96: e822 sd s0,16(sp) + 80003f98: e426 sd s1,8(sp) + 80003f9a: 1000 addi s0,sp,32 + 80003f9c: 84aa mv s1,a0 + acquire(&ftable.lock); + 80003f9e: 0001e517 auipc a0,0x1e + 80003fa2: 43250513 addi a0,a0,1074 # 800223d0 + 80003fa6: c29fc0ef jal 80000bce + if(f->ref < 1) + 80003faa: 40dc lw a5,4(s1) + 80003fac: 02f05063 blez a5,80003fcc + panic("filedup"); + f->ref++; + 80003fb0: 2785 addiw a5,a5,1 + 80003fb2: c0dc sw a5,4(s1) + release(&ftable.lock); + 80003fb4: 0001e517 auipc a0,0x1e + 80003fb8: 41c50513 addi a0,a0,1052 # 800223d0 + 80003fbc: cabfc0ef jal 80000c66 + return f; +} + 80003fc0: 8526 mv a0,s1 + 80003fc2: 60e2 ld ra,24(sp) + 80003fc4: 6442 ld s0,16(sp) + 80003fc6: 64a2 ld s1,8(sp) + 80003fc8: 6105 addi sp,sp,32 + 80003fca: 8082 ret + panic("filedup"); + 80003fcc: 00003517 auipc a0,0x3 + 80003fd0: 59450513 addi a0,a0,1428 # 80007560 + 80003fd4: 80dfc0ef jal 800007e0 + +0000000080003fd8 : + +// Close file f. (Decrement ref count, close when reaches 0.) +void +fileclose(struct file *f) +{ + 80003fd8: 7139 addi sp,sp,-64 + 80003fda: fc06 sd ra,56(sp) + 80003fdc: f822 sd s0,48(sp) + 80003fde: f426 sd s1,40(sp) + 80003fe0: 0080 addi s0,sp,64 + 80003fe2: 84aa mv s1,a0 + struct file ff; + + acquire(&ftable.lock); + 80003fe4: 0001e517 auipc a0,0x1e + 80003fe8: 3ec50513 addi a0,a0,1004 # 800223d0 + 80003fec: be3fc0ef jal 80000bce + if(f->ref < 1) + 80003ff0: 40dc lw a5,4(s1) + 80003ff2: 04f05a63 blez a5,80004046 + panic("fileclose"); + if(--f->ref > 0){ + 80003ff6: 37fd addiw a5,a5,-1 + 80003ff8: 0007871b sext.w a4,a5 + 80003ffc: c0dc sw a5,4(s1) + 80003ffe: 04e04e63 bgtz a4,8000405a + 80004002: f04a sd s2,32(sp) + 80004004: ec4e sd s3,24(sp) + 80004006: e852 sd s4,16(sp) + 80004008: e456 sd s5,8(sp) + release(&ftable.lock); + return; + } + ff = *f; + 8000400a: 0004a903 lw s2,0(s1) + 8000400e: 0094ca83 lbu s5,9(s1) + 80004012: 0104ba03 ld s4,16(s1) + 80004016: 0184b983 ld s3,24(s1) + f->ref = 0; + 8000401a: 0004a223 sw zero,4(s1) + f->type = FD_NONE; + 8000401e: 0004a023 sw zero,0(s1) + release(&ftable.lock); + 80004022: 0001e517 auipc a0,0x1e + 80004026: 3ae50513 addi a0,a0,942 # 800223d0 + 8000402a: c3dfc0ef jal 80000c66 + + if(ff.type == FD_PIPE){ + 8000402e: 4785 li a5,1 + 80004030: 04f90063 beq s2,a5,80004070 + pipeclose(ff.pipe, ff.writable); + } else if(ff.type == FD_INODE || ff.type == FD_DEVICE){ + 80004034: 3979 addiw s2,s2,-2 + 80004036: 4785 li a5,1 + 80004038: 0527f563 bgeu a5,s2,80004082 + 8000403c: 7902 ld s2,32(sp) + 8000403e: 69e2 ld s3,24(sp) + 80004040: 6a42 ld s4,16(sp) + 80004042: 6aa2 ld s5,8(sp) + 80004044: a00d j 80004066 + 80004046: f04a sd s2,32(sp) + 80004048: ec4e sd s3,24(sp) + 8000404a: e852 sd s4,16(sp) + 8000404c: e456 sd s5,8(sp) + panic("fileclose"); + 8000404e: 00003517 auipc a0,0x3 + 80004052: 51a50513 addi a0,a0,1306 # 80007568 + 80004056: f8afc0ef jal 800007e0 + release(&ftable.lock); + 8000405a: 0001e517 auipc a0,0x1e + 8000405e: 37650513 addi a0,a0,886 # 800223d0 + 80004062: c05fc0ef jal 80000c66 + begin_op(); + iput(ff.ip); + end_op(); + } +} + 80004066: 70e2 ld ra,56(sp) + 80004068: 7442 ld s0,48(sp) + 8000406a: 74a2 ld s1,40(sp) + 8000406c: 6121 addi sp,sp,64 + 8000406e: 8082 ret + pipeclose(ff.pipe, ff.writable); + 80004070: 85d6 mv a1,s5 + 80004072: 8552 mv a0,s4 + 80004074: 336000ef jal 800043aa + 80004078: 7902 ld s2,32(sp) + 8000407a: 69e2 ld s3,24(sp) + 8000407c: 6a42 ld s4,16(sp) + 8000407e: 6aa2 ld s5,8(sp) + 80004080: b7dd j 80004066 + begin_op(); + 80004082: b4bff0ef jal 80003bcc + iput(ff.ip); + 80004086: 854e mv a0,s3 + 80004088: adcff0ef jal 80003364 + end_op(); + 8000408c: babff0ef jal 80003c36 + 80004090: 7902 ld s2,32(sp) + 80004092: 69e2 ld s3,24(sp) + 80004094: 6a42 ld s4,16(sp) + 80004096: 6aa2 ld s5,8(sp) + 80004098: b7f9 j 80004066 + +000000008000409a : + +// Get metadata about file f. +// addr is a user virtual address, pointing to a struct stat. +int +filestat(struct file *f, uint64 addr) +{ + 8000409a: 715d addi sp,sp,-80 + 8000409c: e486 sd ra,72(sp) + 8000409e: e0a2 sd s0,64(sp) + 800040a0: fc26 sd s1,56(sp) + 800040a2: f44e sd s3,40(sp) + 800040a4: 0880 addi s0,sp,80 + 800040a6: 84aa mv s1,a0 + 800040a8: 89ae mv s3,a1 + struct proc *p = myproc(); + 800040aa: 825fd0ef jal 800018ce + struct stat st; + + if(f->type == FD_INODE || f->type == FD_DEVICE){ + 800040ae: 409c lw a5,0(s1) + 800040b0: 37f9 addiw a5,a5,-2 + 800040b2: 4705 li a4,1 + 800040b4: 04f76063 bltu a4,a5,800040f4 + 800040b8: f84a sd s2,48(sp) + 800040ba: 892a mv s2,a0 + ilock(f->ip); + 800040bc: 6c88 ld a0,24(s1) + 800040be: 924ff0ef jal 800031e2 + stati(f->ip, &st); + 800040c2: fb840593 addi a1,s0,-72 + 800040c6: 6c88 ld a0,24(s1) + 800040c8: c80ff0ef jal 80003548 + iunlock(f->ip); + 800040cc: 6c88 ld a0,24(s1) + 800040ce: 9c2ff0ef jal 80003290 + if(copyout(p->pagetable, addr, (char *)&st, sizeof(st)) < 0) + 800040d2: 46e1 li a3,24 + 800040d4: fb840613 addi a2,s0,-72 + 800040d8: 85ce mv a1,s3 + 800040da: 05093503 ld a0,80(s2) + 800040de: d04fd0ef jal 800015e2 + 800040e2: 41f5551b sraiw a0,a0,0x1f + 800040e6: 7942 ld s2,48(sp) + return -1; + return 0; + } + return -1; +} + 800040e8: 60a6 ld ra,72(sp) + 800040ea: 6406 ld s0,64(sp) + 800040ec: 74e2 ld s1,56(sp) + 800040ee: 79a2 ld s3,40(sp) + 800040f0: 6161 addi sp,sp,80 + 800040f2: 8082 ret + return -1; + 800040f4: 557d li a0,-1 + 800040f6: bfcd j 800040e8 + +00000000800040f8 : + +// Read from file f. +// addr is a user virtual address. +int +fileread(struct file *f, uint64 addr, int n) +{ + 800040f8: 7179 addi sp,sp,-48 + 800040fa: f406 sd ra,40(sp) + 800040fc: f022 sd s0,32(sp) + 800040fe: e84a sd s2,16(sp) + 80004100: 1800 addi s0,sp,48 + int r = 0; + + if(f->readable == 0) + 80004102: 00854783 lbu a5,8(a0) + 80004106: cfd1 beqz a5,800041a2 + 80004108: ec26 sd s1,24(sp) + 8000410a: e44e sd s3,8(sp) + 8000410c: 84aa mv s1,a0 + 8000410e: 89ae mv s3,a1 + 80004110: 8932 mv s2,a2 + return -1; + + if(f->type == FD_PIPE){ + 80004112: 411c lw a5,0(a0) + 80004114: 4705 li a4,1 + 80004116: 04e78363 beq a5,a4,8000415c + r = piperead(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ + 8000411a: 470d li a4,3 + 8000411c: 04e78763 beq a5,a4,8000416a + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read) + return -1; + r = devsw[f->major].read(1, addr, n); + } else if(f->type == FD_INODE){ + 80004120: 4709 li a4,2 + 80004122: 06e79a63 bne a5,a4,80004196 + ilock(f->ip); + 80004126: 6d08 ld a0,24(a0) + 80004128: 8baff0ef jal 800031e2 + if((r = readi(f->ip, 1, addr, f->off, n)) > 0) + 8000412c: 874a mv a4,s2 + 8000412e: 5094 lw a3,32(s1) + 80004130: 864e mv a2,s3 + 80004132: 4585 li a1,1 + 80004134: 6c88 ld a0,24(s1) + 80004136: c3cff0ef jal 80003572 + 8000413a: 892a mv s2,a0 + 8000413c: 00a05563 blez a0,80004146 + f->off += r; + 80004140: 509c lw a5,32(s1) + 80004142: 9fa9 addw a5,a5,a0 + 80004144: d09c sw a5,32(s1) + iunlock(f->ip); + 80004146: 6c88 ld a0,24(s1) + 80004148: 948ff0ef jal 80003290 + 8000414c: 64e2 ld s1,24(sp) + 8000414e: 69a2 ld s3,8(sp) + } else { + panic("fileread"); + } + + return r; +} + 80004150: 854a mv a0,s2 + 80004152: 70a2 ld ra,40(sp) + 80004154: 7402 ld s0,32(sp) + 80004156: 6942 ld s2,16(sp) + 80004158: 6145 addi sp,sp,48 + 8000415a: 8082 ret + r = piperead(f->pipe, addr, n); + 8000415c: 6908 ld a0,16(a0) + 8000415e: 388000ef jal 800044e6 + 80004162: 892a mv s2,a0 + 80004164: 64e2 ld s1,24(sp) + 80004166: 69a2 ld s3,8(sp) + 80004168: b7e5 j 80004150 + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].read) + 8000416a: 02451783 lh a5,36(a0) + 8000416e: 03079693 slli a3,a5,0x30 + 80004172: 92c1 srli a3,a3,0x30 + 80004174: 4725 li a4,9 + 80004176: 02d76863 bltu a4,a3,800041a6 + 8000417a: 0792 slli a5,a5,0x4 + 8000417c: 0001e717 auipc a4,0x1e + 80004180: 1b470713 addi a4,a4,436 # 80022330 + 80004184: 97ba add a5,a5,a4 + 80004186: 639c ld a5,0(a5) + 80004188: c39d beqz a5,800041ae + r = devsw[f->major].read(1, addr, n); + 8000418a: 4505 li a0,1 + 8000418c: 9782 jalr a5 + 8000418e: 892a mv s2,a0 + 80004190: 64e2 ld s1,24(sp) + 80004192: 69a2 ld s3,8(sp) + 80004194: bf75 j 80004150 + panic("fileread"); + 80004196: 00003517 auipc a0,0x3 + 8000419a: 3e250513 addi a0,a0,994 # 80007578 + 8000419e: e42fc0ef jal 800007e0 + return -1; + 800041a2: 597d li s2,-1 + 800041a4: b775 j 80004150 + return -1; + 800041a6: 597d li s2,-1 + 800041a8: 64e2 ld s1,24(sp) + 800041aa: 69a2 ld s3,8(sp) + 800041ac: b755 j 80004150 + 800041ae: 597d li s2,-1 + 800041b0: 64e2 ld s1,24(sp) + 800041b2: 69a2 ld s3,8(sp) + 800041b4: bf71 j 80004150 + +00000000800041b6 : +int +filewrite(struct file *f, uint64 addr, int n) +{ + int r, ret = 0; + + if(f->writable == 0) + 800041b6: 00954783 lbu a5,9(a0) + 800041ba: 10078b63 beqz a5,800042d0 +{ + 800041be: 715d addi sp,sp,-80 + 800041c0: e486 sd ra,72(sp) + 800041c2: e0a2 sd s0,64(sp) + 800041c4: f84a sd s2,48(sp) + 800041c6: f052 sd s4,32(sp) + 800041c8: e85a sd s6,16(sp) + 800041ca: 0880 addi s0,sp,80 + 800041cc: 892a mv s2,a0 + 800041ce: 8b2e mv s6,a1 + 800041d0: 8a32 mv s4,a2 + return -1; + + if(f->type == FD_PIPE){ + 800041d2: 411c lw a5,0(a0) + 800041d4: 4705 li a4,1 + 800041d6: 02e78763 beq a5,a4,80004204 + ret = pipewrite(f->pipe, addr, n); + } else if(f->type == FD_DEVICE){ + 800041da: 470d li a4,3 + 800041dc: 02e78863 beq a5,a4,8000420c + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write) + return -1; + ret = devsw[f->major].write(1, addr, n); + } else if(f->type == FD_INODE){ + 800041e0: 4709 li a4,2 + 800041e2: 0ce79c63 bne a5,a4,800042ba + 800041e6: f44e sd s3,40(sp) + // the maximum log transaction size, including + // i-node, indirect block, allocation blocks, + // and 2 blocks of slop for non-aligned writes. + int max = ((MAXOPBLOCKS-1-1-2) / 2) * BSIZE; + int i = 0; + while(i < n){ + 800041e8: 0ac05863 blez a2,80004298 + 800041ec: fc26 sd s1,56(sp) + 800041ee: ec56 sd s5,24(sp) + 800041f0: e45e sd s7,8(sp) + 800041f2: e062 sd s8,0(sp) + int i = 0; + 800041f4: 4981 li s3,0 + int n1 = n - i; + if(n1 > max) + 800041f6: 6b85 lui s7,0x1 + 800041f8: c00b8b93 addi s7,s7,-1024 # c00 <_entry-0x7ffff400> + 800041fc: 6c05 lui s8,0x1 + 800041fe: c00c0c1b addiw s8,s8,-1024 # c00 <_entry-0x7ffff400> + 80004202: a8b5 j 8000427e + ret = pipewrite(f->pipe, addr, n); + 80004204: 6908 ld a0,16(a0) + 80004206: 1fc000ef jal 80004402 + 8000420a: a04d j 800042ac + if(f->major < 0 || f->major >= NDEV || !devsw[f->major].write) + 8000420c: 02451783 lh a5,36(a0) + 80004210: 03079693 slli a3,a5,0x30 + 80004214: 92c1 srli a3,a3,0x30 + 80004216: 4725 li a4,9 + 80004218: 0ad76e63 bltu a4,a3,800042d4 + 8000421c: 0792 slli a5,a5,0x4 + 8000421e: 0001e717 auipc a4,0x1e + 80004222: 11270713 addi a4,a4,274 # 80022330 + 80004226: 97ba add a5,a5,a4 + 80004228: 679c ld a5,8(a5) + 8000422a: c7dd beqz a5,800042d8 + ret = devsw[f->major].write(1, addr, n); + 8000422c: 4505 li a0,1 + 8000422e: 9782 jalr a5 + 80004230: a8b5 j 800042ac + if(n1 > max) + 80004232: 00048a9b sext.w s5,s1 + n1 = max; + + begin_op(); + 80004236: 997ff0ef jal 80003bcc + ilock(f->ip); + 8000423a: 01893503 ld a0,24(s2) + 8000423e: fa5fe0ef jal 800031e2 + if ((r = writei(f->ip, 1, addr + i, f->off, n1)) > 0) + 80004242: 8756 mv a4,s5 + 80004244: 02092683 lw a3,32(s2) + 80004248: 01698633 add a2,s3,s6 + 8000424c: 4585 li a1,1 + 8000424e: 01893503 ld a0,24(s2) + 80004252: c1cff0ef jal 8000366e + 80004256: 84aa mv s1,a0 + 80004258: 00a05763 blez a0,80004266 + f->off += r; + 8000425c: 02092783 lw a5,32(s2) + 80004260: 9fa9 addw a5,a5,a0 + 80004262: 02f92023 sw a5,32(s2) + iunlock(f->ip); + 80004266: 01893503 ld a0,24(s2) + 8000426a: 826ff0ef jal 80003290 + end_op(); + 8000426e: 9c9ff0ef jal 80003c36 + + if(r != n1){ + 80004272: 029a9563 bne s5,s1,8000429c + // error from writei + break; + } + i += r; + 80004276: 013489bb addw s3,s1,s3 + while(i < n){ + 8000427a: 0149da63 bge s3,s4,8000428e + int n1 = n - i; + 8000427e: 413a04bb subw s1,s4,s3 + if(n1 > max) + 80004282: 0004879b sext.w a5,s1 + 80004286: fafbd6e3 bge s7,a5,80004232 + 8000428a: 84e2 mv s1,s8 + 8000428c: b75d j 80004232 + 8000428e: 74e2 ld s1,56(sp) + 80004290: 6ae2 ld s5,24(sp) + 80004292: 6ba2 ld s7,8(sp) + 80004294: 6c02 ld s8,0(sp) + 80004296: a039 j 800042a4 + int i = 0; + 80004298: 4981 li s3,0 + 8000429a: a029 j 800042a4 + 8000429c: 74e2 ld s1,56(sp) + 8000429e: 6ae2 ld s5,24(sp) + 800042a0: 6ba2 ld s7,8(sp) + 800042a2: 6c02 ld s8,0(sp) + } + ret = (i == n ? n : -1); + 800042a4: 033a1c63 bne s4,s3,800042dc + 800042a8: 8552 mv a0,s4 + 800042aa: 79a2 ld s3,40(sp) + } else { + panic("filewrite"); + } + + return ret; +} + 800042ac: 60a6 ld ra,72(sp) + 800042ae: 6406 ld s0,64(sp) + 800042b0: 7942 ld s2,48(sp) + 800042b2: 7a02 ld s4,32(sp) + 800042b4: 6b42 ld s6,16(sp) + 800042b6: 6161 addi sp,sp,80 + 800042b8: 8082 ret + 800042ba: fc26 sd s1,56(sp) + 800042bc: f44e sd s3,40(sp) + 800042be: ec56 sd s5,24(sp) + 800042c0: e45e sd s7,8(sp) + 800042c2: e062 sd s8,0(sp) + panic("filewrite"); + 800042c4: 00003517 auipc a0,0x3 + 800042c8: 2c450513 addi a0,a0,708 # 80007588 + 800042cc: d14fc0ef jal 800007e0 + return -1; + 800042d0: 557d li a0,-1 +} + 800042d2: 8082 ret + return -1; + 800042d4: 557d li a0,-1 + 800042d6: bfd9 j 800042ac + 800042d8: 557d li a0,-1 + 800042da: bfc9 j 800042ac + ret = (i == n ? n : -1); + 800042dc: 557d li a0,-1 + 800042de: 79a2 ld s3,40(sp) + 800042e0: b7f1 j 800042ac + +00000000800042e2 : + int writeopen; // write fd is still open +}; + +int +pipealloc(struct file **f0, struct file **f1) +{ + 800042e2: 7179 addi sp,sp,-48 + 800042e4: f406 sd ra,40(sp) + 800042e6: f022 sd s0,32(sp) + 800042e8: ec26 sd s1,24(sp) + 800042ea: e052 sd s4,0(sp) + 800042ec: 1800 addi s0,sp,48 + 800042ee: 84aa mv s1,a0 + 800042f0: 8a2e mv s4,a1 + struct pipe *pi; + + pi = 0; + *f0 = *f1 = 0; + 800042f2: 0005b023 sd zero,0(a1) + 800042f6: 00053023 sd zero,0(a0) + if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0) + 800042fa: c3bff0ef jal 80003f34 + 800042fe: e088 sd a0,0(s1) + 80004300: c549 beqz a0,8000438a + 80004302: c33ff0ef jal 80003f34 + 80004306: 00aa3023 sd a0,0(s4) + 8000430a: cd25 beqz a0,80004382 + 8000430c: e84a sd s2,16(sp) + goto bad; + if((pi = (struct pipe*)kalloc()) == 0) + 8000430e: ff0fc0ef jal 80000afe + 80004312: 892a mv s2,a0 + 80004314: c12d beqz a0,80004376 + 80004316: e44e sd s3,8(sp) + goto bad; + pi->readopen = 1; + 80004318: 4985 li s3,1 + 8000431a: 23352023 sw s3,544(a0) + pi->writeopen = 1; + 8000431e: 23352223 sw s3,548(a0) + pi->nwrite = 0; + 80004322: 20052e23 sw zero,540(a0) + pi->nread = 0; + 80004326: 20052c23 sw zero,536(a0) + initlock(&pi->lock, "pipe"); + 8000432a: 00003597 auipc a1,0x3 + 8000432e: 26e58593 addi a1,a1,622 # 80007598 + 80004332: 81dfc0ef jal 80000b4e + (*f0)->type = FD_PIPE; + 80004336: 609c ld a5,0(s1) + 80004338: 0137a023 sw s3,0(a5) + (*f0)->readable = 1; + 8000433c: 609c ld a5,0(s1) + 8000433e: 01378423 sb s3,8(a5) + (*f0)->writable = 0; + 80004342: 609c ld a5,0(s1) + 80004344: 000784a3 sb zero,9(a5) + (*f0)->pipe = pi; + 80004348: 609c ld a5,0(s1) + 8000434a: 0127b823 sd s2,16(a5) + (*f1)->type = FD_PIPE; + 8000434e: 000a3783 ld a5,0(s4) + 80004352: 0137a023 sw s3,0(a5) + (*f1)->readable = 0; + 80004356: 000a3783 ld a5,0(s4) + 8000435a: 00078423 sb zero,8(a5) + (*f1)->writable = 1; + 8000435e: 000a3783 ld a5,0(s4) + 80004362: 013784a3 sb s3,9(a5) + (*f1)->pipe = pi; + 80004366: 000a3783 ld a5,0(s4) + 8000436a: 0127b823 sd s2,16(a5) + return 0; + 8000436e: 4501 li a0,0 + 80004370: 6942 ld s2,16(sp) + 80004372: 69a2 ld s3,8(sp) + 80004374: a01d j 8000439a + + bad: + if(pi) + kfree((char*)pi); + if(*f0) + 80004376: 6088 ld a0,0(s1) + 80004378: c119 beqz a0,8000437e + 8000437a: 6942 ld s2,16(sp) + 8000437c: a029 j 80004386 + 8000437e: 6942 ld s2,16(sp) + 80004380: a029 j 8000438a + 80004382: 6088 ld a0,0(s1) + 80004384: c10d beqz a0,800043a6 + fileclose(*f0); + 80004386: c53ff0ef jal 80003fd8 + if(*f1) + 8000438a: 000a3783 ld a5,0(s4) + fileclose(*f1); + return -1; + 8000438e: 557d li a0,-1 + if(*f1) + 80004390: c789 beqz a5,8000439a + fileclose(*f1); + 80004392: 853e mv a0,a5 + 80004394: c45ff0ef jal 80003fd8 + return -1; + 80004398: 557d li a0,-1 +} + 8000439a: 70a2 ld ra,40(sp) + 8000439c: 7402 ld s0,32(sp) + 8000439e: 64e2 ld s1,24(sp) + 800043a0: 6a02 ld s4,0(sp) + 800043a2: 6145 addi sp,sp,48 + 800043a4: 8082 ret + return -1; + 800043a6: 557d li a0,-1 + 800043a8: bfcd j 8000439a + +00000000800043aa : + +void +pipeclose(struct pipe *pi, int writable) +{ + 800043aa: 1101 addi sp,sp,-32 + 800043ac: ec06 sd ra,24(sp) + 800043ae: e822 sd s0,16(sp) + 800043b0: e426 sd s1,8(sp) + 800043b2: e04a sd s2,0(sp) + 800043b4: 1000 addi s0,sp,32 + 800043b6: 84aa mv s1,a0 + 800043b8: 892e mv s2,a1 + acquire(&pi->lock); + 800043ba: 815fc0ef jal 80000bce + if(writable){ + 800043be: 02090763 beqz s2,800043ec + pi->writeopen = 0; + 800043c2: 2204a223 sw zero,548(s1) + wakeup(&pi->nread); + 800043c6: 21848513 addi a0,s1,536 + 800043ca: b5bfd0ef jal 80001f24 + } else { + pi->readopen = 0; + wakeup(&pi->nwrite); + } + if(pi->readopen == 0 && pi->writeopen == 0){ + 800043ce: 2204b783 ld a5,544(s1) + 800043d2: e785 bnez a5,800043fa + release(&pi->lock); + 800043d4: 8526 mv a0,s1 + 800043d6: 891fc0ef jal 80000c66 + kfree((char*)pi); + 800043da: 8526 mv a0,s1 + 800043dc: e40fc0ef jal 80000a1c + } else + release(&pi->lock); +} + 800043e0: 60e2 ld ra,24(sp) + 800043e2: 6442 ld s0,16(sp) + 800043e4: 64a2 ld s1,8(sp) + 800043e6: 6902 ld s2,0(sp) + 800043e8: 6105 addi sp,sp,32 + 800043ea: 8082 ret + pi->readopen = 0; + 800043ec: 2204a023 sw zero,544(s1) + wakeup(&pi->nwrite); + 800043f0: 21c48513 addi a0,s1,540 + 800043f4: b31fd0ef jal 80001f24 + 800043f8: bfd9 j 800043ce + release(&pi->lock); + 800043fa: 8526 mv a0,s1 + 800043fc: 86bfc0ef jal 80000c66 +} + 80004400: b7c5 j 800043e0 + +0000000080004402 : + +int +pipewrite(struct pipe *pi, uint64 addr, int n) +{ + 80004402: 711d addi sp,sp,-96 + 80004404: ec86 sd ra,88(sp) + 80004406: e8a2 sd s0,80(sp) + 80004408: e4a6 sd s1,72(sp) + 8000440a: e0ca sd s2,64(sp) + 8000440c: fc4e sd s3,56(sp) + 8000440e: f852 sd s4,48(sp) + 80004410: f456 sd s5,40(sp) + 80004412: 1080 addi s0,sp,96 + 80004414: 84aa mv s1,a0 + 80004416: 8aae mv s5,a1 + 80004418: 8a32 mv s4,a2 + int i = 0; + struct proc *pr = myproc(); + 8000441a: cb4fd0ef jal 800018ce + 8000441e: 89aa mv s3,a0 + + acquire(&pi->lock); + 80004420: 8526 mv a0,s1 + 80004422: facfc0ef jal 80000bce + while(i < n){ + 80004426: 0b405a63 blez s4,800044da + 8000442a: f05a sd s6,32(sp) + 8000442c: ec5e sd s7,24(sp) + 8000442e: e862 sd s8,16(sp) + int i = 0; + 80004430: 4901 li s2,0 + if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full + wakeup(&pi->nread); + sleep(&pi->nwrite, &pi->lock); + } else { + char ch; + if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) + 80004432: 5b7d li s6,-1 + wakeup(&pi->nread); + 80004434: 21848c13 addi s8,s1,536 + sleep(&pi->nwrite, &pi->lock); + 80004438: 21c48b93 addi s7,s1,540 + 8000443c: a81d j 80004472 + release(&pi->lock); + 8000443e: 8526 mv a0,s1 + 80004440: 827fc0ef jal 80000c66 + return -1; + 80004444: 597d li s2,-1 + 80004446: 7b02 ld s6,32(sp) + 80004448: 6be2 ld s7,24(sp) + 8000444a: 6c42 ld s8,16(sp) + } + wakeup(&pi->nread); + release(&pi->lock); + + return i; +} + 8000444c: 854a mv a0,s2 + 8000444e: 60e6 ld ra,88(sp) + 80004450: 6446 ld s0,80(sp) + 80004452: 64a6 ld s1,72(sp) + 80004454: 6906 ld s2,64(sp) + 80004456: 79e2 ld s3,56(sp) + 80004458: 7a42 ld s4,48(sp) + 8000445a: 7aa2 ld s5,40(sp) + 8000445c: 6125 addi sp,sp,96 + 8000445e: 8082 ret + wakeup(&pi->nread); + 80004460: 8562 mv a0,s8 + 80004462: ac3fd0ef jal 80001f24 + sleep(&pi->nwrite, &pi->lock); + 80004466: 85a6 mv a1,s1 + 80004468: 855e mv a0,s7 + 8000446a: a6ffd0ef jal 80001ed8 + while(i < n){ + 8000446e: 05495b63 bge s2,s4,800044c4 + if(pi->readopen == 0 || killed(pr)){ + 80004472: 2204a783 lw a5,544(s1) + 80004476: d7e1 beqz a5,8000443e + 80004478: 854e mv a0,s3 + 8000447a: c97fd0ef jal 80002110 + 8000447e: f161 bnez a0,8000443e + if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full + 80004480: 2184a783 lw a5,536(s1) + 80004484: 21c4a703 lw a4,540(s1) + 80004488: 2007879b addiw a5,a5,512 + 8000448c: fcf70ae3 beq a4,a5,80004460 + if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) + 80004490: 4685 li a3,1 + 80004492: 01590633 add a2,s2,s5 + 80004496: faf40593 addi a1,s0,-81 + 8000449a: 0509b503 ld a0,80(s3) + 8000449e: a28fd0ef jal 800016c6 + 800044a2: 03650e63 beq a0,s6,800044de + pi->data[pi->nwrite++ % PIPESIZE] = ch; + 800044a6: 21c4a783 lw a5,540(s1) + 800044aa: 0017871b addiw a4,a5,1 + 800044ae: 20e4ae23 sw a4,540(s1) + 800044b2: 1ff7f793 andi a5,a5,511 + 800044b6: 97a6 add a5,a5,s1 + 800044b8: faf44703 lbu a4,-81(s0) + 800044bc: 00e78c23 sb a4,24(a5) + i++; + 800044c0: 2905 addiw s2,s2,1 + 800044c2: b775 j 8000446e + 800044c4: 7b02 ld s6,32(sp) + 800044c6: 6be2 ld s7,24(sp) + 800044c8: 6c42 ld s8,16(sp) + wakeup(&pi->nread); + 800044ca: 21848513 addi a0,s1,536 + 800044ce: a57fd0ef jal 80001f24 + release(&pi->lock); + 800044d2: 8526 mv a0,s1 + 800044d4: f92fc0ef jal 80000c66 + return i; + 800044d8: bf95 j 8000444c + int i = 0; + 800044da: 4901 li s2,0 + 800044dc: b7fd j 800044ca + 800044de: 7b02 ld s6,32(sp) + 800044e0: 6be2 ld s7,24(sp) + 800044e2: 6c42 ld s8,16(sp) + 800044e4: b7dd j 800044ca + +00000000800044e6 : + +int +piperead(struct pipe *pi, uint64 addr, int n) +{ + 800044e6: 715d addi sp,sp,-80 + 800044e8: e486 sd ra,72(sp) + 800044ea: e0a2 sd s0,64(sp) + 800044ec: fc26 sd s1,56(sp) + 800044ee: f84a sd s2,48(sp) + 800044f0: f44e sd s3,40(sp) + 800044f2: f052 sd s4,32(sp) + 800044f4: ec56 sd s5,24(sp) + 800044f6: 0880 addi s0,sp,80 + 800044f8: 84aa mv s1,a0 + 800044fa: 892e mv s2,a1 + 800044fc: 8ab2 mv s5,a2 + int i; + struct proc *pr = myproc(); + 800044fe: bd0fd0ef jal 800018ce + 80004502: 8a2a mv s4,a0 + char ch; + + acquire(&pi->lock); + 80004504: 8526 mv a0,s1 + 80004506: ec8fc0ef jal 80000bce + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + 8000450a: 2184a703 lw a4,536(s1) + 8000450e: 21c4a783 lw a5,540(s1) + if(killed(pr)){ + release(&pi->lock); + return -1; + } + sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep + 80004512: 21848993 addi s3,s1,536 + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + 80004516: 02f71563 bne a4,a5,80004540 + 8000451a: 2244a783 lw a5,548(s1) + 8000451e: cb85 beqz a5,8000454e + if(killed(pr)){ + 80004520: 8552 mv a0,s4 + 80004522: beffd0ef jal 80002110 + 80004526: ed19 bnez a0,80004544 + sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep + 80004528: 85a6 mv a1,s1 + 8000452a: 854e mv a0,s3 + 8000452c: 9adfd0ef jal 80001ed8 + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + 80004530: 2184a703 lw a4,536(s1) + 80004534: 21c4a783 lw a5,540(s1) + 80004538: fef701e3 beq a4,a5,8000451a + 8000453c: e85a sd s6,16(sp) + 8000453e: a809 j 80004550 + 80004540: e85a sd s6,16(sp) + 80004542: a039 j 80004550 + release(&pi->lock); + 80004544: 8526 mv a0,s1 + 80004546: f20fc0ef jal 80000c66 + return -1; + 8000454a: 59fd li s3,-1 + 8000454c: a8b9 j 800045aa + 8000454e: e85a sd s6,16(sp) + } + for(i = 0; i < n; i++){ //DOC: piperead-copy + 80004550: 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) { + 80004552: 5b7d li s6,-1 + for(i = 0; i < n; i++){ //DOC: piperead-copy + 80004554: 05505363 blez s5,8000459a + if(pi->nread == pi->nwrite) + 80004558: 2184a783 lw a5,536(s1) + 8000455c: 21c4a703 lw a4,540(s1) + 80004560: 02f70d63 beq a4,a5,8000459a + ch = pi->data[pi->nread % PIPESIZE]; + 80004564: 1ff7f793 andi a5,a5,511 + 80004568: 97a6 add a5,a5,s1 + 8000456a: 0187c783 lbu a5,24(a5) + 8000456e: faf40fa3 sb a5,-65(s0) + if(copyout(pr->pagetable, addr + i, &ch, 1) == -1) { + 80004572: 4685 li a3,1 + 80004574: fbf40613 addi a2,s0,-65 + 80004578: 85ca mv a1,s2 + 8000457a: 050a3503 ld a0,80(s4) + 8000457e: 864fd0ef jal 800015e2 + 80004582: 03650e63 beq a0,s6,800045be + if(i == 0) + i = -1; + break; + } + pi->nread++; + 80004586: 2184a783 lw a5,536(s1) + 8000458a: 2785 addiw a5,a5,1 + 8000458c: 20f4ac23 sw a5,536(s1) + for(i = 0; i < n; i++){ //DOC: piperead-copy + 80004590: 2985 addiw s3,s3,1 + 80004592: 0905 addi s2,s2,1 + 80004594: fd3a92e3 bne s5,s3,80004558 + 80004598: 89d6 mv s3,s5 + } + wakeup(&pi->nwrite); //DOC: piperead-wakeup + 8000459a: 21c48513 addi a0,s1,540 + 8000459e: 987fd0ef jal 80001f24 + release(&pi->lock); + 800045a2: 8526 mv a0,s1 + 800045a4: ec2fc0ef jal 80000c66 + 800045a8: 6b42 ld s6,16(sp) + return i; +} + 800045aa: 854e mv a0,s3 + 800045ac: 60a6 ld ra,72(sp) + 800045ae: 6406 ld s0,64(sp) + 800045b0: 74e2 ld s1,56(sp) + 800045b2: 7942 ld s2,48(sp) + 800045b4: 79a2 ld s3,40(sp) + 800045b6: 7a02 ld s4,32(sp) + 800045b8: 6ae2 ld s5,24(sp) + 800045ba: 6161 addi sp,sp,80 + 800045bc: 8082 ret + if(i == 0) + 800045be: fc099ee3 bnez s3,8000459a + i = -1; + 800045c2: 89aa mv s3,a0 + 800045c4: bfd9 j 8000459a + +00000000800045c6 : + +static int loadseg(pde_t *, uint64, struct inode *, uint, uint); + +// map ELF permissions to PTE permission bits. +int flags2perm(int flags) +{ + 800045c6: 1141 addi sp,sp,-16 + 800045c8: e422 sd s0,8(sp) + 800045ca: 0800 addi s0,sp,16 + 800045cc: 87aa mv a5,a0 + int perm = 0; + if(flags & 0x1) + 800045ce: 8905 andi a0,a0,1 + 800045d0: 050e slli a0,a0,0x3 + perm = PTE_X; + if(flags & 0x2) + 800045d2: 8b89 andi a5,a5,2 + 800045d4: c399 beqz a5,800045da + perm |= PTE_W; + 800045d6: 00456513 ori a0,a0,4 + return perm; +} + 800045da: 6422 ld s0,8(sp) + 800045dc: 0141 addi sp,sp,16 + 800045de: 8082 ret + +00000000800045e0 : +// +// the implementation of the exec() system call +// +int +kexec(char *path, char **argv) +{ + 800045e0: df010113 addi sp,sp,-528 + 800045e4: 20113423 sd ra,520(sp) + 800045e8: 20813023 sd s0,512(sp) + 800045ec: ffa6 sd s1,504(sp) + 800045ee: fbca sd s2,496(sp) + 800045f0: 0c00 addi s0,sp,528 + 800045f2: 892a mv s2,a0 + 800045f4: dea43c23 sd a0,-520(s0) + 800045f8: e0b43023 sd a1,-512(s0) + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + struct elfhdr elf; + struct inode *ip; + struct proghdr ph; + pagetable_t pagetable = 0, oldpagetable; + struct proc *p = myproc(); + 800045fc: ad2fd0ef jal 800018ce + 80004600: 84aa mv s1,a0 + + begin_op(); + 80004602: dcaff0ef jal 80003bcc + + // Open the executable file. + if((ip = namei(path)) == 0){ + 80004606: 854a mv a0,s2 + 80004608: bf0ff0ef jal 800039f8 + 8000460c: c931 beqz a0,80004660 + 8000460e: f3d2 sd s4,480(sp) + 80004610: 8a2a mv s4,a0 + end_op(); + return -1; + } + ilock(ip); + 80004612: bd1fe0ef jal 800031e2 + + // Read the ELF header. + if(readi(ip, 0, (uint64)&elf, 0, sizeof(elf)) != sizeof(elf)) + 80004616: 04000713 li a4,64 + 8000461a: 4681 li a3,0 + 8000461c: e5040613 addi a2,s0,-432 + 80004620: 4581 li a1,0 + 80004622: 8552 mv a0,s4 + 80004624: f4ffe0ef jal 80003572 + 80004628: 04000793 li a5,64 + 8000462c: 00f51a63 bne a0,a5,80004640 + goto bad; + + // Is this really an ELF file? + if(elf.magic != ELF_MAGIC) + 80004630: e5042703 lw a4,-432(s0) + 80004634: 464c47b7 lui a5,0x464c4 + 80004638: 57f78793 addi a5,a5,1407 # 464c457f <_entry-0x39b3ba81> + 8000463c: 02f70663 beq a4,a5,80004668 + + bad: + if(pagetable) + proc_freepagetable(pagetable, sz); + if(ip){ + iunlockput(ip); + 80004640: 8552 mv a0,s4 + 80004642: dabfe0ef jal 800033ec + end_op(); + 80004646: df0ff0ef jal 80003c36 + } + return -1; + 8000464a: 557d li a0,-1 + 8000464c: 7a1e ld s4,480(sp) +} + 8000464e: 20813083 ld ra,520(sp) + 80004652: 20013403 ld s0,512(sp) + 80004656: 74fe ld s1,504(sp) + 80004658: 795e ld s2,496(sp) + 8000465a: 21010113 addi sp,sp,528 + 8000465e: 8082 ret + end_op(); + 80004660: dd6ff0ef jal 80003c36 + return -1; + 80004664: 557d li a0,-1 + 80004666: b7e5 j 8000464e + 80004668: ebda sd s6,464(sp) + if((pagetable = proc_pagetable(p)) == 0) + 8000466a: 8526 mv a0,s1 + 8000466c: b68fd0ef jal 800019d4 + 80004670: 8b2a mv s6,a0 + 80004672: 2c050b63 beqz a0,80004948 + 80004676: f7ce sd s3,488(sp) + 80004678: efd6 sd s5,472(sp) + 8000467a: e7de sd s7,456(sp) + 8000467c: e3e2 sd s8,448(sp) + 8000467e: ff66 sd s9,440(sp) + 80004680: fb6a sd s10,432(sp) + for(i=0, off=elf.phoff; i + 8000468e: f76e sd s11,424(sp) + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + 80004690: 4901 li s2,0 + for(i=0, off=elf.phoff; i + 8000469a: def43823 sd a5,-528(s0) + + for(i = 0; i < sz; i += PGSIZE){ + pa = walkaddr(pagetable, va + i); + if(pa == 0) + panic("loadseg: address should exist"); + if(sz - i < PGSIZE) + 8000469e: 6a85 lui s5,0x1 + 800046a0: a085 j 80004700 + panic("loadseg: address should exist"); + 800046a2: 00003517 auipc a0,0x3 + 800046a6: efe50513 addi a0,a0,-258 # 800075a0 + 800046aa: 936fc0ef jal 800007e0 + if(sz - i < PGSIZE) + 800046ae: 2481 sext.w s1,s1 + n = sz - i; + else + n = PGSIZE; + if(readi(ip, 0, (uint64)pa, offset+i, n) != n) + 800046b0: 8726 mv a4,s1 + 800046b2: 012c06bb addw a3,s8,s2 + 800046b6: 4581 li a1,0 + 800046b8: 8552 mv a0,s4 + 800046ba: eb9fe0ef jal 80003572 + 800046be: 2501 sext.w a0,a0 + 800046c0: 24a49a63 bne s1,a0,80004914 + for(i = 0; i < sz; i += PGSIZE){ + 800046c4: 012a893b addw s2,s5,s2 + 800046c8: 03397363 bgeu s2,s3,800046ee + pa = walkaddr(pagetable, va + i); + 800046cc: 02091593 slli a1,s2,0x20 + 800046d0: 9181 srli a1,a1,0x20 + 800046d2: 95de add a1,a1,s7 + 800046d4: 855a mv a0,s6 + 800046d6: 8dbfc0ef jal 80000fb0 + 800046da: 862a mv a2,a0 + if(pa == 0) + 800046dc: d179 beqz a0,800046a2 + if(sz - i < PGSIZE) + 800046de: 412984bb subw s1,s3,s2 + 800046e2: 0004879b sext.w a5,s1 + 800046e6: fcfcf4e3 bgeu s9,a5,800046ae + 800046ea: 84d6 mv s1,s5 + 800046ec: b7c9 j 800046ae + sz = sz1; + 800046ee: e0843903 ld s2,-504(s0) + for(i=0, off=elf.phoff; i + 800046f8: e8845783 lhu a5,-376(s0) + 800046fc: 08fdd063 bge s11,a5,8000477c + if(readi(ip, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph)) + 80004700: 2d01 sext.w s10,s10 + 80004702: 03800713 li a4,56 + 80004706: 86ea mv a3,s10 + 80004708: e1840613 addi a2,s0,-488 + 8000470c: 4581 li a1,0 + 8000470e: 8552 mv a0,s4 + 80004710: e63fe0ef jal 80003572 + 80004714: 03800793 li a5,56 + 80004718: 1cf51663 bne a0,a5,800048e4 + if(ph.type != ELF_PROG_LOAD) + 8000471c: e1842783 lw a5,-488(s0) + 80004720: 4705 li a4,1 + 80004722: fce798e3 bne a5,a4,800046f2 + if(ph.memsz < ph.filesz) + 80004726: e4043483 ld s1,-448(s0) + 8000472a: e3843783 ld a5,-456(s0) + 8000472e: 1af4ef63 bltu s1,a5,800048ec + if(ph.vaddr + ph.memsz < ph.vaddr) + 80004732: e2843783 ld a5,-472(s0) + 80004736: 94be add s1,s1,a5 + 80004738: 1af4ee63 bltu s1,a5,800048f4 + if(ph.vaddr % PGSIZE != 0) + 8000473c: df043703 ld a4,-528(s0) + 80004740: 8ff9 and a5,a5,a4 + 80004742: 1a079d63 bnez a5,800048fc + if((sz1 = uvmalloc(pagetable, sz, ph.vaddr + ph.memsz, flags2perm(ph.flags))) == 0) + 80004746: e1c42503 lw a0,-484(s0) + 8000474a: e7dff0ef jal 800045c6 + 8000474e: 86aa mv a3,a0 + 80004750: 8626 mv a2,s1 + 80004752: 85ca mv a1,s2 + 80004754: 855a mv a0,s6 + 80004756: b33fc0ef jal 80001288 + 8000475a: e0a43423 sd a0,-504(s0) + 8000475e: 1a050363 beqz a0,80004904 + if(loadseg(pagetable, ph.vaddr, ip, ph.off, ph.filesz) < 0) + 80004762: e2843b83 ld s7,-472(s0) + 80004766: e2042c03 lw s8,-480(s0) + 8000476a: e3842983 lw s3,-456(s0) + for(i = 0; i < sz; i += PGSIZE){ + 8000476e: 00098463 beqz s3,80004776 + 80004772: 4901 li s2,0 + 80004774: bfa1 j 800046cc + sz = sz1; + 80004776: e0843903 ld s2,-504(s0) + 8000477a: bfa5 j 800046f2 + 8000477c: 7dba ld s11,424(sp) + iunlockput(ip); + 8000477e: 8552 mv a0,s4 + 80004780: c6dfe0ef jal 800033ec + end_op(); + 80004784: cb2ff0ef jal 80003c36 + p = myproc(); + 80004788: 946fd0ef jal 800018ce + 8000478c: 8aaa mv s5,a0 + uint64 oldsz = p->sz; + 8000478e: 04853c83 ld s9,72(a0) + sz = PGROUNDUP(sz); + 80004792: 6985 lui s3,0x1 + 80004794: 19fd addi s3,s3,-1 # fff <_entry-0x7ffff001> + 80004796: 99ca add s3,s3,s2 + 80004798: 77fd lui a5,0xfffff + 8000479a: 00f9f9b3 and s3,s3,a5 + if((sz1 = uvmalloc(pagetable, sz, sz + (USERSTACK+1)*PGSIZE, PTE_W)) == 0) + 8000479e: 4691 li a3,4 + 800047a0: 6609 lui a2,0x2 + 800047a2: 964e add a2,a2,s3 + 800047a4: 85ce mv a1,s3 + 800047a6: 855a mv a0,s6 + 800047a8: ae1fc0ef jal 80001288 + 800047ac: 892a mv s2,a0 + 800047ae: e0a43423 sd a0,-504(s0) + 800047b2: e519 bnez a0,800047c0 + if(pagetable) + 800047b4: e1343423 sd s3,-504(s0) + 800047b8: 4a01 li s4,0 + 800047ba: aab1 j 80004916 + uint64 argc, sz = 0, sp, ustack[MAXARG], stackbase; + 800047bc: 4901 li s2,0 + 800047be: b7c1 j 8000477e + uvmclear(pagetable, sz-(USERSTACK+1)*PGSIZE); + 800047c0: 75f9 lui a1,0xffffe + 800047c2: 95aa add a1,a1,a0 + 800047c4: 855a mv a0,s6 + 800047c6: c99fc0ef jal 8000145e + stackbase = sp - USERSTACK*PGSIZE; + 800047ca: 7bfd lui s7,0xfffff + 800047cc: 9bca add s7,s7,s2 + for(argc = 0; argv[argc]; argc++) { + 800047ce: e0043783 ld a5,-512(s0) + 800047d2: 6388 ld a0,0(a5) + 800047d4: cd39 beqz a0,80004832 + 800047d6: e9040993 addi s3,s0,-368 + 800047da: f9040c13 addi s8,s0,-112 + 800047de: 4481 li s1,0 + sp -= strlen(argv[argc]) + 1; + 800047e0: e32fc0ef jal 80000e12 + 800047e4: 0015079b addiw a5,a0,1 + 800047e8: 40f907b3 sub a5,s2,a5 + sp -= sp % 16; // riscv sp must be 16-byte aligned + 800047ec: ff07f913 andi s2,a5,-16 + if(sp < stackbase) + 800047f0: 11796e63 bltu s2,s7,8000490c + if(copyout(pagetable, sp, argv[argc], strlen(argv[argc]) + 1) < 0) + 800047f4: e0043d03 ld s10,-512(s0) + 800047f8: 000d3a03 ld s4,0(s10) + 800047fc: 8552 mv a0,s4 + 800047fe: e14fc0ef jal 80000e12 + 80004802: 0015069b addiw a3,a0,1 + 80004806: 8652 mv a2,s4 + 80004808: 85ca mv a1,s2 + 8000480a: 855a mv a0,s6 + 8000480c: dd7fc0ef jal 800015e2 + 80004810: 10054063 bltz a0,80004910 + ustack[argc] = sp; + 80004814: 0129b023 sd s2,0(s3) + for(argc = 0; argv[argc]; argc++) { + 80004818: 0485 addi s1,s1,1 + 8000481a: 008d0793 addi a5,s10,8 + 8000481e: e0f43023 sd a5,-512(s0) + 80004822: 008d3503 ld a0,8(s10) + 80004826: c909 beqz a0,80004838 + if(argc >= MAXARG) + 80004828: 09a1 addi s3,s3,8 + 8000482a: fb899be3 bne s3,s8,800047e0 + ip = 0; + 8000482e: 4a01 li s4,0 + 80004830: a0dd j 80004916 + sp = sz; + 80004832: e0843903 ld s2,-504(s0) + for(argc = 0; argv[argc]; argc++) { + 80004836: 4481 li s1,0 + ustack[argc] = 0; + 80004838: 00349793 slli a5,s1,0x3 + 8000483c: f9078793 addi a5,a5,-112 # ffffffffffffef90 + 80004840: 97a2 add a5,a5,s0 + 80004842: f007b023 sd zero,-256(a5) + sp -= (argc+1) * sizeof(uint64); + 80004846: 00148693 addi a3,s1,1 + 8000484a: 068e slli a3,a3,0x3 + 8000484c: 40d90933 sub s2,s2,a3 + sp -= sp % 16; + 80004850: ff097913 andi s2,s2,-16 + sz = sz1; + 80004854: e0843983 ld s3,-504(s0) + if(sp < stackbase) + 80004858: f5796ee3 bltu s2,s7,800047b4 + if(copyout(pagetable, sp, (char *)ustack, (argc+1)*sizeof(uint64)) < 0) + 8000485c: e9040613 addi a2,s0,-368 + 80004860: 85ca mv a1,s2 + 80004862: 855a mv a0,s6 + 80004864: d7ffc0ef jal 800015e2 + 80004868: 0e054263 bltz a0,8000494c + p->trapframe->a1 = sp; + 8000486c: 058ab783 ld a5,88(s5) # 1058 <_entry-0x7fffefa8> + 80004870: 0727bc23 sd s2,120(a5) + for(last=s=path; *s; s++) + 80004874: df843783 ld a5,-520(s0) + 80004878: 0007c703 lbu a4,0(a5) + 8000487c: cf11 beqz a4,80004898 + 8000487e: 0785 addi a5,a5,1 + if(*s == '/') + 80004880: 02f00693 li a3,47 + 80004884: a039 j 80004892 + last = s+1; + 80004886: def43c23 sd a5,-520(s0) + for(last=s=path; *s; s++) + 8000488a: 0785 addi a5,a5,1 + 8000488c: fff7c703 lbu a4,-1(a5) + 80004890: c701 beqz a4,80004898 + if(*s == '/') + 80004892: fed71ce3 bne a4,a3,8000488a + 80004896: bfc5 j 80004886 + safestrcpy(p->name, last, sizeof(p->name)); + 80004898: 4641 li a2,16 + 8000489a: df843583 ld a1,-520(s0) + 8000489e: 158a8513 addi a0,s5,344 + 800048a2: d3efc0ef jal 80000de0 + oldpagetable = p->pagetable; + 800048a6: 050ab503 ld a0,80(s5) + p->pagetable = pagetable; + 800048aa: 056ab823 sd s6,80(s5) + p->sz = sz; + 800048ae: e0843783 ld a5,-504(s0) + 800048b2: 04fab423 sd a5,72(s5) + p->trapframe->epc = elf.entry; // initial program counter = ulib.c:start() + 800048b6: 058ab783 ld a5,88(s5) + 800048ba: e6843703 ld a4,-408(s0) + 800048be: ef98 sd a4,24(a5) + p->trapframe->sp = sp; // initial stack pointer + 800048c0: 058ab783 ld a5,88(s5) + 800048c4: 0327b823 sd s2,48(a5) + proc_freepagetable(oldpagetable, oldsz); + 800048c8: 85e6 mv a1,s9 + 800048ca: 98efd0ef jal 80001a58 + return argc; // this ends up in a0, the first argument to main(argc, argv) + 800048ce: 0004851b sext.w a0,s1 + 800048d2: 79be ld s3,488(sp) + 800048d4: 7a1e ld s4,480(sp) + 800048d6: 6afe ld s5,472(sp) + 800048d8: 6b5e ld s6,464(sp) + 800048da: 6bbe ld s7,456(sp) + 800048dc: 6c1e ld s8,448(sp) + 800048de: 7cfa ld s9,440(sp) + 800048e0: 7d5a ld s10,432(sp) + 800048e2: b3b5 j 8000464e + 800048e4: e1243423 sd s2,-504(s0) + 800048e8: 7dba ld s11,424(sp) + 800048ea: a035 j 80004916 + 800048ec: e1243423 sd s2,-504(s0) + 800048f0: 7dba ld s11,424(sp) + 800048f2: a015 j 80004916 + 800048f4: e1243423 sd s2,-504(s0) + 800048f8: 7dba ld s11,424(sp) + 800048fa: a831 j 80004916 + 800048fc: e1243423 sd s2,-504(s0) + 80004900: 7dba ld s11,424(sp) + 80004902: a811 j 80004916 + 80004904: e1243423 sd s2,-504(s0) + 80004908: 7dba ld s11,424(sp) + 8000490a: a031 j 80004916 + ip = 0; + 8000490c: 4a01 li s4,0 + 8000490e: a021 j 80004916 + 80004910: 4a01 li s4,0 + if(pagetable) + 80004912: a011 j 80004916 + 80004914: 7dba ld s11,424(sp) + proc_freepagetable(pagetable, sz); + 80004916: e0843583 ld a1,-504(s0) + 8000491a: 855a mv a0,s6 + 8000491c: 93cfd0ef jal 80001a58 + return -1; + 80004920: 557d li a0,-1 + if(ip){ + 80004922: 000a1b63 bnez s4,80004938 + 80004926: 79be ld s3,488(sp) + 80004928: 7a1e ld s4,480(sp) + 8000492a: 6afe ld s5,472(sp) + 8000492c: 6b5e ld s6,464(sp) + 8000492e: 6bbe ld s7,456(sp) + 80004930: 6c1e ld s8,448(sp) + 80004932: 7cfa ld s9,440(sp) + 80004934: 7d5a ld s10,432(sp) + 80004936: bb21 j 8000464e + 80004938: 79be ld s3,488(sp) + 8000493a: 6afe ld s5,472(sp) + 8000493c: 6b5e ld s6,464(sp) + 8000493e: 6bbe ld s7,456(sp) + 80004940: 6c1e ld s8,448(sp) + 80004942: 7cfa ld s9,440(sp) + 80004944: 7d5a ld s10,432(sp) + 80004946: b9ed j 80004640 + 80004948: 6b5e ld s6,464(sp) + 8000494a: b9dd j 80004640 + sz = sz1; + 8000494c: e0843983 ld s3,-504(s0) + 80004950: b595 j 800047b4 + +0000000080004952 : + +// 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) +{ + 80004952: 7179 addi sp,sp,-48 + 80004954: f406 sd ra,40(sp) + 80004956: f022 sd s0,32(sp) + 80004958: ec26 sd s1,24(sp) + 8000495a: e84a sd s2,16(sp) + 8000495c: 1800 addi s0,sp,48 + 8000495e: 892e mv s2,a1 + 80004960: 84b2 mv s1,a2 + int fd; + struct file *f; + + argint(n, &fd); + 80004962: fdc40593 addi a1,s0,-36 + 80004966: e77fd0ef jal 800027dc + if(fd < 0 || fd >= NOFILE || (f=myproc()->ofile[fd]) == 0) + 8000496a: fdc42703 lw a4,-36(s0) + 8000496e: 47bd li a5,15 + 80004970: 02e7e963 bltu a5,a4,800049a2 + 80004974: f5bfc0ef jal 800018ce + 80004978: fdc42703 lw a4,-36(s0) + 8000497c: 01a70793 addi a5,a4,26 + 80004980: 078e slli a5,a5,0x3 + 80004982: 953e add a0,a0,a5 + 80004984: 611c ld a5,0(a0) + 80004986: c385 beqz a5,800049a6 + return -1; + if(pfd) + 80004988: 00090463 beqz s2,80004990 + *pfd = fd; + 8000498c: 00e92023 sw a4,0(s2) + if(pf) + *pf = f; + return 0; + 80004990: 4501 li a0,0 + if(pf) + 80004992: c091 beqz s1,80004996 + *pf = f; + 80004994: e09c sd a5,0(s1) +} + 80004996: 70a2 ld ra,40(sp) + 80004998: 7402 ld s0,32(sp) + 8000499a: 64e2 ld s1,24(sp) + 8000499c: 6942 ld s2,16(sp) + 8000499e: 6145 addi sp,sp,48 + 800049a0: 8082 ret + return -1; + 800049a2: 557d li a0,-1 + 800049a4: bfcd j 80004996 + 800049a6: 557d li a0,-1 + 800049a8: b7fd j 80004996 + +00000000800049aa : + +// Allocate a file descriptor for the given file. +// Takes over file reference from caller on success. +static int +fdalloc(struct file *f) +{ + 800049aa: 1101 addi sp,sp,-32 + 800049ac: ec06 sd ra,24(sp) + 800049ae: e822 sd s0,16(sp) + 800049b0: e426 sd s1,8(sp) + 800049b2: 1000 addi s0,sp,32 + 800049b4: 84aa mv s1,a0 + int fd; + struct proc *p = myproc(); + 800049b6: f19fc0ef jal 800018ce + 800049ba: 862a mv a2,a0 + + for(fd = 0; fd < NOFILE; fd++){ + 800049bc: 0d050793 addi a5,a0,208 + 800049c0: 4501 li a0,0 + 800049c2: 46c1 li a3,16 + if(p->ofile[fd] == 0){ + 800049c4: 6398 ld a4,0(a5) + 800049c6: cb19 beqz a4,800049dc + for(fd = 0; fd < NOFILE; fd++){ + 800049c8: 2505 addiw a0,a0,1 + 800049ca: 07a1 addi a5,a5,8 + 800049cc: fed51ce3 bne a0,a3,800049c4 + p->ofile[fd] = f; + return fd; + } + } + return -1; + 800049d0: 557d li a0,-1 +} + 800049d2: 60e2 ld ra,24(sp) + 800049d4: 6442 ld s0,16(sp) + 800049d6: 64a2 ld s1,8(sp) + 800049d8: 6105 addi sp,sp,32 + 800049da: 8082 ret + p->ofile[fd] = f; + 800049dc: 01a50793 addi a5,a0,26 + 800049e0: 078e slli a5,a5,0x3 + 800049e2: 963e add a2,a2,a5 + 800049e4: e204 sd s1,0(a2) + return fd; + 800049e6: b7f5 j 800049d2 + +00000000800049e8 : + return -1; +} + +static struct inode* +create(char *path, short type, short major, short minor) +{ + 800049e8: 715d addi sp,sp,-80 + 800049ea: e486 sd ra,72(sp) + 800049ec: e0a2 sd s0,64(sp) + 800049ee: fc26 sd s1,56(sp) + 800049f0: f84a sd s2,48(sp) + 800049f2: f44e sd s3,40(sp) + 800049f4: ec56 sd s5,24(sp) + 800049f6: e85a sd s6,16(sp) + 800049f8: 0880 addi s0,sp,80 + 800049fa: 8b2e mv s6,a1 + 800049fc: 89b2 mv s3,a2 + 800049fe: 8936 mv s2,a3 + struct inode *ip, *dp; + char name[DIRSIZ]; + + if((dp = nameiparent(path, name)) == 0) + 80004a00: fb040593 addi a1,s0,-80 + 80004a04: 80eff0ef jal 80003a12 + 80004a08: 84aa mv s1,a0 + 80004a0a: 10050a63 beqz a0,80004b1e + return 0; + + ilock(dp); + 80004a0e: fd4fe0ef jal 800031e2 + + if((ip = dirlookup(dp, name, 0)) != 0){ + 80004a12: 4601 li a2,0 + 80004a14: fb040593 addi a1,s0,-80 + 80004a18: 8526 mv a0,s1 + 80004a1a: d79fe0ef jal 80003792 + 80004a1e: 8aaa mv s5,a0 + 80004a20: c129 beqz a0,80004a62 + iunlockput(dp); + 80004a22: 8526 mv a0,s1 + 80004a24: 9c9fe0ef jal 800033ec + ilock(ip); + 80004a28: 8556 mv a0,s5 + 80004a2a: fb8fe0ef jal 800031e2 + if(type == T_FILE && (ip->type == T_FILE || ip->type == T_DEVICE)) + 80004a2e: 4789 li a5,2 + 80004a30: 02fb1463 bne s6,a5,80004a58 + 80004a34: 044ad783 lhu a5,68(s5) + 80004a38: 37f9 addiw a5,a5,-2 + 80004a3a: 17c2 slli a5,a5,0x30 + 80004a3c: 93c1 srli a5,a5,0x30 + 80004a3e: 4705 li a4,1 + 80004a40: 00f76c63 bltu a4,a5,80004a58 + ip->nlink = 0; + iupdate(ip); + iunlockput(ip); + iunlockput(dp); + return 0; +} + 80004a44: 8556 mv a0,s5 + 80004a46: 60a6 ld ra,72(sp) + 80004a48: 6406 ld s0,64(sp) + 80004a4a: 74e2 ld s1,56(sp) + 80004a4c: 7942 ld s2,48(sp) + 80004a4e: 79a2 ld s3,40(sp) + 80004a50: 6ae2 ld s5,24(sp) + 80004a52: 6b42 ld s6,16(sp) + 80004a54: 6161 addi sp,sp,80 + 80004a56: 8082 ret + iunlockput(ip); + 80004a58: 8556 mv a0,s5 + 80004a5a: 993fe0ef jal 800033ec + return 0; + 80004a5e: 4a81 li s5,0 + 80004a60: b7d5 j 80004a44 + 80004a62: f052 sd s4,32(sp) + if((ip = ialloc(dp->dev, type)) == 0){ + 80004a64: 85da mv a1,s6 + 80004a66: 4088 lw a0,0(s1) + 80004a68: e0afe0ef jal 80003072 + 80004a6c: 8a2a mv s4,a0 + 80004a6e: cd15 beqz a0,80004aaa + ilock(ip); + 80004a70: f72fe0ef jal 800031e2 + ip->major = major; + 80004a74: 053a1323 sh s3,70(s4) + ip->minor = minor; + 80004a78: 052a1423 sh s2,72(s4) + ip->nlink = 1; + 80004a7c: 4905 li s2,1 + 80004a7e: 052a1523 sh s2,74(s4) + iupdate(ip); + 80004a82: 8552 mv a0,s4 + 80004a84: eaafe0ef jal 8000312e + if(type == T_DIR){ // Create . and .. entries. + 80004a88: 032b0763 beq s6,s2,80004ab6 + if(dirlink(dp, name, ip->inum) < 0) + 80004a8c: 004a2603 lw a2,4(s4) + 80004a90: fb040593 addi a1,s0,-80 + 80004a94: 8526 mv a0,s1 + 80004a96: ec9fe0ef jal 8000395e + 80004a9a: 06054563 bltz a0,80004b04 + iunlockput(dp); + 80004a9e: 8526 mv a0,s1 + 80004aa0: 94dfe0ef jal 800033ec + return ip; + 80004aa4: 8ad2 mv s5,s4 + 80004aa6: 7a02 ld s4,32(sp) + 80004aa8: bf71 j 80004a44 + iunlockput(dp); + 80004aaa: 8526 mv a0,s1 + 80004aac: 941fe0ef jal 800033ec + return 0; + 80004ab0: 8ad2 mv s5,s4 + 80004ab2: 7a02 ld s4,32(sp) + 80004ab4: bf41 j 80004a44 + if(dirlink(ip, ".", ip->inum) < 0 || dirlink(ip, "..", dp->inum) < 0) + 80004ab6: 004a2603 lw a2,4(s4) + 80004aba: 00003597 auipc a1,0x3 + 80004abe: b0658593 addi a1,a1,-1274 # 800075c0 + 80004ac2: 8552 mv a0,s4 + 80004ac4: e9bfe0ef jal 8000395e + 80004ac8: 02054e63 bltz a0,80004b04 + 80004acc: 40d0 lw a2,4(s1) + 80004ace: 00003597 auipc a1,0x3 + 80004ad2: afa58593 addi a1,a1,-1286 # 800075c8 + 80004ad6: 8552 mv a0,s4 + 80004ad8: e87fe0ef jal 8000395e + 80004adc: 02054463 bltz a0,80004b04 + if(dirlink(dp, name, ip->inum) < 0) + 80004ae0: 004a2603 lw a2,4(s4) + 80004ae4: fb040593 addi a1,s0,-80 + 80004ae8: 8526 mv a0,s1 + 80004aea: e75fe0ef jal 8000395e + 80004aee: 00054b63 bltz a0,80004b04 + dp->nlink++; // for ".." + 80004af2: 04a4d783 lhu a5,74(s1) + 80004af6: 2785 addiw a5,a5,1 + 80004af8: 04f49523 sh a5,74(s1) + iupdate(dp); + 80004afc: 8526 mv a0,s1 + 80004afe: e30fe0ef jal 8000312e + 80004b02: bf71 j 80004a9e + ip->nlink = 0; + 80004b04: 040a1523 sh zero,74(s4) + iupdate(ip); + 80004b08: 8552 mv a0,s4 + 80004b0a: e24fe0ef jal 8000312e + iunlockput(ip); + 80004b0e: 8552 mv a0,s4 + 80004b10: 8ddfe0ef jal 800033ec + iunlockput(dp); + 80004b14: 8526 mv a0,s1 + 80004b16: 8d7fe0ef jal 800033ec + return 0; + 80004b1a: 7a02 ld s4,32(sp) + 80004b1c: b725 j 80004a44 + return 0; + 80004b1e: 8aaa mv s5,a0 + 80004b20: b715 j 80004a44 + +0000000080004b22 : +{ + 80004b22: 7179 addi sp,sp,-48 + 80004b24: f406 sd ra,40(sp) + 80004b26: f022 sd s0,32(sp) + 80004b28: 1800 addi s0,sp,48 + if(argfd(0, 0, &f) < 0) + 80004b2a: fd840613 addi a2,s0,-40 + 80004b2e: 4581 li a1,0 + 80004b30: 4501 li a0,0 + 80004b32: e21ff0ef jal 80004952 + return -1; + 80004b36: 57fd li a5,-1 + if(argfd(0, 0, &f) < 0) + 80004b38: 02054363 bltz a0,80004b5e + 80004b3c: ec26 sd s1,24(sp) + 80004b3e: e84a sd s2,16(sp) + if((fd=fdalloc(f)) < 0) + 80004b40: fd843903 ld s2,-40(s0) + 80004b44: 854a mv a0,s2 + 80004b46: e65ff0ef jal 800049aa + 80004b4a: 84aa mv s1,a0 + return -1; + 80004b4c: 57fd li a5,-1 + if((fd=fdalloc(f)) < 0) + 80004b4e: 00054d63 bltz a0,80004b68 + filedup(f); + 80004b52: 854a mv a0,s2 + 80004b54: c3eff0ef jal 80003f92 + return fd; + 80004b58: 87a6 mv a5,s1 + 80004b5a: 64e2 ld s1,24(sp) + 80004b5c: 6942 ld s2,16(sp) +} + 80004b5e: 853e mv a0,a5 + 80004b60: 70a2 ld ra,40(sp) + 80004b62: 7402 ld s0,32(sp) + 80004b64: 6145 addi sp,sp,48 + 80004b66: 8082 ret + 80004b68: 64e2 ld s1,24(sp) + 80004b6a: 6942 ld s2,16(sp) + 80004b6c: bfcd j 80004b5e + +0000000080004b6e : +{ + 80004b6e: 7179 addi sp,sp,-48 + 80004b70: f406 sd ra,40(sp) + 80004b72: f022 sd s0,32(sp) + 80004b74: 1800 addi s0,sp,48 + argaddr(1, &p); + 80004b76: fd840593 addi a1,s0,-40 + 80004b7a: 4505 li a0,1 + 80004b7c: c7dfd0ef jal 800027f8 + argint(2, &n); + 80004b80: fe440593 addi a1,s0,-28 + 80004b84: 4509 li a0,2 + 80004b86: c57fd0ef jal 800027dc + if(argfd(0, 0, &f) < 0) + 80004b8a: fe840613 addi a2,s0,-24 + 80004b8e: 4581 li a1,0 + 80004b90: 4501 li a0,0 + 80004b92: dc1ff0ef jal 80004952 + 80004b96: 87aa mv a5,a0 + return -1; + 80004b98: 557d li a0,-1 + if(argfd(0, 0, &f) < 0) + 80004b9a: 0007ca63 bltz a5,80004bae + return fileread(f, p, n); + 80004b9e: fe442603 lw a2,-28(s0) + 80004ba2: fd843583 ld a1,-40(s0) + 80004ba6: fe843503 ld a0,-24(s0) + 80004baa: d4eff0ef jal 800040f8 +} + 80004bae: 70a2 ld ra,40(sp) + 80004bb0: 7402 ld s0,32(sp) + 80004bb2: 6145 addi sp,sp,48 + 80004bb4: 8082 ret + +0000000080004bb6 : +{ + 80004bb6: 7179 addi sp,sp,-48 + 80004bb8: f406 sd ra,40(sp) + 80004bba: f022 sd s0,32(sp) + 80004bbc: 1800 addi s0,sp,48 + argaddr(1, &p); + 80004bbe: fd840593 addi a1,s0,-40 + 80004bc2: 4505 li a0,1 + 80004bc4: c35fd0ef jal 800027f8 + argint(2, &n); + 80004bc8: fe440593 addi a1,s0,-28 + 80004bcc: 4509 li a0,2 + 80004bce: c0ffd0ef jal 800027dc + if(argfd(0, 0, &f) < 0) + 80004bd2: fe840613 addi a2,s0,-24 + 80004bd6: 4581 li a1,0 + 80004bd8: 4501 li a0,0 + 80004bda: d79ff0ef jal 80004952 + 80004bde: 87aa mv a5,a0 + return -1; + 80004be0: 557d li a0,-1 + if(argfd(0, 0, &f) < 0) + 80004be2: 0007ca63 bltz a5,80004bf6 + return filewrite(f, p, n); + 80004be6: fe442603 lw a2,-28(s0) + 80004bea: fd843583 ld a1,-40(s0) + 80004bee: fe843503 ld a0,-24(s0) + 80004bf2: dc4ff0ef jal 800041b6 +} + 80004bf6: 70a2 ld ra,40(sp) + 80004bf8: 7402 ld s0,32(sp) + 80004bfa: 6145 addi sp,sp,48 + 80004bfc: 8082 ret + +0000000080004bfe : +{ + 80004bfe: 1101 addi sp,sp,-32 + 80004c00: ec06 sd ra,24(sp) + 80004c02: e822 sd s0,16(sp) + 80004c04: 1000 addi s0,sp,32 + if(argfd(0, &fd, &f) < 0) + 80004c06: fe040613 addi a2,s0,-32 + 80004c0a: fec40593 addi a1,s0,-20 + 80004c0e: 4501 li a0,0 + 80004c10: d43ff0ef jal 80004952 + return -1; + 80004c14: 57fd li a5,-1 + if(argfd(0, &fd, &f) < 0) + 80004c16: 02054063 bltz a0,80004c36 + myproc()->ofile[fd] = 0; + 80004c1a: cb5fc0ef jal 800018ce + 80004c1e: fec42783 lw a5,-20(s0) + 80004c22: 07e9 addi a5,a5,26 + 80004c24: 078e slli a5,a5,0x3 + 80004c26: 953e add a0,a0,a5 + 80004c28: 00053023 sd zero,0(a0) + fileclose(f); + 80004c2c: fe043503 ld a0,-32(s0) + 80004c30: ba8ff0ef jal 80003fd8 + return 0; + 80004c34: 4781 li a5,0 +} + 80004c36: 853e mv a0,a5 + 80004c38: 60e2 ld ra,24(sp) + 80004c3a: 6442 ld s0,16(sp) + 80004c3c: 6105 addi sp,sp,32 + 80004c3e: 8082 ret + +0000000080004c40 : +{ + 80004c40: 1101 addi sp,sp,-32 + 80004c42: ec06 sd ra,24(sp) + 80004c44: e822 sd s0,16(sp) + 80004c46: 1000 addi s0,sp,32 + argaddr(1, &st); + 80004c48: fe040593 addi a1,s0,-32 + 80004c4c: 4505 li a0,1 + 80004c4e: babfd0ef jal 800027f8 + if(argfd(0, 0, &f) < 0) + 80004c52: fe840613 addi a2,s0,-24 + 80004c56: 4581 li a1,0 + 80004c58: 4501 li a0,0 + 80004c5a: cf9ff0ef jal 80004952 + 80004c5e: 87aa mv a5,a0 + return -1; + 80004c60: 557d li a0,-1 + if(argfd(0, 0, &f) < 0) + 80004c62: 0007c863 bltz a5,80004c72 + return filestat(f, st); + 80004c66: fe043583 ld a1,-32(s0) + 80004c6a: fe843503 ld a0,-24(s0) + 80004c6e: c2cff0ef jal 8000409a +} + 80004c72: 60e2 ld ra,24(sp) + 80004c74: 6442 ld s0,16(sp) + 80004c76: 6105 addi sp,sp,32 + 80004c78: 8082 ret + +0000000080004c7a : +{ + 80004c7a: 7169 addi sp,sp,-304 + 80004c7c: f606 sd ra,296(sp) + 80004c7e: f222 sd s0,288(sp) + 80004c80: 1a00 addi s0,sp,304 + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + 80004c82: 08000613 li a2,128 + 80004c86: ed040593 addi a1,s0,-304 + 80004c8a: 4501 li a0,0 + 80004c8c: b89fd0ef jal 80002814 + return -1; + 80004c90: 57fd li a5,-1 + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + 80004c92: 0c054e63 bltz a0,80004d6e + 80004c96: 08000613 li a2,128 + 80004c9a: f5040593 addi a1,s0,-176 + 80004c9e: 4505 li a0,1 + 80004ca0: b75fd0ef jal 80002814 + return -1; + 80004ca4: 57fd li a5,-1 + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + 80004ca6: 0c054463 bltz a0,80004d6e + 80004caa: ee26 sd s1,280(sp) + begin_op(); + 80004cac: f21fe0ef jal 80003bcc + if((ip = namei(old)) == 0){ + 80004cb0: ed040513 addi a0,s0,-304 + 80004cb4: d45fe0ef jal 800039f8 + 80004cb8: 84aa mv s1,a0 + 80004cba: c53d beqz a0,80004d28 + ilock(ip); + 80004cbc: d26fe0ef jal 800031e2 + if(ip->type == T_DIR){ + 80004cc0: 04449703 lh a4,68(s1) + 80004cc4: 4785 li a5,1 + 80004cc6: 06f70663 beq a4,a5,80004d32 + 80004cca: ea4a sd s2,272(sp) + ip->nlink++; + 80004ccc: 04a4d783 lhu a5,74(s1) + 80004cd0: 2785 addiw a5,a5,1 + 80004cd2: 04f49523 sh a5,74(s1) + iupdate(ip); + 80004cd6: 8526 mv a0,s1 + 80004cd8: c56fe0ef jal 8000312e + iunlock(ip); + 80004cdc: 8526 mv a0,s1 + 80004cde: db2fe0ef jal 80003290 + if((dp = nameiparent(new, name)) == 0) + 80004ce2: fd040593 addi a1,s0,-48 + 80004ce6: f5040513 addi a0,s0,-176 + 80004cea: d29fe0ef jal 80003a12 + 80004cee: 892a mv s2,a0 + 80004cf0: cd21 beqz a0,80004d48 + ilock(dp); + 80004cf2: cf0fe0ef jal 800031e2 + if(dp->dev != ip->dev || dirlink(dp, name, ip->inum) < 0){ + 80004cf6: 00092703 lw a4,0(s2) + 80004cfa: 409c lw a5,0(s1) + 80004cfc: 04f71363 bne a4,a5,80004d42 + 80004d00: 40d0 lw a2,4(s1) + 80004d02: fd040593 addi a1,s0,-48 + 80004d06: 854a mv a0,s2 + 80004d08: c57fe0ef jal 8000395e + 80004d0c: 02054b63 bltz a0,80004d42 + iunlockput(dp); + 80004d10: 854a mv a0,s2 + 80004d12: edafe0ef jal 800033ec + iput(ip); + 80004d16: 8526 mv a0,s1 + 80004d18: e4cfe0ef jal 80003364 + end_op(); + 80004d1c: f1bfe0ef jal 80003c36 + return 0; + 80004d20: 4781 li a5,0 + 80004d22: 64f2 ld s1,280(sp) + 80004d24: 6952 ld s2,272(sp) + 80004d26: a0a1 j 80004d6e + end_op(); + 80004d28: f0ffe0ef jal 80003c36 + return -1; + 80004d2c: 57fd li a5,-1 + 80004d2e: 64f2 ld s1,280(sp) + 80004d30: a83d j 80004d6e + iunlockput(ip); + 80004d32: 8526 mv a0,s1 + 80004d34: eb8fe0ef jal 800033ec + end_op(); + 80004d38: efffe0ef jal 80003c36 + return -1; + 80004d3c: 57fd li a5,-1 + 80004d3e: 64f2 ld s1,280(sp) + 80004d40: a03d j 80004d6e + iunlockput(dp); + 80004d42: 854a mv a0,s2 + 80004d44: ea8fe0ef jal 800033ec + ilock(ip); + 80004d48: 8526 mv a0,s1 + 80004d4a: c98fe0ef jal 800031e2 + ip->nlink--; + 80004d4e: 04a4d783 lhu a5,74(s1) + 80004d52: 37fd addiw a5,a5,-1 + 80004d54: 04f49523 sh a5,74(s1) + iupdate(ip); + 80004d58: 8526 mv a0,s1 + 80004d5a: bd4fe0ef jal 8000312e + iunlockput(ip); + 80004d5e: 8526 mv a0,s1 + 80004d60: e8cfe0ef jal 800033ec + end_op(); + 80004d64: ed3fe0ef jal 80003c36 + return -1; + 80004d68: 57fd li a5,-1 + 80004d6a: 64f2 ld s1,280(sp) + 80004d6c: 6952 ld s2,272(sp) +} + 80004d6e: 853e mv a0,a5 + 80004d70: 70b2 ld ra,296(sp) + 80004d72: 7412 ld s0,288(sp) + 80004d74: 6155 addi sp,sp,304 + 80004d76: 8082 ret + +0000000080004d78 : +{ + 80004d78: 7151 addi sp,sp,-240 + 80004d7a: f586 sd ra,232(sp) + 80004d7c: f1a2 sd s0,224(sp) + 80004d7e: 1980 addi s0,sp,240 + if(argstr(0, path, MAXPATH) < 0) + 80004d80: 08000613 li a2,128 + 80004d84: f3040593 addi a1,s0,-208 + 80004d88: 4501 li a0,0 + 80004d8a: a8bfd0ef jal 80002814 + 80004d8e: 16054063 bltz a0,80004eee + 80004d92: eda6 sd s1,216(sp) + begin_op(); + 80004d94: e39fe0ef jal 80003bcc + if((dp = nameiparent(path, name)) == 0){ + 80004d98: fb040593 addi a1,s0,-80 + 80004d9c: f3040513 addi a0,s0,-208 + 80004da0: c73fe0ef jal 80003a12 + 80004da4: 84aa mv s1,a0 + 80004da6: c945 beqz a0,80004e56 + ilock(dp); + 80004da8: c3afe0ef jal 800031e2 + if(namecmp(name, ".") == 0 || namecmp(name, "..") == 0) + 80004dac: 00003597 auipc a1,0x3 + 80004db0: 81458593 addi a1,a1,-2028 # 800075c0 + 80004db4: fb040513 addi a0,s0,-80 + 80004db8: 9c5fe0ef jal 8000377c + 80004dbc: 10050e63 beqz a0,80004ed8 + 80004dc0: 00003597 auipc a1,0x3 + 80004dc4: 80858593 addi a1,a1,-2040 # 800075c8 + 80004dc8: fb040513 addi a0,s0,-80 + 80004dcc: 9b1fe0ef jal 8000377c + 80004dd0: 10050463 beqz a0,80004ed8 + 80004dd4: e9ca sd s2,208(sp) + if((ip = dirlookup(dp, name, &off)) == 0) + 80004dd6: f2c40613 addi a2,s0,-212 + 80004dda: fb040593 addi a1,s0,-80 + 80004dde: 8526 mv a0,s1 + 80004de0: 9b3fe0ef jal 80003792 + 80004de4: 892a mv s2,a0 + 80004de6: 0e050863 beqz a0,80004ed6 + ilock(ip); + 80004dea: bf8fe0ef jal 800031e2 + if(ip->nlink < 1) + 80004dee: 04a91783 lh a5,74(s2) + 80004df2: 06f05763 blez a5,80004e60 + if(ip->type == T_DIR && !isdirempty(ip)){ + 80004df6: 04491703 lh a4,68(s2) + 80004dfa: 4785 li a5,1 + 80004dfc: 06f70963 beq a4,a5,80004e6e + memset(&de, 0, sizeof(de)); + 80004e00: 4641 li a2,16 + 80004e02: 4581 li a1,0 + 80004e04: fc040513 addi a0,s0,-64 + 80004e08: e9bfb0ef jal 80000ca2 + if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80004e0c: 4741 li a4,16 + 80004e0e: f2c42683 lw a3,-212(s0) + 80004e12: fc040613 addi a2,s0,-64 + 80004e16: 4581 li a1,0 + 80004e18: 8526 mv a0,s1 + 80004e1a: 855fe0ef jal 8000366e + 80004e1e: 47c1 li a5,16 + 80004e20: 08f51b63 bne a0,a5,80004eb6 + if(ip->type == T_DIR){ + 80004e24: 04491703 lh a4,68(s2) + 80004e28: 4785 li a5,1 + 80004e2a: 08f70d63 beq a4,a5,80004ec4 + iunlockput(dp); + 80004e2e: 8526 mv a0,s1 + 80004e30: dbcfe0ef jal 800033ec + ip->nlink--; + 80004e34: 04a95783 lhu a5,74(s2) + 80004e38: 37fd addiw a5,a5,-1 + 80004e3a: 04f91523 sh a5,74(s2) + iupdate(ip); + 80004e3e: 854a mv a0,s2 + 80004e40: aeefe0ef jal 8000312e + iunlockput(ip); + 80004e44: 854a mv a0,s2 + 80004e46: da6fe0ef jal 800033ec + end_op(); + 80004e4a: dedfe0ef jal 80003c36 + return 0; + 80004e4e: 4501 li a0,0 + 80004e50: 64ee ld s1,216(sp) + 80004e52: 694e ld s2,208(sp) + 80004e54: a849 j 80004ee6 + end_op(); + 80004e56: de1fe0ef jal 80003c36 + return -1; + 80004e5a: 557d li a0,-1 + 80004e5c: 64ee ld s1,216(sp) + 80004e5e: a061 j 80004ee6 + 80004e60: e5ce sd s3,200(sp) + panic("unlink: nlink < 1"); + 80004e62: 00002517 auipc a0,0x2 + 80004e66: 76e50513 addi a0,a0,1902 # 800075d0 + 80004e6a: 977fb0ef jal 800007e0 + for(off=2*sizeof(de); offsize; off+=sizeof(de)){ + 80004e6e: 04c92703 lw a4,76(s2) + 80004e72: 02000793 li a5,32 + 80004e76: f8e7f5e3 bgeu a5,a4,80004e00 + 80004e7a: e5ce sd s3,200(sp) + 80004e7c: 02000993 li s3,32 + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + 80004e80: 4741 li a4,16 + 80004e82: 86ce mv a3,s3 + 80004e84: f1840613 addi a2,s0,-232 + 80004e88: 4581 li a1,0 + 80004e8a: 854a mv a0,s2 + 80004e8c: ee6fe0ef jal 80003572 + 80004e90: 47c1 li a5,16 + 80004e92: 00f51c63 bne a0,a5,80004eaa + if(de.inum != 0) + 80004e96: f1845783 lhu a5,-232(s0) + 80004e9a: efa1 bnez a5,80004ef2 + for(off=2*sizeof(de); offsize; off+=sizeof(de)){ + 80004e9c: 29c1 addiw s3,s3,16 + 80004e9e: 04c92783 lw a5,76(s2) + 80004ea2: fcf9efe3 bltu s3,a5,80004e80 + 80004ea6: 69ae ld s3,200(sp) + 80004ea8: bfa1 j 80004e00 + panic("isdirempty: readi"); + 80004eaa: 00002517 auipc a0,0x2 + 80004eae: 73e50513 addi a0,a0,1854 # 800075e8 + 80004eb2: 92ffb0ef jal 800007e0 + 80004eb6: e5ce sd s3,200(sp) + panic("unlink: writei"); + 80004eb8: 00002517 auipc a0,0x2 + 80004ebc: 74850513 addi a0,a0,1864 # 80007600 + 80004ec0: 921fb0ef jal 800007e0 + dp->nlink--; + 80004ec4: 04a4d783 lhu a5,74(s1) + 80004ec8: 37fd addiw a5,a5,-1 + 80004eca: 04f49523 sh a5,74(s1) + iupdate(dp); + 80004ece: 8526 mv a0,s1 + 80004ed0: a5efe0ef jal 8000312e + 80004ed4: bfa9 j 80004e2e + 80004ed6: 694e ld s2,208(sp) + iunlockput(dp); + 80004ed8: 8526 mv a0,s1 + 80004eda: d12fe0ef jal 800033ec + end_op(); + 80004ede: d59fe0ef jal 80003c36 + return -1; + 80004ee2: 557d li a0,-1 + 80004ee4: 64ee ld s1,216(sp) +} + 80004ee6: 70ae ld ra,232(sp) + 80004ee8: 740e ld s0,224(sp) + 80004eea: 616d addi sp,sp,240 + 80004eec: 8082 ret + return -1; + 80004eee: 557d li a0,-1 + 80004ef0: bfdd j 80004ee6 + iunlockput(ip); + 80004ef2: 854a mv a0,s2 + 80004ef4: cf8fe0ef jal 800033ec + goto bad; + 80004ef8: 694e ld s2,208(sp) + 80004efa: 69ae ld s3,200(sp) + 80004efc: bff1 j 80004ed8 + +0000000080004efe : + +uint64 +sys_open(void) +{ + 80004efe: 7131 addi sp,sp,-192 + 80004f00: fd06 sd ra,184(sp) + 80004f02: f922 sd s0,176(sp) + 80004f04: 0180 addi s0,sp,192 + int fd, omode; + struct file *f; + struct inode *ip; + int n; + + argint(1, &omode); + 80004f06: f4c40593 addi a1,s0,-180 + 80004f0a: 4505 li a0,1 + 80004f0c: 8d1fd0ef jal 800027dc + if((n = argstr(0, path, MAXPATH)) < 0) + 80004f10: 08000613 li a2,128 + 80004f14: f5040593 addi a1,s0,-176 + 80004f18: 4501 li a0,0 + 80004f1a: 8fbfd0ef jal 80002814 + 80004f1e: 87aa mv a5,a0 + return -1; + 80004f20: 557d li a0,-1 + if((n = argstr(0, path, MAXPATH)) < 0) + 80004f22: 0a07c263 bltz a5,80004fc6 + 80004f26: f526 sd s1,168(sp) + + begin_op(); + 80004f28: ca5fe0ef jal 80003bcc + + if(omode & O_CREATE){ + 80004f2c: f4c42783 lw a5,-180(s0) + 80004f30: 2007f793 andi a5,a5,512 + 80004f34: c3d5 beqz a5,80004fd8 + ip = create(path, T_FILE, 0, 0); + 80004f36: 4681 li a3,0 + 80004f38: 4601 li a2,0 + 80004f3a: 4589 li a1,2 + 80004f3c: f5040513 addi a0,s0,-176 + 80004f40: aa9ff0ef jal 800049e8 + 80004f44: 84aa mv s1,a0 + if(ip == 0){ + 80004f46: c541 beqz a0,80004fce + end_op(); + return -1; + } + } + + if(ip->type == T_DEVICE && (ip->major < 0 || ip->major >= NDEV)){ + 80004f48: 04449703 lh a4,68(s1) + 80004f4c: 478d li a5,3 + 80004f4e: 00f71763 bne a4,a5,80004f5c + 80004f52: 0464d703 lhu a4,70(s1) + 80004f56: 47a5 li a5,9 + 80004f58: 0ae7ed63 bltu a5,a4,80005012 + 80004f5c: f14a sd s2,160(sp) + iunlockput(ip); + end_op(); + return -1; + } + + if((f = filealloc()) == 0 || (fd = fdalloc(f)) < 0){ + 80004f5e: fd7fe0ef jal 80003f34 + 80004f62: 892a mv s2,a0 + 80004f64: c179 beqz a0,8000502a + 80004f66: ed4e sd s3,152(sp) + 80004f68: a43ff0ef jal 800049aa + 80004f6c: 89aa mv s3,a0 + 80004f6e: 0a054a63 bltz a0,80005022 + iunlockput(ip); + end_op(); + return -1; + } + + if(ip->type == T_DEVICE){ + 80004f72: 04449703 lh a4,68(s1) + 80004f76: 478d li a5,3 + 80004f78: 0cf70263 beq a4,a5,8000503c + f->type = FD_DEVICE; + f->major = ip->major; + } else { + f->type = FD_INODE; + 80004f7c: 4789 li a5,2 + 80004f7e: 00f92023 sw a5,0(s2) + f->off = 0; + 80004f82: 02092023 sw zero,32(s2) + } + f->ip = ip; + 80004f86: 00993c23 sd s1,24(s2) + f->readable = !(omode & O_WRONLY); + 80004f8a: f4c42783 lw a5,-180(s0) + 80004f8e: 0017c713 xori a4,a5,1 + 80004f92: 8b05 andi a4,a4,1 + 80004f94: 00e90423 sb a4,8(s2) + f->writable = (omode & O_WRONLY) || (omode & O_RDWR); + 80004f98: 0037f713 andi a4,a5,3 + 80004f9c: 00e03733 snez a4,a4 + 80004fa0: 00e904a3 sb a4,9(s2) + + if((omode & O_TRUNC) && ip->type == T_FILE){ + 80004fa4: 4007f793 andi a5,a5,1024 + 80004fa8: c791 beqz a5,80004fb4 + 80004faa: 04449703 lh a4,68(s1) + 80004fae: 4789 li a5,2 + 80004fb0: 08f70d63 beq a4,a5,8000504a + itrunc(ip); + } + + iunlock(ip); + 80004fb4: 8526 mv a0,s1 + 80004fb6: adafe0ef jal 80003290 + end_op(); + 80004fba: c7dfe0ef jal 80003c36 + + return fd; + 80004fbe: 854e mv a0,s3 + 80004fc0: 74aa ld s1,168(sp) + 80004fc2: 790a ld s2,160(sp) + 80004fc4: 69ea ld s3,152(sp) +} + 80004fc6: 70ea ld ra,184(sp) + 80004fc8: 744a ld s0,176(sp) + 80004fca: 6129 addi sp,sp,192 + 80004fcc: 8082 ret + end_op(); + 80004fce: c69fe0ef jal 80003c36 + return -1; + 80004fd2: 557d li a0,-1 + 80004fd4: 74aa ld s1,168(sp) + 80004fd6: bfc5 j 80004fc6 + if((ip = namei(path)) == 0){ + 80004fd8: f5040513 addi a0,s0,-176 + 80004fdc: a1dfe0ef jal 800039f8 + 80004fe0: 84aa mv s1,a0 + 80004fe2: c11d beqz a0,80005008 + ilock(ip); + 80004fe4: 9fefe0ef jal 800031e2 + if(ip->type == T_DIR && omode != O_RDONLY){ + 80004fe8: 04449703 lh a4,68(s1) + 80004fec: 4785 li a5,1 + 80004fee: f4f71de3 bne a4,a5,80004f48 + 80004ff2: f4c42783 lw a5,-180(s0) + 80004ff6: d3bd beqz a5,80004f5c + iunlockput(ip); + 80004ff8: 8526 mv a0,s1 + 80004ffa: bf2fe0ef jal 800033ec + end_op(); + 80004ffe: c39fe0ef jal 80003c36 + return -1; + 80005002: 557d li a0,-1 + 80005004: 74aa ld s1,168(sp) + 80005006: b7c1 j 80004fc6 + end_op(); + 80005008: c2ffe0ef jal 80003c36 + return -1; + 8000500c: 557d li a0,-1 + 8000500e: 74aa ld s1,168(sp) + 80005010: bf5d j 80004fc6 + iunlockput(ip); + 80005012: 8526 mv a0,s1 + 80005014: bd8fe0ef jal 800033ec + end_op(); + 80005018: c1ffe0ef jal 80003c36 + return -1; + 8000501c: 557d li a0,-1 + 8000501e: 74aa ld s1,168(sp) + 80005020: b75d j 80004fc6 + fileclose(f); + 80005022: 854a mv a0,s2 + 80005024: fb5fe0ef jal 80003fd8 + 80005028: 69ea ld s3,152(sp) + iunlockput(ip); + 8000502a: 8526 mv a0,s1 + 8000502c: bc0fe0ef jal 800033ec + end_op(); + 80005030: c07fe0ef jal 80003c36 + return -1; + 80005034: 557d li a0,-1 + 80005036: 74aa ld s1,168(sp) + 80005038: 790a ld s2,160(sp) + 8000503a: b771 j 80004fc6 + f->type = FD_DEVICE; + 8000503c: 00f92023 sw a5,0(s2) + f->major = ip->major; + 80005040: 04649783 lh a5,70(s1) + 80005044: 02f91223 sh a5,36(s2) + 80005048: bf3d j 80004f86 + itrunc(ip); + 8000504a: 8526 mv a0,s1 + 8000504c: a84fe0ef jal 800032d0 + 80005050: b795 j 80004fb4 + +0000000080005052 : + +uint64 +sys_mkdir(void) +{ + 80005052: 7175 addi sp,sp,-144 + 80005054: e506 sd ra,136(sp) + 80005056: e122 sd s0,128(sp) + 80005058: 0900 addi s0,sp,144 + char path[MAXPATH]; + struct inode *ip; + + begin_op(); + 8000505a: b73fe0ef jal 80003bcc + if(argstr(0, path, MAXPATH) < 0 || (ip = create(path, T_DIR, 0, 0)) == 0){ + 8000505e: 08000613 li a2,128 + 80005062: f7040593 addi a1,s0,-144 + 80005066: 4501 li a0,0 + 80005068: facfd0ef jal 80002814 + 8000506c: 02054363 bltz a0,80005092 + 80005070: 4681 li a3,0 + 80005072: 4601 li a2,0 + 80005074: 4585 li a1,1 + 80005076: f7040513 addi a0,s0,-144 + 8000507a: 96fff0ef jal 800049e8 + 8000507e: c911 beqz a0,80005092 + end_op(); + return -1; + } + iunlockput(ip); + 80005080: b6cfe0ef jal 800033ec + end_op(); + 80005084: bb3fe0ef jal 80003c36 + return 0; + 80005088: 4501 li a0,0 +} + 8000508a: 60aa ld ra,136(sp) + 8000508c: 640a ld s0,128(sp) + 8000508e: 6149 addi sp,sp,144 + 80005090: 8082 ret + end_op(); + 80005092: ba5fe0ef jal 80003c36 + return -1; + 80005096: 557d li a0,-1 + 80005098: bfcd j 8000508a + +000000008000509a : + +uint64 +sys_mknod(void) +{ + 8000509a: 7135 addi sp,sp,-160 + 8000509c: ed06 sd ra,152(sp) + 8000509e: e922 sd s0,144(sp) + 800050a0: 1100 addi s0,sp,160 + struct inode *ip; + char path[MAXPATH]; + int major, minor; + + begin_op(); + 800050a2: b2bfe0ef jal 80003bcc + argint(1, &major); + 800050a6: f6c40593 addi a1,s0,-148 + 800050aa: 4505 li a0,1 + 800050ac: f30fd0ef jal 800027dc + argint(2, &minor); + 800050b0: f6840593 addi a1,s0,-152 + 800050b4: 4509 li a0,2 + 800050b6: f26fd0ef jal 800027dc + if((argstr(0, path, MAXPATH)) < 0 || + 800050ba: 08000613 li a2,128 + 800050be: f7040593 addi a1,s0,-144 + 800050c2: 4501 li a0,0 + 800050c4: f50fd0ef jal 80002814 + 800050c8: 02054563 bltz a0,800050f2 + (ip = create(path, T_DEVICE, major, minor)) == 0){ + 800050cc: f6841683 lh a3,-152(s0) + 800050d0: f6c41603 lh a2,-148(s0) + 800050d4: 458d li a1,3 + 800050d6: f7040513 addi a0,s0,-144 + 800050da: 90fff0ef jal 800049e8 + if((argstr(0, path, MAXPATH)) < 0 || + 800050de: c911 beqz a0,800050f2 + end_op(); + return -1; + } + iunlockput(ip); + 800050e0: b0cfe0ef jal 800033ec + end_op(); + 800050e4: b53fe0ef jal 80003c36 + return 0; + 800050e8: 4501 li a0,0 +} + 800050ea: 60ea ld ra,152(sp) + 800050ec: 644a ld s0,144(sp) + 800050ee: 610d addi sp,sp,160 + 800050f0: 8082 ret + end_op(); + 800050f2: b45fe0ef jal 80003c36 + return -1; + 800050f6: 557d li a0,-1 + 800050f8: bfcd j 800050ea + +00000000800050fa : + +uint64 +sys_chdir(void) +{ + 800050fa: 7135 addi sp,sp,-160 + 800050fc: ed06 sd ra,152(sp) + 800050fe: e922 sd s0,144(sp) + 80005100: e14a sd s2,128(sp) + 80005102: 1100 addi s0,sp,160 + char path[MAXPATH]; + struct inode *ip; + struct proc *p = myproc(); + 80005104: fcafc0ef jal 800018ce + 80005108: 892a mv s2,a0 + + begin_op(); + 8000510a: ac3fe0ef jal 80003bcc + if(argstr(0, path, MAXPATH) < 0 || (ip = namei(path)) == 0){ + 8000510e: 08000613 li a2,128 + 80005112: f6040593 addi a1,s0,-160 + 80005116: 4501 li a0,0 + 80005118: efcfd0ef jal 80002814 + 8000511c: 04054363 bltz a0,80005162 + 80005120: e526 sd s1,136(sp) + 80005122: f6040513 addi a0,s0,-160 + 80005126: 8d3fe0ef jal 800039f8 + 8000512a: 84aa mv s1,a0 + 8000512c: c915 beqz a0,80005160 + end_op(); + return -1; + } + ilock(ip); + 8000512e: 8b4fe0ef jal 800031e2 + if(ip->type != T_DIR){ + 80005132: 04449703 lh a4,68(s1) + 80005136: 4785 li a5,1 + 80005138: 02f71963 bne a4,a5,8000516a + iunlockput(ip); + end_op(); + return -1; + } + iunlock(ip); + 8000513c: 8526 mv a0,s1 + 8000513e: 952fe0ef jal 80003290 + iput(p->cwd); + 80005142: 15093503 ld a0,336(s2) + 80005146: a1efe0ef jal 80003364 + end_op(); + 8000514a: aedfe0ef jal 80003c36 + p->cwd = ip; + 8000514e: 14993823 sd s1,336(s2) + return 0; + 80005152: 4501 li a0,0 + 80005154: 64aa ld s1,136(sp) +} + 80005156: 60ea ld ra,152(sp) + 80005158: 644a ld s0,144(sp) + 8000515a: 690a ld s2,128(sp) + 8000515c: 610d addi sp,sp,160 + 8000515e: 8082 ret + 80005160: 64aa ld s1,136(sp) + end_op(); + 80005162: ad5fe0ef jal 80003c36 + return -1; + 80005166: 557d li a0,-1 + 80005168: b7fd j 80005156 + iunlockput(ip); + 8000516a: 8526 mv a0,s1 + 8000516c: a80fe0ef jal 800033ec + end_op(); + 80005170: ac7fe0ef jal 80003c36 + return -1; + 80005174: 557d li a0,-1 + 80005176: 64aa ld s1,136(sp) + 80005178: bff9 j 80005156 + +000000008000517a : + +uint64 +sys_exec(void) +{ + 8000517a: 7121 addi sp,sp,-448 + 8000517c: ff06 sd ra,440(sp) + 8000517e: fb22 sd s0,432(sp) + 80005180: 0380 addi s0,sp,448 + char path[MAXPATH], *argv[MAXARG]; + int i; + uint64 uargv, uarg; + + argaddr(1, &uargv); + 80005182: e4840593 addi a1,s0,-440 + 80005186: 4505 li a0,1 + 80005188: e70fd0ef jal 800027f8 + if(argstr(0, path, MAXPATH) < 0) { + 8000518c: 08000613 li a2,128 + 80005190: f5040593 addi a1,s0,-176 + 80005194: 4501 li a0,0 + 80005196: e7efd0ef jal 80002814 + 8000519a: 87aa mv a5,a0 + return -1; + 8000519c: 557d li a0,-1 + if(argstr(0, path, MAXPATH) < 0) { + 8000519e: 0c07c463 bltz a5,80005266 + 800051a2: f726 sd s1,424(sp) + 800051a4: f34a sd s2,416(sp) + 800051a6: ef4e sd s3,408(sp) + 800051a8: eb52 sd s4,400(sp) + } + memset(argv, 0, sizeof(argv)); + 800051aa: 10000613 li a2,256 + 800051ae: 4581 li a1,0 + 800051b0: e5040513 addi a0,s0,-432 + 800051b4: aeffb0ef jal 80000ca2 + for(i=0;; i++){ + if(i >= NELEM(argv)){ + 800051b8: e5040493 addi s1,s0,-432 + memset(argv, 0, sizeof(argv)); + 800051bc: 89a6 mv s3,s1 + 800051be: 4901 li s2,0 + if(i >= NELEM(argv)){ + 800051c0: 02000a13 li s4,32 + goto bad; + } + if(fetchaddr(uargv+sizeof(uint64)*i, (uint64*)&uarg) < 0){ + 800051c4: 00391513 slli a0,s2,0x3 + 800051c8: e4040593 addi a1,s0,-448 + 800051cc: e4843783 ld a5,-440(s0) + 800051d0: 953e add a0,a0,a5 + 800051d2: d80fd0ef jal 80002752 + 800051d6: 02054663 bltz a0,80005202 + goto bad; + } + if(uarg == 0){ + 800051da: e4043783 ld a5,-448(s0) + 800051de: c3a9 beqz a5,80005220 + argv[i] = 0; + break; + } + argv[i] = kalloc(); + 800051e0: 91ffb0ef jal 80000afe + 800051e4: 85aa mv a1,a0 + 800051e6: 00a9b023 sd a0,0(s3) + if(argv[i] == 0) + 800051ea: cd01 beqz a0,80005202 + goto bad; + if(fetchstr(uarg, argv[i], PGSIZE) < 0) + 800051ec: 6605 lui a2,0x1 + 800051ee: e4043503 ld a0,-448(s0) + 800051f2: daafd0ef jal 8000279c + 800051f6: 00054663 bltz a0,80005202 + if(i >= NELEM(argv)){ + 800051fa: 0905 addi s2,s2,1 + 800051fc: 09a1 addi s3,s3,8 + 800051fe: fd4913e3 bne s2,s4,800051c4 + kfree(argv[i]); + + return ret; + + bad: + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 80005202: f5040913 addi s2,s0,-176 + 80005206: 6088 ld a0,0(s1) + 80005208: c931 beqz a0,8000525c + kfree(argv[i]); + 8000520a: 813fb0ef jal 80000a1c + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 8000520e: 04a1 addi s1,s1,8 + 80005210: ff249be3 bne s1,s2,80005206 + return -1; + 80005214: 557d li a0,-1 + 80005216: 74ba ld s1,424(sp) + 80005218: 791a ld s2,416(sp) + 8000521a: 69fa ld s3,408(sp) + 8000521c: 6a5a ld s4,400(sp) + 8000521e: a0a1 j 80005266 + argv[i] = 0; + 80005220: 0009079b sext.w a5,s2 + 80005224: 078e slli a5,a5,0x3 + 80005226: fd078793 addi a5,a5,-48 + 8000522a: 97a2 add a5,a5,s0 + 8000522c: e807b023 sd zero,-384(a5) + int ret = kexec(path, argv); + 80005230: e5040593 addi a1,s0,-432 + 80005234: f5040513 addi a0,s0,-176 + 80005238: ba8ff0ef jal 800045e0 + 8000523c: 892a mv s2,a0 + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 8000523e: f5040993 addi s3,s0,-176 + 80005242: 6088 ld a0,0(s1) + 80005244: c511 beqz a0,80005250 + kfree(argv[i]); + 80005246: fd6fb0ef jal 80000a1c + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + 8000524a: 04a1 addi s1,s1,8 + 8000524c: ff349be3 bne s1,s3,80005242 + return ret; + 80005250: 854a mv a0,s2 + 80005252: 74ba ld s1,424(sp) + 80005254: 791a ld s2,416(sp) + 80005256: 69fa ld s3,408(sp) + 80005258: 6a5a ld s4,400(sp) + 8000525a: a031 j 80005266 + return -1; + 8000525c: 557d li a0,-1 + 8000525e: 74ba ld s1,424(sp) + 80005260: 791a ld s2,416(sp) + 80005262: 69fa ld s3,408(sp) + 80005264: 6a5a ld s4,400(sp) +} + 80005266: 70fa ld ra,440(sp) + 80005268: 745a ld s0,432(sp) + 8000526a: 6139 addi sp,sp,448 + 8000526c: 8082 ret + +000000008000526e : + +uint64 +sys_pipe(void) +{ + 8000526e: 7139 addi sp,sp,-64 + 80005270: fc06 sd ra,56(sp) + 80005272: f822 sd s0,48(sp) + 80005274: f426 sd s1,40(sp) + 80005276: 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(); + 80005278: e56fc0ef jal 800018ce + 8000527c: 84aa mv s1,a0 + + argaddr(0, &fdarray); + 8000527e: fd840593 addi a1,s0,-40 + 80005282: 4501 li a0,0 + 80005284: d74fd0ef jal 800027f8 + if(pipealloc(&rf, &wf) < 0) + 80005288: fc840593 addi a1,s0,-56 + 8000528c: fd040513 addi a0,s0,-48 + 80005290: 852ff0ef jal 800042e2 + return -1; + 80005294: 57fd li a5,-1 + if(pipealloc(&rf, &wf) < 0) + 80005296: 0a054463 bltz a0,8000533e + fd0 = -1; + 8000529a: fcf42223 sw a5,-60(s0) + if((fd0 = fdalloc(rf)) < 0 || (fd1 = fdalloc(wf)) < 0){ + 8000529e: fd043503 ld a0,-48(s0) + 800052a2: f08ff0ef jal 800049aa + 800052a6: fca42223 sw a0,-60(s0) + 800052aa: 08054163 bltz a0,8000532c + 800052ae: fc843503 ld a0,-56(s0) + 800052b2: ef8ff0ef jal 800049aa + 800052b6: fca42023 sw a0,-64(s0) + 800052ba: 06054063 bltz a0,8000531a + p->ofile[fd0] = 0; + fileclose(rf); + fileclose(wf); + return -1; + } + if(copyout(p->pagetable, fdarray, (char*)&fd0, sizeof(fd0)) < 0 || + 800052be: 4691 li a3,4 + 800052c0: fc440613 addi a2,s0,-60 + 800052c4: fd843583 ld a1,-40(s0) + 800052c8: 68a8 ld a0,80(s1) + 800052ca: b18fc0ef jal 800015e2 + 800052ce: 00054e63 bltz a0,800052ea + copyout(p->pagetable, fdarray+sizeof(fd0), (char *)&fd1, sizeof(fd1)) < 0){ + 800052d2: 4691 li a3,4 + 800052d4: fc040613 addi a2,s0,-64 + 800052d8: fd843583 ld a1,-40(s0) + 800052dc: 0591 addi a1,a1,4 + 800052de: 68a8 ld a0,80(s1) + 800052e0: b02fc0ef jal 800015e2 + p->ofile[fd1] = 0; + fileclose(rf); + fileclose(wf); + return -1; + } + return 0; + 800052e4: 4781 li a5,0 + if(copyout(p->pagetable, fdarray, (char*)&fd0, sizeof(fd0)) < 0 || + 800052e6: 04055c63 bgez a0,8000533e + p->ofile[fd0] = 0; + 800052ea: fc442783 lw a5,-60(s0) + 800052ee: 07e9 addi a5,a5,26 + 800052f0: 078e slli a5,a5,0x3 + 800052f2: 97a6 add a5,a5,s1 + 800052f4: 0007b023 sd zero,0(a5) + p->ofile[fd1] = 0; + 800052f8: fc042783 lw a5,-64(s0) + 800052fc: 07e9 addi a5,a5,26 + 800052fe: 078e slli a5,a5,0x3 + 80005300: 94be add s1,s1,a5 + 80005302: 0004b023 sd zero,0(s1) + fileclose(rf); + 80005306: fd043503 ld a0,-48(s0) + 8000530a: ccffe0ef jal 80003fd8 + fileclose(wf); + 8000530e: fc843503 ld a0,-56(s0) + 80005312: cc7fe0ef jal 80003fd8 + return -1; + 80005316: 57fd li a5,-1 + 80005318: a01d j 8000533e + if(fd0 >= 0) + 8000531a: fc442783 lw a5,-60(s0) + 8000531e: 0007c763 bltz a5,8000532c + p->ofile[fd0] = 0; + 80005322: 07e9 addi a5,a5,26 + 80005324: 078e slli a5,a5,0x3 + 80005326: 97a6 add a5,a5,s1 + 80005328: 0007b023 sd zero,0(a5) + fileclose(rf); + 8000532c: fd043503 ld a0,-48(s0) + 80005330: ca9fe0ef jal 80003fd8 + fileclose(wf); + 80005334: fc843503 ld a0,-56(s0) + 80005338: ca1fe0ef jal 80003fd8 + return -1; + 8000533c: 57fd li a5,-1 +} + 8000533e: 853e mv a0,a5 + 80005340: 70e2 ld ra,56(sp) + 80005342: 7442 ld s0,48(sp) + 80005344: 74a2 ld s1,40(sp) + 80005346: 6121 addi sp,sp,64 + 80005348: 8082 ret + 8000534a: 0000 unimp + 8000534c: 0000 unimp + ... + +0000000080005350 : +.globl kerneltrap +.globl kernelvec +.align 4 +kernelvec: + # make room to save registers. + addi sp, sp, -256 + 80005350: 7111 addi sp,sp,-256 + + # save caller-saved registers. + sd ra, 0(sp) + 80005352: e006 sd ra,0(sp) + # sd sp, 8(sp) + sd gp, 16(sp) + 80005354: e80e sd gp,16(sp) + sd tp, 24(sp) + 80005356: ec12 sd tp,24(sp) + sd t0, 32(sp) + 80005358: f016 sd t0,32(sp) + sd t1, 40(sp) + 8000535a: f41a sd t1,40(sp) + sd t2, 48(sp) + 8000535c: f81e sd t2,48(sp) + sd a0, 72(sp) + 8000535e: e4aa sd a0,72(sp) + sd a1, 80(sp) + 80005360: e8ae sd a1,80(sp) + sd a2, 88(sp) + 80005362: ecb2 sd a2,88(sp) + sd a3, 96(sp) + 80005364: f0b6 sd a3,96(sp) + sd a4, 104(sp) + 80005366: f4ba sd a4,104(sp) + sd a5, 112(sp) + 80005368: f8be sd a5,112(sp) + sd a6, 120(sp) + 8000536a: fcc2 sd a6,120(sp) + sd a7, 128(sp) + 8000536c: e146 sd a7,128(sp) + sd t3, 216(sp) + 8000536e: edf2 sd t3,216(sp) + sd t4, 224(sp) + 80005370: f1f6 sd t4,224(sp) + sd t5, 232(sp) + 80005372: f5fa sd t5,232(sp) + sd t6, 240(sp) + 80005374: f9fe sd t6,240(sp) + + # call the C trap handler in trap.c + call kerneltrap + 80005376: aecfd0ef jal 80002662 + + # restore registers. + ld ra, 0(sp) + 8000537a: 6082 ld ra,0(sp) + # ld sp, 8(sp) + ld gp, 16(sp) + 8000537c: 61c2 ld gp,16(sp) + # not tp (contains hartid), in case we moved CPUs + ld t0, 32(sp) + 8000537e: 7282 ld t0,32(sp) + ld t1, 40(sp) + 80005380: 7322 ld t1,40(sp) + ld t2, 48(sp) + 80005382: 73c2 ld t2,48(sp) + ld a0, 72(sp) + 80005384: 6526 ld a0,72(sp) + ld a1, 80(sp) + 80005386: 65c6 ld a1,80(sp) + ld a2, 88(sp) + 80005388: 6666 ld a2,88(sp) + ld a3, 96(sp) + 8000538a: 7686 ld a3,96(sp) + ld a4, 104(sp) + 8000538c: 7726 ld a4,104(sp) + ld a5, 112(sp) + 8000538e: 77c6 ld a5,112(sp) + ld a6, 120(sp) + 80005390: 7866 ld a6,120(sp) + ld a7, 128(sp) + 80005392: 688a ld a7,128(sp) + ld t3, 216(sp) + 80005394: 6e6e ld t3,216(sp) + ld t4, 224(sp) + 80005396: 7e8e ld t4,224(sp) + ld t5, 232(sp) + 80005398: 7f2e ld t5,232(sp) + ld t6, 240(sp) + 8000539a: 7fce ld t6,240(sp) + + addi sp, sp, 256 + 8000539c: 6111 addi sp,sp,256 + + # return to whatever we were doing in the kernel. + sret + 8000539e: 10200073 sret + ... + +00000000800053ae : +// the riscv Platform Level Interrupt Controller (PLIC). +// + +void +plicinit(void) +{ + 800053ae: 1141 addi sp,sp,-16 + 800053b0: e422 sd s0,8(sp) + 800053b2: 0800 addi s0,sp,16 + // set desired IRQ priorities non-zero (otherwise disabled). + *(uint32*)(PLIC + UART0_IRQ*4) = 1; + 800053b4: 0c0007b7 lui a5,0xc000 + 800053b8: 4705 li a4,1 + 800053ba: d798 sw a4,40(a5) + *(uint32*)(PLIC + VIRTIO0_IRQ*4) = 1; + 800053bc: 0c0007b7 lui a5,0xc000 + 800053c0: c3d8 sw a4,4(a5) +} + 800053c2: 6422 ld s0,8(sp) + 800053c4: 0141 addi sp,sp,16 + 800053c6: 8082 ret + +00000000800053c8 : + +void +plicinithart(void) +{ + 800053c8: 1141 addi sp,sp,-16 + 800053ca: e406 sd ra,8(sp) + 800053cc: e022 sd s0,0(sp) + 800053ce: 0800 addi s0,sp,16 + int hart = cpuid(); + 800053d0: cd2fc0ef jal 800018a2 + + // set enable bits for this hart's S-mode + // for the uart and virtio disk. + *(uint32*)PLIC_SENABLE(hart) = (1 << UART0_IRQ) | (1 << VIRTIO0_IRQ); + 800053d4: 0085171b slliw a4,a0,0x8 + 800053d8: 0c0027b7 lui a5,0xc002 + 800053dc: 97ba add a5,a5,a4 + 800053de: 40200713 li a4,1026 + 800053e2: 08e7a023 sw a4,128(a5) # c002080 <_entry-0x73ffdf80> + + // set this hart's S-mode priority threshold to 0. + *(uint32*)PLIC_SPRIORITY(hart) = 0; + 800053e6: 00d5151b slliw a0,a0,0xd + 800053ea: 0c2017b7 lui a5,0xc201 + 800053ee: 97aa add a5,a5,a0 + 800053f0: 0007a023 sw zero,0(a5) # c201000 <_entry-0x73dff000> +} + 800053f4: 60a2 ld ra,8(sp) + 800053f6: 6402 ld s0,0(sp) + 800053f8: 0141 addi sp,sp,16 + 800053fa: 8082 ret + +00000000800053fc : + +// ask the PLIC what interrupt we should serve. +int +plic_claim(void) +{ + 800053fc: 1141 addi sp,sp,-16 + 800053fe: e406 sd ra,8(sp) + 80005400: e022 sd s0,0(sp) + 80005402: 0800 addi s0,sp,16 + int hart = cpuid(); + 80005404: c9efc0ef jal 800018a2 + int irq = *(uint32*)PLIC_SCLAIM(hart); + 80005408: 00d5151b slliw a0,a0,0xd + 8000540c: 0c2017b7 lui a5,0xc201 + 80005410: 97aa add a5,a5,a0 + return irq; +} + 80005412: 43c8 lw a0,4(a5) + 80005414: 60a2 ld ra,8(sp) + 80005416: 6402 ld s0,0(sp) + 80005418: 0141 addi sp,sp,16 + 8000541a: 8082 ret + +000000008000541c : + +// tell the PLIC we've served this IRQ. +void +plic_complete(int irq) +{ + 8000541c: 1101 addi sp,sp,-32 + 8000541e: ec06 sd ra,24(sp) + 80005420: e822 sd s0,16(sp) + 80005422: e426 sd s1,8(sp) + 80005424: 1000 addi s0,sp,32 + 80005426: 84aa mv s1,a0 + int hart = cpuid(); + 80005428: c7afc0ef jal 800018a2 + *(uint32*)PLIC_SCLAIM(hart) = irq; + 8000542c: 00d5151b slliw a0,a0,0xd + 80005430: 0c2017b7 lui a5,0xc201 + 80005434: 97aa add a5,a5,a0 + 80005436: c3c4 sw s1,4(a5) +} + 80005438: 60e2 ld ra,24(sp) + 8000543a: 6442 ld s0,16(sp) + 8000543c: 64a2 ld s1,8(sp) + 8000543e: 6105 addi sp,sp,32 + 80005440: 8082 ret + +0000000080005442 : +} + +// mark a descriptor as free. +static void +free_desc(int i) +{ + 80005442: 1141 addi sp,sp,-16 + 80005444: e406 sd ra,8(sp) + 80005446: e022 sd s0,0(sp) + 80005448: 0800 addi s0,sp,16 + if(i >= NUM) + 8000544a: 479d li a5,7 + 8000544c: 04a7ca63 blt a5,a0,800054a0 + panic("free_desc 1"); + if(disk.free[i]) + 80005450: 0001e797 auipc a5,0x1e + 80005454: f3878793 addi a5,a5,-200 # 80023388 + 80005458: 97aa add a5,a5,a0 + 8000545a: 0187c783 lbu a5,24(a5) + 8000545e: e7b9 bnez a5,800054ac + panic("free_desc 2"); + disk.desc[i].addr = 0; + 80005460: 00451693 slli a3,a0,0x4 + 80005464: 0001e797 auipc a5,0x1e + 80005468: f2478793 addi a5,a5,-220 # 80023388 + 8000546c: 6398 ld a4,0(a5) + 8000546e: 9736 add a4,a4,a3 + 80005470: 00073023 sd zero,0(a4) + disk.desc[i].len = 0; + 80005474: 6398 ld a4,0(a5) + 80005476: 9736 add a4,a4,a3 + 80005478: 00072423 sw zero,8(a4) + disk.desc[i].flags = 0; + 8000547c: 00071623 sh zero,12(a4) + disk.desc[i].next = 0; + 80005480: 00071723 sh zero,14(a4) + disk.free[i] = 1; + 80005484: 97aa add a5,a5,a0 + 80005486: 4705 li a4,1 + 80005488: 00e78c23 sb a4,24(a5) + wakeup(&disk.free[0]); + 8000548c: 0001e517 auipc a0,0x1e + 80005490: f1450513 addi a0,a0,-236 # 800233a0 + 80005494: a91fc0ef jal 80001f24 +} + 80005498: 60a2 ld ra,8(sp) + 8000549a: 6402 ld s0,0(sp) + 8000549c: 0141 addi sp,sp,16 + 8000549e: 8082 ret + panic("free_desc 1"); + 800054a0: 00002517 auipc a0,0x2 + 800054a4: 17050513 addi a0,a0,368 # 80007610 + 800054a8: b38fb0ef jal 800007e0 + panic("free_desc 2"); + 800054ac: 00002517 auipc a0,0x2 + 800054b0: 17450513 addi a0,a0,372 # 80007620 + 800054b4: b2cfb0ef jal 800007e0 + +00000000800054b8 : +{ + 800054b8: 1101 addi sp,sp,-32 + 800054ba: ec06 sd ra,24(sp) + 800054bc: e822 sd s0,16(sp) + 800054be: e426 sd s1,8(sp) + 800054c0: e04a sd s2,0(sp) + 800054c2: 1000 addi s0,sp,32 + initlock(&disk.vdisk_lock, "virtio_disk"); + 800054c4: 00002597 auipc a1,0x2 + 800054c8: 16c58593 addi a1,a1,364 # 80007630 + 800054cc: 0001e517 auipc a0,0x1e + 800054d0: fe450513 addi a0,a0,-28 # 800234b0 + 800054d4: e7afb0ef jal 80000b4e + if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 || + 800054d8: 100017b7 lui a5,0x10001 + 800054dc: 4398 lw a4,0(a5) + 800054de: 2701 sext.w a4,a4 + 800054e0: 747277b7 lui a5,0x74727 + 800054e4: 97678793 addi a5,a5,-1674 # 74726976 <_entry-0xb8d968a> + 800054e8: 18f71063 bne a4,a5,80005668 + *R(VIRTIO_MMIO_VERSION) != 2 || + 800054ec: 100017b7 lui a5,0x10001 + 800054f0: 0791 addi a5,a5,4 # 10001004 <_entry-0x6fffeffc> + 800054f2: 439c lw a5,0(a5) + 800054f4: 2781 sext.w a5,a5 + if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 || + 800054f6: 4709 li a4,2 + 800054f8: 16e79863 bne a5,a4,80005668 + *R(VIRTIO_MMIO_DEVICE_ID) != 2 || + 800054fc: 100017b7 lui a5,0x10001 + 80005500: 07a1 addi a5,a5,8 # 10001008 <_entry-0x6fffeff8> + 80005502: 439c lw a5,0(a5) + 80005504: 2781 sext.w a5,a5 + *R(VIRTIO_MMIO_VERSION) != 2 || + 80005506: 16e79163 bne a5,a4,80005668 + *R(VIRTIO_MMIO_VENDOR_ID) != 0x554d4551){ + 8000550a: 100017b7 lui a5,0x10001 + 8000550e: 47d8 lw a4,12(a5) + 80005510: 2701 sext.w a4,a4 + *R(VIRTIO_MMIO_DEVICE_ID) != 2 || + 80005512: 554d47b7 lui a5,0x554d4 + 80005516: 55178793 addi a5,a5,1361 # 554d4551 <_entry-0x2ab2baaf> + 8000551a: 14f71763 bne a4,a5,80005668 + *R(VIRTIO_MMIO_STATUS) = status; + 8000551e: 100017b7 lui a5,0x10001 + 80005522: 0607a823 sw zero,112(a5) # 10001070 <_entry-0x6fffef90> + *R(VIRTIO_MMIO_STATUS) = status; + 80005526: 4705 li a4,1 + 80005528: dbb8 sw a4,112(a5) + *R(VIRTIO_MMIO_STATUS) = status; + 8000552a: 470d li a4,3 + 8000552c: dbb8 sw a4,112(a5) + uint64 features = *R(VIRTIO_MMIO_DEVICE_FEATURES); + 8000552e: 10001737 lui a4,0x10001 + 80005532: 4b14 lw a3,16(a4) + features &= ~(1 << VIRTIO_RING_F_INDIRECT_DESC); + 80005534: c7ffe737 lui a4,0xc7ffe + 80005538: 75f70713 addi a4,a4,1887 # ffffffffc7ffe75f + *R(VIRTIO_MMIO_DRIVER_FEATURES) = features; + 8000553c: 8ef9 and a3,a3,a4 + 8000553e: 10001737 lui a4,0x10001 + 80005542: d314 sw a3,32(a4) + *R(VIRTIO_MMIO_STATUS) = status; + 80005544: 472d li a4,11 + 80005546: dbb8 sw a4,112(a5) + *R(VIRTIO_MMIO_STATUS) = status; + 80005548: 07078793 addi a5,a5,112 + status = *R(VIRTIO_MMIO_STATUS); + 8000554c: 439c lw a5,0(a5) + 8000554e: 0007891b sext.w s2,a5 + if(!(status & VIRTIO_CONFIG_S_FEATURES_OK)) + 80005552: 8ba1 andi a5,a5,8 + 80005554: 12078063 beqz a5,80005674 + *R(VIRTIO_MMIO_QUEUE_SEL) = 0; + 80005558: 100017b7 lui a5,0x10001 + 8000555c: 0207a823 sw zero,48(a5) # 10001030 <_entry-0x6fffefd0> + if(*R(VIRTIO_MMIO_QUEUE_READY)) + 80005560: 100017b7 lui a5,0x10001 + 80005564: 04478793 addi a5,a5,68 # 10001044 <_entry-0x6fffefbc> + 80005568: 439c lw a5,0(a5) + 8000556a: 2781 sext.w a5,a5 + 8000556c: 10079a63 bnez a5,80005680 + uint32 max = *R(VIRTIO_MMIO_QUEUE_NUM_MAX); + 80005570: 100017b7 lui a5,0x10001 + 80005574: 03478793 addi a5,a5,52 # 10001034 <_entry-0x6fffefcc> + 80005578: 439c lw a5,0(a5) + 8000557a: 2781 sext.w a5,a5 + if(max == 0) + 8000557c: 10078863 beqz a5,8000568c + if(max < NUM) + 80005580: 471d li a4,7 + 80005582: 10f77b63 bgeu a4,a5,80005698 + disk.desc = kalloc(); + 80005586: d78fb0ef jal 80000afe + 8000558a: 0001e497 auipc s1,0x1e + 8000558e: dfe48493 addi s1,s1,-514 # 80023388 + 80005592: e088 sd a0,0(s1) + disk.avail = kalloc(); + 80005594: d6afb0ef jal 80000afe + 80005598: e488 sd a0,8(s1) + disk.used = kalloc(); + 8000559a: d64fb0ef jal 80000afe + 8000559e: 87aa mv a5,a0 + 800055a0: e888 sd a0,16(s1) + if(!disk.desc || !disk.avail || !disk.used) + 800055a2: 6088 ld a0,0(s1) + 800055a4: 10050063 beqz a0,800056a4 + 800055a8: 0001e717 auipc a4,0x1e + 800055ac: de873703 ld a4,-536(a4) # 80023390 + 800055b0: 0e070a63 beqz a4,800056a4 + 800055b4: 0e078863 beqz a5,800056a4 + memset(disk.desc, 0, PGSIZE); + 800055b8: 6605 lui a2,0x1 + 800055ba: 4581 li a1,0 + 800055bc: ee6fb0ef jal 80000ca2 + memset(disk.avail, 0, PGSIZE); + 800055c0: 0001e497 auipc s1,0x1e + 800055c4: dc848493 addi s1,s1,-568 # 80023388 + 800055c8: 6605 lui a2,0x1 + 800055ca: 4581 li a1,0 + 800055cc: 6488 ld a0,8(s1) + 800055ce: ed4fb0ef jal 80000ca2 + memset(disk.used, 0, PGSIZE); + 800055d2: 6605 lui a2,0x1 + 800055d4: 4581 li a1,0 + 800055d6: 6888 ld a0,16(s1) + 800055d8: ecafb0ef jal 80000ca2 + *R(VIRTIO_MMIO_QUEUE_NUM) = NUM; + 800055dc: 100017b7 lui a5,0x10001 + 800055e0: 4721 li a4,8 + 800055e2: df98 sw a4,56(a5) + *R(VIRTIO_MMIO_QUEUE_DESC_LOW) = (uint64)disk.desc; + 800055e4: 4098 lw a4,0(s1) + 800055e6: 100017b7 lui a5,0x10001 + 800055ea: 08e7a023 sw a4,128(a5) # 10001080 <_entry-0x6fffef80> + *R(VIRTIO_MMIO_QUEUE_DESC_HIGH) = (uint64)disk.desc >> 32; + 800055ee: 40d8 lw a4,4(s1) + 800055f0: 100017b7 lui a5,0x10001 + 800055f4: 08e7a223 sw a4,132(a5) # 10001084 <_entry-0x6fffef7c> + *R(VIRTIO_MMIO_DRIVER_DESC_LOW) = (uint64)disk.avail; + 800055f8: 649c ld a5,8(s1) + 800055fa: 0007869b sext.w a3,a5 + 800055fe: 10001737 lui a4,0x10001 + 80005602: 08d72823 sw a3,144(a4) # 10001090 <_entry-0x6fffef70> + *R(VIRTIO_MMIO_DRIVER_DESC_HIGH) = (uint64)disk.avail >> 32; + 80005606: 9781 srai a5,a5,0x20 + 80005608: 10001737 lui a4,0x10001 + 8000560c: 08f72a23 sw a5,148(a4) # 10001094 <_entry-0x6fffef6c> + *R(VIRTIO_MMIO_DEVICE_DESC_LOW) = (uint64)disk.used; + 80005610: 689c ld a5,16(s1) + 80005612: 0007869b sext.w a3,a5 + 80005616: 10001737 lui a4,0x10001 + 8000561a: 0ad72023 sw a3,160(a4) # 100010a0 <_entry-0x6fffef60> + *R(VIRTIO_MMIO_DEVICE_DESC_HIGH) = (uint64)disk.used >> 32; + 8000561e: 9781 srai a5,a5,0x20 + 80005620: 10001737 lui a4,0x10001 + 80005624: 0af72223 sw a5,164(a4) # 100010a4 <_entry-0x6fffef5c> + *R(VIRTIO_MMIO_QUEUE_READY) = 0x1; + 80005628: 10001737 lui a4,0x10001 + 8000562c: 4785 li a5,1 + 8000562e: c37c sw a5,68(a4) + disk.free[i] = 1; + 80005630: 00f48c23 sb a5,24(s1) + 80005634: 00f48ca3 sb a5,25(s1) + 80005638: 00f48d23 sb a5,26(s1) + 8000563c: 00f48da3 sb a5,27(s1) + 80005640: 00f48e23 sb a5,28(s1) + 80005644: 00f48ea3 sb a5,29(s1) + 80005648: 00f48f23 sb a5,30(s1) + 8000564c: 00f48fa3 sb a5,31(s1) + status |= VIRTIO_CONFIG_S_DRIVER_OK; + 80005650: 00496913 ori s2,s2,4 + *R(VIRTIO_MMIO_STATUS) = status; + 80005654: 100017b7 lui a5,0x10001 + 80005658: 0727a823 sw s2,112(a5) # 10001070 <_entry-0x6fffef90> +} + 8000565c: 60e2 ld ra,24(sp) + 8000565e: 6442 ld s0,16(sp) + 80005660: 64a2 ld s1,8(sp) + 80005662: 6902 ld s2,0(sp) + 80005664: 6105 addi sp,sp,32 + 80005666: 8082 ret + panic("could not find virtio disk"); + 80005668: 00002517 auipc a0,0x2 + 8000566c: fd850513 addi a0,a0,-40 # 80007640 + 80005670: 970fb0ef jal 800007e0 + panic("virtio disk FEATURES_OK unset"); + 80005674: 00002517 auipc a0,0x2 + 80005678: fec50513 addi a0,a0,-20 # 80007660 + 8000567c: 964fb0ef jal 800007e0 + panic("virtio disk should not be ready"); + 80005680: 00002517 auipc a0,0x2 + 80005684: 00050513 mv a0,a0 + 80005688: 958fb0ef jal 800007e0 + panic("virtio disk has no queue 0"); + 8000568c: 00002517 auipc a0,0x2 + 80005690: 01450513 addi a0,a0,20 # 800076a0 + 80005694: 94cfb0ef jal 800007e0 + panic("virtio disk max queue too short"); + 80005698: 00002517 auipc a0,0x2 + 8000569c: 02850513 addi a0,a0,40 # 800076c0 + 800056a0: 940fb0ef jal 800007e0 + panic("virtio disk kalloc"); + 800056a4: 00002517 auipc a0,0x2 + 800056a8: 03c50513 addi a0,a0,60 # 800076e0 + 800056ac: 934fb0ef jal 800007e0 + +00000000800056b0 : + return 0; +} + +void +virtio_disk_rw(struct buf *b, int write) +{ + 800056b0: 7159 addi sp,sp,-112 + 800056b2: f486 sd ra,104(sp) + 800056b4: f0a2 sd s0,96(sp) + 800056b6: eca6 sd s1,88(sp) + 800056b8: e8ca sd s2,80(sp) + 800056ba: e4ce sd s3,72(sp) + 800056bc: e0d2 sd s4,64(sp) + 800056be: fc56 sd s5,56(sp) + 800056c0: f85a sd s6,48(sp) + 800056c2: f45e sd s7,40(sp) + 800056c4: f062 sd s8,32(sp) + 800056c6: ec66 sd s9,24(sp) + 800056c8: 1880 addi s0,sp,112 + 800056ca: 8a2a mv s4,a0 + 800056cc: 8bae mv s7,a1 + uint64 sector = b->blockno * (BSIZE / 512); + 800056ce: 00c52c83 lw s9,12(a0) + 800056d2: 001c9c9b slliw s9,s9,0x1 + 800056d6: 1c82 slli s9,s9,0x20 + 800056d8: 020cdc93 srli s9,s9,0x20 + + acquire(&disk.vdisk_lock); + 800056dc: 0001e517 auipc a0,0x1e + 800056e0: dd450513 addi a0,a0,-556 # 800234b0 + 800056e4: ceafb0ef jal 80000bce + for(int i = 0; i < 3; i++){ + 800056e8: 4981 li s3,0 + for(int i = 0; i < NUM; i++){ + 800056ea: 44a1 li s1,8 + disk.free[i] = 0; + 800056ec: 0001eb17 auipc s6,0x1e + 800056f0: c9cb0b13 addi s6,s6,-868 # 80023388 + for(int i = 0; i < 3; i++){ + 800056f4: 4a8d li s5,3 + int idx[3]; + while(1){ + if(alloc3_desc(idx) == 0) { + break; + } + sleep(&disk.free[0], &disk.vdisk_lock); + 800056f6: 0001ec17 auipc s8,0x1e + 800056fa: dbac0c13 addi s8,s8,-582 # 800234b0 + 800056fe: a8b9 j 8000575c + disk.free[i] = 0; + 80005700: 00fb0733 add a4,s6,a5 + 80005704: 00070c23 sb zero,24(a4) # 10001018 <_entry-0x6fffefe8> + idx[i] = alloc_desc(); + 80005708: c19c sw a5,0(a1) + if(idx[i] < 0){ + 8000570a: 0207c563 bltz a5,80005734 + for(int i = 0; i < 3; i++){ + 8000570e: 2905 addiw s2,s2,1 + 80005710: 0611 addi a2,a2,4 # 1004 <_entry-0x7fffeffc> + 80005712: 05590963 beq s2,s5,80005764 + idx[i] = alloc_desc(); + 80005716: 85b2 mv a1,a2 + for(int i = 0; i < NUM; i++){ + 80005718: 0001e717 auipc a4,0x1e + 8000571c: c7070713 addi a4,a4,-912 # 80023388 + 80005720: 87ce mv a5,s3 + if(disk.free[i]){ + 80005722: 01874683 lbu a3,24(a4) + 80005726: fee9 bnez a3,80005700 + for(int i = 0; i < NUM; i++){ + 80005728: 2785 addiw a5,a5,1 + 8000572a: 0705 addi a4,a4,1 + 8000572c: fe979be3 bne a5,s1,80005722 + idx[i] = alloc_desc(); + 80005730: 57fd li a5,-1 + 80005732: c19c sw a5,0(a1) + for(int j = 0; j < i; j++) + 80005734: 01205d63 blez s2,8000574e + free_desc(idx[j]); + 80005738: f9042503 lw a0,-112(s0) + 8000573c: d07ff0ef jal 80005442 + for(int j = 0; j < i; j++) + 80005740: 4785 li a5,1 + 80005742: 0127d663 bge a5,s2,8000574e + free_desc(idx[j]); + 80005746: f9442503 lw a0,-108(s0) + 8000574a: cf9ff0ef jal 80005442 + sleep(&disk.free[0], &disk.vdisk_lock); + 8000574e: 85e2 mv a1,s8 + 80005750: 0001e517 auipc a0,0x1e + 80005754: c5050513 addi a0,a0,-944 # 800233a0 + 80005758: f80fc0ef jal 80001ed8 + for(int i = 0; i < 3; i++){ + 8000575c: f9040613 addi a2,s0,-112 + 80005760: 894e mv s2,s3 + 80005762: bf55 j 80005716 + } + + // format the three descriptors. + // qemu's virtio-blk.c reads them. + + struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; + 80005764: f9042503 lw a0,-112(s0) + 80005768: 00451693 slli a3,a0,0x4 + + if(write) + 8000576c: 0001e797 auipc a5,0x1e + 80005770: c1c78793 addi a5,a5,-996 # 80023388 + 80005774: 00a50713 addi a4,a0,10 + 80005778: 0712 slli a4,a4,0x4 + 8000577a: 973e add a4,a4,a5 + 8000577c: 01703633 snez a2,s7 + 80005780: c710 sw a2,8(a4) + buf0->type = VIRTIO_BLK_T_OUT; // write the disk + else + buf0->type = VIRTIO_BLK_T_IN; // read the disk + buf0->reserved = 0; + 80005782: 00072623 sw zero,12(a4) + buf0->sector = sector; + 80005786: 01973823 sd s9,16(a4) + + disk.desc[idx[0]].addr = (uint64) buf0; + 8000578a: 6398 ld a4,0(a5) + 8000578c: 9736 add a4,a4,a3 + struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; + 8000578e: 0a868613 addi a2,a3,168 + 80005792: 963e add a2,a2,a5 + disk.desc[idx[0]].addr = (uint64) buf0; + 80005794: e310 sd a2,0(a4) + disk.desc[idx[0]].len = sizeof(struct virtio_blk_req); + 80005796: 6390 ld a2,0(a5) + 80005798: 00d605b3 add a1,a2,a3 + 8000579c: 4741 li a4,16 + 8000579e: c598 sw a4,8(a1) + disk.desc[idx[0]].flags = VRING_DESC_F_NEXT; + 800057a0: 4805 li a6,1 + 800057a2: 01059623 sh a6,12(a1) + disk.desc[idx[0]].next = idx[1]; + 800057a6: f9442703 lw a4,-108(s0) + 800057aa: 00e59723 sh a4,14(a1) + + disk.desc[idx[1]].addr = (uint64) b->data; + 800057ae: 0712 slli a4,a4,0x4 + 800057b0: 963a add a2,a2,a4 + 800057b2: 058a0593 addi a1,s4,88 + 800057b6: e20c sd a1,0(a2) + disk.desc[idx[1]].len = BSIZE; + 800057b8: 0007b883 ld a7,0(a5) + 800057bc: 9746 add a4,a4,a7 + 800057be: 40000613 li a2,1024 + 800057c2: c710 sw a2,8(a4) + if(write) + 800057c4: 001bb613 seqz a2,s7 + 800057c8: 0016161b slliw a2,a2,0x1 + disk.desc[idx[1]].flags = 0; // device reads b->data + else + disk.desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data + disk.desc[idx[1]].flags |= VRING_DESC_F_NEXT; + 800057cc: 00166613 ori a2,a2,1 + 800057d0: 00c71623 sh a2,12(a4) + disk.desc[idx[1]].next = idx[2]; + 800057d4: f9842583 lw a1,-104(s0) + 800057d8: 00b71723 sh a1,14(a4) + + disk.info[idx[0]].status = 0xff; // device writes 0 on success + 800057dc: 00250613 addi a2,a0,2 + 800057e0: 0612 slli a2,a2,0x4 + 800057e2: 963e add a2,a2,a5 + 800057e4: 577d li a4,-1 + 800057e6: 00e60823 sb a4,16(a2) + disk.desc[idx[2]].addr = (uint64) &disk.info[idx[0]].status; + 800057ea: 0592 slli a1,a1,0x4 + 800057ec: 98ae add a7,a7,a1 + 800057ee: 03068713 addi a4,a3,48 + 800057f2: 973e add a4,a4,a5 + 800057f4: 00e8b023 sd a4,0(a7) + disk.desc[idx[2]].len = 1; + 800057f8: 6398 ld a4,0(a5) + 800057fa: 972e add a4,a4,a1 + 800057fc: 01072423 sw a6,8(a4) + disk.desc[idx[2]].flags = VRING_DESC_F_WRITE; // device writes the status + 80005800: 4689 li a3,2 + 80005802: 00d71623 sh a3,12(a4) + disk.desc[idx[2]].next = 0; + 80005806: 00071723 sh zero,14(a4) + + // record struct buf for virtio_disk_intr(). + b->disk = 1; + 8000580a: 010a2223 sw a6,4(s4) + disk.info[idx[0]].b = b; + 8000580e: 01463423 sd s4,8(a2) + + // tell the device the first index in our chain of descriptors. + disk.avail->ring[disk.avail->idx % NUM] = idx[0]; + 80005812: 6794 ld a3,8(a5) + 80005814: 0026d703 lhu a4,2(a3) + 80005818: 8b1d andi a4,a4,7 + 8000581a: 0706 slli a4,a4,0x1 + 8000581c: 96ba add a3,a3,a4 + 8000581e: 00a69223 sh a0,4(a3) + + __sync_synchronize(); + 80005822: 0330000f fence rw,rw + + // tell the device another avail ring entry is available. + disk.avail->idx += 1; // not % NUM ... + 80005826: 6798 ld a4,8(a5) + 80005828: 00275783 lhu a5,2(a4) + 8000582c: 2785 addiw a5,a5,1 + 8000582e: 00f71123 sh a5,2(a4) + + __sync_synchronize(); + 80005832: 0330000f fence rw,rw + + *R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number + 80005836: 100017b7 lui a5,0x10001 + 8000583a: 0407a823 sw zero,80(a5) # 10001050 <_entry-0x6fffefb0> + + // Wait for virtio_disk_intr() to say request has finished. + while(b->disk == 1) { + 8000583e: 004a2783 lw a5,4(s4) + sleep(b, &disk.vdisk_lock); + 80005842: 0001e917 auipc s2,0x1e + 80005846: c6e90913 addi s2,s2,-914 # 800234b0 + while(b->disk == 1) { + 8000584a: 4485 li s1,1 + 8000584c: 01079a63 bne a5,a6,80005860 + sleep(b, &disk.vdisk_lock); + 80005850: 85ca mv a1,s2 + 80005852: 8552 mv a0,s4 + 80005854: e84fc0ef jal 80001ed8 + while(b->disk == 1) { + 80005858: 004a2783 lw a5,4(s4) + 8000585c: fe978ae3 beq a5,s1,80005850 + } + + disk.info[idx[0]].b = 0; + 80005860: f9042903 lw s2,-112(s0) + 80005864: 00290713 addi a4,s2,2 + 80005868: 0712 slli a4,a4,0x4 + 8000586a: 0001e797 auipc a5,0x1e + 8000586e: b1e78793 addi a5,a5,-1250 # 80023388 + 80005872: 97ba add a5,a5,a4 + 80005874: 0007b423 sd zero,8(a5) + int flag = disk.desc[i].flags; + 80005878: 0001e997 auipc s3,0x1e + 8000587c: b1098993 addi s3,s3,-1264 # 80023388 + 80005880: 00491713 slli a4,s2,0x4 + 80005884: 0009b783 ld a5,0(s3) + 80005888: 97ba add a5,a5,a4 + 8000588a: 00c7d483 lhu s1,12(a5) + int nxt = disk.desc[i].next; + 8000588e: 854a mv a0,s2 + 80005890: 00e7d903 lhu s2,14(a5) + free_desc(i); + 80005894: bafff0ef jal 80005442 + if(flag & VRING_DESC_F_NEXT) + 80005898: 8885 andi s1,s1,1 + 8000589a: f0fd bnez s1,80005880 + free_chain(idx[0]); + + release(&disk.vdisk_lock); + 8000589c: 0001e517 auipc a0,0x1e + 800058a0: c1450513 addi a0,a0,-1004 # 800234b0 + 800058a4: bc2fb0ef jal 80000c66 +} + 800058a8: 70a6 ld ra,104(sp) + 800058aa: 7406 ld s0,96(sp) + 800058ac: 64e6 ld s1,88(sp) + 800058ae: 6946 ld s2,80(sp) + 800058b0: 69a6 ld s3,72(sp) + 800058b2: 6a06 ld s4,64(sp) + 800058b4: 7ae2 ld s5,56(sp) + 800058b6: 7b42 ld s6,48(sp) + 800058b8: 7ba2 ld s7,40(sp) + 800058ba: 7c02 ld s8,32(sp) + 800058bc: 6ce2 ld s9,24(sp) + 800058be: 6165 addi sp,sp,112 + 800058c0: 8082 ret + +00000000800058c2 : + +void +virtio_disk_intr() +{ + 800058c2: 1101 addi sp,sp,-32 + 800058c4: ec06 sd ra,24(sp) + 800058c6: e822 sd s0,16(sp) + 800058c8: e426 sd s1,8(sp) + 800058ca: 1000 addi s0,sp,32 + acquire(&disk.vdisk_lock); + 800058cc: 0001e497 auipc s1,0x1e + 800058d0: abc48493 addi s1,s1,-1348 # 80023388 + 800058d4: 0001e517 auipc a0,0x1e + 800058d8: bdc50513 addi a0,a0,-1060 # 800234b0 + 800058dc: af2fb0ef jal 80000bce + // we've seen this interrupt, which the following line does. + // this may race with the device writing new entries to + // the "used" ring, in which case we may process the new + // completion entries in this interrupt, and have nothing to do + // in the next interrupt, which is harmless. + *R(VIRTIO_MMIO_INTERRUPT_ACK) = *R(VIRTIO_MMIO_INTERRUPT_STATUS) & 0x3; + 800058e0: 100017b7 lui a5,0x10001 + 800058e4: 53b8 lw a4,96(a5) + 800058e6: 8b0d andi a4,a4,3 + 800058e8: 100017b7 lui a5,0x10001 + 800058ec: d3f8 sw a4,100(a5) + + __sync_synchronize(); + 800058ee: 0330000f fence rw,rw + + // the device increments disk.used->idx when it + // adds an entry to the used ring. + + while(disk.used_idx != disk.used->idx){ + 800058f2: 689c ld a5,16(s1) + 800058f4: 0204d703 lhu a4,32(s1) + 800058f8: 0027d783 lhu a5,2(a5) # 10001002 <_entry-0x6fffeffe> + 800058fc: 04f70663 beq a4,a5,80005948 + __sync_synchronize(); + 80005900: 0330000f fence rw,rw + int id = disk.used->ring[disk.used_idx % NUM].id; + 80005904: 6898 ld a4,16(s1) + 80005906: 0204d783 lhu a5,32(s1) + 8000590a: 8b9d andi a5,a5,7 + 8000590c: 078e slli a5,a5,0x3 + 8000590e: 97ba add a5,a5,a4 + 80005910: 43dc lw a5,4(a5) + + if(disk.info[id].status != 0) + 80005912: 00278713 addi a4,a5,2 + 80005916: 0712 slli a4,a4,0x4 + 80005918: 9726 add a4,a4,s1 + 8000591a: 01074703 lbu a4,16(a4) + 8000591e: e321 bnez a4,8000595e + panic("virtio_disk_intr status"); + + struct buf *b = disk.info[id].b; + 80005920: 0789 addi a5,a5,2 + 80005922: 0792 slli a5,a5,0x4 + 80005924: 97a6 add a5,a5,s1 + 80005926: 6788 ld a0,8(a5) + b->disk = 0; // disk is done with buf + 80005928: 00052223 sw zero,4(a0) + wakeup(b); + 8000592c: df8fc0ef jal 80001f24 + + disk.used_idx += 1; + 80005930: 0204d783 lhu a5,32(s1) + 80005934: 2785 addiw a5,a5,1 + 80005936: 17c2 slli a5,a5,0x30 + 80005938: 93c1 srli a5,a5,0x30 + 8000593a: 02f49023 sh a5,32(s1) + while(disk.used_idx != disk.used->idx){ + 8000593e: 6898 ld a4,16(s1) + 80005940: 00275703 lhu a4,2(a4) + 80005944: faf71ee3 bne a4,a5,80005900 + } + + release(&disk.vdisk_lock); + 80005948: 0001e517 auipc a0,0x1e + 8000594c: b6850513 addi a0,a0,-1176 # 800234b0 + 80005950: b16fb0ef jal 80000c66 +} + 80005954: 60e2 ld ra,24(sp) + 80005956: 6442 ld s0,16(sp) + 80005958: 64a2 ld s1,8(sp) + 8000595a: 6105 addi sp,sp,32 + 8000595c: 8082 ret + panic("virtio_disk_intr status"); + 8000595e: 00002517 auipc a0,0x2 + 80005962: d9a50513 addi a0,a0,-614 # 800076f8 + 80005966: e7bfa0ef jal 800007e0 + ... + +0000000080006000 <_trampoline>: + 80006000: 14051073 csrw sscratch,a0 + 80006004: 02000537 lui a0,0x2000 + 80006008: 357d addiw a0,a0,-1 # 1ffffff <_entry-0x7e000001> + 8000600a: 0536 slli a0,a0,0xd + 8000600c: 02153423 sd ra,40(a0) + 80006010: 02253823 sd sp,48(a0) + 80006014: 02353c23 sd gp,56(a0) + 80006018: 04453023 sd tp,64(a0) + 8000601c: 04553423 sd t0,72(a0) + 80006020: 04653823 sd t1,80(a0) + 80006024: 04753c23 sd t2,88(a0) + 80006028: f120 sd s0,96(a0) + 8000602a: f524 sd s1,104(a0) + 8000602c: fd2c sd a1,120(a0) + 8000602e: e150 sd a2,128(a0) + 80006030: e554 sd a3,136(a0) + 80006032: e958 sd a4,144(a0) + 80006034: ed5c sd a5,152(a0) + 80006036: 0b053023 sd a6,160(a0) + 8000603a: 0b153423 sd a7,168(a0) + 8000603e: 0b253823 sd s2,176(a0) + 80006042: 0b353c23 sd s3,184(a0) + 80006046: 0d453023 sd s4,192(a0) + 8000604a: 0d553423 sd s5,200(a0) + 8000604e: 0d653823 sd s6,208(a0) + 80006052: 0d753c23 sd s7,216(a0) + 80006056: 0f853023 sd s8,224(a0) + 8000605a: 0f953423 sd s9,232(a0) + 8000605e: 0fa53823 sd s10,240(a0) + 80006062: 0fb53c23 sd s11,248(a0) + 80006066: 11c53023 sd t3,256(a0) + 8000606a: 11d53423 sd t4,264(a0) + 8000606e: 11e53823 sd t5,272(a0) + 80006072: 11f53c23 sd t6,280(a0) + 80006076: 140022f3 csrr t0,sscratch + 8000607a: 06553823 sd t0,112(a0) + 8000607e: 00853103 ld sp,8(a0) + 80006082: 02053203 ld tp,32(a0) + 80006086: 01053283 ld t0,16(a0) + 8000608a: 00053303 ld t1,0(a0) + 8000608e: 12000073 sfence.vma + 80006092: 18031073 csrw satp,t1 + 80006096: 12000073 sfence.vma + 8000609a: 9282 jalr t0 + +000000008000609c : + 8000609c: 12000073 sfence.vma + 800060a0: 18051073 csrw satp,a0 + 800060a4: 12000073 sfence.vma + 800060a8: 02000537 lui a0,0x2000 + 800060ac: 357d addiw a0,a0,-1 # 1ffffff <_entry-0x7e000001> + 800060ae: 0536 slli a0,a0,0xd + 800060b0: 02853083 ld ra,40(a0) + 800060b4: 03053103 ld sp,48(a0) + 800060b8: 03853183 ld gp,56(a0) + 800060bc: 04053203 ld tp,64(a0) + 800060c0: 04853283 ld t0,72(a0) + 800060c4: 05053303 ld t1,80(a0) + 800060c8: 05853383 ld t2,88(a0) + 800060cc: 7120 ld s0,96(a0) + 800060ce: 7524 ld s1,104(a0) + 800060d0: 7d2c ld a1,120(a0) + 800060d2: 6150 ld a2,128(a0) + 800060d4: 6554 ld a3,136(a0) + 800060d6: 6958 ld a4,144(a0) + 800060d8: 6d5c ld a5,152(a0) + 800060da: 0a053803 ld a6,160(a0) + 800060de: 0a853883 ld a7,168(a0) + 800060e2: 0b053903 ld s2,176(a0) + 800060e6: 0b853983 ld s3,184(a0) + 800060ea: 0c053a03 ld s4,192(a0) + 800060ee: 0c853a83 ld s5,200(a0) + 800060f2: 0d053b03 ld s6,208(a0) + 800060f6: 0d853b83 ld s7,216(a0) + 800060fa: 0e053c03 ld s8,224(a0) + 800060fe: 0e853c83 ld s9,232(a0) + 80006102: 0f053d03 ld s10,240(a0) + 80006106: 0f853d83 ld s11,248(a0) + 8000610a: 10053e03 ld t3,256(a0) + 8000610e: 10853e83 ld t4,264(a0) + 80006112: 11053f03 ld t5,272(a0) + 80006116: 11853f83 ld t6,280(a0) + 8000611a: 7928 ld a0,112(a0) + 8000611c: 10200073 sret + ... diff --git a/G12_Project2_2/kernel/kernel.ld b/G12_Project2_2/kernel/kernel.ld new file mode 100644 index 0000000000..c72aaac4d1 --- /dev/null +++ b/G12_Project2_2/kernel/kernel.ld @@ -0,0 +1,45 @@ +OUTPUT_ARCH( "riscv" ) +ENTRY( _entry ) + +SECTIONS +{ + /* + * ensure that entry.S / _entry is at 0x80000000, + * where qemu's -kernel jumps. + */ + . = 0x80000000; + + .text : { + kernel/entry.o(_entry) + *(.text .text.*) + . = ALIGN(0x1000); + _trampoline = .; + *(trampsec) + . = ALIGN(0x1000); + ASSERT(. - _trampoline == 0x1000, "error: trampoline larger than one page"); + PROVIDE(etext = .); + } + + .rodata : { + . = ALIGN(16); + *(.srodata .srodata.*) /* do not need to distinguish this from .rodata */ + . = ALIGN(16); + *(.rodata .rodata.*) + } + + .data : { + . = ALIGN(16); + *(.sdata .sdata.*) /* do not need to distinguish this from .data */ + . = ALIGN(16); + *(.data .data.*) + } + + .bss : { + . = ALIGN(16); + *(.sbss .sbss.*) /* do not need to distinguish this from .bss */ + . = ALIGN(16); + *(.bss .bss.*) + } + + PROVIDE(end = .); +} diff --git a/G12_Project2_2/kernel/kernel.sym b/G12_Project2_2/kernel/kernel.sym new file mode 100644 index 0000000000..b93178bcaa --- /dev/null +++ b/G12_Project2_2/kernel/kernel.sym @@ -0,0 +1,266 @@ +0000000080000000 .text +0000000080007000 .rodata +0000000080007820 .eh_frame +000000008000a158 .data +000000008000a170 .got +000000008000a180 .got.plt +000000008000a190 .bss +0000000000000000 .riscv.attributes +0000000000000000 .comment +0000000000000000 .debug_line +0000000000000000 .debug_line_str +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_aranges +0000000000000000 .debug_str +0000000000000000 .debug_loc +0000000000000000 .debug_ranges +0000000000000000 entry.o +000000008000001a spin +0000000000000000 start.c +0000000000000000 console.c +0000000000000000 printf.c +0000000080000468 printint +0000000080007710 digits +0000000080012268 pr +0000000000000000 uart.c +000000008000a19c tx_busy +000000008000a198 tx_chan +0000000080012280 tx_lock +0000000000000000 kalloc.c +0000000000000000 spinlock.c +0000000000000000 string.c +0000000000000000 main.c +000000008000a1a0 started +0000000000000000 vm.c +0000000000000000 proc.c +000000008000a160 first.1 +0000000080001a9e freeproc +0000000080001aee allocproc +0000000080007728 states.0 +0000000000000000 swtch.o +0000000000000000 trap.c +0000000000000000 syscall.c +00000000800026f2 argraw +0000000080007770 syscalls +0000000000000000 sysproc.c +0000000000000000 bio.c +0000000000000000 fs.c +0000000080002d0e bfree +0000000080002d7a balloc +0000000080002e9a bmap +0000000080002f6e iget +000000008000382e namex +0000000000000000 log.c +0000000080003a2a write_head +0000000080003a88 install_trans +0000000000000000 sleeplock.c +0000000000000000 file.c +0000000000000000 pipe.c +0000000000000000 exec.c +0000000000000000 sysfile.c +0000000080004952 argfd +00000000800049aa fdalloc +00000000800049e8 create +0000000000000000 kernelvec.o +0000000000000000 plic.c +0000000000000000 virtio_disk.c +0000000080005442 free_desc +0000000080023388 disk +000000008000a170 _GLOBAL_OFFSET_TABLE_ +0000000080002994 sys_pause +0000000080000fee mappages +0000000080001488 copyinstr +000000008000016e consoleread +0000000080000de0 safestrcpy +0000000080004bfe sys_close +0000000080001eac yield +0000000080022288 log +0000000080012298 kmem +0000000080000840 uartinit +0000000080002234 either_copyout +000000008000001c timerinit +00000000800126e8 proc +00000000800040f8 fileread +00000000800004fa printf +0000000080002918 sys_sbrk +0000000080006000 trampoline +000000008000a190 panicked +00000000800053fc plic_claim +00000000800053ae plicinit +000000008000213a kwait +000000008000541c plic_complete +0000000080001df2 sched +0000000080000cfe memmove +0000000080002844 syscall +00000000800018a2 cpuid +000000008000366e writei +00000000800028e2 sys_fork +0000000080018100 bcache +0000000080005052 sys_mkdir +00000000800011ba uvmunmap +000000008000377c namecmp +00000000800053c8 plicinithart +0000000080001f8e reparent +0000000080002814 argstr +0000000080001244 uvmdealloc +0000000080003f92 filedup +00000000800039f8 namei +0000000080002a90 binit +000000008000145e uvmclear +0000000080004b6e sys_read +00000000800045e0 kexec +00000000800034d6 fsinit +0000000080000d5a memcpy +000000008000109e kvmmap +0000000080000a1c kfree +00000000800018b2 mycpu +0000000080003364 iput +00000000800010c6 kvmmake +00000000800024e0 devintr +000000008000a164 nextpid +0000000080003f10 fileinit +000000008000609c userret +0000000080000b4e initlock +00000000800015e2 copyout +0000000080001ed8 sleep +0000000080005350 kernelvec +000000008000340c ireclaim +0000000080003548 stati +00000000800122d0 wait_lock +0000000080002a34 sys_kill +00000000800043aa pipeclose +0000000080004c40 sys_fstat +00000000800000d0 consolewrite +0000000080003c36 end_op +0000000080000a82 freerange +0000000080000eee kvminithart +0000000080001288 uvmalloc +00000000800013c0 uvmcopy +000000008000a1b0 initproc +0000000080001a58 proc_freepagetable +0000000080001540 ismapped +0000000080003290 iunlock +00000000800019d4 proc_pagetable +000000008000a1c0 stack0 +0000000080004c7a sys_link +0000000080003f34 filealloc +0000000080001f24 wakeup +00000000800054b8 virtio_disk_init +00000000800018ce myproc +00000000800031ac idup +0000000080000f16 walk +0000000080004efe sys_open +0000000080000898 uartwrite +0000000080003572 readi +00000000800002aa consoleintr +0000000080000278 consputc +0000000080001996 allocpid +0000000080003072 ialloc +0000000080001fe4 kexit +00000000800009b0 uartintr +00000000800016c6 copyin +00000000800023d6 trapinit +000000008000138e uvmfree +00000000800234c8 end +00000000800032d0 itrunc +00000000800041b6 filewrite +00000000800027dc argint +0000000080007000 etext +0000000080004bb6 sys_write +0000000080000c66 release +000000008000279c fetchstr +0000000080001d40 scheduler +0000000080006000 _trampoline +0000000080003792 dirlookup +0000000080003bcc begin_op +0000000080003fd8 fileclose +0000000080002554 usertrap +0000000080000d6e strncmp +00000000800180e8 tickslock +0000000080004402 pipewrite +0000000080000da4 strncpy +00000000800223d0 ftable +00000000800058c2 virtio_disk_intr +0000000080004b22 sys_dup +00000000800007e0 panic +00000000800018fe forkret +0000000080000aca kinit +0000000080000cc4 memcmp +000000008000227e either_copyin +000000008000248c clockintr +00000000800122e8 cpus +0000000080003e8e releasesleep +0000000080000000 _entry +0000000080000b64 holding +00000000800207c0 sb +0000000080000bce acquire +0000000080003a12 nameiparent +00000000800023fa trapinithart +000000008000312e iupdate +0000000080000ca2 memset +0000000080000e3c main +00000000800020ec setkilled +0000000080002086 kkill +0000000080003d50 log_write +0000000080003e48 acquiresleep +0000000080004d78 sys_unlink +0000000080006000 uservec +0000000080001178 kvminit +0000000080002cda bunpin +00000000800027f8 argaddr +0000000080002412 prepare_return +0000000080002a56 sys_uptime +000000008000098a uartgetc +000000008000081c printfinit +0000000080001194 uvmcreate +0000000080001bd0 growproc +0000000080003ec6 holdingsleep +0000000080002110 killed +0000000080001b94 userinit +0000000080002b16 bread +00000000800044e6 piperead +000000008000a1b8 ticks +0000000080000424 consoleinit +0000000080000fb0 walkaddr +0000000080001560 vmfault +00000000800022c8 procdump +0000000080002c1e brelse +00000000800031e2 ilock +000000008000517a sys_exec +000000008000236c swtch +00000000800033ec iunlockput +0000000080000b8e push_off +00000000800045c6 flags2perm +0000000080000c12 pop_off +0000000080002bec bwrite +0000000080001c32 kfork +000000008000092c uartputc_sync +000000008000a194 panicking +000000008000132e freewalk +00000000800028f6 sys_wait +00000000800028a8 sys_exit +000000008000395e dirlink +0000000080003e12 initsleeplock +0000000080000060 start +000000008000a1a8 kernel_pagetable +00000000800056b0 virtio_disk_rw +0000000080000e12 strlen +000000008000526e sys_pipe +000000008000301a iinit +0000000080003b4e initlog +00000000800121c0 cons +0000000080000afe kalloc +0000000080002752 fetchaddr +0000000080022330 devsw +00000000800028cc sys_getpid +00000000800042e2 pipealloc +00000000800050fa sys_chdir +0000000080001754 proc_mapstacks +0000000080002662 kerneltrap +0000000080002ca6 bpin +00000000800017ec procinit +00000000800207e0 itable +000000008000509a sys_mknod +000000008000409a filestat +00000000800122b8 pid_lock diff --git a/G12_Project2_2/kernel/kernelvec.S b/G12_Project2_2/kernel/kernelvec.S new file mode 100644 index 0000000000..5561b89684 --- /dev/null +++ b/G12_Project2_2/kernel/kernelvec.S @@ -0,0 +1,64 @@ + # + # interrupts and exceptions while in supervisor + # mode come here. + # + # the current stack is a kernel stack. + # push registers, call kerneltrap(). + # when kerneltrap() returns, restore registers, return. + # +.globl kerneltrap +.globl kernelvec +.align 4 +kernelvec: + # make room to save registers. + addi sp, sp, -256 + + # save caller-saved registers. + sd ra, 0(sp) + # sd sp, 8(sp) + sd gp, 16(sp) + sd tp, 24(sp) + sd t0, 32(sp) + sd t1, 40(sp) + sd t2, 48(sp) + sd a0, 72(sp) + sd a1, 80(sp) + sd a2, 88(sp) + sd a3, 96(sp) + sd a4, 104(sp) + sd a5, 112(sp) + sd a6, 120(sp) + sd a7, 128(sp) + sd t3, 216(sp) + sd t4, 224(sp) + sd t5, 232(sp) + sd t6, 240(sp) + + # call the C trap handler in trap.c + call kerneltrap + + # restore registers. + ld ra, 0(sp) + # ld sp, 8(sp) + ld gp, 16(sp) + # not tp (contains hartid), in case we moved CPUs + ld t0, 32(sp) + ld t1, 40(sp) + ld t2, 48(sp) + ld a0, 72(sp) + ld a1, 80(sp) + ld a2, 88(sp) + ld a3, 96(sp) + ld a4, 104(sp) + ld a5, 112(sp) + ld a6, 120(sp) + ld a7, 128(sp) + ld t3, 216(sp) + ld t4, 224(sp) + ld t5, 232(sp) + ld t6, 240(sp) + + addi sp, sp, 256 + + # return to whatever we were doing in the kernel. + sret diff --git a/G12_Project2_2/kernel/kernelvec.o b/G12_Project2_2/kernel/kernelvec.o new file mode 100644 index 0000000000..088f966525 Binary files /dev/null and b/G12_Project2_2/kernel/kernelvec.o differ diff --git a/G12_Project2_2/kernel/log.c b/G12_Project2_2/kernel/log.c new file mode 100644 index 0000000000..68269213e1 --- /dev/null +++ b/G12_Project2_2/kernel/log.c @@ -0,0 +1,237 @@ +#include "types.h" +#include "riscv.h" +#include "defs.h" +#include "param.h" +#include "spinlock.h" +#include "sleeplock.h" +#include "fs.h" +#include "buf.h" + +// Simple logging that allows concurrent FS system calls. +// +// A log transaction contains the updates of multiple FS system +// calls. The logging system only commits when there are +// no FS system calls active. Thus there is never +// any reasoning required about whether a commit might +// write an uncommitted system call's updates to disk. +// +// A system call should call begin_op()/end_op() to mark +// its start and end. Usually begin_op() just increments +// the count of in-progress FS system calls and returns. +// But if it thinks the log is close to running out, it +// sleeps until the last outstanding end_op() commits. +// +// The log is a physical re-do log containing disk blocks. +// The on-disk log format: +// header block, containing block #s for block A, B, C, ... +// block A +// block B +// block C +// ... +// Log appends are synchronous. + +// Contents of the header block, used for both the on-disk header block +// and to keep track in memory of logged block# before commit. +struct logheader { + int n; + int block[LOGBLOCKS]; +}; + +struct log { + struct spinlock lock; + int start; + int outstanding; // how many FS sys calls are executing. + int committing; // in commit(), please wait. + int dev; + struct logheader lh; +}; +struct log log; + +static void recover_from_log(void); +static void commit(); + +void +initlog(int dev, struct superblock *sb) +{ + if (sizeof(struct logheader) >= BSIZE) + panic("initlog: too big logheader"); + + initlock(&log.lock, "log"); + log.start = sb->logstart; + log.dev = dev; + recover_from_log(); +} + +// Copy committed blocks from log to their home location +static void +install_trans(int recovering) +{ + int tail; + + for (tail = 0; tail < log.lh.n; tail++) { + if(recovering) { + printf("recovering tail %d dst %d\n", tail, log.lh.block[tail]); + } + struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block + struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst + memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst + bwrite(dbuf); // write dst to disk + if(recovering == 0) + bunpin(dbuf); + brelse(lbuf); + brelse(dbuf); + } +} + +// Read the log header from disk into the in-memory log header +static void +read_head(void) +{ + struct buf *buf = bread(log.dev, log.start); + struct logheader *lh = (struct logheader *) (buf->data); + int i; + log.lh.n = lh->n; + for (i = 0; i < log.lh.n; i++) { + log.lh.block[i] = lh->block[i]; + } + brelse(buf); +} + +// Write in-memory log header to disk. +// This is the true point at which the +// current transaction commits. +static void +write_head(void) +{ + struct buf *buf = bread(log.dev, log.start); + struct logheader *hb = (struct logheader *) (buf->data); + int i; + hb->n = log.lh.n; + for (i = 0; i < log.lh.n; i++) { + hb->block[i] = log.lh.block[i]; + } + bwrite(buf); + brelse(buf); +} + +static void +recover_from_log(void) +{ + read_head(); + install_trans(1); // if committed, copy from log to disk + log.lh.n = 0; + write_head(); // clear the log +} + +// called at the start of each FS system call. +void +begin_op(void) +{ + acquire(&log.lock); + while(1){ + if(log.committing){ + sleep(&log, &log.lock); + } else if(log.lh.n + (log.outstanding+1)*MAXOPBLOCKS > LOGBLOCKS){ + // this op might exhaust log space; wait for commit. + sleep(&log, &log.lock); + } else { + log.outstanding += 1; + release(&log.lock); + break; + } + } +} + +// called at the end of each FS system call. +// commits if this was the last outstanding operation. +void +end_op(void) +{ + int do_commit = 0; + + acquire(&log.lock); + log.outstanding -= 1; + if(log.committing) + panic("log.committing"); + if(log.outstanding == 0){ + do_commit = 1; + log.committing = 1; + } else { + // begin_op() may be waiting for log space, + // and decrementing log.outstanding has decreased + // the amount of reserved space. + wakeup(&log); + } + release(&log.lock); + + if(do_commit){ + // call commit w/o holding locks, since not allowed + // to sleep with locks. + commit(); + acquire(&log.lock); + log.committing = 0; + wakeup(&log); + release(&log.lock); + } +} + +// Copy modified blocks from cache to log. +static void +write_log(void) +{ + int tail; + + for (tail = 0; tail < log.lh.n; tail++) { + struct buf *to = bread(log.dev, log.start+tail+1); // log block + struct buf *from = bread(log.dev, log.lh.block[tail]); // cache block + memmove(to->data, from->data, BSIZE); + bwrite(to); // write the log + brelse(from); + brelse(to); + } +} + +static void +commit() +{ + if (log.lh.n > 0) { + write_log(); // Write modified blocks from cache to log + write_head(); // Write header to disk -- the real commit + install_trans(0); // Now install writes to home locations + log.lh.n = 0; + write_head(); // Erase the transaction from the log + } +} + +// Caller has modified b->data and is done with the buffer. +// Record the block number and pin in the cache by increasing refcnt. +// commit()/write_log() will do the disk write. +// +// log_write() replaces bwrite(); a typical use is: +// bp = bread(...) +// modify bp->data[] +// log_write(bp) +// brelse(bp) +void +log_write(struct buf *b) +{ + int i; + + acquire(&log.lock); + if (log.lh.n >= LOGBLOCKS) + panic("too big a transaction"); + if (log.outstanding < 1) + panic("log_write outside of trans"); + + for (i = 0; i < log.lh.n; i++) { + if (log.lh.block[i] == b->blockno) // log absorption + break; + } + log.lh.block[i] = b->blockno; + if (i == log.lh.n) { // Add new block to log? + bpin(b); + log.lh.n++; + } + release(&log.lock); +} + diff --git a/G12_Project2_2/kernel/log.d b/G12_Project2_2/kernel/log.d new file mode 100644 index 0000000000..38eddde698 --- /dev/null +++ b/G12_Project2_2/kernel/log.d @@ -0,0 +1,3 @@ +kernel/log.o: kernel/log.c kernel/types.h kernel/riscv.h kernel/defs.h \ + kernel/param.h kernel/spinlock.h kernel/sleeplock.h kernel/fs.h \ + kernel/buf.h diff --git a/G12_Project2_2/kernel/log.o b/G12_Project2_2/kernel/log.o new file mode 100644 index 0000000000..e8df11c6e3 Binary files /dev/null and b/G12_Project2_2/kernel/log.o differ diff --git a/G12_Project2_2/kernel/main.c b/G12_Project2_2/kernel/main.c new file mode 100644 index 0000000000..f0d3171d4e --- /dev/null +++ b/G12_Project2_2/kernel/main.c @@ -0,0 +1,45 @@ +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "riscv.h" +#include "defs.h" + +volatile static int started = 0; + +// start() jumps here in supervisor mode on all CPUs. +void +main() +{ + if(cpuid() == 0){ + consoleinit(); + printfinit(); + printf("\n"); + printf("xv6 kernel is booting\n"); + printf("\n"); + kinit(); // physical page allocator + kvminit(); // create kernel page table + kvminithart(); // turn on paging + procinit(); // process table + trapinit(); // trap vectors + trapinithart(); // install kernel trap vector + plicinit(); // set up interrupt controller + plicinithart(); // ask PLIC for device interrupts + binit(); // buffer cache + iinit(); // inode table + fileinit(); // file table + virtio_disk_init(); // emulated hard disk + userinit(); // first user process + __sync_synchronize(); + started = 1; + } else { + while(started == 0) + ; + __sync_synchronize(); + printf("hart %d starting\n", cpuid()); + kvminithart(); // turn on paging + trapinithart(); // install kernel trap vector + plicinithart(); // ask PLIC for device interrupts + } + + scheduler(); +} diff --git a/G12_Project2_2/kernel/main.d b/G12_Project2_2/kernel/main.d new file mode 100644 index 0000000000..07e22ffd6b --- /dev/null +++ b/G12_Project2_2/kernel/main.d @@ -0,0 +1,2 @@ +kernel/main.o: kernel/main.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/defs.h diff --git a/G12_Project2_2/kernel/main.o b/G12_Project2_2/kernel/main.o new file mode 100644 index 0000000000..ecc50ebbb0 Binary files /dev/null and b/G12_Project2_2/kernel/main.o differ diff --git a/G12_Project2_2/kernel/memlayout.h b/G12_Project2_2/kernel/memlayout.h new file mode 100644 index 0000000000..9bc94245bd --- /dev/null +++ b/G12_Project2_2/kernel/memlayout.h @@ -0,0 +1,59 @@ +// Physical memory layout + +// qemu -machine virt is set up like this, +// based on qemu's hw/riscv/virt.c: +// +// 00001000 -- boot ROM, provided by qemu +// 02000000 -- CLINT +// 0C000000 -- PLIC +// 10000000 -- uart0 +// 10001000 -- virtio disk +// 80000000 -- qemu's boot ROM loads the kernel here, +// then jumps here. +// unused RAM after 80000000. + +// the kernel uses physical memory thus: +// 80000000 -- entry.S, then kernel text and data +// end -- start of kernel page allocation area +// PHYSTOP -- end RAM used by the kernel + +// qemu puts UART registers here in physical memory. +#define UART0 0x10000000L +#define UART0_IRQ 10 + +// virtio mmio interface +#define VIRTIO0 0x10001000 +#define VIRTIO0_IRQ 1 + +// qemu puts platform-level interrupt controller (PLIC) here. +#define PLIC 0x0c000000L +#define PLIC_PRIORITY (PLIC + 0x0) +#define PLIC_PENDING (PLIC + 0x1000) +#define PLIC_SENABLE(hart) (PLIC + 0x2080 + (hart)*0x100) +#define PLIC_SPRIORITY(hart) (PLIC + 0x201000 + (hart)*0x2000) +#define PLIC_SCLAIM(hart) (PLIC + 0x201004 + (hart)*0x2000) + +// the kernel expects there to be RAM +// for use by the kernel and user pages +// from physical address 0x80000000 to PHYSTOP. +#define KERNBASE 0x80000000L +#define PHYSTOP (KERNBASE + 128*1024*1024) + +// map the trampoline page to the highest address, +// in both user and kernel space. +#define TRAMPOLINE (MAXVA - PGSIZE) + +// map kernel stacks beneath the trampoline, +// each surrounded by invalid guard pages. +#define KSTACK(p) (TRAMPOLINE - ((p)+1)* 2*PGSIZE) + +// User memory layout. +// Address zero first: +// text +// original data and bss +// fixed-size stack +// expandable heap +// ... +// TRAPFRAME (p->trapframe, used by the trampoline) +// TRAMPOLINE (the same page as in the kernel) +#define TRAPFRAME (TRAMPOLINE - PGSIZE) diff --git a/G12_Project2_2/kernel/param.h b/G12_Project2_2/kernel/param.h new file mode 100644 index 0000000000..cd2a41c2b7 --- /dev/null +++ b/G12_Project2_2/kernel/param.h @@ -0,0 +1,15 @@ +#define NPROC 64 // maximum number of processes +#define NCPU 8 // maximum number of CPUs +#define NOFILE 16 // open files per process +#define NFILE 100 // open files per system +#define NINODE 50 // maximum number of active i-nodes +#define NDEV 10 // maximum major device number +#define ROOTDEV 1 // device number of file system root disk +#define MAXARG 32 // max exec arguments +#define MAXOPBLOCKS 10 // max # of blocks any FS op writes +#define LOGBLOCKS (MAXOPBLOCKS*3) // max data blocks in on-disk log +#define NBUF (MAXOPBLOCKS*3) // size of disk block cache +#define FSSIZE 2000 // size of file system in blocks +#define MAXPATH 128 // maximum file path name +#define USERSTACK 1 // user stack pages + diff --git a/G12_Project2_2/kernel/pipe.c b/G12_Project2_2/kernel/pipe.c new file mode 100644 index 0000000000..1804a64201 --- /dev/null +++ b/G12_Project2_2/kernel/pipe.c @@ -0,0 +1,134 @@ +#include "types.h" +#include "riscv.h" +#include "defs.h" +#include "param.h" +#include "spinlock.h" +#include "proc.h" +#include "fs.h" +#include "sleeplock.h" +#include "file.h" + +#define PIPESIZE 512 + +struct pipe { + struct spinlock lock; + char data[PIPESIZE]; + uint nread; // number of bytes read + uint nwrite; // number of bytes written + int readopen; // read fd is still open + int writeopen; // write fd is still open +}; + +int +pipealloc(struct file **f0, struct file **f1) +{ + struct pipe *pi; + + pi = 0; + *f0 = *f1 = 0; + if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0) + goto bad; + if((pi = (struct pipe*)kalloc()) == 0) + goto bad; + pi->readopen = 1; + pi->writeopen = 1; + pi->nwrite = 0; + pi->nread = 0; + initlock(&pi->lock, "pipe"); + (*f0)->type = FD_PIPE; + (*f0)->readable = 1; + (*f0)->writable = 0; + (*f0)->pipe = pi; + (*f1)->type = FD_PIPE; + (*f1)->readable = 0; + (*f1)->writable = 1; + (*f1)->pipe = pi; + return 0; + + bad: + if(pi) + kfree((char*)pi); + if(*f0) + fileclose(*f0); + if(*f1) + fileclose(*f1); + return -1; +} + +void +pipeclose(struct pipe *pi, int writable) +{ + acquire(&pi->lock); + if(writable){ + pi->writeopen = 0; + wakeup(&pi->nread); + } else { + pi->readopen = 0; + wakeup(&pi->nwrite); + } + if(pi->readopen == 0 && pi->writeopen == 0){ + release(&pi->lock); + kfree((char*)pi); + } else + release(&pi->lock); +} + +int +pipewrite(struct pipe *pi, uint64 addr, int n) +{ + int i = 0; + struct proc *pr = myproc(); + + acquire(&pi->lock); + while(i < n){ + if(pi->readopen == 0 || killed(pr)){ + release(&pi->lock); + return -1; + } + if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full + wakeup(&pi->nread); + sleep(&pi->nwrite, &pi->lock); + } else { + char ch; + if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) + break; + pi->data[pi->nwrite++ % PIPESIZE] = ch; + i++; + } + } + wakeup(&pi->nread); + release(&pi->lock); + + return i; +} + +int +piperead(struct pipe *pi, uint64 addr, int n) +{ + int i; + struct proc *pr = myproc(); + char ch; + + acquire(&pi->lock); + while(pi->nread == pi->nwrite && pi->writeopen){ //DOC: pipe-empty + if(killed(pr)){ + release(&pi->lock); + return -1; + } + sleep(&pi->nread, &pi->lock); //DOC: piperead-sleep + } + for(i = 0; i < n; i++){ //DOC: piperead-copy + if(pi->nread == pi->nwrite) + break; + ch = pi->data[pi->nread % PIPESIZE]; + if(copyout(pr->pagetable, addr + i, &ch, 1) == -1) { + if(i == 0) + i = -1; + break; + } + pi->nread++; + } + wakeup(&pi->nwrite); //DOC: piperead-wakeup + release(&pi->lock); + return i; +} diff --git a/G12_Project2_2/kernel/pipe.d b/G12_Project2_2/kernel/pipe.d new file mode 100644 index 0000000000..80adcde1d6 --- /dev/null +++ b/G12_Project2_2/kernel/pipe.d @@ -0,0 +1,3 @@ +kernel/pipe.o: kernel/pipe.c kernel/types.h kernel/riscv.h kernel/defs.h \ + kernel/param.h kernel/spinlock.h kernel/proc.h kernel/fs.h \ + kernel/sleeplock.h kernel/file.h diff --git a/G12_Project2_2/kernel/pipe.o b/G12_Project2_2/kernel/pipe.o new file mode 100644 index 0000000000..e38b0ebc95 Binary files /dev/null and b/G12_Project2_2/kernel/pipe.o differ diff --git a/G12_Project2_2/kernel/plic.c b/G12_Project2_2/kernel/plic.c new file mode 100644 index 0000000000..4175db9145 --- /dev/null +++ b/G12_Project2_2/kernel/plic.c @@ -0,0 +1,47 @@ +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "riscv.h" +#include "defs.h" + +// +// the riscv Platform Level Interrupt Controller (PLIC). +// + +void +plicinit(void) +{ + // set desired IRQ priorities non-zero (otherwise disabled). + *(uint32*)(PLIC + UART0_IRQ*4) = 1; + *(uint32*)(PLIC + VIRTIO0_IRQ*4) = 1; +} + +void +plicinithart(void) +{ + int hart = cpuid(); + + // set enable bits for this hart's S-mode + // for the uart and virtio disk. + *(uint32*)PLIC_SENABLE(hart) = (1 << UART0_IRQ) | (1 << VIRTIO0_IRQ); + + // set this hart's S-mode priority threshold to 0. + *(uint32*)PLIC_SPRIORITY(hart) = 0; +} + +// ask the PLIC what interrupt we should serve. +int +plic_claim(void) +{ + int hart = cpuid(); + int irq = *(uint32*)PLIC_SCLAIM(hart); + return irq; +} + +// tell the PLIC we've served this IRQ. +void +plic_complete(int irq) +{ + int hart = cpuid(); + *(uint32*)PLIC_SCLAIM(hart) = irq; +} diff --git a/G12_Project2_2/kernel/plic.d b/G12_Project2_2/kernel/plic.d new file mode 100644 index 0000000000..6063823174 --- /dev/null +++ b/G12_Project2_2/kernel/plic.d @@ -0,0 +1,2 @@ +kernel/plic.o: kernel/plic.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/defs.h diff --git a/G12_Project2_2/kernel/plic.o b/G12_Project2_2/kernel/plic.o new file mode 100644 index 0000000000..aa400265aa Binary files /dev/null and b/G12_Project2_2/kernel/plic.o differ diff --git a/G12_Project2_2/kernel/printf.c b/G12_Project2_2/kernel/printf.c new file mode 100644 index 0000000000..2e64905f53 --- /dev/null +++ b/G12_Project2_2/kernel/printf.c @@ -0,0 +1,151 @@ +// +// formatted console output -- printf, panic. +// + +#include + +#include "types.h" +#include "param.h" +#include "spinlock.h" +#include "sleeplock.h" +#include "fs.h" +#include "file.h" +#include "memlayout.h" +#include "riscv.h" +#include "defs.h" +#include "proc.h" + +volatile int panicking = 0; // printing a panic message +volatile int panicked = 0; // spinning forever at end of a panic + +// lock to avoid interleaving concurrent printf's. +static struct { + struct spinlock lock; +} pr; + +static char digits[] = "0123456789abcdef"; + +static void +printint(long long xx, int base, int sign) +{ + char buf[20]; + int i; + unsigned long long x; + + if(sign && (sign = (xx < 0))) + x = -xx; + else + x = xx; + + i = 0; + do { + buf[i++] = digits[x % base]; + } while((x /= base) != 0); + + if(sign) + buf[i++] = '-'; + + while(--i >= 0) + consputc(buf[i]); +} + +static void +printptr(uint64 x) +{ + int i; + consputc('0'); + consputc('x'); + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + consputc(digits[x >> (sizeof(uint64) * 8 - 4)]); +} + +// Print to the console. +int +printf(char *fmt, ...) +{ + va_list ap; + int i, cx, c0, c1, c2; + char *s; + + if(panicking == 0) + acquire(&pr.lock); + + va_start(ap, fmt); + for(i = 0; (cx = fmt[i] & 0xff) != 0; i++){ + if(cx != '%'){ + consputc(cx); + continue; + } + i++; + c0 = fmt[i+0] & 0xff; + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + printint(va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + printint(va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + printint(va_arg(ap, uint32), 10, 0); + } else if(c0 == 'l' && c1 == 'u'){ + printint(va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + printint(va_arg(ap, uint32), 16, 0); + } else if(c0 == 'l' && c1 == 'x'){ + printint(va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + printptr(va_arg(ap, uint64)); + } else if(c0 == 'c'){ + consputc(va_arg(ap, uint)); + } else if(c0 == 's'){ + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + consputc(*s); + } else if(c0 == '%'){ + consputc('%'); + } else if(c0 == 0){ + break; + } else { + // Print unknown % sequence to draw attention. + consputc('%'); + consputc(c0); + } + + } + va_end(ap); + + if(panicking == 0) + release(&pr.lock); + + return 0; +} + +void +panic(char *s) +{ + panicking = 1; + printf("panic: "); + printf("%s\n", s); + panicked = 1; // freeze uart output from other CPUs + for(;;) + ; +} + +void +printfinit(void) +{ + initlock(&pr.lock, "pr"); +} diff --git a/G12_Project2_2/kernel/printf.d b/G12_Project2_2/kernel/printf.d new file mode 100644 index 0000000000..4463314fce --- /dev/null +++ b/G12_Project2_2/kernel/printf.d @@ -0,0 +1,5 @@ +kernel/printf.o: kernel/printf.c \ + /usr/lib/gcc-cross/riscv64-linux-gnu/13/include/stdarg.h kernel/types.h \ + kernel/param.h kernel/spinlock.h kernel/sleeplock.h kernel/fs.h \ + kernel/file.h kernel/memlayout.h kernel/riscv.h kernel/defs.h \ + kernel/proc.h diff --git a/G12_Project2_2/kernel/printf.o b/G12_Project2_2/kernel/printf.o new file mode 100644 index 0000000000..e2245c7154 Binary files /dev/null and b/G12_Project2_2/kernel/printf.o differ diff --git a/G12_Project2_2/kernel/proc.c b/G12_Project2_2/kernel/proc.c new file mode 100644 index 0000000000..22a5401903 --- /dev/null +++ b/G12_Project2_2/kernel/proc.c @@ -0,0 +1,690 @@ +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "riscv.h" +#include "spinlock.h" +#include "proc.h" +#include "defs.h" + +struct cpu cpus[NCPU]; + +struct proc proc[NPROC]; + +struct proc *initproc; + +int nextpid = 1; +struct spinlock pid_lock; + +extern void forkret(void); +static void freeproc(struct proc *p); + +extern char trampoline[]; // trampoline.S + +// helps ensure that wakeups of wait()ing +// parents are not lost. helps obey the +// memory model when using p->parent. +// must be acquired before any p->lock. +struct spinlock wait_lock; + +// Allocate a page for each process's kernel stack. +// Map it high in memory, followed by an invalid +// guard page. +void +proc_mapstacks(pagetable_t kpgtbl) +{ + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + char *pa = kalloc(); + if(pa == 0) + panic("kalloc"); + uint64 va = KSTACK((int) (p - proc)); + kvmmap(kpgtbl, va, (uint64)pa, PGSIZE, PTE_R | PTE_W); + } +} + +// initialize the proc table. +void +procinit(void) +{ + struct proc *p; + + initlock(&pid_lock, "nextpid"); + initlock(&wait_lock, "wait_lock"); + for(p = proc; p < &proc[NPROC]; p++) { + initlock(&p->lock, "proc"); + p->state = UNUSED; + p->kstack = KSTACK((int) (p - proc)); + } +} + +// Must be called with interrupts disabled, +// to prevent race with process being moved +// to a different CPU. +int +cpuid() +{ + int id = r_tp(); + return id; +} + +// Return this CPU's cpu struct. +// Interrupts must be disabled. +struct cpu* +mycpu(void) +{ + int id = cpuid(); + struct cpu *c = &cpus[id]; + return c; +} + +// Return the current struct proc *, or zero if none. +struct proc* +myproc(void) +{ + push_off(); + struct cpu *c = mycpu(); + struct proc *p = c->proc; + pop_off(); + return p; +} + +int +allocpid() +{ + int pid; + + acquire(&pid_lock); + pid = nextpid; + nextpid = nextpid + 1; + release(&pid_lock); + + return pid; +} + +// Look in the process table for an UNUSED proc. +// If found, initialize state required to run in the kernel, +// and return with p->lock held. +// If there are no free procs, or a memory allocation fails, return 0. +static struct proc* +allocproc(void) +{ + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + acquire(&p->lock); + if(p->state == UNUSED) { + goto found; + } else { + release(&p->lock); + } + } + return 0; + +found: + p->pid = allocpid(); + p->state = USED; + + // Allocate a trapframe page. + if((p->trapframe = (struct trapframe *)kalloc()) == 0){ + freeproc(p); + release(&p->lock); + return 0; + } + + // An empty user page table. + p->pagetable = proc_pagetable(p); + if(p->pagetable == 0){ + freeproc(p); + release(&p->lock); + return 0; + } + + // Set up new context to start executing at forkret, + // which returns to user space. + memset(&p->context, 0, sizeof(p->context)); + p->context.ra = (uint64)forkret; + p->context.sp = p->kstack + PGSIZE; + + return p; +} + +// free a proc structure and the data hanging from it, +// including user pages. +// p->lock must be held. +static void +freeproc(struct proc *p) +{ + if(p->trapframe) + kfree((void*)p->trapframe); + p->trapframe = 0; + if(p->pagetable) + proc_freepagetable(p->pagetable, p->sz); + p->pagetable = 0; + p->sz = 0; + p->pid = 0; + p->parent = 0; + p->name[0] = 0; + p->chan = 0; + p->killed = 0; + p->xstate = 0; + p->state = UNUSED; +} + +// Create a user page table for a given process, with no user memory, +// but with trampoline and trapframe pages. +pagetable_t +proc_pagetable(struct proc *p) +{ + pagetable_t pagetable; + + // An empty page table. + pagetable = uvmcreate(); + if(pagetable == 0) + return 0; + + // map the trampoline code (for system call return) + // at the highest user virtual address. + // only the supervisor uses it, on the way + // to/from user space, so not PTE_U. + if(mappages(pagetable, TRAMPOLINE, PGSIZE, + (uint64)trampoline, PTE_R | PTE_X) < 0){ + uvmfree(pagetable, 0); + return 0; + } + + // map the trapframe page just below the trampoline page, for + // trampoline.S. + if(mappages(pagetable, TRAPFRAME, PGSIZE, + (uint64)(p->trapframe), PTE_R | PTE_W) < 0){ + uvmunmap(pagetable, TRAMPOLINE, 1, 0); + uvmfree(pagetable, 0); + return 0; + } + + return pagetable; +} + +// Free a process's page table, and free the +// physical memory it refers to. +void +proc_freepagetable(pagetable_t pagetable, uint64 sz) +{ + uvmunmap(pagetable, TRAMPOLINE, 1, 0); + uvmunmap(pagetable, TRAPFRAME, 1, 0); + uvmfree(pagetable, sz); +} + +// Set up first user process. +void +userinit(void) +{ + struct proc *p; + + p = allocproc(); + initproc = p; + + p->cwd = namei("/"); + + p->state = RUNNABLE; + + release(&p->lock); +} + +// Grow or shrink user memory by n bytes. +// Return 0 on success, -1 on failure. +int +growproc(int n) +{ + uint64 sz; + struct proc *p = myproc(); + + sz = p->sz; + if(n > 0){ + if(sz + n > TRAPFRAME) { + return -1; + } + if((sz = uvmalloc(p->pagetable, sz, sz + n, PTE_W)) == 0) { + return -1; + } + } else if(n < 0){ + sz = uvmdealloc(p->pagetable, sz, sz + n); + } + p->sz = sz; + return 0; +} + +// Create a new process, copying the parent. +// Sets up child kernel stack to return as if from fork() system call. +int +kfork(void) +{ + int i, pid; + struct proc *np; + struct proc *p = myproc(); + + // Allocate process. + if((np = allocproc()) == 0){ + return -1; + } + + // Copy user memory from parent to child. + if(uvmcopy(p->pagetable, np->pagetable, p->sz) < 0){ + freeproc(np); + release(&np->lock); + return -1; + } + np->sz = p->sz; + + // copy saved user registers. + *(np->trapframe) = *(p->trapframe); + + // Cause fork to return 0 in the child. + np->trapframe->a0 = 0; + + // increment reference counts on open file descriptors. + for(i = 0; i < NOFILE; i++) + if(p->ofile[i]) + np->ofile[i] = filedup(p->ofile[i]); + np->cwd = idup(p->cwd); + + safestrcpy(np->name, p->name, sizeof(p->name)); + + pid = np->pid; + + release(&np->lock); + + acquire(&wait_lock); + np->parent = p; + release(&wait_lock); + + acquire(&np->lock); + np->state = RUNNABLE; + release(&np->lock); + + return pid; +} + +// Pass p's abandoned children to init. +// Caller must hold wait_lock. +void +reparent(struct proc *p) +{ + struct proc *pp; + + for(pp = proc; pp < &proc[NPROC]; pp++){ + if(pp->parent == p){ + pp->parent = initproc; + wakeup(initproc); + } + } +} + +// Exit the current process. Does not return. +// An exited process remains in the zombie state +// until its parent calls wait(). +void +kexit(int status) +{ + struct proc *p = myproc(); + + if(p == initproc) + panic("init exiting"); + + // Close all open files. + for(int fd = 0; fd < NOFILE; fd++){ + if(p->ofile[fd]){ + struct file *f = p->ofile[fd]; + fileclose(f); + p->ofile[fd] = 0; + } + } + + begin_op(); + iput(p->cwd); + end_op(); + p->cwd = 0; + + acquire(&wait_lock); + + // Give any children to init. + reparent(p); + + // Parent might be sleeping in wait(). + wakeup(p->parent); + + acquire(&p->lock); + + p->xstate = status; + p->state = ZOMBIE; + + release(&wait_lock); + + // Jump into the scheduler, never to return. + sched(); + panic("zombie exit"); +} + +// Wait for a child process to exit and return its pid. +// Return -1 if this process has no children. +int +kwait(uint64 addr) +{ + struct proc *pp; + int havekids, pid; + struct proc *p = myproc(); + + acquire(&wait_lock); + + for(;;){ + // Scan through table looking for exited children. + havekids = 0; + for(pp = proc; pp < &proc[NPROC]; pp++){ + if(pp->parent == p){ + // make sure the child isn't still in exit() or swtch(). + acquire(&pp->lock); + + havekids = 1; + if(pp->state == ZOMBIE){ + // Found one. + pid = pp->pid; + if(addr != 0 && copyout(p->pagetable, addr, (char *)&pp->xstate, + sizeof(pp->xstate)) < 0) { + release(&pp->lock); + release(&wait_lock); + return -1; + } + freeproc(pp); + release(&pp->lock); + release(&wait_lock); + return pid; + } + release(&pp->lock); + } + } + + // No point waiting if we don't have any children. + if(!havekids || killed(p)){ + release(&wait_lock); + return -1; + } + + // Wait for a child to exit. + sleep(p, &wait_lock); //DOC: wait-sleep + } +} + +// Per-CPU process scheduler. +// Each CPU calls scheduler() after setting itself up. +// Scheduler never returns. It loops, doing: +// - choose a process to run. +// - swtch to start running that process. +// - eventually that process transfers control +// via swtch back to the scheduler. +void +scheduler(void) +{ + struct proc *p; + struct cpu *c = mycpu(); + + c->proc = 0; + for(;;){ + // The most recent process to run may have had interrupts + // turned off; enable them to avoid a deadlock if all + // processes are waiting. Then turn them back off + // to avoid a possible race between an interrupt + // and wfi. + intr_on(); + intr_off(); + + int found = 0; + for(p = proc; p < &proc[NPROC]; p++) { + acquire(&p->lock); + if(p->state == RUNNABLE) { + // Switch to chosen process. It is the process's job + // to release its lock and then reacquire it + // before jumping back to us. + p->state = RUNNING; + c->proc = p; + swtch(&c->context, &p->context); + + // Process is done running for now. + // It should have changed its p->state before coming back. + c->proc = 0; + found = 1; + } + release(&p->lock); + } + if(found == 0) { + // nothing to run; stop running on this core until an interrupt. + asm volatile("wfi"); + } + } +} + +// Switch to scheduler. Must hold only p->lock +// and have changed proc->state. Saves and restores +// intena because intena is a property of this +// kernel thread, not this CPU. It should +// be proc->intena and proc->noff, but that would +// break in the few places where a lock is held but +// there's no process. +void +sched(void) +{ + int intena; + struct proc *p = myproc(); + + if(!holding(&p->lock)) + panic("sched p->lock"); + if(mycpu()->noff != 1) + panic("sched locks"); + if(p->state == RUNNING) + panic("sched RUNNING"); + if(intr_get()) + panic("sched interruptible"); + + intena = mycpu()->intena; + swtch(&p->context, &mycpu()->context); + mycpu()->intena = intena; +} + +// Give up the CPU for one scheduling round. +void +yield(void) +{ + struct proc *p = myproc(); + acquire(&p->lock); + p->state = RUNNABLE; + sched(); + release(&p->lock); +} + +// A fork child's very first scheduling by scheduler() +// will swtch to forkret. +void +forkret(void) +{ + extern char userret[]; + static int first = 1; + struct proc *p = myproc(); + + // Still holding p->lock from scheduler. + release(&p->lock); + + if (first) { + // File system initialization must be run in the context of a + // regular process (e.g., because it calls sleep), and thus cannot + // be run from main(). + fsinit(ROOTDEV); + + first = 0; + // ensure other cores see first=0. + __sync_synchronize(); + + // We can invoke kexec() now that file system is initialized. + // Put the return value (argc) of kexec into a0. + p->trapframe->a0 = kexec("/init", (char *[]){ "/init", 0 }); + if (p->trapframe->a0 == -1) { + panic("exec"); + } + } + + // return to user space, mimicing usertrap()'s return. + prepare_return(); + uint64 satp = MAKE_SATP(p->pagetable); + uint64 trampoline_userret = TRAMPOLINE + (userret - trampoline); + ((void (*)(uint64))trampoline_userret)(satp); +} + +// Sleep on channel chan, releasing condition lock lk. +// Re-acquires lk when awakened. +void +sleep(void *chan, struct spinlock *lk) +{ + struct proc *p = myproc(); + + // Must acquire p->lock in order to + // change p->state and then call sched. + // Once we hold p->lock, we can be + // guaranteed that we won't miss any wakeup + // (wakeup locks p->lock), + // so it's okay to release lk. + + acquire(&p->lock); //DOC: sleeplock1 + release(lk); + + // Go to sleep. + p->chan = chan; + p->state = SLEEPING; + + sched(); + + // Tidy up. + p->chan = 0; + + // Reacquire original lock. + release(&p->lock); + acquire(lk); +} + +// Wake up all processes sleeping on channel chan. +// Caller should hold the condition lock. +void +wakeup(void *chan) +{ + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + if(p != myproc()){ + acquire(&p->lock); + if(p->state == SLEEPING && p->chan == chan) { + p->state = RUNNABLE; + } + release(&p->lock); + } + } +} + +// 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 +kkill(int pid) +{ + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++){ + acquire(&p->lock); + if(p->pid == pid){ + p->killed = 1; + if(p->state == SLEEPING){ + // Wake process from sleep(). + p->state = RUNNABLE; + } + release(&p->lock); + return 0; + } + release(&p->lock); + } + return -1; +} + +void +setkilled(struct proc *p) +{ + acquire(&p->lock); + p->killed = 1; + release(&p->lock); +} + +int +killed(struct proc *p) +{ + int k; + + acquire(&p->lock); + k = p->killed; + release(&p->lock); + return k; +} + +// 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) +{ + struct proc *p = myproc(); + if(user_dst){ + return copyout(p->pagetable, dst, src, len); + } else { + memmove((char *)dst, src, len); + return 0; + } +} + +// 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) +{ + struct proc *p = myproc(); + if(user_src){ + return copyin(p->pagetable, dst, src, len); + } else { + memmove(dst, (char*)src, len); + return 0; + } +} + +// 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) +{ + static char *states[] = { + [UNUSED] "unused", + [USED] "used", + [SLEEPING] "sleep ", + [RUNNABLE] "runble", + [RUNNING] "run ", + [ZOMBIE] "zombie" + }; + struct proc *p; + char *state; + + printf("\n"); + for(p = proc; p < &proc[NPROC]; p++){ + if(p->state == UNUSED) + continue; + if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) + state = states[p->state]; + else + state = "???"; + printf("%d %s %s", p->pid, state, p->name); + printf("\n"); + } +} diff --git a/G12_Project2_2/kernel/proc.d b/G12_Project2_2/kernel/proc.d new file mode 100644 index 0000000000..ee2200efcf --- /dev/null +++ b/G12_Project2_2/kernel/proc.d @@ -0,0 +1,3 @@ +kernel/proc.o: kernel/proc.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/defs.h diff --git a/G12_Project2_2/kernel/proc.h b/G12_Project2_2/kernel/proc.h new file mode 100644 index 0000000000..d021857a34 --- /dev/null +++ b/G12_Project2_2/kernel/proc.h @@ -0,0 +1,107 @@ +// Saved registers for kernel context switches. +struct context { + uint64 ra; + uint64 sp; + + // callee-saved + uint64 s0; + uint64 s1; + uint64 s2; + uint64 s3; + uint64 s4; + uint64 s5; + uint64 s6; + uint64 s7; + uint64 s8; + uint64 s9; + uint64 s10; + uint64 s11; +}; + +// Per-CPU state. +struct cpu { + struct proc *proc; // The process running on this cpu, or null. + struct context context; // swtch() here to enter scheduler(). + int noff; // Depth of push_off() nesting. + int intena; // Were interrupts enabled before push_off()? +}; + +extern struct cpu cpus[NCPU]; + +// per-process data for the trap handling code in trampoline.S. +// sits in a page by itself just under the trampoline page in the +// user page table. not specially mapped in the kernel page table. +// uservec in trampoline.S saves user registers in the trapframe, +// then initializes registers from the trapframe's +// kernel_sp, kernel_hartid, kernel_satp, and jumps to kernel_trap. +// usertrapret() and userret in trampoline.S set up +// the trapframe's kernel_*, restore user registers from the +// trapframe, switch to the user page table, and enter user space. +// the trapframe includes callee-saved user registers like s0-s11 because the +// return-to-user path via usertrapret() doesn't return through +// the entire kernel call stack. +struct trapframe { + /* 0 */ uint64 kernel_satp; // kernel page table + /* 8 */ uint64 kernel_sp; // top of process's kernel stack + /* 16 */ uint64 kernel_trap; // usertrap() + /* 24 */ uint64 epc; // saved user program counter + /* 32 */ uint64 kernel_hartid; // saved kernel tp + /* 40 */ uint64 ra; + /* 48 */ uint64 sp; + /* 56 */ uint64 gp; + /* 64 */ uint64 tp; + /* 72 */ uint64 t0; + /* 80 */ uint64 t1; + /* 88 */ uint64 t2; + /* 96 */ uint64 s0; + /* 104 */ uint64 s1; + /* 112 */ uint64 a0; + /* 120 */ uint64 a1; + /* 128 */ uint64 a2; + /* 136 */ uint64 a3; + /* 144 */ uint64 a4; + /* 152 */ uint64 a5; + /* 160 */ uint64 a6; + /* 168 */ uint64 a7; + /* 176 */ uint64 s2; + /* 184 */ uint64 s3; + /* 192 */ uint64 s4; + /* 200 */ uint64 s5; + /* 208 */ uint64 s6; + /* 216 */ uint64 s7; + /* 224 */ uint64 s8; + /* 232 */ uint64 s9; + /* 240 */ uint64 s10; + /* 248 */ uint64 s11; + /* 256 */ uint64 t3; + /* 264 */ uint64 t4; + /* 272 */ uint64 t5; + /* 280 */ uint64 t6; +}; + +enum procstate { UNUSED, USED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE }; + +// Per-process state +struct proc { + struct spinlock lock; + + // p->lock must be held when using these: + enum procstate state; // Process state + void *chan; // If non-zero, sleeping on chan + int killed; // If non-zero, have been killed + int xstate; // Exit status to be returned to parent's wait + int pid; // Process ID + + // wait_lock must be held when using this: + struct proc *parent; // Parent process + + // these are private to the process, so p->lock need not be held. + uint64 kstack; // Virtual address of kernel stack + uint64 sz; // Size of process memory (bytes) + pagetable_t pagetable; // User page table + struct trapframe *trapframe; // data page for trampoline.S + struct context context; // swtch() here to run process + struct file *ofile[NOFILE]; // Open files + struct inode *cwd; // Current directory + char name[16]; // Process name (debugging) +}; diff --git a/G12_Project2_2/kernel/proc.o b/G12_Project2_2/kernel/proc.o new file mode 100644 index 0000000000..6b448139c7 Binary files /dev/null and b/G12_Project2_2/kernel/proc.o differ diff --git a/G12_Project2_2/kernel/riscv.h b/G12_Project2_2/kernel/riscv.h new file mode 100644 index 0000000000..ef3372c320 --- /dev/null +++ b/G12_Project2_2/kernel/riscv.h @@ -0,0 +1,380 @@ +#ifndef __ASSEMBLER__ + +// which hart (core) is this? +static inline uint64 +r_mhartid() +{ + uint64 x; + asm volatile("csrr %0, mhartid" : "=r" (x) ); + return x; +} + +// Machine Status Register, mstatus + +#define MSTATUS_MPP_MASK (3L << 11) // previous mode. +#define MSTATUS_MPP_M (3L << 11) +#define MSTATUS_MPP_S (1L << 11) +#define MSTATUS_MPP_U (0L << 11) + +static inline uint64 +r_mstatus() +{ + uint64 x; + asm volatile("csrr %0, mstatus" : "=r" (x) ); + return x; +} + +static inline void +w_mstatus(uint64 x) +{ + asm volatile("csrw mstatus, %0" : : "r" (x)); +} + +// machine exception program counter, holds the +// instruction address to which a return from +// exception will go. +static inline void +w_mepc(uint64 x) +{ + asm volatile("csrw mepc, %0" : : "r" (x)); +} + +// Supervisor Status Register, sstatus + +#define SSTATUS_SPP (1L << 8) // Previous mode, 1=Supervisor, 0=User +#define SSTATUS_SPIE (1L << 5) // Supervisor Previous Interrupt Enable +#define SSTATUS_UPIE (1L << 4) // User Previous Interrupt Enable +#define SSTATUS_SIE (1L << 1) // Supervisor Interrupt Enable +#define SSTATUS_UIE (1L << 0) // User Interrupt Enable + +static inline uint64 +r_sstatus() +{ + uint64 x; + asm volatile("csrr %0, sstatus" : "=r" (x) ); + return x; +} + +static inline void +w_sstatus(uint64 x) +{ + asm volatile("csrw sstatus, %0" : : "r" (x)); +} + +// Supervisor Interrupt Pending +static inline uint64 +r_sip() +{ + uint64 x; + asm volatile("csrr %0, sip" : "=r" (x) ); + return x; +} + +static inline void +w_sip(uint64 x) +{ + asm volatile("csrw sip, %0" : : "r" (x)); +} + +// Supervisor Interrupt Enable +#define SIE_SEIE (1L << 9) // external +#define SIE_STIE (1L << 5) // timer +static inline uint64 +r_sie() +{ + uint64 x; + asm volatile("csrr %0, sie" : "=r" (x) ); + return x; +} + +static inline void +w_sie(uint64 x) +{ + asm volatile("csrw sie, %0" : : "r" (x)); +} + +// Machine-mode Interrupt Enable +#define MIE_STIE (1L << 5) // supervisor timer +static inline uint64 +r_mie() +{ + uint64 x; + asm volatile("csrr %0, mie" : "=r" (x) ); + return x; +} + +static inline void +w_mie(uint64 x) +{ + asm volatile("csrw mie, %0" : : "r" (x)); +} + +// supervisor exception program counter, holds the +// instruction address to which a return from +// exception will go. +static inline void +w_sepc(uint64 x) +{ + asm volatile("csrw sepc, %0" : : "r" (x)); +} + +static inline uint64 +r_sepc() +{ + uint64 x; + asm volatile("csrr %0, sepc" : "=r" (x) ); + return x; +} + +// Machine Exception Delegation +static inline uint64 +r_medeleg() +{ + uint64 x; + asm volatile("csrr %0, medeleg" : "=r" (x) ); + return x; +} + +static inline void +w_medeleg(uint64 x) +{ + asm volatile("csrw medeleg, %0" : : "r" (x)); +} + +// Machine Interrupt Delegation +static inline uint64 +r_mideleg() +{ + uint64 x; + asm volatile("csrr %0, mideleg" : "=r" (x) ); + return x; +} + +static inline void +w_mideleg(uint64 x) +{ + asm volatile("csrw mideleg, %0" : : "r" (x)); +} + +// Supervisor Trap-Vector Base Address +// low two bits are mode. +static inline void +w_stvec(uint64 x) +{ + asm volatile("csrw stvec, %0" : : "r" (x)); +} + +static inline uint64 +r_stvec() +{ + uint64 x; + asm volatile("csrr %0, stvec" : "=r" (x) ); + return x; +} + +// Supervisor Timer Comparison Register +static inline uint64 +r_stimecmp() +{ + uint64 x; + // asm volatile("csrr %0, stimecmp" : "=r" (x) ); + asm volatile("csrr %0, 0x14d" : "=r" (x) ); + return x; +} + +static inline void +w_stimecmp(uint64 x) +{ + // asm volatile("csrw stimecmp, %0" : : "r" (x)); + asm volatile("csrw 0x14d, %0" : : "r" (x)); +} + +// Machine Environment Configuration Register +static inline uint64 +r_menvcfg() +{ + uint64 x; + // asm volatile("csrr %0, menvcfg" : "=r" (x) ); + asm volatile("csrr %0, 0x30a" : "=r" (x) ); + return x; +} + +static inline void +w_menvcfg(uint64 x) +{ + // asm volatile("csrw menvcfg, %0" : : "r" (x)); + asm volatile("csrw 0x30a, %0" : : "r" (x)); +} + +// Physical Memory Protection +static inline void +w_pmpcfg0(uint64 x) +{ + asm volatile("csrw pmpcfg0, %0" : : "r" (x)); +} + +static inline void +w_pmpaddr0(uint64 x) +{ + asm volatile("csrw pmpaddr0, %0" : : "r" (x)); +} + +// use riscv's sv39 page table scheme. +#define SATP_SV39 (8L << 60) + +#define MAKE_SATP(pagetable) (SATP_SV39 | (((uint64)pagetable) >> 12)) + +// supervisor address translation and protection; +// holds the address of the page table. +static inline void +w_satp(uint64 x) +{ + asm volatile("csrw satp, %0" : : "r" (x)); +} + +static inline uint64 +r_satp() +{ + uint64 x; + asm volatile("csrr %0, satp" : "=r" (x) ); + return x; +} + +// Supervisor Trap Cause +static inline uint64 +r_scause() +{ + uint64 x; + asm volatile("csrr %0, scause" : "=r" (x) ); + return x; +} + +// Supervisor Trap Value +static inline uint64 +r_stval() +{ + uint64 x; + asm volatile("csrr %0, stval" : "=r" (x) ); + return x; +} + +// Machine-mode Counter-Enable +static inline void +w_mcounteren(uint64 x) +{ + asm volatile("csrw mcounteren, %0" : : "r" (x)); +} + +static inline uint64 +r_mcounteren() +{ + uint64 x; + asm volatile("csrr %0, mcounteren" : "=r" (x) ); + return x; +} + +// machine-mode cycle counter +static inline uint64 +r_time() +{ + uint64 x; + asm volatile("csrr %0, time" : "=r" (x) ); + return x; +} + +// enable device interrupts +static inline void +intr_on() +{ + w_sstatus(r_sstatus() | SSTATUS_SIE); +} + +// disable device interrupts +static inline void +intr_off() +{ + w_sstatus(r_sstatus() & ~SSTATUS_SIE); +} + +// are device interrupts enabled? +static inline int +intr_get() +{ + uint64 x = r_sstatus(); + return (x & SSTATUS_SIE) != 0; +} + +static inline uint64 +r_sp() +{ + uint64 x; + asm volatile("mv %0, sp" : "=r" (x) ); + return x; +} + +// read and write tp, the thread pointer, which xv6 uses to hold +// this core's hartid (core number), the index into cpus[]. +static inline uint64 +r_tp() +{ + uint64 x; + asm volatile("mv %0, tp" : "=r" (x) ); + return x; +} + +static inline void +w_tp(uint64 x) +{ + asm volatile("mv tp, %0" : : "r" (x)); +} + +static inline uint64 +r_ra() +{ + uint64 x; + asm volatile("mv %0, ra" : "=r" (x) ); + return x; +} + +// flush the TLB. +static inline void +sfence_vma() +{ + // the zero, zero means flush all TLB entries. + asm volatile("sfence.vma zero, zero"); +} + +typedef uint64 pte_t; +typedef uint64 *pagetable_t; // 512 PTEs + +#endif // __ASSEMBLER__ + +#define PGSIZE 4096 // bytes per page +#define PGSHIFT 12 // bits of offset within a page + +#define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1)) +#define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1)) + +#define PTE_V (1L << 0) // valid +#define PTE_R (1L << 1) +#define PTE_W (1L << 2) +#define PTE_X (1L << 3) +#define PTE_U (1L << 4) // user can access + +// shift a physical address to the right place for a PTE. +#define PA2PTE(pa) ((((uint64)pa) >> 12) << 10) + +#define PTE2PA(pte) (((pte) >> 10) << 12) + +#define PTE_FLAGS(pte) ((pte) & 0x3FF) + +// extract the three 9-bit page table indices from a virtual address. +#define PXMASK 0x1FF // 9 bits +#define PXSHIFT(level) (PGSHIFT+(9*(level))) +#define PX(level, va) ((((uint64) (va)) >> PXSHIFT(level)) & PXMASK) + +// one beyond the highest possible virtual address. +// MAXVA is actually one bit less than the max allowed by +// Sv39, to avoid having to sign-extend virtual addresses +// that have the high bit set. +#define MAXVA (1L << (9 + 9 + 9 + 12 - 1)) diff --git a/G12_Project2_2/kernel/sleeplock.c b/G12_Project2_2/kernel/sleeplock.c new file mode 100644 index 0000000000..81de58572b --- /dev/null +++ b/G12_Project2_2/kernel/sleeplock.c @@ -0,0 +1,55 @@ +// Sleeping locks + +#include "types.h" +#include "riscv.h" +#include "defs.h" +#include "param.h" +#include "memlayout.h" +#include "spinlock.h" +#include "proc.h" +#include "sleeplock.h" + +void +initsleeplock(struct sleeplock *lk, char *name) +{ + initlock(&lk->lk, "sleep lock"); + lk->name = name; + lk->locked = 0; + lk->pid = 0; +} + +void +acquiresleep(struct sleeplock *lk) +{ + acquire(&lk->lk); + while (lk->locked) { + sleep(lk, &lk->lk); + } + lk->locked = 1; + lk->pid = myproc()->pid; + release(&lk->lk); +} + +void +releasesleep(struct sleeplock *lk) +{ + acquire(&lk->lk); + lk->locked = 0; + lk->pid = 0; + wakeup(lk); + release(&lk->lk); +} + +int +holdingsleep(struct sleeplock *lk) +{ + int r; + + acquire(&lk->lk); + r = lk->locked && (lk->pid == myproc()->pid); + release(&lk->lk); + return r; +} + + + diff --git a/G12_Project2_2/kernel/sleeplock.d b/G12_Project2_2/kernel/sleeplock.d new file mode 100644 index 0000000000..437cb5df5c --- /dev/null +++ b/G12_Project2_2/kernel/sleeplock.d @@ -0,0 +1,3 @@ +kernel/sleeplock.o: kernel/sleeplock.c kernel/types.h kernel/riscv.h \ + kernel/defs.h kernel/param.h kernel/memlayout.h kernel/spinlock.h \ + kernel/proc.h kernel/sleeplock.h diff --git a/G12_Project2_2/kernel/sleeplock.h b/G12_Project2_2/kernel/sleeplock.h new file mode 100644 index 0000000000..110e6f3d7f --- /dev/null +++ b/G12_Project2_2/kernel/sleeplock.h @@ -0,0 +1,10 @@ +// Long-term locks for processes +struct sleeplock { + uint locked; // Is the lock held? + struct spinlock lk; // spinlock protecting this sleep lock + + // For debugging: + char *name; // Name of lock. + int pid; // Process holding lock +}; + diff --git a/G12_Project2_2/kernel/sleeplock.o b/G12_Project2_2/kernel/sleeplock.o new file mode 100644 index 0000000000..41e8d0b2d1 Binary files /dev/null and b/G12_Project2_2/kernel/sleeplock.o differ diff --git a/G12_Project2_2/kernel/spinlock.c b/G12_Project2_2/kernel/spinlock.c new file mode 100644 index 0000000000..654037691f --- /dev/null +++ b/G12_Project2_2/kernel/spinlock.c @@ -0,0 +1,113 @@ +// Mutual exclusion spin locks. + +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "spinlock.h" +#include "riscv.h" +#include "proc.h" +#include "defs.h" + +void +initlock(struct spinlock *lk, char *name) +{ + lk->name = name; + lk->locked = 0; + lk->cpu = 0; +} + +// Acquire the lock. +// Loops (spins) until the lock is acquired. +void +acquire(struct spinlock *lk) +{ + push_off(); // disable interrupts to avoid deadlock. + if(holding(lk)) + panic("acquire"); + + // On RISC-V, sync_lock_test_and_set turns into an atomic swap: + // a5 = 1 + // s1 = &lk->locked + // amoswap.w.aq a5, a5, (s1) + while(__sync_lock_test_and_set(&lk->locked, 1) != 0) + ; + + // Tell the C compiler and the processor to not move loads or stores + // past this point, to ensure that the critical section's memory + // references happen strictly after the lock is acquired. + // On RISC-V, this emits a fence instruction. + __sync_synchronize(); + + // Record info about lock acquisition for holding() and debugging. + lk->cpu = mycpu(); +} + +// Release the lock. +void +release(struct spinlock *lk) +{ + if(!holding(lk)) + panic("release"); + + lk->cpu = 0; + + // Tell the C compiler and the CPU to not move loads or stores + // past this point, to ensure that all the stores in the critical + // section are visible to other CPUs before the lock is released, + // and that loads in the critical section occur strictly before + // the lock is released. + // On RISC-V, this emits a fence instruction. + __sync_synchronize(); + + // Release the lock, equivalent to lk->locked = 0. + // This code doesn't use a C assignment, since the C standard + // implies that an assignment might be implemented with + // multiple store instructions. + // On RISC-V, sync_lock_release turns into an atomic swap: + // s1 = &lk->locked + // amoswap.w zero, zero, (s1) + __sync_lock_release(&lk->locked); + + pop_off(); +} + +// Check whether this cpu is holding the lock. +// Interrupts must be off. +int +holding(struct spinlock *lk) +{ + int r; + r = (lk->locked && lk->cpu == mycpu()); + return r; +} + +// push_off/pop_off are like intr_off()/intr_on() except that they are matched: +// 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) +{ + int old = intr_get(); + + // disable interrupts to prevent an involuntary context + // switch while using mycpu(). + intr_off(); + + if(mycpu()->noff == 0) + mycpu()->intena = old; + mycpu()->noff += 1; +} + +void +pop_off(void) +{ + struct cpu *c = mycpu(); + if(intr_get()) + panic("pop_off - interruptible"); + if(c->noff < 1) + panic("pop_off"); + c->noff -= 1; + if(c->noff == 0 && c->intena) + intr_on(); +} diff --git a/G12_Project2_2/kernel/spinlock.d b/G12_Project2_2/kernel/spinlock.d new file mode 100644 index 0000000000..65193d6bc6 --- /dev/null +++ b/G12_Project2_2/kernel/spinlock.d @@ -0,0 +1,3 @@ +kernel/spinlock.o: kernel/spinlock.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/spinlock.h kernel/riscv.h kernel/proc.h \ + kernel/defs.h diff --git a/G12_Project2_2/kernel/spinlock.h b/G12_Project2_2/kernel/spinlock.h new file mode 100644 index 0000000000..4392820d02 --- /dev/null +++ b/G12_Project2_2/kernel/spinlock.h @@ -0,0 +1,9 @@ +// Mutual exclusion lock. +struct spinlock { + uint locked; // Is the lock held? + + // For debugging: + char *name; // Name of lock. + struct cpu *cpu; // The cpu holding the lock. +}; + diff --git a/G12_Project2_2/kernel/spinlock.o b/G12_Project2_2/kernel/spinlock.o new file mode 100644 index 0000000000..88f7a3295c Binary files /dev/null and b/G12_Project2_2/kernel/spinlock.o differ diff --git a/G12_Project2_2/kernel/start.c b/G12_Project2_2/kernel/start.c new file mode 100644 index 0000000000..b9391d6a8a --- /dev/null +++ b/G12_Project2_2/kernel/start.c @@ -0,0 +1,66 @@ +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "riscv.h" +#include "defs.h" + +void main(); +void timerinit(); + +// entry.S needs one stack per CPU. +__attribute__ ((aligned (16))) char stack0[4096 * NCPU]; + +// entry.S jumps here in machine mode on stack0. +void +start() +{ + // set M Previous Privilege mode to Supervisor, for mret. + unsigned long x = r_mstatus(); + x &= ~MSTATUS_MPP_MASK; + x |= MSTATUS_MPP_S; + w_mstatus(x); + + // set M Exception Program Counter to main, for mret. + // requires gcc -mcmodel=medany + w_mepc((uint64)main); + + // disable paging for now. + w_satp(0); + + // delegate all interrupts and exceptions to supervisor mode. + w_medeleg(0xffff); + w_mideleg(0xffff); + w_sie(r_sie() | SIE_SEIE | SIE_STIE); + + // configure Physical Memory Protection to give supervisor mode + // access to all of physical memory. + w_pmpaddr0(0x3fffffffffffffull); + w_pmpcfg0(0xf); + + // ask for clock interrupts. + timerinit(); + + // keep each CPU's hartid in its tp register, for cpuid(). + int id = r_mhartid(); + w_tp(id); + + // switch to supervisor mode and jump to main(). + asm volatile("mret"); +} + +// ask each hart to generate timer interrupts. +void +timerinit() +{ + // enable supervisor-mode timer interrupts. + w_mie(r_mie() | MIE_STIE); + + // enable the sstc extension (i.e. stimecmp). + w_menvcfg(r_menvcfg() | (1L << 63)); + + // allow supervisor to use stimecmp and time. + w_mcounteren(r_mcounteren() | 2); + + // ask for the very first timer interrupt. + w_stimecmp(r_time() + 1000000); +} diff --git a/G12_Project2_2/kernel/start.d b/G12_Project2_2/kernel/start.d new file mode 100644 index 0000000000..203c529b61 --- /dev/null +++ b/G12_Project2_2/kernel/start.d @@ -0,0 +1,2 @@ +kernel/start.o: kernel/start.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/defs.h diff --git a/G12_Project2_2/kernel/start.o b/G12_Project2_2/kernel/start.o new file mode 100644 index 0000000000..d5e5b19c08 Binary files /dev/null and b/G12_Project2_2/kernel/start.o differ diff --git a/G12_Project2_2/kernel/stat.h b/G12_Project2_2/kernel/stat.h new file mode 100644 index 0000000000..19543afdf2 --- /dev/null +++ b/G12_Project2_2/kernel/stat.h @@ -0,0 +1,11 @@ +#define T_DIR 1 // Directory +#define T_FILE 2 // File +#define T_DEVICE 3 // Device + +struct stat { + int dev; // File system's disk device + uint ino; // Inode number + short type; // Type of file + short nlink; // Number of links to file + uint64 size; // Size of file in bytes +}; diff --git a/G12_Project2_2/kernel/string.c b/G12_Project2_2/kernel/string.c new file mode 100644 index 0000000000..153536fc11 --- /dev/null +++ b/G12_Project2_2/kernel/string.c @@ -0,0 +1,107 @@ +#include "types.h" + +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; +} + +int +memcmp(const void *v1, const void *v2, uint n) +{ + const uchar *s1, *s2; + + s1 = v1; + s2 = v2; + while(n-- > 0){ + if(*s1 != *s2) + return *s1 - *s2; + s1++, s2++; + } + + return 0; +} + +void* +memmove(void *dst, const void *src, uint n) +{ + const char *s; + char *d; + + if(n == 0) + return dst; + + s = src; + d = dst; + if(s < d && s + n > d){ + s += n; + d += n; + while(n-- > 0) + *--d = *--s; + } else + while(n-- > 0) + *d++ = *s++; + + return dst; +} + +// memcpy exists to placate GCC. Use memmove. +void* +memcpy(void *dst, const void *src, uint n) +{ + return memmove(dst, src, n); +} + +int +strncmp(const char *p, const char *q, uint n) +{ + while(n > 0 && *p && *p == *q) + n--, p++, q++; + if(n == 0) + return 0; + return (uchar)*p - (uchar)*q; +} + +char* +strncpy(char *s, const char *t, int n) +{ + char *os; + + os = s; + while(n-- > 0 && (*s++ = *t++) != 0) + ; + while(n-- > 0) + *s++ = 0; + return os; +} + +// Like strncpy but guaranteed to NUL-terminate. +char* +safestrcpy(char *s, const char *t, int n) +{ + char *os; + + os = s; + if(n <= 0) + return os; + while(--n > 0 && (*s++ = *t++) != 0) + ; + *s = 0; + return os; +} + +int +strlen(const char *s) +{ + int n; + + for(n = 0; s[n]; n++) + ; + return n; +} + diff --git a/G12_Project2_2/kernel/string.d b/G12_Project2_2/kernel/string.d new file mode 100644 index 0000000000..f119f610a7 --- /dev/null +++ b/G12_Project2_2/kernel/string.d @@ -0,0 +1 @@ +kernel/string.o: kernel/string.c kernel/types.h diff --git a/G12_Project2_2/kernel/string.o b/G12_Project2_2/kernel/string.o new file mode 100644 index 0000000000..a7d4ec7d14 Binary files /dev/null and b/G12_Project2_2/kernel/string.o differ diff --git a/G12_Project2_2/kernel/swtch.S b/G12_Project2_2/kernel/swtch.S new file mode 100644 index 0000000000..17a86637cb --- /dev/null +++ b/G12_Project2_2/kernel/swtch.S @@ -0,0 +1,42 @@ +# Context switch +# +# void swtch(struct context *old, struct context *new); +# +# Save current registers in old. Load from new. + + +.globl swtch +swtch: + sd ra, 0(a0) + sd sp, 8(a0) + sd s0, 16(a0) + sd s1, 24(a0) + sd s2, 32(a0) + sd s3, 40(a0) + sd s4, 48(a0) + sd s5, 56(a0) + sd s6, 64(a0) + sd s7, 72(a0) + sd s8, 80(a0) + sd s9, 88(a0) + sd s10, 96(a0) + sd s11, 104(a0) + + ld ra, 0(a1) + ld sp, 8(a1) + ld s0, 16(a1) + ld s1, 24(a1) + ld s2, 32(a1) + ld s3, 40(a1) + ld s4, 48(a1) + ld s5, 56(a1) + ld s6, 64(a1) + ld s7, 72(a1) + ld s8, 80(a1) + ld s9, 88(a1) + ld s10, 96(a1) + ld s11, 104(a1) + + ret + + diff --git a/G12_Project2_2/kernel/swtch.o b/G12_Project2_2/kernel/swtch.o new file mode 100644 index 0000000000..5b59b481eb Binary files /dev/null and b/G12_Project2_2/kernel/swtch.o differ diff --git a/kernel/syscall.c b/G12_Project2_2/kernel/syscall.c similarity index 100% rename from kernel/syscall.c rename to G12_Project2_2/kernel/syscall.c diff --git a/G12_Project2_2/kernel/syscall.d b/G12_Project2_2/kernel/syscall.d new file mode 100644 index 0000000000..9c762756c4 --- /dev/null +++ b/G12_Project2_2/kernel/syscall.d @@ -0,0 +1,3 @@ +kernel/syscall.o: kernel/syscall.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/syscall.h kernel/defs.h diff --git a/kernel/syscall.h b/G12_Project2_2/kernel/syscall.h similarity index 100% rename from kernel/syscall.h rename to G12_Project2_2/kernel/syscall.h diff --git a/G12_Project2_2/kernel/syscall.o b/G12_Project2_2/kernel/syscall.o new file mode 100644 index 0000000000..e965a690b9 Binary files /dev/null and b/G12_Project2_2/kernel/syscall.o differ diff --git a/G12_Project2_2/kernel/sysfile.c b/G12_Project2_2/kernel/sysfile.c new file mode 100644 index 0000000000..d8234ce92a --- /dev/null +++ b/G12_Project2_2/kernel/sysfile.c @@ -0,0 +1,505 @@ +// +// File-system system calls. +// Mostly argument checking, since we don't trust +// user code, and calls into file.c and fs.c. +// + +#include "types.h" +#include "riscv.h" +#include "defs.h" +#include "param.h" +#include "stat.h" +#include "spinlock.h" +#include "proc.h" +#include "fs.h" +#include "sleeplock.h" +#include "file.h" +#include "fcntl.h" + +// 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) +{ + int fd; + struct file *f; + + argint(n, &fd); + if(fd < 0 || fd >= NOFILE || (f=myproc()->ofile[fd]) == 0) + return -1; + if(pfd) + *pfd = fd; + if(pf) + *pf = f; + return 0; +} + +// Allocate a file descriptor for the given file. +// Takes over file reference from caller on success. +static int +fdalloc(struct file *f) +{ + int fd; + struct proc *p = myproc(); + + for(fd = 0; fd < NOFILE; fd++){ + if(p->ofile[fd] == 0){ + p->ofile[fd] = f; + return fd; + } + } + return -1; +} + +uint64 +sys_dup(void) +{ + struct file *f; + int fd; + + if(argfd(0, 0, &f) < 0) + return -1; + if((fd=fdalloc(f)) < 0) + return -1; + filedup(f); + return fd; +} + +uint64 +sys_read(void) +{ + struct file *f; + int n; + uint64 p; + + argaddr(1, &p); + argint(2, &n); + if(argfd(0, 0, &f) < 0) + return -1; + return fileread(f, p, n); +} + +uint64 +sys_write(void) +{ + struct file *f; + int n; + uint64 p; + + argaddr(1, &p); + argint(2, &n); + if(argfd(0, 0, &f) < 0) + return -1; + + return filewrite(f, p, n); +} + +uint64 +sys_close(void) +{ + int fd; + struct file *f; + + if(argfd(0, &fd, &f) < 0) + return -1; + myproc()->ofile[fd] = 0; + fileclose(f); + return 0; +} + +uint64 +sys_fstat(void) +{ + struct file *f; + uint64 st; // user pointer to struct stat + + argaddr(1, &st); + if(argfd(0, 0, &f) < 0) + return -1; + return filestat(f, st); +} + +// Create the path new as a link to the same inode as old. +uint64 +sys_link(void) +{ + char name[DIRSIZ], new[MAXPATH], old[MAXPATH]; + struct inode *dp, *ip; + + if(argstr(0, old, MAXPATH) < 0 || argstr(1, new, MAXPATH) < 0) + return -1; + + begin_op(); + if((ip = namei(old)) == 0){ + end_op(); + return -1; + } + + ilock(ip); + if(ip->type == T_DIR){ + iunlockput(ip); + end_op(); + return -1; + } + + ip->nlink++; + iupdate(ip); + iunlock(ip); + + if((dp = nameiparent(new, name)) == 0) + goto bad; + ilock(dp); + if(dp->dev != ip->dev || dirlink(dp, name, ip->inum) < 0){ + iunlockput(dp); + goto bad; + } + iunlockput(dp); + iput(ip); + + end_op(); + + return 0; + +bad: + ilock(ip); + ip->nlink--; + iupdate(ip); + iunlockput(ip); + end_op(); + return -1; +} + +// Is the directory dp empty except for "." and ".." ? +static int +isdirempty(struct inode *dp) +{ + int off; + struct dirent de; + + for(off=2*sizeof(de); offsize; off+=sizeof(de)){ + if(readi(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + panic("isdirempty: readi"); + if(de.inum != 0) + return 0; + } + return 1; +} + +uint64 +sys_unlink(void) +{ + struct inode *ip, *dp; + struct dirent de; + char name[DIRSIZ], path[MAXPATH]; + uint off; + + if(argstr(0, path, MAXPATH) < 0) + return -1; + + begin_op(); + if((dp = nameiparent(path, name)) == 0){ + end_op(); + return -1; + } + + ilock(dp); + + // Cannot unlink "." or "..". + if(namecmp(name, ".") == 0 || namecmp(name, "..") == 0) + goto bad; + + if((ip = dirlookup(dp, name, &off)) == 0) + goto bad; + ilock(ip); + + if(ip->nlink < 1) + panic("unlink: nlink < 1"); + if(ip->type == T_DIR && !isdirempty(ip)){ + iunlockput(ip); + goto bad; + } + + memset(&de, 0, sizeof(de)); + if(writei(dp, 0, (uint64)&de, off, sizeof(de)) != sizeof(de)) + panic("unlink: writei"); + if(ip->type == T_DIR){ + dp->nlink--; + iupdate(dp); + } + iunlockput(dp); + + ip->nlink--; + iupdate(ip); + iunlockput(ip); + + end_op(); + + return 0; + +bad: + iunlockput(dp); + end_op(); + return -1; +} + +static struct inode* +create(char *path, short type, short major, short minor) +{ + struct inode *ip, *dp; + char name[DIRSIZ]; + + if((dp = nameiparent(path, name)) == 0) + return 0; + + ilock(dp); + + if((ip = dirlookup(dp, name, 0)) != 0){ + iunlockput(dp); + ilock(ip); + if(type == T_FILE && (ip->type == T_FILE || ip->type == T_DEVICE)) + return ip; + iunlockput(ip); + return 0; + } + + if((ip = ialloc(dp->dev, type)) == 0){ + iunlockput(dp); + return 0; + } + + ilock(ip); + ip->major = major; + ip->minor = minor; + ip->nlink = 1; + iupdate(ip); + + if(type == T_DIR){ // Create . and .. entries. + // No ip->nlink++ for ".": avoid cyclic ref count. + if(dirlink(ip, ".", ip->inum) < 0 || dirlink(ip, "..", dp->inum) < 0) + goto fail; + } + + if(dirlink(dp, name, ip->inum) < 0) + goto fail; + + if(type == T_DIR){ + // now that success is guaranteed: + dp->nlink++; // for ".." + iupdate(dp); + } + + iunlockput(dp); + + return ip; + + fail: + // something went wrong. de-allocate ip. + ip->nlink = 0; + iupdate(ip); + iunlockput(ip); + iunlockput(dp); + return 0; +} + +uint64 +sys_open(void) +{ + char path[MAXPATH]; + int fd, omode; + struct file *f; + struct inode *ip; + int n; + + argint(1, &omode); + if((n = argstr(0, path, MAXPATH)) < 0) + return -1; + + begin_op(); + + if(omode & O_CREATE){ + ip = create(path, T_FILE, 0, 0); + if(ip == 0){ + end_op(); + return -1; + } + } else { + if((ip = namei(path)) == 0){ + end_op(); + return -1; + } + ilock(ip); + if(ip->type == T_DIR && omode != O_RDONLY){ + iunlockput(ip); + end_op(); + return -1; + } + } + + if(ip->type == T_DEVICE && (ip->major < 0 || ip->major >= NDEV)){ + iunlockput(ip); + end_op(); + return -1; + } + + if((f = filealloc()) == 0 || (fd = fdalloc(f)) < 0){ + if(f) + fileclose(f); + iunlockput(ip); + end_op(); + return -1; + } + + if(ip->type == T_DEVICE){ + f->type = FD_DEVICE; + f->major = ip->major; + } else { + f->type = FD_INODE; + f->off = 0; + } + f->ip = ip; + f->readable = !(omode & O_WRONLY); + f->writable = (omode & O_WRONLY) || (omode & O_RDWR); + + if((omode & O_TRUNC) && ip->type == T_FILE){ + itrunc(ip); + } + + iunlock(ip); + end_op(); + + return fd; +} + +uint64 +sys_mkdir(void) +{ + char path[MAXPATH]; + struct inode *ip; + + begin_op(); + if(argstr(0, path, MAXPATH) < 0 || (ip = create(path, T_DIR, 0, 0)) == 0){ + end_op(); + return -1; + } + iunlockput(ip); + end_op(); + return 0; +} + +uint64 +sys_mknod(void) +{ + struct inode *ip; + char path[MAXPATH]; + int major, minor; + + begin_op(); + argint(1, &major); + argint(2, &minor); + if((argstr(0, path, MAXPATH)) < 0 || + (ip = create(path, T_DEVICE, major, minor)) == 0){ + end_op(); + return -1; + } + iunlockput(ip); + end_op(); + return 0; +} + +uint64 +sys_chdir(void) +{ + char path[MAXPATH]; + struct inode *ip; + struct proc *p = myproc(); + + begin_op(); + if(argstr(0, path, MAXPATH) < 0 || (ip = namei(path)) == 0){ + end_op(); + return -1; + } + ilock(ip); + if(ip->type != T_DIR){ + iunlockput(ip); + end_op(); + return -1; + } + iunlock(ip); + iput(p->cwd); + end_op(); + p->cwd = ip; + return 0; +} + +uint64 +sys_exec(void) +{ + char path[MAXPATH], *argv[MAXARG]; + int i; + uint64 uargv, uarg; + + argaddr(1, &uargv); + if(argstr(0, path, MAXPATH) < 0) { + return -1; + } + memset(argv, 0, sizeof(argv)); + for(i=0;; i++){ + if(i >= NELEM(argv)){ + goto bad; + } + if(fetchaddr(uargv+sizeof(uint64)*i, (uint64*)&uarg) < 0){ + goto bad; + } + if(uarg == 0){ + argv[i] = 0; + break; + } + argv[i] = kalloc(); + if(argv[i] == 0) + goto bad; + if(fetchstr(uarg, argv[i], PGSIZE) < 0) + goto bad; + } + + int ret = kexec(path, argv); + + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + kfree(argv[i]); + + return ret; + + bad: + for(i = 0; i < NELEM(argv) && argv[i] != 0; i++) + kfree(argv[i]); + return -1; +} + +uint64 +sys_pipe(void) +{ + uint64 fdarray; // user pointer to array of two integers + struct file *rf, *wf; + int fd0, fd1; + struct proc *p = myproc(); + + argaddr(0, &fdarray); + if(pipealloc(&rf, &wf) < 0) + return -1; + fd0 = -1; + if((fd0 = fdalloc(rf)) < 0 || (fd1 = fdalloc(wf)) < 0){ + if(fd0 >= 0) + p->ofile[fd0] = 0; + fileclose(rf); + 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){ + p->ofile[fd0] = 0; + p->ofile[fd1] = 0; + fileclose(rf); + fileclose(wf); + return -1; + } + return 0; +} diff --git a/G12_Project2_2/kernel/sysfile.d b/G12_Project2_2/kernel/sysfile.d new file mode 100644 index 0000000000..382ec062ec --- /dev/null +++ b/G12_Project2_2/kernel/sysfile.d @@ -0,0 +1,4 @@ +kernel/sysfile.o: kernel/sysfile.c kernel/types.h kernel/riscv.h \ + kernel/defs.h kernel/param.h kernel/stat.h kernel/spinlock.h \ + kernel/proc.h kernel/fs.h kernel/sleeplock.h kernel/file.h \ + kernel/fcntl.h diff --git a/G12_Project2_2/kernel/sysfile.o b/G12_Project2_2/kernel/sysfile.o new file mode 100644 index 0000000000..3b922cac6b Binary files /dev/null and b/G12_Project2_2/kernel/sysfile.o differ diff --git a/kernel/sysproc.c b/G12_Project2_2/kernel/sysproc.c similarity index 100% rename from kernel/sysproc.c rename to G12_Project2_2/kernel/sysproc.c diff --git a/G12_Project2_2/kernel/sysproc.d b/G12_Project2_2/kernel/sysproc.d new file mode 100644 index 0000000000..6dedac4c87 --- /dev/null +++ b/G12_Project2_2/kernel/sysproc.d @@ -0,0 +1,3 @@ +kernel/sysproc.o: kernel/sysproc.c kernel/types.h kernel/riscv.h \ + kernel/defs.h kernel/param.h kernel/memlayout.h kernel/spinlock.h \ + kernel/proc.h kernel/vm.h diff --git a/G12_Project2_2/kernel/sysproc.o b/G12_Project2_2/kernel/sysproc.o new file mode 100644 index 0000000000..3eb91532d4 Binary files /dev/null and b/G12_Project2_2/kernel/sysproc.o differ diff --git a/G12_Project2_2/kernel/trampoline.S b/G12_Project2_2/kernel/trampoline.S new file mode 100644 index 0000000000..ce726d3d7c --- /dev/null +++ b/G12_Project2_2/kernel/trampoline.S @@ -0,0 +1,149 @@ + # + # low-level code to handle traps from user space into + # the kernel, and returns from kernel to user. + # + # the kernel maps the page holding this code + # at the same virtual address (TRAMPOLINE) + # in user and kernel space so that it continues + # to work when it switches page tables. + # kernel.ld causes this code to start at + # a page boundary. + # + +#include "riscv.h" +#include "memlayout.h" + +.section trampsec +.globl trampoline +.globl usertrap +trampoline: +.align 4 +.globl uservec +uservec: + # + # trap.c sets stvec to point here, so + # traps from user space start here, + # in supervisor mode, but with a + # user page table. + # + + # save user a0 in sscratch so + # a0 can be used to get at TRAPFRAME. + csrw sscratch, a0 + + # each process has a separate p->trapframe memory area, + # but it's mapped to the same virtual address + # (TRAPFRAME) in every process's user page table. + li a0, TRAPFRAME + + # save the user registers in TRAPFRAME + sd ra, 40(a0) + sd sp, 48(a0) + sd gp, 56(a0) + sd tp, 64(a0) + sd t0, 72(a0) + sd t1, 80(a0) + sd t2, 88(a0) + sd s0, 96(a0) + sd s1, 104(a0) + sd a1, 120(a0) + sd a2, 128(a0) + sd a3, 136(a0) + sd a4, 144(a0) + sd a5, 152(a0) + sd a6, 160(a0) + sd a7, 168(a0) + sd s2, 176(a0) + sd s3, 184(a0) + sd s4, 192(a0) + sd s5, 200(a0) + sd s6, 208(a0) + sd s7, 216(a0) + sd s8, 224(a0) + sd s9, 232(a0) + sd s10, 240(a0) + sd s11, 248(a0) + sd t3, 256(a0) + sd t4, 264(a0) + sd t5, 272(a0) + sd t6, 280(a0) + + # save the user a0 in p->trapframe->a0 + csrr t0, sscratch + sd t0, 112(a0) + + # initialize kernel stack pointer, from p->trapframe->kernel_sp + ld sp, 8(a0) + + # make tp hold the current hartid, from p->trapframe->kernel_hartid + ld tp, 32(a0) + + # load the address of usertrap(), from p->trapframe->kernel_trap + ld t0, 16(a0) + + # fetch the kernel page table address, from p->trapframe->kernel_satp. + ld t1, 0(a0) + + # wait for any previous memory operations to complete, so that + # they use the user page table. + sfence.vma zero, zero + + # install the kernel page table. + csrw satp, t1 + + # flush now-stale user entries from the TLB. + sfence.vma zero, zero + + # call usertrap() + jalr t0 + +.globl userret +userret: + # usertrap() returns here, with user satp in a0. + # return from kernel to user. + + # switch to the user page table. + sfence.vma zero, zero + csrw satp, a0 + sfence.vma zero, zero + + li a0, TRAPFRAME + + # restore all but a0 from TRAPFRAME + ld ra, 40(a0) + ld sp, 48(a0) + ld gp, 56(a0) + ld tp, 64(a0) + ld t0, 72(a0) + ld t1, 80(a0) + ld t2, 88(a0) + ld s0, 96(a0) + ld s1, 104(a0) + ld a1, 120(a0) + ld a2, 128(a0) + ld a3, 136(a0) + ld a4, 144(a0) + ld a5, 152(a0) + ld a6, 160(a0) + ld a7, 168(a0) + ld s2, 176(a0) + ld s3, 184(a0) + ld s4, 192(a0) + ld s5, 200(a0) + ld s6, 208(a0) + ld s7, 216(a0) + ld s8, 224(a0) + ld s9, 232(a0) + ld s10, 240(a0) + ld s11, 248(a0) + ld t3, 256(a0) + ld t4, 264(a0) + ld t5, 272(a0) + ld t6, 280(a0) + + # restore user a0 + ld a0, 112(a0) + + # return to user mode and user pc. + # usertrapret() set up sstatus and sepc. + sret diff --git a/G12_Project2_2/kernel/trampoline.o b/G12_Project2_2/kernel/trampoline.o new file mode 100644 index 0000000000..cb4652542f Binary files /dev/null and b/G12_Project2_2/kernel/trampoline.o differ diff --git a/G12_Project2_2/kernel/trap.c b/G12_Project2_2/kernel/trap.c new file mode 100644 index 0000000000..a41cd69864 --- /dev/null +++ b/G12_Project2_2/kernel/trap.c @@ -0,0 +1,219 @@ +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "riscv.h" +#include "spinlock.h" +#include "proc.h" +#include "defs.h" + +struct spinlock tickslock; +uint ticks; + +extern char trampoline[], uservec[]; + +// in kernelvec.S, calls kerneltrap(). +void kernelvec(); + +extern int devintr(); + +void +trapinit(void) +{ + initlock(&tickslock, "time"); +} + +// set up to take exceptions and traps while in the kernel. +void +trapinithart(void) +{ + w_stvec((uint64)kernelvec); +} + +// +// handle an interrupt, exception, or system call from user space. +// called from, and returns to, trampoline.S +// return value is user satp for trampoline.S to switch to. +// +uint64 +usertrap(void) +{ + int which_dev = 0; + + if((r_sstatus() & SSTATUS_SPP) != 0) + panic("usertrap: not from user mode"); + + // send interrupts and exceptions to kerneltrap(), + // since we're now in the kernel. + w_stvec((uint64)kernelvec); //DOC: kernelvec + + struct proc *p = myproc(); + + // save user program counter. + p->trapframe->epc = r_sepc(); + + if(r_scause() == 8){ + // system call + + if(killed(p)) + kexit(-1); + + // sepc points to the ecall instruction, + // but we want to return to the next instruction. + p->trapframe->epc += 4; + + // an interrupt will change sepc, scause, and sstatus, + // so enable only now that we're done with those registers. + intr_on(); + + syscall(); + } else if((which_dev = devintr()) != 0){ + // ok + } else if((r_scause() == 15 || r_scause() == 13) && + vmfault(p->pagetable, r_stval(), (r_scause() == 13)? 1 : 0) != 0) { + // page fault on lazily-allocated page + } else { + printf("usertrap(): unexpected scause 0x%lx pid=%d\n", r_scause(), p->pid); + printf(" sepc=0x%lx stval=0x%lx\n", r_sepc(), r_stval()); + setkilled(p); + } + + if(killed(p)) + kexit(-1); + + // give up the CPU if this is a timer interrupt. + if(which_dev == 2) + yield(); + + prepare_return(); + + // the user page table to switch to, for trampoline.S + uint64 satp = MAKE_SATP(p->pagetable); + + // return to trampoline.S; satp value in a0. + return satp; +} + +// +// set up trapframe and control registers for a return to user space +// +void +prepare_return(void) +{ + struct proc *p = myproc(); + + // we're about to switch the destination of traps from + // kerneltrap() to usertrap(). because a trap from kernel + // code to usertrap would be a disaster, turn off interrupts. + intr_off(); + + // send syscalls, interrupts, and exceptions to uservec in trampoline.S + uint64 trampoline_uservec = TRAMPOLINE + (uservec - trampoline); + w_stvec(trampoline_uservec); + + // set up trapframe values that uservec will need when + // the process next traps into the kernel. + p->trapframe->kernel_satp = r_satp(); // kernel page table + p->trapframe->kernel_sp = p->kstack + PGSIZE; // process's kernel stack + p->trapframe->kernel_trap = (uint64)usertrap; + p->trapframe->kernel_hartid = r_tp(); // hartid for cpuid() + + // 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 + x |= SSTATUS_SPIE; // enable interrupts in user mode + w_sstatus(x); + + // set S Exception Program Counter to the saved user pc. + w_sepc(p->trapframe->epc); +} + +// interrupts and exceptions from kernel code go here via kernelvec, +// on whatever the current kernel stack is. +void +kerneltrap() +{ + int which_dev = 0; + uint64 sepc = r_sepc(); + uint64 sstatus = r_sstatus(); + uint64 scause = r_scause(); + + if((sstatus & SSTATUS_SPP) == 0) + panic("kerneltrap: not from supervisor mode"); + if(intr_get() != 0) + panic("kerneltrap: interrupts enabled"); + + if((which_dev = devintr()) == 0){ + // interrupt or trap from an unknown source + printf("scause=0x%lx sepc=0x%lx stval=0x%lx\n", scause, r_sepc(), r_stval()); + panic("kerneltrap"); + } + + // give up the CPU if this is a timer interrupt. + if(which_dev == 2 && myproc() != 0) + yield(); + + // the yield() may have caused some traps to occur, + // so restore trap registers for use by kernelvec.S's sepc instruction. + w_sepc(sepc); + w_sstatus(sstatus); +} + +void +clockintr() +{ + if(cpuid() == 0){ + acquire(&tickslock); + ticks++; + wakeup(&ticks); + release(&tickslock); + } + + // ask for the next timer interrupt. this also clears + // the interrupt request. 1000000 is about a tenth + // of a second. + w_stimecmp(r_time() + 1000000); +} + +// check if it's an external interrupt or software interrupt, +// and handle it. +// returns 2 if timer interrupt, +// 1 if other device, +// 0 if not recognized. +int +devintr() +{ + uint64 scause = r_scause(); + + if(scause == 0x8000000000000009L){ + // this is a supervisor external interrupt, via PLIC. + + // irq indicates which device interrupted. + int irq = plic_claim(); + + if(irq == UART0_IRQ){ + uartintr(); + } else if(irq == VIRTIO0_IRQ){ + virtio_disk_intr(); + } else if(irq){ + printf("unexpected interrupt irq=%d\n", irq); + } + + // the PLIC allows each device to raise at most one + // interrupt at a time; tell the PLIC the device is + // now allowed to interrupt again. + if(irq) + plic_complete(irq); + + return 1; + } else if(scause == 0x8000000000000005L){ + // timer interrupt. + clockintr(); + return 2; + } else { + return 0; + } +} + diff --git a/G12_Project2_2/kernel/trap.d b/G12_Project2_2/kernel/trap.d new file mode 100644 index 0000000000..068f358680 --- /dev/null +++ b/G12_Project2_2/kernel/trap.d @@ -0,0 +1,3 @@ +kernel/trap.o: kernel/trap.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/defs.h diff --git a/G12_Project2_2/kernel/trap.o b/G12_Project2_2/kernel/trap.o new file mode 100644 index 0000000000..dd5bbd94c7 Binary files /dev/null and b/G12_Project2_2/kernel/trap.o differ diff --git a/G12_Project2_2/kernel/types.h b/G12_Project2_2/kernel/types.h new file mode 100644 index 0000000000..ee731649e2 --- /dev/null +++ b/G12_Project2_2/kernel/types.h @@ -0,0 +1,10 @@ +typedef unsigned int uint; +typedef unsigned short ushort; +typedef unsigned char uchar; + +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; +typedef unsigned long uint64; + +typedef uint64 pde_t; diff --git a/G12_Project2_2/kernel/uart.c b/G12_Project2_2/kernel/uart.c new file mode 100644 index 0000000000..248b9e4623 --- /dev/null +++ b/G12_Project2_2/kernel/uart.c @@ -0,0 +1,161 @@ +// +// low-level driver for 16550a UART. +// + +#include "types.h" +#include "param.h" +#include "memlayout.h" +#include "riscv.h" +#include "spinlock.h" +#include "proc.h" +#include "defs.h" + +// the UART control registers are memory-mapped +// at address UART0. this macro returns the +// address of one of the registers. +#define Reg(reg) ((volatile unsigned char *)(UART0 + (reg))) + +#define ReadReg(reg) (*(Reg(reg))) +#define WriteReg(reg, v) (*(Reg(reg)) = (v)) + +// the UART control registers. +// some have different meanings for read vs write. +// see http://byterunner.com/16550.html +#define RHR 0 // receive holding register (for input bytes) +#define THR 0 // transmit holding register (for output bytes) +#define IER 1 // interrupt enable register +#define IER_RX_ENABLE (1<<0) +#define IER_TX_ENABLE (1<<1) +#define FCR 2 // FIFO control register +#define FCR_FIFO_ENABLE (1<<0) +#define FCR_FIFO_CLEAR (3<<1) // clear the content of the two FIFOs +#define ISR 2 // interrupt status register +#define LCR 3 // line control register +#define LCR_EIGHT_BITS (3<<0) +#define LCR_BAUD_LATCH (1<<7) // special mode to set baud rate +#define LSR 5 // line status register +#define LSR_RX_READY (1<<0) // input is waiting to be read from RHR +#define LSR_TX_IDLE (1<<5) // THR can accept another character to send + +// for sending threads to synchronize with uart "ready" interrupts. +static struct spinlock tx_lock; +static int tx_busy; // is the UART busy sending? +static int tx_chan; // &tx_chan is the "wait channel" + +extern volatile int panicking; // from printf.c +extern volatile int panicked; // from printf.c + +void +uartinit(void) +{ + // disable interrupts. + WriteReg(IER, 0x00); + + // special mode to set baud rate. + WriteReg(LCR, LCR_BAUD_LATCH); + + // LSB for baud rate of 38.4K. + WriteReg(0, 0x03); + + // MSB for baud rate of 38.4K. + WriteReg(1, 0x00); + + // leave set-baud mode, + // and set word length to 8 bits, no parity. + WriteReg(LCR, LCR_EIGHT_BITS); + + // reset and enable FIFOs. + WriteReg(FCR, FCR_FIFO_ENABLE | FCR_FIFO_CLEAR); + + // enable transmit and receive interrupts. + WriteReg(IER, IER_TX_ENABLE | IER_RX_ENABLE); + + initlock(&tx_lock, "uart"); +} + +// transmit buf[] to the uart. it blocks if the +// uart is busy, so it cannot be called from +// interrupts, only from write() system calls. +void +uartwrite(char buf[], int n) +{ + acquire(&tx_lock); + + int i = 0; + while(i < n){ + while(tx_busy != 0){ + // wait for a UART transmit-complete interrupt + // to set tx_busy to 0. + sleep(&tx_chan, &tx_lock); + } + + WriteReg(THR, buf[i]); + i += 1; + tx_busy = 1; + } + + release(&tx_lock); +} + + +// write a byte to the uart without using +// interrupts, for use by kernel printf() and +// to echo characters. it spins waiting for the uart's +// output register to be empty. +void +uartputc_sync(int c) +{ + if(panicking == 0) + push_off(); + + if(panicked){ + for(;;) + ; + } + + // wait for UART to set Transmit Holding Empty in LSR. + while((ReadReg(LSR) & LSR_TX_IDLE) == 0) + ; + WriteReg(THR, c); + + if(panicking == 0) + pop_off(); +} + +// try to read one input character from the UART. +// return -1 if none is waiting. +int +uartgetc(void) +{ + if(ReadReg(LSR) & LSR_RX_READY){ + // input data is ready. + return ReadReg(RHR); + } else { + return -1; + } +} + +// handle a uart interrupt, raised because input has +// arrived, or the uart is ready for more output, or +// both. called from devintr(). +void +uartintr(void) +{ + ReadReg(ISR); // acknowledge the interrupt + + acquire(&tx_lock); + if(ReadReg(LSR) & LSR_TX_IDLE){ + // UART finished transmitting; wake up sending thread. + tx_busy = 0; + wakeup(&tx_chan); + } + release(&tx_lock); + + // read and process incoming characters, if any. + while(1){ + int c = uartgetc(); + if(c == -1) + break; + consoleintr(c); + } +} diff --git a/G12_Project2_2/kernel/uart.d b/G12_Project2_2/kernel/uart.d new file mode 100644 index 0000000000..da94ef2e0d --- /dev/null +++ b/G12_Project2_2/kernel/uart.d @@ -0,0 +1,3 @@ +kernel/uart.o: kernel/uart.c kernel/types.h kernel/param.h \ + kernel/memlayout.h kernel/riscv.h kernel/spinlock.h kernel/proc.h \ + kernel/defs.h diff --git a/G12_Project2_2/kernel/uart.o b/G12_Project2_2/kernel/uart.o new file mode 100644 index 0000000000..6b1341274d Binary files /dev/null and b/G12_Project2_2/kernel/uart.o differ diff --git a/G12_Project2_2/kernel/virtio.h b/G12_Project2_2/kernel/virtio.h new file mode 100644 index 0000000000..96272b46d7 --- /dev/null +++ b/G12_Project2_2/kernel/virtio.h @@ -0,0 +1,96 @@ +// +// virtio device definitions. +// for both the mmio interface, and virtio descriptors. +// only tested with qemu. +// +// the virtio spec: +// https://docs.oasis-open.org/virtio/virtio/v1.1/virtio-v1.1.pdf +// + +// virtio mmio control registers, mapped starting at 0x10001000. +// from qemu virtio_mmio.h +#define VIRTIO_MMIO_MAGIC_VALUE 0x000 // 0x74726976 +#define VIRTIO_MMIO_VERSION 0x004 // version; should be 2 +#define VIRTIO_MMIO_DEVICE_ID 0x008 // device type; 1 is net, 2 is disk +#define VIRTIO_MMIO_VENDOR_ID 0x00c // 0x554d4551 +#define VIRTIO_MMIO_DEVICE_FEATURES 0x010 +#define VIRTIO_MMIO_DRIVER_FEATURES 0x020 +#define VIRTIO_MMIO_QUEUE_SEL 0x030 // select queue, write-only +#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034 // max size of current queue, read-only +#define VIRTIO_MMIO_QUEUE_NUM 0x038 // size of current queue, write-only +#define VIRTIO_MMIO_QUEUE_READY 0x044 // ready bit +#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050 // write-only +#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060 // read-only +#define VIRTIO_MMIO_INTERRUPT_ACK 0x064 // write-only +#define VIRTIO_MMIO_STATUS 0x070 // read/write +#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080 // physical address for descriptor table, write-only +#define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084 +#define VIRTIO_MMIO_DRIVER_DESC_LOW 0x090 // physical address for available ring, write-only +#define VIRTIO_MMIO_DRIVER_DESC_HIGH 0x094 +#define VIRTIO_MMIO_DEVICE_DESC_LOW 0x0a0 // physical address for used ring, write-only +#define VIRTIO_MMIO_DEVICE_DESC_HIGH 0x0a4 + +// status register bits, from qemu virtio_config.h +#define VIRTIO_CONFIG_S_ACKNOWLEDGE 1 +#define VIRTIO_CONFIG_S_DRIVER 2 +#define VIRTIO_CONFIG_S_DRIVER_OK 4 +#define VIRTIO_CONFIG_S_FEATURES_OK 8 + +// device feature bits +#define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ +#define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */ +#define VIRTIO_BLK_F_CONFIG_WCE 11 /* Writeback mode available in config */ +#define VIRTIO_BLK_F_MQ 12 /* support more than one vq */ +#define VIRTIO_F_ANY_LAYOUT 27 +#define VIRTIO_RING_F_INDIRECT_DESC 28 +#define VIRTIO_RING_F_EVENT_IDX 29 + +// this many virtio descriptors. +// must be a power of two. +#define NUM 8 + +// a single descriptor, from the spec. +struct virtq_desc { + uint64 addr; + uint32 len; + uint16 flags; + uint16 next; +}; +#define VRING_DESC_F_NEXT 1 // chained with another descriptor +#define VRING_DESC_F_WRITE 2 // device writes (vs read) + +// the (entire) avail ring, from the spec. +struct virtq_avail { + uint16 flags; // always zero + uint16 idx; // driver will write ring[idx] next + uint16 ring[NUM]; // descriptor numbers of chain heads + uint16 unused; +}; + +// one entry in the "used" ring, with which the +// device tells the driver about completed requests. +struct virtq_used_elem { + uint32 id; // index of start of completed descriptor chain + uint32 len; +}; + +struct virtq_used { + uint16 flags; // always zero + uint16 idx; // device increments when it adds a ring[] entry + struct virtq_used_elem ring[NUM]; +}; + +// these are specific to virtio block devices, e.g. disks, +// described in Section 5.2 of the spec. + +#define VIRTIO_BLK_T_IN 0 // read the disk +#define VIRTIO_BLK_T_OUT 1 // write the disk + +// the format of the first descriptor in a disk request. +// to be followed by two more descriptors containing +// the block, and a one-byte status. +struct virtio_blk_req { + uint32 type; // VIRTIO_BLK_T_IN or ..._OUT + uint32 reserved; + uint64 sector; +}; diff --git a/G12_Project2_2/kernel/virtio_disk.c b/G12_Project2_2/kernel/virtio_disk.c new file mode 100644 index 0000000000..ae6c164f08 --- /dev/null +++ b/G12_Project2_2/kernel/virtio_disk.c @@ -0,0 +1,327 @@ +// +// driver for qemu's virtio disk device. +// uses qemu's mmio interface to virtio. +// +// qemu ... -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0 +// + +#include "types.h" +#include "riscv.h" +#include "defs.h" +#include "param.h" +#include "memlayout.h" +#include "spinlock.h" +#include "sleeplock.h" +#include "fs.h" +#include "buf.h" +#include "virtio.h" + +// the address of virtio mmio register r. +#define R(r) ((volatile uint32 *)(VIRTIO0 + (r))) + +static struct disk { + // a set (not a ring) of DMA descriptors, with which the + // driver tells the device where to read and write individual + // disk operations. there are NUM descriptors. + // most commands consist of a "chain" (a linked list) of a couple of + // these descriptors. + struct virtq_desc *desc; + + // a ring in which the driver writes descriptor numbers + // that the driver would like the device to process. it only + // includes the head descriptor of each chain. the ring has + // NUM elements. + struct virtq_avail *avail; + + // a ring in which the device writes descriptor numbers that + // the device has finished processing (just the head of each chain). + // there are NUM used ring entries. + struct virtq_used *used; + + // our own book-keeping. + char free[NUM]; // is a descriptor free? + uint16 used_idx; // we've looked this far in used[2..NUM]. + + // track info about in-flight operations, + // for use when completion interrupt arrives. + // indexed by first descriptor index of chain. + struct { + struct buf *b; + char status; + } info[NUM]; + + // disk command headers. + // one-for-one with descriptors, for convenience. + struct virtio_blk_req ops[NUM]; + + struct spinlock vdisk_lock; + +} disk; + +void +virtio_disk_init(void) +{ + uint32 status = 0; + + initlock(&disk.vdisk_lock, "virtio_disk"); + + if(*R(VIRTIO_MMIO_MAGIC_VALUE) != 0x74726976 || + *R(VIRTIO_MMIO_VERSION) != 2 || + *R(VIRTIO_MMIO_DEVICE_ID) != 2 || + *R(VIRTIO_MMIO_VENDOR_ID) != 0x554d4551){ + panic("could not find virtio disk"); + } + + // reset device + *R(VIRTIO_MMIO_STATUS) = status; + + // set ACKNOWLEDGE status bit + status |= VIRTIO_CONFIG_S_ACKNOWLEDGE; + *R(VIRTIO_MMIO_STATUS) = status; + + // set DRIVER status bit + status |= VIRTIO_CONFIG_S_DRIVER; + *R(VIRTIO_MMIO_STATUS) = status; + + // negotiate features + uint64 features = *R(VIRTIO_MMIO_DEVICE_FEATURES); + features &= ~(1 << VIRTIO_BLK_F_RO); + features &= ~(1 << VIRTIO_BLK_F_SCSI); + features &= ~(1 << VIRTIO_BLK_F_CONFIG_WCE); + features &= ~(1 << VIRTIO_BLK_F_MQ); + features &= ~(1 << VIRTIO_F_ANY_LAYOUT); + features &= ~(1 << VIRTIO_RING_F_EVENT_IDX); + features &= ~(1 << VIRTIO_RING_F_INDIRECT_DESC); + *R(VIRTIO_MMIO_DRIVER_FEATURES) = features; + + // tell device that feature negotiation is complete. + status |= VIRTIO_CONFIG_S_FEATURES_OK; + *R(VIRTIO_MMIO_STATUS) = status; + + // re-read status to ensure FEATURES_OK is set. + status = *R(VIRTIO_MMIO_STATUS); + if(!(status & VIRTIO_CONFIG_S_FEATURES_OK)) + panic("virtio disk FEATURES_OK unset"); + + // initialize queue 0. + *R(VIRTIO_MMIO_QUEUE_SEL) = 0; + + // ensure queue 0 is not in use. + if(*R(VIRTIO_MMIO_QUEUE_READY)) + panic("virtio disk should not be ready"); + + // check maximum queue size. + uint32 max = *R(VIRTIO_MMIO_QUEUE_NUM_MAX); + if(max == 0) + panic("virtio disk has no queue 0"); + if(max < NUM) + panic("virtio disk max queue too short"); + + // allocate and zero queue memory. + disk.desc = kalloc(); + disk.avail = kalloc(); + disk.used = kalloc(); + if(!disk.desc || !disk.avail || !disk.used) + panic("virtio disk kalloc"); + memset(disk.desc, 0, PGSIZE); + memset(disk.avail, 0, PGSIZE); + memset(disk.used, 0, PGSIZE); + + // set queue size. + *R(VIRTIO_MMIO_QUEUE_NUM) = NUM; + + // write physical addresses. + *R(VIRTIO_MMIO_QUEUE_DESC_LOW) = (uint64)disk.desc; + *R(VIRTIO_MMIO_QUEUE_DESC_HIGH) = (uint64)disk.desc >> 32; + *R(VIRTIO_MMIO_DRIVER_DESC_LOW) = (uint64)disk.avail; + *R(VIRTIO_MMIO_DRIVER_DESC_HIGH) = (uint64)disk.avail >> 32; + *R(VIRTIO_MMIO_DEVICE_DESC_LOW) = (uint64)disk.used; + *R(VIRTIO_MMIO_DEVICE_DESC_HIGH) = (uint64)disk.used >> 32; + + // queue is ready. + *R(VIRTIO_MMIO_QUEUE_READY) = 0x1; + + // all NUM descriptors start out unused. + for(int i = 0; i < NUM; i++) + disk.free[i] = 1; + + // tell device we're completely ready. + status |= VIRTIO_CONFIG_S_DRIVER_OK; + *R(VIRTIO_MMIO_STATUS) = status; + + // plic.c and trap.c arrange for interrupts from VIRTIO0_IRQ. +} + +// find a free descriptor, mark it non-free, return its index. +static int +alloc_desc() +{ + for(int i = 0; i < NUM; i++){ + if(disk.free[i]){ + disk.free[i] = 0; + return i; + } + } + return -1; +} + +// mark a descriptor as free. +static void +free_desc(int i) +{ + if(i >= NUM) + panic("free_desc 1"); + if(disk.free[i]) + panic("free_desc 2"); + disk.desc[i].addr = 0; + disk.desc[i].len = 0; + disk.desc[i].flags = 0; + disk.desc[i].next = 0; + disk.free[i] = 1; + wakeup(&disk.free[0]); +} + +// free a chain of descriptors. +static void +free_chain(int i) +{ + while(1){ + int flag = disk.desc[i].flags; + int nxt = disk.desc[i].next; + free_desc(i); + if(flag & VRING_DESC_F_NEXT) + i = nxt; + else + break; + } +} + +// allocate three descriptors (they need not be contiguous). +// disk transfers always use three descriptors. +static int +alloc3_desc(int *idx) +{ + for(int i = 0; i < 3; i++){ + idx[i] = alloc_desc(); + if(idx[i] < 0){ + for(int j = 0; j < i; j++) + free_desc(idx[j]); + return -1; + } + } + return 0; +} + +void +virtio_disk_rw(struct buf *b, int write) +{ + uint64 sector = b->blockno * (BSIZE / 512); + + acquire(&disk.vdisk_lock); + + // the spec's Section 5.2 says that legacy block operations use + // three descriptors: one for type/reserved/sector, one for the + // data, one for a 1-byte status result. + + // allocate the three descriptors. + int idx[3]; + while(1){ + if(alloc3_desc(idx) == 0) { + break; + } + sleep(&disk.free[0], &disk.vdisk_lock); + } + + // format the three descriptors. + // qemu's virtio-blk.c reads them. + + struct virtio_blk_req *buf0 = &disk.ops[idx[0]]; + + if(write) + buf0->type = VIRTIO_BLK_T_OUT; // write the disk + else + buf0->type = VIRTIO_BLK_T_IN; // read the disk + buf0->reserved = 0; + buf0->sector = sector; + + disk.desc[idx[0]].addr = (uint64) buf0; + disk.desc[idx[0]].len = sizeof(struct virtio_blk_req); + disk.desc[idx[0]].flags = VRING_DESC_F_NEXT; + 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 + else + disk.desc[idx[1]].flags = VRING_DESC_F_WRITE; // device writes b->data + disk.desc[idx[1]].flags |= VRING_DESC_F_NEXT; + disk.desc[idx[1]].next = idx[2]; + + disk.info[idx[0]].status = 0xff; // device writes 0 on success + disk.desc[idx[2]].addr = (uint64) &disk.info[idx[0]].status; + disk.desc[idx[2]].len = 1; + disk.desc[idx[2]].flags = VRING_DESC_F_WRITE; // device writes the status + disk.desc[idx[2]].next = 0; + + // record struct buf for virtio_disk_intr(). + b->disk = 1; + disk.info[idx[0]].b = b; + + // tell the device the first index in our chain of descriptors. + disk.avail->ring[disk.avail->idx % NUM] = idx[0]; + + __sync_synchronize(); + + // tell the device another avail ring entry is available. + disk.avail->idx += 1; // not % NUM ... + + __sync_synchronize(); + + *R(VIRTIO_MMIO_QUEUE_NOTIFY) = 0; // value is queue number + + // Wait for virtio_disk_intr() to say request has finished. + while(b->disk == 1) { + sleep(b, &disk.vdisk_lock); + } + + disk.info[idx[0]].b = 0; + free_chain(idx[0]); + + release(&disk.vdisk_lock); +} + +void +virtio_disk_intr() +{ + acquire(&disk.vdisk_lock); + + // the device won't raise another interrupt until we tell it + // we've seen this interrupt, which the following line does. + // this may race with the device writing new entries to + // the "used" ring, in which case we may process the new + // completion entries in this interrupt, and have nothing to do + // in the next interrupt, which is harmless. + *R(VIRTIO_MMIO_INTERRUPT_ACK) = *R(VIRTIO_MMIO_INTERRUPT_STATUS) & 0x3; + + __sync_synchronize(); + + // the device increments disk.used->idx when it + // adds an entry to the used ring. + + while(disk.used_idx != disk.used->idx){ + __sync_synchronize(); + int id = disk.used->ring[disk.used_idx % NUM].id; + + if(disk.info[id].status != 0) + panic("virtio_disk_intr status"); + + struct buf *b = disk.info[id].b; + b->disk = 0; // disk is done with buf + wakeup(b); + + disk.used_idx += 1; + } + + release(&disk.vdisk_lock); +} diff --git a/G12_Project2_2/kernel/virtio_disk.d b/G12_Project2_2/kernel/virtio_disk.d new file mode 100644 index 0000000000..1ed6176dfa --- /dev/null +++ b/G12_Project2_2/kernel/virtio_disk.d @@ -0,0 +1,3 @@ +kernel/virtio_disk.o: kernel/virtio_disk.c kernel/types.h kernel/riscv.h \ + kernel/defs.h kernel/param.h kernel/memlayout.h kernel/spinlock.h \ + kernel/sleeplock.h kernel/fs.h kernel/buf.h kernel/virtio.h diff --git a/G12_Project2_2/kernel/virtio_disk.o b/G12_Project2_2/kernel/virtio_disk.o new file mode 100644 index 0000000000..13d256c45e Binary files /dev/null and b/G12_Project2_2/kernel/virtio_disk.o differ diff --git a/G12_Project2_2/kernel/vm.c b/G12_Project2_2/kernel/vm.c new file mode 100644 index 0000000000..28f42482c2 --- /dev/null +++ b/G12_Project2_2/kernel/vm.c @@ -0,0 +1,486 @@ +#include "param.h" +#include "types.h" +#include "memlayout.h" +#include "elf.h" +#include "riscv.h" +#include "defs.h" +#include "spinlock.h" +#include "proc.h" +#include "fs.h" + +/* + * the kernel's page table. + */ +pagetable_t kernel_pagetable; + +extern char etext[]; // kernel.ld sets this to end of kernel code. + +extern char trampoline[]; // trampoline.S + +// Make a direct-map page table for the kernel. +pagetable_t +kvmmake(void) +{ + pagetable_t kpgtbl; + + kpgtbl = (pagetable_t) kalloc(); + memset(kpgtbl, 0, PGSIZE); + + // uart registers + kvmmap(kpgtbl, UART0, UART0, PGSIZE, PTE_R | PTE_W); + + // virtio mmio disk interface + kvmmap(kpgtbl, VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W); + + // PLIC + kvmmap(kpgtbl, PLIC, PLIC, 0x4000000, PTE_R | PTE_W); + + // map kernel text executable and read-only. + kvmmap(kpgtbl, KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X); + + // map kernel data and the physical RAM we'll make use of. + kvmmap(kpgtbl, (uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W); + + // map the trampoline for trap entry/exit to + // the highest virtual address in the kernel. + kvmmap(kpgtbl, TRAMPOLINE, (uint64)trampoline, PGSIZE, PTE_R | PTE_X); + + // allocate and map a kernel stack for each process. + proc_mapstacks(kpgtbl); + + return kpgtbl; +} + +// add a mapping to the kernel page table. +// only used when booting. +// does not flush TLB or enable paging. +void +kvmmap(pagetable_t kpgtbl, uint64 va, uint64 pa, uint64 sz, int perm) +{ + if(mappages(kpgtbl, va, sz, pa, perm) != 0) + panic("kvmmap"); +} + +// Initialize the kernel_pagetable, shared by all CPUs. +void +kvminit(void) +{ + kernel_pagetable = kvmmake(); +} + +// Switch the current CPU's h/w page table register to +// the kernel's page table, and enable paging. +void +kvminithart() +{ + // wait for any previous writes to the page table memory to finish. + sfence_vma(); + + w_satp(MAKE_SATP(kernel_pagetable)); + + // flush stale entries from the TLB. + sfence_vma(); +} + +// Return the address of the PTE in page table pagetable +// that corresponds to virtual address va. If alloc!=0, +// create any required page-table pages. +// +// The risc-v Sv39 scheme has three levels of page-table +// pages. A page-table page contains 512 64-bit PTEs. +// A 64-bit virtual address is split into five fields: +// 39..63 -- must be zero. +// 30..38 -- 9 bits of level-2 index. +// 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) +{ + if(va >= MAXVA) + panic("walk"); + + for(int level = 2; level > 0; level--) { + pte_t *pte = &pagetable[PX(level, va)]; + if(*pte & PTE_V) { + pagetable = (pagetable_t)PTE2PA(*pte); + } else { + if(!alloc || (pagetable = (pde_t*)kalloc()) == 0) + return 0; + memset(pagetable, 0, PGSIZE); + *pte = PA2PTE(pagetable) | PTE_V; + } + } + return &pagetable[PX(0, va)]; +} + +// Look up a virtual address, return the physical address, +// or 0 if not mapped. +// Can only be used to look up user pages. +uint64 +walkaddr(pagetable_t pagetable, uint64 va) +{ + pte_t *pte; + uint64 pa; + + if(va >= MAXVA) + return 0; + + pte = walk(pagetable, va, 0); + if(pte == 0) + return 0; + if((*pte & PTE_V) == 0) + return 0; + if((*pte & PTE_U) == 0) + return 0; + pa = PTE2PA(*pte); + return pa; +} + +// Create PTEs for virtual addresses starting at va that refer to +// physical addresses starting at pa. +// va and size MUST be page-aligned. +// Returns 0 on success, -1 if walk() couldn't +// allocate a needed page-table page. +int +mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) +{ + uint64 a, last; + pte_t *pte; + + if((va % PGSIZE) != 0) + panic("mappages: va not aligned"); + + if((size % PGSIZE) != 0) + panic("mappages: size not aligned"); + + if(size == 0) + panic("mappages: size"); + + a = va; + last = va + size - PGSIZE; + for(;;){ + if((pte = walk(pagetable, a, 1)) == 0) + return -1; + if(*pte & PTE_V) + panic("mappages: remap"); + *pte = PA2PTE(pa) | perm | PTE_V; + if(a == last) + break; + a += PGSIZE; + pa += PGSIZE; + } + return 0; +} + +// create an empty user page table. +// returns 0 if out of memory. +pagetable_t +uvmcreate() +{ + pagetable_t pagetable; + pagetable = (pagetable_t) kalloc(); + if(pagetable == 0) + return 0; + memset(pagetable, 0, PGSIZE); + return pagetable; +} + +// Remove npages of mappings starting from va. va must be +// page-aligned. It's OK if the mappings don't exist. +// Optionally free the physical memory. +void +uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) +{ + uint64 a; + pte_t *pte; + + if((va % PGSIZE) != 0) + panic("uvmunmap: not aligned"); + + for(a = va; a < va + npages*PGSIZE; a += PGSIZE){ + if((pte = walk(pagetable, a, 0)) == 0) // leaf page table entry allocated? + continue; + if((*pte & PTE_V) == 0) // has physical page been allocated? + continue; + if(do_free){ + uint64 pa = PTE2PA(*pte); + kfree((void*)pa); + } + *pte = 0; + } +} + +// Allocate PTEs and physical memory to grow a process from oldsz to +// newsz, which need not be page aligned. Returns new size or 0 on error. +uint64 +uvmalloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz, int xperm) +{ + char *mem; + uint64 a; + + if(newsz < oldsz) + return oldsz; + + oldsz = PGROUNDUP(oldsz); + for(a = oldsz; a < newsz; a += PGSIZE){ + mem = kalloc(); + if(mem == 0){ + uvmdealloc(pagetable, a, oldsz); + return 0; + } + memset(mem, 0, PGSIZE); + if(mappages(pagetable, a, PGSIZE, (uint64)mem, PTE_R|PTE_U|xperm) != 0){ + kfree(mem); + uvmdealloc(pagetable, a, oldsz); + return 0; + } + } + return newsz; +} + +// Deallocate user pages to bring the process size from oldsz to +// newsz. oldsz and newsz need not be page-aligned, nor does newsz +// need to be less than oldsz. oldsz can be larger than the actual +// process size. Returns the new process size. +uint64 +uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz) +{ + if(newsz >= oldsz) + return oldsz; + + if(PGROUNDUP(newsz) < PGROUNDUP(oldsz)){ + int npages = (PGROUNDUP(oldsz) - PGROUNDUP(newsz)) / PGSIZE; + uvmunmap(pagetable, PGROUNDUP(newsz), npages, 1); + } + + return newsz; +} + +// Recursively free page-table pages. +// All leaf mappings must already have been removed. +void +freewalk(pagetable_t pagetable) +{ + // there are 2^9 = 512 PTEs in a page table. + for(int i = 0; i < 512; i++){ + pte_t pte = pagetable[i]; + if((pte & PTE_V) && (pte & (PTE_R|PTE_W|PTE_X)) == 0){ + // this PTE points to a lower-level page table. + uint64 child = PTE2PA(pte); + freewalk((pagetable_t)child); + pagetable[i] = 0; + } else if(pte & PTE_V){ + panic("freewalk: leaf"); + } + } + kfree((void*)pagetable); +} + +// Free user memory pages, +// then free page-table pages. +void +uvmfree(pagetable_t pagetable, uint64 sz) +{ + if(sz > 0) + uvmunmap(pagetable, 0, PGROUNDUP(sz)/PGSIZE, 1); + freewalk(pagetable); +} + +// Given a parent process's page table, copy +// its memory into a child's page table. +// Copies both the page table and the +// physical memory. +// returns 0 on success, -1 on failure. +// frees any allocated pages on failure. +int +uvmcopy(pagetable_t old, pagetable_t new, uint64 sz) +{ + pte_t *pte; + uint64 pa, i; + uint flags; + char *mem; + + for(i = 0; i < sz; i += PGSIZE){ + if((pte = walk(old, i, 0)) == 0) + continue; // page table entry hasn't been allocated + if((*pte & PTE_V) == 0) + continue; // physical page hasn't been allocated + pa = PTE2PA(*pte); + flags = PTE_FLAGS(*pte); + if((mem = kalloc()) == 0) + goto err; + memmove(mem, (char*)pa, PGSIZE); + if(mappages(new, i, PGSIZE, (uint64)mem, flags) != 0){ + kfree(mem); + goto err; + } + } + return 0; + + err: + uvmunmap(new, 0, i / PGSIZE, 1); + return -1; +} + +// mark a PTE invalid for user access. +// used by exec for the user stack guard page. +void +uvmclear(pagetable_t pagetable, uint64 va) +{ + pte_t *pte; + + pte = walk(pagetable, va, 0); + if(pte == 0) + panic("uvmclear"); + *pte &= ~PTE_U; +} + +// Copy from kernel to user. +// Copy len bytes from src to virtual address dstva in a given page table. +// Return 0 on success, -1 on error. +int +copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len) +{ + uint64 n, va0, pa0; + pte_t *pte; + + while(len > 0){ + va0 = PGROUNDDOWN(dstva); + if(va0 >= MAXVA) + return -1; + + pa0 = walkaddr(pagetable, va0); + if(pa0 == 0) { + if((pa0 = vmfault(pagetable, va0, 0)) == 0) { + return -1; + } + } + + pte = walk(pagetable, va0, 0); + // forbid copyout over read-only user text pages. + if((*pte & PTE_W) == 0) + return -1; + + n = PGSIZE - (dstva - va0); + if(n > len) + n = len; + memmove((void *)(pa0 + (dstva - va0)), src, n); + + len -= n; + src += n; + dstva = va0 + PGSIZE; + } + return 0; +} + +// Copy from user to kernel. +// Copy len bytes to dst from virtual address srcva in a given page table. +// Return 0 on success, -1 on error. +int +copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len) +{ + uint64 n, va0, pa0; + + while(len > 0){ + va0 = PGROUNDDOWN(srcva); + pa0 = walkaddr(pagetable, va0); + if(pa0 == 0) { + if((pa0 = vmfault(pagetable, va0, 0)) == 0) { + return -1; + } + } + n = PGSIZE - (srcva - va0); + if(n > len) + n = len; + memmove(dst, (void *)(pa0 + (srcva - va0)), n); + + len -= n; + dst += n; + srcva = va0 + PGSIZE; + } + return 0; +} + +// Copy a null-terminated string from user to kernel. +// Copy bytes to dst from virtual address srcva in a given page table, +// until a '\0', or max. +// Return 0 on success, -1 on error. +int +copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) +{ + uint64 n, va0, pa0; + int got_null = 0; + + while(got_null == 0 && max > 0){ + va0 = PGROUNDDOWN(srcva); + pa0 = walkaddr(pagetable, va0); + if(pa0 == 0) + return -1; + n = PGSIZE - (srcva - va0); + if(n > max) + n = max; + + char *p = (char *) (pa0 + (srcva - va0)); + while(n > 0){ + if(*p == '\0'){ + *dst = '\0'; + got_null = 1; + break; + } else { + *dst = *p; + } + --n; + --max; + p++; + dst++; + } + + srcva = va0 + PGSIZE; + } + if(got_null){ + return 0; + } else { + return -1; + } +} + +// allocate and map user memory if process is referencing a page +// that was lazily allocated in sys_sbrk(). +// returns 0 if va is invalid or already mapped, or if +// out of physical memory, and physical address if successful. +uint64 +vmfault(pagetable_t pagetable, uint64 va, int read) +{ + uint64 mem; + struct proc *p = myproc(); + + if (va >= p->sz) + return 0; + va = PGROUNDDOWN(va); + if(ismapped(pagetable, va)) { + return 0; + } + mem = (uint64) kalloc(); + if(mem == 0) + return 0; + memset((void *) mem, 0, PGSIZE); + if (mappages(p->pagetable, va, PGSIZE, mem, PTE_W|PTE_U|PTE_R) != 0) { + kfree((void *)mem); + return 0; + } + return mem; +} + +int +ismapped(pagetable_t pagetable, uint64 va) +{ + pte_t *pte = walk(pagetable, va, 0); + if (pte == 0) { + return 0; + } + if (*pte & PTE_V){ + return 1; + } + return 0; +} diff --git a/G12_Project2_2/kernel/vm.d b/G12_Project2_2/kernel/vm.d new file mode 100644 index 0000000000..4b73decb4c --- /dev/null +++ b/G12_Project2_2/kernel/vm.d @@ -0,0 +1,3 @@ +kernel/vm.o: kernel/vm.c kernel/param.h kernel/types.h kernel/memlayout.h \ + kernel/elf.h kernel/riscv.h kernel/defs.h kernel/spinlock.h \ + kernel/proc.h kernel/fs.h diff --git a/G12_Project2_2/kernel/vm.h b/G12_Project2_2/kernel/vm.h new file mode 100644 index 0000000000..3145dca4e4 --- /dev/null +++ b/G12_Project2_2/kernel/vm.h @@ -0,0 +1,2 @@ +#define SBRK_EAGER 1 +#define SBRK_LAZY 2 diff --git a/G12_Project2_2/kernel/vm.o b/G12_Project2_2/kernel/vm.o new file mode 100644 index 0000000000..c5b3f0566b Binary files /dev/null and b/G12_Project2_2/kernel/vm.o differ diff --git a/G12_Project2_2/mkfs/mkfs b/G12_Project2_2/mkfs/mkfs new file mode 100755 index 0000000000..86ca58cd2b Binary files /dev/null and b/G12_Project2_2/mkfs/mkfs differ diff --git a/G12_Project2_2/mkfs/mkfs.c b/G12_Project2_2/mkfs/mkfs.c new file mode 100644 index 0000000000..5f080bc74f --- /dev/null +++ b/G12_Project2_2/mkfs/mkfs.c @@ -0,0 +1,303 @@ +#include +#include +#include +#include +#include +#include + +#define stat xv6_stat // avoid clash with host struct stat +#include "kernel/types.h" +#include "kernel/fs.h" +#include "kernel/stat.h" +#include "kernel/param.h" + +#ifndef static_assert +#define static_assert(a, b) do { switch (0) case 0: case (a): ; } while (0) +#endif + +#define NINODES 200 + +// Disk layout: +// [ boot block | sb block | log | inode blocks | free bit map | data blocks ] + +int nbitmap = FSSIZE/BPB + 1; +int ninodeblocks = NINODES / IPB + 1; +int nlog = LOGBLOCKS+1; // Header followed by LOGBLOCKS data blocks. +int nmeta; // Number of meta blocks (boot, sb, nlog, inode, bitmap) +int nblocks; // Number of data blocks + +int fsfd; +struct superblock sb; +char zeroes[BSIZE]; +uint freeinode = 1; +uint freeblock; + + +void balloc(int); +void wsect(uint, void*); +void winode(uint, struct dinode*); +void rinode(uint inum, struct dinode *ip); +void rsect(uint sec, void *buf); +uint ialloc(ushort type); +void iappend(uint inum, void *p, int n); +void die(const char *); + +// convert to riscv byte order +ushort +xshort(ushort x) +{ + ushort y; + uchar *a = (uchar*)&y; + a[0] = x; + a[1] = x >> 8; + return y; +} + +uint +xint(uint x) +{ + uint y; + uchar *a = (uchar*)&y; + a[0] = x; + a[1] = x >> 8; + a[2] = x >> 16; + a[3] = x >> 24; + return y; +} + +int +main(int argc, char *argv[]) +{ + int i, cc, fd; + uint rootino, inum, off; + struct dirent de; + char buf[BSIZE]; + struct dinode din; + + + static_assert(sizeof(int) == 4, "Integers must be 4 bytes!"); + + if(argc < 2){ + fprintf(stderr, "Usage: mkfs fs.img files...\n"); + exit(1); + } + + assert((BSIZE % sizeof(struct dinode)) == 0); + assert((BSIZE % sizeof(struct dirent)) == 0); + + fsfd = open(argv[1], O_RDWR|O_CREAT|O_TRUNC, 0666); + if(fsfd < 0) + die(argv[1]); + + // 1 fs block = 1 disk sector + nmeta = 2 + nlog + ninodeblocks + nbitmap; + nblocks = FSSIZE - nmeta; + + sb.magic = FSMAGIC; + sb.size = xint(FSSIZE); + sb.nblocks = xint(nblocks); + sb.ninodes = xint(NINODES); + sb.nlog = xint(nlog); + sb.logstart = xint(2); + sb.inodestart = xint(2+nlog); + sb.bmapstart = xint(2+nlog+ninodeblocks); + + printf("nmeta %d (boot, super, log blocks %u, inode blocks %u, bitmap blocks %u) blocks %d total %d\n", + nmeta, nlog, ninodeblocks, nbitmap, nblocks, FSSIZE); + + freeblock = nmeta; // the first free block that we can allocate + + for(i = 0; i < FSSIZE; i++) + wsect(i, zeroes); + + memset(buf, 0, sizeof(buf)); + memmove(buf, &sb, sizeof(sb)); + wsect(1, buf); + + rootino = ialloc(T_DIR); + assert(rootino == ROOTINO); + + bzero(&de, sizeof(de)); + de.inum = xshort(rootino); + strcpy(de.name, "."); + iappend(rootino, &de, sizeof(de)); + + bzero(&de, sizeof(de)); + de.inum = xshort(rootino); + strcpy(de.name, ".."); + iappend(rootino, &de, sizeof(de)); + + for(i = 2; i < argc; i++){ + // get rid of "user/" + char *shortname; + if(strncmp(argv[i], "user/", 5) == 0) + shortname = argv[i] + 5; + else + shortname = argv[i]; + + assert(index(shortname, '/') == 0); + + if((fd = open(argv[i], 0)) < 0) + die(argv[i]); + + // Skip leading _ in name when writing to file system. + // The binaries are named _rm, _cat, etc. to keep the + // build operating system from trying to execute them + // in place of system binaries like rm and cat. + if(shortname[0] == '_') + shortname += 1; + + assert(strlen(shortname) <= DIRSIZ); + + inum = ialloc(T_FILE); + + bzero(&de, sizeof(de)); + de.inum = xshort(inum); + strncpy(de.name, shortname, DIRSIZ); + iappend(rootino, &de, sizeof(de)); + + while((cc = read(fd, buf, sizeof(buf))) > 0) + iappend(inum, buf, cc); + + close(fd); + } + + // fix size of root inode dir + rinode(rootino, &din); + off = xint(din.size); + off = ((off/BSIZE) + 1) * BSIZE; + din.size = xint(off); + winode(rootino, &din); + + balloc(freeblock); + + exit(0); +} + +void +wsect(uint sec, void *buf) +{ + if(lseek(fsfd, sec * BSIZE, 0) != sec * BSIZE) + die("lseek"); + if(write(fsfd, buf, BSIZE) != BSIZE) + die("write"); +} + +void +winode(uint inum, struct dinode *ip) +{ + char buf[BSIZE]; + uint bn; + struct dinode *dip; + + bn = IBLOCK(inum, sb); + rsect(bn, buf); + dip = ((struct dinode*)buf) + (inum % IPB); + *dip = *ip; + wsect(bn, buf); +} + +void +rinode(uint inum, struct dinode *ip) +{ + char buf[BSIZE]; + uint bn; + struct dinode *dip; + + bn = IBLOCK(inum, sb); + rsect(bn, buf); + dip = ((struct dinode*)buf) + (inum % IPB); + *ip = *dip; +} + +void +rsect(uint sec, void *buf) +{ + if(lseek(fsfd, sec * BSIZE, 0) != sec * BSIZE) + die("lseek"); + if(read(fsfd, buf, BSIZE) != BSIZE) + die("read"); +} + +uint +ialloc(ushort type) +{ + uint inum = freeinode++; + struct dinode din; + + bzero(&din, sizeof(din)); + din.type = xshort(type); + din.nlink = xshort(1); + din.size = xint(0); + winode(inum, &din); + return inum; +} + +void +balloc(int used) +{ + uchar buf[BSIZE]; + int i; + + printf("balloc: first %d blocks have been allocated\n", used); + assert(used < BPB); + bzero(buf, BSIZE); + for(i = 0; i < used; i++){ + buf[i/8] = buf[i/8] | (0x1 << (i%8)); + } + printf("balloc: write bitmap block at sector %d\n", sb.bmapstart); + wsect(sb.bmapstart, buf); +} + +#define min(a, b) ((a) < (b) ? (a) : (b)) + +void +iappend(uint inum, void *xp, int n) +{ + char *p = (char*)xp; + uint fbn, off, n1; + struct dinode din; + char buf[BSIZE]; + uint indirect[NINDIRECT]; + uint x; + + rinode(inum, &din); + off = xint(din.size); + // printf("append inum %d at off %d sz %d\n", inum, off, n); + while(n > 0){ + fbn = off / BSIZE; + assert(fbn < MAXFILE); + if(fbn < NDIRECT){ + if(xint(din.addrs[fbn]) == 0){ + din.addrs[fbn] = xint(freeblock++); + } + x = xint(din.addrs[fbn]); + } else { + if(xint(din.addrs[NDIRECT]) == 0){ + din.addrs[NDIRECT] = xint(freeblock++); + } + rsect(xint(din.addrs[NDIRECT]), (char*)indirect); + if(indirect[fbn - NDIRECT] == 0){ + indirect[fbn - NDIRECT] = xint(freeblock++); + wsect(xint(din.addrs[NDIRECT]), (char*)indirect); + } + x = xint(indirect[fbn-NDIRECT]); + } + n1 = min(n, (fbn + 1) * BSIZE - off); + rsect(x, buf); + bcopy(p, buf + off - (fbn * BSIZE), n1); + wsect(x, buf); + n -= n1; + off += n1; + p += n1; + } + din.size = xint(off); + winode(inum, &din); +} + +void +die(const char *s) +{ + perror(s); + exit(1); +} diff --git a/G12_Project2_2/mlfq b/G12_Project2_2/mlfq new file mode 100755 index 0000000000..c35493ec89 Binary files /dev/null and b/G12_Project2_2/mlfq differ diff --git a/G12_Project2_2/mlfq.c b/G12_Project2_2/mlfq.c new file mode 100644 index 0000000000..1ef3831a45 --- /dev/null +++ b/G12_Project2_2/mlfq.c @@ -0,0 +1,81 @@ +#include + +#define MAX 10 + +typedef struct { + int id; + int at, bt; + int rt; // remaining time + int ct, tat, wt; + int qlevel; // current queue + int qticks; // ticks used in current queue +} Process; + +int tq[3] = {1, 2, 4}; + +int main() { + int n = 3; + + Process p[MAX] = { + {1, 0, 5, 5, 0, 0, 0, 0, 0}, + {2, 1, 3, 3, 0, 0, 0, 0, 0}, + {3, 2, 4, 4, 0, 0, 0, 0, 0} + }; + + int time = 0, completed = 0; + + printf("Timeline:\n"); + + while (completed < n) { + int found = 0; + + for (int q = 0; q < 3; q++) { + for (int i = 0; i < n; i++) { + if (p[i].at <= time && p[i].rt > 0 && p[i].qlevel == q) { + + printf("Time %d: P%d (Q%d)\n", time, p[i].id, q); + + p[i].rt--; + p[i].qticks++; + time++; + found = 1; + + // if finished + if (p[i].rt == 0) { + p[i].ct = time; + completed++; + p[i].qticks = 0; + } + // if time slice exhausted → demote + else if (p[i].qticks == tq[q]) { + if (p[i].qlevel < 2) + p[i].qlevel++; + + p[i].qticks = 0; + } + + break; + } + } + if (found) break; + } + + if (!found) { + printf("Time %d: Idle\n", time); + time++; + } + } + + printf("\nPID\tAT\tBT\tCT\tTAT\tWT\n"); + + for (int i = 0; i < n; i++) { + p[i].tat = p[i].ct - p[i].at; + p[i].wt = p[i].tat - p[i].bt; + + printf("P%d\t%d\t%d\t%d\t%d\t%d\n", + p[i].id, p[i].at, p[i].bt, + p[i].ct, p[i].tat, p[i].wt); + } + + return 0; +} diff --git a/G12_Project2_2/mlfq.pdf b/G12_Project2_2/mlfq.pdf new file mode 100755 index 0000000000..55d67ce4e6 Binary files /dev/null and b/G12_Project2_2/mlfq.pdf differ diff --git a/test-xv6.py b/G12_Project2_2/test-xv6.py similarity index 100% rename from test-xv6.py rename to G12_Project2_2/test-xv6.py diff --git a/G12_Project2_2/user/_cat b/G12_Project2_2/user/_cat new file mode 100755 index 0000000000..3d0b6d8550 Binary files /dev/null and b/G12_Project2_2/user/_cat differ diff --git a/G12_Project2_2/user/_dorphan b/G12_Project2_2/user/_dorphan new file mode 100755 index 0000000000..835d6440c1 Binary files /dev/null and b/G12_Project2_2/user/_dorphan differ diff --git a/G12_Project2_2/user/_echo b/G12_Project2_2/user/_echo new file mode 100755 index 0000000000..89635a8b49 Binary files /dev/null and b/G12_Project2_2/user/_echo differ diff --git a/G12_Project2_2/user/_forktest b/G12_Project2_2/user/_forktest new file mode 100755 index 0000000000..3c565d5d64 Binary files /dev/null and b/G12_Project2_2/user/_forktest differ diff --git a/G12_Project2_2/user/_forphan b/G12_Project2_2/user/_forphan new file mode 100755 index 0000000000..b01a88a335 Binary files /dev/null and b/G12_Project2_2/user/_forphan differ diff --git a/G12_Project2_2/user/_grep b/G12_Project2_2/user/_grep new file mode 100755 index 0000000000..e5d3b7b0e6 Binary files /dev/null and b/G12_Project2_2/user/_grep differ diff --git a/G12_Project2_2/user/_grind b/G12_Project2_2/user/_grind new file mode 100755 index 0000000000..06fad1110e Binary files /dev/null and b/G12_Project2_2/user/_grind differ diff --git a/G12_Project2_2/user/_init b/G12_Project2_2/user/_init new file mode 100755 index 0000000000..5a479c87d1 Binary files /dev/null and b/G12_Project2_2/user/_init differ diff --git a/G12_Project2_2/user/_kill b/G12_Project2_2/user/_kill new file mode 100755 index 0000000000..004d21b4a4 Binary files /dev/null and b/G12_Project2_2/user/_kill differ diff --git a/G12_Project2_2/user/_ln b/G12_Project2_2/user/_ln new file mode 100755 index 0000000000..f1ff75f7ca Binary files /dev/null and b/G12_Project2_2/user/_ln differ diff --git a/G12_Project2_2/user/_logstress b/G12_Project2_2/user/_logstress new file mode 100755 index 0000000000..11f194d315 Binary files /dev/null and b/G12_Project2_2/user/_logstress differ diff --git a/G12_Project2_2/user/_ls b/G12_Project2_2/user/_ls new file mode 100755 index 0000000000..d89ec7c13d Binary files /dev/null and b/G12_Project2_2/user/_ls differ diff --git a/G12_Project2_2/user/_mkdir b/G12_Project2_2/user/_mkdir new file mode 100755 index 0000000000..10c7016708 Binary files /dev/null and b/G12_Project2_2/user/_mkdir differ diff --git a/G12_Project2_2/user/_rm b/G12_Project2_2/user/_rm new file mode 100755 index 0000000000..e68aaaba9b Binary files /dev/null and b/G12_Project2_2/user/_rm differ diff --git a/G12_Project2_2/user/_sh b/G12_Project2_2/user/_sh new file mode 100755 index 0000000000..2d53c57fcf Binary files /dev/null and b/G12_Project2_2/user/_sh differ diff --git a/G12_Project2_2/user/_stressfs b/G12_Project2_2/user/_stressfs new file mode 100755 index 0000000000..c390554856 Binary files /dev/null and b/G12_Project2_2/user/_stressfs differ diff --git a/G12_Project2_2/user/_usertests b/G12_Project2_2/user/_usertests new file mode 100755 index 0000000000..8c053039a9 Binary files /dev/null and b/G12_Project2_2/user/_usertests differ diff --git a/G12_Project2_2/user/_wc b/G12_Project2_2/user/_wc new file mode 100755 index 0000000000..5ab3f1e6ce Binary files /dev/null and b/G12_Project2_2/user/_wc differ diff --git a/G12_Project2_2/user/_zombie b/G12_Project2_2/user/_zombie new file mode 100755 index 0000000000..696e3ede71 Binary files /dev/null and b/G12_Project2_2/user/_zombie differ diff --git a/G12_Project2_2/user/cat.asm b/G12_Project2_2/user/cat.asm new file mode 100644 index 0000000000..e89013afc9 --- /dev/null +++ b/G12_Project2_2/user/cat.asm @@ -0,0 +1,1580 @@ + +user/_cat: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + +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: 00090913 mv s2,s2 + 18: 20000613 li a2,512 + 1c: 85ca mv a1,s2 + 1e: 854e mv a0,s3 + 20: 376000ef jal 396 + 24: 84aa mv s1,a0 + 26: 02a05363 blez a0,4c + if (write(1, buf, n) != n) { + 2a: 8626 mv a2,s1 + 2c: 85ca mv a1,s2 + 2e: 4505 li a0,1 + 30: 36e000ef jal 39e + 34: fe9502e3 beq a0,s1,18 + fprintf(2, "cat: write error\n"); + 38: 00001597 auipc a1,0x1 + 3c: 92858593 addi a1,a1,-1752 # 960 + 40: 4509 li a0,2 + 42: 73a000ef jal 77c + exit(1); + 46: 4505 li a0,1 + 48: 336000ef jal 37e + } + } + if(n < 0){ + 4c: 00054963 bltz a0,5e + fprintf(2, "cat: read error\n"); + exit(1); + } +} + 50: 70a2 ld ra,40(sp) + 52: 7402 ld s0,32(sp) + 54: 64e2 ld s1,24(sp) + 56: 6942 ld s2,16(sp) + 58: 69a2 ld s3,8(sp) + 5a: 6145 addi sp,sp,48 + 5c: 8082 ret + fprintf(2, "cat: read error\n"); + 5e: 00001597 auipc a1,0x1 + 62: 91a58593 addi a1,a1,-1766 # 978 + 66: 4509 li a0,2 + 68: 714000ef jal 77c + exit(1); + 6c: 4505 li a0,1 + 6e: 310000ef jal 37e + +0000000000000072
: + +int +main(int argc, char *argv[]) +{ + 72: 7179 addi sp,sp,-48 + 74: f406 sd ra,40(sp) + 76: f022 sd s0,32(sp) + 78: 1800 addi s0,sp,48 + int fd, i; + + if(argc <= 1){ + 7a: 4785 li a5,1 + 7c: 04a7d263 bge a5,a0,c0 + 80: ec26 sd s1,24(sp) + 82: e84a sd s2,16(sp) + 84: e44e sd s3,8(sp) + 86: 00858913 addi s2,a1,8 + 8a: ffe5099b addiw s3,a0,-2 + 8e: 02099793 slli a5,s3,0x20 + 92: 01d7d993 srli s3,a5,0x1d + 96: 05c1 addi a1,a1,16 + 98: 99ae add s3,s3,a1 + cat(0); + exit(0); + } + + for(i = 1; i < argc; i++){ + if((fd = open(argv[i], O_RDONLY)) < 0){ + 9a: 4581 li a1,0 + 9c: 00093503 ld a0,0(s2) # 1010 + a0: 31e000ef jal 3be + a4: 84aa mv s1,a0 + a6: 02054663 bltz a0,d2 + fprintf(2, "cat: cannot open %s\n", argv[i]); + exit(1); + } + cat(fd); + aa: f57ff0ef jal 0 + close(fd); + ae: 8526 mv a0,s1 + b0: 2f6000ef jal 3a6 + for(i = 1; i < argc; i++){ + b4: 0921 addi s2,s2,8 + b6: ff3912e3 bne s2,s3,9a + } + exit(0); + ba: 4501 li a0,0 + bc: 2c2000ef jal 37e + c0: ec26 sd s1,24(sp) + c2: e84a sd s2,16(sp) + c4: e44e sd s3,8(sp) + cat(0); + c6: 4501 li a0,0 + c8: f39ff0ef jal 0 + exit(0); + cc: 4501 li a0,0 + ce: 2b0000ef jal 37e + fprintf(2, "cat: cannot open %s\n", argv[i]); + d2: 00093603 ld a2,0(s2) + d6: 00001597 auipc a1,0x1 + da: 8ba58593 addi a1,a1,-1862 # 990 + de: 4509 li a0,2 + e0: 69c000ef jal 77c + exit(1); + e4: 4505 li a0,1 + e6: 298000ef jal 37e + +00000000000000ea : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + ea: 1141 addi sp,sp,-16 + ec: e406 sd ra,8(sp) + ee: e022 sd s0,0(sp) + f0: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + f2: f81ff0ef jal 72
+ exit(r); + f6: 288000ef jal 37e + +00000000000000fa : +} + +char* +strcpy(char *s, const char *t) +{ + fa: 1141 addi sp,sp,-16 + fc: e422 sd s0,8(sp) + fe: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 100: 87aa mv a5,a0 + 102: 0585 addi a1,a1,1 + 104: 0785 addi a5,a5,1 + 106: fff5c703 lbu a4,-1(a1) + 10a: fee78fa3 sb a4,-1(a5) + 10e: fb75 bnez a4,102 + ; + return os; +} + 110: 6422 ld s0,8(sp) + 112: 0141 addi sp,sp,16 + 114: 8082 ret + +0000000000000116 : + +int +strcmp(const char *p, const char *q) +{ + 116: 1141 addi sp,sp,-16 + 118: e422 sd s0,8(sp) + 11a: 0800 addi s0,sp,16 + while(*p && *p == *q) + 11c: 00054783 lbu a5,0(a0) + 120: cb91 beqz a5,134 + 122: 0005c703 lbu a4,0(a1) + 126: 00f71763 bne a4,a5,134 + p++, q++; + 12a: 0505 addi a0,a0,1 + 12c: 0585 addi a1,a1,1 + while(*p && *p == *q) + 12e: 00054783 lbu a5,0(a0) + 132: fbe5 bnez a5,122 + return (uchar)*p - (uchar)*q; + 134: 0005c503 lbu a0,0(a1) +} + 138: 40a7853b subw a0,a5,a0 + 13c: 6422 ld s0,8(sp) + 13e: 0141 addi sp,sp,16 + 140: 8082 ret + +0000000000000142 : + +uint +strlen(const char *s) +{ + 142: 1141 addi sp,sp,-16 + 144: e422 sd s0,8(sp) + 146: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 148: 00054783 lbu a5,0(a0) + 14c: cf91 beqz a5,168 + 14e: 0505 addi a0,a0,1 + 150: 87aa mv a5,a0 + 152: 86be mv a3,a5 + 154: 0785 addi a5,a5,1 + 156: fff7c703 lbu a4,-1(a5) + 15a: ff65 bnez a4,152 + 15c: 40a6853b subw a0,a3,a0 + 160: 2505 addiw a0,a0,1 + ; + return n; +} + 162: 6422 ld s0,8(sp) + 164: 0141 addi sp,sp,16 + 166: 8082 ret + for(n = 0; s[n]; n++) + 168: 4501 li a0,0 + 16a: bfe5 j 162 + +000000000000016c : + +void* +memset(void *dst, int c, uint n) +{ + 16c: 1141 addi sp,sp,-16 + 16e: e422 sd s0,8(sp) + 170: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 172: ca19 beqz a2,188 + 174: 87aa mv a5,a0 + 176: 1602 slli a2,a2,0x20 + 178: 9201 srli a2,a2,0x20 + 17a: 00a60733 add a4,a2,a0 + cdst[i] = c; + 17e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 182: 0785 addi a5,a5,1 + 184: fee79de3 bne a5,a4,17e + } + return dst; +} + 188: 6422 ld s0,8(sp) + 18a: 0141 addi sp,sp,16 + 18c: 8082 ret + +000000000000018e : + +char* +strchr(const char *s, char c) +{ + 18e: 1141 addi sp,sp,-16 + 190: e422 sd s0,8(sp) + 192: 0800 addi s0,sp,16 + for(; *s; s++) + 194: 00054783 lbu a5,0(a0) + 198: cb99 beqz a5,1ae + if(*s == c) + 19a: 00f58763 beq a1,a5,1a8 + for(; *s; s++) + 19e: 0505 addi a0,a0,1 + 1a0: 00054783 lbu a5,0(a0) + 1a4: fbfd bnez a5,19a + return (char*)s; + return 0; + 1a6: 4501 li a0,0 +} + 1a8: 6422 ld s0,8(sp) + 1aa: 0141 addi sp,sp,16 + 1ac: 8082 ret + return 0; + 1ae: 4501 li a0,0 + 1b0: bfe5 j 1a8 + +00000000000001b2 : + +char* +gets(char *buf, int max) +{ + 1b2: 711d addi sp,sp,-96 + 1b4: ec86 sd ra,88(sp) + 1b6: e8a2 sd s0,80(sp) + 1b8: e4a6 sd s1,72(sp) + 1ba: e0ca sd s2,64(sp) + 1bc: fc4e sd s3,56(sp) + 1be: f852 sd s4,48(sp) + 1c0: f456 sd s5,40(sp) + 1c2: f05a sd s6,32(sp) + 1c4: ec5e sd s7,24(sp) + 1c6: 1080 addi s0,sp,96 + 1c8: 8baa mv s7,a0 + 1ca: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1cc: 892a mv s2,a0 + 1ce: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1d0: 4aa9 li s5,10 + 1d2: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1d4: 89a6 mv s3,s1 + 1d6: 2485 addiw s1,s1,1 + 1d8: 0344d663 bge s1,s4,204 + cc = read(0, &c, 1); + 1dc: 4605 li a2,1 + 1de: faf40593 addi a1,s0,-81 + 1e2: 4501 li a0,0 + 1e4: 1b2000ef jal 396 + if(cc < 1) + 1e8: 00a05e63 blez a0,204 + buf[i++] = c; + 1ec: faf44783 lbu a5,-81(s0) + 1f0: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1f4: 01578763 beq a5,s5,202 + 1f8: 0905 addi s2,s2,1 + 1fa: fd679de3 bne a5,s6,1d4 + buf[i++] = c; + 1fe: 89a6 mv s3,s1 + 200: a011 j 204 + 202: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 204: 99de add s3,s3,s7 + 206: 00098023 sb zero,0(s3) + return buf; +} + 20a: 855e mv a0,s7 + 20c: 60e6 ld ra,88(sp) + 20e: 6446 ld s0,80(sp) + 210: 64a6 ld s1,72(sp) + 212: 6906 ld s2,64(sp) + 214: 79e2 ld s3,56(sp) + 216: 7a42 ld s4,48(sp) + 218: 7aa2 ld s5,40(sp) + 21a: 7b02 ld s6,32(sp) + 21c: 6be2 ld s7,24(sp) + 21e: 6125 addi sp,sp,96 + 220: 8082 ret + +0000000000000222 : + +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: e04a sd s2,0(sp) + 22a: 1000 addi s0,sp,32 + 22c: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 22e: 4581 li a1,0 + 230: 18e000ef jal 3be + if(fd < 0) + 234: 02054263 bltz a0,258 + 238: e426 sd s1,8(sp) + 23a: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 23c: 85ca mv a1,s2 + 23e: 198000ef jal 3d6 + 242: 892a mv s2,a0 + close(fd); + 244: 8526 mv a0,s1 + 246: 160000ef jal 3a6 + return r; + 24a: 64a2 ld s1,8(sp) +} + 24c: 854a mv a0,s2 + 24e: 60e2 ld ra,24(sp) + 250: 6442 ld s0,16(sp) + 252: 6902 ld s2,0(sp) + 254: 6105 addi sp,sp,32 + 256: 8082 ret + return -1; + 258: 597d li s2,-1 + 25a: bfcd j 24c + +000000000000025c : + +int +atoi(const char *s) +{ + 25c: 1141 addi sp,sp,-16 + 25e: e422 sd s0,8(sp) + 260: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 262: 00054683 lbu a3,0(a0) + 266: fd06879b addiw a5,a3,-48 + 26a: 0ff7f793 zext.b a5,a5 + 26e: 4625 li a2,9 + 270: 02f66863 bltu a2,a5,2a0 + 274: 872a mv a4,a0 + n = 0; + 276: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 278: 0705 addi a4,a4,1 + 27a: 0025179b slliw a5,a0,0x2 + 27e: 9fa9 addw a5,a5,a0 + 280: 0017979b slliw a5,a5,0x1 + 284: 9fb5 addw a5,a5,a3 + 286: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 28a: 00074683 lbu a3,0(a4) + 28e: fd06879b addiw a5,a3,-48 + 292: 0ff7f793 zext.b a5,a5 + 296: fef671e3 bgeu a2,a5,278 + return n; +} + 29a: 6422 ld s0,8(sp) + 29c: 0141 addi sp,sp,16 + 29e: 8082 ret + n = 0; + 2a0: 4501 li a0,0 + 2a2: bfe5 j 29a + +00000000000002a4 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 2a4: 1141 addi sp,sp,-16 + 2a6: e422 sd s0,8(sp) + 2a8: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 2aa: 02b57463 bgeu a0,a1,2d2 + while(n-- > 0) + 2ae: 00c05f63 blez a2,2cc + 2b2: 1602 slli a2,a2,0x20 + 2b4: 9201 srli a2,a2,0x20 + 2b6: 00c507b3 add a5,a0,a2 + dst = vdst; + 2ba: 872a mv a4,a0 + *dst++ = *src++; + 2bc: 0585 addi a1,a1,1 + 2be: 0705 addi a4,a4,1 + 2c0: fff5c683 lbu a3,-1(a1) + 2c4: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2c8: fef71ae3 bne a4,a5,2bc + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2cc: 6422 ld s0,8(sp) + 2ce: 0141 addi sp,sp,16 + 2d0: 8082 ret + dst += n; + 2d2: 00c50733 add a4,a0,a2 + src += n; + 2d6: 95b2 add a1,a1,a2 + while(n-- > 0) + 2d8: fec05ae3 blez a2,2cc + 2dc: fff6079b addiw a5,a2,-1 + 2e0: 1782 slli a5,a5,0x20 + 2e2: 9381 srli a5,a5,0x20 + 2e4: fff7c793 not a5,a5 + 2e8: 97ba add a5,a5,a4 + *--dst = *--src; + 2ea: 15fd addi a1,a1,-1 + 2ec: 177d addi a4,a4,-1 + 2ee: 0005c683 lbu a3,0(a1) + 2f2: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2f6: fee79ae3 bne a5,a4,2ea + 2fa: bfc9 j 2cc + +00000000000002fc : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2fc: 1141 addi sp,sp,-16 + 2fe: e422 sd s0,8(sp) + 300: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 302: ca05 beqz a2,332 + 304: fff6069b addiw a3,a2,-1 + 308: 1682 slli a3,a3,0x20 + 30a: 9281 srli a3,a3,0x20 + 30c: 0685 addi a3,a3,1 + 30e: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 310: 00054783 lbu a5,0(a0) + 314: 0005c703 lbu a4,0(a1) + 318: 00e79863 bne a5,a4,328 + return *p1 - *p2; + } + p1++; + 31c: 0505 addi a0,a0,1 + p2++; + 31e: 0585 addi a1,a1,1 + while (n-- > 0) { + 320: fed518e3 bne a0,a3,310 + } + return 0; + 324: 4501 li a0,0 + 326: a019 j 32c + return *p1 - *p2; + 328: 40e7853b subw a0,a5,a4 +} + 32c: 6422 ld s0,8(sp) + 32e: 0141 addi sp,sp,16 + 330: 8082 ret + return 0; + 332: 4501 li a0,0 + 334: bfe5 j 32c + +0000000000000336 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 336: 1141 addi sp,sp,-16 + 338: e406 sd ra,8(sp) + 33a: e022 sd s0,0(sp) + 33c: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 33e: f67ff0ef jal 2a4 +} + 342: 60a2 ld ra,8(sp) + 344: 6402 ld s0,0(sp) + 346: 0141 addi sp,sp,16 + 348: 8082 ret + +000000000000034a : + +char * +sbrk(int n) { + 34a: 1141 addi sp,sp,-16 + 34c: e406 sd ra,8(sp) + 34e: e022 sd s0,0(sp) + 350: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 352: 4585 li a1,1 + 354: 0b2000ef jal 406 +} + 358: 60a2 ld ra,8(sp) + 35a: 6402 ld s0,0(sp) + 35c: 0141 addi sp,sp,16 + 35e: 8082 ret + +0000000000000360 : + +char * +sbrklazy(int n) { + 360: 1141 addi sp,sp,-16 + 362: e406 sd ra,8(sp) + 364: e022 sd s0,0(sp) + 366: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 368: 4589 li a1,2 + 36a: 09c000ef jal 406 +} + 36e: 60a2 ld ra,8(sp) + 370: 6402 ld s0,0(sp) + 372: 0141 addi sp,sp,16 + 374: 8082 ret + +0000000000000376 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 376: 4885 li a7,1 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e : +.global exit +exit: + li a7, SYS_exit + 37e: 4889 li a7,2 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 : +.global wait +wait: + li a7, SYS_wait + 386: 488d li a7,3 + ecall + 388: 00000073 ecall + ret + 38c: 8082 ret + +000000000000038e : +.global pipe +pipe: + li a7, SYS_pipe + 38e: 4891 li a7,4 + ecall + 390: 00000073 ecall + ret + 394: 8082 ret + +0000000000000396 : +.global read +read: + li a7, SYS_read + 396: 4895 li a7,5 + ecall + 398: 00000073 ecall + ret + 39c: 8082 ret + +000000000000039e : +.global write +write: + li a7, SYS_write + 39e: 48c1 li a7,16 + ecall + 3a0: 00000073 ecall + ret + 3a4: 8082 ret + +00000000000003a6 : +.global close +close: + li a7, SYS_close + 3a6: 48d5 li a7,21 + ecall + 3a8: 00000073 ecall + ret + 3ac: 8082 ret + +00000000000003ae : +.global kill +kill: + li a7, SYS_kill + 3ae: 4899 li a7,6 + ecall + 3b0: 00000073 ecall + ret + 3b4: 8082 ret + +00000000000003b6 : +.global exec +exec: + li a7, SYS_exec + 3b6: 489d li a7,7 + ecall + 3b8: 00000073 ecall + ret + 3bc: 8082 ret + +00000000000003be : +.global open +open: + li a7, SYS_open + 3be: 48bd li a7,15 + ecall + 3c0: 00000073 ecall + ret + 3c4: 8082 ret + +00000000000003c6 : +.global mknod +mknod: + li a7, SYS_mknod + 3c6: 48c5 li a7,17 + ecall + 3c8: 00000073 ecall + ret + 3cc: 8082 ret + +00000000000003ce : +.global unlink +unlink: + li a7, SYS_unlink + 3ce: 48c9 li a7,18 + ecall + 3d0: 00000073 ecall + ret + 3d4: 8082 ret + +00000000000003d6 : +.global fstat +fstat: + li a7, SYS_fstat + 3d6: 48a1 li a7,8 + ecall + 3d8: 00000073 ecall + ret + 3dc: 8082 ret + +00000000000003de : +.global link +link: + li a7, SYS_link + 3de: 48cd li a7,19 + ecall + 3e0: 00000073 ecall + ret + 3e4: 8082 ret + +00000000000003e6 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3e6: 48d1 li a7,20 + ecall + 3e8: 00000073 ecall + ret + 3ec: 8082 ret + +00000000000003ee : +.global chdir +chdir: + li a7, SYS_chdir + 3ee: 48a5 li a7,9 + ecall + 3f0: 00000073 ecall + ret + 3f4: 8082 ret + +00000000000003f6 : +.global dup +dup: + li a7, SYS_dup + 3f6: 48a9 li a7,10 + ecall + 3f8: 00000073 ecall + ret + 3fc: 8082 ret + +00000000000003fe : +.global getpid +getpid: + li a7, SYS_getpid + 3fe: 48ad li a7,11 + ecall + 400: 00000073 ecall + ret + 404: 8082 ret + +0000000000000406 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 406: 48b1 li a7,12 + ecall + 408: 00000073 ecall + ret + 40c: 8082 ret + +000000000000040e : +.global pause +pause: + li a7, SYS_pause + 40e: 48b5 li a7,13 + ecall + 410: 00000073 ecall + ret + 414: 8082 ret + +0000000000000416 : +.global uptime +uptime: + li a7, SYS_uptime + 416: 48b9 li a7,14 + ecall + 418: 00000073 ecall + ret + 41c: 8082 ret + +000000000000041e : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 41e: 1101 addi sp,sp,-32 + 420: ec06 sd ra,24(sp) + 422: e822 sd s0,16(sp) + 424: 1000 addi s0,sp,32 + 426: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 42a: 4605 li a2,1 + 42c: fef40593 addi a1,s0,-17 + 430: f6fff0ef jal 39e +} + 434: 60e2 ld ra,24(sp) + 436: 6442 ld s0,16(sp) + 438: 6105 addi sp,sp,32 + 43a: 8082 ret + +000000000000043c : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 43c: 715d addi sp,sp,-80 + 43e: e486 sd ra,72(sp) + 440: e0a2 sd s0,64(sp) + 442: f84a sd s2,48(sp) + 444: 0880 addi s0,sp,80 + 446: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 448: c299 beqz a3,44e + 44a: 0805c363 bltz a1,4d0 + neg = 0; + 44e: 4881 li a7,0 + 450: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 454: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 456: 00000517 auipc a0,0x0 + 45a: 55a50513 addi a0,a0,1370 # 9b0 + 45e: 883e mv a6,a5 + 460: 2785 addiw a5,a5,1 + 462: 02c5f733 remu a4,a1,a2 + 466: 972a add a4,a4,a0 + 468: 00074703 lbu a4,0(a4) + 46c: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 470: 872e mv a4,a1 + 472: 02c5d5b3 divu a1,a1,a2 + 476: 0685 addi a3,a3,1 + 478: fec773e3 bgeu a4,a2,45e + if(neg) + 47c: 00088b63 beqz a7,492 + buf[i++] = '-'; + 480: fd078793 addi a5,a5,-48 + 484: 97a2 add a5,a5,s0 + 486: 02d00713 li a4,45 + 48a: fee78423 sb a4,-24(a5) + 48e: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 492: 02f05a63 blez a5,4c6 + 496: fc26 sd s1,56(sp) + 498: f44e sd s3,40(sp) + 49a: fb840713 addi a4,s0,-72 + 49e: 00f704b3 add s1,a4,a5 + 4a2: fff70993 addi s3,a4,-1 + 4a6: 99be add s3,s3,a5 + 4a8: 37fd addiw a5,a5,-1 + 4aa: 1782 slli a5,a5,0x20 + 4ac: 9381 srli a5,a5,0x20 + 4ae: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 4b2: fff4c583 lbu a1,-1(s1) + 4b6: 854a mv a0,s2 + 4b8: f67ff0ef jal 41e + while(--i >= 0) + 4bc: 14fd addi s1,s1,-1 + 4be: ff349ae3 bne s1,s3,4b2 + 4c2: 74e2 ld s1,56(sp) + 4c4: 79a2 ld s3,40(sp) +} + 4c6: 60a6 ld ra,72(sp) + 4c8: 6406 ld s0,64(sp) + 4ca: 7942 ld s2,48(sp) + 4cc: 6161 addi sp,sp,80 + 4ce: 8082 ret + x = -xx; + 4d0: 40b005b3 neg a1,a1 + neg = 1; + 4d4: 4885 li a7,1 + x = -xx; + 4d6: bfad j 450 + +00000000000004d8 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4d8: 711d addi sp,sp,-96 + 4da: ec86 sd ra,88(sp) + 4dc: e8a2 sd s0,80(sp) + 4de: e0ca sd s2,64(sp) + 4e0: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4e2: 0005c903 lbu s2,0(a1) + 4e6: 28090663 beqz s2,772 + 4ea: e4a6 sd s1,72(sp) + 4ec: fc4e sd s3,56(sp) + 4ee: f852 sd s4,48(sp) + 4f0: f456 sd s5,40(sp) + 4f2: f05a sd s6,32(sp) + 4f4: ec5e sd s7,24(sp) + 4f6: e862 sd s8,16(sp) + 4f8: e466 sd s9,8(sp) + 4fa: 8b2a mv s6,a0 + 4fc: 8a2e mv s4,a1 + 4fe: 8bb2 mv s7,a2 + state = 0; + 500: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 502: 4481 li s1,0 + 504: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 506: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 50a: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 50e: 06c00c93 li s9,108 + 512: a005 j 532 + putc(fd, c0); + 514: 85ca mv a1,s2 + 516: 855a mv a0,s6 + 518: f07ff0ef jal 41e + 51c: a019 j 522 + } else if(state == '%'){ + 51e: 03598263 beq s3,s5,542 + for(i = 0; fmt[i]; i++){ + 522: 2485 addiw s1,s1,1 + 524: 8726 mv a4,s1 + 526: 009a07b3 add a5,s4,s1 + 52a: 0007c903 lbu s2,0(a5) + 52e: 22090a63 beqz s2,762 + c0 = fmt[i] & 0xff; + 532: 0009079b sext.w a5,s2 + if(state == 0){ + 536: fe0994e3 bnez s3,51e + if(c0 == '%'){ + 53a: fd579de3 bne a5,s5,514 + state = '%'; + 53e: 89be mv s3,a5 + 540: b7cd j 522 + if(c0) c1 = fmt[i+1] & 0xff; + 542: 00ea06b3 add a3,s4,a4 + 546: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 54a: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 54c: c681 beqz a3,554 + 54e: 9752 add a4,a4,s4 + 550: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 554: 05878363 beq a5,s8,59a + } else if(c0 == 'l' && c1 == 'd'){ + 558: 05978d63 beq a5,s9,5b2 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 55c: 07500713 li a4,117 + 560: 0ee78763 beq a5,a4,64e + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 564: 07800713 li a4,120 + 568: 12e78963 beq a5,a4,69a + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 56c: 07000713 li a4,112 + 570: 14e78e63 beq a5,a4,6cc + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 574: 06300713 li a4,99 + 578: 18e78e63 beq a5,a4,714 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 57c: 07300713 li a4,115 + 580: 1ae78463 beq a5,a4,728 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 584: 02500713 li a4,37 + 588: 04e79563 bne a5,a4,5d2 + putc(fd, '%'); + 58c: 02500593 li a1,37 + 590: 855a mv a0,s6 + 592: e8dff0ef jal 41e + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 596: 4981 li s3,0 + 598: b769 j 522 + printint(fd, va_arg(ap, int), 10, 1); + 59a: 008b8913 addi s2,s7,8 + 59e: 4685 li a3,1 + 5a0: 4629 li a2,10 + 5a2: 000ba583 lw a1,0(s7) + 5a6: 855a mv a0,s6 + 5a8: e95ff0ef jal 43c + 5ac: 8bca mv s7,s2 + state = 0; + 5ae: 4981 li s3,0 + 5b0: bf8d j 522 + } else if(c0 == 'l' && c1 == 'd'){ + 5b2: 06400793 li a5,100 + 5b6: 02f68963 beq a3,a5,5e8 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5ba: 06c00793 li a5,108 + 5be: 04f68263 beq a3,a5,602 + } else if(c0 == 'l' && c1 == 'u'){ + 5c2: 07500793 li a5,117 + 5c6: 0af68063 beq a3,a5,666 + } else if(c0 == 'l' && c1 == 'x'){ + 5ca: 07800793 li a5,120 + 5ce: 0ef68263 beq a3,a5,6b2 + putc(fd, '%'); + 5d2: 02500593 li a1,37 + 5d6: 855a mv a0,s6 + 5d8: e47ff0ef jal 41e + putc(fd, c0); + 5dc: 85ca mv a1,s2 + 5de: 855a mv a0,s6 + 5e0: e3fff0ef jal 41e + state = 0; + 5e4: 4981 li s3,0 + 5e6: bf35 j 522 + printint(fd, va_arg(ap, uint64), 10, 1); + 5e8: 008b8913 addi s2,s7,8 + 5ec: 4685 li a3,1 + 5ee: 4629 li a2,10 + 5f0: 000bb583 ld a1,0(s7) + 5f4: 855a mv a0,s6 + 5f6: e47ff0ef jal 43c + i += 1; + 5fa: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5fc: 8bca mv s7,s2 + state = 0; + 5fe: 4981 li s3,0 + i += 1; + 600: b70d j 522 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 602: 06400793 li a5,100 + 606: 02f60763 beq a2,a5,634 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 60a: 07500793 li a5,117 + 60e: 06f60963 beq a2,a5,680 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 612: 07800793 li a5,120 + 616: faf61ee3 bne a2,a5,5d2 + printint(fd, va_arg(ap, uint64), 16, 0); + 61a: 008b8913 addi s2,s7,8 + 61e: 4681 li a3,0 + 620: 4641 li a2,16 + 622: 000bb583 ld a1,0(s7) + 626: 855a mv a0,s6 + 628: e15ff0ef jal 43c + i += 2; + 62c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 62e: 8bca mv s7,s2 + state = 0; + 630: 4981 li s3,0 + i += 2; + 632: bdc5 j 522 + printint(fd, va_arg(ap, uint64), 10, 1); + 634: 008b8913 addi s2,s7,8 + 638: 4685 li a3,1 + 63a: 4629 li a2,10 + 63c: 000bb583 ld a1,0(s7) + 640: 855a mv a0,s6 + 642: dfbff0ef jal 43c + i += 2; + 646: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 648: 8bca mv s7,s2 + state = 0; + 64a: 4981 li s3,0 + i += 2; + 64c: bdd9 j 522 + printint(fd, va_arg(ap, uint32), 10, 0); + 64e: 008b8913 addi s2,s7,8 + 652: 4681 li a3,0 + 654: 4629 li a2,10 + 656: 000be583 lwu a1,0(s7) + 65a: 855a mv a0,s6 + 65c: de1ff0ef jal 43c + 660: 8bca mv s7,s2 + state = 0; + 662: 4981 li s3,0 + 664: bd7d j 522 + printint(fd, va_arg(ap, uint64), 10, 0); + 666: 008b8913 addi s2,s7,8 + 66a: 4681 li a3,0 + 66c: 4629 li a2,10 + 66e: 000bb583 ld a1,0(s7) + 672: 855a mv a0,s6 + 674: dc9ff0ef jal 43c + i += 1; + 678: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 67a: 8bca mv s7,s2 + state = 0; + 67c: 4981 li s3,0 + i += 1; + 67e: b555 j 522 + printint(fd, va_arg(ap, uint64), 10, 0); + 680: 008b8913 addi s2,s7,8 + 684: 4681 li a3,0 + 686: 4629 li a2,10 + 688: 000bb583 ld a1,0(s7) + 68c: 855a mv a0,s6 + 68e: dafff0ef jal 43c + i += 2; + 692: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 694: 8bca mv s7,s2 + state = 0; + 696: 4981 li s3,0 + i += 2; + 698: b569 j 522 + printint(fd, va_arg(ap, uint32), 16, 0); + 69a: 008b8913 addi s2,s7,8 + 69e: 4681 li a3,0 + 6a0: 4641 li a2,16 + 6a2: 000be583 lwu a1,0(s7) + 6a6: 855a mv a0,s6 + 6a8: d95ff0ef jal 43c + 6ac: 8bca mv s7,s2 + state = 0; + 6ae: 4981 li s3,0 + 6b0: bd8d j 522 + printint(fd, va_arg(ap, uint64), 16, 0); + 6b2: 008b8913 addi s2,s7,8 + 6b6: 4681 li a3,0 + 6b8: 4641 li a2,16 + 6ba: 000bb583 ld a1,0(s7) + 6be: 855a mv a0,s6 + 6c0: d7dff0ef jal 43c + i += 1; + 6c4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6c6: 8bca mv s7,s2 + state = 0; + 6c8: 4981 li s3,0 + i += 1; + 6ca: bda1 j 522 + 6cc: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 6ce: 008b8d13 addi s10,s7,8 + 6d2: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6d6: 03000593 li a1,48 + 6da: 855a mv a0,s6 + 6dc: d43ff0ef jal 41e + putc(fd, 'x'); + 6e0: 07800593 li a1,120 + 6e4: 855a mv a0,s6 + 6e6: d39ff0ef jal 41e + 6ea: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6ec: 00000b97 auipc s7,0x0 + 6f0: 2c4b8b93 addi s7,s7,708 # 9b0 + 6f4: 03c9d793 srli a5,s3,0x3c + 6f8: 97de add a5,a5,s7 + 6fa: 0007c583 lbu a1,0(a5) + 6fe: 855a mv a0,s6 + 700: d1fff0ef jal 41e + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 704: 0992 slli s3,s3,0x4 + 706: 397d addiw s2,s2,-1 + 708: fe0916e3 bnez s2,6f4 + printptr(fd, va_arg(ap, uint64)); + 70c: 8bea mv s7,s10 + state = 0; + 70e: 4981 li s3,0 + 710: 6d02 ld s10,0(sp) + 712: bd01 j 522 + putc(fd, va_arg(ap, uint32)); + 714: 008b8913 addi s2,s7,8 + 718: 000bc583 lbu a1,0(s7) + 71c: 855a mv a0,s6 + 71e: d01ff0ef jal 41e + 722: 8bca mv s7,s2 + state = 0; + 724: 4981 li s3,0 + 726: bbf5 j 522 + if((s = va_arg(ap, char*)) == 0) + 728: 008b8993 addi s3,s7,8 + 72c: 000bb903 ld s2,0(s7) + 730: 00090f63 beqz s2,74e + for(; *s; s++) + 734: 00094583 lbu a1,0(s2) + 738: c195 beqz a1,75c + putc(fd, *s); + 73a: 855a mv a0,s6 + 73c: ce3ff0ef jal 41e + for(; *s; s++) + 740: 0905 addi s2,s2,1 + 742: 00094583 lbu a1,0(s2) + 746: f9f5 bnez a1,73a + if((s = va_arg(ap, char*)) == 0) + 748: 8bce mv s7,s3 + state = 0; + 74a: 4981 li s3,0 + 74c: bbd9 j 522 + s = "(null)"; + 74e: 00000917 auipc s2,0x0 + 752: 25a90913 addi s2,s2,602 # 9a8 + for(; *s; s++) + 756: 02800593 li a1,40 + 75a: b7c5 j 73a + if((s = va_arg(ap, char*)) == 0) + 75c: 8bce mv s7,s3 + state = 0; + 75e: 4981 li s3,0 + 760: b3c9 j 522 + 762: 64a6 ld s1,72(sp) + 764: 79e2 ld s3,56(sp) + 766: 7a42 ld s4,48(sp) + 768: 7aa2 ld s5,40(sp) + 76a: 7b02 ld s6,32(sp) + 76c: 6be2 ld s7,24(sp) + 76e: 6c42 ld s8,16(sp) + 770: 6ca2 ld s9,8(sp) + } + } +} + 772: 60e6 ld ra,88(sp) + 774: 6446 ld s0,80(sp) + 776: 6906 ld s2,64(sp) + 778: 6125 addi sp,sp,96 + 77a: 8082 ret + +000000000000077c : + +void +fprintf(int fd, const char *fmt, ...) +{ + 77c: 715d addi sp,sp,-80 + 77e: ec06 sd ra,24(sp) + 780: e822 sd s0,16(sp) + 782: 1000 addi s0,sp,32 + 784: e010 sd a2,0(s0) + 786: e414 sd a3,8(s0) + 788: e818 sd a4,16(s0) + 78a: ec1c sd a5,24(s0) + 78c: 03043023 sd a6,32(s0) + 790: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 794: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 798: 8622 mv a2,s0 + 79a: d3fff0ef jal 4d8 +} + 79e: 60e2 ld ra,24(sp) + 7a0: 6442 ld s0,16(sp) + 7a2: 6161 addi sp,sp,80 + 7a4: 8082 ret + +00000000000007a6 : + +void +printf(const char *fmt, ...) +{ + 7a6: 711d addi sp,sp,-96 + 7a8: ec06 sd ra,24(sp) + 7aa: e822 sd s0,16(sp) + 7ac: 1000 addi s0,sp,32 + 7ae: e40c sd a1,8(s0) + 7b0: e810 sd a2,16(s0) + 7b2: ec14 sd a3,24(s0) + 7b4: f018 sd a4,32(s0) + 7b6: f41c sd a5,40(s0) + 7b8: 03043823 sd a6,48(s0) + 7bc: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 7c0: 00840613 addi a2,s0,8 + 7c4: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 7c8: 85aa mv a1,a0 + 7ca: 4505 li a0,1 + 7cc: d0dff0ef jal 4d8 +} + 7d0: 60e2 ld ra,24(sp) + 7d2: 6442 ld s0,16(sp) + 7d4: 6125 addi sp,sp,96 + 7d6: 8082 ret + +00000000000007d8 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7d8: 1141 addi sp,sp,-16 + 7da: e422 sd s0,8(sp) + 7dc: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7de: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7e2: 00001797 auipc a5,0x1 + 7e6: 81e7b783 ld a5,-2018(a5) # 1000 + 7ea: a02d j 814 + 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; + 7ec: 4618 lw a4,8(a2) + 7ee: 9f2d addw a4,a4,a1 + 7f0: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7f4: 6398 ld a4,0(a5) + 7f6: 6310 ld a2,0(a4) + 7f8: a83d j 836 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7fa: ff852703 lw a4,-8(a0) + 7fe: 9f31 addw a4,a4,a2 + 800: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 802: ff053683 ld a3,-16(a0) + 806: a091 j 84a + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 808: 6398 ld a4,0(a5) + 80a: 00e7e463 bltu a5,a4,812 + 80e: 00e6ea63 bltu a3,a4,822 +{ + 812: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 814: fed7fae3 bgeu a5,a3,808 + 818: 6398 ld a4,0(a5) + 81a: 00e6e463 bltu a3,a4,822 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 81e: fee7eae3 bltu a5,a4,812 + if(bp + bp->s.size == p->s.ptr){ + 822: ff852583 lw a1,-8(a0) + 826: 6390 ld a2,0(a5) + 828: 02059813 slli a6,a1,0x20 + 82c: 01c85713 srli a4,a6,0x1c + 830: 9736 add a4,a4,a3 + 832: fae60de3 beq a2,a4,7ec + bp->s.ptr = p->s.ptr->s.ptr; + 836: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 83a: 4790 lw a2,8(a5) + 83c: 02061593 slli a1,a2,0x20 + 840: 01c5d713 srli a4,a1,0x1c + 844: 973e add a4,a4,a5 + 846: fae68ae3 beq a3,a4,7fa + p->s.ptr = bp->s.ptr; + 84a: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 84c: 00000717 auipc a4,0x0 + 850: 7af73a23 sd a5,1972(a4) # 1000 +} + 854: 6422 ld s0,8(sp) + 856: 0141 addi sp,sp,16 + 858: 8082 ret + +000000000000085a : + return freep; +} + +void* +malloc(uint nbytes) +{ + 85a: 7139 addi sp,sp,-64 + 85c: fc06 sd ra,56(sp) + 85e: f822 sd s0,48(sp) + 860: f426 sd s1,40(sp) + 862: ec4e sd s3,24(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: 0014899b addiw s3,s1,1 + 874: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 876: 00000517 auipc a0,0x0 + 87a: 78a53503 ld a0,1930(a0) # 1000 + 87e: c915 beqz a0,8b2 + 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: 08977a63 bgeu a4,s1,918 + 888: f04a sd s2,32(sp) + 88a: e852 sd s4,16(sp) + 88c: e456 sd s5,8(sp) + 88e: e05a sd s6,0(sp) + if(nu < 4096) + 890: 8a4e mv s4,s3 + 892: 0009871b sext.w a4,s3 + 896: 6685 lui a3,0x1 + 898: 00d77363 bgeu a4,a3,89e + 89c: 6a05 lui s4,0x1 + 89e: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 8a2: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 8a6: 00000917 auipc s2,0x0 + 8aa: 75a90913 addi s2,s2,1882 # 1000 + if(p == SBRK_ERROR) + 8ae: 5afd li s5,-1 + 8b0: a081 j 8f0 + 8b2: f04a sd s2,32(sp) + 8b4: e852 sd s4,16(sp) + 8b6: e456 sd s5,8(sp) + 8b8: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 8ba: 00001797 auipc a5,0x1 + 8be: 95678793 addi a5,a5,-1706 # 1210 + 8c2: 00000717 auipc a4,0x0 + 8c6: 72f73f23 sd a5,1854(a4) # 1000 + 8ca: e39c sd a5,0(a5) + base.s.size = 0; + 8cc: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 8d0: b7c1 j 890 + prevp->s.ptr = p->s.ptr; + 8d2: 6398 ld a4,0(a5) + 8d4: e118 sd a4,0(a0) + 8d6: a8a9 j 930 + hp->s.size = nu; + 8d8: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8dc: 0541 addi a0,a0,16 + 8de: efbff0ef jal 7d8 + return freep; + 8e2: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8e6: c12d beqz a0,948 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8e8: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8ea: 4798 lw a4,8(a5) + 8ec: 02977263 bgeu a4,s1,910 + if(p == freep) + 8f0: 00093703 ld a4,0(s2) + 8f4: 853e mv a0,a5 + 8f6: fef719e3 bne a4,a5,8e8 + p = sbrk(nu * sizeof(Header)); + 8fa: 8552 mv a0,s4 + 8fc: a4fff0ef jal 34a + if(p == SBRK_ERROR) + 900: fd551ce3 bne a0,s5,8d8 + return 0; + 904: 4501 li a0,0 + 906: 7902 ld s2,32(sp) + 908: 6a42 ld s4,16(sp) + 90a: 6aa2 ld s5,8(sp) + 90c: 6b02 ld s6,0(sp) + 90e: a03d j 93c + 910: 7902 ld s2,32(sp) + 912: 6a42 ld s4,16(sp) + 914: 6aa2 ld s5,8(sp) + 916: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 918: fae48de3 beq s1,a4,8d2 + p->s.size -= nunits; + 91c: 4137073b subw a4,a4,s3 + 920: c798 sw a4,8(a5) + p += p->s.size; + 922: 02071693 slli a3,a4,0x20 + 926: 01c6d713 srli a4,a3,0x1c + 92a: 97ba add a5,a5,a4 + p->s.size = nunits; + 92c: 0137a423 sw s3,8(a5) + freep = prevp; + 930: 00000717 auipc a4,0x0 + 934: 6ca73823 sd a0,1744(a4) # 1000 + return (void*)(p + 1); + 938: 01078513 addi a0,a5,16 + } +} + 93c: 70e2 ld ra,56(sp) + 93e: 7442 ld s0,48(sp) + 940: 74a2 ld s1,40(sp) + 942: 69e2 ld s3,24(sp) + 944: 6121 addi sp,sp,64 + 946: 8082 ret + 948: 7902 ld s2,32(sp) + 94a: 6a42 ld s4,16(sp) + 94c: 6aa2 ld s5,8(sp) + 94e: 6b02 ld s6,0(sp) + 950: b7f5 j 93c diff --git a/G12_Project2_2/user/cat.c b/G12_Project2_2/user/cat.c new file mode 100644 index 0000000000..6d873a9705 --- /dev/null +++ b/G12_Project2_2/user/cat.c @@ -0,0 +1,43 @@ +#include "kernel/types.h" +#include "kernel/fcntl.h" +#include "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], O_RDONLY)) < 0){ + fprintf(2, "cat: cannot open %s\n", argv[i]); + exit(1); + } + cat(fd); + close(fd); + } + exit(0); +} diff --git a/G12_Project2_2/user/cat.d b/G12_Project2_2/user/cat.d new file mode 100644 index 0000000000..ae5d22ae47 --- /dev/null +++ b/G12_Project2_2/user/cat.d @@ -0,0 +1 @@ +user/cat.o: user/cat.c kernel/types.h kernel/fcntl.h user/user.h diff --git a/G12_Project2_2/user/cat.o b/G12_Project2_2/user/cat.o new file mode 100644 index 0000000000..a2592e770b Binary files /dev/null and b/G12_Project2_2/user/cat.o differ diff --git a/G12_Project2_2/user/cat.sym b/G12_Project2_2/user/cat.sym new file mode 100644 index 0000000000..220324d1b7 --- /dev/null +++ b/G12_Project2_2/user/cat.sym @@ -0,0 +1,67 @@ +0000000000000000 .text +0000000000000958 .rodata +00000000000009c8 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 cat.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000041e putc +000000000000043c printint +00000000000009b0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001210 base +00000000000000fa strcpy +000000000000040e pause +00000000000007a6 printf +0000000000000406 sys_sbrk +00000000000002a4 memmove +00000000000003c6 mknod +00000000000001b2 gets +00000000000003fe getpid +0000000000000336 memcpy +0000000000000000 cat +000000000000085a malloc +0000000000000360 sbrklazy +000000000000038e pipe +000000000000039e write +00000000000003d6 fstat +000000000000077c fprintf +00000000000003ae kill +00000000000004d8 vprintf +00000000000003ee chdir +00000000000003b6 exec +0000000000000386 wait +0000000000000396 read +00000000000003ce unlink +00000000000002fc memcmp +0000000000000376 fork +000000000000034a sbrk +0000000000000416 uptime +000000000000016c memset +0000000000000072 main +0000000000000116 strcmp +00000000000003f6 dup +0000000000001010 buf +0000000000000222 stat +00000000000003de link +000000000000037e exit +00000000000000ea start +000000000000025c atoi +0000000000000142 strlen +00000000000003be open +000000000000018e strchr +00000000000003e6 mkdir +00000000000003a6 close +00000000000007d8 free diff --git a/G12_Project2_2/user/dorphan.asm b/G12_Project2_2/user/dorphan.asm new file mode 100644 index 0000000000..d8cec02252 --- /dev/null +++ b/G12_Project2_2/user/dorphan.asm @@ -0,0 +1,1519 @@ + +user/_dorphan: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: + +char buf[BUFSZ]; + +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: 1000 addi s0,sp,32 + char *s = argv[0]; + a: 6184 ld s1,0(a1) + + if(mkdir("dd") != 0){ + c: 00001517 auipc a0,0x1 + 10: 8f450513 addi a0,a0,-1804 # 900 + 14: 372000ef jal 386 + 18: c919 beqz a0,2e + printf("%s: mkdir dd failed\n", s); + 1a: 85a6 mv a1,s1 + 1c: 00001517 auipc a0,0x1 + 20: 8ec50513 addi a0,a0,-1812 # 908 + 24: 722000ef jal 746 + exit(1); + 28: 4505 li a0,1 + 2a: 2f4000ef jal 31e + } + + if(chdir("dd") != 0){ + 2e: 00001517 auipc a0,0x1 + 32: 8d250513 addi a0,a0,-1838 # 900 + 36: 358000ef jal 38e + 3a: c919 beqz a0,50 + printf("%s: chdir dd failed\n", s); + 3c: 85a6 mv a1,s1 + 3e: 00001517 auipc a0,0x1 + 42: 8e250513 addi a0,a0,-1822 # 920 + 46: 700000ef jal 746 + exit(1); + 4a: 4505 li a0,1 + 4c: 2d2000ef jal 31e + } + + if (unlink("../dd") < 0) { + 50: 00001517 auipc a0,0x1 + 54: 8e850513 addi a0,a0,-1816 # 938 + 58: 316000ef jal 36e + 5c: 00054d63 bltz a0,76 + printf("%s: unlink failed\n", s); + exit(1); + } + printf("wait for kill and reclaim\n"); + 60: 00001517 auipc a0,0x1 + 64: 8f850513 addi a0,a0,-1800 # 958 + 68: 6de000ef jal 746 + // sit around until killed + for(;;) pause(1000); + 6c: 3e800513 li a0,1000 + 70: 33e000ef jal 3ae + 74: bfe5 j 6c + printf("%s: unlink failed\n", s); + 76: 85a6 mv a1,s1 + 78: 00001517 auipc a0,0x1 + 7c: 8c850513 addi a0,a0,-1848 # 940 + 80: 6c6000ef jal 746 + exit(1); + 84: 4505 li a0,1 + 86: 298000ef jal 31e + +000000000000008a : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 8a: 1141 addi sp,sp,-16 + 8c: e406 sd ra,8(sp) + 8e: e022 sd s0,0(sp) + 90: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 92: f6fff0ef jal 0
+ exit(r); + 96: 288000ef jal 31e + +000000000000009a : +} + +char* +strcpy(char *s, const char *t) +{ + 9a: 1141 addi sp,sp,-16 + 9c: e422 sd s0,8(sp) + 9e: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + a0: 87aa mv a5,a0 + a2: 0585 addi a1,a1,1 + a4: 0785 addi a5,a5,1 + a6: fff5c703 lbu a4,-1(a1) + aa: fee78fa3 sb a4,-1(a5) + ae: fb75 bnez a4,a2 + ; + return os; +} + b0: 6422 ld s0,8(sp) + b2: 0141 addi sp,sp,16 + b4: 8082 ret + +00000000000000b6 : + +int +strcmp(const char *p, const char *q) +{ + b6: 1141 addi sp,sp,-16 + b8: e422 sd s0,8(sp) + ba: 0800 addi s0,sp,16 + while(*p && *p == *q) + bc: 00054783 lbu a5,0(a0) + c0: cb91 beqz a5,d4 + c2: 0005c703 lbu a4,0(a1) + c6: 00f71763 bne a4,a5,d4 + p++, q++; + ca: 0505 addi a0,a0,1 + cc: 0585 addi a1,a1,1 + while(*p && *p == *q) + ce: 00054783 lbu a5,0(a0) + d2: fbe5 bnez a5,c2 + return (uchar)*p - (uchar)*q; + d4: 0005c503 lbu a0,0(a1) +} + d8: 40a7853b subw a0,a5,a0 + dc: 6422 ld s0,8(sp) + de: 0141 addi sp,sp,16 + e0: 8082 ret + +00000000000000e2 : + +uint +strlen(const char *s) +{ + e2: 1141 addi sp,sp,-16 + e4: e422 sd s0,8(sp) + e6: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + e8: 00054783 lbu a5,0(a0) + ec: cf91 beqz a5,108 + ee: 0505 addi a0,a0,1 + f0: 87aa mv a5,a0 + f2: 86be mv a3,a5 + f4: 0785 addi a5,a5,1 + f6: fff7c703 lbu a4,-1(a5) + fa: ff65 bnez a4,f2 + fc: 40a6853b subw a0,a3,a0 + 100: 2505 addiw a0,a0,1 + ; + return n; +} + 102: 6422 ld s0,8(sp) + 104: 0141 addi sp,sp,16 + 106: 8082 ret + for(n = 0; s[n]; n++) + 108: 4501 li a0,0 + 10a: bfe5 j 102 + +000000000000010c : + +void* +memset(void *dst, int c, uint n) +{ + 10c: 1141 addi sp,sp,-16 + 10e: e422 sd s0,8(sp) + 110: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 112: ca19 beqz a2,128 + 114: 87aa mv a5,a0 + 116: 1602 slli a2,a2,0x20 + 118: 9201 srli a2,a2,0x20 + 11a: 00a60733 add a4,a2,a0 + cdst[i] = c; + 11e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 122: 0785 addi a5,a5,1 + 124: fee79de3 bne a5,a4,11e + } + return dst; +} + 128: 6422 ld s0,8(sp) + 12a: 0141 addi sp,sp,16 + 12c: 8082 ret + +000000000000012e : + +char* +strchr(const char *s, char c) +{ + 12e: 1141 addi sp,sp,-16 + 130: e422 sd s0,8(sp) + 132: 0800 addi s0,sp,16 + for(; *s; s++) + 134: 00054783 lbu a5,0(a0) + 138: cb99 beqz a5,14e + if(*s == c) + 13a: 00f58763 beq a1,a5,148 + for(; *s; s++) + 13e: 0505 addi a0,a0,1 + 140: 00054783 lbu a5,0(a0) + 144: fbfd bnez a5,13a + return (char*)s; + return 0; + 146: 4501 li a0,0 +} + 148: 6422 ld s0,8(sp) + 14a: 0141 addi sp,sp,16 + 14c: 8082 ret + return 0; + 14e: 4501 li a0,0 + 150: bfe5 j 148 + +0000000000000152 : + +char* +gets(char *buf, int max) +{ + 152: 711d addi sp,sp,-96 + 154: ec86 sd ra,88(sp) + 156: e8a2 sd s0,80(sp) + 158: e4a6 sd s1,72(sp) + 15a: e0ca sd s2,64(sp) + 15c: fc4e sd s3,56(sp) + 15e: f852 sd s4,48(sp) + 160: f456 sd s5,40(sp) + 162: f05a sd s6,32(sp) + 164: ec5e sd s7,24(sp) + 166: 1080 addi s0,sp,96 + 168: 8baa mv s7,a0 + 16a: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 16c: 892a mv s2,a0 + 16e: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 170: 4aa9 li s5,10 + 172: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 174: 89a6 mv s3,s1 + 176: 2485 addiw s1,s1,1 + 178: 0344d663 bge s1,s4,1a4 + cc = read(0, &c, 1); + 17c: 4605 li a2,1 + 17e: faf40593 addi a1,s0,-81 + 182: 4501 li a0,0 + 184: 1b2000ef jal 336 + if(cc < 1) + 188: 00a05e63 blez a0,1a4 + buf[i++] = c; + 18c: faf44783 lbu a5,-81(s0) + 190: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 194: 01578763 beq a5,s5,1a2 + 198: 0905 addi s2,s2,1 + 19a: fd679de3 bne a5,s6,174 + buf[i++] = c; + 19e: 89a6 mv s3,s1 + 1a0: a011 j 1a4 + 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: 6125 addi sp,sp,96 + 1c0: 8082 ret + +00000000000001c2 : + +int +stat(const char *n, struct stat *st) +{ + 1c2: 1101 addi sp,sp,-32 + 1c4: ec06 sd ra,24(sp) + 1c6: e822 sd s0,16(sp) + 1c8: e04a sd s2,0(sp) + 1ca: 1000 addi s0,sp,32 + 1cc: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1ce: 4581 li a1,0 + 1d0: 18e000ef jal 35e + if(fd < 0) + 1d4: 02054263 bltz a0,1f8 + 1d8: e426 sd s1,8(sp) + 1da: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1dc: 85ca mv a1,s2 + 1de: 198000ef jal 376 + 1e2: 892a mv s2,a0 + close(fd); + 1e4: 8526 mv a0,s1 + 1e6: 160000ef jal 346 + return r; + 1ea: 64a2 ld s1,8(sp) +} + 1ec: 854a mv a0,s2 + 1ee: 60e2 ld ra,24(sp) + 1f0: 6442 ld s0,16(sp) + 1f2: 6902 ld s2,0(sp) + 1f4: 6105 addi sp,sp,32 + 1f6: 8082 ret + return -1; + 1f8: 597d li s2,-1 + 1fa: bfcd j 1ec + +00000000000001fc : + +int +atoi(const char *s) +{ + 1fc: 1141 addi sp,sp,-16 + 1fe: e422 sd s0,8(sp) + 200: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 202: 00054683 lbu a3,0(a0) + 206: fd06879b addiw a5,a3,-48 + 20a: 0ff7f793 zext.b a5,a5 + 20e: 4625 li a2,9 + 210: 02f66863 bltu a2,a5,240 + 214: 872a mv a4,a0 + n = 0; + 216: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 218: 0705 addi a4,a4,1 + 21a: 0025179b slliw a5,a0,0x2 + 21e: 9fa9 addw a5,a5,a0 + 220: 0017979b slliw a5,a5,0x1 + 224: 9fb5 addw a5,a5,a3 + 226: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 22a: 00074683 lbu a3,0(a4) + 22e: fd06879b addiw a5,a3,-48 + 232: 0ff7f793 zext.b a5,a5 + 236: fef671e3 bgeu a2,a5,218 + return n; +} + 23a: 6422 ld s0,8(sp) + 23c: 0141 addi sp,sp,16 + 23e: 8082 ret + n = 0; + 240: 4501 li a0,0 + 242: bfe5 j 23a + +0000000000000244 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 244: 1141 addi sp,sp,-16 + 246: e422 sd s0,8(sp) + 248: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 24a: 02b57463 bgeu a0,a1,272 + while(n-- > 0) + 24e: 00c05f63 blez a2,26c + 252: 1602 slli a2,a2,0x20 + 254: 9201 srli a2,a2,0x20 + 256: 00c507b3 add a5,a0,a2 + dst = vdst; + 25a: 872a mv a4,a0 + *dst++ = *src++; + 25c: 0585 addi a1,a1,1 + 25e: 0705 addi a4,a4,1 + 260: fff5c683 lbu a3,-1(a1) + 264: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 268: fef71ae3 bne a4,a5,25c + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 26c: 6422 ld s0,8(sp) + 26e: 0141 addi sp,sp,16 + 270: 8082 ret + dst += n; + 272: 00c50733 add a4,a0,a2 + src += n; + 276: 95b2 add a1,a1,a2 + while(n-- > 0) + 278: fec05ae3 blez a2,26c + 27c: fff6079b addiw a5,a2,-1 + 280: 1782 slli a5,a5,0x20 + 282: 9381 srli a5,a5,0x20 + 284: fff7c793 not a5,a5 + 288: 97ba add a5,a5,a4 + *--dst = *--src; + 28a: 15fd addi a1,a1,-1 + 28c: 177d addi a4,a4,-1 + 28e: 0005c683 lbu a3,0(a1) + 292: 00d70023 sb a3,0(a4) + while(n-- > 0) + 296: fee79ae3 bne a5,a4,28a + 29a: bfc9 j 26c + +000000000000029c : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 29c: 1141 addi sp,sp,-16 + 29e: e422 sd s0,8(sp) + 2a0: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2a2: ca05 beqz a2,2d2 + 2a4: fff6069b addiw a3,a2,-1 + 2a8: 1682 slli a3,a3,0x20 + 2aa: 9281 srli a3,a3,0x20 + 2ac: 0685 addi a3,a3,1 + 2ae: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2b0: 00054783 lbu a5,0(a0) + 2b4: 0005c703 lbu a4,0(a1) + 2b8: 00e79863 bne a5,a4,2c8 + return *p1 - *p2; + } + p1++; + 2bc: 0505 addi a0,a0,1 + p2++; + 2be: 0585 addi a1,a1,1 + while (n-- > 0) { + 2c0: fed518e3 bne a0,a3,2b0 + } + return 0; + 2c4: 4501 li a0,0 + 2c6: a019 j 2cc + return *p1 - *p2; + 2c8: 40e7853b subw a0,a5,a4 +} + 2cc: 6422 ld s0,8(sp) + 2ce: 0141 addi sp,sp,16 + 2d0: 8082 ret + return 0; + 2d2: 4501 li a0,0 + 2d4: bfe5 j 2cc + +00000000000002d6 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2d6: 1141 addi sp,sp,-16 + 2d8: e406 sd ra,8(sp) + 2da: e022 sd s0,0(sp) + 2dc: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2de: f67ff0ef jal 244 +} + 2e2: 60a2 ld ra,8(sp) + 2e4: 6402 ld s0,0(sp) + 2e6: 0141 addi sp,sp,16 + 2e8: 8082 ret + +00000000000002ea : + +char * +sbrk(int n) { + 2ea: 1141 addi sp,sp,-16 + 2ec: e406 sd ra,8(sp) + 2ee: e022 sd s0,0(sp) + 2f0: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2f2: 4585 li a1,1 + 2f4: 0b2000ef jal 3a6 +} + 2f8: 60a2 ld ra,8(sp) + 2fa: 6402 ld s0,0(sp) + 2fc: 0141 addi sp,sp,16 + 2fe: 8082 ret + +0000000000000300 : + +char * +sbrklazy(int n) { + 300: 1141 addi sp,sp,-16 + 302: e406 sd ra,8(sp) + 304: e022 sd s0,0(sp) + 306: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 308: 4589 li a1,2 + 30a: 09c000ef jal 3a6 +} + 30e: 60a2 ld ra,8(sp) + 310: 6402 ld s0,0(sp) + 312: 0141 addi sp,sp,16 + 314: 8082 ret + +0000000000000316 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 316: 4885 li a7,1 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e : +.global exit +exit: + li a7, SYS_exit + 31e: 4889 li a7,2 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 : +.global wait +wait: + li a7, SYS_wait + 326: 488d li a7,3 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e : +.global pipe +pipe: + li a7, SYS_pipe + 32e: 4891 li a7,4 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 : +.global read +read: + li a7, SYS_read + 336: 4895 li a7,5 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e : +.global write +write: + li a7, SYS_write + 33e: 48c1 li a7,16 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 : +.global close +close: + li a7, SYS_close + 346: 48d5 li a7,21 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e : +.global kill +kill: + li a7, SYS_kill + 34e: 4899 li a7,6 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 : +.global exec +exec: + li a7, SYS_exec + 356: 489d li a7,7 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e : +.global open +open: + li a7, SYS_open + 35e: 48bd li a7,15 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 : +.global mknod +mknod: + li a7, SYS_mknod + 366: 48c5 li a7,17 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e : +.global unlink +unlink: + li a7, SYS_unlink + 36e: 48c9 li a7,18 + ecall + 370: 00000073 ecall + ret + 374: 8082 ret + +0000000000000376 : +.global fstat +fstat: + li a7, SYS_fstat + 376: 48a1 li a7,8 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e : +.global link +link: + li a7, SYS_link + 37e: 48cd li a7,19 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 386: 48d1 li a7,20 + ecall + 388: 00000073 ecall + ret + 38c: 8082 ret + +000000000000038e : +.global chdir +chdir: + li a7, SYS_chdir + 38e: 48a5 li a7,9 + ecall + 390: 00000073 ecall + ret + 394: 8082 ret + +0000000000000396 : +.global dup +dup: + li a7, SYS_dup + 396: 48a9 li a7,10 + ecall + 398: 00000073 ecall + ret + 39c: 8082 ret + +000000000000039e : +.global getpid +getpid: + li a7, SYS_getpid + 39e: 48ad li a7,11 + ecall + 3a0: 00000073 ecall + ret + 3a4: 8082 ret + +00000000000003a6 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3a6: 48b1 li a7,12 + ecall + 3a8: 00000073 ecall + ret + 3ac: 8082 ret + +00000000000003ae : +.global pause +pause: + li a7, SYS_pause + 3ae: 48b5 li a7,13 + ecall + 3b0: 00000073 ecall + ret + 3b4: 8082 ret + +00000000000003b6 : +.global uptime +uptime: + li a7, SYS_uptime + 3b6: 48b9 li a7,14 + ecall + 3b8: 00000073 ecall + ret + 3bc: 8082 ret + +00000000000003be : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3be: 1101 addi sp,sp,-32 + 3c0: ec06 sd ra,24(sp) + 3c2: e822 sd s0,16(sp) + 3c4: 1000 addi s0,sp,32 + 3c6: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3ca: 4605 li a2,1 + 3cc: fef40593 addi a1,s0,-17 + 3d0: f6fff0ef jal 33e +} + 3d4: 60e2 ld ra,24(sp) + 3d6: 6442 ld s0,16(sp) + 3d8: 6105 addi sp,sp,32 + 3da: 8082 ret + +00000000000003dc : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3dc: 715d addi sp,sp,-80 + 3de: e486 sd ra,72(sp) + 3e0: e0a2 sd s0,64(sp) + 3e2: f84a sd s2,48(sp) + 3e4: 0880 addi s0,sp,80 + 3e6: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3e8: c299 beqz a3,3ee + 3ea: 0805c363 bltz a1,470 + neg = 0; + 3ee: 4881 li a7,0 + 3f0: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3f4: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3f6: 00000517 auipc a0,0x0 + 3fa: 58a50513 addi a0,a0,1418 # 980 + 3fe: 883e mv a6,a5 + 400: 2785 addiw a5,a5,1 + 402: 02c5f733 remu a4,a1,a2 + 406: 972a add a4,a4,a0 + 408: 00074703 lbu a4,0(a4) + 40c: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 410: 872e mv a4,a1 + 412: 02c5d5b3 divu a1,a1,a2 + 416: 0685 addi a3,a3,1 + 418: fec773e3 bgeu a4,a2,3fe + if(neg) + 41c: 00088b63 beqz a7,432 + buf[i++] = '-'; + 420: fd078793 addi a5,a5,-48 + 424: 97a2 add a5,a5,s0 + 426: 02d00713 li a4,45 + 42a: fee78423 sb a4,-24(a5) + 42e: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 432: 02f05a63 blez a5,466 + 436: fc26 sd s1,56(sp) + 438: f44e sd s3,40(sp) + 43a: fb840713 addi a4,s0,-72 + 43e: 00f704b3 add s1,a4,a5 + 442: fff70993 addi s3,a4,-1 + 446: 99be add s3,s3,a5 + 448: 37fd addiw a5,a5,-1 + 44a: 1782 slli a5,a5,0x20 + 44c: 9381 srli a5,a5,0x20 + 44e: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 452: fff4c583 lbu a1,-1(s1) + 456: 854a mv a0,s2 + 458: f67ff0ef jal 3be + while(--i >= 0) + 45c: 14fd addi s1,s1,-1 + 45e: ff349ae3 bne s1,s3,452 + 462: 74e2 ld s1,56(sp) + 464: 79a2 ld s3,40(sp) +} + 466: 60a6 ld ra,72(sp) + 468: 6406 ld s0,64(sp) + 46a: 7942 ld s2,48(sp) + 46c: 6161 addi sp,sp,80 + 46e: 8082 ret + x = -xx; + 470: 40b005b3 neg a1,a1 + neg = 1; + 474: 4885 li a7,1 + x = -xx; + 476: bfad j 3f0 + +0000000000000478 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 478: 711d addi sp,sp,-96 + 47a: ec86 sd ra,88(sp) + 47c: e8a2 sd s0,80(sp) + 47e: e0ca sd s2,64(sp) + 480: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 482: 0005c903 lbu s2,0(a1) + 486: 28090663 beqz s2,712 + 48a: e4a6 sd s1,72(sp) + 48c: fc4e sd s3,56(sp) + 48e: f852 sd s4,48(sp) + 490: f456 sd s5,40(sp) + 492: f05a sd s6,32(sp) + 494: ec5e sd s7,24(sp) + 496: e862 sd s8,16(sp) + 498: e466 sd s9,8(sp) + 49a: 8b2a mv s6,a0 + 49c: 8a2e mv s4,a1 + 49e: 8bb2 mv s7,a2 + state = 0; + 4a0: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4a2: 4481 li s1,0 + 4a4: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4a6: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4aa: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4ae: 06c00c93 li s9,108 + 4b2: a005 j 4d2 + putc(fd, c0); + 4b4: 85ca mv a1,s2 + 4b6: 855a mv a0,s6 + 4b8: f07ff0ef jal 3be + 4bc: a019 j 4c2 + } else if(state == '%'){ + 4be: 03598263 beq s3,s5,4e2 + for(i = 0; fmt[i]; i++){ + 4c2: 2485 addiw s1,s1,1 + 4c4: 8726 mv a4,s1 + 4c6: 009a07b3 add a5,s4,s1 + 4ca: 0007c903 lbu s2,0(a5) + 4ce: 22090a63 beqz s2,702 + c0 = fmt[i] & 0xff; + 4d2: 0009079b sext.w a5,s2 + if(state == 0){ + 4d6: fe0994e3 bnez s3,4be + if(c0 == '%'){ + 4da: fd579de3 bne a5,s5,4b4 + state = '%'; + 4de: 89be mv s3,a5 + 4e0: b7cd j 4c2 + if(c0) c1 = fmt[i+1] & 0xff; + 4e2: 00ea06b3 add a3,s4,a4 + 4e6: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4ea: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4ec: c681 beqz a3,4f4 + 4ee: 9752 add a4,a4,s4 + 4f0: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4f4: 05878363 beq a5,s8,53a + } else if(c0 == 'l' && c1 == 'd'){ + 4f8: 05978d63 beq a5,s9,552 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4fc: 07500713 li a4,117 + 500: 0ee78763 beq a5,a4,5ee + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 504: 07800713 li a4,120 + 508: 12e78963 beq a5,a4,63a + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 50c: 07000713 li a4,112 + 510: 14e78e63 beq a5,a4,66c + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 514: 06300713 li a4,99 + 518: 18e78e63 beq a5,a4,6b4 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 51c: 07300713 li a4,115 + 520: 1ae78463 beq a5,a4,6c8 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 524: 02500713 li a4,37 + 528: 04e79563 bne a5,a4,572 + putc(fd, '%'); + 52c: 02500593 li a1,37 + 530: 855a mv a0,s6 + 532: e8dff0ef jal 3be + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 536: 4981 li s3,0 + 538: b769 j 4c2 + printint(fd, va_arg(ap, int), 10, 1); + 53a: 008b8913 addi s2,s7,8 + 53e: 4685 li a3,1 + 540: 4629 li a2,10 + 542: 000ba583 lw a1,0(s7) + 546: 855a mv a0,s6 + 548: e95ff0ef jal 3dc + 54c: 8bca mv s7,s2 + state = 0; + 54e: 4981 li s3,0 + 550: bf8d j 4c2 + } else if(c0 == 'l' && c1 == 'd'){ + 552: 06400793 li a5,100 + 556: 02f68963 beq a3,a5,588 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 55a: 06c00793 li a5,108 + 55e: 04f68263 beq a3,a5,5a2 + } else if(c0 == 'l' && c1 == 'u'){ + 562: 07500793 li a5,117 + 566: 0af68063 beq a3,a5,606 + } else if(c0 == 'l' && c1 == 'x'){ + 56a: 07800793 li a5,120 + 56e: 0ef68263 beq a3,a5,652 + putc(fd, '%'); + 572: 02500593 li a1,37 + 576: 855a mv a0,s6 + 578: e47ff0ef jal 3be + putc(fd, c0); + 57c: 85ca mv a1,s2 + 57e: 855a mv a0,s6 + 580: e3fff0ef jal 3be + state = 0; + 584: 4981 li s3,0 + 586: bf35 j 4c2 + printint(fd, va_arg(ap, uint64), 10, 1); + 588: 008b8913 addi s2,s7,8 + 58c: 4685 li a3,1 + 58e: 4629 li a2,10 + 590: 000bb583 ld a1,0(s7) + 594: 855a mv a0,s6 + 596: e47ff0ef jal 3dc + i += 1; + 59a: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 59c: 8bca mv s7,s2 + state = 0; + 59e: 4981 li s3,0 + i += 1; + 5a0: b70d j 4c2 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5a2: 06400793 li a5,100 + 5a6: 02f60763 beq a2,a5,5d4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5aa: 07500793 li a5,117 + 5ae: 06f60963 beq a2,a5,620 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5b2: 07800793 li a5,120 + 5b6: faf61ee3 bne a2,a5,572 + printint(fd, va_arg(ap, uint64), 16, 0); + 5ba: 008b8913 addi s2,s7,8 + 5be: 4681 li a3,0 + 5c0: 4641 li a2,16 + 5c2: 000bb583 ld a1,0(s7) + 5c6: 855a mv a0,s6 + 5c8: e15ff0ef jal 3dc + i += 2; + 5cc: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5ce: 8bca mv s7,s2 + state = 0; + 5d0: 4981 li s3,0 + i += 2; + 5d2: bdc5 j 4c2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5d4: 008b8913 addi s2,s7,8 + 5d8: 4685 li a3,1 + 5da: 4629 li a2,10 + 5dc: 000bb583 ld a1,0(s7) + 5e0: 855a mv a0,s6 + 5e2: dfbff0ef jal 3dc + i += 2; + 5e6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5e8: 8bca mv s7,s2 + state = 0; + 5ea: 4981 li s3,0 + i += 2; + 5ec: bdd9 j 4c2 + printint(fd, va_arg(ap, uint32), 10, 0); + 5ee: 008b8913 addi s2,s7,8 + 5f2: 4681 li a3,0 + 5f4: 4629 li a2,10 + 5f6: 000be583 lwu a1,0(s7) + 5fa: 855a mv a0,s6 + 5fc: de1ff0ef jal 3dc + 600: 8bca mv s7,s2 + state = 0; + 602: 4981 li s3,0 + 604: bd7d j 4c2 + printint(fd, va_arg(ap, uint64), 10, 0); + 606: 008b8913 addi s2,s7,8 + 60a: 4681 li a3,0 + 60c: 4629 li a2,10 + 60e: 000bb583 ld a1,0(s7) + 612: 855a mv a0,s6 + 614: dc9ff0ef jal 3dc + i += 1; + 618: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 61a: 8bca mv s7,s2 + state = 0; + 61c: 4981 li s3,0 + i += 1; + 61e: b555 j 4c2 + printint(fd, va_arg(ap, uint64), 10, 0); + 620: 008b8913 addi s2,s7,8 + 624: 4681 li a3,0 + 626: 4629 li a2,10 + 628: 000bb583 ld a1,0(s7) + 62c: 855a mv a0,s6 + 62e: dafff0ef jal 3dc + i += 2; + 632: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 634: 8bca mv s7,s2 + state = 0; + 636: 4981 li s3,0 + i += 2; + 638: b569 j 4c2 + printint(fd, va_arg(ap, uint32), 16, 0); + 63a: 008b8913 addi s2,s7,8 + 63e: 4681 li a3,0 + 640: 4641 li a2,16 + 642: 000be583 lwu a1,0(s7) + 646: 855a mv a0,s6 + 648: d95ff0ef jal 3dc + 64c: 8bca mv s7,s2 + state = 0; + 64e: 4981 li s3,0 + 650: bd8d j 4c2 + printint(fd, va_arg(ap, uint64), 16, 0); + 652: 008b8913 addi s2,s7,8 + 656: 4681 li a3,0 + 658: 4641 li a2,16 + 65a: 000bb583 ld a1,0(s7) + 65e: 855a mv a0,s6 + 660: d7dff0ef jal 3dc + i += 1; + 664: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 666: 8bca mv s7,s2 + state = 0; + 668: 4981 li s3,0 + i += 1; + 66a: bda1 j 4c2 + 66c: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 66e: 008b8d13 addi s10,s7,8 + 672: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 676: 03000593 li a1,48 + 67a: 855a mv a0,s6 + 67c: d43ff0ef jal 3be + putc(fd, 'x'); + 680: 07800593 li a1,120 + 684: 855a mv a0,s6 + 686: d39ff0ef jal 3be + 68a: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 68c: 00000b97 auipc s7,0x0 + 690: 2f4b8b93 addi s7,s7,756 # 980 + 694: 03c9d793 srli a5,s3,0x3c + 698: 97de add a5,a5,s7 + 69a: 0007c583 lbu a1,0(a5) + 69e: 855a mv a0,s6 + 6a0: d1fff0ef jal 3be + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6a4: 0992 slli s3,s3,0x4 + 6a6: 397d addiw s2,s2,-1 + 6a8: fe0916e3 bnez s2,694 + printptr(fd, va_arg(ap, uint64)); + 6ac: 8bea mv s7,s10 + state = 0; + 6ae: 4981 li s3,0 + 6b0: 6d02 ld s10,0(sp) + 6b2: bd01 j 4c2 + putc(fd, va_arg(ap, uint32)); + 6b4: 008b8913 addi s2,s7,8 + 6b8: 000bc583 lbu a1,0(s7) + 6bc: 855a mv a0,s6 + 6be: d01ff0ef jal 3be + 6c2: 8bca mv s7,s2 + state = 0; + 6c4: 4981 li s3,0 + 6c6: bbf5 j 4c2 + if((s = va_arg(ap, char*)) == 0) + 6c8: 008b8993 addi s3,s7,8 + 6cc: 000bb903 ld s2,0(s7) + 6d0: 00090f63 beqz s2,6ee + for(; *s; s++) + 6d4: 00094583 lbu a1,0(s2) + 6d8: c195 beqz a1,6fc + putc(fd, *s); + 6da: 855a mv a0,s6 + 6dc: ce3ff0ef jal 3be + for(; *s; s++) + 6e0: 0905 addi s2,s2,1 + 6e2: 00094583 lbu a1,0(s2) + 6e6: f9f5 bnez a1,6da + if((s = va_arg(ap, char*)) == 0) + 6e8: 8bce mv s7,s3 + state = 0; + 6ea: 4981 li s3,0 + 6ec: bbd9 j 4c2 + s = "(null)"; + 6ee: 00000917 auipc s2,0x0 + 6f2: 28a90913 addi s2,s2,650 # 978 + for(; *s; s++) + 6f6: 02800593 li a1,40 + 6fa: b7c5 j 6da + if((s = va_arg(ap, char*)) == 0) + 6fc: 8bce mv s7,s3 + state = 0; + 6fe: 4981 li s3,0 + 700: b3c9 j 4c2 + 702: 64a6 ld s1,72(sp) + 704: 79e2 ld s3,56(sp) + 706: 7a42 ld s4,48(sp) + 708: 7aa2 ld s5,40(sp) + 70a: 7b02 ld s6,32(sp) + 70c: 6be2 ld s7,24(sp) + 70e: 6c42 ld s8,16(sp) + 710: 6ca2 ld s9,8(sp) + } + } +} + 712: 60e6 ld ra,88(sp) + 714: 6446 ld s0,80(sp) + 716: 6906 ld s2,64(sp) + 718: 6125 addi sp,sp,96 + 71a: 8082 ret + +000000000000071c : + +void +fprintf(int fd, const char *fmt, ...) +{ + 71c: 715d addi sp,sp,-80 + 71e: ec06 sd ra,24(sp) + 720: e822 sd s0,16(sp) + 722: 1000 addi s0,sp,32 + 724: e010 sd a2,0(s0) + 726: e414 sd a3,8(s0) + 728: e818 sd a4,16(s0) + 72a: ec1c sd a5,24(s0) + 72c: 03043023 sd a6,32(s0) + 730: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 734: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 738: 8622 mv a2,s0 + 73a: d3fff0ef jal 478 +} + 73e: 60e2 ld ra,24(sp) + 740: 6442 ld s0,16(sp) + 742: 6161 addi sp,sp,80 + 744: 8082 ret + +0000000000000746 : + +void +printf(const char *fmt, ...) +{ + 746: 711d addi sp,sp,-96 + 748: ec06 sd ra,24(sp) + 74a: e822 sd s0,16(sp) + 74c: 1000 addi s0,sp,32 + 74e: e40c sd a1,8(s0) + 750: e810 sd a2,16(s0) + 752: ec14 sd a3,24(s0) + 754: f018 sd a4,32(s0) + 756: f41c sd a5,40(s0) + 758: 03043823 sd a6,48(s0) + 75c: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 760: 00840613 addi a2,s0,8 + 764: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 768: 85aa mv a1,a0 + 76a: 4505 li a0,1 + 76c: d0dff0ef jal 478 +} + 770: 60e2 ld ra,24(sp) + 772: 6442 ld s0,16(sp) + 774: 6125 addi sp,sp,96 + 776: 8082 ret + +0000000000000778 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 778: 1141 addi sp,sp,-16 + 77a: e422 sd s0,8(sp) + 77c: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 77e: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 782: 00001797 auipc a5,0x1 + 786: 87e7b783 ld a5,-1922(a5) # 1000 + 78a: a02d j 7b4 + 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; + 78c: 4618 lw a4,8(a2) + 78e: 9f2d addw a4,a4,a1 + 790: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 794: 6398 ld a4,0(a5) + 796: 6310 ld a2,0(a4) + 798: a83d j 7d6 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 79a: ff852703 lw a4,-8(a0) + 79e: 9f31 addw a4,a4,a2 + 7a0: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7a2: ff053683 ld a3,-16(a0) + 7a6: a091 j 7ea + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7a8: 6398 ld a4,0(a5) + 7aa: 00e7e463 bltu a5,a4,7b2 + 7ae: 00e6ea63 bltu a3,a4,7c2 +{ + 7b2: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7b4: fed7fae3 bgeu a5,a3,7a8 + 7b8: 6398 ld a4,0(a5) + 7ba: 00e6e463 bltu a3,a4,7c2 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7be: fee7eae3 bltu a5,a4,7b2 + if(bp + bp->s.size == p->s.ptr){ + 7c2: ff852583 lw a1,-8(a0) + 7c6: 6390 ld a2,0(a5) + 7c8: 02059813 slli a6,a1,0x20 + 7cc: 01c85713 srli a4,a6,0x1c + 7d0: 9736 add a4,a4,a3 + 7d2: fae60de3 beq a2,a4,78c + bp->s.ptr = p->s.ptr->s.ptr; + 7d6: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7da: 4790 lw a2,8(a5) + 7dc: 02061593 slli a1,a2,0x20 + 7e0: 01c5d713 srli a4,a1,0x1c + 7e4: 973e add a4,a4,a5 + 7e6: fae68ae3 beq a3,a4,79a + p->s.ptr = bp->s.ptr; + 7ea: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7ec: 00001717 auipc a4,0x1 + 7f0: 80f73a23 sd a5,-2028(a4) # 1000 +} + 7f4: 6422 ld s0,8(sp) + 7f6: 0141 addi sp,sp,16 + 7f8: 8082 ret + +00000000000007fa : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7fa: 7139 addi sp,sp,-64 + 7fc: fc06 sd ra,56(sp) + 7fe: f822 sd s0,48(sp) + 800: f426 sd s1,40(sp) + 802: ec4e sd s3,24(sp) + 804: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 806: 02051493 slli s1,a0,0x20 + 80a: 9081 srli s1,s1,0x20 + 80c: 04bd addi s1,s1,15 + 80e: 8091 srli s1,s1,0x4 + 810: 0014899b addiw s3,s1,1 + 814: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 816: 00000517 auipc a0,0x0 + 81a: 7ea53503 ld a0,2026(a0) # 1000 + 81e: c915 beqz a0,852 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 820: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 822: 4798 lw a4,8(a5) + 824: 08977a63 bgeu a4,s1,8b8 + 828: f04a sd s2,32(sp) + 82a: e852 sd s4,16(sp) + 82c: e456 sd s5,8(sp) + 82e: e05a sd s6,0(sp) + if(nu < 4096) + 830: 8a4e mv s4,s3 + 832: 0009871b sext.w a4,s3 + 836: 6685 lui a3,0x1 + 838: 00d77363 bgeu a4,a3,83e + 83c: 6a05 lui s4,0x1 + 83e: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 842: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 846: 00000917 auipc s2,0x0 + 84a: 7ba90913 addi s2,s2,1978 # 1000 + if(p == SBRK_ERROR) + 84e: 5afd li s5,-1 + 850: a081 j 890 + 852: f04a sd s2,32(sp) + 854: e852 sd s4,16(sp) + 856: e456 sd s5,8(sp) + 858: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 85a: 00001797 auipc a5,0x1 + 85e: 9ae78793 addi a5,a5,-1618 # 1208 + 862: 00000717 auipc a4,0x0 + 866: 78f73f23 sd a5,1950(a4) # 1000 + 86a: e39c sd a5,0(a5) + base.s.size = 0; + 86c: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 870: b7c1 j 830 + prevp->s.ptr = p->s.ptr; + 872: 6398 ld a4,0(a5) + 874: e118 sd a4,0(a0) + 876: a8a9 j 8d0 + hp->s.size = nu; + 878: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 87c: 0541 addi a0,a0,16 + 87e: efbff0ef jal 778 + return freep; + 882: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 886: c12d beqz a0,8e8 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 888: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 88a: 4798 lw a4,8(a5) + 88c: 02977263 bgeu a4,s1,8b0 + if(p == freep) + 890: 00093703 ld a4,0(s2) + 894: 853e mv a0,a5 + 896: fef719e3 bne a4,a5,888 + p = sbrk(nu * sizeof(Header)); + 89a: 8552 mv a0,s4 + 89c: a4fff0ef jal 2ea + if(p == SBRK_ERROR) + 8a0: fd551ce3 bne a0,s5,878 + return 0; + 8a4: 4501 li a0,0 + 8a6: 7902 ld s2,32(sp) + 8a8: 6a42 ld s4,16(sp) + 8aa: 6aa2 ld s5,8(sp) + 8ac: 6b02 ld s6,0(sp) + 8ae: a03d j 8dc + 8b0: 7902 ld s2,32(sp) + 8b2: 6a42 ld s4,16(sp) + 8b4: 6aa2 ld s5,8(sp) + 8b6: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 8b8: fae48de3 beq s1,a4,872 + p->s.size -= nunits; + 8bc: 4137073b subw a4,a4,s3 + 8c0: c798 sw a4,8(a5) + p += p->s.size; + 8c2: 02071693 slli a3,a4,0x20 + 8c6: 01c6d713 srli a4,a3,0x1c + 8ca: 97ba add a5,a5,a4 + p->s.size = nunits; + 8cc: 0137a423 sw s3,8(a5) + freep = prevp; + 8d0: 00000717 auipc a4,0x0 + 8d4: 72a73823 sd a0,1840(a4) # 1000 + return (void*)(p + 1); + 8d8: 01078513 addi a0,a5,16 + } +} + 8dc: 70e2 ld ra,56(sp) + 8de: 7442 ld s0,48(sp) + 8e0: 74a2 ld s1,40(sp) + 8e2: 69e2 ld s3,24(sp) + 8e4: 6121 addi sp,sp,64 + 8e6: 8082 ret + 8e8: 7902 ld s2,32(sp) + 8ea: 6a42 ld s4,16(sp) + 8ec: 6aa2 ld s5,8(sp) + 8ee: 6b02 ld s6,0(sp) + 8f0: b7f5 j 8dc diff --git a/G12_Project2_2/user/dorphan.c b/G12_Project2_2/user/dorphan.c new file mode 100644 index 0000000000..e6c6b9fa43 --- /dev/null +++ b/G12_Project2_2/user/dorphan.c @@ -0,0 +1,34 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "kernel/fcntl.h" +#include "user/user.h" + +// Create an orphaned directory and check if test-xv6.py recovers it. + +#define BUFSZ 500 + +char buf[BUFSZ]; + +int +main(int argc, char **argv) +{ + char *s = argv[0]; + + if(mkdir("dd") != 0){ + printf("%s: mkdir dd failed\n", s); + exit(1); + } + + if(chdir("dd") != 0){ + printf("%s: chdir dd failed\n", s); + exit(1); + } + + if (unlink("../dd") < 0) { + printf("%s: unlink failed\n", s); + exit(1); + } + printf("wait for kill and reclaim\n"); + // sit around until killed + for(;;) pause(1000); +} diff --git a/G12_Project2_2/user/dorphan.d b/G12_Project2_2/user/dorphan.d new file mode 100644 index 0000000000..e4a1607984 --- /dev/null +++ b/G12_Project2_2/user/dorphan.d @@ -0,0 +1,2 @@ +user/dorphan.o: user/dorphan.c kernel/types.h kernel/stat.h \ + kernel/fcntl.h user/user.h diff --git a/G12_Project2_2/user/dorphan.o b/G12_Project2_2/user/dorphan.o new file mode 100644 index 0000000000..98a42aa7e2 Binary files /dev/null and b/G12_Project2_2/user/dorphan.o differ diff --git a/G12_Project2_2/user/dorphan.sym b/G12_Project2_2/user/dorphan.sym new file mode 100644 index 0000000000..9edd09f285 --- /dev/null +++ b/G12_Project2_2/user/dorphan.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +00000000000008f8 .rodata +0000000000000998 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 dorphan.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003be putc +00000000000003dc printint +0000000000000980 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001208 base +000000000000009a strcpy +00000000000003ae pause +0000000000000746 printf +00000000000003a6 sys_sbrk +0000000000000244 memmove +0000000000000366 mknod +0000000000000152 gets +000000000000039e getpid +00000000000002d6 memcpy +00000000000007fa malloc +0000000000000300 sbrklazy +000000000000032e pipe +000000000000033e write +0000000000000376 fstat +000000000000071c fprintf +000000000000034e kill +0000000000000478 vprintf +000000000000038e chdir +0000000000000356 exec +0000000000000326 wait +0000000000000336 read +000000000000036e unlink +000000000000029c memcmp +0000000000000316 fork +00000000000002ea sbrk +00000000000003b6 uptime +000000000000010c memset +0000000000000000 main +00000000000000b6 strcmp +0000000000000396 dup +0000000000001010 buf +00000000000001c2 stat +000000000000037e link +000000000000031e exit +000000000000008a start +00000000000001fc atoi +00000000000000e2 strlen +000000000000035e open +000000000000012e strchr +0000000000000386 mkdir +0000000000000346 close +0000000000000778 free diff --git a/G12_Project2_2/user/echo.asm b/G12_Project2_2/user/echo.asm new file mode 100644 index 0000000000..61b227faa7 --- /dev/null +++ b/G12_Project2_2/user/echo.asm @@ -0,0 +1,1512 @@ + +user/_echo: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(int argc, char *argv[]) +{ + 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 + int i; + + for(i = 1; i < argc; i++){ + 12: 4785 li a5,1 + 14: 06a7d063 bge a5,a0,74 + 18: 00858493 addi s1,a1,8 + 1c: 3579 addiw a0,a0,-2 + 1e: 02051793 slli a5,a0,0x20 + 22: 01d7d513 srli a0,a5,0x1d + 26: 00a48a33 add s4,s1,a0 + 2a: 05c1 addi a1,a1,16 + 2c: 00a589b3 add s3,a1,a0 + write(1, argv[i], strlen(argv[i])); + if(i + 1 < argc){ + write(1, " ", 1); + 30: 00001a97 auipc s5,0x1 + 34: 8c0a8a93 addi s5,s5,-1856 # 8f0 + 38: a809 j 4a + 3a: 4605 li a2,1 + 3c: 85d6 mv a1,s5 + 3e: 4505 li a0,1 + 40: 2ee000ef jal 32e + for(i = 1; i < argc; i++){ + 44: 04a1 addi s1,s1,8 + 46: 03348763 beq s1,s3,74 + write(1, argv[i], strlen(argv[i])); + 4a: 0004b903 ld s2,0(s1) + 4e: 854a mv a0,s2 + 50: 082000ef jal d2 + 54: 0005061b sext.w a2,a0 + 58: 85ca mv a1,s2 + 5a: 4505 li a0,1 + 5c: 2d2000ef jal 32e + if(i + 1 < argc){ + 60: fd449de3 bne s1,s4,3a + } else { + write(1, "\n", 1); + 64: 4605 li a2,1 + 66: 00001597 auipc a1,0x1 + 6a: 89258593 addi a1,a1,-1902 # 8f8 + 6e: 4505 li a0,1 + 70: 2be000ef jal 32e + } + } + exit(0); + 74: 4501 li a0,0 + 76: 298000ef jal 30e + +000000000000007a : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 7a: 1141 addi sp,sp,-16 + 7c: e406 sd ra,8(sp) + 7e: e022 sd s0,0(sp) + 80: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 82: f7fff0ef jal 0
+ exit(r); + 86: 288000ef jal 30e + +000000000000008a : +} + +char* +strcpy(char *s, const char *t) +{ + 8a: 1141 addi sp,sp,-16 + 8c: e422 sd s0,8(sp) + 8e: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 90: 87aa mv a5,a0 + 92: 0585 addi a1,a1,1 + 94: 0785 addi a5,a5,1 + 96: fff5c703 lbu a4,-1(a1) + 9a: fee78fa3 sb a4,-1(a5) + 9e: fb75 bnez a4,92 + ; + return os; +} + a0: 6422 ld s0,8(sp) + a2: 0141 addi sp,sp,16 + a4: 8082 ret + +00000000000000a6 : + +int +strcmp(const char *p, const char *q) +{ + a6: 1141 addi sp,sp,-16 + a8: e422 sd s0,8(sp) + aa: 0800 addi s0,sp,16 + while(*p && *p == *q) + ac: 00054783 lbu a5,0(a0) + b0: cb91 beqz a5,c4 + b2: 0005c703 lbu a4,0(a1) + b6: 00f71763 bne a4,a5,c4 + p++, q++; + ba: 0505 addi a0,a0,1 + bc: 0585 addi a1,a1,1 + while(*p && *p == *q) + be: 00054783 lbu a5,0(a0) + c2: fbe5 bnez a5,b2 + return (uchar)*p - (uchar)*q; + c4: 0005c503 lbu a0,0(a1) +} + c8: 40a7853b subw a0,a5,a0 + cc: 6422 ld s0,8(sp) + ce: 0141 addi sp,sp,16 + d0: 8082 ret + +00000000000000d2 : + +uint +strlen(const char *s) +{ + d2: 1141 addi sp,sp,-16 + d4: e422 sd s0,8(sp) + d6: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + d8: 00054783 lbu a5,0(a0) + dc: cf91 beqz a5,f8 + de: 0505 addi a0,a0,1 + e0: 87aa mv a5,a0 + e2: 86be mv a3,a5 + e4: 0785 addi a5,a5,1 + e6: fff7c703 lbu a4,-1(a5) + ea: ff65 bnez a4,e2 + ec: 40a6853b subw a0,a3,a0 + f0: 2505 addiw a0,a0,1 + ; + return n; +} + f2: 6422 ld s0,8(sp) + f4: 0141 addi sp,sp,16 + f6: 8082 ret + for(n = 0; s[n]; n++) + f8: 4501 li a0,0 + fa: bfe5 j f2 + +00000000000000fc : + +void* +memset(void *dst, int c, uint n) +{ + fc: 1141 addi sp,sp,-16 + fe: e422 sd s0,8(sp) + 100: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 102: ca19 beqz a2,118 + 104: 87aa mv a5,a0 + 106: 1602 slli a2,a2,0x20 + 108: 9201 srli a2,a2,0x20 + 10a: 00a60733 add a4,a2,a0 + cdst[i] = c; + 10e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 112: 0785 addi a5,a5,1 + 114: fee79de3 bne a5,a4,10e + } + return dst; +} + 118: 6422 ld s0,8(sp) + 11a: 0141 addi sp,sp,16 + 11c: 8082 ret + +000000000000011e : + +char* +strchr(const char *s, char c) +{ + 11e: 1141 addi sp,sp,-16 + 120: e422 sd s0,8(sp) + 122: 0800 addi s0,sp,16 + for(; *s; s++) + 124: 00054783 lbu a5,0(a0) + 128: cb99 beqz a5,13e + if(*s == c) + 12a: 00f58763 beq a1,a5,138 + for(; *s; s++) + 12e: 0505 addi a0,a0,1 + 130: 00054783 lbu a5,0(a0) + 134: fbfd bnez a5,12a + return (char*)s; + return 0; + 136: 4501 li a0,0 +} + 138: 6422 ld s0,8(sp) + 13a: 0141 addi sp,sp,16 + 13c: 8082 ret + return 0; + 13e: 4501 li a0,0 + 140: bfe5 j 138 + +0000000000000142 : + +char* +gets(char *buf, int max) +{ + 142: 711d addi sp,sp,-96 + 144: ec86 sd ra,88(sp) + 146: e8a2 sd s0,80(sp) + 148: e4a6 sd s1,72(sp) + 14a: e0ca sd s2,64(sp) + 14c: fc4e sd s3,56(sp) + 14e: f852 sd s4,48(sp) + 150: f456 sd s5,40(sp) + 152: f05a sd s6,32(sp) + 154: ec5e sd s7,24(sp) + 156: 1080 addi s0,sp,96 + 158: 8baa mv s7,a0 + 15a: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 15c: 892a mv s2,a0 + 15e: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 160: 4aa9 li s5,10 + 162: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 164: 89a6 mv s3,s1 + 166: 2485 addiw s1,s1,1 + 168: 0344d663 bge s1,s4,194 + cc = read(0, &c, 1); + 16c: 4605 li a2,1 + 16e: faf40593 addi a1,s0,-81 + 172: 4501 li a0,0 + 174: 1b2000ef jal 326 + if(cc < 1) + 178: 00a05e63 blez a0,194 + buf[i++] = c; + 17c: faf44783 lbu a5,-81(s0) + 180: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 184: 01578763 beq a5,s5,192 + 188: 0905 addi s2,s2,1 + 18a: fd679de3 bne a5,s6,164 + buf[i++] = c; + 18e: 89a6 mv s3,s1 + 190: a011 j 194 + 192: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 194: 99de add s3,s3,s7 + 196: 00098023 sb zero,0(s3) + return buf; +} + 19a: 855e mv a0,s7 + 19c: 60e6 ld ra,88(sp) + 19e: 6446 ld s0,80(sp) + 1a0: 64a6 ld s1,72(sp) + 1a2: 6906 ld s2,64(sp) + 1a4: 79e2 ld s3,56(sp) + 1a6: 7a42 ld s4,48(sp) + 1a8: 7aa2 ld s5,40(sp) + 1aa: 7b02 ld s6,32(sp) + 1ac: 6be2 ld s7,24(sp) + 1ae: 6125 addi sp,sp,96 + 1b0: 8082 ret + +00000000000001b2 : + +int +stat(const char *n, struct stat *st) +{ + 1b2: 1101 addi sp,sp,-32 + 1b4: ec06 sd ra,24(sp) + 1b6: e822 sd s0,16(sp) + 1b8: e04a sd s2,0(sp) + 1ba: 1000 addi s0,sp,32 + 1bc: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1be: 4581 li a1,0 + 1c0: 18e000ef jal 34e + if(fd < 0) + 1c4: 02054263 bltz a0,1e8 + 1c8: e426 sd s1,8(sp) + 1ca: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1cc: 85ca mv a1,s2 + 1ce: 198000ef jal 366 + 1d2: 892a mv s2,a0 + close(fd); + 1d4: 8526 mv a0,s1 + 1d6: 160000ef jal 336 + return r; + 1da: 64a2 ld s1,8(sp) +} + 1dc: 854a mv a0,s2 + 1de: 60e2 ld ra,24(sp) + 1e0: 6442 ld s0,16(sp) + 1e2: 6902 ld s2,0(sp) + 1e4: 6105 addi sp,sp,32 + 1e6: 8082 ret + return -1; + 1e8: 597d li s2,-1 + 1ea: bfcd j 1dc + +00000000000001ec : + +int +atoi(const char *s) +{ + 1ec: 1141 addi sp,sp,-16 + 1ee: e422 sd s0,8(sp) + 1f0: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1f2: 00054683 lbu a3,0(a0) + 1f6: fd06879b addiw a5,a3,-48 + 1fa: 0ff7f793 zext.b a5,a5 + 1fe: 4625 li a2,9 + 200: 02f66863 bltu a2,a5,230 + 204: 872a mv a4,a0 + n = 0; + 206: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 208: 0705 addi a4,a4,1 + 20a: 0025179b slliw a5,a0,0x2 + 20e: 9fa9 addw a5,a5,a0 + 210: 0017979b slliw a5,a5,0x1 + 214: 9fb5 addw a5,a5,a3 + 216: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 21a: 00074683 lbu a3,0(a4) + 21e: fd06879b addiw a5,a3,-48 + 222: 0ff7f793 zext.b a5,a5 + 226: fef671e3 bgeu a2,a5,208 + return n; +} + 22a: 6422 ld s0,8(sp) + 22c: 0141 addi sp,sp,16 + 22e: 8082 ret + n = 0; + 230: 4501 li a0,0 + 232: bfe5 j 22a + +0000000000000234 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 234: 1141 addi sp,sp,-16 + 236: e422 sd s0,8(sp) + 238: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 23a: 02b57463 bgeu a0,a1,262 + while(n-- > 0) + 23e: 00c05f63 blez a2,25c + 242: 1602 slli a2,a2,0x20 + 244: 9201 srli a2,a2,0x20 + 246: 00c507b3 add a5,a0,a2 + dst = vdst; + 24a: 872a mv a4,a0 + *dst++ = *src++; + 24c: 0585 addi a1,a1,1 + 24e: 0705 addi a4,a4,1 + 250: fff5c683 lbu a3,-1(a1) + 254: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 258: fef71ae3 bne a4,a5,24c + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 25c: 6422 ld s0,8(sp) + 25e: 0141 addi sp,sp,16 + 260: 8082 ret + dst += n; + 262: 00c50733 add a4,a0,a2 + src += n; + 266: 95b2 add a1,a1,a2 + while(n-- > 0) + 268: fec05ae3 blez a2,25c + 26c: fff6079b addiw a5,a2,-1 + 270: 1782 slli a5,a5,0x20 + 272: 9381 srli a5,a5,0x20 + 274: fff7c793 not a5,a5 + 278: 97ba add a5,a5,a4 + *--dst = *--src; + 27a: 15fd addi a1,a1,-1 + 27c: 177d addi a4,a4,-1 + 27e: 0005c683 lbu a3,0(a1) + 282: 00d70023 sb a3,0(a4) + while(n-- > 0) + 286: fee79ae3 bne a5,a4,27a + 28a: bfc9 j 25c + +000000000000028c : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 28c: 1141 addi sp,sp,-16 + 28e: e422 sd s0,8(sp) + 290: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 292: ca05 beqz a2,2c2 + 294: fff6069b addiw a3,a2,-1 + 298: 1682 slli a3,a3,0x20 + 29a: 9281 srli a3,a3,0x20 + 29c: 0685 addi a3,a3,1 + 29e: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2a0: 00054783 lbu a5,0(a0) + 2a4: 0005c703 lbu a4,0(a1) + 2a8: 00e79863 bne a5,a4,2b8 + return *p1 - *p2; + } + p1++; + 2ac: 0505 addi a0,a0,1 + p2++; + 2ae: 0585 addi a1,a1,1 + while (n-- > 0) { + 2b0: fed518e3 bne a0,a3,2a0 + } + return 0; + 2b4: 4501 li a0,0 + 2b6: a019 j 2bc + return *p1 - *p2; + 2b8: 40e7853b subw a0,a5,a4 +} + 2bc: 6422 ld s0,8(sp) + 2be: 0141 addi sp,sp,16 + 2c0: 8082 ret + return 0; + 2c2: 4501 li a0,0 + 2c4: bfe5 j 2bc + +00000000000002c6 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2c6: 1141 addi sp,sp,-16 + 2c8: e406 sd ra,8(sp) + 2ca: e022 sd s0,0(sp) + 2cc: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2ce: f67ff0ef jal 234 +} + 2d2: 60a2 ld ra,8(sp) + 2d4: 6402 ld s0,0(sp) + 2d6: 0141 addi sp,sp,16 + 2d8: 8082 ret + +00000000000002da : + +char * +sbrk(int n) { + 2da: 1141 addi sp,sp,-16 + 2dc: e406 sd ra,8(sp) + 2de: e022 sd s0,0(sp) + 2e0: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2e2: 4585 li a1,1 + 2e4: 0b2000ef jal 396 +} + 2e8: 60a2 ld ra,8(sp) + 2ea: 6402 ld s0,0(sp) + 2ec: 0141 addi sp,sp,16 + 2ee: 8082 ret + +00000000000002f0 : + +char * +sbrklazy(int 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 sys_sbrk(n, SBRK_LAZY); + 2f8: 4589 li a1,2 + 2fa: 09c000ef jal 396 +} + 2fe: 60a2 ld ra,8(sp) + 300: 6402 ld s0,0(sp) + 302: 0141 addi sp,sp,16 + 304: 8082 ret + +0000000000000306 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 306: 4885 li a7,1 + ecall + 308: 00000073 ecall + ret + 30c: 8082 ret + +000000000000030e : +.global exit +exit: + li a7, SYS_exit + 30e: 4889 li a7,2 + ecall + 310: 00000073 ecall + ret + 314: 8082 ret + +0000000000000316 : +.global wait +wait: + li a7, SYS_wait + 316: 488d li a7,3 + ecall + 318: 00000073 ecall + ret + 31c: 8082 ret + +000000000000031e : +.global pipe +pipe: + li a7, SYS_pipe + 31e: 4891 li a7,4 + ecall + 320: 00000073 ecall + ret + 324: 8082 ret + +0000000000000326 : +.global read +read: + li a7, SYS_read + 326: 4895 li a7,5 + ecall + 328: 00000073 ecall + ret + 32c: 8082 ret + +000000000000032e : +.global write +write: + li a7, SYS_write + 32e: 48c1 li a7,16 + ecall + 330: 00000073 ecall + ret + 334: 8082 ret + +0000000000000336 : +.global close +close: + li a7, SYS_close + 336: 48d5 li a7,21 + ecall + 338: 00000073 ecall + ret + 33c: 8082 ret + +000000000000033e : +.global kill +kill: + li a7, SYS_kill + 33e: 4899 li a7,6 + ecall + 340: 00000073 ecall + ret + 344: 8082 ret + +0000000000000346 : +.global exec +exec: + li a7, SYS_exec + 346: 489d li a7,7 + ecall + 348: 00000073 ecall + ret + 34c: 8082 ret + +000000000000034e : +.global open +open: + li a7, SYS_open + 34e: 48bd li a7,15 + ecall + 350: 00000073 ecall + ret + 354: 8082 ret + +0000000000000356 : +.global mknod +mknod: + li a7, SYS_mknod + 356: 48c5 li a7,17 + ecall + 358: 00000073 ecall + ret + 35c: 8082 ret + +000000000000035e : +.global unlink +unlink: + li a7, SYS_unlink + 35e: 48c9 li a7,18 + ecall + 360: 00000073 ecall + ret + 364: 8082 ret + +0000000000000366 : +.global fstat +fstat: + li a7, SYS_fstat + 366: 48a1 li a7,8 + ecall + 368: 00000073 ecall + ret + 36c: 8082 ret + +000000000000036e : +.global link +link: + li a7, SYS_link + 36e: 48cd li a7,19 + ecall + 370: 00000073 ecall + ret + 374: 8082 ret + +0000000000000376 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 376: 48d1 li a7,20 + ecall + 378: 00000073 ecall + ret + 37c: 8082 ret + +000000000000037e : +.global chdir +chdir: + li a7, SYS_chdir + 37e: 48a5 li a7,9 + ecall + 380: 00000073 ecall + ret + 384: 8082 ret + +0000000000000386 : +.global dup +dup: + li a7, SYS_dup + 386: 48a9 li a7,10 + ecall + 388: 00000073 ecall + ret + 38c: 8082 ret + +000000000000038e : +.global getpid +getpid: + li a7, SYS_getpid + 38e: 48ad li a7,11 + ecall + 390: 00000073 ecall + ret + 394: 8082 ret + +0000000000000396 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 396: 48b1 li a7,12 + ecall + 398: 00000073 ecall + ret + 39c: 8082 ret + +000000000000039e : +.global pause +pause: + li a7, SYS_pause + 39e: 48b5 li a7,13 + ecall + 3a0: 00000073 ecall + ret + 3a4: 8082 ret + +00000000000003a6 : +.global uptime +uptime: + li a7, SYS_uptime + 3a6: 48b9 li a7,14 + ecall + 3a8: 00000073 ecall + ret + 3ac: 8082 ret + +00000000000003ae : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3ae: 1101 addi sp,sp,-32 + 3b0: ec06 sd ra,24(sp) + 3b2: e822 sd s0,16(sp) + 3b4: 1000 addi s0,sp,32 + 3b6: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3ba: 4605 li a2,1 + 3bc: fef40593 addi a1,s0,-17 + 3c0: f6fff0ef jal 32e +} + 3c4: 60e2 ld ra,24(sp) + 3c6: 6442 ld s0,16(sp) + 3c8: 6105 addi sp,sp,32 + 3ca: 8082 ret + +00000000000003cc : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3cc: 715d addi sp,sp,-80 + 3ce: e486 sd ra,72(sp) + 3d0: e0a2 sd s0,64(sp) + 3d2: f84a sd s2,48(sp) + 3d4: 0880 addi s0,sp,80 + 3d6: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3d8: c299 beqz a3,3de + 3da: 0805c363 bltz a1,460 + neg = 0; + 3de: 4881 li a7,0 + 3e0: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3e4: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3e6: 00000517 auipc a0,0x0 + 3ea: 52250513 addi a0,a0,1314 # 908 + 3ee: 883e mv a6,a5 + 3f0: 2785 addiw a5,a5,1 + 3f2: 02c5f733 remu a4,a1,a2 + 3f6: 972a add a4,a4,a0 + 3f8: 00074703 lbu a4,0(a4) + 3fc: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 400: 872e mv a4,a1 + 402: 02c5d5b3 divu a1,a1,a2 + 406: 0685 addi a3,a3,1 + 408: fec773e3 bgeu a4,a2,3ee + if(neg) + 40c: 00088b63 beqz a7,422 + buf[i++] = '-'; + 410: fd078793 addi a5,a5,-48 + 414: 97a2 add a5,a5,s0 + 416: 02d00713 li a4,45 + 41a: fee78423 sb a4,-24(a5) + 41e: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 422: 02f05a63 blez a5,456 + 426: fc26 sd s1,56(sp) + 428: f44e sd s3,40(sp) + 42a: fb840713 addi a4,s0,-72 + 42e: 00f704b3 add s1,a4,a5 + 432: fff70993 addi s3,a4,-1 + 436: 99be add s3,s3,a5 + 438: 37fd addiw a5,a5,-1 + 43a: 1782 slli a5,a5,0x20 + 43c: 9381 srli a5,a5,0x20 + 43e: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 442: fff4c583 lbu a1,-1(s1) + 446: 854a mv a0,s2 + 448: f67ff0ef jal 3ae + while(--i >= 0) + 44c: 14fd addi s1,s1,-1 + 44e: ff349ae3 bne s1,s3,442 + 452: 74e2 ld s1,56(sp) + 454: 79a2 ld s3,40(sp) +} + 456: 60a6 ld ra,72(sp) + 458: 6406 ld s0,64(sp) + 45a: 7942 ld s2,48(sp) + 45c: 6161 addi sp,sp,80 + 45e: 8082 ret + x = -xx; + 460: 40b005b3 neg a1,a1 + neg = 1; + 464: 4885 li a7,1 + x = -xx; + 466: bfad j 3e0 + +0000000000000468 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 468: 711d addi sp,sp,-96 + 46a: ec86 sd ra,88(sp) + 46c: e8a2 sd s0,80(sp) + 46e: e0ca sd s2,64(sp) + 470: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 472: 0005c903 lbu s2,0(a1) + 476: 28090663 beqz s2,702 + 47a: e4a6 sd s1,72(sp) + 47c: fc4e sd s3,56(sp) + 47e: f852 sd s4,48(sp) + 480: f456 sd s5,40(sp) + 482: f05a sd s6,32(sp) + 484: ec5e sd s7,24(sp) + 486: e862 sd s8,16(sp) + 488: e466 sd s9,8(sp) + 48a: 8b2a mv s6,a0 + 48c: 8a2e mv s4,a1 + 48e: 8bb2 mv s7,a2 + state = 0; + 490: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 492: 4481 li s1,0 + 494: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 496: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 49a: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 49e: 06c00c93 li s9,108 + 4a2: a005 j 4c2 + putc(fd, c0); + 4a4: 85ca mv a1,s2 + 4a6: 855a mv a0,s6 + 4a8: f07ff0ef jal 3ae + 4ac: a019 j 4b2 + } else if(state == '%'){ + 4ae: 03598263 beq s3,s5,4d2 + for(i = 0; fmt[i]; i++){ + 4b2: 2485 addiw s1,s1,1 + 4b4: 8726 mv a4,s1 + 4b6: 009a07b3 add a5,s4,s1 + 4ba: 0007c903 lbu s2,0(a5) + 4be: 22090a63 beqz s2,6f2 + c0 = fmt[i] & 0xff; + 4c2: 0009079b sext.w a5,s2 + if(state == 0){ + 4c6: fe0994e3 bnez s3,4ae + if(c0 == '%'){ + 4ca: fd579de3 bne a5,s5,4a4 + state = '%'; + 4ce: 89be mv s3,a5 + 4d0: b7cd j 4b2 + if(c0) c1 = fmt[i+1] & 0xff; + 4d2: 00ea06b3 add a3,s4,a4 + 4d6: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4da: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4dc: c681 beqz a3,4e4 + 4de: 9752 add a4,a4,s4 + 4e0: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4e4: 05878363 beq a5,s8,52a + } else if(c0 == 'l' && c1 == 'd'){ + 4e8: 05978d63 beq a5,s9,542 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4ec: 07500713 li a4,117 + 4f0: 0ee78763 beq a5,a4,5de + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4f4: 07800713 li a4,120 + 4f8: 12e78963 beq a5,a4,62a + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4fc: 07000713 li a4,112 + 500: 14e78e63 beq a5,a4,65c + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 504: 06300713 li a4,99 + 508: 18e78e63 beq a5,a4,6a4 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 50c: 07300713 li a4,115 + 510: 1ae78463 beq a5,a4,6b8 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 514: 02500713 li a4,37 + 518: 04e79563 bne a5,a4,562 + putc(fd, '%'); + 51c: 02500593 li a1,37 + 520: 855a mv a0,s6 + 522: e8dff0ef jal 3ae + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 526: 4981 li s3,0 + 528: b769 j 4b2 + printint(fd, va_arg(ap, int), 10, 1); + 52a: 008b8913 addi s2,s7,8 + 52e: 4685 li a3,1 + 530: 4629 li a2,10 + 532: 000ba583 lw a1,0(s7) + 536: 855a mv a0,s6 + 538: e95ff0ef jal 3cc + 53c: 8bca mv s7,s2 + state = 0; + 53e: 4981 li s3,0 + 540: bf8d j 4b2 + } else if(c0 == 'l' && c1 == 'd'){ + 542: 06400793 li a5,100 + 546: 02f68963 beq a3,a5,578 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 54a: 06c00793 li a5,108 + 54e: 04f68263 beq a3,a5,592 + } else if(c0 == 'l' && c1 == 'u'){ + 552: 07500793 li a5,117 + 556: 0af68063 beq a3,a5,5f6 + } else if(c0 == 'l' && c1 == 'x'){ + 55a: 07800793 li a5,120 + 55e: 0ef68263 beq a3,a5,642 + putc(fd, '%'); + 562: 02500593 li a1,37 + 566: 855a mv a0,s6 + 568: e47ff0ef jal 3ae + putc(fd, c0); + 56c: 85ca mv a1,s2 + 56e: 855a mv a0,s6 + 570: e3fff0ef jal 3ae + state = 0; + 574: 4981 li s3,0 + 576: bf35 j 4b2 + printint(fd, va_arg(ap, uint64), 10, 1); + 578: 008b8913 addi s2,s7,8 + 57c: 4685 li a3,1 + 57e: 4629 li a2,10 + 580: 000bb583 ld a1,0(s7) + 584: 855a mv a0,s6 + 586: e47ff0ef jal 3cc + i += 1; + 58a: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 58c: 8bca mv s7,s2 + state = 0; + 58e: 4981 li s3,0 + i += 1; + 590: b70d j 4b2 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 592: 06400793 li a5,100 + 596: 02f60763 beq a2,a5,5c4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 59a: 07500793 li a5,117 + 59e: 06f60963 beq a2,a5,610 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5a2: 07800793 li a5,120 + 5a6: faf61ee3 bne a2,a5,562 + printint(fd, va_arg(ap, uint64), 16, 0); + 5aa: 008b8913 addi s2,s7,8 + 5ae: 4681 li a3,0 + 5b0: 4641 li a2,16 + 5b2: 000bb583 ld a1,0(s7) + 5b6: 855a mv a0,s6 + 5b8: e15ff0ef jal 3cc + i += 2; + 5bc: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5be: 8bca mv s7,s2 + state = 0; + 5c0: 4981 li s3,0 + i += 2; + 5c2: bdc5 j 4b2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5c4: 008b8913 addi s2,s7,8 + 5c8: 4685 li a3,1 + 5ca: 4629 li a2,10 + 5cc: 000bb583 ld a1,0(s7) + 5d0: 855a mv a0,s6 + 5d2: dfbff0ef jal 3cc + i += 2; + 5d6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5d8: 8bca mv s7,s2 + state = 0; + 5da: 4981 li s3,0 + i += 2; + 5dc: bdd9 j 4b2 + printint(fd, va_arg(ap, uint32), 10, 0); + 5de: 008b8913 addi s2,s7,8 + 5e2: 4681 li a3,0 + 5e4: 4629 li a2,10 + 5e6: 000be583 lwu a1,0(s7) + 5ea: 855a mv a0,s6 + 5ec: de1ff0ef jal 3cc + 5f0: 8bca mv s7,s2 + state = 0; + 5f2: 4981 li s3,0 + 5f4: bd7d j 4b2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5f6: 008b8913 addi s2,s7,8 + 5fa: 4681 li a3,0 + 5fc: 4629 li a2,10 + 5fe: 000bb583 ld a1,0(s7) + 602: 855a mv a0,s6 + 604: dc9ff0ef jal 3cc + i += 1; + 608: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 60a: 8bca mv s7,s2 + state = 0; + 60c: 4981 li s3,0 + i += 1; + 60e: b555 j 4b2 + printint(fd, va_arg(ap, uint64), 10, 0); + 610: 008b8913 addi s2,s7,8 + 614: 4681 li a3,0 + 616: 4629 li a2,10 + 618: 000bb583 ld a1,0(s7) + 61c: 855a mv a0,s6 + 61e: dafff0ef jal 3cc + i += 2; + 622: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 624: 8bca mv s7,s2 + state = 0; + 626: 4981 li s3,0 + i += 2; + 628: b569 j 4b2 + printint(fd, va_arg(ap, uint32), 16, 0); + 62a: 008b8913 addi s2,s7,8 + 62e: 4681 li a3,0 + 630: 4641 li a2,16 + 632: 000be583 lwu a1,0(s7) + 636: 855a mv a0,s6 + 638: d95ff0ef jal 3cc + 63c: 8bca mv s7,s2 + state = 0; + 63e: 4981 li s3,0 + 640: bd8d j 4b2 + printint(fd, va_arg(ap, uint64), 16, 0); + 642: 008b8913 addi s2,s7,8 + 646: 4681 li a3,0 + 648: 4641 li a2,16 + 64a: 000bb583 ld a1,0(s7) + 64e: 855a mv a0,s6 + 650: d7dff0ef jal 3cc + i += 1; + 654: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 656: 8bca mv s7,s2 + state = 0; + 658: 4981 li s3,0 + i += 1; + 65a: bda1 j 4b2 + 65c: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 65e: 008b8d13 addi s10,s7,8 + 662: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 666: 03000593 li a1,48 + 66a: 855a mv a0,s6 + 66c: d43ff0ef jal 3ae + putc(fd, 'x'); + 670: 07800593 li a1,120 + 674: 855a mv a0,s6 + 676: d39ff0ef jal 3ae + 67a: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 67c: 00000b97 auipc s7,0x0 + 680: 28cb8b93 addi s7,s7,652 # 908 + 684: 03c9d793 srli a5,s3,0x3c + 688: 97de add a5,a5,s7 + 68a: 0007c583 lbu a1,0(a5) + 68e: 855a mv a0,s6 + 690: d1fff0ef jal 3ae + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 694: 0992 slli s3,s3,0x4 + 696: 397d addiw s2,s2,-1 + 698: fe0916e3 bnez s2,684 + printptr(fd, va_arg(ap, uint64)); + 69c: 8bea mv s7,s10 + state = 0; + 69e: 4981 li s3,0 + 6a0: 6d02 ld s10,0(sp) + 6a2: bd01 j 4b2 + putc(fd, va_arg(ap, uint32)); + 6a4: 008b8913 addi s2,s7,8 + 6a8: 000bc583 lbu a1,0(s7) + 6ac: 855a mv a0,s6 + 6ae: d01ff0ef jal 3ae + 6b2: 8bca mv s7,s2 + state = 0; + 6b4: 4981 li s3,0 + 6b6: bbf5 j 4b2 + if((s = va_arg(ap, char*)) == 0) + 6b8: 008b8993 addi s3,s7,8 + 6bc: 000bb903 ld s2,0(s7) + 6c0: 00090f63 beqz s2,6de + for(; *s; s++) + 6c4: 00094583 lbu a1,0(s2) + 6c8: c195 beqz a1,6ec + putc(fd, *s); + 6ca: 855a mv a0,s6 + 6cc: ce3ff0ef jal 3ae + for(; *s; s++) + 6d0: 0905 addi s2,s2,1 + 6d2: 00094583 lbu a1,0(s2) + 6d6: f9f5 bnez a1,6ca + if((s = va_arg(ap, char*)) == 0) + 6d8: 8bce mv s7,s3 + state = 0; + 6da: 4981 li s3,0 + 6dc: bbd9 j 4b2 + s = "(null)"; + 6de: 00000917 auipc s2,0x0 + 6e2: 22290913 addi s2,s2,546 # 900 + for(; *s; s++) + 6e6: 02800593 li a1,40 + 6ea: b7c5 j 6ca + if((s = va_arg(ap, char*)) == 0) + 6ec: 8bce mv s7,s3 + state = 0; + 6ee: 4981 li s3,0 + 6f0: b3c9 j 4b2 + 6f2: 64a6 ld s1,72(sp) + 6f4: 79e2 ld s3,56(sp) + 6f6: 7a42 ld s4,48(sp) + 6f8: 7aa2 ld s5,40(sp) + 6fa: 7b02 ld s6,32(sp) + 6fc: 6be2 ld s7,24(sp) + 6fe: 6c42 ld s8,16(sp) + 700: 6ca2 ld s9,8(sp) + } + } +} + 702: 60e6 ld ra,88(sp) + 704: 6446 ld s0,80(sp) + 706: 6906 ld s2,64(sp) + 708: 6125 addi sp,sp,96 + 70a: 8082 ret + +000000000000070c : + +void +fprintf(int fd, const char *fmt, ...) +{ + 70c: 715d addi sp,sp,-80 + 70e: ec06 sd ra,24(sp) + 710: e822 sd s0,16(sp) + 712: 1000 addi s0,sp,32 + 714: e010 sd a2,0(s0) + 716: e414 sd a3,8(s0) + 718: e818 sd a4,16(s0) + 71a: ec1c sd a5,24(s0) + 71c: 03043023 sd a6,32(s0) + 720: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 724: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 728: 8622 mv a2,s0 + 72a: d3fff0ef jal 468 +} + 72e: 60e2 ld ra,24(sp) + 730: 6442 ld s0,16(sp) + 732: 6161 addi sp,sp,80 + 734: 8082 ret + +0000000000000736 : + +void +printf(const char *fmt, ...) +{ + 736: 711d addi sp,sp,-96 + 738: ec06 sd ra,24(sp) + 73a: e822 sd s0,16(sp) + 73c: 1000 addi s0,sp,32 + 73e: e40c sd a1,8(s0) + 740: e810 sd a2,16(s0) + 742: ec14 sd a3,24(s0) + 744: f018 sd a4,32(s0) + 746: f41c sd a5,40(s0) + 748: 03043823 sd a6,48(s0) + 74c: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 750: 00840613 addi a2,s0,8 + 754: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 758: 85aa mv a1,a0 + 75a: 4505 li a0,1 + 75c: d0dff0ef jal 468 +} + 760: 60e2 ld ra,24(sp) + 762: 6442 ld s0,16(sp) + 764: 6125 addi sp,sp,96 + 766: 8082 ret + +0000000000000768 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 768: 1141 addi sp,sp,-16 + 76a: e422 sd s0,8(sp) + 76c: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 76e: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 772: 00001797 auipc a5,0x1 + 776: 88e7b783 ld a5,-1906(a5) # 1000 + 77a: a02d j 7a4 + 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; + 77c: 4618 lw a4,8(a2) + 77e: 9f2d addw a4,a4,a1 + 780: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 784: 6398 ld a4,0(a5) + 786: 6310 ld a2,0(a4) + 788: a83d j 7c6 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 78a: ff852703 lw a4,-8(a0) + 78e: 9f31 addw a4,a4,a2 + 790: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 792: ff053683 ld a3,-16(a0) + 796: a091 j 7da + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 798: 6398 ld a4,0(a5) + 79a: 00e7e463 bltu a5,a4,7a2 + 79e: 00e6ea63 bltu a3,a4,7b2 +{ + 7a2: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7a4: fed7fae3 bgeu a5,a3,798 + 7a8: 6398 ld a4,0(a5) + 7aa: 00e6e463 bltu a3,a4,7b2 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7ae: fee7eae3 bltu a5,a4,7a2 + if(bp + bp->s.size == p->s.ptr){ + 7b2: ff852583 lw a1,-8(a0) + 7b6: 6390 ld a2,0(a5) + 7b8: 02059813 slli a6,a1,0x20 + 7bc: 01c85713 srli a4,a6,0x1c + 7c0: 9736 add a4,a4,a3 + 7c2: fae60de3 beq a2,a4,77c + bp->s.ptr = p->s.ptr->s.ptr; + 7c6: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7ca: 4790 lw a2,8(a5) + 7cc: 02061593 slli a1,a2,0x20 + 7d0: 01c5d713 srli a4,a1,0x1c + 7d4: 973e add a4,a4,a5 + 7d6: fae68ae3 beq a3,a4,78a + p->s.ptr = bp->s.ptr; + 7da: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7dc: 00001717 auipc a4,0x1 + 7e0: 82f73223 sd a5,-2012(a4) # 1000 +} + 7e4: 6422 ld s0,8(sp) + 7e6: 0141 addi sp,sp,16 + 7e8: 8082 ret + +00000000000007ea : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7ea: 7139 addi sp,sp,-64 + 7ec: fc06 sd ra,56(sp) + 7ee: f822 sd s0,48(sp) + 7f0: f426 sd s1,40(sp) + 7f2: ec4e sd s3,24(sp) + 7f4: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7f6: 02051493 slli s1,a0,0x20 + 7fa: 9081 srli s1,s1,0x20 + 7fc: 04bd addi s1,s1,15 + 7fe: 8091 srli s1,s1,0x4 + 800: 0014899b addiw s3,s1,1 + 804: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 806: 00000517 auipc a0,0x0 + 80a: 7fa53503 ld a0,2042(a0) # 1000 + 80e: c915 beqz a0,842 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 810: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 812: 4798 lw a4,8(a5) + 814: 08977a63 bgeu a4,s1,8a8 + 818: f04a sd s2,32(sp) + 81a: e852 sd s4,16(sp) + 81c: e456 sd s5,8(sp) + 81e: e05a sd s6,0(sp) + if(nu < 4096) + 820: 8a4e mv s4,s3 + 822: 0009871b sext.w a4,s3 + 826: 6685 lui a3,0x1 + 828: 00d77363 bgeu a4,a3,82e + 82c: 6a05 lui s4,0x1 + 82e: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 832: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 836: 00000917 auipc s2,0x0 + 83a: 7ca90913 addi s2,s2,1994 # 1000 + if(p == SBRK_ERROR) + 83e: 5afd li s5,-1 + 840: a081 j 880 + 842: f04a sd s2,32(sp) + 844: e852 sd s4,16(sp) + 846: e456 sd s5,8(sp) + 848: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 84a: 00000797 auipc a5,0x0 + 84e: 7c678793 addi a5,a5,1990 # 1010 + 852: 00000717 auipc a4,0x0 + 856: 7af73723 sd a5,1966(a4) # 1000 + 85a: e39c sd a5,0(a5) + base.s.size = 0; + 85c: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 860: b7c1 j 820 + prevp->s.ptr = p->s.ptr; + 862: 6398 ld a4,0(a5) + 864: e118 sd a4,0(a0) + 866: a8a9 j 8c0 + hp->s.size = nu; + 868: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 86c: 0541 addi a0,a0,16 + 86e: efbff0ef jal 768 + return freep; + 872: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 876: c12d beqz a0,8d8 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 878: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 87a: 4798 lw a4,8(a5) + 87c: 02977263 bgeu a4,s1,8a0 + if(p == freep) + 880: 00093703 ld a4,0(s2) + 884: 853e mv a0,a5 + 886: fef719e3 bne a4,a5,878 + p = sbrk(nu * sizeof(Header)); + 88a: 8552 mv a0,s4 + 88c: a4fff0ef jal 2da + if(p == SBRK_ERROR) + 890: fd551ce3 bne a0,s5,868 + return 0; + 894: 4501 li a0,0 + 896: 7902 ld s2,32(sp) + 898: 6a42 ld s4,16(sp) + 89a: 6aa2 ld s5,8(sp) + 89c: 6b02 ld s6,0(sp) + 89e: a03d j 8cc + 8a0: 7902 ld s2,32(sp) + 8a2: 6a42 ld s4,16(sp) + 8a4: 6aa2 ld s5,8(sp) + 8a6: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 8a8: fae48de3 beq s1,a4,862 + p->s.size -= nunits; + 8ac: 4137073b subw a4,a4,s3 + 8b0: c798 sw a4,8(a5) + p += p->s.size; + 8b2: 02071693 slli a3,a4,0x20 + 8b6: 01c6d713 srli a4,a3,0x1c + 8ba: 97ba add a5,a5,a4 + p->s.size = nunits; + 8bc: 0137a423 sw s3,8(a5) + freep = prevp; + 8c0: 00000717 auipc a4,0x0 + 8c4: 74a73023 sd a0,1856(a4) # 1000 + return (void*)(p + 1); + 8c8: 01078513 addi a0,a5,16 + } +} + 8cc: 70e2 ld ra,56(sp) + 8ce: 7442 ld s0,48(sp) + 8d0: 74a2 ld s1,40(sp) + 8d2: 69e2 ld s3,24(sp) + 8d4: 6121 addi sp,sp,64 + 8d6: 8082 ret + 8d8: 7902 ld s2,32(sp) + 8da: 6a42 ld s4,16(sp) + 8dc: 6aa2 ld s5,8(sp) + 8de: 6b02 ld s6,0(sp) + 8e0: b7f5 j 8cc diff --git a/G12_Project2_2/user/echo.c b/G12_Project2_2/user/echo.c new file mode 100644 index 0000000000..3f19cd7f1d --- /dev/null +++ b/G12_Project2_2/user/echo.c @@ -0,0 +1,19 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "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/G12_Project2_2/user/echo.d b/G12_Project2_2/user/echo.d new file mode 100644 index 0000000000..ccfe98413c --- /dev/null +++ b/G12_Project2_2/user/echo.d @@ -0,0 +1 @@ +user/echo.o: user/echo.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project2_2/user/echo.o b/G12_Project2_2/user/echo.o new file mode 100644 index 0000000000..30bdf1a71b Binary files /dev/null and b/G12_Project2_2/user/echo.o differ diff --git a/G12_Project2_2/user/echo.sym b/G12_Project2_2/user/echo.sym new file mode 100644 index 0000000000..424f8559ff --- /dev/null +++ b/G12_Project2_2/user/echo.sym @@ -0,0 +1,65 @@ +0000000000000000 .text +00000000000008e8 .rodata +0000000000000920 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 echo.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003ae putc +00000000000003cc printint +0000000000000908 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +000000000000008a strcpy +000000000000039e pause +0000000000000736 printf +0000000000000396 sys_sbrk +0000000000000234 memmove +0000000000000356 mknod +0000000000000142 gets +000000000000038e getpid +00000000000002c6 memcpy +00000000000007ea malloc +00000000000002f0 sbrklazy +000000000000031e pipe +000000000000032e write +0000000000000366 fstat +000000000000070c fprintf +000000000000033e kill +0000000000000468 vprintf +000000000000037e chdir +0000000000000346 exec +0000000000000316 wait +0000000000000326 read +000000000000035e unlink +000000000000028c memcmp +0000000000000306 fork +00000000000002da sbrk +00000000000003a6 uptime +00000000000000fc memset +0000000000000000 main +00000000000000a6 strcmp +0000000000000386 dup +00000000000001b2 stat +000000000000036e link +000000000000030e exit +000000000000007a start +00000000000001ec atoi +00000000000000d2 strlen +000000000000034e open +000000000000011e strchr +0000000000000376 mkdir +0000000000000336 close +0000000000000768 free diff --git a/G12_Project2_2/user/forktest.asm b/G12_Project2_2/user/forktest.asm new file mode 100644 index 0000000000..b20943c545 --- /dev/null +++ b/G12_Project2_2/user/forktest.asm @@ -0,0 +1,817 @@ + +user/_forktest: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + +#define N 1000 + +void +print(const char *s) +{ + 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: 1000 addi s0,sp,32 + a: 84aa mv s1,a0 + write(1, s, strlen(s)); + c: 122000ef jal 12e + 10: 0005061b sext.w a2,a0 + 14: 85a6 mv a1,s1 + 16: 4505 li a0,1 + 18: 372000ef jal 38a +} + 1c: 60e2 ld ra,24(sp) + 1e: 6442 ld s0,16(sp) + 20: 64a2 ld s1,8(sp) + 22: 6105 addi sp,sp,32 + 24: 8082 ret + +0000000000000026 : + +void +forktest(void) +{ + 26: 1101 addi sp,sp,-32 + 28: ec06 sd ra,24(sp) + 2a: e822 sd s0,16(sp) + 2c: e426 sd s1,8(sp) + 2e: e04a sd s2,0(sp) + 30: 1000 addi s0,sp,32 + int n, pid; + + print("fork test\n"); + 32: 00000517 auipc a0,0x0 + 36: 3de50513 addi a0,a0,990 # 410 + 3a: fc7ff0ef jal 0 + + for(n=0; n + if(pid < 0) + 48: 04054363 bltz a0,8e + break; + if(pid == 0) + 4c: cd09 beqz a0,66 + for(n=0; n + exit(0); + } + + if(n == N){ + print("fork claimed to work N times!\n"); + 54: 00000517 auipc a0,0x0 + 58: 40c50513 addi a0,a0,1036 # 460 + 5c: fa5ff0ef jal 0 + exit(1); + 60: 4505 li a0,1 + 62: 308000ef jal 36a + exit(0); + 66: 304000ef jal 36a + } + + for(; n > 0; n--){ + if(wait(0) < 0){ + print("wait stopped early\n"); + 6a: 00000517 auipc a0,0x0 + 6e: 3b650513 addi a0,a0,950 # 420 + 72: f8fff0ef jal 0 + exit(1); + 76: 4505 li a0,1 + 78: 2f2000ef jal 36a + } + } + + if(wait(0) != -1){ + print("wait got too many\n"); + 7c: 00000517 auipc a0,0x0 + 80: 3bc50513 addi a0,a0,956 # 438 + 84: f7dff0ef jal 0 + exit(1); + 88: 4505 li a0,1 + 8a: 2e0000ef jal 36a + for(; n > 0; n--){ + 8e: 00905963 blez s1,a0 + if(wait(0) < 0){ + 92: 4501 li a0,0 + 94: 2de000ef jal 372 + 98: fc0549e3 bltz a0,6a + for(; n > 0; n--){ + 9c: 34fd addiw s1,s1,-1 + 9e: f8f5 bnez s1,92 + if(wait(0) != -1){ + a0: 4501 li a0,0 + a2: 2d0000ef jal 372 + a6: 57fd li a5,-1 + a8: fcf51ae3 bne a0,a5,7c + } + + print("fork test OK\n"); + ac: 00000517 auipc a0,0x0 + b0: 3a450513 addi a0,a0,932 # 450 + b4: f4dff0ef jal 0 +} + b8: 60e2 ld ra,24(sp) + ba: 6442 ld s0,16(sp) + bc: 64a2 ld s1,8(sp) + be: 6902 ld s2,0(sp) + c0: 6105 addi sp,sp,32 + c2: 8082 ret + +00000000000000c4
: + +int +main(void) +{ + c4: 1141 addi sp,sp,-16 + c6: e406 sd ra,8(sp) + c8: e022 sd s0,0(sp) + ca: 0800 addi s0,sp,16 + forktest(); + cc: f5bff0ef jal 26 + exit(0); + d0: 4501 li a0,0 + d2: 298000ef jal 36a + +00000000000000d6 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + d6: 1141 addi sp,sp,-16 + d8: e406 sd ra,8(sp) + da: e022 sd s0,0(sp) + dc: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + de: fe7ff0ef jal c4
+ exit(r); + e2: 288000ef jal 36a + +00000000000000e6 : +} + +char* +strcpy(char *s, const char *t) +{ + e6: 1141 addi sp,sp,-16 + e8: e422 sd s0,8(sp) + ea: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + ec: 87aa mv a5,a0 + ee: 0585 addi a1,a1,1 + f0: 0785 addi a5,a5,1 + f2: fff5c703 lbu a4,-1(a1) + f6: fee78fa3 sb a4,-1(a5) + fa: fb75 bnez a4,ee + ; + return os; +} + fc: 6422 ld s0,8(sp) + fe: 0141 addi sp,sp,16 + 100: 8082 ret + +0000000000000102 : + +int +strcmp(const char *p, const char *q) +{ + 102: 1141 addi sp,sp,-16 + 104: e422 sd s0,8(sp) + 106: 0800 addi s0,sp,16 + while(*p && *p == *q) + 108: 00054783 lbu a5,0(a0) + 10c: cb91 beqz a5,120 + 10e: 0005c703 lbu a4,0(a1) + 112: 00f71763 bne a4,a5,120 + p++, q++; + 116: 0505 addi a0,a0,1 + 118: 0585 addi a1,a1,1 + while(*p && *p == *q) + 11a: 00054783 lbu a5,0(a0) + 11e: fbe5 bnez a5,10e + return (uchar)*p - (uchar)*q; + 120: 0005c503 lbu a0,0(a1) +} + 124: 40a7853b subw a0,a5,a0 + 128: 6422 ld s0,8(sp) + 12a: 0141 addi sp,sp,16 + 12c: 8082 ret + +000000000000012e : + +uint +strlen(const char *s) +{ + 12e: 1141 addi sp,sp,-16 + 130: e422 sd s0,8(sp) + 132: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 134: 00054783 lbu a5,0(a0) + 138: cf91 beqz a5,154 + 13a: 0505 addi a0,a0,1 + 13c: 87aa mv a5,a0 + 13e: 86be mv a3,a5 + 140: 0785 addi a5,a5,1 + 142: fff7c703 lbu a4,-1(a5) + 146: ff65 bnez a4,13e + 148: 40a6853b subw a0,a3,a0 + 14c: 2505 addiw a0,a0,1 + ; + return n; +} + 14e: 6422 ld s0,8(sp) + 150: 0141 addi sp,sp,16 + 152: 8082 ret + for(n = 0; s[n]; n++) + 154: 4501 li a0,0 + 156: bfe5 j 14e + +0000000000000158 : + +void* +memset(void *dst, int c, uint n) +{ + 158: 1141 addi sp,sp,-16 + 15a: e422 sd s0,8(sp) + 15c: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 15e: ca19 beqz a2,174 + 160: 87aa mv a5,a0 + 162: 1602 slli a2,a2,0x20 + 164: 9201 srli a2,a2,0x20 + 166: 00a60733 add a4,a2,a0 + cdst[i] = c; + 16a: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 16e: 0785 addi a5,a5,1 + 170: fee79de3 bne a5,a4,16a + } + return dst; +} + 174: 6422 ld s0,8(sp) + 176: 0141 addi sp,sp,16 + 178: 8082 ret + +000000000000017a : + +char* +strchr(const char *s, char c) +{ + 17a: 1141 addi sp,sp,-16 + 17c: e422 sd s0,8(sp) + 17e: 0800 addi s0,sp,16 + for(; *s; s++) + 180: 00054783 lbu a5,0(a0) + 184: cb99 beqz a5,19a + if(*s == c) + 186: 00f58763 beq a1,a5,194 + for(; *s; s++) + 18a: 0505 addi a0,a0,1 + 18c: 00054783 lbu a5,0(a0) + 190: fbfd bnez a5,186 + return (char*)s; + return 0; + 192: 4501 li a0,0 +} + 194: 6422 ld s0,8(sp) + 196: 0141 addi sp,sp,16 + 198: 8082 ret + return 0; + 19a: 4501 li a0,0 + 19c: bfe5 j 194 + +000000000000019e : + +char* +gets(char *buf, int max) +{ + 19e: 711d addi sp,sp,-96 + 1a0: ec86 sd ra,88(sp) + 1a2: e8a2 sd s0,80(sp) + 1a4: e4a6 sd s1,72(sp) + 1a6: e0ca sd s2,64(sp) + 1a8: fc4e sd s3,56(sp) + 1aa: f852 sd s4,48(sp) + 1ac: f456 sd s5,40(sp) + 1ae: f05a sd s6,32(sp) + 1b0: ec5e sd s7,24(sp) + 1b2: 1080 addi s0,sp,96 + 1b4: 8baa mv s7,a0 + 1b6: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1b8: 892a mv s2,a0 + 1ba: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1bc: 4aa9 li s5,10 + 1be: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1c0: 89a6 mv s3,s1 + 1c2: 2485 addiw s1,s1,1 + 1c4: 0344d663 bge s1,s4,1f0 + cc = read(0, &c, 1); + 1c8: 4605 li a2,1 + 1ca: faf40593 addi a1,s0,-81 + 1ce: 4501 li a0,0 + 1d0: 1b2000ef jal 382 + if(cc < 1) + 1d4: 00a05e63 blez a0,1f0 + buf[i++] = c; + 1d8: faf44783 lbu a5,-81(s0) + 1dc: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1e0: 01578763 beq a5,s5,1ee + 1e4: 0905 addi s2,s2,1 + 1e6: fd679de3 bne a5,s6,1c0 + buf[i++] = c; + 1ea: 89a6 mv s3,s1 + 1ec: a011 j 1f0 + 1ee: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1f0: 99de add s3,s3,s7 + 1f2: 00098023 sb zero,0(s3) + return buf; +} + 1f6: 855e mv a0,s7 + 1f8: 60e6 ld ra,88(sp) + 1fa: 6446 ld s0,80(sp) + 1fc: 64a6 ld s1,72(sp) + 1fe: 6906 ld s2,64(sp) + 200: 79e2 ld s3,56(sp) + 202: 7a42 ld s4,48(sp) + 204: 7aa2 ld s5,40(sp) + 206: 7b02 ld s6,32(sp) + 208: 6be2 ld s7,24(sp) + 20a: 6125 addi sp,sp,96 + 20c: 8082 ret + +000000000000020e : + +int +stat(const char *n, struct stat *st) +{ + 20e: 1101 addi sp,sp,-32 + 210: ec06 sd ra,24(sp) + 212: e822 sd s0,16(sp) + 214: e04a sd s2,0(sp) + 216: 1000 addi s0,sp,32 + 218: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 21a: 4581 li a1,0 + 21c: 18e000ef jal 3aa + if(fd < 0) + 220: 02054263 bltz a0,244 + 224: e426 sd s1,8(sp) + 226: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 228: 85ca mv a1,s2 + 22a: 198000ef jal 3c2 + 22e: 892a mv s2,a0 + close(fd); + 230: 8526 mv a0,s1 + 232: 160000ef jal 392 + return r; + 236: 64a2 ld s1,8(sp) +} + 238: 854a mv a0,s2 + 23a: 60e2 ld ra,24(sp) + 23c: 6442 ld s0,16(sp) + 23e: 6902 ld s2,0(sp) + 240: 6105 addi sp,sp,32 + 242: 8082 ret + return -1; + 244: 597d li s2,-1 + 246: bfcd j 238 + +0000000000000248 : + +int +atoi(const char *s) +{ + 248: 1141 addi sp,sp,-16 + 24a: e422 sd s0,8(sp) + 24c: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 24e: 00054683 lbu a3,0(a0) + 252: fd06879b addiw a5,a3,-48 + 256: 0ff7f793 zext.b a5,a5 + 25a: 4625 li a2,9 + 25c: 02f66863 bltu a2,a5,28c + 260: 872a mv a4,a0 + n = 0; + 262: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 264: 0705 addi a4,a4,1 + 266: 0025179b slliw a5,a0,0x2 + 26a: 9fa9 addw a5,a5,a0 + 26c: 0017979b slliw a5,a5,0x1 + 270: 9fb5 addw a5,a5,a3 + 272: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 276: 00074683 lbu a3,0(a4) + 27a: fd06879b addiw a5,a3,-48 + 27e: 0ff7f793 zext.b a5,a5 + 282: fef671e3 bgeu a2,a5,264 + return n; +} + 286: 6422 ld s0,8(sp) + 288: 0141 addi sp,sp,16 + 28a: 8082 ret + n = 0; + 28c: 4501 li a0,0 + 28e: bfe5 j 286 + +0000000000000290 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 290: 1141 addi sp,sp,-16 + 292: e422 sd s0,8(sp) + 294: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 296: 02b57463 bgeu a0,a1,2be + while(n-- > 0) + 29a: 00c05f63 blez a2,2b8 + 29e: 1602 slli a2,a2,0x20 + 2a0: 9201 srli a2,a2,0x20 + 2a2: 00c507b3 add a5,a0,a2 + dst = vdst; + 2a6: 872a mv a4,a0 + *dst++ = *src++; + 2a8: 0585 addi a1,a1,1 + 2aa: 0705 addi a4,a4,1 + 2ac: fff5c683 lbu a3,-1(a1) + 2b0: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2b4: fef71ae3 bne a4,a5,2a8 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2b8: 6422 ld s0,8(sp) + 2ba: 0141 addi sp,sp,16 + 2bc: 8082 ret + dst += n; + 2be: 00c50733 add a4,a0,a2 + src += n; + 2c2: 95b2 add a1,a1,a2 + while(n-- > 0) + 2c4: fec05ae3 blez a2,2b8 + 2c8: fff6079b addiw a5,a2,-1 + 2cc: 1782 slli a5,a5,0x20 + 2ce: 9381 srli a5,a5,0x20 + 2d0: fff7c793 not a5,a5 + 2d4: 97ba add a5,a5,a4 + *--dst = *--src; + 2d6: 15fd addi a1,a1,-1 + 2d8: 177d addi a4,a4,-1 + 2da: 0005c683 lbu a3,0(a1) + 2de: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2e2: fee79ae3 bne a5,a4,2d6 + 2e6: bfc9 j 2b8 + +00000000000002e8 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2e8: 1141 addi sp,sp,-16 + 2ea: e422 sd s0,8(sp) + 2ec: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2ee: ca05 beqz a2,31e + 2f0: fff6069b addiw a3,a2,-1 + 2f4: 1682 slli a3,a3,0x20 + 2f6: 9281 srli a3,a3,0x20 + 2f8: 0685 addi a3,a3,1 + 2fa: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2fc: 00054783 lbu a5,0(a0) + 300: 0005c703 lbu a4,0(a1) + 304: 00e79863 bne a5,a4,314 + return *p1 - *p2; + } + p1++; + 308: 0505 addi a0,a0,1 + p2++; + 30a: 0585 addi a1,a1,1 + while (n-- > 0) { + 30c: fed518e3 bne a0,a3,2fc + } + return 0; + 310: 4501 li a0,0 + 312: a019 j 318 + return *p1 - *p2; + 314: 40e7853b subw a0,a5,a4 +} + 318: 6422 ld s0,8(sp) + 31a: 0141 addi sp,sp,16 + 31c: 8082 ret + return 0; + 31e: 4501 li a0,0 + 320: bfe5 j 318 + +0000000000000322 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 322: 1141 addi sp,sp,-16 + 324: e406 sd ra,8(sp) + 326: e022 sd s0,0(sp) + 328: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 32a: f67ff0ef jal 290 +} + 32e: 60a2 ld ra,8(sp) + 330: 6402 ld s0,0(sp) + 332: 0141 addi sp,sp,16 + 334: 8082 ret + +0000000000000336 : + +char * +sbrk(int n) { + 336: 1141 addi sp,sp,-16 + 338: e406 sd ra,8(sp) + 33a: e022 sd s0,0(sp) + 33c: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 33e: 4585 li a1,1 + 340: 0b2000ef jal 3f2 +} + 344: 60a2 ld ra,8(sp) + 346: 6402 ld s0,0(sp) + 348: 0141 addi sp,sp,16 + 34a: 8082 ret + +000000000000034c : + +char * +sbrklazy(int n) { + 34c: 1141 addi sp,sp,-16 + 34e: e406 sd ra,8(sp) + 350: e022 sd s0,0(sp) + 352: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 354: 4589 li a1,2 + 356: 09c000ef jal 3f2 +} + 35a: 60a2 ld ra,8(sp) + 35c: 6402 ld s0,0(sp) + 35e: 0141 addi sp,sp,16 + 360: 8082 ret + +0000000000000362 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 362: 4885 li a7,1 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : +.global exit +exit: + li a7, SYS_exit + 36a: 4889 li a7,2 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 : +.global wait +wait: + li a7, SYS_wait + 372: 488d li a7,3 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a : +.global pipe +pipe: + li a7, SYS_pipe + 37a: 4891 li a7,4 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 : +.global read +read: + li a7, SYS_read + 382: 4895 li a7,5 + ecall + 384: 00000073 ecall + ret + 388: 8082 ret + +000000000000038a : +.global write +write: + li a7, SYS_write + 38a: 48c1 li a7,16 + ecall + 38c: 00000073 ecall + ret + 390: 8082 ret + +0000000000000392 : +.global close +close: + li a7, SYS_close + 392: 48d5 li a7,21 + ecall + 394: 00000073 ecall + ret + 398: 8082 ret + +000000000000039a : +.global kill +kill: + li a7, SYS_kill + 39a: 4899 li a7,6 + ecall + 39c: 00000073 ecall + ret + 3a0: 8082 ret + +00000000000003a2 : +.global exec +exec: + li a7, SYS_exec + 3a2: 489d li a7,7 + ecall + 3a4: 00000073 ecall + ret + 3a8: 8082 ret + +00000000000003aa : +.global open +open: + li a7, SYS_open + 3aa: 48bd li a7,15 + ecall + 3ac: 00000073 ecall + ret + 3b0: 8082 ret + +00000000000003b2 : +.global mknod +mknod: + li a7, SYS_mknod + 3b2: 48c5 li a7,17 + ecall + 3b4: 00000073 ecall + ret + 3b8: 8082 ret + +00000000000003ba : +.global unlink +unlink: + li a7, SYS_unlink + 3ba: 48c9 li a7,18 + ecall + 3bc: 00000073 ecall + ret + 3c0: 8082 ret + +00000000000003c2 : +.global fstat +fstat: + li a7, SYS_fstat + 3c2: 48a1 li a7,8 + ecall + 3c4: 00000073 ecall + ret + 3c8: 8082 ret + +00000000000003ca : +.global link +link: + li a7, SYS_link + 3ca: 48cd li a7,19 + ecall + 3cc: 00000073 ecall + ret + 3d0: 8082 ret + +00000000000003d2 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3d2: 48d1 li a7,20 + ecall + 3d4: 00000073 ecall + ret + 3d8: 8082 ret + +00000000000003da : +.global chdir +chdir: + li a7, SYS_chdir + 3da: 48a5 li a7,9 + ecall + 3dc: 00000073 ecall + ret + 3e0: 8082 ret + +00000000000003e2 : +.global dup +dup: + li a7, SYS_dup + 3e2: 48a9 li a7,10 + ecall + 3e4: 00000073 ecall + ret + 3e8: 8082 ret + +00000000000003ea : +.global getpid +getpid: + li a7, SYS_getpid + 3ea: 48ad li a7,11 + ecall + 3ec: 00000073 ecall + ret + 3f0: 8082 ret + +00000000000003f2 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3f2: 48b1 li a7,12 + ecall + 3f4: 00000073 ecall + ret + 3f8: 8082 ret + +00000000000003fa : +.global pause +pause: + li a7, SYS_pause + 3fa: 48b5 li a7,13 + ecall + 3fc: 00000073 ecall + ret + 400: 8082 ret + +0000000000000402 : +.global uptime +uptime: + li a7, SYS_uptime + 402: 48b9 li a7,14 + ecall + 404: 00000073 ecall + ret + 408: 8082 ret diff --git a/G12_Project2_2/user/forktest.c b/G12_Project2_2/user/forktest.c new file mode 100644 index 0000000000..384e75f785 --- /dev/null +++ b/G12_Project2_2/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/types.h" +#include "kernel/stat.h" +#include "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 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/G12_Project2_2/user/forktest.d b/G12_Project2_2/user/forktest.d new file mode 100644 index 0000000000..74309946e4 --- /dev/null +++ b/G12_Project2_2/user/forktest.d @@ -0,0 +1 @@ +user/forktest.o: user/forktest.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project2_2/user/forktest.o b/G12_Project2_2/user/forktest.o new file mode 100644 index 0000000000..cd8368a345 Binary files /dev/null and b/G12_Project2_2/user/forktest.o differ diff --git a/G12_Project2_2/user/forphan.asm b/G12_Project2_2/user/forphan.asm new file mode 100644 index 0000000000..4afb863e11 --- /dev/null +++ b/G12_Project2_2/user/forphan.asm @@ -0,0 +1,1544 @@ + +user/_forphan: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: + +char buf[BUFSZ]; + +int +main(int argc, char **argv) +{ + 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: 0080 addi s0,sp,64 + int fd = 0; + char *s = argv[0]; + a: 6184 ld s1,0(a1) + struct stat st; + char *ff = "file0"; + + if ((fd = open(ff, O_CREATE|O_WRONLY)) < 0) { + c: 20100593 li a1,513 + 10: 00001517 auipc a0,0x1 + 14: 92050513 addi a0,a0,-1760 # 930 + 18: 380000ef jal 398 + 1c: 04054463 bltz a0,64 + printf("%s: open failed\n", s); + exit(1); + } + if(fstat(fd, &st) < 0){ + 20: fc840593 addi a1,s0,-56 + 24: 38c000ef jal 3b0 + 28: 04054863 bltz a0,78 + fprintf(2, "%s: cannot stat %s\n", s, "ff"); + exit(1); + } + if (unlink(ff) < 0) { + 2c: 00001517 auipc a0,0x1 + 30: 90450513 addi a0,a0,-1788 # 930 + 34: 374000ef jal 3a8 + 38: 04054f63 bltz a0,96 + printf("%s: unlink failed\n", s); + exit(1); + } + if (open(ff, O_RDONLY) != -1) { + 3c: 4581 li a1,0 + 3e: 00001517 auipc a0,0x1 + 42: 8f250513 addi a0,a0,-1806 # 930 + 46: 352000ef jal 398 + 4a: 57fd li a5,-1 + 4c: 04f50f63 beq a0,a5,aa + printf("%s: open successed\n", s); + 50: 85a6 mv a1,s1 + 52: 00001517 auipc a0,0x1 + 56: 93e50513 addi a0,a0,-1730 # 990 + 5a: 726000ef jal 780 + exit(1); + 5e: 4505 li a0,1 + 60: 2f8000ef jal 358 + printf("%s: open failed\n", s); + 64: 85a6 mv a1,s1 + 66: 00001517 auipc a0,0x1 + 6a: 8da50513 addi a0,a0,-1830 # 940 + 6e: 712000ef jal 780 + exit(1); + 72: 4505 li a0,1 + 74: 2e4000ef jal 358 + fprintf(2, "%s: cannot stat %s\n", s, "ff"); + 78: 00001697 auipc a3,0x1 + 7c: 8e068693 addi a3,a3,-1824 # 958 + 80: 8626 mv a2,s1 + 82: 00001597 auipc a1,0x1 + 86: 8de58593 addi a1,a1,-1826 # 960 + 8a: 4509 li a0,2 + 8c: 6ca000ef jal 756 + exit(1); + 90: 4505 li a0,1 + 92: 2c6000ef jal 358 + printf("%s: unlink failed\n", s); + 96: 85a6 mv a1,s1 + 98: 00001517 auipc a0,0x1 + 9c: 8e050513 addi a0,a0,-1824 # 978 + a0: 6e0000ef jal 780 + exit(1); + a4: 4505 li a0,1 + a6: 2b2000ef jal 358 + } + printf("wait for kill and reclaim %d\n", st.ino); + aa: fcc42583 lw a1,-52(s0) + ae: 00001517 auipc a0,0x1 + b2: 8fa50513 addi a0,a0,-1798 # 9a8 + b6: 6ca000ef jal 780 + // sit around until killed + for(;;) pause(1000); + ba: 3e800513 li a0,1000 + be: 32a000ef jal 3e8 + c2: bfe5 j ba + +00000000000000c4 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + c4: 1141 addi sp,sp,-16 + c6: e406 sd ra,8(sp) + c8: e022 sd s0,0(sp) + ca: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + cc: f35ff0ef jal 0
+ exit(r); + d0: 288000ef jal 358 + +00000000000000d4 : +} + +char* +strcpy(char *s, const char *t) +{ + d4: 1141 addi sp,sp,-16 + d6: e422 sd s0,8(sp) + d8: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + da: 87aa mv a5,a0 + dc: 0585 addi a1,a1,1 + de: 0785 addi a5,a5,1 + e0: fff5c703 lbu a4,-1(a1) + e4: fee78fa3 sb a4,-1(a5) + e8: fb75 bnez a4,dc + ; + return os; +} + ea: 6422 ld s0,8(sp) + ec: 0141 addi sp,sp,16 + ee: 8082 ret + +00000000000000f0 : + +int +strcmp(const char *p, const char *q) +{ + f0: 1141 addi sp,sp,-16 + f2: e422 sd s0,8(sp) + f4: 0800 addi s0,sp,16 + while(*p && *p == *q) + f6: 00054783 lbu a5,0(a0) + fa: cb91 beqz a5,10e + fc: 0005c703 lbu a4,0(a1) + 100: 00f71763 bne a4,a5,10e + p++, q++; + 104: 0505 addi a0,a0,1 + 106: 0585 addi a1,a1,1 + while(*p && *p == *q) + 108: 00054783 lbu a5,0(a0) + 10c: fbe5 bnez a5,fc + return (uchar)*p - (uchar)*q; + 10e: 0005c503 lbu a0,0(a1) +} + 112: 40a7853b subw a0,a5,a0 + 116: 6422 ld s0,8(sp) + 118: 0141 addi sp,sp,16 + 11a: 8082 ret + +000000000000011c : + +uint +strlen(const char *s) +{ + 11c: 1141 addi sp,sp,-16 + 11e: e422 sd s0,8(sp) + 120: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 122: 00054783 lbu a5,0(a0) + 126: cf91 beqz a5,142 + 128: 0505 addi a0,a0,1 + 12a: 87aa mv a5,a0 + 12c: 86be mv a3,a5 + 12e: 0785 addi a5,a5,1 + 130: fff7c703 lbu a4,-1(a5) + 134: ff65 bnez a4,12c + 136: 40a6853b subw a0,a3,a0 + 13a: 2505 addiw a0,a0,1 + ; + return n; +} + 13c: 6422 ld s0,8(sp) + 13e: 0141 addi sp,sp,16 + 140: 8082 ret + for(n = 0; s[n]; n++) + 142: 4501 li a0,0 + 144: bfe5 j 13c + +0000000000000146 : + +void* +memset(void *dst, int c, uint n) +{ + 146: 1141 addi sp,sp,-16 + 148: e422 sd s0,8(sp) + 14a: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 14c: ca19 beqz a2,162 + 14e: 87aa mv a5,a0 + 150: 1602 slli a2,a2,0x20 + 152: 9201 srli a2,a2,0x20 + 154: 00a60733 add a4,a2,a0 + cdst[i] = c; + 158: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 15c: 0785 addi a5,a5,1 + 15e: fee79de3 bne a5,a4,158 + } + return dst; +} + 162: 6422 ld s0,8(sp) + 164: 0141 addi sp,sp,16 + 166: 8082 ret + +0000000000000168 : + +char* +strchr(const char *s, char c) +{ + 168: 1141 addi sp,sp,-16 + 16a: e422 sd s0,8(sp) + 16c: 0800 addi s0,sp,16 + for(; *s; s++) + 16e: 00054783 lbu a5,0(a0) + 172: cb99 beqz a5,188 + if(*s == c) + 174: 00f58763 beq a1,a5,182 + for(; *s; s++) + 178: 0505 addi a0,a0,1 + 17a: 00054783 lbu a5,0(a0) + 17e: fbfd bnez a5,174 + return (char*)s; + return 0; + 180: 4501 li a0,0 +} + 182: 6422 ld s0,8(sp) + 184: 0141 addi sp,sp,16 + 186: 8082 ret + return 0; + 188: 4501 li a0,0 + 18a: bfe5 j 182 + +000000000000018c : + +char* +gets(char *buf, int max) +{ + 18c: 711d addi sp,sp,-96 + 18e: ec86 sd ra,88(sp) + 190: e8a2 sd s0,80(sp) + 192: e4a6 sd s1,72(sp) + 194: e0ca sd s2,64(sp) + 196: fc4e sd s3,56(sp) + 198: f852 sd s4,48(sp) + 19a: f456 sd s5,40(sp) + 19c: f05a sd s6,32(sp) + 19e: ec5e sd s7,24(sp) + 1a0: 1080 addi s0,sp,96 + 1a2: 8baa mv s7,a0 + 1a4: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1a6: 892a mv s2,a0 + 1a8: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1aa: 4aa9 li s5,10 + 1ac: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1ae: 89a6 mv s3,s1 + 1b0: 2485 addiw s1,s1,1 + 1b2: 0344d663 bge s1,s4,1de + cc = read(0, &c, 1); + 1b6: 4605 li a2,1 + 1b8: faf40593 addi a1,s0,-81 + 1bc: 4501 li a0,0 + 1be: 1b2000ef jal 370 + if(cc < 1) + 1c2: 00a05e63 blez a0,1de + buf[i++] = c; + 1c6: faf44783 lbu a5,-81(s0) + 1ca: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1ce: 01578763 beq a5,s5,1dc + 1d2: 0905 addi s2,s2,1 + 1d4: fd679de3 bne a5,s6,1ae + buf[i++] = c; + 1d8: 89a6 mv s3,s1 + 1da: a011 j 1de + 1dc: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1de: 99de add s3,s3,s7 + 1e0: 00098023 sb zero,0(s3) + return buf; +} + 1e4: 855e mv a0,s7 + 1e6: 60e6 ld ra,88(sp) + 1e8: 6446 ld s0,80(sp) + 1ea: 64a6 ld s1,72(sp) + 1ec: 6906 ld s2,64(sp) + 1ee: 79e2 ld s3,56(sp) + 1f0: 7a42 ld s4,48(sp) + 1f2: 7aa2 ld s5,40(sp) + 1f4: 7b02 ld s6,32(sp) + 1f6: 6be2 ld s7,24(sp) + 1f8: 6125 addi sp,sp,96 + 1fa: 8082 ret + +00000000000001fc : + +int +stat(const char *n, struct stat *st) +{ + 1fc: 1101 addi sp,sp,-32 + 1fe: ec06 sd ra,24(sp) + 200: e822 sd s0,16(sp) + 202: e04a sd s2,0(sp) + 204: 1000 addi s0,sp,32 + 206: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 208: 4581 li a1,0 + 20a: 18e000ef jal 398 + if(fd < 0) + 20e: 02054263 bltz a0,232 + 212: e426 sd s1,8(sp) + 214: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 216: 85ca mv a1,s2 + 218: 198000ef jal 3b0 + 21c: 892a mv s2,a0 + close(fd); + 21e: 8526 mv a0,s1 + 220: 160000ef jal 380 + return r; + 224: 64a2 ld s1,8(sp) +} + 226: 854a mv a0,s2 + 228: 60e2 ld ra,24(sp) + 22a: 6442 ld s0,16(sp) + 22c: 6902 ld s2,0(sp) + 22e: 6105 addi sp,sp,32 + 230: 8082 ret + return -1; + 232: 597d li s2,-1 + 234: bfcd j 226 + +0000000000000236 : + +int +atoi(const char *s) +{ + 236: 1141 addi sp,sp,-16 + 238: e422 sd s0,8(sp) + 23a: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 23c: 00054683 lbu a3,0(a0) + 240: fd06879b addiw a5,a3,-48 + 244: 0ff7f793 zext.b a5,a5 + 248: 4625 li a2,9 + 24a: 02f66863 bltu a2,a5,27a + 24e: 872a mv a4,a0 + n = 0; + 250: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 252: 0705 addi a4,a4,1 + 254: 0025179b slliw a5,a0,0x2 + 258: 9fa9 addw a5,a5,a0 + 25a: 0017979b slliw a5,a5,0x1 + 25e: 9fb5 addw a5,a5,a3 + 260: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 264: 00074683 lbu a3,0(a4) + 268: fd06879b addiw a5,a3,-48 + 26c: 0ff7f793 zext.b a5,a5 + 270: fef671e3 bgeu a2,a5,252 + return n; +} + 274: 6422 ld s0,8(sp) + 276: 0141 addi sp,sp,16 + 278: 8082 ret + n = 0; + 27a: 4501 li a0,0 + 27c: bfe5 j 274 + +000000000000027e : + +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 + while(n-- > 0) + 288: 00c05f63 blez a2,2a6 + 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: fef71ae3 bne a4,a5,296 + 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 + 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 + 2d4: bfc9 j 2a6 + +00000000000002d6 : + +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 + 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 + 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 + } + return 0; + 2fe: 4501 li a0,0 + 300: a019 j 306 + 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 + +0000000000000310 : + +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: f67ff0ef jal 27e +} + 31c: 60a2 ld ra,8(sp) + 31e: 6402 ld s0,0(sp) + 320: 0141 addi sp,sp,16 + 322: 8082 ret + +0000000000000324 : + +char * +sbrk(int n) { + 324: 1141 addi sp,sp,-16 + 326: e406 sd ra,8(sp) + 328: e022 sd s0,0(sp) + 32a: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 32c: 4585 li a1,1 + 32e: 0b2000ef jal 3e0 +} + 332: 60a2 ld ra,8(sp) + 334: 6402 ld s0,0(sp) + 336: 0141 addi sp,sp,16 + 338: 8082 ret + +000000000000033a : + +char * +sbrklazy(int n) { + 33a: 1141 addi sp,sp,-16 + 33c: e406 sd ra,8(sp) + 33e: e022 sd s0,0(sp) + 340: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 342: 4589 li a1,2 + 344: 09c000ef jal 3e0 +} + 348: 60a2 ld ra,8(sp) + 34a: 6402 ld s0,0(sp) + 34c: 0141 addi sp,sp,16 + 34e: 8082 ret + +0000000000000350 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 350: 4885 li a7,1 + ecall + 352: 00000073 ecall + ret + 356: 8082 ret + +0000000000000358 : +.global exit +exit: + li a7, SYS_exit + 358: 4889 li a7,2 + ecall + 35a: 00000073 ecall + ret + 35e: 8082 ret + +0000000000000360 : +.global wait +wait: + li a7, SYS_wait + 360: 488d li a7,3 + ecall + 362: 00000073 ecall + ret + 366: 8082 ret + +0000000000000368 : +.global pipe +pipe: + li a7, SYS_pipe + 368: 4891 li a7,4 + ecall + 36a: 00000073 ecall + ret + 36e: 8082 ret + +0000000000000370 : +.global read +read: + li a7, SYS_read + 370: 4895 li a7,5 + ecall + 372: 00000073 ecall + ret + 376: 8082 ret + +0000000000000378 : +.global write +write: + li a7, SYS_write + 378: 48c1 li a7,16 + ecall + 37a: 00000073 ecall + ret + 37e: 8082 ret + +0000000000000380 : +.global close +close: + li a7, SYS_close + 380: 48d5 li a7,21 + ecall + 382: 00000073 ecall + ret + 386: 8082 ret + +0000000000000388 : +.global kill +kill: + li a7, SYS_kill + 388: 4899 li a7,6 + ecall + 38a: 00000073 ecall + ret + 38e: 8082 ret + +0000000000000390 : +.global exec +exec: + li a7, SYS_exec + 390: 489d li a7,7 + ecall + 392: 00000073 ecall + ret + 396: 8082 ret + +0000000000000398 : +.global open +open: + li a7, SYS_open + 398: 48bd li a7,15 + ecall + 39a: 00000073 ecall + ret + 39e: 8082 ret + +00000000000003a0 : +.global mknod +mknod: + li a7, SYS_mknod + 3a0: 48c5 li a7,17 + ecall + 3a2: 00000073 ecall + ret + 3a6: 8082 ret + +00000000000003a8 : +.global unlink +unlink: + li a7, SYS_unlink + 3a8: 48c9 li a7,18 + ecall + 3aa: 00000073 ecall + ret + 3ae: 8082 ret + +00000000000003b0 : +.global fstat +fstat: + li a7, SYS_fstat + 3b0: 48a1 li a7,8 + ecall + 3b2: 00000073 ecall + ret + 3b6: 8082 ret + +00000000000003b8 : +.global link +link: + li a7, SYS_link + 3b8: 48cd li a7,19 + ecall + 3ba: 00000073 ecall + ret + 3be: 8082 ret + +00000000000003c0 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3c0: 48d1 li a7,20 + ecall + 3c2: 00000073 ecall + ret + 3c6: 8082 ret + +00000000000003c8 : +.global chdir +chdir: + li a7, SYS_chdir + 3c8: 48a5 li a7,9 + ecall + 3ca: 00000073 ecall + ret + 3ce: 8082 ret + +00000000000003d0 : +.global dup +dup: + li a7, SYS_dup + 3d0: 48a9 li a7,10 + ecall + 3d2: 00000073 ecall + ret + 3d6: 8082 ret + +00000000000003d8 : +.global getpid +getpid: + li a7, SYS_getpid + 3d8: 48ad li a7,11 + ecall + 3da: 00000073 ecall + ret + 3de: 8082 ret + +00000000000003e0 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3e0: 48b1 li a7,12 + ecall + 3e2: 00000073 ecall + ret + 3e6: 8082 ret + +00000000000003e8 : +.global pause +pause: + li a7, SYS_pause + 3e8: 48b5 li a7,13 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 : +.global uptime +uptime: + li a7, SYS_uptime + 3f0: 48b9 li a7,14 + ecall + 3f2: 00000073 ecall + ret + 3f6: 8082 ret + +00000000000003f8 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3f8: 1101 addi sp,sp,-32 + 3fa: ec06 sd ra,24(sp) + 3fc: e822 sd s0,16(sp) + 3fe: 1000 addi s0,sp,32 + 400: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 404: 4605 li a2,1 + 406: fef40593 addi a1,s0,-17 + 40a: f6fff0ef jal 378 +} + 40e: 60e2 ld ra,24(sp) + 410: 6442 ld s0,16(sp) + 412: 6105 addi sp,sp,32 + 414: 8082 ret + +0000000000000416 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 416: 715d addi sp,sp,-80 + 418: e486 sd ra,72(sp) + 41a: e0a2 sd s0,64(sp) + 41c: f84a sd s2,48(sp) + 41e: 0880 addi s0,sp,80 + 420: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 422: c299 beqz a3,428 + 424: 0805c363 bltz a1,4aa + neg = 0; + 428: 4881 li a7,0 + 42a: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 42e: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 430: 00000517 auipc a0,0x0 + 434: 5a050513 addi a0,a0,1440 # 9d0 + 438: 883e mv a6,a5 + 43a: 2785 addiw a5,a5,1 + 43c: 02c5f733 remu a4,a1,a2 + 440: 972a add a4,a4,a0 + 442: 00074703 lbu a4,0(a4) + 446: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 44a: 872e mv a4,a1 + 44c: 02c5d5b3 divu a1,a1,a2 + 450: 0685 addi a3,a3,1 + 452: fec773e3 bgeu a4,a2,438 + if(neg) + 456: 00088b63 beqz a7,46c + buf[i++] = '-'; + 45a: fd078793 addi a5,a5,-48 + 45e: 97a2 add a5,a5,s0 + 460: 02d00713 li a4,45 + 464: fee78423 sb a4,-24(a5) + 468: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 46c: 02f05a63 blez a5,4a0 + 470: fc26 sd s1,56(sp) + 472: f44e sd s3,40(sp) + 474: fb840713 addi a4,s0,-72 + 478: 00f704b3 add s1,a4,a5 + 47c: fff70993 addi s3,a4,-1 + 480: 99be add s3,s3,a5 + 482: 37fd addiw a5,a5,-1 + 484: 1782 slli a5,a5,0x20 + 486: 9381 srli a5,a5,0x20 + 488: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 48c: fff4c583 lbu a1,-1(s1) + 490: 854a mv a0,s2 + 492: f67ff0ef jal 3f8 + while(--i >= 0) + 496: 14fd addi s1,s1,-1 + 498: ff349ae3 bne s1,s3,48c + 49c: 74e2 ld s1,56(sp) + 49e: 79a2 ld s3,40(sp) +} + 4a0: 60a6 ld ra,72(sp) + 4a2: 6406 ld s0,64(sp) + 4a4: 7942 ld s2,48(sp) + 4a6: 6161 addi sp,sp,80 + 4a8: 8082 ret + x = -xx; + 4aa: 40b005b3 neg a1,a1 + neg = 1; + 4ae: 4885 li a7,1 + x = -xx; + 4b0: bfad j 42a + +00000000000004b2 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4b2: 711d addi sp,sp,-96 + 4b4: ec86 sd ra,88(sp) + 4b6: e8a2 sd s0,80(sp) + 4b8: e0ca sd s2,64(sp) + 4ba: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4bc: 0005c903 lbu s2,0(a1) + 4c0: 28090663 beqz s2,74c + 4c4: e4a6 sd s1,72(sp) + 4c6: fc4e sd s3,56(sp) + 4c8: f852 sd s4,48(sp) + 4ca: f456 sd s5,40(sp) + 4cc: f05a sd s6,32(sp) + 4ce: ec5e sd s7,24(sp) + 4d0: e862 sd s8,16(sp) + 4d2: e466 sd s9,8(sp) + 4d4: 8b2a mv s6,a0 + 4d6: 8a2e mv s4,a1 + 4d8: 8bb2 mv s7,a2 + state = 0; + 4da: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4dc: 4481 li s1,0 + 4de: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4e0: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4e4: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4e8: 06c00c93 li s9,108 + 4ec: a005 j 50c + putc(fd, c0); + 4ee: 85ca mv a1,s2 + 4f0: 855a mv a0,s6 + 4f2: f07ff0ef jal 3f8 + 4f6: a019 j 4fc + } else if(state == '%'){ + 4f8: 03598263 beq s3,s5,51c + for(i = 0; fmt[i]; i++){ + 4fc: 2485 addiw s1,s1,1 + 4fe: 8726 mv a4,s1 + 500: 009a07b3 add a5,s4,s1 + 504: 0007c903 lbu s2,0(a5) + 508: 22090a63 beqz s2,73c + c0 = fmt[i] & 0xff; + 50c: 0009079b sext.w a5,s2 + if(state == 0){ + 510: fe0994e3 bnez s3,4f8 + if(c0 == '%'){ + 514: fd579de3 bne a5,s5,4ee + state = '%'; + 518: 89be mv s3,a5 + 51a: b7cd j 4fc + if(c0) c1 = fmt[i+1] & 0xff; + 51c: 00ea06b3 add a3,s4,a4 + 520: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 524: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 526: c681 beqz a3,52e + 528: 9752 add a4,a4,s4 + 52a: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 52e: 05878363 beq a5,s8,574 + } else if(c0 == 'l' && c1 == 'd'){ + 532: 05978d63 beq a5,s9,58c + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 536: 07500713 li a4,117 + 53a: 0ee78763 beq a5,a4,628 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 53e: 07800713 li a4,120 + 542: 12e78963 beq a5,a4,674 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 546: 07000713 li a4,112 + 54a: 14e78e63 beq a5,a4,6a6 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 54e: 06300713 li a4,99 + 552: 18e78e63 beq a5,a4,6ee + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 556: 07300713 li a4,115 + 55a: 1ae78463 beq a5,a4,702 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 55e: 02500713 li a4,37 + 562: 04e79563 bne a5,a4,5ac + putc(fd, '%'); + 566: 02500593 li a1,37 + 56a: 855a mv a0,s6 + 56c: e8dff0ef jal 3f8 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 570: 4981 li s3,0 + 572: b769 j 4fc + printint(fd, va_arg(ap, int), 10, 1); + 574: 008b8913 addi s2,s7,8 + 578: 4685 li a3,1 + 57a: 4629 li a2,10 + 57c: 000ba583 lw a1,0(s7) + 580: 855a mv a0,s6 + 582: e95ff0ef jal 416 + 586: 8bca mv s7,s2 + state = 0; + 588: 4981 li s3,0 + 58a: bf8d j 4fc + } else if(c0 == 'l' && c1 == 'd'){ + 58c: 06400793 li a5,100 + 590: 02f68963 beq a3,a5,5c2 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 594: 06c00793 li a5,108 + 598: 04f68263 beq a3,a5,5dc + } else if(c0 == 'l' && c1 == 'u'){ + 59c: 07500793 li a5,117 + 5a0: 0af68063 beq a3,a5,640 + } else if(c0 == 'l' && c1 == 'x'){ + 5a4: 07800793 li a5,120 + 5a8: 0ef68263 beq a3,a5,68c + putc(fd, '%'); + 5ac: 02500593 li a1,37 + 5b0: 855a mv a0,s6 + 5b2: e47ff0ef jal 3f8 + putc(fd, c0); + 5b6: 85ca mv a1,s2 + 5b8: 855a mv a0,s6 + 5ba: e3fff0ef jal 3f8 + state = 0; + 5be: 4981 li s3,0 + 5c0: bf35 j 4fc + printint(fd, va_arg(ap, uint64), 10, 1); + 5c2: 008b8913 addi s2,s7,8 + 5c6: 4685 li a3,1 + 5c8: 4629 li a2,10 + 5ca: 000bb583 ld a1,0(s7) + 5ce: 855a mv a0,s6 + 5d0: e47ff0ef jal 416 + i += 1; + 5d4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5d6: 8bca mv s7,s2 + state = 0; + 5d8: 4981 li s3,0 + i += 1; + 5da: b70d j 4fc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5dc: 06400793 li a5,100 + 5e0: 02f60763 beq a2,a5,60e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5e4: 07500793 li a5,117 + 5e8: 06f60963 beq a2,a5,65a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5ec: 07800793 li a5,120 + 5f0: faf61ee3 bne a2,a5,5ac + printint(fd, va_arg(ap, uint64), 16, 0); + 5f4: 008b8913 addi s2,s7,8 + 5f8: 4681 li a3,0 + 5fa: 4641 li a2,16 + 5fc: 000bb583 ld a1,0(s7) + 600: 855a mv a0,s6 + 602: e15ff0ef jal 416 + i += 2; + 606: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 608: 8bca mv s7,s2 + state = 0; + 60a: 4981 li s3,0 + i += 2; + 60c: bdc5 j 4fc + printint(fd, va_arg(ap, uint64), 10, 1); + 60e: 008b8913 addi s2,s7,8 + 612: 4685 li a3,1 + 614: 4629 li a2,10 + 616: 000bb583 ld a1,0(s7) + 61a: 855a mv a0,s6 + 61c: dfbff0ef jal 416 + i += 2; + 620: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 622: 8bca mv s7,s2 + state = 0; + 624: 4981 li s3,0 + i += 2; + 626: bdd9 j 4fc + printint(fd, va_arg(ap, uint32), 10, 0); + 628: 008b8913 addi s2,s7,8 + 62c: 4681 li a3,0 + 62e: 4629 li a2,10 + 630: 000be583 lwu a1,0(s7) + 634: 855a mv a0,s6 + 636: de1ff0ef jal 416 + 63a: 8bca mv s7,s2 + state = 0; + 63c: 4981 li s3,0 + 63e: bd7d j 4fc + printint(fd, va_arg(ap, uint64), 10, 0); + 640: 008b8913 addi s2,s7,8 + 644: 4681 li a3,0 + 646: 4629 li a2,10 + 648: 000bb583 ld a1,0(s7) + 64c: 855a mv a0,s6 + 64e: dc9ff0ef jal 416 + i += 1; + 652: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 654: 8bca mv s7,s2 + state = 0; + 656: 4981 li s3,0 + i += 1; + 658: b555 j 4fc + printint(fd, va_arg(ap, uint64), 10, 0); + 65a: 008b8913 addi s2,s7,8 + 65e: 4681 li a3,0 + 660: 4629 li a2,10 + 662: 000bb583 ld a1,0(s7) + 666: 855a mv a0,s6 + 668: dafff0ef jal 416 + i += 2; + 66c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 66e: 8bca mv s7,s2 + state = 0; + 670: 4981 li s3,0 + i += 2; + 672: b569 j 4fc + printint(fd, va_arg(ap, uint32), 16, 0); + 674: 008b8913 addi s2,s7,8 + 678: 4681 li a3,0 + 67a: 4641 li a2,16 + 67c: 000be583 lwu a1,0(s7) + 680: 855a mv a0,s6 + 682: d95ff0ef jal 416 + 686: 8bca mv s7,s2 + state = 0; + 688: 4981 li s3,0 + 68a: bd8d j 4fc + printint(fd, va_arg(ap, uint64), 16, 0); + 68c: 008b8913 addi s2,s7,8 + 690: 4681 li a3,0 + 692: 4641 li a2,16 + 694: 000bb583 ld a1,0(s7) + 698: 855a mv a0,s6 + 69a: d7dff0ef jal 416 + i += 1; + 69e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6a0: 8bca mv s7,s2 + state = 0; + 6a2: 4981 li s3,0 + i += 1; + 6a4: bda1 j 4fc + 6a6: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 6a8: 008b8d13 addi s10,s7,8 + 6ac: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6b0: 03000593 li a1,48 + 6b4: 855a mv a0,s6 + 6b6: d43ff0ef jal 3f8 + putc(fd, 'x'); + 6ba: 07800593 li a1,120 + 6be: 855a mv a0,s6 + 6c0: d39ff0ef jal 3f8 + 6c4: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6c6: 00000b97 auipc s7,0x0 + 6ca: 30ab8b93 addi s7,s7,778 # 9d0 + 6ce: 03c9d793 srli a5,s3,0x3c + 6d2: 97de add a5,a5,s7 + 6d4: 0007c583 lbu a1,0(a5) + 6d8: 855a mv a0,s6 + 6da: d1fff0ef jal 3f8 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6de: 0992 slli s3,s3,0x4 + 6e0: 397d addiw s2,s2,-1 + 6e2: fe0916e3 bnez s2,6ce + printptr(fd, va_arg(ap, uint64)); + 6e6: 8bea mv s7,s10 + state = 0; + 6e8: 4981 li s3,0 + 6ea: 6d02 ld s10,0(sp) + 6ec: bd01 j 4fc + putc(fd, va_arg(ap, uint32)); + 6ee: 008b8913 addi s2,s7,8 + 6f2: 000bc583 lbu a1,0(s7) + 6f6: 855a mv a0,s6 + 6f8: d01ff0ef jal 3f8 + 6fc: 8bca mv s7,s2 + state = 0; + 6fe: 4981 li s3,0 + 700: bbf5 j 4fc + if((s = va_arg(ap, char*)) == 0) + 702: 008b8993 addi s3,s7,8 + 706: 000bb903 ld s2,0(s7) + 70a: 00090f63 beqz s2,728 + for(; *s; s++) + 70e: 00094583 lbu a1,0(s2) + 712: c195 beqz a1,736 + putc(fd, *s); + 714: 855a mv a0,s6 + 716: ce3ff0ef jal 3f8 + for(; *s; s++) + 71a: 0905 addi s2,s2,1 + 71c: 00094583 lbu a1,0(s2) + 720: f9f5 bnez a1,714 + if((s = va_arg(ap, char*)) == 0) + 722: 8bce mv s7,s3 + state = 0; + 724: 4981 li s3,0 + 726: bbd9 j 4fc + s = "(null)"; + 728: 00000917 auipc s2,0x0 + 72c: 2a090913 addi s2,s2,672 # 9c8 + for(; *s; s++) + 730: 02800593 li a1,40 + 734: b7c5 j 714 + if((s = va_arg(ap, char*)) == 0) + 736: 8bce mv s7,s3 + state = 0; + 738: 4981 li s3,0 + 73a: b3c9 j 4fc + 73c: 64a6 ld s1,72(sp) + 73e: 79e2 ld s3,56(sp) + 740: 7a42 ld s4,48(sp) + 742: 7aa2 ld s5,40(sp) + 744: 7b02 ld s6,32(sp) + 746: 6be2 ld s7,24(sp) + 748: 6c42 ld s8,16(sp) + 74a: 6ca2 ld s9,8(sp) + } + } +} + 74c: 60e6 ld ra,88(sp) + 74e: 6446 ld s0,80(sp) + 750: 6906 ld s2,64(sp) + 752: 6125 addi sp,sp,96 + 754: 8082 ret + +0000000000000756 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 756: 715d addi sp,sp,-80 + 758: ec06 sd ra,24(sp) + 75a: e822 sd s0,16(sp) + 75c: 1000 addi s0,sp,32 + 75e: e010 sd a2,0(s0) + 760: e414 sd a3,8(s0) + 762: e818 sd a4,16(s0) + 764: ec1c sd a5,24(s0) + 766: 03043023 sd a6,32(s0) + 76a: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 76e: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 772: 8622 mv a2,s0 + 774: d3fff0ef jal 4b2 +} + 778: 60e2 ld ra,24(sp) + 77a: 6442 ld s0,16(sp) + 77c: 6161 addi sp,sp,80 + 77e: 8082 ret + +0000000000000780 : + +void +printf(const char *fmt, ...) +{ + 780: 711d addi sp,sp,-96 + 782: ec06 sd ra,24(sp) + 784: e822 sd s0,16(sp) + 786: 1000 addi s0,sp,32 + 788: e40c sd a1,8(s0) + 78a: e810 sd a2,16(s0) + 78c: ec14 sd a3,24(s0) + 78e: f018 sd a4,32(s0) + 790: f41c sd a5,40(s0) + 792: 03043823 sd a6,48(s0) + 796: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 79a: 00840613 addi a2,s0,8 + 79e: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 7a2: 85aa mv a1,a0 + 7a4: 4505 li a0,1 + 7a6: d0dff0ef jal 4b2 +} + 7aa: 60e2 ld ra,24(sp) + 7ac: 6442 ld s0,16(sp) + 7ae: 6125 addi sp,sp,96 + 7b0: 8082 ret + +00000000000007b2 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7b2: 1141 addi sp,sp,-16 + 7b4: e422 sd s0,8(sp) + 7b6: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7b8: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7bc: 00001797 auipc a5,0x1 + 7c0: 8447b783 ld a5,-1980(a5) # 1000 + 7c4: a02d j 7ee + 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; + 7c6: 4618 lw a4,8(a2) + 7c8: 9f2d addw a4,a4,a1 + 7ca: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7ce: 6398 ld a4,0(a5) + 7d0: 6310 ld a2,0(a4) + 7d2: a83d j 810 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7d4: ff852703 lw a4,-8(a0) + 7d8: 9f31 addw a4,a4,a2 + 7da: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7dc: ff053683 ld a3,-16(a0) + 7e0: a091 j 824 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7e2: 6398 ld a4,0(a5) + 7e4: 00e7e463 bltu a5,a4,7ec + 7e8: 00e6ea63 bltu a3,a4,7fc +{ + 7ec: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7ee: fed7fae3 bgeu a5,a3,7e2 + 7f2: 6398 ld a4,0(a5) + 7f4: 00e6e463 bltu a3,a4,7fc + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7f8: fee7eae3 bltu a5,a4,7ec + if(bp + bp->s.size == p->s.ptr){ + 7fc: ff852583 lw a1,-8(a0) + 800: 6390 ld a2,0(a5) + 802: 02059813 slli a6,a1,0x20 + 806: 01c85713 srli a4,a6,0x1c + 80a: 9736 add a4,a4,a3 + 80c: fae60de3 beq a2,a4,7c6 + bp->s.ptr = p->s.ptr->s.ptr; + 810: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 814: 4790 lw a2,8(a5) + 816: 02061593 slli a1,a2,0x20 + 81a: 01c5d713 srli a4,a1,0x1c + 81e: 973e add a4,a4,a5 + 820: fae68ae3 beq a3,a4,7d4 + p->s.ptr = bp->s.ptr; + 824: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 826: 00000717 auipc a4,0x0 + 82a: 7cf73d23 sd a5,2010(a4) # 1000 +} + 82e: 6422 ld s0,8(sp) + 830: 0141 addi sp,sp,16 + 832: 8082 ret + +0000000000000834 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 834: 7139 addi sp,sp,-64 + 836: fc06 sd ra,56(sp) + 838: f822 sd s0,48(sp) + 83a: f426 sd s1,40(sp) + 83c: ec4e sd s3,24(sp) + 83e: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 840: 02051493 slli s1,a0,0x20 + 844: 9081 srli s1,s1,0x20 + 846: 04bd addi s1,s1,15 + 848: 8091 srli s1,s1,0x4 + 84a: 0014899b addiw s3,s1,1 + 84e: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 850: 00000517 auipc a0,0x0 + 854: 7b053503 ld a0,1968(a0) # 1000 + 858: c915 beqz a0,88c + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 85a: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 85c: 4798 lw a4,8(a5) + 85e: 08977a63 bgeu a4,s1,8f2 + 862: f04a sd s2,32(sp) + 864: e852 sd s4,16(sp) + 866: e456 sd s5,8(sp) + 868: e05a sd s6,0(sp) + if(nu < 4096) + 86a: 8a4e mv s4,s3 + 86c: 0009871b sext.w a4,s3 + 870: 6685 lui a3,0x1 + 872: 00d77363 bgeu a4,a3,878 + 876: 6a05 lui s4,0x1 + 878: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 87c: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 880: 00000917 auipc s2,0x0 + 884: 78090913 addi s2,s2,1920 # 1000 + if(p == SBRK_ERROR) + 888: 5afd li s5,-1 + 88a: a081 j 8ca + 88c: f04a sd s2,32(sp) + 88e: e852 sd s4,16(sp) + 890: e456 sd s5,8(sp) + 892: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 894: 00001797 auipc a5,0x1 + 898: 97478793 addi a5,a5,-1676 # 1208 + 89c: 00000717 auipc a4,0x0 + 8a0: 76f73223 sd a5,1892(a4) # 1000 + 8a4: e39c sd a5,0(a5) + base.s.size = 0; + 8a6: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 8aa: b7c1 j 86a + prevp->s.ptr = p->s.ptr; + 8ac: 6398 ld a4,0(a5) + 8ae: e118 sd a4,0(a0) + 8b0: a8a9 j 90a + hp->s.size = nu; + 8b2: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8b6: 0541 addi a0,a0,16 + 8b8: efbff0ef jal 7b2 + return freep; + 8bc: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8c0: c12d beqz a0,922 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8c2: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8c4: 4798 lw a4,8(a5) + 8c6: 02977263 bgeu a4,s1,8ea + if(p == freep) + 8ca: 00093703 ld a4,0(s2) + 8ce: 853e mv a0,a5 + 8d0: fef719e3 bne a4,a5,8c2 + p = sbrk(nu * sizeof(Header)); + 8d4: 8552 mv a0,s4 + 8d6: a4fff0ef jal 324 + if(p == SBRK_ERROR) + 8da: fd551ce3 bne a0,s5,8b2 + return 0; + 8de: 4501 li a0,0 + 8e0: 7902 ld s2,32(sp) + 8e2: 6a42 ld s4,16(sp) + 8e4: 6aa2 ld s5,8(sp) + 8e6: 6b02 ld s6,0(sp) + 8e8: a03d j 916 + 8ea: 7902 ld s2,32(sp) + 8ec: 6a42 ld s4,16(sp) + 8ee: 6aa2 ld s5,8(sp) + 8f0: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 8f2: fae48de3 beq s1,a4,8ac + p->s.size -= nunits; + 8f6: 4137073b subw a4,a4,s3 + 8fa: c798 sw a4,8(a5) + p += p->s.size; + 8fc: 02071693 slli a3,a4,0x20 + 900: 01c6d713 srli a4,a3,0x1c + 904: 97ba add a5,a5,a4 + p->s.size = nunits; + 906: 0137a423 sw s3,8(a5) + freep = prevp; + 90a: 00000717 auipc a4,0x0 + 90e: 6ea73b23 sd a0,1782(a4) # 1000 + return (void*)(p + 1); + 912: 01078513 addi a0,a5,16 + } +} + 916: 70e2 ld ra,56(sp) + 918: 7442 ld s0,48(sp) + 91a: 74a2 ld s1,40(sp) + 91c: 69e2 ld s3,24(sp) + 91e: 6121 addi sp,sp,64 + 920: 8082 ret + 922: 7902 ld s2,32(sp) + 924: 6a42 ld s4,16(sp) + 926: 6aa2 ld s5,8(sp) + 928: 6b02 ld s6,0(sp) + 92a: b7f5 j 916 diff --git a/G12_Project2_2/user/forphan.c b/G12_Project2_2/user/forphan.c new file mode 100644 index 0000000000..c8c8af9d81 --- /dev/null +++ b/G12_Project2_2/user/forphan.c @@ -0,0 +1,39 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "kernel/fcntl.h" +#include "user/user.h" + +// Create an orphaned file and check if test-xv6.py recovers it. + +#define BUFSZ 500 + +char buf[BUFSZ]; + +int +main(int argc, char **argv) +{ + int fd = 0; + char *s = argv[0]; + struct stat st; + char *ff = "file0"; + + if ((fd = open(ff, O_CREATE|O_WRONLY)) < 0) { + printf("%s: open failed\n", s); + exit(1); + } + if(fstat(fd, &st) < 0){ + fprintf(2, "%s: cannot stat %s\n", s, "ff"); + exit(1); + } + if (unlink(ff) < 0) { + printf("%s: unlink failed\n", s); + exit(1); + } + if (open(ff, O_RDONLY) != -1) { + printf("%s: open successed\n", s); + exit(1); + } + printf("wait for kill and reclaim %d\n", st.ino); + // sit around until killed + for(;;) pause(1000); +} diff --git a/G12_Project2_2/user/forphan.d b/G12_Project2_2/user/forphan.d new file mode 100644 index 0000000000..83769a0ab8 --- /dev/null +++ b/G12_Project2_2/user/forphan.d @@ -0,0 +1,2 @@ +user/forphan.o: user/forphan.c kernel/types.h kernel/stat.h \ + kernel/fcntl.h user/user.h diff --git a/G12_Project2_2/user/forphan.o b/G12_Project2_2/user/forphan.o new file mode 100644 index 0000000000..e3235f0437 Binary files /dev/null and b/G12_Project2_2/user/forphan.o differ diff --git a/G12_Project2_2/user/forphan.sym b/G12_Project2_2/user/forphan.sym new file mode 100644 index 0000000000..0b2cf83910 --- /dev/null +++ b/G12_Project2_2/user/forphan.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000930 .rodata +00000000000009e8 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 forphan.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003f8 putc +0000000000000416 printint +00000000000009d0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001208 base +00000000000000d4 strcpy +00000000000003e8 pause +0000000000000780 printf +00000000000003e0 sys_sbrk +000000000000027e memmove +00000000000003a0 mknod +000000000000018c gets +00000000000003d8 getpid +0000000000000310 memcpy +0000000000000834 malloc +000000000000033a sbrklazy +0000000000000368 pipe +0000000000000378 write +00000000000003b0 fstat +0000000000000756 fprintf +0000000000000388 kill +00000000000004b2 vprintf +00000000000003c8 chdir +0000000000000390 exec +0000000000000360 wait +0000000000000370 read +00000000000003a8 unlink +00000000000002d6 memcmp +0000000000000350 fork +0000000000000324 sbrk +00000000000003f0 uptime +0000000000000146 memset +0000000000000000 main +00000000000000f0 strcmp +00000000000003d0 dup +0000000000001010 buf +00000000000001fc stat +00000000000003b8 link +0000000000000358 exit +00000000000000c4 start +0000000000000236 atoi +000000000000011c strlen +0000000000000398 open +0000000000000168 strchr +00000000000003c0 mkdir +0000000000000380 close +00000000000007b2 free diff --git a/G12_Project2_2/user/grep.asm b/G12_Project2_2/user/grep.asm new file mode 100644 index 0000000000..20f3007dac --- /dev/null +++ b/G12_Project2_2/user/grep.asm @@ -0,0 +1,1754 @@ + +user/_grep: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + 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: 02c000ef jal 4a + 22: e919 bnez a0,38 + }while(*text!='\0' && (*text++==c || c=='.')); + 24: 0004c783 lbu a5,0(s1) + 28: cb89 beqz a5,3a + 2a: 0485 addi s1,s1,1 + 2c: 2781 sext.w a5,a5 + 2e: ff2786e3 beq a5,s2,1a + 32: ff4904e3 beq s2,s4,1a + 36: a011 j 3a + return 1; + 38: 4505 li a0,1 + return 0; +} + 3a: 70a2 ld ra,40(sp) + 3c: 7402 ld s0,32(sp) + 3e: 64e2 ld s1,24(sp) + 40: 6942 ld s2,16(sp) + 42: 69a2 ld s3,8(sp) + 44: 6a02 ld s4,0(sp) + 46: 6145 addi sp,sp,48 + 48: 8082 ret + +000000000000004a : + if(re[0] == '\0') + 4a: 00054703 lbu a4,0(a0) + 4e: c73d beqz a4,bc +{ + 50: 1141 addi sp,sp,-16 + 52: e406 sd ra,8(sp) + 54: e022 sd s0,0(sp) + 56: 0800 addi s0,sp,16 + 58: 87aa mv a5,a0 + if(re[1] == '*') + 5a: 00154683 lbu a3,1(a0) + 5e: 02a00613 li a2,42 + 62: 02c68563 beq a3,a2,8c + if(re[0] == '$' && re[1] == '\0') + 66: 02400613 li a2,36 + 6a: 02c70863 beq a4,a2,9a + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 6e: 0005c683 lbu a3,0(a1) + return 0; + 72: 4501 li a0,0 + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 74: ca81 beqz a3,84 + 76: 02e00613 li a2,46 + 7a: 02c70b63 beq a4,a2,b0 + return 0; + 7e: 4501 li a0,0 + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 80: 02d70863 beq a4,a3,b0 +} + 84: 60a2 ld ra,8(sp) + 86: 6402 ld s0,0(sp) + 88: 0141 addi sp,sp,16 + 8a: 8082 ret + return matchstar(re[0], re+2, text); + 8c: 862e mv a2,a1 + 8e: 00250593 addi a1,a0,2 + 92: 853a mv a0,a4 + 94: f6dff0ef jal 0 + 98: b7f5 j 84 + if(re[0] == '$' && re[1] == '\0') + 9a: c691 beqz a3,a6 + if(*text!='\0' && (re[0]=='.' || re[0]==*text)) + 9c: 0005c683 lbu a3,0(a1) + a0: fef9 bnez a3,7e + return 0; + a2: 4501 li a0,0 + a4: b7c5 j 84 + return *text == '\0'; + a6: 0005c503 lbu a0,0(a1) + aa: 00153513 seqz a0,a0 + ae: bfd9 j 84 + return matchhere(re+1, text+1); + b0: 0585 addi a1,a1,1 + b2: 00178513 addi a0,a5,1 + b6: f95ff0ef jal 4a + ba: b7e9 j 84 + return 1; + bc: 4505 li a0,1 +} + be: 8082 ret + +00000000000000c0 : +{ + c0: 1101 addi sp,sp,-32 + c2: ec06 sd ra,24(sp) + c4: e822 sd s0,16(sp) + c6: e426 sd s1,8(sp) + c8: e04a sd s2,0(sp) + ca: 1000 addi s0,sp,32 + cc: 892a mv s2,a0 + ce: 84ae mv s1,a1 + if(re[0] == '^') + d0: 00054703 lbu a4,0(a0) + d4: 05e00793 li a5,94 + d8: 00f70c63 beq a4,a5,f0 + if(matchhere(re, text)) + dc: 85a6 mv a1,s1 + de: 854a mv a0,s2 + e0: f6bff0ef jal 4a + e4: e911 bnez a0,f8 + }while(*text++ != '\0'); + e6: 0485 addi s1,s1,1 + e8: fff4c783 lbu a5,-1(s1) + ec: fbe5 bnez a5,dc + ee: a031 j fa + return matchhere(re+1, text); + f0: 0505 addi a0,a0,1 + f2: f59ff0ef jal 4a + f6: a011 j fa + return 1; + f8: 4505 li a0,1 +} + fa: 60e2 ld ra,24(sp) + fc: 6442 ld s0,16(sp) + fe: 64a2 ld s1,8(sp) + 100: 6902 ld s2,0(sp) + 102: 6105 addi sp,sp,32 + 104: 8082 ret + +0000000000000106 : +{ + 106: 715d addi sp,sp,-80 + 108: e486 sd ra,72(sp) + 10a: e0a2 sd s0,64(sp) + 10c: fc26 sd s1,56(sp) + 10e: f84a sd s2,48(sp) + 110: f44e sd s3,40(sp) + 112: f052 sd s4,32(sp) + 114: ec56 sd s5,24(sp) + 116: e85a sd s6,16(sp) + 118: e45e sd s7,8(sp) + 11a: e062 sd s8,0(sp) + 11c: 0880 addi s0,sp,80 + 11e: 89aa mv s3,a0 + 120: 8b2e mv s6,a1 + m = 0; + 122: 4a01 li s4,0 + while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){ + 124: 3ff00b93 li s7,1023 + 128: 00002a97 auipc s5,0x2 + 12c: ee8a8a93 addi s5,s5,-280 # 2010 + 130: a835 j 16c + p = q+1; + 132: 00148913 addi s2,s1,1 + while((q = strchr(p, '\n')) != 0){ + 136: 45a9 li a1,10 + 138: 854a mv a0,s2 + 13a: 1c4000ef jal 2fe + 13e: 84aa mv s1,a0 + 140: c505 beqz a0,168 + *q = 0; + 142: 00048023 sb zero,0(s1) + if(match(pattern, p)){ + 146: 85ca mv a1,s2 + 148: 854e mv a0,s3 + 14a: f77ff0ef jal c0 + 14e: d175 beqz a0,132 + *q = '\n'; + 150: 47a9 li a5,10 + 152: 00f48023 sb a5,0(s1) + write(1, p, q+1 - p); + 156: 00148613 addi a2,s1,1 + 15a: 4126063b subw a2,a2,s2 + 15e: 85ca mv a1,s2 + 160: 4505 li a0,1 + 162: 3ac000ef jal 50e + 166: b7f1 j 132 + if(m > 0){ + 168: 03404563 bgtz s4,192 + while((n = read(fd, buf+m, sizeof(buf)-m-1)) > 0){ + 16c: 414b863b subw a2,s7,s4 + 170: 014a85b3 add a1,s5,s4 + 174: 855a mv a0,s6 + 176: 390000ef jal 506 + 17a: 02a05963 blez a0,1ac + m += n; + 17e: 00aa0c3b addw s8,s4,a0 + 182: 000c0a1b sext.w s4,s8 + buf[m] = '\0'; + 186: 014a87b3 add a5,s5,s4 + 18a: 00078023 sb zero,0(a5) + p = buf; + 18e: 8956 mv s2,s5 + while((q = strchr(p, '\n')) != 0){ + 190: b75d j 136 + m -= p - buf; + 192: 00002517 auipc a0,0x2 + 196: e7e50513 addi a0,a0,-386 # 2010 + 19a: 40a90a33 sub s4,s2,a0 + 19e: 414c0a3b subw s4,s8,s4 + memmove(buf, p, m); + 1a2: 8652 mv a2,s4 + 1a4: 85ca mv a1,s2 + 1a6: 26e000ef jal 414 + 1aa: b7c9 j 16c +} + 1ac: 60a6 ld ra,72(sp) + 1ae: 6406 ld s0,64(sp) + 1b0: 74e2 ld s1,56(sp) + 1b2: 7942 ld s2,48(sp) + 1b4: 79a2 ld s3,40(sp) + 1b6: 7a02 ld s4,32(sp) + 1b8: 6ae2 ld s5,24(sp) + 1ba: 6b42 ld s6,16(sp) + 1bc: 6ba2 ld s7,8(sp) + 1be: 6c02 ld s8,0(sp) + 1c0: 6161 addi sp,sp,80 + 1c2: 8082 ret + +00000000000001c4
: +{ + 1c4: 7179 addi sp,sp,-48 + 1c6: f406 sd ra,40(sp) + 1c8: f022 sd s0,32(sp) + 1ca: ec26 sd s1,24(sp) + 1cc: e84a sd s2,16(sp) + 1ce: e44e sd s3,8(sp) + 1d0: e052 sd s4,0(sp) + 1d2: 1800 addi s0,sp,48 + if(argc <= 1){ + 1d4: 4785 li a5,1 + 1d6: 04a7d663 bge a5,a0,222 + pattern = argv[1]; + 1da: 0085ba03 ld s4,8(a1) + if(argc <= 2){ + 1de: 4789 li a5,2 + 1e0: 04a7db63 bge a5,a0,236 + 1e4: 01058913 addi s2,a1,16 + 1e8: ffd5099b addiw s3,a0,-3 + 1ec: 02099793 slli a5,s3,0x20 + 1f0: 01d7d993 srli s3,a5,0x1d + 1f4: 05e1 addi a1,a1,24 + 1f6: 99ae add s3,s3,a1 + if((fd = open(argv[i], O_RDONLY)) < 0){ + 1f8: 4581 li a1,0 + 1fa: 00093503 ld a0,0(s2) + 1fe: 330000ef jal 52e + 202: 84aa mv s1,a0 + 204: 04054063 bltz a0,244 + grep(pattern, fd); + 208: 85aa mv a1,a0 + 20a: 8552 mv a0,s4 + 20c: efbff0ef jal 106 + close(fd); + 210: 8526 mv a0,s1 + 212: 304000ef jal 516 + for(i = 2; i < argc; i++){ + 216: 0921 addi s2,s2,8 + 218: ff3910e3 bne s2,s3,1f8 + exit(0); + 21c: 4501 li a0,0 + 21e: 2d0000ef jal 4ee + fprintf(2, "usage: grep pattern [file ...]\n"); + 222: 00001597 auipc a1,0x1 + 226: 8ae58593 addi a1,a1,-1874 # ad0 + 22a: 4509 li a0,2 + 22c: 6c0000ef jal 8ec + exit(1); + 230: 4505 li a0,1 + 232: 2bc000ef jal 4ee + grep(pattern, 0); + 236: 4581 li a1,0 + 238: 8552 mv a0,s4 + 23a: ecdff0ef jal 106 + exit(0); + 23e: 4501 li a0,0 + 240: 2ae000ef jal 4ee + printf("grep: cannot open %s\n", argv[i]); + 244: 00093583 ld a1,0(s2) + 248: 00001517 auipc a0,0x1 + 24c: 8a850513 addi a0,a0,-1880 # af0 + 250: 6c6000ef jal 916 + exit(1); + 254: 4505 li a0,1 + 256: 298000ef jal 4ee + +000000000000025a : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 25a: 1141 addi sp,sp,-16 + 25c: e406 sd ra,8(sp) + 25e: e022 sd s0,0(sp) + 260: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 262: f63ff0ef jal 1c4
+ exit(r); + 266: 288000ef jal 4ee + +000000000000026a : +} + +char* +strcpy(char *s, const char *t) +{ + 26a: 1141 addi sp,sp,-16 + 26c: e422 sd s0,8(sp) + 26e: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 270: 87aa mv a5,a0 + 272: 0585 addi a1,a1,1 + 274: 0785 addi a5,a5,1 + 276: fff5c703 lbu a4,-1(a1) + 27a: fee78fa3 sb a4,-1(a5) + 27e: fb75 bnez a4,272 + ; + return os; +} + 280: 6422 ld s0,8(sp) + 282: 0141 addi sp,sp,16 + 284: 8082 ret + +0000000000000286 : + +int +strcmp(const char *p, const char *q) +{ + 286: 1141 addi sp,sp,-16 + 288: e422 sd s0,8(sp) + 28a: 0800 addi s0,sp,16 + while(*p && *p == *q) + 28c: 00054783 lbu a5,0(a0) + 290: cb91 beqz a5,2a4 + 292: 0005c703 lbu a4,0(a1) + 296: 00f71763 bne a4,a5,2a4 + p++, q++; + 29a: 0505 addi a0,a0,1 + 29c: 0585 addi a1,a1,1 + while(*p && *p == *q) + 29e: 00054783 lbu a5,0(a0) + 2a2: fbe5 bnez a5,292 + return (uchar)*p - (uchar)*q; + 2a4: 0005c503 lbu a0,0(a1) +} + 2a8: 40a7853b subw a0,a5,a0 + 2ac: 6422 ld s0,8(sp) + 2ae: 0141 addi sp,sp,16 + 2b0: 8082 ret + +00000000000002b2 : + +uint +strlen(const char *s) +{ + 2b2: 1141 addi sp,sp,-16 + 2b4: e422 sd s0,8(sp) + 2b6: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 2b8: 00054783 lbu a5,0(a0) + 2bc: cf91 beqz a5,2d8 + 2be: 0505 addi a0,a0,1 + 2c0: 87aa mv a5,a0 + 2c2: 86be mv a3,a5 + 2c4: 0785 addi a5,a5,1 + 2c6: fff7c703 lbu a4,-1(a5) + 2ca: ff65 bnez a4,2c2 + 2cc: 40a6853b subw a0,a3,a0 + 2d0: 2505 addiw a0,a0,1 + ; + return n; +} + 2d2: 6422 ld s0,8(sp) + 2d4: 0141 addi sp,sp,16 + 2d6: 8082 ret + for(n = 0; s[n]; n++) + 2d8: 4501 li a0,0 + 2da: bfe5 j 2d2 + +00000000000002dc : + +void* +memset(void *dst, int c, uint n) +{ + 2dc: 1141 addi sp,sp,-16 + 2de: e422 sd s0,8(sp) + 2e0: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 2e2: ca19 beqz a2,2f8 + 2e4: 87aa mv a5,a0 + 2e6: 1602 slli a2,a2,0x20 + 2e8: 9201 srli a2,a2,0x20 + 2ea: 00a60733 add a4,a2,a0 + cdst[i] = c; + 2ee: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 2f2: 0785 addi a5,a5,1 + 2f4: fee79de3 bne a5,a4,2ee + } + return dst; +} + 2f8: 6422 ld s0,8(sp) + 2fa: 0141 addi sp,sp,16 + 2fc: 8082 ret + +00000000000002fe : + +char* +strchr(const char *s, char c) +{ + 2fe: 1141 addi sp,sp,-16 + 300: e422 sd s0,8(sp) + 302: 0800 addi s0,sp,16 + for(; *s; s++) + 304: 00054783 lbu a5,0(a0) + 308: cb99 beqz a5,31e + if(*s == c) + 30a: 00f58763 beq a1,a5,318 + for(; *s; s++) + 30e: 0505 addi a0,a0,1 + 310: 00054783 lbu a5,0(a0) + 314: fbfd bnez a5,30a + return (char*)s; + return 0; + 316: 4501 li a0,0 +} + 318: 6422 ld s0,8(sp) + 31a: 0141 addi sp,sp,16 + 31c: 8082 ret + return 0; + 31e: 4501 li a0,0 + 320: bfe5 j 318 + +0000000000000322 : + +char* +gets(char *buf, int max) +{ + 322: 711d addi sp,sp,-96 + 324: ec86 sd ra,88(sp) + 326: e8a2 sd s0,80(sp) + 328: e4a6 sd s1,72(sp) + 32a: e0ca sd s2,64(sp) + 32c: fc4e sd s3,56(sp) + 32e: f852 sd s4,48(sp) + 330: f456 sd s5,40(sp) + 332: f05a sd s6,32(sp) + 334: ec5e sd s7,24(sp) + 336: 1080 addi s0,sp,96 + 338: 8baa mv s7,a0 + 33a: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 33c: 892a mv s2,a0 + 33e: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 340: 4aa9 li s5,10 + 342: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 344: 89a6 mv s3,s1 + 346: 2485 addiw s1,s1,1 + 348: 0344d663 bge s1,s4,374 + cc = read(0, &c, 1); + 34c: 4605 li a2,1 + 34e: faf40593 addi a1,s0,-81 + 352: 4501 li a0,0 + 354: 1b2000ef jal 506 + if(cc < 1) + 358: 00a05e63 blez a0,374 + buf[i++] = c; + 35c: faf44783 lbu a5,-81(s0) + 360: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 364: 01578763 beq a5,s5,372 + 368: 0905 addi s2,s2,1 + 36a: fd679de3 bne a5,s6,344 + buf[i++] = c; + 36e: 89a6 mv s3,s1 + 370: a011 j 374 + 372: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 374: 99de add s3,s3,s7 + 376: 00098023 sb zero,0(s3) + return buf; +} + 37a: 855e mv a0,s7 + 37c: 60e6 ld ra,88(sp) + 37e: 6446 ld s0,80(sp) + 380: 64a6 ld s1,72(sp) + 382: 6906 ld s2,64(sp) + 384: 79e2 ld s3,56(sp) + 386: 7a42 ld s4,48(sp) + 388: 7aa2 ld s5,40(sp) + 38a: 7b02 ld s6,32(sp) + 38c: 6be2 ld s7,24(sp) + 38e: 6125 addi sp,sp,96 + 390: 8082 ret + +0000000000000392 : + +int +stat(const char *n, struct stat *st) +{ + 392: 1101 addi sp,sp,-32 + 394: ec06 sd ra,24(sp) + 396: e822 sd s0,16(sp) + 398: e04a sd s2,0(sp) + 39a: 1000 addi s0,sp,32 + 39c: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 39e: 4581 li a1,0 + 3a0: 18e000ef jal 52e + if(fd < 0) + 3a4: 02054263 bltz a0,3c8 + 3a8: e426 sd s1,8(sp) + 3aa: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 3ac: 85ca mv a1,s2 + 3ae: 198000ef jal 546 + 3b2: 892a mv s2,a0 + close(fd); + 3b4: 8526 mv a0,s1 + 3b6: 160000ef jal 516 + return r; + 3ba: 64a2 ld s1,8(sp) +} + 3bc: 854a mv a0,s2 + 3be: 60e2 ld ra,24(sp) + 3c0: 6442 ld s0,16(sp) + 3c2: 6902 ld s2,0(sp) + 3c4: 6105 addi sp,sp,32 + 3c6: 8082 ret + return -1; + 3c8: 597d li s2,-1 + 3ca: bfcd j 3bc + +00000000000003cc : + +int +atoi(const char *s) +{ + 3cc: 1141 addi sp,sp,-16 + 3ce: e422 sd s0,8(sp) + 3d0: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 3d2: 00054683 lbu a3,0(a0) + 3d6: fd06879b addiw a5,a3,-48 + 3da: 0ff7f793 zext.b a5,a5 + 3de: 4625 li a2,9 + 3e0: 02f66863 bltu a2,a5,410 + 3e4: 872a mv a4,a0 + n = 0; + 3e6: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 3e8: 0705 addi a4,a4,1 + 3ea: 0025179b slliw a5,a0,0x2 + 3ee: 9fa9 addw a5,a5,a0 + 3f0: 0017979b slliw a5,a5,0x1 + 3f4: 9fb5 addw a5,a5,a3 + 3f6: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 3fa: 00074683 lbu a3,0(a4) + 3fe: fd06879b addiw a5,a3,-48 + 402: 0ff7f793 zext.b a5,a5 + 406: fef671e3 bgeu a2,a5,3e8 + return n; +} + 40a: 6422 ld s0,8(sp) + 40c: 0141 addi sp,sp,16 + 40e: 8082 ret + n = 0; + 410: 4501 li a0,0 + 412: bfe5 j 40a + +0000000000000414 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 414: 1141 addi sp,sp,-16 + 416: e422 sd s0,8(sp) + 418: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 41a: 02b57463 bgeu a0,a1,442 + while(n-- > 0) + 41e: 00c05f63 blez a2,43c + 422: 1602 slli a2,a2,0x20 + 424: 9201 srli a2,a2,0x20 + 426: 00c507b3 add a5,a0,a2 + dst = vdst; + 42a: 872a mv a4,a0 + *dst++ = *src++; + 42c: 0585 addi a1,a1,1 + 42e: 0705 addi a4,a4,1 + 430: fff5c683 lbu a3,-1(a1) + 434: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 438: fef71ae3 bne a4,a5,42c + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 43c: 6422 ld s0,8(sp) + 43e: 0141 addi sp,sp,16 + 440: 8082 ret + dst += n; + 442: 00c50733 add a4,a0,a2 + src += n; + 446: 95b2 add a1,a1,a2 + while(n-- > 0) + 448: fec05ae3 blez a2,43c + 44c: fff6079b addiw a5,a2,-1 + 450: 1782 slli a5,a5,0x20 + 452: 9381 srli a5,a5,0x20 + 454: fff7c793 not a5,a5 + 458: 97ba add a5,a5,a4 + *--dst = *--src; + 45a: 15fd addi a1,a1,-1 + 45c: 177d addi a4,a4,-1 + 45e: 0005c683 lbu a3,0(a1) + 462: 00d70023 sb a3,0(a4) + while(n-- > 0) + 466: fee79ae3 bne a5,a4,45a + 46a: bfc9 j 43c + +000000000000046c : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 46c: 1141 addi sp,sp,-16 + 46e: e422 sd s0,8(sp) + 470: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 472: ca05 beqz a2,4a2 + 474: fff6069b addiw a3,a2,-1 + 478: 1682 slli a3,a3,0x20 + 47a: 9281 srli a3,a3,0x20 + 47c: 0685 addi a3,a3,1 + 47e: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 480: 00054783 lbu a5,0(a0) + 484: 0005c703 lbu a4,0(a1) + 488: 00e79863 bne a5,a4,498 + return *p1 - *p2; + } + p1++; + 48c: 0505 addi a0,a0,1 + p2++; + 48e: 0585 addi a1,a1,1 + while (n-- > 0) { + 490: fed518e3 bne a0,a3,480 + } + return 0; + 494: 4501 li a0,0 + 496: a019 j 49c + return *p1 - *p2; + 498: 40e7853b subw a0,a5,a4 +} + 49c: 6422 ld s0,8(sp) + 49e: 0141 addi sp,sp,16 + 4a0: 8082 ret + return 0; + 4a2: 4501 li a0,0 + 4a4: bfe5 j 49c + +00000000000004a6 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 4a6: 1141 addi sp,sp,-16 + 4a8: e406 sd ra,8(sp) + 4aa: e022 sd s0,0(sp) + 4ac: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 4ae: f67ff0ef jal 414 +} + 4b2: 60a2 ld ra,8(sp) + 4b4: 6402 ld s0,0(sp) + 4b6: 0141 addi sp,sp,16 + 4b8: 8082 ret + +00000000000004ba : + +char * +sbrk(int n) { + 4ba: 1141 addi sp,sp,-16 + 4bc: e406 sd ra,8(sp) + 4be: e022 sd s0,0(sp) + 4c0: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 4c2: 4585 li a1,1 + 4c4: 0b2000ef jal 576 +} + 4c8: 60a2 ld ra,8(sp) + 4ca: 6402 ld s0,0(sp) + 4cc: 0141 addi sp,sp,16 + 4ce: 8082 ret + +00000000000004d0 : + +char * +sbrklazy(int n) { + 4d0: 1141 addi sp,sp,-16 + 4d2: e406 sd ra,8(sp) + 4d4: e022 sd s0,0(sp) + 4d6: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 4d8: 4589 li a1,2 + 4da: 09c000ef jal 576 +} + 4de: 60a2 ld ra,8(sp) + 4e0: 6402 ld s0,0(sp) + 4e2: 0141 addi sp,sp,16 + 4e4: 8082 ret + +00000000000004e6 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 4e6: 4885 li a7,1 + ecall + 4e8: 00000073 ecall + ret + 4ec: 8082 ret + +00000000000004ee : +.global exit +exit: + li a7, SYS_exit + 4ee: 4889 li a7,2 + ecall + 4f0: 00000073 ecall + ret + 4f4: 8082 ret + +00000000000004f6 : +.global wait +wait: + li a7, SYS_wait + 4f6: 488d li a7,3 + ecall + 4f8: 00000073 ecall + ret + 4fc: 8082 ret + +00000000000004fe : +.global pipe +pipe: + li a7, SYS_pipe + 4fe: 4891 li a7,4 + ecall + 500: 00000073 ecall + ret + 504: 8082 ret + +0000000000000506 : +.global read +read: + li a7, SYS_read + 506: 4895 li a7,5 + ecall + 508: 00000073 ecall + ret + 50c: 8082 ret + +000000000000050e : +.global write +write: + li a7, SYS_write + 50e: 48c1 li a7,16 + ecall + 510: 00000073 ecall + ret + 514: 8082 ret + +0000000000000516 : +.global close +close: + li a7, SYS_close + 516: 48d5 li a7,21 + ecall + 518: 00000073 ecall + ret + 51c: 8082 ret + +000000000000051e : +.global kill +kill: + li a7, SYS_kill + 51e: 4899 li a7,6 + ecall + 520: 00000073 ecall + ret + 524: 8082 ret + +0000000000000526 : +.global exec +exec: + li a7, SYS_exec + 526: 489d li a7,7 + ecall + 528: 00000073 ecall + ret + 52c: 8082 ret + +000000000000052e : +.global open +open: + li a7, SYS_open + 52e: 48bd li a7,15 + ecall + 530: 00000073 ecall + ret + 534: 8082 ret + +0000000000000536 : +.global mknod +mknod: + li a7, SYS_mknod + 536: 48c5 li a7,17 + ecall + 538: 00000073 ecall + ret + 53c: 8082 ret + +000000000000053e : +.global unlink +unlink: + li a7, SYS_unlink + 53e: 48c9 li a7,18 + ecall + 540: 00000073 ecall + ret + 544: 8082 ret + +0000000000000546 : +.global fstat +fstat: + li a7, SYS_fstat + 546: 48a1 li a7,8 + ecall + 548: 00000073 ecall + ret + 54c: 8082 ret + +000000000000054e : +.global link +link: + li a7, SYS_link + 54e: 48cd li a7,19 + ecall + 550: 00000073 ecall + ret + 554: 8082 ret + +0000000000000556 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 556: 48d1 li a7,20 + ecall + 558: 00000073 ecall + ret + 55c: 8082 ret + +000000000000055e : +.global chdir +chdir: + li a7, SYS_chdir + 55e: 48a5 li a7,9 + ecall + 560: 00000073 ecall + ret + 564: 8082 ret + +0000000000000566 : +.global dup +dup: + li a7, SYS_dup + 566: 48a9 li a7,10 + ecall + 568: 00000073 ecall + ret + 56c: 8082 ret + +000000000000056e : +.global getpid +getpid: + li a7, SYS_getpid + 56e: 48ad li a7,11 + ecall + 570: 00000073 ecall + ret + 574: 8082 ret + +0000000000000576 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 576: 48b1 li a7,12 + ecall + 578: 00000073 ecall + ret + 57c: 8082 ret + +000000000000057e : +.global pause +pause: + li a7, SYS_pause + 57e: 48b5 li a7,13 + ecall + 580: 00000073 ecall + ret + 584: 8082 ret + +0000000000000586 : +.global uptime +uptime: + li a7, SYS_uptime + 586: 48b9 li a7,14 + ecall + 588: 00000073 ecall + ret + 58c: 8082 ret + +000000000000058e : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 58e: 1101 addi sp,sp,-32 + 590: ec06 sd ra,24(sp) + 592: e822 sd s0,16(sp) + 594: 1000 addi s0,sp,32 + 596: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 59a: 4605 li a2,1 + 59c: fef40593 addi a1,s0,-17 + 5a0: f6fff0ef jal 50e +} + 5a4: 60e2 ld ra,24(sp) + 5a6: 6442 ld s0,16(sp) + 5a8: 6105 addi sp,sp,32 + 5aa: 8082 ret + +00000000000005ac : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 5ac: 715d addi sp,sp,-80 + 5ae: e486 sd ra,72(sp) + 5b0: e0a2 sd s0,64(sp) + 5b2: f84a sd s2,48(sp) + 5b4: 0880 addi s0,sp,80 + 5b6: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 5b8: c299 beqz a3,5be + 5ba: 0805c363 bltz a1,640 + neg = 0; + 5be: 4881 li a7,0 + 5c0: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 5c4: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 5c6: 00000517 auipc a0,0x0 + 5ca: 54a50513 addi a0,a0,1354 # b10 + 5ce: 883e mv a6,a5 + 5d0: 2785 addiw a5,a5,1 + 5d2: 02c5f733 remu a4,a1,a2 + 5d6: 972a add a4,a4,a0 + 5d8: 00074703 lbu a4,0(a4) + 5dc: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 5e0: 872e mv a4,a1 + 5e2: 02c5d5b3 divu a1,a1,a2 + 5e6: 0685 addi a3,a3,1 + 5e8: fec773e3 bgeu a4,a2,5ce + if(neg) + 5ec: 00088b63 beqz a7,602 + buf[i++] = '-'; + 5f0: fd078793 addi a5,a5,-48 + 5f4: 97a2 add a5,a5,s0 + 5f6: 02d00713 li a4,45 + 5fa: fee78423 sb a4,-24(a5) + 5fe: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 602: 02f05a63 blez a5,636 + 606: fc26 sd s1,56(sp) + 608: f44e sd s3,40(sp) + 60a: fb840713 addi a4,s0,-72 + 60e: 00f704b3 add s1,a4,a5 + 612: fff70993 addi s3,a4,-1 + 616: 99be add s3,s3,a5 + 618: 37fd addiw a5,a5,-1 + 61a: 1782 slli a5,a5,0x20 + 61c: 9381 srli a5,a5,0x20 + 61e: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 622: fff4c583 lbu a1,-1(s1) + 626: 854a mv a0,s2 + 628: f67ff0ef jal 58e + while(--i >= 0) + 62c: 14fd addi s1,s1,-1 + 62e: ff349ae3 bne s1,s3,622 + 632: 74e2 ld s1,56(sp) + 634: 79a2 ld s3,40(sp) +} + 636: 60a6 ld ra,72(sp) + 638: 6406 ld s0,64(sp) + 63a: 7942 ld s2,48(sp) + 63c: 6161 addi sp,sp,80 + 63e: 8082 ret + x = -xx; + 640: 40b005b3 neg a1,a1 + neg = 1; + 644: 4885 li a7,1 + x = -xx; + 646: bfad j 5c0 + +0000000000000648 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 648: 711d addi sp,sp,-96 + 64a: ec86 sd ra,88(sp) + 64c: e8a2 sd s0,80(sp) + 64e: e0ca sd s2,64(sp) + 650: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 652: 0005c903 lbu s2,0(a1) + 656: 28090663 beqz s2,8e2 + 65a: e4a6 sd s1,72(sp) + 65c: fc4e sd s3,56(sp) + 65e: f852 sd s4,48(sp) + 660: f456 sd s5,40(sp) + 662: f05a sd s6,32(sp) + 664: ec5e sd s7,24(sp) + 666: e862 sd s8,16(sp) + 668: e466 sd s9,8(sp) + 66a: 8b2a mv s6,a0 + 66c: 8a2e mv s4,a1 + 66e: 8bb2 mv s7,a2 + state = 0; + 670: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 672: 4481 li s1,0 + 674: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 676: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 67a: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 67e: 06c00c93 li s9,108 + 682: a005 j 6a2 + putc(fd, c0); + 684: 85ca mv a1,s2 + 686: 855a mv a0,s6 + 688: f07ff0ef jal 58e + 68c: a019 j 692 + } else if(state == '%'){ + 68e: 03598263 beq s3,s5,6b2 + for(i = 0; fmt[i]; i++){ + 692: 2485 addiw s1,s1,1 + 694: 8726 mv a4,s1 + 696: 009a07b3 add a5,s4,s1 + 69a: 0007c903 lbu s2,0(a5) + 69e: 22090a63 beqz s2,8d2 + c0 = fmt[i] & 0xff; + 6a2: 0009079b sext.w a5,s2 + if(state == 0){ + 6a6: fe0994e3 bnez s3,68e + if(c0 == '%'){ + 6aa: fd579de3 bne a5,s5,684 + state = '%'; + 6ae: 89be mv s3,a5 + 6b0: b7cd j 692 + if(c0) c1 = fmt[i+1] & 0xff; + 6b2: 00ea06b3 add a3,s4,a4 + 6b6: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 6ba: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 6bc: c681 beqz a3,6c4 + 6be: 9752 add a4,a4,s4 + 6c0: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 6c4: 05878363 beq a5,s8,70a + } else if(c0 == 'l' && c1 == 'd'){ + 6c8: 05978d63 beq a5,s9,722 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 6cc: 07500713 li a4,117 + 6d0: 0ee78763 beq a5,a4,7be + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 6d4: 07800713 li a4,120 + 6d8: 12e78963 beq a5,a4,80a + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 6dc: 07000713 li a4,112 + 6e0: 14e78e63 beq a5,a4,83c + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 6e4: 06300713 li a4,99 + 6e8: 18e78e63 beq a5,a4,884 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 6ec: 07300713 li a4,115 + 6f0: 1ae78463 beq a5,a4,898 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 6f4: 02500713 li a4,37 + 6f8: 04e79563 bne a5,a4,742 + putc(fd, '%'); + 6fc: 02500593 li a1,37 + 700: 855a mv a0,s6 + 702: e8dff0ef jal 58e + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 706: 4981 li s3,0 + 708: b769 j 692 + printint(fd, va_arg(ap, int), 10, 1); + 70a: 008b8913 addi s2,s7,8 + 70e: 4685 li a3,1 + 710: 4629 li a2,10 + 712: 000ba583 lw a1,0(s7) + 716: 855a mv a0,s6 + 718: e95ff0ef jal 5ac + 71c: 8bca mv s7,s2 + state = 0; + 71e: 4981 li s3,0 + 720: bf8d j 692 + } else if(c0 == 'l' && c1 == 'd'){ + 722: 06400793 li a5,100 + 726: 02f68963 beq a3,a5,758 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 72a: 06c00793 li a5,108 + 72e: 04f68263 beq a3,a5,772 + } else if(c0 == 'l' && c1 == 'u'){ + 732: 07500793 li a5,117 + 736: 0af68063 beq a3,a5,7d6 + } else if(c0 == 'l' && c1 == 'x'){ + 73a: 07800793 li a5,120 + 73e: 0ef68263 beq a3,a5,822 + putc(fd, '%'); + 742: 02500593 li a1,37 + 746: 855a mv a0,s6 + 748: e47ff0ef jal 58e + putc(fd, c0); + 74c: 85ca mv a1,s2 + 74e: 855a mv a0,s6 + 750: e3fff0ef jal 58e + state = 0; + 754: 4981 li s3,0 + 756: bf35 j 692 + printint(fd, va_arg(ap, uint64), 10, 1); + 758: 008b8913 addi s2,s7,8 + 75c: 4685 li a3,1 + 75e: 4629 li a2,10 + 760: 000bb583 ld a1,0(s7) + 764: 855a mv a0,s6 + 766: e47ff0ef jal 5ac + i += 1; + 76a: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 76c: 8bca mv s7,s2 + state = 0; + 76e: 4981 li s3,0 + i += 1; + 770: b70d j 692 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 772: 06400793 li a5,100 + 776: 02f60763 beq a2,a5,7a4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 77a: 07500793 li a5,117 + 77e: 06f60963 beq a2,a5,7f0 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 782: 07800793 li a5,120 + 786: faf61ee3 bne a2,a5,742 + printint(fd, va_arg(ap, uint64), 16, 0); + 78a: 008b8913 addi s2,s7,8 + 78e: 4681 li a3,0 + 790: 4641 li a2,16 + 792: 000bb583 ld a1,0(s7) + 796: 855a mv a0,s6 + 798: e15ff0ef jal 5ac + i += 2; + 79c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 79e: 8bca mv s7,s2 + state = 0; + 7a0: 4981 li s3,0 + i += 2; + 7a2: bdc5 j 692 + printint(fd, va_arg(ap, uint64), 10, 1); + 7a4: 008b8913 addi s2,s7,8 + 7a8: 4685 li a3,1 + 7aa: 4629 li a2,10 + 7ac: 000bb583 ld a1,0(s7) + 7b0: 855a mv a0,s6 + 7b2: dfbff0ef jal 5ac + i += 2; + 7b6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 7b8: 8bca mv s7,s2 + state = 0; + 7ba: 4981 li s3,0 + i += 2; + 7bc: bdd9 j 692 + printint(fd, va_arg(ap, uint32), 10, 0); + 7be: 008b8913 addi s2,s7,8 + 7c2: 4681 li a3,0 + 7c4: 4629 li a2,10 + 7c6: 000be583 lwu a1,0(s7) + 7ca: 855a mv a0,s6 + 7cc: de1ff0ef jal 5ac + 7d0: 8bca mv s7,s2 + state = 0; + 7d2: 4981 li s3,0 + 7d4: bd7d j 692 + printint(fd, va_arg(ap, uint64), 10, 0); + 7d6: 008b8913 addi s2,s7,8 + 7da: 4681 li a3,0 + 7dc: 4629 li a2,10 + 7de: 000bb583 ld a1,0(s7) + 7e2: 855a mv a0,s6 + 7e4: dc9ff0ef jal 5ac + i += 1; + 7e8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 7ea: 8bca mv s7,s2 + state = 0; + 7ec: 4981 li s3,0 + i += 1; + 7ee: b555 j 692 + printint(fd, va_arg(ap, uint64), 10, 0); + 7f0: 008b8913 addi s2,s7,8 + 7f4: 4681 li a3,0 + 7f6: 4629 li a2,10 + 7f8: 000bb583 ld a1,0(s7) + 7fc: 855a mv a0,s6 + 7fe: dafff0ef jal 5ac + i += 2; + 802: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 804: 8bca mv s7,s2 + state = 0; + 806: 4981 li s3,0 + i += 2; + 808: b569 j 692 + printint(fd, va_arg(ap, uint32), 16, 0); + 80a: 008b8913 addi s2,s7,8 + 80e: 4681 li a3,0 + 810: 4641 li a2,16 + 812: 000be583 lwu a1,0(s7) + 816: 855a mv a0,s6 + 818: d95ff0ef jal 5ac + 81c: 8bca mv s7,s2 + state = 0; + 81e: 4981 li s3,0 + 820: bd8d j 692 + printint(fd, va_arg(ap, uint64), 16, 0); + 822: 008b8913 addi s2,s7,8 + 826: 4681 li a3,0 + 828: 4641 li a2,16 + 82a: 000bb583 ld a1,0(s7) + 82e: 855a mv a0,s6 + 830: d7dff0ef jal 5ac + i += 1; + 834: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 836: 8bca mv s7,s2 + state = 0; + 838: 4981 li s3,0 + i += 1; + 83a: bda1 j 692 + 83c: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 83e: 008b8d13 addi s10,s7,8 + 842: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 846: 03000593 li a1,48 + 84a: 855a mv a0,s6 + 84c: d43ff0ef jal 58e + putc(fd, 'x'); + 850: 07800593 li a1,120 + 854: 855a mv a0,s6 + 856: d39ff0ef jal 58e + 85a: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 85c: 00000b97 auipc s7,0x0 + 860: 2b4b8b93 addi s7,s7,692 # b10 + 864: 03c9d793 srli a5,s3,0x3c + 868: 97de add a5,a5,s7 + 86a: 0007c583 lbu a1,0(a5) + 86e: 855a mv a0,s6 + 870: d1fff0ef jal 58e + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 874: 0992 slli s3,s3,0x4 + 876: 397d addiw s2,s2,-1 + 878: fe0916e3 bnez s2,864 + printptr(fd, va_arg(ap, uint64)); + 87c: 8bea mv s7,s10 + state = 0; + 87e: 4981 li s3,0 + 880: 6d02 ld s10,0(sp) + 882: bd01 j 692 + putc(fd, va_arg(ap, uint32)); + 884: 008b8913 addi s2,s7,8 + 888: 000bc583 lbu a1,0(s7) + 88c: 855a mv a0,s6 + 88e: d01ff0ef jal 58e + 892: 8bca mv s7,s2 + state = 0; + 894: 4981 li s3,0 + 896: bbf5 j 692 + if((s = va_arg(ap, char*)) == 0) + 898: 008b8993 addi s3,s7,8 + 89c: 000bb903 ld s2,0(s7) + 8a0: 00090f63 beqz s2,8be + for(; *s; s++) + 8a4: 00094583 lbu a1,0(s2) + 8a8: c195 beqz a1,8cc + putc(fd, *s); + 8aa: 855a mv a0,s6 + 8ac: ce3ff0ef jal 58e + for(; *s; s++) + 8b0: 0905 addi s2,s2,1 + 8b2: 00094583 lbu a1,0(s2) + 8b6: f9f5 bnez a1,8aa + if((s = va_arg(ap, char*)) == 0) + 8b8: 8bce mv s7,s3 + state = 0; + 8ba: 4981 li s3,0 + 8bc: bbd9 j 692 + s = "(null)"; + 8be: 00000917 auipc s2,0x0 + 8c2: 24a90913 addi s2,s2,586 # b08 + for(; *s; s++) + 8c6: 02800593 li a1,40 + 8ca: b7c5 j 8aa + if((s = va_arg(ap, char*)) == 0) + 8cc: 8bce mv s7,s3 + state = 0; + 8ce: 4981 li s3,0 + 8d0: b3c9 j 692 + 8d2: 64a6 ld s1,72(sp) + 8d4: 79e2 ld s3,56(sp) + 8d6: 7a42 ld s4,48(sp) + 8d8: 7aa2 ld s5,40(sp) + 8da: 7b02 ld s6,32(sp) + 8dc: 6be2 ld s7,24(sp) + 8de: 6c42 ld s8,16(sp) + 8e0: 6ca2 ld s9,8(sp) + } + } +} + 8e2: 60e6 ld ra,88(sp) + 8e4: 6446 ld s0,80(sp) + 8e6: 6906 ld s2,64(sp) + 8e8: 6125 addi sp,sp,96 + 8ea: 8082 ret + +00000000000008ec : + +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: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 908: 8622 mv a2,s0 + 90a: d3fff0ef jal 648 +} + 90e: 60e2 ld ra,24(sp) + 910: 6442 ld s0,16(sp) + 912: 6161 addi sp,sp,80 + 914: 8082 ret + +0000000000000916 : + +void +printf(const char *fmt, ...) +{ + 916: 711d addi sp,sp,-96 + 918: ec06 sd ra,24(sp) + 91a: e822 sd s0,16(sp) + 91c: 1000 addi s0,sp,32 + 91e: e40c sd a1,8(s0) + 920: e810 sd a2,16(s0) + 922: ec14 sd a3,24(s0) + 924: f018 sd a4,32(s0) + 926: f41c sd a5,40(s0) + 928: 03043823 sd a6,48(s0) + 92c: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 930: 00840613 addi a2,s0,8 + 934: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 938: 85aa mv a1,a0 + 93a: 4505 li a0,1 + 93c: d0dff0ef jal 648 +} + 940: 60e2 ld ra,24(sp) + 942: 6442 ld s0,16(sp) + 944: 6125 addi sp,sp,96 + 946: 8082 ret + +0000000000000948 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 948: 1141 addi sp,sp,-16 + 94a: e422 sd s0,8(sp) + 94c: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 94e: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 952: 00001797 auipc a5,0x1 + 956: 6ae7b783 ld a5,1710(a5) # 2000 + 95a: a02d j 984 + 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; + 95c: 4618 lw a4,8(a2) + 95e: 9f2d addw a4,a4,a1 + 960: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 964: 6398 ld a4,0(a5) + 966: 6310 ld a2,0(a4) + 968: a83d j 9a6 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 96a: ff852703 lw a4,-8(a0) + 96e: 9f31 addw a4,a4,a2 + 970: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 972: ff053683 ld a3,-16(a0) + 976: a091 j 9ba + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 978: 6398 ld a4,0(a5) + 97a: 00e7e463 bltu a5,a4,982 + 97e: 00e6ea63 bltu a3,a4,992 +{ + 982: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 984: fed7fae3 bgeu a5,a3,978 + 988: 6398 ld a4,0(a5) + 98a: 00e6e463 bltu a3,a4,992 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 98e: fee7eae3 bltu a5,a4,982 + if(bp + bp->s.size == p->s.ptr){ + 992: ff852583 lw a1,-8(a0) + 996: 6390 ld a2,0(a5) + 998: 02059813 slli a6,a1,0x20 + 99c: 01c85713 srli a4,a6,0x1c + 9a0: 9736 add a4,a4,a3 + 9a2: fae60de3 beq a2,a4,95c + bp->s.ptr = p->s.ptr->s.ptr; + 9a6: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 9aa: 4790 lw a2,8(a5) + 9ac: 02061593 slli a1,a2,0x20 + 9b0: 01c5d713 srli a4,a1,0x1c + 9b4: 973e add a4,a4,a5 + 9b6: fae68ae3 beq a3,a4,96a + p->s.ptr = bp->s.ptr; + 9ba: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 9bc: 00001717 auipc a4,0x1 + 9c0: 64f73223 sd a5,1604(a4) # 2000 +} + 9c4: 6422 ld s0,8(sp) + 9c6: 0141 addi sp,sp,16 + 9c8: 8082 ret + +00000000000009ca : + return freep; +} + +void* +malloc(uint nbytes) +{ + 9ca: 7139 addi sp,sp,-64 + 9cc: fc06 sd ra,56(sp) + 9ce: f822 sd s0,48(sp) + 9d0: f426 sd s1,40(sp) + 9d2: ec4e sd s3,24(sp) + 9d4: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 9d6: 02051493 slli s1,a0,0x20 + 9da: 9081 srli s1,s1,0x20 + 9dc: 04bd addi s1,s1,15 + 9de: 8091 srli s1,s1,0x4 + 9e0: 0014899b addiw s3,s1,1 + 9e4: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 9e6: 00001517 auipc a0,0x1 + 9ea: 61a53503 ld a0,1562(a0) # 2000 + 9ee: c915 beqz a0,a22 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 9f0: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 9f2: 4798 lw a4,8(a5) + 9f4: 08977a63 bgeu a4,s1,a88 + 9f8: f04a sd s2,32(sp) + 9fa: e852 sd s4,16(sp) + 9fc: e456 sd s5,8(sp) + 9fe: e05a sd s6,0(sp) + if(nu < 4096) + a00: 8a4e mv s4,s3 + a02: 0009871b sext.w a4,s3 + a06: 6685 lui a3,0x1 + a08: 00d77363 bgeu a4,a3,a0e + a0c: 6a05 lui s4,0x1 + a0e: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + a12: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + a16: 00001917 auipc s2,0x1 + a1a: 5ea90913 addi s2,s2,1514 # 2000 + if(p == SBRK_ERROR) + a1e: 5afd li s5,-1 + a20: a081 j a60 + a22: f04a sd s2,32(sp) + a24: e852 sd s4,16(sp) + a26: e456 sd s5,8(sp) + a28: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + a2a: 00002797 auipc a5,0x2 + a2e: 9e678793 addi a5,a5,-1562 # 2410 + a32: 00001717 auipc a4,0x1 + a36: 5cf73723 sd a5,1486(a4) # 2000 + a3a: e39c sd a5,0(a5) + base.s.size = 0; + a3c: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + a40: b7c1 j a00 + prevp->s.ptr = p->s.ptr; + a42: 6398 ld a4,0(a5) + a44: e118 sd a4,0(a0) + a46: a8a9 j aa0 + hp->s.size = nu; + a48: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + a4c: 0541 addi a0,a0,16 + a4e: efbff0ef jal 948 + return freep; + a52: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + a56: c12d beqz a0,ab8 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + a58: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + a5a: 4798 lw a4,8(a5) + a5c: 02977263 bgeu a4,s1,a80 + if(p == freep) + a60: 00093703 ld a4,0(s2) + a64: 853e mv a0,a5 + a66: fef719e3 bne a4,a5,a58 + p = sbrk(nu * sizeof(Header)); + a6a: 8552 mv a0,s4 + a6c: a4fff0ef jal 4ba + if(p == SBRK_ERROR) + a70: fd551ce3 bne a0,s5,a48 + return 0; + a74: 4501 li a0,0 + a76: 7902 ld s2,32(sp) + a78: 6a42 ld s4,16(sp) + a7a: 6aa2 ld s5,8(sp) + a7c: 6b02 ld s6,0(sp) + a7e: a03d j aac + a80: 7902 ld s2,32(sp) + a82: 6a42 ld s4,16(sp) + a84: 6aa2 ld s5,8(sp) + a86: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + a88: fae48de3 beq s1,a4,a42 + p->s.size -= nunits; + a8c: 4137073b subw a4,a4,s3 + a90: c798 sw a4,8(a5) + p += p->s.size; + a92: 02071693 slli a3,a4,0x20 + a96: 01c6d713 srli a4,a3,0x1c + a9a: 97ba add a5,a5,a4 + p->s.size = nunits; + a9c: 0137a423 sw s3,8(a5) + freep = prevp; + aa0: 00001717 auipc a4,0x1 + aa4: 56a73023 sd a0,1376(a4) # 2000 + return (void*)(p + 1); + aa8: 01078513 addi a0,a5,16 + } +} + aac: 70e2 ld ra,56(sp) + aae: 7442 ld s0,48(sp) + ab0: 74a2 ld s1,40(sp) + ab2: 69e2 ld s3,24(sp) + ab4: 6121 addi sp,sp,64 + ab6: 8082 ret + ab8: 7902 ld s2,32(sp) + aba: 6a42 ld s4,16(sp) + abc: 6aa2 ld s5,8(sp) + abe: 6b02 ld s6,0(sp) + ac0: b7f5 j aac diff --git a/G12_Project2_2/user/grep.c b/G12_Project2_2/user/grep.c new file mode 100644 index 0000000000..6c33766adc --- /dev/null +++ b/G12_Project2_2/user/grep.c @@ -0,0 +1,107 @@ +// Simple grep. Only supports ^ . * $ operators. + +#include "kernel/types.h" +#include "kernel/stat.h" +#include "kernel/fcntl.h" +#include "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], O_RDONLY)) < 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, or +// https://www.cs.princeton.edu/courses/archive/spr09/cos333/beautiful.html + +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/G12_Project2_2/user/grep.d b/G12_Project2_2/user/grep.d new file mode 100644 index 0000000000..18243b4007 --- /dev/null +++ b/G12_Project2_2/user/grep.d @@ -0,0 +1,2 @@ +user/grep.o: user/grep.c kernel/types.h kernel/stat.h kernel/fcntl.h \ + user/user.h diff --git a/G12_Project2_2/user/grep.o b/G12_Project2_2/user/grep.o new file mode 100644 index 0000000000..9d5652a2b2 Binary files /dev/null and b/G12_Project2_2/user/grep.o differ diff --git a/G12_Project2_2/user/grep.sym b/G12_Project2_2/user/grep.sym new file mode 100644 index 0000000000..a86756b9c5 --- /dev/null +++ b/G12_Project2_2/user/grep.sym @@ -0,0 +1,70 @@ +0000000000000000 .text +0000000000000ac8 .rodata +0000000000000b28 .eh_frame +0000000000002000 .data +0000000000002000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 grep.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000058e putc +00000000000005ac printint +0000000000000b10 digits +0000000000000000 umalloc.c +0000000000002000 freep +0000000000002410 base +000000000000026a strcpy +000000000000057e pause +0000000000000916 printf +0000000000000576 sys_sbrk +0000000000000414 memmove +000000000000004a matchhere +0000000000000536 mknod +0000000000000322 gets +000000000000056e getpid +00000000000004a6 memcpy +0000000000000106 grep +00000000000009ca malloc +00000000000004d0 sbrklazy +00000000000004fe pipe +000000000000050e write +0000000000000546 fstat +00000000000008ec fprintf +000000000000051e kill +0000000000000648 vprintf +000000000000055e chdir +0000000000000526 exec +00000000000004f6 wait +0000000000000506 read +000000000000053e unlink +000000000000046c memcmp +00000000000004e6 fork +00000000000004ba sbrk +0000000000000586 uptime +00000000000002dc memset +00000000000001c4 main +0000000000000000 matchstar +0000000000000286 strcmp +0000000000000566 dup +0000000000002010 buf +0000000000000392 stat +00000000000000c0 match +000000000000054e link +00000000000004ee exit +000000000000025a start +00000000000003cc atoi +00000000000002b2 strlen +000000000000052e open +00000000000002fe strchr +0000000000000556 mkdir +0000000000000516 close +0000000000000948 free diff --git a/G12_Project2_2/user/grind.asm b/G12_Project2_2/user/grind.asm new file mode 100644 index 0000000000..82893f3732 --- /dev/null +++ b/G12_Project2_2/user/grind.asm @@ -0,0 +1,2534 @@ + +user/_grind: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : +#include "kernel/riscv.h" + +// from FreeBSD. +int +do_rand(unsigned long *ctx) +{ + 0: 1141 addi sp,sp,-16 + 2: e422 sd s0,8(sp) + 4: 0800 addi s0,sp,16 + * October 1988, p. 1195. + */ + long hi, lo, x; + + /* Transform to [1, 0x7ffffffe] range. */ + x = (*ctx % 0x7ffffffe) + 1; + 6: 611c ld a5,0(a0) + 8: 80000737 lui a4,0x80000 + c: ffe74713 xori a4,a4,-2 + 10: 02e7f7b3 remu a5,a5,a4 + 14: 0785 addi a5,a5,1 + hi = x / 127773; + lo = x % 127773; + 16: 66fd lui a3,0x1f + 18: 31d68693 addi a3,a3,797 # 1f31d + 1c: 02d7e733 rem a4,a5,a3 + x = 16807 * lo - 2836 * hi; + 20: 6611 lui a2,0x4 + 22: 1a760613 addi a2,a2,423 # 41a7 + 26: 02c70733 mul a4,a4,a2 + hi = x / 127773; + 2a: 02d7c7b3 div a5,a5,a3 + x = 16807 * lo - 2836 * hi; + 2e: 76fd lui a3,0xfffff + 30: 4ec68693 addi a3,a3,1260 # fffffffffffff4ec + 34: 02d787b3 mul a5,a5,a3 + 38: 97ba add a5,a5,a4 + if (x < 0) + 3a: 0007c963 bltz a5,4c + x += 0x7fffffff; + /* Transform to [0, 0x7ffffffd] range. */ + x--; + 3e: 17fd addi a5,a5,-1 + *ctx = x; + 40: e11c sd a5,0(a0) + return (x); +} + 42: 0007851b sext.w a0,a5 + 46: 6422 ld s0,8(sp) + 48: 0141 addi sp,sp,16 + 4a: 8082 ret + x += 0x7fffffff; + 4c: 80000737 lui a4,0x80000 + 50: fff74713 not a4,a4 + 54: 97ba add a5,a5,a4 + 56: b7e5 j 3e + +0000000000000058 : + +unsigned long rand_next = 1; + +int +rand(void) +{ + 58: 1141 addi sp,sp,-16 + 5a: e406 sd ra,8(sp) + 5c: e022 sd s0,0(sp) + 5e: 0800 addi s0,sp,16 + return (do_rand(&rand_next)); + 60: 00002517 auipc a0,0x2 + 64: fa050513 addi a0,a0,-96 # 2000 + 68: f99ff0ef jal 0 +} + 6c: 60a2 ld ra,8(sp) + 6e: 6402 ld s0,0(sp) + 70: 0141 addi sp,sp,16 + 72: 8082 ret + +0000000000000074 : + +void +go(int which_child) +{ + 74: 7159 addi sp,sp,-112 + 76: f486 sd ra,104(sp) + 78: f0a2 sd s0,96(sp) + 7a: eca6 sd s1,88(sp) + 7c: fc56 sd s5,56(sp) + 7e: 1880 addi s0,sp,112 + 80: 84aa mv s1,a0 + int fd = -1; + static char buf[999]; + char *break0 = sbrk(0); + 82: 4501 li a0,0 + 84: 2bb000ef jal b3e + 88: 8aaa mv s5,a0 + uint64 iters = 0; + + mkdir("grindir"); + 8a: 00001517 auipc a0,0x1 + 8e: 0c650513 addi a0,a0,198 # 1150 + 92: 349000ef jal bda + if(chdir("grindir") != 0){ + 96: 00001517 auipc a0,0x1 + 9a: 0ba50513 addi a0,a0,186 # 1150 + 9e: 345000ef jal be2 + a2: cd11 beqz a0,be + a4: e8ca sd s2,80(sp) + a6: e4ce sd s3,72(sp) + a8: e0d2 sd s4,64(sp) + aa: f85a sd s6,48(sp) + printf("grind: chdir grindir failed\n"); + ac: 00001517 auipc a0,0x1 + b0: 0ac50513 addi a0,a0,172 # 1158 + b4: 6e7000ef jal f9a + exit(1); + b8: 4505 li a0,1 + ba: 2b9000ef jal b72 + be: e8ca sd s2,80(sp) + c0: e4ce sd s3,72(sp) + c2: e0d2 sd s4,64(sp) + c4: f85a sd s6,48(sp) + } + chdir("/"); + c6: 00001517 auipc a0,0x1 + ca: 0ba50513 addi a0,a0,186 # 1180 + ce: 315000ef jal be2 + d2: 00001997 auipc s3,0x1 + d6: 0be98993 addi s3,s3,190 # 1190 + da: c489 beqz s1,e4 + dc: 00001997 auipc s3,0x1 + e0: 0ac98993 addi s3,s3,172 # 1188 + uint64 iters = 0; + e4: 4481 li s1,0 + int fd = -1; + e6: 5a7d li s4,-1 + e8: 00001917 auipc s2,0x1 + ec: 37890913 addi s2,s2,888 # 1460 + f0: a819 j 106 + 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)); + f2: 20200593 li a1,514 + f6: 00001517 auipc a0,0x1 + fa: 0a250513 addi a0,a0,162 # 1198 + fe: 2b5000ef jal bb2 + 102: 299000ef jal b9a + iters++; + 106: 0485 addi s1,s1,1 + if((iters % 500) == 0) + 108: 1f400793 li a5,500 + 10c: 02f4f7b3 remu a5,s1,a5 + 110: e791 bnez a5,11c + write(1, which_child?"B":"A", 1); + 112: 4605 li a2,1 + 114: 85ce mv a1,s3 + 116: 4505 li a0,1 + 118: 27b000ef jal b92 + int what = rand() % 23; + 11c: f3dff0ef jal 58 + 120: 47dd li a5,23 + 122: 02f5653b remw a0,a0,a5 + 126: 0005071b sext.w a4,a0 + 12a: 47d9 li a5,22 + 12c: fce7ede3 bltu a5,a4,106 + 130: 02051793 slli a5,a0,0x20 + 134: 01e7d513 srli a0,a5,0x1e + 138: 954a add a0,a0,s2 + 13a: 411c lw a5,0(a0) + 13c: 97ca add a5,a5,s2 + 13e: 8782 jr a5 + } else if(what == 2){ + close(open("grindir/../grindir/../b", O_CREATE|O_RDWR)); + 140: 20200593 li a1,514 + 144: 00001517 auipc a0,0x1 + 148: 06450513 addi a0,a0,100 # 11a8 + 14c: 267000ef jal bb2 + 150: 24b000ef jal b9a + 154: bf4d j 106 + } else if(what == 3){ + unlink("grindir/../a"); + 156: 00001517 auipc a0,0x1 + 15a: 04250513 addi a0,a0,66 # 1198 + 15e: 265000ef jal bc2 + 162: b755 j 106 + } else if(what == 4){ + if(chdir("grindir") != 0){ + 164: 00001517 auipc a0,0x1 + 168: fec50513 addi a0,a0,-20 # 1150 + 16c: 277000ef jal be2 + 170: ed11 bnez a0,18c + printf("grind: chdir grindir failed\n"); + exit(1); + } + unlink("../b"); + 172: 00001517 auipc a0,0x1 + 176: 04e50513 addi a0,a0,78 # 11c0 + 17a: 249000ef jal bc2 + chdir("/"); + 17e: 00001517 auipc a0,0x1 + 182: 00250513 addi a0,a0,2 # 1180 + 186: 25d000ef jal be2 + 18a: bfb5 j 106 + printf("grind: chdir grindir failed\n"); + 18c: 00001517 auipc a0,0x1 + 190: fcc50513 addi a0,a0,-52 # 1158 + 194: 607000ef jal f9a + exit(1); + 198: 4505 li a0,1 + 19a: 1d9000ef jal b72 + } else if(what == 5){ + close(fd); + 19e: 8552 mv a0,s4 + 1a0: 1fb000ef jal b9a + fd = open("/grindir/../a", O_CREATE|O_RDWR); + 1a4: 20200593 li a1,514 + 1a8: 00001517 auipc a0,0x1 + 1ac: 02050513 addi a0,a0,32 # 11c8 + 1b0: 203000ef jal bb2 + 1b4: 8a2a mv s4,a0 + 1b6: bf81 j 106 + } else if(what == 6){ + close(fd); + 1b8: 8552 mv a0,s4 + 1ba: 1e1000ef jal b9a + fd = open("/./grindir/./../b", O_CREATE|O_RDWR); + 1be: 20200593 li a1,514 + 1c2: 00001517 auipc a0,0x1 + 1c6: 01650513 addi a0,a0,22 # 11d8 + 1ca: 1e9000ef jal bb2 + 1ce: 8a2a mv s4,a0 + 1d0: bf1d j 106 + } else if(what == 7){ + write(fd, buf, sizeof(buf)); + 1d2: 3e700613 li a2,999 + 1d6: 00002597 auipc a1,0x2 + 1da: e4a58593 addi a1,a1,-438 # 2020 + 1de: 8552 mv a0,s4 + 1e0: 1b3000ef jal b92 + 1e4: b70d j 106 + } else if(what == 8){ + read(fd, buf, sizeof(buf)); + 1e6: 3e700613 li a2,999 + 1ea: 00002597 auipc a1,0x2 + 1ee: e3658593 addi a1,a1,-458 # 2020 + 1f2: 8552 mv a0,s4 + 1f4: 197000ef jal b8a + 1f8: b739 j 106 + } else if(what == 9){ + mkdir("grindir/../a"); + 1fa: 00001517 auipc a0,0x1 + 1fe: f9e50513 addi a0,a0,-98 # 1198 + 202: 1d9000ef jal bda + close(open("a/../a/./a", O_CREATE|O_RDWR)); + 206: 20200593 li a1,514 + 20a: 00001517 auipc a0,0x1 + 20e: fe650513 addi a0,a0,-26 # 11f0 + 212: 1a1000ef jal bb2 + 216: 185000ef jal b9a + unlink("a/a"); + 21a: 00001517 auipc a0,0x1 + 21e: fe650513 addi a0,a0,-26 # 1200 + 222: 1a1000ef jal bc2 + 226: b5c5 j 106 + } else if(what == 10){ + mkdir("/../b"); + 228: 00001517 auipc a0,0x1 + 22c: fe050513 addi a0,a0,-32 # 1208 + 230: 1ab000ef jal bda + close(open("grindir/../b/b", O_CREATE|O_RDWR)); + 234: 20200593 li a1,514 + 238: 00001517 auipc a0,0x1 + 23c: fd850513 addi a0,a0,-40 # 1210 + 240: 173000ef jal bb2 + 244: 157000ef jal b9a + unlink("b/b"); + 248: 00001517 auipc a0,0x1 + 24c: fd850513 addi a0,a0,-40 # 1220 + 250: 173000ef jal bc2 + 254: bd4d j 106 + } else if(what == 11){ + unlink("b"); + 256: 00001517 auipc a0,0x1 + 25a: fd250513 addi a0,a0,-46 # 1228 + 25e: 165000ef jal bc2 + link("../grindir/./../a", "../b"); + 262: 00001597 auipc a1,0x1 + 266: f5e58593 addi a1,a1,-162 # 11c0 + 26a: 00001517 auipc a0,0x1 + 26e: fc650513 addi a0,a0,-58 # 1230 + 272: 161000ef jal bd2 + 276: bd41 j 106 + } else if(what == 12){ + unlink("../grindir/../a"); + 278: 00001517 auipc a0,0x1 + 27c: fd050513 addi a0,a0,-48 # 1248 + 280: 143000ef jal bc2 + link(".././b", "/grindir/../a"); + 284: 00001597 auipc a1,0x1 + 288: f4458593 addi a1,a1,-188 # 11c8 + 28c: 00001517 auipc a0,0x1 + 290: fcc50513 addi a0,a0,-52 # 1258 + 294: 13f000ef jal bd2 + 298: b5bd j 106 + } else if(what == 13){ + int pid = fork(); + 29a: 0d1000ef jal b6a + if(pid == 0){ + 29e: c519 beqz a0,2ac + exit(0); + } else if(pid < 0){ + 2a0: 00054863 bltz a0,2b0 + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 2a4: 4501 li a0,0 + 2a6: 0d5000ef jal b7a + 2aa: bdb1 j 106 + exit(0); + 2ac: 0c7000ef jal b72 + printf("grind: fork failed\n"); + 2b0: 00001517 auipc a0,0x1 + 2b4: fb050513 addi a0,a0,-80 # 1260 + 2b8: 4e3000ef jal f9a + exit(1); + 2bc: 4505 li a0,1 + 2be: 0b5000ef jal b72 + } else if(what == 14){ + int pid = fork(); + 2c2: 0a9000ef jal b6a + if(pid == 0){ + 2c6: c519 beqz a0,2d4 + fork(); + fork(); + exit(0); + } else if(pid < 0){ + 2c8: 00054d63 bltz a0,2e2 + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 2cc: 4501 li a0,0 + 2ce: 0ad000ef jal b7a + 2d2: bd15 j 106 + fork(); + 2d4: 097000ef jal b6a + fork(); + 2d8: 093000ef jal b6a + exit(0); + 2dc: 4501 li a0,0 + 2de: 095000ef jal b72 + printf("grind: fork failed\n"); + 2e2: 00001517 auipc a0,0x1 + 2e6: f7e50513 addi a0,a0,-130 # 1260 + 2ea: 4b1000ef jal f9a + exit(1); + 2ee: 4505 li a0,1 + 2f0: 083000ef jal b72 + } else if(what == 15){ + sbrk(6011); + 2f4: 6505 lui a0,0x1 + 2f6: 77b50513 addi a0,a0,1915 # 177b + 2fa: 045000ef jal b3e + 2fe: b521 j 106 + } else if(what == 16){ + if(sbrk(0) > break0) + 300: 4501 li a0,0 + 302: 03d000ef jal b3e + 306: e0aaf0e3 bgeu s5,a0,106 + sbrk(-(sbrk(0) - break0)); + 30a: 4501 li a0,0 + 30c: 033000ef jal b3e + 310: 40aa853b subw a0,s5,a0 + 314: 02b000ef jal b3e + 318: b3fd j 106 + } else if(what == 17){ + int pid = fork(); + 31a: 051000ef jal b6a + 31e: 8b2a mv s6,a0 + if(pid == 0){ + 320: c10d beqz a0,342 + close(open("a", O_CREATE|O_RDWR)); + exit(0); + } else if(pid < 0){ + 322: 02054d63 bltz a0,35c + printf("grind: fork failed\n"); + exit(1); + } + if(chdir("../grindir/..") != 0){ + 326: 00001517 auipc a0,0x1 + 32a: f5a50513 addi a0,a0,-166 # 1280 + 32e: 0b5000ef jal be2 + 332: ed15 bnez a0,36e + printf("grind: chdir failed\n"); + exit(1); + } + kill(pid); + 334: 855a mv a0,s6 + 336: 06d000ef jal ba2 + wait(0); + 33a: 4501 li a0,0 + 33c: 03f000ef jal b7a + 340: b3d9 j 106 + close(open("a", O_CREATE|O_RDWR)); + 342: 20200593 li a1,514 + 346: 00001517 auipc a0,0x1 + 34a: f3250513 addi a0,a0,-206 # 1278 + 34e: 065000ef jal bb2 + 352: 049000ef jal b9a + exit(0); + 356: 4501 li a0,0 + 358: 01b000ef jal b72 + printf("grind: fork failed\n"); + 35c: 00001517 auipc a0,0x1 + 360: f0450513 addi a0,a0,-252 # 1260 + 364: 437000ef jal f9a + exit(1); + 368: 4505 li a0,1 + 36a: 009000ef jal b72 + printf("grind: chdir failed\n"); + 36e: 00001517 auipc a0,0x1 + 372: f2250513 addi a0,a0,-222 # 1290 + 376: 425000ef jal f9a + exit(1); + 37a: 4505 li a0,1 + 37c: 7f6000ef jal b72 + } else if(what == 18){ + int pid = fork(); + 380: 7ea000ef jal b6a + if(pid == 0){ + 384: c519 beqz a0,392 + kill(getpid()); + exit(0); + } else if(pid < 0){ + 386: 00054d63 bltz a0,3a0 + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 38a: 4501 li a0,0 + 38c: 7ee000ef jal b7a + 390: bb9d j 106 + kill(getpid()); + 392: 061000ef jal bf2 + 396: 00d000ef jal ba2 + exit(0); + 39a: 4501 li a0,0 + 39c: 7d6000ef jal b72 + printf("grind: fork failed\n"); + 3a0: 00001517 auipc a0,0x1 + 3a4: ec050513 addi a0,a0,-320 # 1260 + 3a8: 3f3000ef jal f9a + exit(1); + 3ac: 4505 li a0,1 + 3ae: 7c4000ef jal b72 + } else if(what == 19){ + int fds[2]; + if(pipe(fds) < 0){ + 3b2: fa840513 addi a0,s0,-88 + 3b6: 7cc000ef jal b82 + 3ba: 02054363 bltz a0,3e0 + printf("grind: pipe failed\n"); + exit(1); + } + int pid = fork(); + 3be: 7ac000ef jal b6a + if(pid == 0){ + 3c2: c905 beqz a0,3f2 + 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){ + 3c4: 08054263 bltz a0,448 + printf("grind: fork failed\n"); + exit(1); + } + close(fds[0]); + 3c8: fa842503 lw a0,-88(s0) + 3cc: 7ce000ef jal b9a + close(fds[1]); + 3d0: fac42503 lw a0,-84(s0) + 3d4: 7c6000ef jal b9a + wait(0); + 3d8: 4501 li a0,0 + 3da: 7a0000ef jal b7a + 3de: b325 j 106 + printf("grind: pipe failed\n"); + 3e0: 00001517 auipc a0,0x1 + 3e4: ec850513 addi a0,a0,-312 # 12a8 + 3e8: 3b3000ef jal f9a + exit(1); + 3ec: 4505 li a0,1 + 3ee: 784000ef jal b72 + fork(); + 3f2: 778000ef jal b6a + fork(); + 3f6: 774000ef jal b6a + if(write(fds[1], "x", 1) != 1) + 3fa: 4605 li a2,1 + 3fc: 00001597 auipc a1,0x1 + 400: ec458593 addi a1,a1,-316 # 12c0 + 404: fac42503 lw a0,-84(s0) + 408: 78a000ef jal b92 + 40c: 4785 li a5,1 + 40e: 00f51f63 bne a0,a5,42c + if(read(fds[0], &c, 1) != 1) + 412: 4605 li a2,1 + 414: fa040593 addi a1,s0,-96 + 418: fa842503 lw a0,-88(s0) + 41c: 76e000ef jal b8a + 420: 4785 li a5,1 + 422: 00f51c63 bne a0,a5,43a + exit(0); + 426: 4501 li a0,0 + 428: 74a000ef jal b72 + printf("grind: pipe write failed\n"); + 42c: 00001517 auipc a0,0x1 + 430: e9c50513 addi a0,a0,-356 # 12c8 + 434: 367000ef jal f9a + 438: bfe9 j 412 + printf("grind: pipe read failed\n"); + 43a: 00001517 auipc a0,0x1 + 43e: eae50513 addi a0,a0,-338 # 12e8 + 442: 359000ef jal f9a + 446: b7c5 j 426 + printf("grind: fork failed\n"); + 448: 00001517 auipc a0,0x1 + 44c: e1850513 addi a0,a0,-488 # 1260 + 450: 34b000ef jal f9a + exit(1); + 454: 4505 li a0,1 + 456: 71c000ef jal b72 + } else if(what == 20){ + int pid = fork(); + 45a: 710000ef jal b6a + if(pid == 0){ + 45e: c519 beqz a0,46c + chdir("a"); + unlink("../a"); + fd = open("x", O_CREATE|O_RDWR); + unlink("x"); + exit(0); + } else if(pid < 0){ + 460: 04054f63 bltz a0,4be + printf("grind: fork failed\n"); + exit(1); + } + wait(0); + 464: 4501 li a0,0 + 466: 714000ef jal b7a + 46a: b971 j 106 + unlink("a"); + 46c: 00001517 auipc a0,0x1 + 470: e0c50513 addi a0,a0,-500 # 1278 + 474: 74e000ef jal bc2 + mkdir("a"); + 478: 00001517 auipc a0,0x1 + 47c: e0050513 addi a0,a0,-512 # 1278 + 480: 75a000ef jal bda + chdir("a"); + 484: 00001517 auipc a0,0x1 + 488: df450513 addi a0,a0,-524 # 1278 + 48c: 756000ef jal be2 + unlink("../a"); + 490: 00001517 auipc a0,0x1 + 494: e7850513 addi a0,a0,-392 # 1308 + 498: 72a000ef jal bc2 + fd = open("x", O_CREATE|O_RDWR); + 49c: 20200593 li a1,514 + 4a0: 00001517 auipc a0,0x1 + 4a4: e2050513 addi a0,a0,-480 # 12c0 + 4a8: 70a000ef jal bb2 + unlink("x"); + 4ac: 00001517 auipc a0,0x1 + 4b0: e1450513 addi a0,a0,-492 # 12c0 + 4b4: 70e000ef jal bc2 + exit(0); + 4b8: 4501 li a0,0 + 4ba: 6b8000ef jal b72 + printf("grind: fork failed\n"); + 4be: 00001517 auipc a0,0x1 + 4c2: da250513 addi a0,a0,-606 # 1260 + 4c6: 2d5000ef jal f9a + exit(1); + 4ca: 4505 li a0,1 + 4cc: 6a6000ef jal b72 + } else if(what == 21){ + unlink("c"); + 4d0: 00001517 auipc a0,0x1 + 4d4: e4050513 addi a0,a0,-448 # 1310 + 4d8: 6ea000ef jal bc2 + // should always succeed. check that there are free i-nodes, + // file descriptors, blocks. + int fd1 = open("c", O_CREATE|O_RDWR); + 4dc: 20200593 li a1,514 + 4e0: 00001517 auipc a0,0x1 + 4e4: e3050513 addi a0,a0,-464 # 1310 + 4e8: 6ca000ef jal bb2 + 4ec: 8b2a mv s6,a0 + if(fd1 < 0){ + 4ee: 04054763 bltz a0,53c + printf("grind: create c failed\n"); + exit(1); + } + if(write(fd1, "x", 1) != 1){ + 4f2: 4605 li a2,1 + 4f4: 00001597 auipc a1,0x1 + 4f8: dcc58593 addi a1,a1,-564 # 12c0 + 4fc: 696000ef jal b92 + 500: 4785 li a5,1 + 502: 04f51663 bne a0,a5,54e + printf("grind: write c failed\n"); + exit(1); + } + struct stat st; + if(fstat(fd1, &st) != 0){ + 506: fa840593 addi a1,s0,-88 + 50a: 855a mv a0,s6 + 50c: 6be000ef jal bca + 510: e921 bnez a0,560 + printf("grind: fstat failed\n"); + exit(1); + } + if(st.size != 1){ + 512: fb843583 ld a1,-72(s0) + 516: 4785 li a5,1 + 518: 04f59d63 bne a1,a5,572 + printf("grind: fstat reports wrong size %d\n", (int)st.size); + exit(1); + } + if(st.ino > 200){ + 51c: fac42583 lw a1,-84(s0) + 520: 0c800793 li a5,200 + 524: 06b7e163 bltu a5,a1,586 + printf("grind: fstat reports crazy i-number %d\n", st.ino); + exit(1); + } + close(fd1); + 528: 855a mv a0,s6 + 52a: 670000ef jal b9a + unlink("c"); + 52e: 00001517 auipc a0,0x1 + 532: de250513 addi a0,a0,-542 # 1310 + 536: 68c000ef jal bc2 + 53a: b6f1 j 106 + printf("grind: create c failed\n"); + 53c: 00001517 auipc a0,0x1 + 540: ddc50513 addi a0,a0,-548 # 1318 + 544: 257000ef jal f9a + exit(1); + 548: 4505 li a0,1 + 54a: 628000ef jal b72 + printf("grind: write c failed\n"); + 54e: 00001517 auipc a0,0x1 + 552: de250513 addi a0,a0,-542 # 1330 + 556: 245000ef jal f9a + exit(1); + 55a: 4505 li a0,1 + 55c: 616000ef jal b72 + printf("grind: fstat failed\n"); + 560: 00001517 auipc a0,0x1 + 564: de850513 addi a0,a0,-536 # 1348 + 568: 233000ef jal f9a + exit(1); + 56c: 4505 li a0,1 + 56e: 604000ef jal b72 + printf("grind: fstat reports wrong size %d\n", (int)st.size); + 572: 2581 sext.w a1,a1 + 574: 00001517 auipc a0,0x1 + 578: dec50513 addi a0,a0,-532 # 1360 + 57c: 21f000ef jal f9a + exit(1); + 580: 4505 li a0,1 + 582: 5f0000ef jal b72 + printf("grind: fstat reports crazy i-number %d\n", st.ino); + 586: 00001517 auipc a0,0x1 + 58a: e0250513 addi a0,a0,-510 # 1388 + 58e: 20d000ef jal f9a + exit(1); + 592: 4505 li a0,1 + 594: 5de000ef jal b72 + } else if(what == 22){ + // echo hi | cat + int aa[2], bb[2]; + if(pipe(aa) < 0){ + 598: f9840513 addi a0,s0,-104 + 59c: 5e6000ef jal b82 + 5a0: 0c054263 bltz a0,664 + fprintf(2, "grind: pipe failed\n"); + exit(1); + } + if(pipe(bb) < 0){ + 5a4: fa040513 addi a0,s0,-96 + 5a8: 5da000ef jal b82 + 5ac: 0c054663 bltz a0,678 + fprintf(2, "grind: pipe failed\n"); + exit(1); + } + int pid1 = fork(); + 5b0: 5ba000ef jal b6a + if(pid1 == 0){ + 5b4: 0c050c63 beqz a0,68c + close(aa[1]); + char *args[3] = { "echo", "hi", 0 }; + exec("grindir/../echo", args); + fprintf(2, "grind: echo: not found\n"); + exit(2); + } else if(pid1 < 0){ + 5b8: 14054e63 bltz a0,714 + fprintf(2, "grind: fork failed\n"); + exit(3); + } + int pid2 = fork(); + 5bc: 5ae000ef jal b6a + if(pid2 == 0){ + 5c0: 16050463 beqz a0,728 + close(bb[1]); + char *args[2] = { "cat", 0 }; + exec("/cat", args); + fprintf(2, "grind: cat: not found\n"); + exit(6); + } else if(pid2 < 0){ + 5c4: 20054263 bltz a0,7c8 + fprintf(2, "grind: fork failed\n"); + exit(7); + } + close(aa[0]); + 5c8: f9842503 lw a0,-104(s0) + 5cc: 5ce000ef jal b9a + close(aa[1]); + 5d0: f9c42503 lw a0,-100(s0) + 5d4: 5c6000ef jal b9a + close(bb[1]); + 5d8: fa442503 lw a0,-92(s0) + 5dc: 5be000ef jal b9a + char buf[4] = { 0, 0, 0, 0 }; + 5e0: f8042823 sw zero,-112(s0) + read(bb[0], buf+0, 1); + 5e4: 4605 li a2,1 + 5e6: f9040593 addi a1,s0,-112 + 5ea: fa042503 lw a0,-96(s0) + 5ee: 59c000ef jal b8a + read(bb[0], buf+1, 1); + 5f2: 4605 li a2,1 + 5f4: f9140593 addi a1,s0,-111 + 5f8: fa042503 lw a0,-96(s0) + 5fc: 58e000ef jal b8a + read(bb[0], buf+2, 1); + 600: 4605 li a2,1 + 602: f9240593 addi a1,s0,-110 + 606: fa042503 lw a0,-96(s0) + 60a: 580000ef jal b8a + close(bb[0]); + 60e: fa042503 lw a0,-96(s0) + 612: 588000ef jal b9a + int st1, st2; + wait(&st1); + 616: f9440513 addi a0,s0,-108 + 61a: 560000ef jal b7a + wait(&st2); + 61e: fa840513 addi a0,s0,-88 + 622: 558000ef jal b7a + if(st1 != 0 || st2 != 0 || strcmp(buf, "hi\n") != 0){ + 626: f9442783 lw a5,-108(s0) + 62a: fa842703 lw a4,-88(s0) + 62e: 8fd9 or a5,a5,a4 + 630: eb99 bnez a5,646 + 632: 00001597 auipc a1,0x1 + 636: df658593 addi a1,a1,-522 # 1428 + 63a: f9040513 addi a0,s0,-112 + 63e: 2cc000ef jal 90a + 642: ac0502e3 beqz a0,106 + printf("grind: exec pipeline failed %d %d \"%s\"\n", st1, st2, buf); + 646: f9040693 addi a3,s0,-112 + 64a: fa842603 lw a2,-88(s0) + 64e: f9442583 lw a1,-108(s0) + 652: 00001517 auipc a0,0x1 + 656: dde50513 addi a0,a0,-546 # 1430 + 65a: 141000ef jal f9a + exit(1); + 65e: 4505 li a0,1 + 660: 512000ef jal b72 + fprintf(2, "grind: pipe failed\n"); + 664: 00001597 auipc a1,0x1 + 668: c4458593 addi a1,a1,-956 # 12a8 + 66c: 4509 li a0,2 + 66e: 103000ef jal f70 + exit(1); + 672: 4505 li a0,1 + 674: 4fe000ef jal b72 + fprintf(2, "grind: pipe failed\n"); + 678: 00001597 auipc a1,0x1 + 67c: c3058593 addi a1,a1,-976 # 12a8 + 680: 4509 li a0,2 + 682: 0ef000ef jal f70 + exit(1); + 686: 4505 li a0,1 + 688: 4ea000ef jal b72 + close(bb[0]); + 68c: fa042503 lw a0,-96(s0) + 690: 50a000ef jal b9a + close(bb[1]); + 694: fa442503 lw a0,-92(s0) + 698: 502000ef jal b9a + close(aa[0]); + 69c: f9842503 lw a0,-104(s0) + 6a0: 4fa000ef jal b9a + close(1); + 6a4: 4505 li a0,1 + 6a6: 4f4000ef jal b9a + if(dup(aa[1]) != 1){ + 6aa: f9c42503 lw a0,-100(s0) + 6ae: 53c000ef jal bea + 6b2: 4785 li a5,1 + 6b4: 00f50c63 beq a0,a5,6cc + fprintf(2, "grind: dup failed\n"); + 6b8: 00001597 auipc a1,0x1 + 6bc: cf858593 addi a1,a1,-776 # 13b0 + 6c0: 4509 li a0,2 + 6c2: 0af000ef jal f70 + exit(1); + 6c6: 4505 li a0,1 + 6c8: 4aa000ef jal b72 + close(aa[1]); + 6cc: f9c42503 lw a0,-100(s0) + 6d0: 4ca000ef jal b9a + char *args[3] = { "echo", "hi", 0 }; + 6d4: 00001797 auipc a5,0x1 + 6d8: cf478793 addi a5,a5,-780 # 13c8 + 6dc: faf43423 sd a5,-88(s0) + 6e0: 00001797 auipc a5,0x1 + 6e4: cf078793 addi a5,a5,-784 # 13d0 + 6e8: faf43823 sd a5,-80(s0) + 6ec: fa043c23 sd zero,-72(s0) + exec("grindir/../echo", args); + 6f0: fa840593 addi a1,s0,-88 + 6f4: 00001517 auipc a0,0x1 + 6f8: ce450513 addi a0,a0,-796 # 13d8 + 6fc: 4ae000ef jal baa + fprintf(2, "grind: echo: not found\n"); + 700: 00001597 auipc a1,0x1 + 704: ce858593 addi a1,a1,-792 # 13e8 + 708: 4509 li a0,2 + 70a: 067000ef jal f70 + exit(2); + 70e: 4509 li a0,2 + 710: 462000ef jal b72 + fprintf(2, "grind: fork failed\n"); + 714: 00001597 auipc a1,0x1 + 718: b4c58593 addi a1,a1,-1204 # 1260 + 71c: 4509 li a0,2 + 71e: 053000ef jal f70 + exit(3); + 722: 450d li a0,3 + 724: 44e000ef jal b72 + close(aa[1]); + 728: f9c42503 lw a0,-100(s0) + 72c: 46e000ef jal b9a + close(bb[0]); + 730: fa042503 lw a0,-96(s0) + 734: 466000ef jal b9a + close(0); + 738: 4501 li a0,0 + 73a: 460000ef jal b9a + if(dup(aa[0]) != 0){ + 73e: f9842503 lw a0,-104(s0) + 742: 4a8000ef jal bea + 746: c919 beqz a0,75c + fprintf(2, "grind: dup failed\n"); + 748: 00001597 auipc a1,0x1 + 74c: c6858593 addi a1,a1,-920 # 13b0 + 750: 4509 li a0,2 + 752: 01f000ef jal f70 + exit(4); + 756: 4511 li a0,4 + 758: 41a000ef jal b72 + close(aa[0]); + 75c: f9842503 lw a0,-104(s0) + 760: 43a000ef jal b9a + close(1); + 764: 4505 li a0,1 + 766: 434000ef jal b9a + if(dup(bb[1]) != 1){ + 76a: fa442503 lw a0,-92(s0) + 76e: 47c000ef jal bea + 772: 4785 li a5,1 + 774: 00f50c63 beq a0,a5,78c + fprintf(2, "grind: dup failed\n"); + 778: 00001597 auipc a1,0x1 + 77c: c3858593 addi a1,a1,-968 # 13b0 + 780: 4509 li a0,2 + 782: 7ee000ef jal f70 + exit(5); + 786: 4515 li a0,5 + 788: 3ea000ef jal b72 + close(bb[1]); + 78c: fa442503 lw a0,-92(s0) + 790: 40a000ef jal b9a + char *args[2] = { "cat", 0 }; + 794: 00001797 auipc a5,0x1 + 798: c6c78793 addi a5,a5,-916 # 1400 + 79c: faf43423 sd a5,-88(s0) + 7a0: fa043823 sd zero,-80(s0) + exec("/cat", args); + 7a4: fa840593 addi a1,s0,-88 + 7a8: 00001517 auipc a0,0x1 + 7ac: c6050513 addi a0,a0,-928 # 1408 + 7b0: 3fa000ef jal baa + fprintf(2, "grind: cat: not found\n"); + 7b4: 00001597 auipc a1,0x1 + 7b8: c5c58593 addi a1,a1,-932 # 1410 + 7bc: 4509 li a0,2 + 7be: 7b2000ef jal f70 + exit(6); + 7c2: 4519 li a0,6 + 7c4: 3ae000ef jal b72 + fprintf(2, "grind: fork failed\n"); + 7c8: 00001597 auipc a1,0x1 + 7cc: a9858593 addi a1,a1,-1384 # 1260 + 7d0: 4509 li a0,2 + 7d2: 79e000ef jal f70 + exit(7); + 7d6: 451d li a0,7 + 7d8: 39a000ef jal b72 + +00000000000007dc : + } +} + +void +iter() +{ + 7dc: 7179 addi sp,sp,-48 + 7de: f406 sd ra,40(sp) + 7e0: f022 sd s0,32(sp) + 7e2: 1800 addi s0,sp,48 + unlink("a"); + 7e4: 00001517 auipc a0,0x1 + 7e8: a9450513 addi a0,a0,-1388 # 1278 + 7ec: 3d6000ef jal bc2 + unlink("b"); + 7f0: 00001517 auipc a0,0x1 + 7f4: a3850513 addi a0,a0,-1480 # 1228 + 7f8: 3ca000ef jal bc2 + + int pid1 = fork(); + 7fc: 36e000ef jal b6a + if(pid1 < 0){ + 800: 02054163 bltz a0,822 + 804: ec26 sd s1,24(sp) + 806: 84aa mv s1,a0 + printf("grind: fork failed\n"); + exit(1); + } + if(pid1 == 0){ + 808: e905 bnez a0,838 + 80a: e84a sd s2,16(sp) + rand_next ^= 31; + 80c: 00001717 auipc a4,0x1 + 810: 7f470713 addi a4,a4,2036 # 2000 + 814: 631c ld a5,0(a4) + 816: 01f7c793 xori a5,a5,31 + 81a: e31c sd a5,0(a4) + go(0); + 81c: 4501 li a0,0 + 81e: 857ff0ef jal 74 + 822: ec26 sd s1,24(sp) + 824: e84a sd s2,16(sp) + printf("grind: fork failed\n"); + 826: 00001517 auipc a0,0x1 + 82a: a3a50513 addi a0,a0,-1478 # 1260 + 82e: 76c000ef jal f9a + exit(1); + 832: 4505 li a0,1 + 834: 33e000ef jal b72 + 838: e84a sd s2,16(sp) + exit(0); + } + + int pid2 = fork(); + 83a: 330000ef jal b6a + 83e: 892a mv s2,a0 + if(pid2 < 0){ + 840: 02054063 bltz a0,860 + printf("grind: fork failed\n"); + exit(1); + } + if(pid2 == 0){ + 844: e51d bnez a0,872 + rand_next ^= 7177; + 846: 00001697 auipc a3,0x1 + 84a: 7ba68693 addi a3,a3,1978 # 2000 + 84e: 629c ld a5,0(a3) + 850: 6709 lui a4,0x2 + 852: c0970713 addi a4,a4,-1015 # 1c09 + 856: 8fb9 xor a5,a5,a4 + 858: e29c sd a5,0(a3) + go(1); + 85a: 4505 li a0,1 + 85c: 819ff0ef jal 74 + printf("grind: fork failed\n"); + 860: 00001517 auipc a0,0x1 + 864: a0050513 addi a0,a0,-1536 # 1260 + 868: 732000ef jal f9a + exit(1); + 86c: 4505 li a0,1 + 86e: 304000ef jal b72 + exit(0); + } + + int st1 = -1; + 872: 57fd li a5,-1 + 874: fcf42e23 sw a5,-36(s0) + wait(&st1); + 878: fdc40513 addi a0,s0,-36 + 87c: 2fe000ef jal b7a + if(st1 != 0){ + 880: fdc42783 lw a5,-36(s0) + 884: eb99 bnez a5,89a + kill(pid1); + kill(pid2); + } + int st2 = -1; + 886: 57fd li a5,-1 + 888: fcf42c23 sw a5,-40(s0) + wait(&st2); + 88c: fd840513 addi a0,s0,-40 + 890: 2ea000ef jal b7a + + exit(0); + 894: 4501 li a0,0 + 896: 2dc000ef jal b72 + kill(pid1); + 89a: 8526 mv a0,s1 + 89c: 306000ef jal ba2 + kill(pid2); + 8a0: 854a mv a0,s2 + 8a2: 300000ef jal ba2 + 8a6: b7c5 j 886 + +00000000000008a8
: +} + +int +main() +{ + 8a8: 1101 addi sp,sp,-32 + 8aa: ec06 sd ra,24(sp) + 8ac: e822 sd s0,16(sp) + 8ae: e426 sd s1,8(sp) + 8b0: 1000 addi s0,sp,32 + } + if(pid > 0){ + wait(0); + } + pause(20); + rand_next += 1; + 8b2: 00001497 auipc s1,0x1 + 8b6: 74e48493 addi s1,s1,1870 # 2000 + 8ba: a809 j 8cc + iter(); + 8bc: f21ff0ef jal 7dc + pause(20); + 8c0: 4551 li a0,20 + 8c2: 340000ef jal c02 + rand_next += 1; + 8c6: 609c ld a5,0(s1) + 8c8: 0785 addi a5,a5,1 + 8ca: e09c sd a5,0(s1) + int pid = fork(); + 8cc: 29e000ef jal b6a + if(pid == 0){ + 8d0: d575 beqz a0,8bc + if(pid > 0){ + 8d2: fea057e3 blez a0,8c0 + wait(0); + 8d6: 4501 li a0,0 + 8d8: 2a2000ef jal b7a + 8dc: b7d5 j 8c0 + +00000000000008de : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 8de: 1141 addi sp,sp,-16 + 8e0: e406 sd ra,8(sp) + 8e2: e022 sd s0,0(sp) + 8e4: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 8e6: fc3ff0ef jal 8a8
+ exit(r); + 8ea: 288000ef jal b72 + +00000000000008ee : +} + +char* +strcpy(char *s, const char *t) +{ + 8ee: 1141 addi sp,sp,-16 + 8f0: e422 sd s0,8(sp) + 8f2: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 8f4: 87aa mv a5,a0 + 8f6: 0585 addi a1,a1,1 + 8f8: 0785 addi a5,a5,1 + 8fa: fff5c703 lbu a4,-1(a1) + 8fe: fee78fa3 sb a4,-1(a5) + 902: fb75 bnez a4,8f6 + ; + return os; +} + 904: 6422 ld s0,8(sp) + 906: 0141 addi sp,sp,16 + 908: 8082 ret + +000000000000090a : + +int +strcmp(const char *p, const char *q) +{ + 90a: 1141 addi sp,sp,-16 + 90c: e422 sd s0,8(sp) + 90e: 0800 addi s0,sp,16 + while(*p && *p == *q) + 910: 00054783 lbu a5,0(a0) + 914: cb91 beqz a5,928 + 916: 0005c703 lbu a4,0(a1) + 91a: 00f71763 bne a4,a5,928 + p++, q++; + 91e: 0505 addi a0,a0,1 + 920: 0585 addi a1,a1,1 + while(*p && *p == *q) + 922: 00054783 lbu a5,0(a0) + 926: fbe5 bnez a5,916 + return (uchar)*p - (uchar)*q; + 928: 0005c503 lbu a0,0(a1) +} + 92c: 40a7853b subw a0,a5,a0 + 930: 6422 ld s0,8(sp) + 932: 0141 addi sp,sp,16 + 934: 8082 ret + +0000000000000936 : + +uint +strlen(const char *s) +{ + 936: 1141 addi sp,sp,-16 + 938: e422 sd s0,8(sp) + 93a: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 93c: 00054783 lbu a5,0(a0) + 940: cf91 beqz a5,95c + 942: 0505 addi a0,a0,1 + 944: 87aa mv a5,a0 + 946: 86be mv a3,a5 + 948: 0785 addi a5,a5,1 + 94a: fff7c703 lbu a4,-1(a5) + 94e: ff65 bnez a4,946 + 950: 40a6853b subw a0,a3,a0 + 954: 2505 addiw a0,a0,1 + ; + return n; +} + 956: 6422 ld s0,8(sp) + 958: 0141 addi sp,sp,16 + 95a: 8082 ret + for(n = 0; s[n]; n++) + 95c: 4501 li a0,0 + 95e: bfe5 j 956 + +0000000000000960 : + +void* +memset(void *dst, int c, uint n) +{ + 960: 1141 addi sp,sp,-16 + 962: e422 sd s0,8(sp) + 964: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 966: ca19 beqz a2,97c + 968: 87aa mv a5,a0 + 96a: 1602 slli a2,a2,0x20 + 96c: 9201 srli a2,a2,0x20 + 96e: 00a60733 add a4,a2,a0 + cdst[i] = c; + 972: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 976: 0785 addi a5,a5,1 + 978: fee79de3 bne a5,a4,972 + } + return dst; +} + 97c: 6422 ld s0,8(sp) + 97e: 0141 addi sp,sp,16 + 980: 8082 ret + +0000000000000982 : + +char* +strchr(const char *s, char c) +{ + 982: 1141 addi sp,sp,-16 + 984: e422 sd s0,8(sp) + 986: 0800 addi s0,sp,16 + for(; *s; s++) + 988: 00054783 lbu a5,0(a0) + 98c: cb99 beqz a5,9a2 + if(*s == c) + 98e: 00f58763 beq a1,a5,99c + for(; *s; s++) + 992: 0505 addi a0,a0,1 + 994: 00054783 lbu a5,0(a0) + 998: fbfd bnez a5,98e + return (char*)s; + return 0; + 99a: 4501 li a0,0 +} + 99c: 6422 ld s0,8(sp) + 99e: 0141 addi sp,sp,16 + 9a0: 8082 ret + return 0; + 9a2: 4501 li a0,0 + 9a4: bfe5 j 99c + +00000000000009a6 : + +char* +gets(char *buf, int max) +{ + 9a6: 711d addi sp,sp,-96 + 9a8: ec86 sd ra,88(sp) + 9aa: e8a2 sd s0,80(sp) + 9ac: e4a6 sd s1,72(sp) + 9ae: e0ca sd s2,64(sp) + 9b0: fc4e sd s3,56(sp) + 9b2: f852 sd s4,48(sp) + 9b4: f456 sd s5,40(sp) + 9b6: f05a sd s6,32(sp) + 9b8: ec5e sd s7,24(sp) + 9ba: 1080 addi s0,sp,96 + 9bc: 8baa mv s7,a0 + 9be: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 9c0: 892a mv s2,a0 + 9c2: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 9c4: 4aa9 li s5,10 + 9c6: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 9c8: 89a6 mv s3,s1 + 9ca: 2485 addiw s1,s1,1 + 9cc: 0344d663 bge s1,s4,9f8 + cc = read(0, &c, 1); + 9d0: 4605 li a2,1 + 9d2: faf40593 addi a1,s0,-81 + 9d6: 4501 li a0,0 + 9d8: 1b2000ef jal b8a + if(cc < 1) + 9dc: 00a05e63 blez a0,9f8 + buf[i++] = c; + 9e0: faf44783 lbu a5,-81(s0) + 9e4: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 9e8: 01578763 beq a5,s5,9f6 + 9ec: 0905 addi s2,s2,1 + 9ee: fd679de3 bne a5,s6,9c8 + buf[i++] = c; + 9f2: 89a6 mv s3,s1 + 9f4: a011 j 9f8 + 9f6: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 9f8: 99de add s3,s3,s7 + 9fa: 00098023 sb zero,0(s3) + return buf; +} + 9fe: 855e mv a0,s7 + a00: 60e6 ld ra,88(sp) + a02: 6446 ld s0,80(sp) + a04: 64a6 ld s1,72(sp) + a06: 6906 ld s2,64(sp) + a08: 79e2 ld s3,56(sp) + a0a: 7a42 ld s4,48(sp) + a0c: 7aa2 ld s5,40(sp) + a0e: 7b02 ld s6,32(sp) + a10: 6be2 ld s7,24(sp) + a12: 6125 addi sp,sp,96 + a14: 8082 ret + +0000000000000a16 : + +int +stat(const char *n, struct stat *st) +{ + a16: 1101 addi sp,sp,-32 + a18: ec06 sd ra,24(sp) + a1a: e822 sd s0,16(sp) + a1c: e04a sd s2,0(sp) + a1e: 1000 addi s0,sp,32 + a20: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + a22: 4581 li a1,0 + a24: 18e000ef jal bb2 + if(fd < 0) + a28: 02054263 bltz a0,a4c + a2c: e426 sd s1,8(sp) + a2e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + a30: 85ca mv a1,s2 + a32: 198000ef jal bca + a36: 892a mv s2,a0 + close(fd); + a38: 8526 mv a0,s1 + a3a: 160000ef jal b9a + return r; + a3e: 64a2 ld s1,8(sp) +} + a40: 854a mv a0,s2 + a42: 60e2 ld ra,24(sp) + a44: 6442 ld s0,16(sp) + a46: 6902 ld s2,0(sp) + a48: 6105 addi sp,sp,32 + a4a: 8082 ret + return -1; + a4c: 597d li s2,-1 + a4e: bfcd j a40 + +0000000000000a50 : + +int +atoi(const char *s) +{ + a50: 1141 addi sp,sp,-16 + a52: e422 sd s0,8(sp) + a54: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + a56: 00054683 lbu a3,0(a0) + a5a: fd06879b addiw a5,a3,-48 + a5e: 0ff7f793 zext.b a5,a5 + a62: 4625 li a2,9 + a64: 02f66863 bltu a2,a5,a94 + a68: 872a mv a4,a0 + n = 0; + a6a: 4501 li a0,0 + n = n*10 + *s++ - '0'; + a6c: 0705 addi a4,a4,1 + a6e: 0025179b slliw a5,a0,0x2 + a72: 9fa9 addw a5,a5,a0 + a74: 0017979b slliw a5,a5,0x1 + a78: 9fb5 addw a5,a5,a3 + a7a: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + a7e: 00074683 lbu a3,0(a4) + a82: fd06879b addiw a5,a3,-48 + a86: 0ff7f793 zext.b a5,a5 + a8a: fef671e3 bgeu a2,a5,a6c + return n; +} + a8e: 6422 ld s0,8(sp) + a90: 0141 addi sp,sp,16 + a92: 8082 ret + n = 0; + a94: 4501 li a0,0 + a96: bfe5 j a8e + +0000000000000a98 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + a98: 1141 addi sp,sp,-16 + a9a: e422 sd s0,8(sp) + a9c: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + a9e: 02b57463 bgeu a0,a1,ac6 + while(n-- > 0) + aa2: 00c05f63 blez a2,ac0 + aa6: 1602 slli a2,a2,0x20 + aa8: 9201 srli a2,a2,0x20 + aaa: 00c507b3 add a5,a0,a2 + dst = vdst; + aae: 872a mv a4,a0 + *dst++ = *src++; + ab0: 0585 addi a1,a1,1 + ab2: 0705 addi a4,a4,1 + ab4: fff5c683 lbu a3,-1(a1) + ab8: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + abc: fef71ae3 bne a4,a5,ab0 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + ac0: 6422 ld s0,8(sp) + ac2: 0141 addi sp,sp,16 + ac4: 8082 ret + dst += n; + ac6: 00c50733 add a4,a0,a2 + src += n; + aca: 95b2 add a1,a1,a2 + while(n-- > 0) + acc: fec05ae3 blez a2,ac0 + ad0: fff6079b addiw a5,a2,-1 + ad4: 1782 slli a5,a5,0x20 + ad6: 9381 srli a5,a5,0x20 + ad8: fff7c793 not a5,a5 + adc: 97ba add a5,a5,a4 + *--dst = *--src; + ade: 15fd addi a1,a1,-1 + ae0: 177d addi a4,a4,-1 + ae2: 0005c683 lbu a3,0(a1) + ae6: 00d70023 sb a3,0(a4) + while(n-- > 0) + aea: fee79ae3 bne a5,a4,ade + aee: bfc9 j ac0 + +0000000000000af0 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + af0: 1141 addi sp,sp,-16 + af2: e422 sd s0,8(sp) + af4: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + af6: ca05 beqz a2,b26 + af8: fff6069b addiw a3,a2,-1 + afc: 1682 slli a3,a3,0x20 + afe: 9281 srli a3,a3,0x20 + b00: 0685 addi a3,a3,1 + b02: 96aa add a3,a3,a0 + if (*p1 != *p2) { + b04: 00054783 lbu a5,0(a0) + b08: 0005c703 lbu a4,0(a1) + b0c: 00e79863 bne a5,a4,b1c + return *p1 - *p2; + } + p1++; + b10: 0505 addi a0,a0,1 + p2++; + b12: 0585 addi a1,a1,1 + while (n-- > 0) { + b14: fed518e3 bne a0,a3,b04 + } + return 0; + b18: 4501 li a0,0 + b1a: a019 j b20 + return *p1 - *p2; + b1c: 40e7853b subw a0,a5,a4 +} + b20: 6422 ld s0,8(sp) + b22: 0141 addi sp,sp,16 + b24: 8082 ret + return 0; + b26: 4501 li a0,0 + b28: bfe5 j b20 + +0000000000000b2a : + +void * +memcpy(void *dst, const void *src, uint n) +{ + b2a: 1141 addi sp,sp,-16 + b2c: e406 sd ra,8(sp) + b2e: e022 sd s0,0(sp) + b30: 0800 addi s0,sp,16 + return memmove(dst, src, n); + b32: f67ff0ef jal a98 +} + b36: 60a2 ld ra,8(sp) + b38: 6402 ld s0,0(sp) + b3a: 0141 addi sp,sp,16 + b3c: 8082 ret + +0000000000000b3e : + +char * +sbrk(int n) { + b3e: 1141 addi sp,sp,-16 + b40: e406 sd ra,8(sp) + b42: e022 sd s0,0(sp) + b44: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + b46: 4585 li a1,1 + b48: 0b2000ef jal bfa +} + b4c: 60a2 ld ra,8(sp) + b4e: 6402 ld s0,0(sp) + b50: 0141 addi sp,sp,16 + b52: 8082 ret + +0000000000000b54 : + +char * +sbrklazy(int n) { + b54: 1141 addi sp,sp,-16 + b56: e406 sd ra,8(sp) + b58: e022 sd s0,0(sp) + b5a: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + b5c: 4589 li a1,2 + b5e: 09c000ef jal bfa +} + b62: 60a2 ld ra,8(sp) + b64: 6402 ld s0,0(sp) + b66: 0141 addi sp,sp,16 + b68: 8082 ret + +0000000000000b6a : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + b6a: 4885 li a7,1 + ecall + b6c: 00000073 ecall + ret + b70: 8082 ret + +0000000000000b72 : +.global exit +exit: + li a7, SYS_exit + b72: 4889 li a7,2 + ecall + b74: 00000073 ecall + ret + b78: 8082 ret + +0000000000000b7a : +.global wait +wait: + li a7, SYS_wait + b7a: 488d li a7,3 + ecall + b7c: 00000073 ecall + ret + b80: 8082 ret + +0000000000000b82 : +.global pipe +pipe: + li a7, SYS_pipe + b82: 4891 li a7,4 + ecall + b84: 00000073 ecall + ret + b88: 8082 ret + +0000000000000b8a : +.global read +read: + li a7, SYS_read + b8a: 4895 li a7,5 + ecall + b8c: 00000073 ecall + ret + b90: 8082 ret + +0000000000000b92 : +.global write +write: + li a7, SYS_write + b92: 48c1 li a7,16 + ecall + b94: 00000073 ecall + ret + b98: 8082 ret + +0000000000000b9a : +.global close +close: + li a7, SYS_close + b9a: 48d5 li a7,21 + ecall + b9c: 00000073 ecall + ret + ba0: 8082 ret + +0000000000000ba2 : +.global kill +kill: + li a7, SYS_kill + ba2: 4899 li a7,6 + ecall + ba4: 00000073 ecall + ret + ba8: 8082 ret + +0000000000000baa : +.global exec +exec: + li a7, SYS_exec + baa: 489d li a7,7 + ecall + bac: 00000073 ecall + ret + bb0: 8082 ret + +0000000000000bb2 : +.global open +open: + li a7, SYS_open + bb2: 48bd li a7,15 + ecall + bb4: 00000073 ecall + ret + bb8: 8082 ret + +0000000000000bba : +.global mknod +mknod: + li a7, SYS_mknod + bba: 48c5 li a7,17 + ecall + bbc: 00000073 ecall + ret + bc0: 8082 ret + +0000000000000bc2 : +.global unlink +unlink: + li a7, SYS_unlink + bc2: 48c9 li a7,18 + ecall + bc4: 00000073 ecall + ret + bc8: 8082 ret + +0000000000000bca : +.global fstat +fstat: + li a7, SYS_fstat + bca: 48a1 li a7,8 + ecall + bcc: 00000073 ecall + ret + bd0: 8082 ret + +0000000000000bd2 : +.global link +link: + li a7, SYS_link + bd2: 48cd li a7,19 + ecall + bd4: 00000073 ecall + ret + bd8: 8082 ret + +0000000000000bda : +.global mkdir +mkdir: + li a7, SYS_mkdir + bda: 48d1 li a7,20 + ecall + bdc: 00000073 ecall + ret + be0: 8082 ret + +0000000000000be2 : +.global chdir +chdir: + li a7, SYS_chdir + be2: 48a5 li a7,9 + ecall + be4: 00000073 ecall + ret + be8: 8082 ret + +0000000000000bea : +.global dup +dup: + li a7, SYS_dup + bea: 48a9 li a7,10 + ecall + bec: 00000073 ecall + ret + bf0: 8082 ret + +0000000000000bf2 : +.global getpid +getpid: + li a7, SYS_getpid + bf2: 48ad li a7,11 + ecall + bf4: 00000073 ecall + ret + bf8: 8082 ret + +0000000000000bfa : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + bfa: 48b1 li a7,12 + ecall + bfc: 00000073 ecall + ret + c00: 8082 ret + +0000000000000c02 : +.global pause +pause: + li a7, SYS_pause + c02: 48b5 li a7,13 + ecall + c04: 00000073 ecall + ret + c08: 8082 ret + +0000000000000c0a : +.global uptime +uptime: + li a7, SYS_uptime + c0a: 48b9 li a7,14 + ecall + c0c: 00000073 ecall + ret + c10: 8082 ret + +0000000000000c12 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + c12: 1101 addi sp,sp,-32 + c14: ec06 sd ra,24(sp) + c16: e822 sd s0,16(sp) + c18: 1000 addi s0,sp,32 + c1a: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + c1e: 4605 li a2,1 + c20: fef40593 addi a1,s0,-17 + c24: f6fff0ef jal b92 +} + c28: 60e2 ld ra,24(sp) + c2a: 6442 ld s0,16(sp) + c2c: 6105 addi sp,sp,32 + c2e: 8082 ret + +0000000000000c30 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + c30: 715d addi sp,sp,-80 + c32: e486 sd ra,72(sp) + c34: e0a2 sd s0,64(sp) + c36: f84a sd s2,48(sp) + c38: 0880 addi s0,sp,80 + c3a: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + c3c: c299 beqz a3,c42 + c3e: 0805c363 bltz a1,cc4 + neg = 0; + c42: 4881 li a7,0 + c44: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + c48: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + c4a: 00001517 auipc a0,0x1 + c4e: 87650513 addi a0,a0,-1930 # 14c0 + c52: 883e mv a6,a5 + c54: 2785 addiw a5,a5,1 + c56: 02c5f733 remu a4,a1,a2 + c5a: 972a add a4,a4,a0 + c5c: 00074703 lbu a4,0(a4) + c60: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + c64: 872e mv a4,a1 + c66: 02c5d5b3 divu a1,a1,a2 + c6a: 0685 addi a3,a3,1 + c6c: fec773e3 bgeu a4,a2,c52 + if(neg) + c70: 00088b63 beqz a7,c86 + buf[i++] = '-'; + c74: fd078793 addi a5,a5,-48 + c78: 97a2 add a5,a5,s0 + c7a: 02d00713 li a4,45 + c7e: fee78423 sb a4,-24(a5) + c82: 0028079b addiw a5,a6,2 + + while(--i >= 0) + c86: 02f05a63 blez a5,cba + c8a: fc26 sd s1,56(sp) + c8c: f44e sd s3,40(sp) + c8e: fb840713 addi a4,s0,-72 + c92: 00f704b3 add s1,a4,a5 + c96: fff70993 addi s3,a4,-1 + c9a: 99be add s3,s3,a5 + c9c: 37fd addiw a5,a5,-1 + c9e: 1782 slli a5,a5,0x20 + ca0: 9381 srli a5,a5,0x20 + ca2: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + ca6: fff4c583 lbu a1,-1(s1) + caa: 854a mv a0,s2 + cac: f67ff0ef jal c12 + while(--i >= 0) + cb0: 14fd addi s1,s1,-1 + cb2: ff349ae3 bne s1,s3,ca6 + cb6: 74e2 ld s1,56(sp) + cb8: 79a2 ld s3,40(sp) +} + cba: 60a6 ld ra,72(sp) + cbc: 6406 ld s0,64(sp) + cbe: 7942 ld s2,48(sp) + cc0: 6161 addi sp,sp,80 + cc2: 8082 ret + x = -xx; + cc4: 40b005b3 neg a1,a1 + neg = 1; + cc8: 4885 li a7,1 + x = -xx; + cca: bfad j c44 + +0000000000000ccc : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + ccc: 711d addi sp,sp,-96 + cce: ec86 sd ra,88(sp) + cd0: e8a2 sd s0,80(sp) + cd2: e0ca sd s2,64(sp) + cd4: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + cd6: 0005c903 lbu s2,0(a1) + cda: 28090663 beqz s2,f66 + cde: e4a6 sd s1,72(sp) + ce0: fc4e sd s3,56(sp) + ce2: f852 sd s4,48(sp) + ce4: f456 sd s5,40(sp) + ce6: f05a sd s6,32(sp) + ce8: ec5e sd s7,24(sp) + cea: e862 sd s8,16(sp) + cec: e466 sd s9,8(sp) + cee: 8b2a mv s6,a0 + cf0: 8a2e mv s4,a1 + cf2: 8bb2 mv s7,a2 + state = 0; + cf4: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + cf6: 4481 li s1,0 + cf8: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + cfa: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + cfe: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + d02: 06c00c93 li s9,108 + d06: a005 j d26 + putc(fd, c0); + d08: 85ca mv a1,s2 + d0a: 855a mv a0,s6 + d0c: f07ff0ef jal c12 + d10: a019 j d16 + } else if(state == '%'){ + d12: 03598263 beq s3,s5,d36 + for(i = 0; fmt[i]; i++){ + d16: 2485 addiw s1,s1,1 + d18: 8726 mv a4,s1 + d1a: 009a07b3 add a5,s4,s1 + d1e: 0007c903 lbu s2,0(a5) + d22: 22090a63 beqz s2,f56 + c0 = fmt[i] & 0xff; + d26: 0009079b sext.w a5,s2 + if(state == 0){ + d2a: fe0994e3 bnez s3,d12 + if(c0 == '%'){ + d2e: fd579de3 bne a5,s5,d08 + state = '%'; + d32: 89be mv s3,a5 + d34: b7cd j d16 + if(c0) c1 = fmt[i+1] & 0xff; + d36: 00ea06b3 add a3,s4,a4 + d3a: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + d3e: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + d40: c681 beqz a3,d48 + d42: 9752 add a4,a4,s4 + d44: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + d48: 05878363 beq a5,s8,d8e + } else if(c0 == 'l' && c1 == 'd'){ + d4c: 05978d63 beq a5,s9,da6 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + d50: 07500713 li a4,117 + d54: 0ee78763 beq a5,a4,e42 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + d58: 07800713 li a4,120 + d5c: 12e78963 beq a5,a4,e8e + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + d60: 07000713 li a4,112 + d64: 14e78e63 beq a5,a4,ec0 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + d68: 06300713 li a4,99 + d6c: 18e78e63 beq a5,a4,f08 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + d70: 07300713 li a4,115 + d74: 1ae78463 beq a5,a4,f1c + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + d78: 02500713 li a4,37 + d7c: 04e79563 bne a5,a4,dc6 + putc(fd, '%'); + d80: 02500593 li a1,37 + d84: 855a mv a0,s6 + d86: e8dff0ef jal c12 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + d8a: 4981 li s3,0 + d8c: b769 j d16 + printint(fd, va_arg(ap, int), 10, 1); + d8e: 008b8913 addi s2,s7,8 + d92: 4685 li a3,1 + d94: 4629 li a2,10 + d96: 000ba583 lw a1,0(s7) + d9a: 855a mv a0,s6 + d9c: e95ff0ef jal c30 + da0: 8bca mv s7,s2 + state = 0; + da2: 4981 li s3,0 + da4: bf8d j d16 + } else if(c0 == 'l' && c1 == 'd'){ + da6: 06400793 li a5,100 + daa: 02f68963 beq a3,a5,ddc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + dae: 06c00793 li a5,108 + db2: 04f68263 beq a3,a5,df6 + } else if(c0 == 'l' && c1 == 'u'){ + db6: 07500793 li a5,117 + dba: 0af68063 beq a3,a5,e5a + } else if(c0 == 'l' && c1 == 'x'){ + dbe: 07800793 li a5,120 + dc2: 0ef68263 beq a3,a5,ea6 + putc(fd, '%'); + dc6: 02500593 li a1,37 + dca: 855a mv a0,s6 + dcc: e47ff0ef jal c12 + putc(fd, c0); + dd0: 85ca mv a1,s2 + dd2: 855a mv a0,s6 + dd4: e3fff0ef jal c12 + state = 0; + dd8: 4981 li s3,0 + dda: bf35 j d16 + printint(fd, va_arg(ap, uint64), 10, 1); + ddc: 008b8913 addi s2,s7,8 + de0: 4685 li a3,1 + de2: 4629 li a2,10 + de4: 000bb583 ld a1,0(s7) + de8: 855a mv a0,s6 + dea: e47ff0ef jal c30 + i += 1; + dee: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + df0: 8bca mv s7,s2 + state = 0; + df2: 4981 li s3,0 + i += 1; + df4: b70d j d16 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + df6: 06400793 li a5,100 + dfa: 02f60763 beq a2,a5,e28 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + dfe: 07500793 li a5,117 + e02: 06f60963 beq a2,a5,e74 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + e06: 07800793 li a5,120 + e0a: faf61ee3 bne a2,a5,dc6 + printint(fd, va_arg(ap, uint64), 16, 0); + e0e: 008b8913 addi s2,s7,8 + e12: 4681 li a3,0 + e14: 4641 li a2,16 + e16: 000bb583 ld a1,0(s7) + e1a: 855a mv a0,s6 + e1c: e15ff0ef jal c30 + i += 2; + e20: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + e22: 8bca mv s7,s2 + state = 0; + e24: 4981 li s3,0 + i += 2; + e26: bdc5 j d16 + printint(fd, va_arg(ap, uint64), 10, 1); + e28: 008b8913 addi s2,s7,8 + e2c: 4685 li a3,1 + e2e: 4629 li a2,10 + e30: 000bb583 ld a1,0(s7) + e34: 855a mv a0,s6 + e36: dfbff0ef jal c30 + i += 2; + e3a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + e3c: 8bca mv s7,s2 + state = 0; + e3e: 4981 li s3,0 + i += 2; + e40: bdd9 j d16 + printint(fd, va_arg(ap, uint32), 10, 0); + e42: 008b8913 addi s2,s7,8 + e46: 4681 li a3,0 + e48: 4629 li a2,10 + e4a: 000be583 lwu a1,0(s7) + e4e: 855a mv a0,s6 + e50: de1ff0ef jal c30 + e54: 8bca mv s7,s2 + state = 0; + e56: 4981 li s3,0 + e58: bd7d j d16 + printint(fd, va_arg(ap, uint64), 10, 0); + e5a: 008b8913 addi s2,s7,8 + e5e: 4681 li a3,0 + e60: 4629 li a2,10 + e62: 000bb583 ld a1,0(s7) + e66: 855a mv a0,s6 + e68: dc9ff0ef jal c30 + i += 1; + e6c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + e6e: 8bca mv s7,s2 + state = 0; + e70: 4981 li s3,0 + i += 1; + e72: b555 j d16 + printint(fd, va_arg(ap, uint64), 10, 0); + e74: 008b8913 addi s2,s7,8 + e78: 4681 li a3,0 + e7a: 4629 li a2,10 + e7c: 000bb583 ld a1,0(s7) + e80: 855a mv a0,s6 + e82: dafff0ef jal c30 + i += 2; + e86: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + e88: 8bca mv s7,s2 + state = 0; + e8a: 4981 li s3,0 + i += 2; + e8c: b569 j d16 + printint(fd, va_arg(ap, uint32), 16, 0); + e8e: 008b8913 addi s2,s7,8 + e92: 4681 li a3,0 + e94: 4641 li a2,16 + e96: 000be583 lwu a1,0(s7) + e9a: 855a mv a0,s6 + e9c: d95ff0ef jal c30 + ea0: 8bca mv s7,s2 + state = 0; + ea2: 4981 li s3,0 + ea4: bd8d j d16 + printint(fd, va_arg(ap, uint64), 16, 0); + ea6: 008b8913 addi s2,s7,8 + eaa: 4681 li a3,0 + eac: 4641 li a2,16 + eae: 000bb583 ld a1,0(s7) + eb2: 855a mv a0,s6 + eb4: d7dff0ef jal c30 + i += 1; + eb8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + eba: 8bca mv s7,s2 + state = 0; + ebc: 4981 li s3,0 + i += 1; + ebe: bda1 j d16 + ec0: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + ec2: 008b8d13 addi s10,s7,8 + ec6: 000bb983 ld s3,0(s7) + putc(fd, '0'); + eca: 03000593 li a1,48 + ece: 855a mv a0,s6 + ed0: d43ff0ef jal c12 + putc(fd, 'x'); + ed4: 07800593 li a1,120 + ed8: 855a mv a0,s6 + eda: d39ff0ef jal c12 + ede: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + ee0: 00000b97 auipc s7,0x0 + ee4: 5e0b8b93 addi s7,s7,1504 # 14c0 + ee8: 03c9d793 srli a5,s3,0x3c + eec: 97de add a5,a5,s7 + eee: 0007c583 lbu a1,0(a5) + ef2: 855a mv a0,s6 + ef4: d1fff0ef jal c12 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + ef8: 0992 slli s3,s3,0x4 + efa: 397d addiw s2,s2,-1 + efc: fe0916e3 bnez s2,ee8 + printptr(fd, va_arg(ap, uint64)); + f00: 8bea mv s7,s10 + state = 0; + f02: 4981 li s3,0 + f04: 6d02 ld s10,0(sp) + f06: bd01 j d16 + putc(fd, va_arg(ap, uint32)); + f08: 008b8913 addi s2,s7,8 + f0c: 000bc583 lbu a1,0(s7) + f10: 855a mv a0,s6 + f12: d01ff0ef jal c12 + f16: 8bca mv s7,s2 + state = 0; + f18: 4981 li s3,0 + f1a: bbf5 j d16 + if((s = va_arg(ap, char*)) == 0) + f1c: 008b8993 addi s3,s7,8 + f20: 000bb903 ld s2,0(s7) + f24: 00090f63 beqz s2,f42 + for(; *s; s++) + f28: 00094583 lbu a1,0(s2) + f2c: c195 beqz a1,f50 + putc(fd, *s); + f2e: 855a mv a0,s6 + f30: ce3ff0ef jal c12 + for(; *s; s++) + f34: 0905 addi s2,s2,1 + f36: 00094583 lbu a1,0(s2) + f3a: f9f5 bnez a1,f2e + if((s = va_arg(ap, char*)) == 0) + f3c: 8bce mv s7,s3 + state = 0; + f3e: 4981 li s3,0 + f40: bbd9 j d16 + s = "(null)"; + f42: 00000917 auipc s2,0x0 + f46: 51690913 addi s2,s2,1302 # 1458 + for(; *s; s++) + f4a: 02800593 li a1,40 + f4e: b7c5 j f2e + if((s = va_arg(ap, char*)) == 0) + f50: 8bce mv s7,s3 + state = 0; + f52: 4981 li s3,0 + f54: b3c9 j d16 + f56: 64a6 ld s1,72(sp) + f58: 79e2 ld s3,56(sp) + f5a: 7a42 ld s4,48(sp) + f5c: 7aa2 ld s5,40(sp) + f5e: 7b02 ld s6,32(sp) + f60: 6be2 ld s7,24(sp) + f62: 6c42 ld s8,16(sp) + f64: 6ca2 ld s9,8(sp) + } + } +} + f66: 60e6 ld ra,88(sp) + f68: 6446 ld s0,80(sp) + f6a: 6906 ld s2,64(sp) + f6c: 6125 addi sp,sp,96 + f6e: 8082 ret + +0000000000000f70 : + +void +fprintf(int fd, const char *fmt, ...) +{ + f70: 715d addi sp,sp,-80 + f72: ec06 sd ra,24(sp) + f74: e822 sd s0,16(sp) + f76: 1000 addi s0,sp,32 + f78: e010 sd a2,0(s0) + f7a: e414 sd a3,8(s0) + f7c: e818 sd a4,16(s0) + f7e: ec1c sd a5,24(s0) + f80: 03043023 sd a6,32(s0) + f84: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + f88: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + f8c: 8622 mv a2,s0 + f8e: d3fff0ef jal ccc +} + f92: 60e2 ld ra,24(sp) + f94: 6442 ld s0,16(sp) + f96: 6161 addi sp,sp,80 + f98: 8082 ret + +0000000000000f9a : + +void +printf(const char *fmt, ...) +{ + f9a: 711d addi sp,sp,-96 + f9c: ec06 sd ra,24(sp) + f9e: e822 sd s0,16(sp) + fa0: 1000 addi s0,sp,32 + fa2: e40c sd a1,8(s0) + fa4: e810 sd a2,16(s0) + fa6: ec14 sd a3,24(s0) + fa8: f018 sd a4,32(s0) + faa: f41c sd a5,40(s0) + fac: 03043823 sd a6,48(s0) + fb0: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + fb4: 00840613 addi a2,s0,8 + fb8: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + fbc: 85aa mv a1,a0 + fbe: 4505 li a0,1 + fc0: d0dff0ef jal ccc +} + fc4: 60e2 ld ra,24(sp) + fc6: 6442 ld s0,16(sp) + fc8: 6125 addi sp,sp,96 + fca: 8082 ret + +0000000000000fcc : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + fcc: 1141 addi sp,sp,-16 + fce: e422 sd s0,8(sp) + fd0: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + fd2: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + fd6: 00001797 auipc a5,0x1 + fda: 03a7b783 ld a5,58(a5) # 2010 + fde: a02d j 1008 + 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; + fe0: 4618 lw a4,8(a2) + fe2: 9f2d addw a4,a4,a1 + fe4: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + fe8: 6398 ld a4,0(a5) + fea: 6310 ld a2,0(a4) + fec: a83d j 102a + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + fee: ff852703 lw a4,-8(a0) + ff2: 9f31 addw a4,a4,a2 + ff4: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + ff6: ff053683 ld a3,-16(a0) + ffa: a091 j 103e + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + ffc: 6398 ld a4,0(a5) + ffe: 00e7e463 bltu a5,a4,1006 + 1002: 00e6ea63 bltu a3,a4,1016 +{ + 1006: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 1008: fed7fae3 bgeu a5,a3,ffc + 100c: 6398 ld a4,0(a5) + 100e: 00e6e463 bltu a3,a4,1016 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 1012: fee7eae3 bltu a5,a4,1006 + if(bp + bp->s.size == p->s.ptr){ + 1016: ff852583 lw a1,-8(a0) + 101a: 6390 ld a2,0(a5) + 101c: 02059813 slli a6,a1,0x20 + 1020: 01c85713 srli a4,a6,0x1c + 1024: 9736 add a4,a4,a3 + 1026: fae60de3 beq a2,a4,fe0 + bp->s.ptr = p->s.ptr->s.ptr; + 102a: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 102e: 4790 lw a2,8(a5) + 1030: 02061593 slli a1,a2,0x20 + 1034: 01c5d713 srli a4,a1,0x1c + 1038: 973e add a4,a4,a5 + 103a: fae68ae3 beq a3,a4,fee + p->s.ptr = bp->s.ptr; + 103e: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 1040: 00001717 auipc a4,0x1 + 1044: fcf73823 sd a5,-48(a4) # 2010 +} + 1048: 6422 ld s0,8(sp) + 104a: 0141 addi sp,sp,16 + 104c: 8082 ret + +000000000000104e : + return freep; +} + +void* +malloc(uint nbytes) +{ + 104e: 7139 addi sp,sp,-64 + 1050: fc06 sd ra,56(sp) + 1052: f822 sd s0,48(sp) + 1054: f426 sd s1,40(sp) + 1056: ec4e sd s3,24(sp) + 1058: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 105a: 02051493 slli s1,a0,0x20 + 105e: 9081 srli s1,s1,0x20 + 1060: 04bd addi s1,s1,15 + 1062: 8091 srli s1,s1,0x4 + 1064: 0014899b addiw s3,s1,1 + 1068: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 106a: 00001517 auipc a0,0x1 + 106e: fa653503 ld a0,-90(a0) # 2010 + 1072: c915 beqz a0,10a6 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 1074: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 1076: 4798 lw a4,8(a5) + 1078: 08977a63 bgeu a4,s1,110c + 107c: f04a sd s2,32(sp) + 107e: e852 sd s4,16(sp) + 1080: e456 sd s5,8(sp) + 1082: e05a sd s6,0(sp) + if(nu < 4096) + 1084: 8a4e mv s4,s3 + 1086: 0009871b sext.w a4,s3 + 108a: 6685 lui a3,0x1 + 108c: 00d77363 bgeu a4,a3,1092 + 1090: 6a05 lui s4,0x1 + 1092: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 1096: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 109a: 00001917 auipc s2,0x1 + 109e: f7690913 addi s2,s2,-138 # 2010 + if(p == SBRK_ERROR) + 10a2: 5afd li s5,-1 + 10a4: a081 j 10e4 + 10a6: f04a sd s2,32(sp) + 10a8: e852 sd s4,16(sp) + 10aa: e456 sd s5,8(sp) + 10ac: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 10ae: 00001797 auipc a5,0x1 + 10b2: 35a78793 addi a5,a5,858 # 2408 + 10b6: 00001717 auipc a4,0x1 + 10ba: f4f73d23 sd a5,-166(a4) # 2010 + 10be: e39c sd a5,0(a5) + base.s.size = 0; + 10c0: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 10c4: b7c1 j 1084 + prevp->s.ptr = p->s.ptr; + 10c6: 6398 ld a4,0(a5) + 10c8: e118 sd a4,0(a0) + 10ca: a8a9 j 1124 + hp->s.size = nu; + 10cc: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 10d0: 0541 addi a0,a0,16 + 10d2: efbff0ef jal fcc + return freep; + 10d6: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 10da: c12d beqz a0,113c + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 10dc: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 10de: 4798 lw a4,8(a5) + 10e0: 02977263 bgeu a4,s1,1104 + if(p == freep) + 10e4: 00093703 ld a4,0(s2) + 10e8: 853e mv a0,a5 + 10ea: fef719e3 bne a4,a5,10dc + p = sbrk(nu * sizeof(Header)); + 10ee: 8552 mv a0,s4 + 10f0: a4fff0ef jal b3e + if(p == SBRK_ERROR) + 10f4: fd551ce3 bne a0,s5,10cc + return 0; + 10f8: 4501 li a0,0 + 10fa: 7902 ld s2,32(sp) + 10fc: 6a42 ld s4,16(sp) + 10fe: 6aa2 ld s5,8(sp) + 1100: 6b02 ld s6,0(sp) + 1102: a03d j 1130 + 1104: 7902 ld s2,32(sp) + 1106: 6a42 ld s4,16(sp) + 1108: 6aa2 ld s5,8(sp) + 110a: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 110c: fae48de3 beq s1,a4,10c6 + p->s.size -= nunits; + 1110: 4137073b subw a4,a4,s3 + 1114: c798 sw a4,8(a5) + p += p->s.size; + 1116: 02071693 slli a3,a4,0x20 + 111a: 01c6d713 srli a4,a3,0x1c + 111e: 97ba add a5,a5,a4 + p->s.size = nunits; + 1120: 0137a423 sw s3,8(a5) + freep = prevp; + 1124: 00001717 auipc a4,0x1 + 1128: eea73623 sd a0,-276(a4) # 2010 + return (void*)(p + 1); + 112c: 01078513 addi a0,a5,16 + } +} + 1130: 70e2 ld ra,56(sp) + 1132: 7442 ld s0,48(sp) + 1134: 74a2 ld s1,40(sp) + 1136: 69e2 ld s3,24(sp) + 1138: 6121 addi sp,sp,64 + 113a: 8082 ret + 113c: 7902 ld s2,32(sp) + 113e: 6a42 ld s4,16(sp) + 1140: 6aa2 ld s5,8(sp) + 1142: 6b02 ld s6,0(sp) + 1144: b7f5 j 1130 diff --git a/G12_Project2_2/user/grind.c b/G12_Project2_2/user/grind.c new file mode 100644 index 0000000000..adcd09919d --- /dev/null +++ b/G12_Project2_2/user/grind.c @@ -0,0 +1,351 @@ +// +// run random system calls in parallel forever. +// + +#include "kernel/param.h" +#include "kernel/types.h" +#include "kernel/stat.h" +#include "user/user.h" +#include "kernel/fs.h" +#include "kernel/fcntl.h" +#include "kernel/syscall.h" +#include "kernel/memlayout.h" +#include "kernel/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("grind: 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("grind: 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("grind: 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("grind: 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("grind: create c failed\n"); + exit(1); + } + if(write(fd1, "x", 1) != 1){ + printf("grind: write c failed\n"); + exit(1); + } + struct stat st; + if(fstat(fd1, &st) != 0){ + printf("grind: fstat failed\n"); + exit(1); + } + if(st.size != 1){ + printf("grind: fstat reports wrong size %d\n", (int)st.size); + exit(1); + } + if(st.ino > 200){ + printf("grind: 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, "grind: pipe failed\n"); + exit(1); + } + if(pipe(bb) < 0){ + fprintf(2, "grind: 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, "grind: dup failed\n"); + exit(1); + } + close(aa[1]); + char *args[3] = { "echo", "hi", 0 }; + exec("grindir/../echo", args); + fprintf(2, "grind: echo: not found\n"); + exit(2); + } else if(pid1 < 0){ + fprintf(2, "grind: 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, "grind: dup failed\n"); + exit(4); + } + close(aa[0]); + close(1); + if(dup(bb[1]) != 1){ + fprintf(2, "grind: dup failed\n"); + exit(5); + } + close(bb[1]); + char *args[2] = { "cat", 0 }; + exec("/cat", args); + fprintf(2, "grind: cat: not found\n"); + exit(6); + } else if(pid2 < 0){ + fprintf(2, "grind: fork failed\n"); + exit(7); + } + close(aa[0]); + close(aa[1]); + close(bb[1]); + char buf[4] = { 0, 0, 0, 0 }; + read(bb[0], buf+0, 1); + read(bb[0], buf+1, 1); + read(bb[0], buf+2, 1); + close(bb[0]); + int st1, st2; + wait(&st1); + wait(&st2); + if(st1 != 0 || st2 != 0 || strcmp(buf, "hi\n") != 0){ + printf("grind: 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); + } + pause(20); + rand_next += 1; + } +} diff --git a/G12_Project2_2/user/grind.d b/G12_Project2_2/user/grind.d new file mode 100644 index 0000000000..2b8914bc0b --- /dev/null +++ b/G12_Project2_2/user/grind.d @@ -0,0 +1,3 @@ +user/grind.o: user/grind.c kernel/param.h kernel/types.h kernel/stat.h \ + user/user.h kernel/fs.h kernel/fcntl.h kernel/syscall.h \ + kernel/memlayout.h kernel/riscv.h diff --git a/G12_Project2_2/user/grind.o b/G12_Project2_2/user/grind.o new file mode 100644 index 0000000000..d2c2d0f6a1 Binary files /dev/null and b/G12_Project2_2/user/grind.o differ diff --git a/G12_Project2_2/user/grind.sym b/G12_Project2_2/user/grind.sym new file mode 100644 index 0000000000..f1f2bc1893 --- /dev/null +++ b/G12_Project2_2/user/grind.sym @@ -0,0 +1,71 @@ +0000000000000000 .text +0000000000001148 .rodata +00000000000014d8 .eh_frame +0000000000002000 .data +0000000000002010 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 grind.c +0000000000002020 buf.0 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000c12 putc +0000000000000c30 printint +00000000000014c0 digits +0000000000000000 umalloc.c +0000000000002010 freep +0000000000002408 base +00000000000008ee strcpy +0000000000000c02 pause +0000000000000f9a printf +0000000000000bfa sys_sbrk +0000000000000000 do_rand +0000000000000a98 memmove +0000000000000bba mknod +00000000000009a6 gets +0000000000000bf2 getpid +0000000000000b2a memcpy +000000000000104e malloc +0000000000000b54 sbrklazy +0000000000000b82 pipe +0000000000000074 go +00000000000007dc iter +0000000000000b92 write +0000000000000bca fstat +0000000000000f70 fprintf +0000000000000ba2 kill +0000000000000ccc vprintf +0000000000000be2 chdir +0000000000000baa exec +0000000000000b7a wait +0000000000000058 rand +0000000000000b8a read +0000000000000bc2 unlink +0000000000000af0 memcmp +0000000000000b6a fork +0000000000002000 rand_next +0000000000000b3e sbrk +0000000000000c0a uptime +0000000000000960 memset +00000000000008a8 main +000000000000090a strcmp +0000000000000bea dup +0000000000000a16 stat +0000000000000bd2 link +0000000000000b72 exit +00000000000008de start +0000000000000a50 atoi +0000000000000936 strlen +0000000000000bb2 open +0000000000000982 strchr +0000000000000bda mkdir +0000000000000b9a close +0000000000000fcc free diff --git a/G12_Project2_2/user/init.asm b/G12_Project2_2/user/init.asm new file mode 100644 index 0000000000..83661182bf --- /dev/null +++ b/G12_Project2_2/user/init.asm @@ -0,0 +1,1549 @@ + +user/_init: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: + +char *argv[] = { "sh", 0 }; + +int +main(void) +{ + 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 pid, wpid; + + if(open("console", O_RDWR) < 0){ + c: 4589 li a1,2 + e: 00001517 auipc a0,0x1 + 12: 92250513 addi a0,a0,-1758 # 930 + 16: 37a000ef jal 390 + 1a: 04054563 bltz a0,64 + mknod("console", CONSOLE, 0); + open("console", O_RDWR); + } + dup(0); // stdout + 1e: 4501 li a0,0 + 20: 3a8000ef jal 3c8 + dup(0); // stderr + 24: 4501 li a0,0 + 26: 3a2000ef jal 3c8 + + for(;;){ + printf("init: starting sh\n"); + 2a: 00001917 auipc s2,0x1 + 2e: 90e90913 addi s2,s2,-1778 # 938 + 32: 854a mv a0,s2 + 34: 744000ef jal 778 + pid = fork(); + 38: 310000ef jal 348 + 3c: 84aa mv s1,a0 + if(pid < 0){ + 3e: 04054363 bltz a0,84 + printf("init: fork failed\n"); + exit(1); + } + if(pid == 0){ + 42: c931 beqz a0,96 + } + + for(;;){ + // this call to wait() returns if the shell exits, + // or if a parentless process exits. + wpid = wait((int *) 0); + 44: 4501 li a0,0 + 46: 312000ef jal 358 + if(wpid == pid){ + 4a: fea484e3 beq s1,a0,32 + // the shell exited; restart it. + break; + } else if(wpid < 0){ + 4e: fe055be3 bgez a0,44 + printf("init: wait returned an error\n"); + 52: 00001517 auipc a0,0x1 + 56: 93650513 addi a0,a0,-1738 # 988 + 5a: 71e000ef jal 778 + exit(1); + 5e: 4505 li a0,1 + 60: 2f0000ef jal 350 + mknod("console", CONSOLE, 0); + 64: 4601 li a2,0 + 66: 4585 li a1,1 + 68: 00001517 auipc a0,0x1 + 6c: 8c850513 addi a0,a0,-1848 # 930 + 70: 328000ef jal 398 + open("console", O_RDWR); + 74: 4589 li a1,2 + 76: 00001517 auipc a0,0x1 + 7a: 8ba50513 addi a0,a0,-1862 # 930 + 7e: 312000ef jal 390 + 82: bf71 j 1e + printf("init: fork failed\n"); + 84: 00001517 auipc a0,0x1 + 88: 8cc50513 addi a0,a0,-1844 # 950 + 8c: 6ec000ef jal 778 + exit(1); + 90: 4505 li a0,1 + 92: 2be000ef jal 350 + exec("sh", argv); + 96: 00001597 auipc a1,0x1 + 9a: f6a58593 addi a1,a1,-150 # 1000 + 9e: 00001517 auipc a0,0x1 + a2: 8ca50513 addi a0,a0,-1846 # 968 + a6: 2e2000ef jal 388 + printf("init: exec sh failed\n"); + aa: 00001517 auipc a0,0x1 + ae: 8c650513 addi a0,a0,-1850 # 970 + b2: 6c6000ef jal 778 + exit(1); + b6: 4505 li a0,1 + b8: 298000ef jal 350 + +00000000000000bc : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + bc: 1141 addi sp,sp,-16 + be: e406 sd ra,8(sp) + c0: e022 sd s0,0(sp) + c2: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + c4: f3dff0ef jal 0
+ exit(r); + c8: 288000ef jal 350 + +00000000000000cc : +} + +char* +strcpy(char *s, const char *t) +{ + cc: 1141 addi sp,sp,-16 + ce: e422 sd s0,8(sp) + d0: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + d2: 87aa mv a5,a0 + d4: 0585 addi a1,a1,1 + d6: 0785 addi a5,a5,1 + d8: fff5c703 lbu a4,-1(a1) + dc: fee78fa3 sb a4,-1(a5) + e0: fb75 bnez a4,d4 + ; + return os; +} + e2: 6422 ld s0,8(sp) + e4: 0141 addi sp,sp,16 + e6: 8082 ret + +00000000000000e8 : + +int +strcmp(const char *p, const char *q) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + while(*p && *p == *q) + ee: 00054783 lbu a5,0(a0) + f2: cb91 beqz a5,106 + f4: 0005c703 lbu a4,0(a1) + f8: 00f71763 bne a4,a5,106 + p++, q++; + fc: 0505 addi a0,a0,1 + fe: 0585 addi a1,a1,1 + while(*p && *p == *q) + 100: 00054783 lbu a5,0(a0) + 104: fbe5 bnez a5,f4 + return (uchar)*p - (uchar)*q; + 106: 0005c503 lbu a0,0(a1) +} + 10a: 40a7853b subw a0,a5,a0 + 10e: 6422 ld s0,8(sp) + 110: 0141 addi sp,sp,16 + 112: 8082 ret + +0000000000000114 : + +uint +strlen(const char *s) +{ + 114: 1141 addi sp,sp,-16 + 116: e422 sd s0,8(sp) + 118: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 11a: 00054783 lbu a5,0(a0) + 11e: cf91 beqz a5,13a + 120: 0505 addi a0,a0,1 + 122: 87aa mv a5,a0 + 124: 86be mv a3,a5 + 126: 0785 addi a5,a5,1 + 128: fff7c703 lbu a4,-1(a5) + 12c: ff65 bnez a4,124 + 12e: 40a6853b subw a0,a3,a0 + 132: 2505 addiw a0,a0,1 + ; + return n; +} + 134: 6422 ld s0,8(sp) + 136: 0141 addi sp,sp,16 + 138: 8082 ret + for(n = 0; s[n]; n++) + 13a: 4501 li a0,0 + 13c: bfe5 j 134 + +000000000000013e : + +void* +memset(void *dst, int c, uint n) +{ + 13e: 1141 addi sp,sp,-16 + 140: e422 sd s0,8(sp) + 142: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 144: ca19 beqz a2,15a + 146: 87aa mv a5,a0 + 148: 1602 slli a2,a2,0x20 + 14a: 9201 srli a2,a2,0x20 + 14c: 00a60733 add a4,a2,a0 + cdst[i] = c; + 150: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 154: 0785 addi a5,a5,1 + 156: fee79de3 bne a5,a4,150 + } + return dst; +} + 15a: 6422 ld s0,8(sp) + 15c: 0141 addi sp,sp,16 + 15e: 8082 ret + +0000000000000160 : + +char* +strchr(const char *s, char c) +{ + 160: 1141 addi sp,sp,-16 + 162: e422 sd s0,8(sp) + 164: 0800 addi s0,sp,16 + for(; *s; s++) + 166: 00054783 lbu a5,0(a0) + 16a: cb99 beqz a5,180 + if(*s == c) + 16c: 00f58763 beq a1,a5,17a + for(; *s; s++) + 170: 0505 addi a0,a0,1 + 172: 00054783 lbu a5,0(a0) + 176: fbfd bnez a5,16c + return (char*)s; + return 0; + 178: 4501 li a0,0 +} + 17a: 6422 ld s0,8(sp) + 17c: 0141 addi sp,sp,16 + 17e: 8082 ret + return 0; + 180: 4501 li a0,0 + 182: bfe5 j 17a + +0000000000000184 : + +char* +gets(char *buf, int max) +{ + 184: 711d addi sp,sp,-96 + 186: ec86 sd ra,88(sp) + 188: e8a2 sd s0,80(sp) + 18a: e4a6 sd s1,72(sp) + 18c: e0ca sd s2,64(sp) + 18e: fc4e sd s3,56(sp) + 190: f852 sd s4,48(sp) + 192: f456 sd s5,40(sp) + 194: f05a sd s6,32(sp) + 196: ec5e sd s7,24(sp) + 198: 1080 addi s0,sp,96 + 19a: 8baa mv s7,a0 + 19c: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 19e: 892a mv s2,a0 + 1a0: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1a2: 4aa9 li s5,10 + 1a4: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1a6: 89a6 mv s3,s1 + 1a8: 2485 addiw s1,s1,1 + 1aa: 0344d663 bge s1,s4,1d6 + cc = read(0, &c, 1); + 1ae: 4605 li a2,1 + 1b0: faf40593 addi a1,s0,-81 + 1b4: 4501 li a0,0 + 1b6: 1b2000ef jal 368 + if(cc < 1) + 1ba: 00a05e63 blez a0,1d6 + buf[i++] = c; + 1be: faf44783 lbu a5,-81(s0) + 1c2: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1c6: 01578763 beq a5,s5,1d4 + 1ca: 0905 addi s2,s2,1 + 1cc: fd679de3 bne a5,s6,1a6 + buf[i++] = c; + 1d0: 89a6 mv s3,s1 + 1d2: a011 j 1d6 + 1d4: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1d6: 99de add s3,s3,s7 + 1d8: 00098023 sb zero,0(s3) + return buf; +} + 1dc: 855e mv a0,s7 + 1de: 60e6 ld ra,88(sp) + 1e0: 6446 ld s0,80(sp) + 1e2: 64a6 ld s1,72(sp) + 1e4: 6906 ld s2,64(sp) + 1e6: 79e2 ld s3,56(sp) + 1e8: 7a42 ld s4,48(sp) + 1ea: 7aa2 ld s5,40(sp) + 1ec: 7b02 ld s6,32(sp) + 1ee: 6be2 ld s7,24(sp) + 1f0: 6125 addi sp,sp,96 + 1f2: 8082 ret + +00000000000001f4 : + +int +stat(const char *n, struct stat *st) +{ + 1f4: 1101 addi sp,sp,-32 + 1f6: ec06 sd ra,24(sp) + 1f8: e822 sd s0,16(sp) + 1fa: e04a sd s2,0(sp) + 1fc: 1000 addi s0,sp,32 + 1fe: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 200: 4581 li a1,0 + 202: 18e000ef jal 390 + if(fd < 0) + 206: 02054263 bltz a0,22a + 20a: e426 sd s1,8(sp) + 20c: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 20e: 85ca mv a1,s2 + 210: 198000ef jal 3a8 + 214: 892a mv s2,a0 + close(fd); + 216: 8526 mv a0,s1 + 218: 160000ef jal 378 + return r; + 21c: 64a2 ld s1,8(sp) +} + 21e: 854a mv a0,s2 + 220: 60e2 ld ra,24(sp) + 222: 6442 ld s0,16(sp) + 224: 6902 ld s2,0(sp) + 226: 6105 addi sp,sp,32 + 228: 8082 ret + return -1; + 22a: 597d li s2,-1 + 22c: bfcd j 21e + +000000000000022e : + +int +atoi(const char *s) +{ + 22e: 1141 addi sp,sp,-16 + 230: e422 sd s0,8(sp) + 232: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 234: 00054683 lbu a3,0(a0) + 238: fd06879b addiw a5,a3,-48 + 23c: 0ff7f793 zext.b a5,a5 + 240: 4625 li a2,9 + 242: 02f66863 bltu a2,a5,272 + 246: 872a mv a4,a0 + n = 0; + 248: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 24a: 0705 addi a4,a4,1 + 24c: 0025179b slliw a5,a0,0x2 + 250: 9fa9 addw a5,a5,a0 + 252: 0017979b slliw a5,a5,0x1 + 256: 9fb5 addw a5,a5,a3 + 258: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 25c: 00074683 lbu a3,0(a4) + 260: fd06879b addiw a5,a3,-48 + 264: 0ff7f793 zext.b a5,a5 + 268: fef671e3 bgeu a2,a5,24a + return n; +} + 26c: 6422 ld s0,8(sp) + 26e: 0141 addi sp,sp,16 + 270: 8082 ret + n = 0; + 272: 4501 li a0,0 + 274: bfe5 j 26c + +0000000000000276 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 276: 1141 addi sp,sp,-16 + 278: e422 sd s0,8(sp) + 27a: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 27c: 02b57463 bgeu a0,a1,2a4 + while(n-- > 0) + 280: 00c05f63 blez a2,29e + 284: 1602 slli a2,a2,0x20 + 286: 9201 srli a2,a2,0x20 + 288: 00c507b3 add a5,a0,a2 + dst = vdst; + 28c: 872a mv a4,a0 + *dst++ = *src++; + 28e: 0585 addi a1,a1,1 + 290: 0705 addi a4,a4,1 + 292: fff5c683 lbu a3,-1(a1) + 296: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 29a: fef71ae3 bne a4,a5,28e + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 29e: 6422 ld s0,8(sp) + 2a0: 0141 addi sp,sp,16 + 2a2: 8082 ret + dst += n; + 2a4: 00c50733 add a4,a0,a2 + src += n; + 2a8: 95b2 add a1,a1,a2 + while(n-- > 0) + 2aa: fec05ae3 blez a2,29e + 2ae: fff6079b addiw a5,a2,-1 + 2b2: 1782 slli a5,a5,0x20 + 2b4: 9381 srli a5,a5,0x20 + 2b6: fff7c793 not a5,a5 + 2ba: 97ba add a5,a5,a4 + *--dst = *--src; + 2bc: 15fd addi a1,a1,-1 + 2be: 177d addi a4,a4,-1 + 2c0: 0005c683 lbu a3,0(a1) + 2c4: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2c8: fee79ae3 bne a5,a4,2bc + 2cc: bfc9 j 29e + +00000000000002ce : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2ce: 1141 addi sp,sp,-16 + 2d0: e422 sd s0,8(sp) + 2d2: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2d4: ca05 beqz a2,304 + 2d6: fff6069b addiw a3,a2,-1 + 2da: 1682 slli a3,a3,0x20 + 2dc: 9281 srli a3,a3,0x20 + 2de: 0685 addi a3,a3,1 + 2e0: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2e2: 00054783 lbu a5,0(a0) + 2e6: 0005c703 lbu a4,0(a1) + 2ea: 00e79863 bne a5,a4,2fa + return *p1 - *p2; + } + p1++; + 2ee: 0505 addi a0,a0,1 + p2++; + 2f0: 0585 addi a1,a1,1 + while (n-- > 0) { + 2f2: fed518e3 bne a0,a3,2e2 + } + return 0; + 2f6: 4501 li a0,0 + 2f8: a019 j 2fe + return *p1 - *p2; + 2fa: 40e7853b subw a0,a5,a4 +} + 2fe: 6422 ld s0,8(sp) + 300: 0141 addi sp,sp,16 + 302: 8082 ret + return 0; + 304: 4501 li a0,0 + 306: bfe5 j 2fe + +0000000000000308 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 308: 1141 addi sp,sp,-16 + 30a: e406 sd ra,8(sp) + 30c: e022 sd s0,0(sp) + 30e: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 310: f67ff0ef jal 276 +} + 314: 60a2 ld ra,8(sp) + 316: 6402 ld s0,0(sp) + 318: 0141 addi sp,sp,16 + 31a: 8082 ret + +000000000000031c : + +char * +sbrk(int 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 sys_sbrk(n, SBRK_EAGER); + 324: 4585 li a1,1 + 326: 0b2000ef jal 3d8 +} + 32a: 60a2 ld ra,8(sp) + 32c: 6402 ld s0,0(sp) + 32e: 0141 addi sp,sp,16 + 330: 8082 ret + +0000000000000332 : + +char * +sbrklazy(int n) { + 332: 1141 addi sp,sp,-16 + 334: e406 sd ra,8(sp) + 336: e022 sd s0,0(sp) + 338: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 33a: 4589 li a1,2 + 33c: 09c000ef jal 3d8 +} + 340: 60a2 ld ra,8(sp) + 342: 6402 ld s0,0(sp) + 344: 0141 addi sp,sp,16 + 346: 8082 ret + +0000000000000348 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 348: 4885 li a7,1 + ecall + 34a: 00000073 ecall + ret + 34e: 8082 ret + +0000000000000350 : +.global exit +exit: + li a7, SYS_exit + 350: 4889 li a7,2 + ecall + 352: 00000073 ecall + ret + 356: 8082 ret + +0000000000000358 : +.global wait +wait: + li a7, SYS_wait + 358: 488d li a7,3 + ecall + 35a: 00000073 ecall + ret + 35e: 8082 ret + +0000000000000360 : +.global pipe +pipe: + li a7, SYS_pipe + 360: 4891 li a7,4 + ecall + 362: 00000073 ecall + ret + 366: 8082 ret + +0000000000000368 : +.global read +read: + li a7, SYS_read + 368: 4895 li a7,5 + ecall + 36a: 00000073 ecall + ret + 36e: 8082 ret + +0000000000000370 : +.global write +write: + li a7, SYS_write + 370: 48c1 li a7,16 + ecall + 372: 00000073 ecall + ret + 376: 8082 ret + +0000000000000378 : +.global close +close: + li a7, SYS_close + 378: 48d5 li a7,21 + ecall + 37a: 00000073 ecall + ret + 37e: 8082 ret + +0000000000000380 : +.global kill +kill: + li a7, SYS_kill + 380: 4899 li a7,6 + ecall + 382: 00000073 ecall + ret + 386: 8082 ret + +0000000000000388 : +.global exec +exec: + li a7, SYS_exec + 388: 489d li a7,7 + ecall + 38a: 00000073 ecall + ret + 38e: 8082 ret + +0000000000000390 : +.global open +open: + li a7, SYS_open + 390: 48bd li a7,15 + ecall + 392: 00000073 ecall + ret + 396: 8082 ret + +0000000000000398 : +.global mknod +mknod: + li a7, SYS_mknod + 398: 48c5 li a7,17 + ecall + 39a: 00000073 ecall + ret + 39e: 8082 ret + +00000000000003a0 : +.global unlink +unlink: + li a7, SYS_unlink + 3a0: 48c9 li a7,18 + ecall + 3a2: 00000073 ecall + ret + 3a6: 8082 ret + +00000000000003a8 : +.global fstat +fstat: + li a7, SYS_fstat + 3a8: 48a1 li a7,8 + ecall + 3aa: 00000073 ecall + ret + 3ae: 8082 ret + +00000000000003b0 : +.global link +link: + li a7, SYS_link + 3b0: 48cd li a7,19 + ecall + 3b2: 00000073 ecall + ret + 3b6: 8082 ret + +00000000000003b8 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3b8: 48d1 li a7,20 + ecall + 3ba: 00000073 ecall + ret + 3be: 8082 ret + +00000000000003c0 : +.global chdir +chdir: + li a7, SYS_chdir + 3c0: 48a5 li a7,9 + ecall + 3c2: 00000073 ecall + ret + 3c6: 8082 ret + +00000000000003c8 : +.global dup +dup: + li a7, SYS_dup + 3c8: 48a9 li a7,10 + ecall + 3ca: 00000073 ecall + ret + 3ce: 8082 ret + +00000000000003d0 : +.global getpid +getpid: + li a7, SYS_getpid + 3d0: 48ad li a7,11 + ecall + 3d2: 00000073 ecall + ret + 3d6: 8082 ret + +00000000000003d8 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3d8: 48b1 li a7,12 + ecall + 3da: 00000073 ecall + ret + 3de: 8082 ret + +00000000000003e0 : +.global pause +pause: + li a7, SYS_pause + 3e0: 48b5 li a7,13 + ecall + 3e2: 00000073 ecall + ret + 3e6: 8082 ret + +00000000000003e8 : +.global uptime +uptime: + li a7, SYS_uptime + 3e8: 48b9 li a7,14 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 3f0: 1101 addi sp,sp,-32 + 3f2: ec06 sd ra,24(sp) + 3f4: e822 sd s0,16(sp) + 3f6: 1000 addi s0,sp,32 + 3f8: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3fc: 4605 li a2,1 + 3fe: fef40593 addi a1,s0,-17 + 402: f6fff0ef jal 370 +} + 406: 60e2 ld ra,24(sp) + 408: 6442 ld s0,16(sp) + 40a: 6105 addi sp,sp,32 + 40c: 8082 ret + +000000000000040e : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 40e: 715d addi sp,sp,-80 + 410: e486 sd ra,72(sp) + 412: e0a2 sd s0,64(sp) + 414: f84a sd s2,48(sp) + 416: 0880 addi s0,sp,80 + 418: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 41a: c299 beqz a3,420 + 41c: 0805c363 bltz a1,4a2 + neg = 0; + 420: 4881 li a7,0 + 422: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 426: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 428: 00000517 auipc a0,0x0 + 42c: 58850513 addi a0,a0,1416 # 9b0 + 430: 883e mv a6,a5 + 432: 2785 addiw a5,a5,1 + 434: 02c5f733 remu a4,a1,a2 + 438: 972a add a4,a4,a0 + 43a: 00074703 lbu a4,0(a4) + 43e: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 442: 872e mv a4,a1 + 444: 02c5d5b3 divu a1,a1,a2 + 448: 0685 addi a3,a3,1 + 44a: fec773e3 bgeu a4,a2,430 + if(neg) + 44e: 00088b63 beqz a7,464 + buf[i++] = '-'; + 452: fd078793 addi a5,a5,-48 + 456: 97a2 add a5,a5,s0 + 458: 02d00713 li a4,45 + 45c: fee78423 sb a4,-24(a5) + 460: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 464: 02f05a63 blez a5,498 + 468: fc26 sd s1,56(sp) + 46a: f44e sd s3,40(sp) + 46c: fb840713 addi a4,s0,-72 + 470: 00f704b3 add s1,a4,a5 + 474: fff70993 addi s3,a4,-1 + 478: 99be add s3,s3,a5 + 47a: 37fd addiw a5,a5,-1 + 47c: 1782 slli a5,a5,0x20 + 47e: 9381 srli a5,a5,0x20 + 480: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 484: fff4c583 lbu a1,-1(s1) + 488: 854a mv a0,s2 + 48a: f67ff0ef jal 3f0 + while(--i >= 0) + 48e: 14fd addi s1,s1,-1 + 490: ff349ae3 bne s1,s3,484 + 494: 74e2 ld s1,56(sp) + 496: 79a2 ld s3,40(sp) +} + 498: 60a6 ld ra,72(sp) + 49a: 6406 ld s0,64(sp) + 49c: 7942 ld s2,48(sp) + 49e: 6161 addi sp,sp,80 + 4a0: 8082 ret + x = -xx; + 4a2: 40b005b3 neg a1,a1 + neg = 1; + 4a6: 4885 li a7,1 + x = -xx; + 4a8: bfad j 422 + +00000000000004aa : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4aa: 711d addi sp,sp,-96 + 4ac: ec86 sd ra,88(sp) + 4ae: e8a2 sd s0,80(sp) + 4b0: e0ca sd s2,64(sp) + 4b2: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4b4: 0005c903 lbu s2,0(a1) + 4b8: 28090663 beqz s2,744 + 4bc: e4a6 sd s1,72(sp) + 4be: fc4e sd s3,56(sp) + 4c0: f852 sd s4,48(sp) + 4c2: f456 sd s5,40(sp) + 4c4: f05a sd s6,32(sp) + 4c6: ec5e sd s7,24(sp) + 4c8: e862 sd s8,16(sp) + 4ca: e466 sd s9,8(sp) + 4cc: 8b2a mv s6,a0 + 4ce: 8a2e mv s4,a1 + 4d0: 8bb2 mv s7,a2 + state = 0; + 4d2: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4d4: 4481 li s1,0 + 4d6: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4d8: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4dc: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4e0: 06c00c93 li s9,108 + 4e4: a005 j 504 + putc(fd, c0); + 4e6: 85ca mv a1,s2 + 4e8: 855a mv a0,s6 + 4ea: f07ff0ef jal 3f0 + 4ee: a019 j 4f4 + } else if(state == '%'){ + 4f0: 03598263 beq s3,s5,514 + for(i = 0; fmt[i]; i++){ + 4f4: 2485 addiw s1,s1,1 + 4f6: 8726 mv a4,s1 + 4f8: 009a07b3 add a5,s4,s1 + 4fc: 0007c903 lbu s2,0(a5) + 500: 22090a63 beqz s2,734 + c0 = fmt[i] & 0xff; + 504: 0009079b sext.w a5,s2 + if(state == 0){ + 508: fe0994e3 bnez s3,4f0 + if(c0 == '%'){ + 50c: fd579de3 bne a5,s5,4e6 + state = '%'; + 510: 89be mv s3,a5 + 512: b7cd j 4f4 + if(c0) c1 = fmt[i+1] & 0xff; + 514: 00ea06b3 add a3,s4,a4 + 518: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 51c: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 51e: c681 beqz a3,526 + 520: 9752 add a4,a4,s4 + 522: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 526: 05878363 beq a5,s8,56c + } else if(c0 == 'l' && c1 == 'd'){ + 52a: 05978d63 beq a5,s9,584 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 52e: 07500713 li a4,117 + 532: 0ee78763 beq a5,a4,620 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 536: 07800713 li a4,120 + 53a: 12e78963 beq a5,a4,66c + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 53e: 07000713 li a4,112 + 542: 14e78e63 beq a5,a4,69e + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 546: 06300713 li a4,99 + 54a: 18e78e63 beq a5,a4,6e6 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 54e: 07300713 li a4,115 + 552: 1ae78463 beq a5,a4,6fa + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 556: 02500713 li a4,37 + 55a: 04e79563 bne a5,a4,5a4 + putc(fd, '%'); + 55e: 02500593 li a1,37 + 562: 855a mv a0,s6 + 564: e8dff0ef jal 3f0 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 568: 4981 li s3,0 + 56a: b769 j 4f4 + printint(fd, va_arg(ap, int), 10, 1); + 56c: 008b8913 addi s2,s7,8 + 570: 4685 li a3,1 + 572: 4629 li a2,10 + 574: 000ba583 lw a1,0(s7) + 578: 855a mv a0,s6 + 57a: e95ff0ef jal 40e + 57e: 8bca mv s7,s2 + state = 0; + 580: 4981 li s3,0 + 582: bf8d j 4f4 + } else if(c0 == 'l' && c1 == 'd'){ + 584: 06400793 li a5,100 + 588: 02f68963 beq a3,a5,5ba + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 58c: 06c00793 li a5,108 + 590: 04f68263 beq a3,a5,5d4 + } else if(c0 == 'l' && c1 == 'u'){ + 594: 07500793 li a5,117 + 598: 0af68063 beq a3,a5,638 + } else if(c0 == 'l' && c1 == 'x'){ + 59c: 07800793 li a5,120 + 5a0: 0ef68263 beq a3,a5,684 + putc(fd, '%'); + 5a4: 02500593 li a1,37 + 5a8: 855a mv a0,s6 + 5aa: e47ff0ef jal 3f0 + putc(fd, c0); + 5ae: 85ca mv a1,s2 + 5b0: 855a mv a0,s6 + 5b2: e3fff0ef jal 3f0 + state = 0; + 5b6: 4981 li s3,0 + 5b8: bf35 j 4f4 + printint(fd, va_arg(ap, uint64), 10, 1); + 5ba: 008b8913 addi s2,s7,8 + 5be: 4685 li a3,1 + 5c0: 4629 li a2,10 + 5c2: 000bb583 ld a1,0(s7) + 5c6: 855a mv a0,s6 + 5c8: e47ff0ef jal 40e + i += 1; + 5cc: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5ce: 8bca mv s7,s2 + state = 0; + 5d0: 4981 li s3,0 + i += 1; + 5d2: b70d j 4f4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5d4: 06400793 li a5,100 + 5d8: 02f60763 beq a2,a5,606 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5dc: 07500793 li a5,117 + 5e0: 06f60963 beq a2,a5,652 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5e4: 07800793 li a5,120 + 5e8: faf61ee3 bne a2,a5,5a4 + printint(fd, va_arg(ap, uint64), 16, 0); + 5ec: 008b8913 addi s2,s7,8 + 5f0: 4681 li a3,0 + 5f2: 4641 li a2,16 + 5f4: 000bb583 ld a1,0(s7) + 5f8: 855a mv a0,s6 + 5fa: e15ff0ef jal 40e + i += 2; + 5fe: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 600: 8bca mv s7,s2 + state = 0; + 602: 4981 li s3,0 + i += 2; + 604: bdc5 j 4f4 + printint(fd, va_arg(ap, uint64), 10, 1); + 606: 008b8913 addi s2,s7,8 + 60a: 4685 li a3,1 + 60c: 4629 li a2,10 + 60e: 000bb583 ld a1,0(s7) + 612: 855a mv a0,s6 + 614: dfbff0ef jal 40e + i += 2; + 618: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 61a: 8bca mv s7,s2 + state = 0; + 61c: 4981 li s3,0 + i += 2; + 61e: bdd9 j 4f4 + printint(fd, va_arg(ap, uint32), 10, 0); + 620: 008b8913 addi s2,s7,8 + 624: 4681 li a3,0 + 626: 4629 li a2,10 + 628: 000be583 lwu a1,0(s7) + 62c: 855a mv a0,s6 + 62e: de1ff0ef jal 40e + 632: 8bca mv s7,s2 + state = 0; + 634: 4981 li s3,0 + 636: bd7d j 4f4 + printint(fd, va_arg(ap, uint64), 10, 0); + 638: 008b8913 addi s2,s7,8 + 63c: 4681 li a3,0 + 63e: 4629 li a2,10 + 640: 000bb583 ld a1,0(s7) + 644: 855a mv a0,s6 + 646: dc9ff0ef jal 40e + i += 1; + 64a: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 64c: 8bca mv s7,s2 + state = 0; + 64e: 4981 li s3,0 + i += 1; + 650: b555 j 4f4 + printint(fd, va_arg(ap, uint64), 10, 0); + 652: 008b8913 addi s2,s7,8 + 656: 4681 li a3,0 + 658: 4629 li a2,10 + 65a: 000bb583 ld a1,0(s7) + 65e: 855a mv a0,s6 + 660: dafff0ef jal 40e + i += 2; + 664: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 666: 8bca mv s7,s2 + state = 0; + 668: 4981 li s3,0 + i += 2; + 66a: b569 j 4f4 + printint(fd, va_arg(ap, uint32), 16, 0); + 66c: 008b8913 addi s2,s7,8 + 670: 4681 li a3,0 + 672: 4641 li a2,16 + 674: 000be583 lwu a1,0(s7) + 678: 855a mv a0,s6 + 67a: d95ff0ef jal 40e + 67e: 8bca mv s7,s2 + state = 0; + 680: 4981 li s3,0 + 682: bd8d j 4f4 + printint(fd, va_arg(ap, uint64), 16, 0); + 684: 008b8913 addi s2,s7,8 + 688: 4681 li a3,0 + 68a: 4641 li a2,16 + 68c: 000bb583 ld a1,0(s7) + 690: 855a mv a0,s6 + 692: d7dff0ef jal 40e + i += 1; + 696: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 698: 8bca mv s7,s2 + state = 0; + 69a: 4981 li s3,0 + i += 1; + 69c: bda1 j 4f4 + 69e: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 6a0: 008b8d13 addi s10,s7,8 + 6a4: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6a8: 03000593 li a1,48 + 6ac: 855a mv a0,s6 + 6ae: d43ff0ef jal 3f0 + putc(fd, 'x'); + 6b2: 07800593 li a1,120 + 6b6: 855a mv a0,s6 + 6b8: d39ff0ef jal 3f0 + 6bc: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6be: 00000b97 auipc s7,0x0 + 6c2: 2f2b8b93 addi s7,s7,754 # 9b0 + 6c6: 03c9d793 srli a5,s3,0x3c + 6ca: 97de add a5,a5,s7 + 6cc: 0007c583 lbu a1,0(a5) + 6d0: 855a mv a0,s6 + 6d2: d1fff0ef jal 3f0 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6d6: 0992 slli s3,s3,0x4 + 6d8: 397d addiw s2,s2,-1 + 6da: fe0916e3 bnez s2,6c6 + printptr(fd, va_arg(ap, uint64)); + 6de: 8bea mv s7,s10 + state = 0; + 6e0: 4981 li s3,0 + 6e2: 6d02 ld s10,0(sp) + 6e4: bd01 j 4f4 + putc(fd, va_arg(ap, uint32)); + 6e6: 008b8913 addi s2,s7,8 + 6ea: 000bc583 lbu a1,0(s7) + 6ee: 855a mv a0,s6 + 6f0: d01ff0ef jal 3f0 + 6f4: 8bca mv s7,s2 + state = 0; + 6f6: 4981 li s3,0 + 6f8: bbf5 j 4f4 + if((s = va_arg(ap, char*)) == 0) + 6fa: 008b8993 addi s3,s7,8 + 6fe: 000bb903 ld s2,0(s7) + 702: 00090f63 beqz s2,720 + for(; *s; s++) + 706: 00094583 lbu a1,0(s2) + 70a: c195 beqz a1,72e + putc(fd, *s); + 70c: 855a mv a0,s6 + 70e: ce3ff0ef jal 3f0 + for(; *s; s++) + 712: 0905 addi s2,s2,1 + 714: 00094583 lbu a1,0(s2) + 718: f9f5 bnez a1,70c + if((s = va_arg(ap, char*)) == 0) + 71a: 8bce mv s7,s3 + state = 0; + 71c: 4981 li s3,0 + 71e: bbd9 j 4f4 + s = "(null)"; + 720: 00000917 auipc s2,0x0 + 724: 28890913 addi s2,s2,648 # 9a8 + for(; *s; s++) + 728: 02800593 li a1,40 + 72c: b7c5 j 70c + if((s = va_arg(ap, char*)) == 0) + 72e: 8bce mv s7,s3 + state = 0; + 730: 4981 li s3,0 + 732: b3c9 j 4f4 + 734: 64a6 ld s1,72(sp) + 736: 79e2 ld s3,56(sp) + 738: 7a42 ld s4,48(sp) + 73a: 7aa2 ld s5,40(sp) + 73c: 7b02 ld s6,32(sp) + 73e: 6be2 ld s7,24(sp) + 740: 6c42 ld s8,16(sp) + 742: 6ca2 ld s9,8(sp) + } + } +} + 744: 60e6 ld ra,88(sp) + 746: 6446 ld s0,80(sp) + 748: 6906 ld s2,64(sp) + 74a: 6125 addi sp,sp,96 + 74c: 8082 ret + +000000000000074e : + +void +fprintf(int fd, const char *fmt, ...) +{ + 74e: 715d addi sp,sp,-80 + 750: ec06 sd ra,24(sp) + 752: e822 sd s0,16(sp) + 754: 1000 addi s0,sp,32 + 756: e010 sd a2,0(s0) + 758: e414 sd a3,8(s0) + 75a: e818 sd a4,16(s0) + 75c: ec1c sd a5,24(s0) + 75e: 03043023 sd a6,32(s0) + 762: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 766: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 76a: 8622 mv a2,s0 + 76c: d3fff0ef jal 4aa +} + 770: 60e2 ld ra,24(sp) + 772: 6442 ld s0,16(sp) + 774: 6161 addi sp,sp,80 + 776: 8082 ret + +0000000000000778 : + +void +printf(const char *fmt, ...) +{ + 778: 711d addi sp,sp,-96 + 77a: ec06 sd ra,24(sp) + 77c: e822 sd s0,16(sp) + 77e: 1000 addi s0,sp,32 + 780: e40c sd a1,8(s0) + 782: e810 sd a2,16(s0) + 784: ec14 sd a3,24(s0) + 786: f018 sd a4,32(s0) + 788: f41c sd a5,40(s0) + 78a: 03043823 sd a6,48(s0) + 78e: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 792: 00840613 addi a2,s0,8 + 796: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 79a: 85aa mv a1,a0 + 79c: 4505 li a0,1 + 79e: d0dff0ef jal 4aa +} + 7a2: 60e2 ld ra,24(sp) + 7a4: 6442 ld s0,16(sp) + 7a6: 6125 addi sp,sp,96 + 7a8: 8082 ret + +00000000000007aa : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7aa: 1141 addi sp,sp,-16 + 7ac: e422 sd s0,8(sp) + 7ae: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7b0: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7b4: 00001797 auipc a5,0x1 + 7b8: 85c7b783 ld a5,-1956(a5) # 1010 + 7bc: a02d j 7e6 + 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; + 7be: 4618 lw a4,8(a2) + 7c0: 9f2d addw a4,a4,a1 + 7c2: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7c6: 6398 ld a4,0(a5) + 7c8: 6310 ld a2,0(a4) + 7ca: a83d j 808 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7cc: ff852703 lw a4,-8(a0) + 7d0: 9f31 addw a4,a4,a2 + 7d2: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7d4: ff053683 ld a3,-16(a0) + 7d8: a091 j 81c + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7da: 6398 ld a4,0(a5) + 7dc: 00e7e463 bltu a5,a4,7e4 + 7e0: 00e6ea63 bltu a3,a4,7f4 +{ + 7e4: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7e6: fed7fae3 bgeu a5,a3,7da + 7ea: 6398 ld a4,0(a5) + 7ec: 00e6e463 bltu a3,a4,7f4 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7f0: fee7eae3 bltu a5,a4,7e4 + if(bp + bp->s.size == p->s.ptr){ + 7f4: ff852583 lw a1,-8(a0) + 7f8: 6390 ld a2,0(a5) + 7fa: 02059813 slli a6,a1,0x20 + 7fe: 01c85713 srli a4,a6,0x1c + 802: 9736 add a4,a4,a3 + 804: fae60de3 beq a2,a4,7be + bp->s.ptr = p->s.ptr->s.ptr; + 808: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 80c: 4790 lw a2,8(a5) + 80e: 02061593 slli a1,a2,0x20 + 812: 01c5d713 srli a4,a1,0x1c + 816: 973e add a4,a4,a5 + 818: fae68ae3 beq a3,a4,7cc + p->s.ptr = bp->s.ptr; + 81c: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 81e: 00000717 auipc a4,0x0 + 822: 7ef73923 sd a5,2034(a4) # 1010 +} + 826: 6422 ld s0,8(sp) + 828: 0141 addi sp,sp,16 + 82a: 8082 ret + +000000000000082c : + return freep; +} + +void* +malloc(uint nbytes) +{ + 82c: 7139 addi sp,sp,-64 + 82e: fc06 sd ra,56(sp) + 830: f822 sd s0,48(sp) + 832: f426 sd s1,40(sp) + 834: ec4e sd s3,24(sp) + 836: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 838: 02051493 slli s1,a0,0x20 + 83c: 9081 srli s1,s1,0x20 + 83e: 04bd addi s1,s1,15 + 840: 8091 srli s1,s1,0x4 + 842: 0014899b addiw s3,s1,1 + 846: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 848: 00000517 auipc a0,0x0 + 84c: 7c853503 ld a0,1992(a0) # 1010 + 850: c915 beqz a0,884 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + 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: 08977a63 bgeu a4,s1,8ea + 85a: f04a sd s2,32(sp) + 85c: e852 sd s4,16(sp) + 85e: e456 sd s5,8(sp) + 860: e05a sd s6,0(sp) + if(nu < 4096) + 862: 8a4e mv s4,s3 + 864: 0009871b sext.w a4,s3 + 868: 6685 lui a3,0x1 + 86a: 00d77363 bgeu a4,a3,870 + 86e: 6a05 lui s4,0x1 + 870: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 874: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 878: 00000917 auipc s2,0x0 + 87c: 79890913 addi s2,s2,1944 # 1010 + if(p == SBRK_ERROR) + 880: 5afd li s5,-1 + 882: a081 j 8c2 + 884: f04a sd s2,32(sp) + 886: e852 sd s4,16(sp) + 888: e456 sd s5,8(sp) + 88a: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 88c: 00000797 auipc a5,0x0 + 890: 79478793 addi a5,a5,1940 # 1020 + 894: 00000717 auipc a4,0x0 + 898: 76f73e23 sd a5,1916(a4) # 1010 + 89c: e39c sd a5,0(a5) + base.s.size = 0; + 89e: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 8a2: b7c1 j 862 + prevp->s.ptr = p->s.ptr; + 8a4: 6398 ld a4,0(a5) + 8a6: e118 sd a4,0(a0) + 8a8: a8a9 j 902 + hp->s.size = nu; + 8aa: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8ae: 0541 addi a0,a0,16 + 8b0: efbff0ef jal 7aa + return freep; + 8b4: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8b8: c12d beqz a0,91a + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8ba: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8bc: 4798 lw a4,8(a5) + 8be: 02977263 bgeu a4,s1,8e2 + if(p == freep) + 8c2: 00093703 ld a4,0(s2) + 8c6: 853e mv a0,a5 + 8c8: fef719e3 bne a4,a5,8ba + p = sbrk(nu * sizeof(Header)); + 8cc: 8552 mv a0,s4 + 8ce: a4fff0ef jal 31c + if(p == SBRK_ERROR) + 8d2: fd551ce3 bne a0,s5,8aa + return 0; + 8d6: 4501 li a0,0 + 8d8: 7902 ld s2,32(sp) + 8da: 6a42 ld s4,16(sp) + 8dc: 6aa2 ld s5,8(sp) + 8de: 6b02 ld s6,0(sp) + 8e0: a03d j 90e + 8e2: 7902 ld s2,32(sp) + 8e4: 6a42 ld s4,16(sp) + 8e6: 6aa2 ld s5,8(sp) + 8e8: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 8ea: fae48de3 beq s1,a4,8a4 + p->s.size -= nunits; + 8ee: 4137073b subw a4,a4,s3 + 8f2: c798 sw a4,8(a5) + p += p->s.size; + 8f4: 02071693 slli a3,a4,0x20 + 8f8: 01c6d713 srli a4,a3,0x1c + 8fc: 97ba add a5,a5,a4 + p->s.size = nunits; + 8fe: 0137a423 sw s3,8(a5) + freep = prevp; + 902: 00000717 auipc a4,0x0 + 906: 70a73723 sd a0,1806(a4) # 1010 + return (void*)(p + 1); + 90a: 01078513 addi a0,a5,16 + } +} + 90e: 70e2 ld ra,56(sp) + 910: 7442 ld s0,48(sp) + 912: 74a2 ld s1,40(sp) + 914: 69e2 ld s3,24(sp) + 916: 6121 addi sp,sp,64 + 918: 8082 ret + 91a: 7902 ld s2,32(sp) + 91c: 6a42 ld s4,16(sp) + 91e: 6aa2 ld s5,8(sp) + 920: 6b02 ld s6,0(sp) + 922: b7f5 j 90e diff --git a/G12_Project2_2/user/init.c b/G12_Project2_2/user/init.c new file mode 100644 index 0000000000..e0a5689524 --- /dev/null +++ b/G12_Project2_2/user/init.c @@ -0,0 +1,54 @@ +// init: The initial user-level program + +#include "kernel/types.h" +#include "kernel/stat.h" +#include "kernel/spinlock.h" +#include "kernel/sleeplock.h" +#include "kernel/fs.h" +#include "kernel/file.h" +#include "user/user.h" +#include "kernel/fcntl.h" + +char *argv[] = { "sh", 0 }; + +int +main(void) +{ + int pid, wpid; + + if(open("console", O_RDWR) < 0){ + mknod("console", CONSOLE, 0); + open("console", O_RDWR); + } + dup(0); // stdout + dup(0); // stderr + + for(;;){ + printf("init: starting sh\n"); + pid = fork(); + if(pid < 0){ + printf("init: fork failed\n"); + exit(1); + } + if(pid == 0){ + exec("sh", 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. + } + } + } +} diff --git a/G12_Project2_2/user/init.d b/G12_Project2_2/user/init.d new file mode 100644 index 0000000000..82d3c33fd5 --- /dev/null +++ b/G12_Project2_2/user/init.d @@ -0,0 +1,2 @@ +user/init.o: user/init.c kernel/types.h kernel/stat.h kernel/spinlock.h \ + kernel/sleeplock.h kernel/fs.h kernel/file.h user/user.h kernel/fcntl.h diff --git a/G12_Project2_2/user/init.o b/G12_Project2_2/user/init.o new file mode 100644 index 0000000000..f5155ebad1 Binary files /dev/null and b/G12_Project2_2/user/init.o differ diff --git a/G12_Project2_2/user/init.sym b/G12_Project2_2/user/init.sym new file mode 100644 index 0000000000..acf95a01c6 --- /dev/null +++ b/G12_Project2_2/user/init.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000928 .rodata +00000000000009c8 .eh_frame +0000000000001000 .data +0000000000001010 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 init.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +00000000000003f0 putc +000000000000040e printint +00000000000009b0 digits +0000000000000000 umalloc.c +0000000000001010 freep +0000000000001020 base +00000000000000cc strcpy +00000000000003e0 pause +0000000000000778 printf +00000000000003d8 sys_sbrk +0000000000001000 argv +0000000000000276 memmove +0000000000000398 mknod +0000000000000184 gets +00000000000003d0 getpid +0000000000000308 memcpy +000000000000082c malloc +0000000000000332 sbrklazy +0000000000000360 pipe +0000000000000370 write +00000000000003a8 fstat +000000000000074e fprintf +0000000000000380 kill +00000000000004aa vprintf +00000000000003c0 chdir +0000000000000388 exec +0000000000000358 wait +0000000000000368 read +00000000000003a0 unlink +00000000000002ce memcmp +0000000000000348 fork +000000000000031c sbrk +00000000000003e8 uptime +000000000000013e memset +0000000000000000 main +00000000000000e8 strcmp +00000000000003c8 dup +00000000000001f4 stat +00000000000003b0 link +0000000000000350 exit +00000000000000bc start +000000000000022e atoi +0000000000000114 strlen +0000000000000390 open +0000000000000160 strchr +00000000000003b8 mkdir +0000000000000378 close +00000000000007aa free diff --git a/G12_Project2_2/user/kill.asm b/G12_Project2_2/user/kill.asm new file mode 100644 index 0000000000..08bb3fc795 --- /dev/null +++ b/G12_Project2_2/user/kill.asm @@ -0,0 +1,1497 @@ + +user/_kill: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/stat.h" +#include "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: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + 8: 4785 li a5,1 + a: 02a7d963 bge a5,a0,3c + e: e426 sd s1,8(sp) + 10: e04a sd s2,0(sp) + 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 + 2c: 2ec000ef jal 318 + for(i=1; i + exit(0); + 36: 4501 li a0,0 + 38: 2b0000ef jal 2e8 + 3c: e426 sd s1,8(sp) + 3e: e04a sd s2,0(sp) + fprintf(2, "usage: kill pid...\n"); + 40: 00001597 auipc a1,0x1 + 44: 88058593 addi a1,a1,-1920 # 8c0 + 48: 4509 li a0,2 + 4a: 69c000ef jal 6e6 + exit(1); + 4e: 4505 li a0,1 + 50: 298000ef jal 2e8 + +0000000000000054 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 54: 1141 addi sp,sp,-16 + 56: e406 sd ra,8(sp) + 58: e022 sd s0,0(sp) + 5a: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 5c: fa5ff0ef jal 0
+ exit(r); + 60: 288000ef jal 2e8 + +0000000000000064 : +} + +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 + ; + return os; +} + 7a: 6422 ld s0,8(sp) + 7c: 0141 addi sp,sp,16 + 7e: 8082 ret + +0000000000000080 : + +int +strcmp(const char *p, const char *q) +{ + 80: 1141 addi sp,sp,-16 + 82: e422 sd s0,8(sp) + 84: 0800 addi s0,sp,16 + while(*p && *p == *q) + 86: 00054783 lbu a5,0(a0) + 8a: cb91 beqz a5,9e + 8c: 0005c703 lbu a4,0(a1) + 90: 00f71763 bne a4,a5,9e + p++, q++; + 94: 0505 addi a0,a0,1 + 96: 0585 addi a1,a1,1 + while(*p && *p == *q) + 98: 00054783 lbu a5,0(a0) + 9c: fbe5 bnez a5,8c + return (uchar)*p - (uchar)*q; + 9e: 0005c503 lbu a0,0(a1) +} + a2: 40a7853b subw a0,a5,a0 + a6: 6422 ld s0,8(sp) + a8: 0141 addi sp,sp,16 + aa: 8082 ret + +00000000000000ac : + +uint +strlen(const char *s) +{ + ac: 1141 addi sp,sp,-16 + ae: e422 sd s0,8(sp) + b0: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + b2: 00054783 lbu a5,0(a0) + b6: cf91 beqz a5,d2 + b8: 0505 addi a0,a0,1 + ba: 87aa mv a5,a0 + bc: 86be mv a3,a5 + be: 0785 addi a5,a5,1 + c0: fff7c703 lbu a4,-1(a5) + c4: ff65 bnez a4,bc + c6: 40a6853b subw a0,a3,a0 + ca: 2505 addiw a0,a0,1 + ; + return n; +} + cc: 6422 ld s0,8(sp) + ce: 0141 addi sp,sp,16 + d0: 8082 ret + for(n = 0; s[n]; n++) + d2: 4501 li a0,0 + d4: bfe5 j cc + +00000000000000d6 : + +void* +memset(void *dst, int c, uint n) +{ + d6: 1141 addi sp,sp,-16 + d8: e422 sd s0,8(sp) + da: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + dc: ca19 beqz a2,f2 + de: 87aa mv a5,a0 + e0: 1602 slli a2,a2,0x20 + e2: 9201 srli a2,a2,0x20 + e4: 00a60733 add a4,a2,a0 + cdst[i] = c; + e8: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + ec: 0785 addi a5,a5,1 + ee: fee79de3 bne a5,a4,e8 + } + return dst; +} + f2: 6422 ld s0,8(sp) + f4: 0141 addi sp,sp,16 + f6: 8082 ret + +00000000000000f8 : + +char* +strchr(const char *s, char c) +{ + f8: 1141 addi sp,sp,-16 + fa: e422 sd s0,8(sp) + fc: 0800 addi s0,sp,16 + for(; *s; s++) + fe: 00054783 lbu a5,0(a0) + 102: cb99 beqz a5,118 + if(*s == c) + 104: 00f58763 beq a1,a5,112 + for(; *s; s++) + 108: 0505 addi a0,a0,1 + 10a: 00054783 lbu a5,0(a0) + 10e: fbfd bnez a5,104 + return (char*)s; + return 0; + 110: 4501 li a0,0 +} + 112: 6422 ld s0,8(sp) + 114: 0141 addi sp,sp,16 + 116: 8082 ret + return 0; + 118: 4501 li a0,0 + 11a: bfe5 j 112 + +000000000000011c : + +char* +gets(char *buf, int max) +{ + 11c: 711d addi sp,sp,-96 + 11e: ec86 sd ra,88(sp) + 120: e8a2 sd s0,80(sp) + 122: e4a6 sd s1,72(sp) + 124: e0ca sd s2,64(sp) + 126: fc4e sd s3,56(sp) + 128: f852 sd s4,48(sp) + 12a: f456 sd s5,40(sp) + 12c: f05a sd s6,32(sp) + 12e: ec5e sd s7,24(sp) + 130: 1080 addi s0,sp,96 + 132: 8baa mv s7,a0 + 134: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 136: 892a mv s2,a0 + 138: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 13a: 4aa9 li s5,10 + 13c: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 13e: 89a6 mv s3,s1 + 140: 2485 addiw s1,s1,1 + 142: 0344d663 bge s1,s4,16e + cc = read(0, &c, 1); + 146: 4605 li a2,1 + 148: faf40593 addi a1,s0,-81 + 14c: 4501 li a0,0 + 14e: 1b2000ef jal 300 + if(cc < 1) + 152: 00a05e63 blez a0,16e + buf[i++] = c; + 156: faf44783 lbu a5,-81(s0) + 15a: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 15e: 01578763 beq a5,s5,16c + 162: 0905 addi s2,s2,1 + 164: fd679de3 bne a5,s6,13e + buf[i++] = c; + 168: 89a6 mv s3,s1 + 16a: a011 j 16e + 16c: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 16e: 99de add s3,s3,s7 + 170: 00098023 sb zero,0(s3) + return buf; +} + 174: 855e mv a0,s7 + 176: 60e6 ld ra,88(sp) + 178: 6446 ld s0,80(sp) + 17a: 64a6 ld s1,72(sp) + 17c: 6906 ld s2,64(sp) + 17e: 79e2 ld s3,56(sp) + 180: 7a42 ld s4,48(sp) + 182: 7aa2 ld s5,40(sp) + 184: 7b02 ld s6,32(sp) + 186: 6be2 ld s7,24(sp) + 188: 6125 addi sp,sp,96 + 18a: 8082 ret + +000000000000018c : + +int +stat(const char *n, struct stat *st) +{ + 18c: 1101 addi sp,sp,-32 + 18e: ec06 sd ra,24(sp) + 190: e822 sd s0,16(sp) + 192: e04a sd s2,0(sp) + 194: 1000 addi s0,sp,32 + 196: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 198: 4581 li a1,0 + 19a: 18e000ef jal 328 + if(fd < 0) + 19e: 02054263 bltz a0,1c2 + 1a2: e426 sd s1,8(sp) + 1a4: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1a6: 85ca mv a1,s2 + 1a8: 198000ef jal 340 + 1ac: 892a mv s2,a0 + close(fd); + 1ae: 8526 mv a0,s1 + 1b0: 160000ef jal 310 + return r; + 1b4: 64a2 ld s1,8(sp) +} + 1b6: 854a mv a0,s2 + 1b8: 60e2 ld ra,24(sp) + 1ba: 6442 ld s0,16(sp) + 1bc: 6902 ld s2,0(sp) + 1be: 6105 addi sp,sp,32 + 1c0: 8082 ret + return -1; + 1c2: 597d li s2,-1 + 1c4: bfcd j 1b6 + +00000000000001c6 : + +int +atoi(const char *s) +{ + 1c6: 1141 addi sp,sp,-16 + 1c8: e422 sd s0,8(sp) + 1ca: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1cc: 00054683 lbu a3,0(a0) + 1d0: fd06879b addiw a5,a3,-48 + 1d4: 0ff7f793 zext.b a5,a5 + 1d8: 4625 li a2,9 + 1da: 02f66863 bltu a2,a5,20a + 1de: 872a mv a4,a0 + n = 0; + 1e0: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1e2: 0705 addi a4,a4,1 + 1e4: 0025179b slliw a5,a0,0x2 + 1e8: 9fa9 addw a5,a5,a0 + 1ea: 0017979b slliw a5,a5,0x1 + 1ee: 9fb5 addw a5,a5,a3 + 1f0: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1f4: 00074683 lbu a3,0(a4) + 1f8: fd06879b addiw a5,a3,-48 + 1fc: 0ff7f793 zext.b a5,a5 + 200: fef671e3 bgeu a2,a5,1e2 + return n; +} + 204: 6422 ld s0,8(sp) + 206: 0141 addi sp,sp,16 + 208: 8082 ret + n = 0; + 20a: 4501 li a0,0 + 20c: bfe5 j 204 + +000000000000020e : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 20e: 1141 addi sp,sp,-16 + 210: e422 sd s0,8(sp) + 212: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 214: 02b57463 bgeu a0,a1,23c + while(n-- > 0) + 218: 00c05f63 blez a2,236 + 21c: 1602 slli a2,a2,0x20 + 21e: 9201 srli a2,a2,0x20 + 220: 00c507b3 add a5,a0,a2 + dst = vdst; + 224: 872a mv a4,a0 + *dst++ = *src++; + 226: 0585 addi a1,a1,1 + 228: 0705 addi a4,a4,1 + 22a: fff5c683 lbu a3,-1(a1) + 22e: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 232: fef71ae3 bne a4,a5,226 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 236: 6422 ld s0,8(sp) + 238: 0141 addi sp,sp,16 + 23a: 8082 ret + dst += n; + 23c: 00c50733 add a4,a0,a2 + src += n; + 240: 95b2 add a1,a1,a2 + while(n-- > 0) + 242: fec05ae3 blez a2,236 + 246: fff6079b addiw a5,a2,-1 + 24a: 1782 slli a5,a5,0x20 + 24c: 9381 srli a5,a5,0x20 + 24e: fff7c793 not a5,a5 + 252: 97ba add a5,a5,a4 + *--dst = *--src; + 254: 15fd addi a1,a1,-1 + 256: 177d addi a4,a4,-1 + 258: 0005c683 lbu a3,0(a1) + 25c: 00d70023 sb a3,0(a4) + while(n-- > 0) + 260: fee79ae3 bne a5,a4,254 + 264: bfc9 j 236 + +0000000000000266 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 266: 1141 addi sp,sp,-16 + 268: e422 sd s0,8(sp) + 26a: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 26c: ca05 beqz a2,29c + 26e: fff6069b addiw a3,a2,-1 + 272: 1682 slli a3,a3,0x20 + 274: 9281 srli a3,a3,0x20 + 276: 0685 addi a3,a3,1 + 278: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 27a: 00054783 lbu a5,0(a0) + 27e: 0005c703 lbu a4,0(a1) + 282: 00e79863 bne a5,a4,292 + return *p1 - *p2; + } + p1++; + 286: 0505 addi a0,a0,1 + p2++; + 288: 0585 addi a1,a1,1 + while (n-- > 0) { + 28a: fed518e3 bne a0,a3,27a + } + return 0; + 28e: 4501 li a0,0 + 290: a019 j 296 + return *p1 - *p2; + 292: 40e7853b subw a0,a5,a4 +} + 296: 6422 ld s0,8(sp) + 298: 0141 addi sp,sp,16 + 29a: 8082 ret + return 0; + 29c: 4501 li a0,0 + 29e: bfe5 j 296 + +00000000000002a0 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2a0: 1141 addi sp,sp,-16 + 2a2: e406 sd ra,8(sp) + 2a4: e022 sd s0,0(sp) + 2a6: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2a8: f67ff0ef jal 20e +} + 2ac: 60a2 ld ra,8(sp) + 2ae: 6402 ld s0,0(sp) + 2b0: 0141 addi sp,sp,16 + 2b2: 8082 ret + +00000000000002b4 : + +char * +sbrk(int n) { + 2b4: 1141 addi sp,sp,-16 + 2b6: e406 sd ra,8(sp) + 2b8: e022 sd s0,0(sp) + 2ba: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2bc: 4585 li a1,1 + 2be: 0b2000ef jal 370 +} + 2c2: 60a2 ld ra,8(sp) + 2c4: 6402 ld s0,0(sp) + 2c6: 0141 addi sp,sp,16 + 2c8: 8082 ret + +00000000000002ca : + +char * +sbrklazy(int n) { + 2ca: 1141 addi sp,sp,-16 + 2cc: e406 sd ra,8(sp) + 2ce: e022 sd s0,0(sp) + 2d0: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2d2: 4589 li a1,2 + 2d4: 09c000ef jal 370 +} + 2d8: 60a2 ld ra,8(sp) + 2da: 6402 ld s0,0(sp) + 2dc: 0141 addi sp,sp,16 + 2de: 8082 ret + +00000000000002e0 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2e0: 4885 li a7,1 + ecall + 2e2: 00000073 ecall + ret + 2e6: 8082 ret + +00000000000002e8 : +.global exit +exit: + li a7, SYS_exit + 2e8: 4889 li a7,2 + ecall + 2ea: 00000073 ecall + ret + 2ee: 8082 ret + +00000000000002f0 : +.global wait +wait: + li a7, SYS_wait + 2f0: 488d li a7,3 + ecall + 2f2: 00000073 ecall + ret + 2f6: 8082 ret + +00000000000002f8 : +.global pipe +pipe: + li a7, SYS_pipe + 2f8: 4891 li a7,4 + ecall + 2fa: 00000073 ecall + ret + 2fe: 8082 ret + +0000000000000300 : +.global read +read: + li a7, SYS_read + 300: 4895 li a7,5 + ecall + 302: 00000073 ecall + ret + 306: 8082 ret + +0000000000000308 : +.global write +write: + li a7, SYS_write + 308: 48c1 li a7,16 + ecall + 30a: 00000073 ecall + ret + 30e: 8082 ret + +0000000000000310 : +.global close +close: + li a7, SYS_close + 310: 48d5 li a7,21 + ecall + 312: 00000073 ecall + ret + 316: 8082 ret + +0000000000000318 : +.global kill +kill: + li a7, SYS_kill + 318: 4899 li a7,6 + ecall + 31a: 00000073 ecall + ret + 31e: 8082 ret + +0000000000000320 : +.global exec +exec: + li a7, SYS_exec + 320: 489d li a7,7 + ecall + 322: 00000073 ecall + ret + 326: 8082 ret + +0000000000000328 : +.global open +open: + li a7, SYS_open + 328: 48bd li a7,15 + ecall + 32a: 00000073 ecall + ret + 32e: 8082 ret + +0000000000000330 : +.global mknod +mknod: + li a7, SYS_mknod + 330: 48c5 li a7,17 + ecall + 332: 00000073 ecall + ret + 336: 8082 ret + +0000000000000338 : +.global unlink +unlink: + li a7, SYS_unlink + 338: 48c9 li a7,18 + ecall + 33a: 00000073 ecall + ret + 33e: 8082 ret + +0000000000000340 : +.global fstat +fstat: + li a7, SYS_fstat + 340: 48a1 li a7,8 + ecall + 342: 00000073 ecall + ret + 346: 8082 ret + +0000000000000348 : +.global link +link: + li a7, SYS_link + 348: 48cd li a7,19 + ecall + 34a: 00000073 ecall + ret + 34e: 8082 ret + +0000000000000350 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 350: 48d1 li a7,20 + ecall + 352: 00000073 ecall + ret + 356: 8082 ret + +0000000000000358 : +.global chdir +chdir: + li a7, SYS_chdir + 358: 48a5 li a7,9 + ecall + 35a: 00000073 ecall + ret + 35e: 8082 ret + +0000000000000360 : +.global dup +dup: + li a7, SYS_dup + 360: 48a9 li a7,10 + ecall + 362: 00000073 ecall + ret + 366: 8082 ret + +0000000000000368 : +.global getpid +getpid: + li a7, SYS_getpid + 368: 48ad li a7,11 + ecall + 36a: 00000073 ecall + ret + 36e: 8082 ret + +0000000000000370 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 370: 48b1 li a7,12 + ecall + 372: 00000073 ecall + ret + 376: 8082 ret + +0000000000000378 : +.global pause +pause: + li a7, SYS_pause + 378: 48b5 li a7,13 + ecall + 37a: 00000073 ecall + ret + 37e: 8082 ret + +0000000000000380 : +.global uptime +uptime: + li a7, SYS_uptime + 380: 48b9 li a7,14 + ecall + 382: 00000073 ecall + ret + 386: 8082 ret + +0000000000000388 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 388: 1101 addi sp,sp,-32 + 38a: ec06 sd ra,24(sp) + 38c: e822 sd s0,16(sp) + 38e: 1000 addi s0,sp,32 + 390: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 394: 4605 li a2,1 + 396: fef40593 addi a1,s0,-17 + 39a: f6fff0ef jal 308 +} + 39e: 60e2 ld ra,24(sp) + 3a0: 6442 ld s0,16(sp) + 3a2: 6105 addi sp,sp,32 + 3a4: 8082 ret + +00000000000003a6 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3a6: 715d addi sp,sp,-80 + 3a8: e486 sd ra,72(sp) + 3aa: e0a2 sd s0,64(sp) + 3ac: f84a sd s2,48(sp) + 3ae: 0880 addi s0,sp,80 + 3b0: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3b2: c299 beqz a3,3b8 + 3b4: 0805c363 bltz a1,43a + neg = 0; + 3b8: 4881 li a7,0 + 3ba: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3be: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3c0: 00000517 auipc a0,0x0 + 3c4: 52050513 addi a0,a0,1312 # 8e0 + 3c8: 883e mv a6,a5 + 3ca: 2785 addiw a5,a5,1 + 3cc: 02c5f733 remu a4,a1,a2 + 3d0: 972a add a4,a4,a0 + 3d2: 00074703 lbu a4,0(a4) + 3d6: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3da: 872e mv a4,a1 + 3dc: 02c5d5b3 divu a1,a1,a2 + 3e0: 0685 addi a3,a3,1 + 3e2: fec773e3 bgeu a4,a2,3c8 + if(neg) + 3e6: 00088b63 beqz a7,3fc + buf[i++] = '-'; + 3ea: fd078793 addi a5,a5,-48 + 3ee: 97a2 add a5,a5,s0 + 3f0: 02d00713 li a4,45 + 3f4: fee78423 sb a4,-24(a5) + 3f8: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 3fc: 02f05a63 blez a5,430 + 400: fc26 sd s1,56(sp) + 402: f44e sd s3,40(sp) + 404: fb840713 addi a4,s0,-72 + 408: 00f704b3 add s1,a4,a5 + 40c: fff70993 addi s3,a4,-1 + 410: 99be add s3,s3,a5 + 412: 37fd addiw a5,a5,-1 + 414: 1782 slli a5,a5,0x20 + 416: 9381 srli a5,a5,0x20 + 418: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 41c: fff4c583 lbu a1,-1(s1) + 420: 854a mv a0,s2 + 422: f67ff0ef jal 388 + while(--i >= 0) + 426: 14fd addi s1,s1,-1 + 428: ff349ae3 bne s1,s3,41c + 42c: 74e2 ld s1,56(sp) + 42e: 79a2 ld s3,40(sp) +} + 430: 60a6 ld ra,72(sp) + 432: 6406 ld s0,64(sp) + 434: 7942 ld s2,48(sp) + 436: 6161 addi sp,sp,80 + 438: 8082 ret + x = -xx; + 43a: 40b005b3 neg a1,a1 + neg = 1; + 43e: 4885 li a7,1 + x = -xx; + 440: bfad j 3ba + +0000000000000442 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 442: 711d addi sp,sp,-96 + 444: ec86 sd ra,88(sp) + 446: e8a2 sd s0,80(sp) + 448: e0ca sd s2,64(sp) + 44a: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 44c: 0005c903 lbu s2,0(a1) + 450: 28090663 beqz s2,6dc + 454: e4a6 sd s1,72(sp) + 456: fc4e sd s3,56(sp) + 458: f852 sd s4,48(sp) + 45a: f456 sd s5,40(sp) + 45c: f05a sd s6,32(sp) + 45e: ec5e sd s7,24(sp) + 460: e862 sd s8,16(sp) + 462: e466 sd s9,8(sp) + 464: 8b2a mv s6,a0 + 466: 8a2e mv s4,a1 + 468: 8bb2 mv s7,a2 + state = 0; + 46a: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 46c: 4481 li s1,0 + 46e: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 470: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 474: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 478: 06c00c93 li s9,108 + 47c: a005 j 49c + putc(fd, c0); + 47e: 85ca mv a1,s2 + 480: 855a mv a0,s6 + 482: f07ff0ef jal 388 + 486: a019 j 48c + } else if(state == '%'){ + 488: 03598263 beq s3,s5,4ac + for(i = 0; fmt[i]; i++){ + 48c: 2485 addiw s1,s1,1 + 48e: 8726 mv a4,s1 + 490: 009a07b3 add a5,s4,s1 + 494: 0007c903 lbu s2,0(a5) + 498: 22090a63 beqz s2,6cc + c0 = fmt[i] & 0xff; + 49c: 0009079b sext.w a5,s2 + if(state == 0){ + 4a0: fe0994e3 bnez s3,488 + if(c0 == '%'){ + 4a4: fd579de3 bne a5,s5,47e + state = '%'; + 4a8: 89be mv s3,a5 + 4aa: b7cd j 48c + if(c0) c1 = fmt[i+1] & 0xff; + 4ac: 00ea06b3 add a3,s4,a4 + 4b0: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4b4: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4b6: c681 beqz a3,4be + 4b8: 9752 add a4,a4,s4 + 4ba: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4be: 05878363 beq a5,s8,504 + } else if(c0 == 'l' && c1 == 'd'){ + 4c2: 05978d63 beq a5,s9,51c + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4c6: 07500713 li a4,117 + 4ca: 0ee78763 beq a5,a4,5b8 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4ce: 07800713 li a4,120 + 4d2: 12e78963 beq a5,a4,604 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4d6: 07000713 li a4,112 + 4da: 14e78e63 beq a5,a4,636 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4de: 06300713 li a4,99 + 4e2: 18e78e63 beq a5,a4,67e + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4e6: 07300713 li a4,115 + 4ea: 1ae78463 beq a5,a4,692 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4ee: 02500713 li a4,37 + 4f2: 04e79563 bne a5,a4,53c + putc(fd, '%'); + 4f6: 02500593 li a1,37 + 4fa: 855a mv a0,s6 + 4fc: e8dff0ef jal 388 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 500: 4981 li s3,0 + 502: b769 j 48c + printint(fd, va_arg(ap, int), 10, 1); + 504: 008b8913 addi s2,s7,8 + 508: 4685 li a3,1 + 50a: 4629 li a2,10 + 50c: 000ba583 lw a1,0(s7) + 510: 855a mv a0,s6 + 512: e95ff0ef jal 3a6 + 516: 8bca mv s7,s2 + state = 0; + 518: 4981 li s3,0 + 51a: bf8d j 48c + } else if(c0 == 'l' && c1 == 'd'){ + 51c: 06400793 li a5,100 + 520: 02f68963 beq a3,a5,552 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 524: 06c00793 li a5,108 + 528: 04f68263 beq a3,a5,56c + } else if(c0 == 'l' && c1 == 'u'){ + 52c: 07500793 li a5,117 + 530: 0af68063 beq a3,a5,5d0 + } else if(c0 == 'l' && c1 == 'x'){ + 534: 07800793 li a5,120 + 538: 0ef68263 beq a3,a5,61c + putc(fd, '%'); + 53c: 02500593 li a1,37 + 540: 855a mv a0,s6 + 542: e47ff0ef jal 388 + putc(fd, c0); + 546: 85ca mv a1,s2 + 548: 855a mv a0,s6 + 54a: e3fff0ef jal 388 + state = 0; + 54e: 4981 li s3,0 + 550: bf35 j 48c + printint(fd, va_arg(ap, uint64), 10, 1); + 552: 008b8913 addi s2,s7,8 + 556: 4685 li a3,1 + 558: 4629 li a2,10 + 55a: 000bb583 ld a1,0(s7) + 55e: 855a mv a0,s6 + 560: e47ff0ef jal 3a6 + i += 1; + 564: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 566: 8bca mv s7,s2 + state = 0; + 568: 4981 li s3,0 + i += 1; + 56a: b70d j 48c + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 56c: 06400793 li a5,100 + 570: 02f60763 beq a2,a5,59e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 574: 07500793 li a5,117 + 578: 06f60963 beq a2,a5,5ea + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 57c: 07800793 li a5,120 + 580: faf61ee3 bne a2,a5,53c + printint(fd, va_arg(ap, uint64), 16, 0); + 584: 008b8913 addi s2,s7,8 + 588: 4681 li a3,0 + 58a: 4641 li a2,16 + 58c: 000bb583 ld a1,0(s7) + 590: 855a mv a0,s6 + 592: e15ff0ef jal 3a6 + i += 2; + 596: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 598: 8bca mv s7,s2 + state = 0; + 59a: 4981 li s3,0 + i += 2; + 59c: bdc5 j 48c + printint(fd, va_arg(ap, uint64), 10, 1); + 59e: 008b8913 addi s2,s7,8 + 5a2: 4685 li a3,1 + 5a4: 4629 li a2,10 + 5a6: 000bb583 ld a1,0(s7) + 5aa: 855a mv a0,s6 + 5ac: dfbff0ef jal 3a6 + i += 2; + 5b0: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5b2: 8bca mv s7,s2 + state = 0; + 5b4: 4981 li s3,0 + i += 2; + 5b6: bdd9 j 48c + printint(fd, va_arg(ap, uint32), 10, 0); + 5b8: 008b8913 addi s2,s7,8 + 5bc: 4681 li a3,0 + 5be: 4629 li a2,10 + 5c0: 000be583 lwu a1,0(s7) + 5c4: 855a mv a0,s6 + 5c6: de1ff0ef jal 3a6 + 5ca: 8bca mv s7,s2 + state = 0; + 5cc: 4981 li s3,0 + 5ce: bd7d j 48c + printint(fd, va_arg(ap, uint64), 10, 0); + 5d0: 008b8913 addi s2,s7,8 + 5d4: 4681 li a3,0 + 5d6: 4629 li a2,10 + 5d8: 000bb583 ld a1,0(s7) + 5dc: 855a mv a0,s6 + 5de: dc9ff0ef jal 3a6 + i += 1; + 5e2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5e4: 8bca mv s7,s2 + state = 0; + 5e6: 4981 li s3,0 + i += 1; + 5e8: b555 j 48c + printint(fd, va_arg(ap, uint64), 10, 0); + 5ea: 008b8913 addi s2,s7,8 + 5ee: 4681 li a3,0 + 5f0: 4629 li a2,10 + 5f2: 000bb583 ld a1,0(s7) + 5f6: 855a mv a0,s6 + 5f8: dafff0ef jal 3a6 + i += 2; + 5fc: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5fe: 8bca mv s7,s2 + state = 0; + 600: 4981 li s3,0 + i += 2; + 602: b569 j 48c + printint(fd, va_arg(ap, uint32), 16, 0); + 604: 008b8913 addi s2,s7,8 + 608: 4681 li a3,0 + 60a: 4641 li a2,16 + 60c: 000be583 lwu a1,0(s7) + 610: 855a mv a0,s6 + 612: d95ff0ef jal 3a6 + 616: 8bca mv s7,s2 + state = 0; + 618: 4981 li s3,0 + 61a: bd8d j 48c + printint(fd, va_arg(ap, uint64), 16, 0); + 61c: 008b8913 addi s2,s7,8 + 620: 4681 li a3,0 + 622: 4641 li a2,16 + 624: 000bb583 ld a1,0(s7) + 628: 855a mv a0,s6 + 62a: d7dff0ef jal 3a6 + i += 1; + 62e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 630: 8bca mv s7,s2 + state = 0; + 632: 4981 li s3,0 + i += 1; + 634: bda1 j 48c + 636: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 638: 008b8d13 addi s10,s7,8 + 63c: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 640: 03000593 li a1,48 + 644: 855a mv a0,s6 + 646: d43ff0ef jal 388 + putc(fd, 'x'); + 64a: 07800593 li a1,120 + 64e: 855a mv a0,s6 + 650: d39ff0ef jal 388 + 654: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 656: 00000b97 auipc s7,0x0 + 65a: 28ab8b93 addi s7,s7,650 # 8e0 + 65e: 03c9d793 srli a5,s3,0x3c + 662: 97de add a5,a5,s7 + 664: 0007c583 lbu a1,0(a5) + 668: 855a mv a0,s6 + 66a: d1fff0ef jal 388 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 66e: 0992 slli s3,s3,0x4 + 670: 397d addiw s2,s2,-1 + 672: fe0916e3 bnez s2,65e + printptr(fd, va_arg(ap, uint64)); + 676: 8bea mv s7,s10 + state = 0; + 678: 4981 li s3,0 + 67a: 6d02 ld s10,0(sp) + 67c: bd01 j 48c + putc(fd, va_arg(ap, uint32)); + 67e: 008b8913 addi s2,s7,8 + 682: 000bc583 lbu a1,0(s7) + 686: 855a mv a0,s6 + 688: d01ff0ef jal 388 + 68c: 8bca mv s7,s2 + state = 0; + 68e: 4981 li s3,0 + 690: bbf5 j 48c + if((s = va_arg(ap, char*)) == 0) + 692: 008b8993 addi s3,s7,8 + 696: 000bb903 ld s2,0(s7) + 69a: 00090f63 beqz s2,6b8 + for(; *s; s++) + 69e: 00094583 lbu a1,0(s2) + 6a2: c195 beqz a1,6c6 + putc(fd, *s); + 6a4: 855a mv a0,s6 + 6a6: ce3ff0ef jal 388 + for(; *s; s++) + 6aa: 0905 addi s2,s2,1 + 6ac: 00094583 lbu a1,0(s2) + 6b0: f9f5 bnez a1,6a4 + if((s = va_arg(ap, char*)) == 0) + 6b2: 8bce mv s7,s3 + state = 0; + 6b4: 4981 li s3,0 + 6b6: bbd9 j 48c + s = "(null)"; + 6b8: 00000917 auipc s2,0x0 + 6bc: 22090913 addi s2,s2,544 # 8d8 + for(; *s; s++) + 6c0: 02800593 li a1,40 + 6c4: b7c5 j 6a4 + if((s = va_arg(ap, char*)) == 0) + 6c6: 8bce mv s7,s3 + state = 0; + 6c8: 4981 li s3,0 + 6ca: b3c9 j 48c + 6cc: 64a6 ld s1,72(sp) + 6ce: 79e2 ld s3,56(sp) + 6d0: 7a42 ld s4,48(sp) + 6d2: 7aa2 ld s5,40(sp) + 6d4: 7b02 ld s6,32(sp) + 6d6: 6be2 ld s7,24(sp) + 6d8: 6c42 ld s8,16(sp) + 6da: 6ca2 ld s9,8(sp) + } + } +} + 6dc: 60e6 ld ra,88(sp) + 6de: 6446 ld s0,80(sp) + 6e0: 6906 ld s2,64(sp) + 6e2: 6125 addi sp,sp,96 + 6e4: 8082 ret + +00000000000006e6 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6e6: 715d addi sp,sp,-80 + 6e8: ec06 sd ra,24(sp) + 6ea: e822 sd s0,16(sp) + 6ec: 1000 addi s0,sp,32 + 6ee: e010 sd a2,0(s0) + 6f0: e414 sd a3,8(s0) + 6f2: e818 sd a4,16(s0) + 6f4: ec1c sd a5,24(s0) + 6f6: 03043023 sd a6,32(s0) + 6fa: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6fe: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 702: 8622 mv a2,s0 + 704: d3fff0ef jal 442 +} + 708: 60e2 ld ra,24(sp) + 70a: 6442 ld s0,16(sp) + 70c: 6161 addi sp,sp,80 + 70e: 8082 ret + +0000000000000710 : + +void +printf(const char *fmt, ...) +{ + 710: 711d addi sp,sp,-96 + 712: ec06 sd ra,24(sp) + 714: e822 sd s0,16(sp) + 716: 1000 addi s0,sp,32 + 718: e40c sd a1,8(s0) + 71a: e810 sd a2,16(s0) + 71c: ec14 sd a3,24(s0) + 71e: f018 sd a4,32(s0) + 720: f41c sd a5,40(s0) + 722: 03043823 sd a6,48(s0) + 726: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 72a: 00840613 addi a2,s0,8 + 72e: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 732: 85aa mv a1,a0 + 734: 4505 li a0,1 + 736: d0dff0ef jal 442 +} + 73a: 60e2 ld ra,24(sp) + 73c: 6442 ld s0,16(sp) + 73e: 6125 addi sp,sp,96 + 740: 8082 ret + +0000000000000742 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 742: 1141 addi sp,sp,-16 + 744: e422 sd s0,8(sp) + 746: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 748: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 74c: 00001797 auipc a5,0x1 + 750: 8b47b783 ld a5,-1868(a5) # 1000 + 754: a02d j 77e + 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; + 756: 4618 lw a4,8(a2) + 758: 9f2d addw a4,a4,a1 + 75a: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 75e: 6398 ld a4,0(a5) + 760: 6310 ld a2,0(a4) + 762: a83d j 7a0 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 764: ff852703 lw a4,-8(a0) + 768: 9f31 addw a4,a4,a2 + 76a: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 76c: ff053683 ld a3,-16(a0) + 770: a091 j 7b4 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 772: 6398 ld a4,0(a5) + 774: 00e7e463 bltu a5,a4,77c + 778: 00e6ea63 bltu a3,a4,78c +{ + 77c: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 77e: fed7fae3 bgeu a5,a3,772 + 782: 6398 ld a4,0(a5) + 784: 00e6e463 bltu a3,a4,78c + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 788: fee7eae3 bltu a5,a4,77c + if(bp + bp->s.size == p->s.ptr){ + 78c: ff852583 lw a1,-8(a0) + 790: 6390 ld a2,0(a5) + 792: 02059813 slli a6,a1,0x20 + 796: 01c85713 srli a4,a6,0x1c + 79a: 9736 add a4,a4,a3 + 79c: fae60de3 beq a2,a4,756 + bp->s.ptr = p->s.ptr->s.ptr; + 7a0: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7a4: 4790 lw a2,8(a5) + 7a6: 02061593 slli a1,a2,0x20 + 7aa: 01c5d713 srli a4,a1,0x1c + 7ae: 973e add a4,a4,a5 + 7b0: fae68ae3 beq a3,a4,764 + p->s.ptr = bp->s.ptr; + 7b4: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7b6: 00001717 auipc a4,0x1 + 7ba: 84f73523 sd a5,-1974(a4) # 1000 +} + 7be: 6422 ld s0,8(sp) + 7c0: 0141 addi sp,sp,16 + 7c2: 8082 ret + +00000000000007c4 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7c4: 7139 addi sp,sp,-64 + 7c6: fc06 sd ra,56(sp) + 7c8: f822 sd s0,48(sp) + 7ca: f426 sd s1,40(sp) + 7cc: ec4e sd s3,24(sp) + 7ce: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7d0: 02051493 slli s1,a0,0x20 + 7d4: 9081 srli s1,s1,0x20 + 7d6: 04bd addi s1,s1,15 + 7d8: 8091 srli s1,s1,0x4 + 7da: 0014899b addiw s3,s1,1 + 7de: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7e0: 00001517 auipc a0,0x1 + 7e4: 82053503 ld a0,-2016(a0) # 1000 + 7e8: c915 beqz a0,81c + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7ea: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7ec: 4798 lw a4,8(a5) + 7ee: 08977a63 bgeu a4,s1,882 + 7f2: f04a sd s2,32(sp) + 7f4: e852 sd s4,16(sp) + 7f6: e456 sd s5,8(sp) + 7f8: e05a sd s6,0(sp) + if(nu < 4096) + 7fa: 8a4e mv s4,s3 + 7fc: 0009871b sext.w a4,s3 + 800: 6685 lui a3,0x1 + 802: 00d77363 bgeu a4,a3,808 + 806: 6a05 lui s4,0x1 + 808: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 80c: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 810: 00000917 auipc s2,0x0 + 814: 7f090913 addi s2,s2,2032 # 1000 + if(p == SBRK_ERROR) + 818: 5afd li s5,-1 + 81a: a081 j 85a + 81c: f04a sd s2,32(sp) + 81e: e852 sd s4,16(sp) + 820: e456 sd s5,8(sp) + 822: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 824: 00000797 auipc a5,0x0 + 828: 7ec78793 addi a5,a5,2028 # 1010 + 82c: 00000717 auipc a4,0x0 + 830: 7cf73a23 sd a5,2004(a4) # 1000 + 834: e39c sd a5,0(a5) + base.s.size = 0; + 836: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 83a: b7c1 j 7fa + prevp->s.ptr = p->s.ptr; + 83c: 6398 ld a4,0(a5) + 83e: e118 sd a4,0(a0) + 840: a8a9 j 89a + hp->s.size = nu; + 842: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 846: 0541 addi a0,a0,16 + 848: efbff0ef jal 742 + return freep; + 84c: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 850: c12d beqz a0,8b2 + 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: 02977263 bgeu a4,s1,87a + if(p == freep) + 85a: 00093703 ld a4,0(s2) + 85e: 853e mv a0,a5 + 860: fef719e3 bne a4,a5,852 + p = sbrk(nu * sizeof(Header)); + 864: 8552 mv a0,s4 + 866: a4fff0ef jal 2b4 + if(p == SBRK_ERROR) + 86a: fd551ce3 bne a0,s5,842 + return 0; + 86e: 4501 li a0,0 + 870: 7902 ld s2,32(sp) + 872: 6a42 ld s4,16(sp) + 874: 6aa2 ld s5,8(sp) + 876: 6b02 ld s6,0(sp) + 878: a03d j 8a6 + 87a: 7902 ld s2,32(sp) + 87c: 6a42 ld s4,16(sp) + 87e: 6aa2 ld s5,8(sp) + 880: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 882: fae48de3 beq s1,a4,83c + p->s.size -= nunits; + 886: 4137073b subw a4,a4,s3 + 88a: c798 sw a4,8(a5) + p += p->s.size; + 88c: 02071693 slli a3,a4,0x20 + 890: 01c6d713 srli a4,a3,0x1c + 894: 97ba add a5,a5,a4 + p->s.size = nunits; + 896: 0137a423 sw s3,8(a5) + freep = prevp; + 89a: 00000717 auipc a4,0x0 + 89e: 76a73323 sd a0,1894(a4) # 1000 + return (void*)(p + 1); + 8a2: 01078513 addi a0,a5,16 + } +} + 8a6: 70e2 ld ra,56(sp) + 8a8: 7442 ld s0,48(sp) + 8aa: 74a2 ld s1,40(sp) + 8ac: 69e2 ld s3,24(sp) + 8ae: 6121 addi sp,sp,64 + 8b0: 8082 ret + 8b2: 7902 ld s2,32(sp) + 8b4: 6a42 ld s4,16(sp) + 8b6: 6aa2 ld s5,8(sp) + 8b8: 6b02 ld s6,0(sp) + 8ba: b7f5 j 8a6 diff --git a/G12_Project2_2/user/kill.c b/G12_Project2_2/user/kill.c new file mode 100644 index 0000000000..1b0253b978 --- /dev/null +++ b/G12_Project2_2/user/kill.c @@ -0,0 +1,17 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "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: +#include "kernel/stat.h" +#include "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: 1000 addi s0,sp,32 + if(argc != 3){ + 8: 478d li a5,3 + a: 00f50d63 beq a0,a5,24 + e: e426 sd s1,8(sp) + fprintf(2, "Usage: ln old new\n"); + 10: 00001597 auipc a1,0x1 + 14: 8b058593 addi a1,a1,-1872 # 8c0 + 18: 4509 li a0,2 + 1a: 6c6000ef jal 6e0 + exit(1); + 1e: 4505 li a0,1 + 20: 2c2000ef jal 2e2 + 24: e426 sd s1,8(sp) + 26: 84ae mv s1,a1 + } + if(link(argv[1], argv[2]) < 0) + 28: 698c ld a1,16(a1) + 2a: 6488 ld a0,8(s1) + 2c: 316000ef jal 342 + 30: 00054563 bltz a0,3a + fprintf(2, "link %s %s: failed\n", argv[1], argv[2]); + exit(0); + 34: 4501 li a0,0 + 36: 2ac000ef jal 2e2 + fprintf(2, "link %s %s: failed\n", argv[1], argv[2]); + 3a: 6894 ld a3,16(s1) + 3c: 6490 ld a2,8(s1) + 3e: 00001597 auipc a1,0x1 + 42: 89a58593 addi a1,a1,-1894 # 8d8 + 46: 4509 li a0,2 + 48: 698000ef jal 6e0 + 4c: b7e5 j 34 + +000000000000004e : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 4e: 1141 addi sp,sp,-16 + 50: e406 sd ra,8(sp) + 52: e022 sd s0,0(sp) + 54: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 56: fabff0ef jal 0
+ exit(r); + 5a: 288000ef jal 2e2 + +000000000000005e : +} + +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 + ; + return os; +} + 74: 6422 ld s0,8(sp) + 76: 0141 addi sp,sp,16 + 78: 8082 ret + +000000000000007a : + +int +strcmp(const char *p, const char *q) +{ + 7a: 1141 addi sp,sp,-16 + 7c: e422 sd s0,8(sp) + 7e: 0800 addi s0,sp,16 + while(*p && *p == *q) + 80: 00054783 lbu a5,0(a0) + 84: cb91 beqz a5,98 + 86: 0005c703 lbu a4,0(a1) + 8a: 00f71763 bne a4,a5,98 + p++, q++; + 8e: 0505 addi a0,a0,1 + 90: 0585 addi a1,a1,1 + while(*p && *p == *q) + 92: 00054783 lbu a5,0(a0) + 96: fbe5 bnez a5,86 + return (uchar)*p - (uchar)*q; + 98: 0005c503 lbu a0,0(a1) +} + 9c: 40a7853b subw a0,a5,a0 + a0: 6422 ld s0,8(sp) + a2: 0141 addi sp,sp,16 + a4: 8082 ret + +00000000000000a6 : + +uint +strlen(const char *s) +{ + a6: 1141 addi sp,sp,-16 + a8: e422 sd s0,8(sp) + aa: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + ac: 00054783 lbu a5,0(a0) + b0: cf91 beqz a5,cc + b2: 0505 addi a0,a0,1 + b4: 87aa mv a5,a0 + b6: 86be mv a3,a5 + b8: 0785 addi a5,a5,1 + ba: fff7c703 lbu a4,-1(a5) + be: ff65 bnez a4,b6 + c0: 40a6853b subw a0,a3,a0 + c4: 2505 addiw a0,a0,1 + ; + return n; +} + c6: 6422 ld s0,8(sp) + c8: 0141 addi sp,sp,16 + ca: 8082 ret + for(n = 0; s[n]; n++) + cc: 4501 li a0,0 + ce: bfe5 j c6 + +00000000000000d0 : + +void* +memset(void *dst, int c, uint n) +{ + d0: 1141 addi sp,sp,-16 + d2: e422 sd s0,8(sp) + d4: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + d6: ca19 beqz a2,ec + d8: 87aa mv a5,a0 + da: 1602 slli a2,a2,0x20 + dc: 9201 srli a2,a2,0x20 + de: 00a60733 add a4,a2,a0 + cdst[i] = c; + e2: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + e6: 0785 addi a5,a5,1 + e8: fee79de3 bne a5,a4,e2 + } + return dst; +} + ec: 6422 ld s0,8(sp) + ee: 0141 addi sp,sp,16 + f0: 8082 ret + +00000000000000f2 : + +char* +strchr(const char *s, char c) +{ + f2: 1141 addi sp,sp,-16 + f4: e422 sd s0,8(sp) + f6: 0800 addi s0,sp,16 + for(; *s; s++) + f8: 00054783 lbu a5,0(a0) + fc: cb99 beqz a5,112 + if(*s == c) + fe: 00f58763 beq a1,a5,10c + for(; *s; s++) + 102: 0505 addi a0,a0,1 + 104: 00054783 lbu a5,0(a0) + 108: fbfd bnez a5,fe + return (char*)s; + return 0; + 10a: 4501 li a0,0 +} + 10c: 6422 ld s0,8(sp) + 10e: 0141 addi sp,sp,16 + 110: 8082 ret + return 0; + 112: 4501 li a0,0 + 114: bfe5 j 10c + +0000000000000116 : + +char* +gets(char *buf, int max) +{ + 116: 711d addi sp,sp,-96 + 118: ec86 sd ra,88(sp) + 11a: e8a2 sd s0,80(sp) + 11c: e4a6 sd s1,72(sp) + 11e: e0ca sd s2,64(sp) + 120: fc4e sd s3,56(sp) + 122: f852 sd s4,48(sp) + 124: f456 sd s5,40(sp) + 126: f05a sd s6,32(sp) + 128: ec5e sd s7,24(sp) + 12a: 1080 addi s0,sp,96 + 12c: 8baa mv s7,a0 + 12e: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 130: 892a mv s2,a0 + 132: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 134: 4aa9 li s5,10 + 136: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 138: 89a6 mv s3,s1 + 13a: 2485 addiw s1,s1,1 + 13c: 0344d663 bge s1,s4,168 + cc = read(0, &c, 1); + 140: 4605 li a2,1 + 142: faf40593 addi a1,s0,-81 + 146: 4501 li a0,0 + 148: 1b2000ef jal 2fa + if(cc < 1) + 14c: 00a05e63 blez a0,168 + buf[i++] = c; + 150: faf44783 lbu a5,-81(s0) + 154: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 158: 01578763 beq a5,s5,166 + 15c: 0905 addi s2,s2,1 + 15e: fd679de3 bne a5,s6,138 + buf[i++] = c; + 162: 89a6 mv s3,s1 + 164: a011 j 168 + 166: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 168: 99de add s3,s3,s7 + 16a: 00098023 sb zero,0(s3) + return buf; +} + 16e: 855e mv a0,s7 + 170: 60e6 ld ra,88(sp) + 172: 6446 ld s0,80(sp) + 174: 64a6 ld s1,72(sp) + 176: 6906 ld s2,64(sp) + 178: 79e2 ld s3,56(sp) + 17a: 7a42 ld s4,48(sp) + 17c: 7aa2 ld s5,40(sp) + 17e: 7b02 ld s6,32(sp) + 180: 6be2 ld s7,24(sp) + 182: 6125 addi sp,sp,96 + 184: 8082 ret + +0000000000000186 : + +int +stat(const char *n, struct stat *st) +{ + 186: 1101 addi sp,sp,-32 + 188: ec06 sd ra,24(sp) + 18a: e822 sd s0,16(sp) + 18c: e04a sd s2,0(sp) + 18e: 1000 addi s0,sp,32 + 190: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 192: 4581 li a1,0 + 194: 18e000ef jal 322 + if(fd < 0) + 198: 02054263 bltz a0,1bc + 19c: e426 sd s1,8(sp) + 19e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1a0: 85ca mv a1,s2 + 1a2: 198000ef jal 33a + 1a6: 892a mv s2,a0 + close(fd); + 1a8: 8526 mv a0,s1 + 1aa: 160000ef jal 30a + return r; + 1ae: 64a2 ld s1,8(sp) +} + 1b0: 854a mv a0,s2 + 1b2: 60e2 ld ra,24(sp) + 1b4: 6442 ld s0,16(sp) + 1b6: 6902 ld s2,0(sp) + 1b8: 6105 addi sp,sp,32 + 1ba: 8082 ret + return -1; + 1bc: 597d li s2,-1 + 1be: bfcd j 1b0 + +00000000000001c0 : + +int +atoi(const char *s) +{ + 1c0: 1141 addi sp,sp,-16 + 1c2: e422 sd s0,8(sp) + 1c4: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1c6: 00054683 lbu a3,0(a0) + 1ca: fd06879b addiw a5,a3,-48 + 1ce: 0ff7f793 zext.b a5,a5 + 1d2: 4625 li a2,9 + 1d4: 02f66863 bltu a2,a5,204 + 1d8: 872a mv a4,a0 + n = 0; + 1da: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1dc: 0705 addi a4,a4,1 + 1de: 0025179b slliw a5,a0,0x2 + 1e2: 9fa9 addw a5,a5,a0 + 1e4: 0017979b slliw a5,a5,0x1 + 1e8: 9fb5 addw a5,a5,a3 + 1ea: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1ee: 00074683 lbu a3,0(a4) + 1f2: fd06879b addiw a5,a3,-48 + 1f6: 0ff7f793 zext.b a5,a5 + 1fa: fef671e3 bgeu a2,a5,1dc + return n; +} + 1fe: 6422 ld s0,8(sp) + 200: 0141 addi sp,sp,16 + 202: 8082 ret + n = 0; + 204: 4501 li a0,0 + 206: bfe5 j 1fe + +0000000000000208 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 208: 1141 addi sp,sp,-16 + 20a: e422 sd s0,8(sp) + 20c: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 20e: 02b57463 bgeu a0,a1,236 + while(n-- > 0) + 212: 00c05f63 blez a2,230 + 216: 1602 slli a2,a2,0x20 + 218: 9201 srli a2,a2,0x20 + 21a: 00c507b3 add a5,a0,a2 + dst = vdst; + 21e: 872a mv a4,a0 + *dst++ = *src++; + 220: 0585 addi a1,a1,1 + 222: 0705 addi a4,a4,1 + 224: fff5c683 lbu a3,-1(a1) + 228: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 22c: fef71ae3 bne a4,a5,220 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 230: 6422 ld s0,8(sp) + 232: 0141 addi sp,sp,16 + 234: 8082 ret + dst += n; + 236: 00c50733 add a4,a0,a2 + src += n; + 23a: 95b2 add a1,a1,a2 + while(n-- > 0) + 23c: fec05ae3 blez a2,230 + 240: fff6079b addiw a5,a2,-1 + 244: 1782 slli a5,a5,0x20 + 246: 9381 srli a5,a5,0x20 + 248: fff7c793 not a5,a5 + 24c: 97ba add a5,a5,a4 + *--dst = *--src; + 24e: 15fd addi a1,a1,-1 + 250: 177d addi a4,a4,-1 + 252: 0005c683 lbu a3,0(a1) + 256: 00d70023 sb a3,0(a4) + while(n-- > 0) + 25a: fee79ae3 bne a5,a4,24e + 25e: bfc9 j 230 + +0000000000000260 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 260: 1141 addi sp,sp,-16 + 262: e422 sd s0,8(sp) + 264: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 266: ca05 beqz a2,296 + 268: fff6069b addiw a3,a2,-1 + 26c: 1682 slli a3,a3,0x20 + 26e: 9281 srli a3,a3,0x20 + 270: 0685 addi a3,a3,1 + 272: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 274: 00054783 lbu a5,0(a0) + 278: 0005c703 lbu a4,0(a1) + 27c: 00e79863 bne a5,a4,28c + return *p1 - *p2; + } + p1++; + 280: 0505 addi a0,a0,1 + p2++; + 282: 0585 addi a1,a1,1 + while (n-- > 0) { + 284: fed518e3 bne a0,a3,274 + } + return 0; + 288: 4501 li a0,0 + 28a: a019 j 290 + return *p1 - *p2; + 28c: 40e7853b subw a0,a5,a4 +} + 290: 6422 ld s0,8(sp) + 292: 0141 addi sp,sp,16 + 294: 8082 ret + return 0; + 296: 4501 li a0,0 + 298: bfe5 j 290 + +000000000000029a : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 29a: 1141 addi sp,sp,-16 + 29c: e406 sd ra,8(sp) + 29e: e022 sd s0,0(sp) + 2a0: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2a2: f67ff0ef jal 208 +} + 2a6: 60a2 ld ra,8(sp) + 2a8: 6402 ld s0,0(sp) + 2aa: 0141 addi sp,sp,16 + 2ac: 8082 ret + +00000000000002ae : + +char * +sbrk(int n) { + 2ae: 1141 addi sp,sp,-16 + 2b0: e406 sd ra,8(sp) + 2b2: e022 sd s0,0(sp) + 2b4: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2b6: 4585 li a1,1 + 2b8: 0b2000ef jal 36a +} + 2bc: 60a2 ld ra,8(sp) + 2be: 6402 ld s0,0(sp) + 2c0: 0141 addi sp,sp,16 + 2c2: 8082 ret + +00000000000002c4 : + +char * +sbrklazy(int n) { + 2c4: 1141 addi sp,sp,-16 + 2c6: e406 sd ra,8(sp) + 2c8: e022 sd s0,0(sp) + 2ca: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2cc: 4589 li a1,2 + 2ce: 09c000ef jal 36a +} + 2d2: 60a2 ld ra,8(sp) + 2d4: 6402 ld s0,0(sp) + 2d6: 0141 addi sp,sp,16 + 2d8: 8082 ret + +00000000000002da : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2da: 4885 li a7,1 + ecall + 2dc: 00000073 ecall + ret + 2e0: 8082 ret + +00000000000002e2 : +.global exit +exit: + li a7, SYS_exit + 2e2: 4889 li a7,2 + ecall + 2e4: 00000073 ecall + ret + 2e8: 8082 ret + +00000000000002ea : +.global wait +wait: + li a7, SYS_wait + 2ea: 488d li a7,3 + ecall + 2ec: 00000073 ecall + ret + 2f0: 8082 ret + +00000000000002f2 : +.global pipe +pipe: + li a7, SYS_pipe + 2f2: 4891 li a7,4 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa : +.global read +read: + li a7, SYS_read + 2fa: 4895 li a7,5 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 : +.global write +write: + li a7, SYS_write + 302: 48c1 li a7,16 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a : +.global close +close: + li a7, SYS_close + 30a: 48d5 li a7,21 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 : +.global kill +kill: + li a7, SYS_kill + 312: 4899 li a7,6 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a : +.global exec +exec: + li a7, SYS_exec + 31a: 489d li a7,7 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 : +.global open +open: + li a7, SYS_open + 322: 48bd li a7,15 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a : +.global mknod +mknod: + li a7, SYS_mknod + 32a: 48c5 li a7,17 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 : +.global unlink +unlink: + li a7, SYS_unlink + 332: 48c9 li a7,18 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a : +.global fstat +fstat: + li a7, SYS_fstat + 33a: 48a1 li a7,8 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 : +.global link +link: + li a7, SYS_link + 342: 48cd li a7,19 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a : +.global mkdir +mkdir: + li a7, SYS_mkdir + 34a: 48d1 li a7,20 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 : +.global chdir +chdir: + li a7, SYS_chdir + 352: 48a5 li a7,9 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a : +.global dup +dup: + li a7, SYS_dup + 35a: 48a9 li a7,10 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 : +.global getpid +getpid: + li a7, SYS_getpid + 362: 48ad li a7,11 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 36a: 48b1 li a7,12 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 : +.global pause +pause: + li a7, SYS_pause + 372: 48b5 li a7,13 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a : +.global uptime +uptime: + li a7, SYS_uptime + 37a: 48b9 li a7,14 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 382: 1101 addi sp,sp,-32 + 384: ec06 sd ra,24(sp) + 386: e822 sd s0,16(sp) + 388: 1000 addi s0,sp,32 + 38a: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 38e: 4605 li a2,1 + 390: fef40593 addi a1,s0,-17 + 394: f6fff0ef jal 302 +} + 398: 60e2 ld ra,24(sp) + 39a: 6442 ld s0,16(sp) + 39c: 6105 addi sp,sp,32 + 39e: 8082 ret + +00000000000003a0 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3a0: 715d addi sp,sp,-80 + 3a2: e486 sd ra,72(sp) + 3a4: e0a2 sd s0,64(sp) + 3a6: f84a sd s2,48(sp) + 3a8: 0880 addi s0,sp,80 + 3aa: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3ac: c299 beqz a3,3b2 + 3ae: 0805c363 bltz a1,434 + neg = 0; + 3b2: 4881 li a7,0 + 3b4: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3b8: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3ba: 00000517 auipc a0,0x0 + 3be: 53e50513 addi a0,a0,1342 # 8f8 + 3c2: 883e mv a6,a5 + 3c4: 2785 addiw a5,a5,1 + 3c6: 02c5f733 remu a4,a1,a2 + 3ca: 972a add a4,a4,a0 + 3cc: 00074703 lbu a4,0(a4) + 3d0: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3d4: 872e mv a4,a1 + 3d6: 02c5d5b3 divu a1,a1,a2 + 3da: 0685 addi a3,a3,1 + 3dc: fec773e3 bgeu a4,a2,3c2 + if(neg) + 3e0: 00088b63 beqz a7,3f6 + buf[i++] = '-'; + 3e4: fd078793 addi a5,a5,-48 + 3e8: 97a2 add a5,a5,s0 + 3ea: 02d00713 li a4,45 + 3ee: fee78423 sb a4,-24(a5) + 3f2: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 3f6: 02f05a63 blez a5,42a + 3fa: fc26 sd s1,56(sp) + 3fc: f44e sd s3,40(sp) + 3fe: fb840713 addi a4,s0,-72 + 402: 00f704b3 add s1,a4,a5 + 406: fff70993 addi s3,a4,-1 + 40a: 99be add s3,s3,a5 + 40c: 37fd addiw a5,a5,-1 + 40e: 1782 slli a5,a5,0x20 + 410: 9381 srli a5,a5,0x20 + 412: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 416: fff4c583 lbu a1,-1(s1) + 41a: 854a mv a0,s2 + 41c: f67ff0ef jal 382 + while(--i >= 0) + 420: 14fd addi s1,s1,-1 + 422: ff349ae3 bne s1,s3,416 + 426: 74e2 ld s1,56(sp) + 428: 79a2 ld s3,40(sp) +} + 42a: 60a6 ld ra,72(sp) + 42c: 6406 ld s0,64(sp) + 42e: 7942 ld s2,48(sp) + 430: 6161 addi sp,sp,80 + 432: 8082 ret + x = -xx; + 434: 40b005b3 neg a1,a1 + neg = 1; + 438: 4885 li a7,1 + x = -xx; + 43a: bfad j 3b4 + +000000000000043c : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 43c: 711d addi sp,sp,-96 + 43e: ec86 sd ra,88(sp) + 440: e8a2 sd s0,80(sp) + 442: e0ca sd s2,64(sp) + 444: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 446: 0005c903 lbu s2,0(a1) + 44a: 28090663 beqz s2,6d6 + 44e: e4a6 sd s1,72(sp) + 450: fc4e sd s3,56(sp) + 452: f852 sd s4,48(sp) + 454: f456 sd s5,40(sp) + 456: f05a sd s6,32(sp) + 458: ec5e sd s7,24(sp) + 45a: e862 sd s8,16(sp) + 45c: e466 sd s9,8(sp) + 45e: 8b2a mv s6,a0 + 460: 8a2e mv s4,a1 + 462: 8bb2 mv s7,a2 + state = 0; + 464: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 466: 4481 li s1,0 + 468: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 46a: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 46e: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 472: 06c00c93 li s9,108 + 476: a005 j 496 + putc(fd, c0); + 478: 85ca mv a1,s2 + 47a: 855a mv a0,s6 + 47c: f07ff0ef jal 382 + 480: a019 j 486 + } else if(state == '%'){ + 482: 03598263 beq s3,s5,4a6 + for(i = 0; fmt[i]; i++){ + 486: 2485 addiw s1,s1,1 + 488: 8726 mv a4,s1 + 48a: 009a07b3 add a5,s4,s1 + 48e: 0007c903 lbu s2,0(a5) + 492: 22090a63 beqz s2,6c6 + c0 = fmt[i] & 0xff; + 496: 0009079b sext.w a5,s2 + if(state == 0){ + 49a: fe0994e3 bnez s3,482 + if(c0 == '%'){ + 49e: fd579de3 bne a5,s5,478 + state = '%'; + 4a2: 89be mv s3,a5 + 4a4: b7cd j 486 + if(c0) c1 = fmt[i+1] & 0xff; + 4a6: 00ea06b3 add a3,s4,a4 + 4aa: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4ae: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4b0: c681 beqz a3,4b8 + 4b2: 9752 add a4,a4,s4 + 4b4: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4b8: 05878363 beq a5,s8,4fe + } else if(c0 == 'l' && c1 == 'd'){ + 4bc: 05978d63 beq a5,s9,516 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4c0: 07500713 li a4,117 + 4c4: 0ee78763 beq a5,a4,5b2 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4c8: 07800713 li a4,120 + 4cc: 12e78963 beq a5,a4,5fe + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4d0: 07000713 li a4,112 + 4d4: 14e78e63 beq a5,a4,630 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4d8: 06300713 li a4,99 + 4dc: 18e78e63 beq a5,a4,678 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4e0: 07300713 li a4,115 + 4e4: 1ae78463 beq a5,a4,68c + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4e8: 02500713 li a4,37 + 4ec: 04e79563 bne a5,a4,536 + putc(fd, '%'); + 4f0: 02500593 li a1,37 + 4f4: 855a mv a0,s6 + 4f6: e8dff0ef jal 382 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 4fa: 4981 li s3,0 + 4fc: b769 j 486 + printint(fd, va_arg(ap, int), 10, 1); + 4fe: 008b8913 addi s2,s7,8 + 502: 4685 li a3,1 + 504: 4629 li a2,10 + 506: 000ba583 lw a1,0(s7) + 50a: 855a mv a0,s6 + 50c: e95ff0ef jal 3a0 + 510: 8bca mv s7,s2 + state = 0; + 512: 4981 li s3,0 + 514: bf8d j 486 + } else if(c0 == 'l' && c1 == 'd'){ + 516: 06400793 li a5,100 + 51a: 02f68963 beq a3,a5,54c + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 51e: 06c00793 li a5,108 + 522: 04f68263 beq a3,a5,566 + } else if(c0 == 'l' && c1 == 'u'){ + 526: 07500793 li a5,117 + 52a: 0af68063 beq a3,a5,5ca + } else if(c0 == 'l' && c1 == 'x'){ + 52e: 07800793 li a5,120 + 532: 0ef68263 beq a3,a5,616 + putc(fd, '%'); + 536: 02500593 li a1,37 + 53a: 855a mv a0,s6 + 53c: e47ff0ef jal 382 + putc(fd, c0); + 540: 85ca mv a1,s2 + 542: 855a mv a0,s6 + 544: e3fff0ef jal 382 + state = 0; + 548: 4981 li s3,0 + 54a: bf35 j 486 + printint(fd, va_arg(ap, uint64), 10, 1); + 54c: 008b8913 addi s2,s7,8 + 550: 4685 li a3,1 + 552: 4629 li a2,10 + 554: 000bb583 ld a1,0(s7) + 558: 855a mv a0,s6 + 55a: e47ff0ef jal 3a0 + i += 1; + 55e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 560: 8bca mv s7,s2 + state = 0; + 562: 4981 li s3,0 + i += 1; + 564: b70d j 486 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 566: 06400793 li a5,100 + 56a: 02f60763 beq a2,a5,598 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 56e: 07500793 li a5,117 + 572: 06f60963 beq a2,a5,5e4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 576: 07800793 li a5,120 + 57a: faf61ee3 bne a2,a5,536 + printint(fd, va_arg(ap, uint64), 16, 0); + 57e: 008b8913 addi s2,s7,8 + 582: 4681 li a3,0 + 584: 4641 li a2,16 + 586: 000bb583 ld a1,0(s7) + 58a: 855a mv a0,s6 + 58c: e15ff0ef jal 3a0 + i += 2; + 590: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 592: 8bca mv s7,s2 + state = 0; + 594: 4981 li s3,0 + i += 2; + 596: bdc5 j 486 + printint(fd, va_arg(ap, uint64), 10, 1); + 598: 008b8913 addi s2,s7,8 + 59c: 4685 li a3,1 + 59e: 4629 li a2,10 + 5a0: 000bb583 ld a1,0(s7) + 5a4: 855a mv a0,s6 + 5a6: dfbff0ef jal 3a0 + i += 2; + 5aa: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5ac: 8bca mv s7,s2 + state = 0; + 5ae: 4981 li s3,0 + i += 2; + 5b0: bdd9 j 486 + printint(fd, va_arg(ap, uint32), 10, 0); + 5b2: 008b8913 addi s2,s7,8 + 5b6: 4681 li a3,0 + 5b8: 4629 li a2,10 + 5ba: 000be583 lwu a1,0(s7) + 5be: 855a mv a0,s6 + 5c0: de1ff0ef jal 3a0 + 5c4: 8bca mv s7,s2 + state = 0; + 5c6: 4981 li s3,0 + 5c8: bd7d j 486 + printint(fd, va_arg(ap, uint64), 10, 0); + 5ca: 008b8913 addi s2,s7,8 + 5ce: 4681 li a3,0 + 5d0: 4629 li a2,10 + 5d2: 000bb583 ld a1,0(s7) + 5d6: 855a mv a0,s6 + 5d8: dc9ff0ef jal 3a0 + i += 1; + 5dc: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5de: 8bca mv s7,s2 + state = 0; + 5e0: 4981 li s3,0 + i += 1; + 5e2: b555 j 486 + printint(fd, va_arg(ap, uint64), 10, 0); + 5e4: 008b8913 addi s2,s7,8 + 5e8: 4681 li a3,0 + 5ea: 4629 li a2,10 + 5ec: 000bb583 ld a1,0(s7) + 5f0: 855a mv a0,s6 + 5f2: dafff0ef jal 3a0 + i += 2; + 5f6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5f8: 8bca mv s7,s2 + state = 0; + 5fa: 4981 li s3,0 + i += 2; + 5fc: b569 j 486 + printint(fd, va_arg(ap, uint32), 16, 0); + 5fe: 008b8913 addi s2,s7,8 + 602: 4681 li a3,0 + 604: 4641 li a2,16 + 606: 000be583 lwu a1,0(s7) + 60a: 855a mv a0,s6 + 60c: d95ff0ef jal 3a0 + 610: 8bca mv s7,s2 + state = 0; + 612: 4981 li s3,0 + 614: bd8d j 486 + printint(fd, va_arg(ap, uint64), 16, 0); + 616: 008b8913 addi s2,s7,8 + 61a: 4681 li a3,0 + 61c: 4641 li a2,16 + 61e: 000bb583 ld a1,0(s7) + 622: 855a mv a0,s6 + 624: d7dff0ef jal 3a0 + i += 1; + 628: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 62a: 8bca mv s7,s2 + state = 0; + 62c: 4981 li s3,0 + i += 1; + 62e: bda1 j 486 + 630: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 632: 008b8d13 addi s10,s7,8 + 636: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 63a: 03000593 li a1,48 + 63e: 855a mv a0,s6 + 640: d43ff0ef jal 382 + putc(fd, 'x'); + 644: 07800593 li a1,120 + 648: 855a mv a0,s6 + 64a: d39ff0ef jal 382 + 64e: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 650: 00000b97 auipc s7,0x0 + 654: 2a8b8b93 addi s7,s7,680 # 8f8 + 658: 03c9d793 srli a5,s3,0x3c + 65c: 97de add a5,a5,s7 + 65e: 0007c583 lbu a1,0(a5) + 662: 855a mv a0,s6 + 664: d1fff0ef jal 382 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 668: 0992 slli s3,s3,0x4 + 66a: 397d addiw s2,s2,-1 + 66c: fe0916e3 bnez s2,658 + printptr(fd, va_arg(ap, uint64)); + 670: 8bea mv s7,s10 + state = 0; + 672: 4981 li s3,0 + 674: 6d02 ld s10,0(sp) + 676: bd01 j 486 + putc(fd, va_arg(ap, uint32)); + 678: 008b8913 addi s2,s7,8 + 67c: 000bc583 lbu a1,0(s7) + 680: 855a mv a0,s6 + 682: d01ff0ef jal 382 + 686: 8bca mv s7,s2 + state = 0; + 688: 4981 li s3,0 + 68a: bbf5 j 486 + if((s = va_arg(ap, char*)) == 0) + 68c: 008b8993 addi s3,s7,8 + 690: 000bb903 ld s2,0(s7) + 694: 00090f63 beqz s2,6b2 + for(; *s; s++) + 698: 00094583 lbu a1,0(s2) + 69c: c195 beqz a1,6c0 + putc(fd, *s); + 69e: 855a mv a0,s6 + 6a0: ce3ff0ef jal 382 + for(; *s; s++) + 6a4: 0905 addi s2,s2,1 + 6a6: 00094583 lbu a1,0(s2) + 6aa: f9f5 bnez a1,69e + if((s = va_arg(ap, char*)) == 0) + 6ac: 8bce mv s7,s3 + state = 0; + 6ae: 4981 li s3,0 + 6b0: bbd9 j 486 + s = "(null)"; + 6b2: 00000917 auipc s2,0x0 + 6b6: 23e90913 addi s2,s2,574 # 8f0 + for(; *s; s++) + 6ba: 02800593 li a1,40 + 6be: b7c5 j 69e + if((s = va_arg(ap, char*)) == 0) + 6c0: 8bce mv s7,s3 + state = 0; + 6c2: 4981 li s3,0 + 6c4: b3c9 j 486 + 6c6: 64a6 ld s1,72(sp) + 6c8: 79e2 ld s3,56(sp) + 6ca: 7a42 ld s4,48(sp) + 6cc: 7aa2 ld s5,40(sp) + 6ce: 7b02 ld s6,32(sp) + 6d0: 6be2 ld s7,24(sp) + 6d2: 6c42 ld s8,16(sp) + 6d4: 6ca2 ld s9,8(sp) + } + } +} + 6d6: 60e6 ld ra,88(sp) + 6d8: 6446 ld s0,80(sp) + 6da: 6906 ld s2,64(sp) + 6dc: 6125 addi sp,sp,96 + 6de: 8082 ret + +00000000000006e0 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6e0: 715d addi sp,sp,-80 + 6e2: ec06 sd ra,24(sp) + 6e4: e822 sd s0,16(sp) + 6e6: 1000 addi s0,sp,32 + 6e8: e010 sd a2,0(s0) + 6ea: e414 sd a3,8(s0) + 6ec: e818 sd a4,16(s0) + 6ee: ec1c sd a5,24(s0) + 6f0: 03043023 sd a6,32(s0) + 6f4: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6f8: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6fc: 8622 mv a2,s0 + 6fe: d3fff0ef jal 43c +} + 702: 60e2 ld ra,24(sp) + 704: 6442 ld s0,16(sp) + 706: 6161 addi sp,sp,80 + 708: 8082 ret + +000000000000070a : + +void +printf(const char *fmt, ...) +{ + 70a: 711d addi sp,sp,-96 + 70c: ec06 sd ra,24(sp) + 70e: e822 sd s0,16(sp) + 710: 1000 addi s0,sp,32 + 712: e40c sd a1,8(s0) + 714: e810 sd a2,16(s0) + 716: ec14 sd a3,24(s0) + 718: f018 sd a4,32(s0) + 71a: f41c sd a5,40(s0) + 71c: 03043823 sd a6,48(s0) + 720: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 724: 00840613 addi a2,s0,8 + 728: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 72c: 85aa mv a1,a0 + 72e: 4505 li a0,1 + 730: d0dff0ef jal 43c +} + 734: 60e2 ld ra,24(sp) + 736: 6442 ld s0,16(sp) + 738: 6125 addi sp,sp,96 + 73a: 8082 ret + +000000000000073c : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 73c: 1141 addi sp,sp,-16 + 73e: e422 sd s0,8(sp) + 740: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 742: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 746: 00001797 auipc a5,0x1 + 74a: 8ba7b783 ld a5,-1862(a5) # 1000 + 74e: a02d j 778 + 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; + 750: 4618 lw a4,8(a2) + 752: 9f2d addw a4,a4,a1 + 754: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 758: 6398 ld a4,0(a5) + 75a: 6310 ld a2,0(a4) + 75c: a83d j 79a + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 75e: ff852703 lw a4,-8(a0) + 762: 9f31 addw a4,a4,a2 + 764: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 766: ff053683 ld a3,-16(a0) + 76a: a091 j 7ae + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 76c: 6398 ld a4,0(a5) + 76e: 00e7e463 bltu a5,a4,776 + 772: 00e6ea63 bltu a3,a4,786 +{ + 776: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 778: fed7fae3 bgeu a5,a3,76c + 77c: 6398 ld a4,0(a5) + 77e: 00e6e463 bltu a3,a4,786 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 782: fee7eae3 bltu a5,a4,776 + if(bp + bp->s.size == p->s.ptr){ + 786: ff852583 lw a1,-8(a0) + 78a: 6390 ld a2,0(a5) + 78c: 02059813 slli a6,a1,0x20 + 790: 01c85713 srli a4,a6,0x1c + 794: 9736 add a4,a4,a3 + 796: fae60de3 beq a2,a4,750 + bp->s.ptr = p->s.ptr->s.ptr; + 79a: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 79e: 4790 lw a2,8(a5) + 7a0: 02061593 slli a1,a2,0x20 + 7a4: 01c5d713 srli a4,a1,0x1c + 7a8: 973e add a4,a4,a5 + 7aa: fae68ae3 beq a3,a4,75e + p->s.ptr = bp->s.ptr; + 7ae: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7b0: 00001717 auipc a4,0x1 + 7b4: 84f73823 sd a5,-1968(a4) # 1000 +} + 7b8: 6422 ld s0,8(sp) + 7ba: 0141 addi sp,sp,16 + 7bc: 8082 ret + +00000000000007be : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7be: 7139 addi sp,sp,-64 + 7c0: fc06 sd ra,56(sp) + 7c2: f822 sd s0,48(sp) + 7c4: f426 sd s1,40(sp) + 7c6: ec4e sd s3,24(sp) + 7c8: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7ca: 02051493 slli s1,a0,0x20 + 7ce: 9081 srli s1,s1,0x20 + 7d0: 04bd addi s1,s1,15 + 7d2: 8091 srli s1,s1,0x4 + 7d4: 0014899b addiw s3,s1,1 + 7d8: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7da: 00001517 auipc a0,0x1 + 7de: 82653503 ld a0,-2010(a0) # 1000 + 7e2: c915 beqz a0,816 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7e4: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7e6: 4798 lw a4,8(a5) + 7e8: 08977a63 bgeu a4,s1,87c + 7ec: f04a sd s2,32(sp) + 7ee: e852 sd s4,16(sp) + 7f0: e456 sd s5,8(sp) + 7f2: e05a sd s6,0(sp) + if(nu < 4096) + 7f4: 8a4e mv s4,s3 + 7f6: 0009871b sext.w a4,s3 + 7fa: 6685 lui a3,0x1 + 7fc: 00d77363 bgeu a4,a3,802 + 800: 6a05 lui s4,0x1 + 802: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 806: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 80a: 00000917 auipc s2,0x0 + 80e: 7f690913 addi s2,s2,2038 # 1000 + if(p == SBRK_ERROR) + 812: 5afd li s5,-1 + 814: a081 j 854 + 816: f04a sd s2,32(sp) + 818: e852 sd s4,16(sp) + 81a: e456 sd s5,8(sp) + 81c: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 81e: 00000797 auipc a5,0x0 + 822: 7f278793 addi a5,a5,2034 # 1010 + 826: 00000717 auipc a4,0x0 + 82a: 7cf73d23 sd a5,2010(a4) # 1000 + 82e: e39c sd a5,0(a5) + base.s.size = 0; + 830: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 834: b7c1 j 7f4 + prevp->s.ptr = p->s.ptr; + 836: 6398 ld a4,0(a5) + 838: e118 sd a4,0(a0) + 83a: a8a9 j 894 + hp->s.size = nu; + 83c: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 840: 0541 addi a0,a0,16 + 842: efbff0ef jal 73c + return freep; + 846: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 84a: c12d beqz a0,8ac + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 84c: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 84e: 4798 lw a4,8(a5) + 850: 02977263 bgeu a4,s1,874 + if(p == freep) + 854: 00093703 ld a4,0(s2) + 858: 853e mv a0,a5 + 85a: fef719e3 bne a4,a5,84c + p = sbrk(nu * sizeof(Header)); + 85e: 8552 mv a0,s4 + 860: a4fff0ef jal 2ae + if(p == SBRK_ERROR) + 864: fd551ce3 bne a0,s5,83c + return 0; + 868: 4501 li a0,0 + 86a: 7902 ld s2,32(sp) + 86c: 6a42 ld s4,16(sp) + 86e: 6aa2 ld s5,8(sp) + 870: 6b02 ld s6,0(sp) + 872: a03d j 8a0 + 874: 7902 ld s2,32(sp) + 876: 6a42 ld s4,16(sp) + 878: 6aa2 ld s5,8(sp) + 87a: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 87c: fae48de3 beq s1,a4,836 + p->s.size -= nunits; + 880: 4137073b subw a4,a4,s3 + 884: c798 sw a4,8(a5) + p += p->s.size; + 886: 02071693 slli a3,a4,0x20 + 88a: 01c6d713 srli a4,a3,0x1c + 88e: 97ba add a5,a5,a4 + p->s.size = nunits; + 890: 0137a423 sw s3,8(a5) + freep = prevp; + 894: 00000717 auipc a4,0x0 + 898: 76a73623 sd a0,1900(a4) # 1000 + return (void*)(p + 1); + 89c: 01078513 addi a0,a5,16 + } +} + 8a0: 70e2 ld ra,56(sp) + 8a2: 7442 ld s0,48(sp) + 8a4: 74a2 ld s1,40(sp) + 8a6: 69e2 ld s3,24(sp) + 8a8: 6121 addi sp,sp,64 + 8aa: 8082 ret + 8ac: 7902 ld s2,32(sp) + 8ae: 6a42 ld s4,16(sp) + 8b0: 6aa2 ld s5,8(sp) + 8b2: 6b02 ld s6,0(sp) + 8b4: b7f5 j 8a0 diff --git a/G12_Project2_2/user/ln.c b/G12_Project2_2/user/ln.c new file mode 100644 index 0000000000..1894143708 --- /dev/null +++ b/G12_Project2_2/user/ln.c @@ -0,0 +1,15 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "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/G12_Project2_2/user/ln.d b/G12_Project2_2/user/ln.d new file mode 100644 index 0000000000..927138d33f --- /dev/null +++ b/G12_Project2_2/user/ln.d @@ -0,0 +1 @@ +user/ln.o: user/ln.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project2_2/user/ln.o b/G12_Project2_2/user/ln.o new file mode 100644 index 0000000000..86f44f257e Binary files /dev/null and b/G12_Project2_2/user/ln.o differ diff --git a/G12_Project2_2/user/ln.sym b/G12_Project2_2/user/ln.sym new file mode 100644 index 0000000000..69240f8962 --- /dev/null +++ b/G12_Project2_2/user/ln.sym @@ -0,0 +1,65 @@ +0000000000000000 .text +00000000000008b8 .rodata +0000000000000910 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 ln.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000382 putc +00000000000003a0 printint +00000000000008f8 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +000000000000005e strcpy +0000000000000372 pause +000000000000070a printf +000000000000036a sys_sbrk +0000000000000208 memmove +000000000000032a mknod +0000000000000116 gets +0000000000000362 getpid +000000000000029a memcpy +00000000000007be malloc +00000000000002c4 sbrklazy +00000000000002f2 pipe +0000000000000302 write +000000000000033a fstat +00000000000006e0 fprintf +0000000000000312 kill +000000000000043c vprintf +0000000000000352 chdir +000000000000031a exec +00000000000002ea wait +00000000000002fa read +0000000000000332 unlink +0000000000000260 memcmp +00000000000002da fork +00000000000002ae sbrk +000000000000037a uptime +00000000000000d0 memset +0000000000000000 main +000000000000007a strcmp +000000000000035a dup +0000000000000186 stat +0000000000000342 link +00000000000002e2 exit +000000000000004e start +00000000000001c0 atoi +00000000000000a6 strlen +0000000000000322 open +00000000000000f2 strchr +000000000000034a mkdir +000000000000030a close +000000000000073c free diff --git a/G12_Project2_2/user/logstress.asm b/G12_Project2_2/user/logstress.asm new file mode 100644 index 0000000000..c1537e409f --- /dev/null +++ b/G12_Project2_2/user/logstress.asm @@ -0,0 +1,1578 @@ + +user/_logstress: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +main(int argc, char **argv) +{ + int fd, n; + enum { N = 250, SZ=2000 }; + + for (int i = 1; i < argc; i++){ + 0: 4785 li a5,1 + 2: 0ea7df63 bge a5,a0,100 +{ + 6: 7139 addi sp,sp,-64 + 8: fc06 sd ra,56(sp) + a: f822 sd s0,48(sp) + c: f426 sd s1,40(sp) + e: f04a sd s2,32(sp) + 10: ec4e sd s3,24(sp) + 12: 0080 addi s0,sp,64 + 14: 892a mv s2,a0 + 16: 89ae mv s3,a1 + for (int i = 1; i < argc; i++){ + 18: 4485 li s1,1 + 1a: a011 j 1e + 1c: 84be mv s1,a5 + int pid1 = fork(); + 1e: 372000ef jal 390 + if(pid1 < 0){ + 22: 00054963 bltz a0,34 + printf("%s: fork failed\n", argv[0]); + exit(1); + } + if(pid1 == 0) { + 26: c11d beqz a0,4c + for (int i = 1; i < argc; i++){ + 28: 0014879b addiw a5,s1,1 + 2c: fef918e3 bne s2,a5,1c + } + exit(0); + } + } + int xstatus; + for(int i = 1; i < argc; i++){ + 30: 4905 li s2,1 + 32: a04d j d4 + 34: e852 sd s4,16(sp) + printf("%s: fork failed\n", argv[0]); + 36: 0009b583 ld a1,0(s3) + 3a: 00001517 auipc a0,0x1 + 3e: 93650513 addi a0,a0,-1738 # 970 + 42: 77e000ef jal 7c0 + exit(1); + 46: 4505 li a0,1 + 48: 350000ef jal 398 + 4c: e852 sd s4,16(sp) + fd = open(argv[i], O_CREATE | O_RDWR); + 4e: 00349a13 slli s4,s1,0x3 + 52: 9a4e add s4,s4,s3 + 54: 20200593 li a1,514 + 58: 000a3503 ld a0,0(s4) + 5c: 37c000ef jal 3d8 + 60: 892a mv s2,a0 + if(fd < 0){ + 62: 04054163 bltz a0,a4 + memset(buf, '0'+i, SZ); + 66: 7d000613 li a2,2000 + 6a: 0304859b addiw a1,s1,48 + 6e: 00001517 auipc a0,0x1 + 72: fa250513 addi a0,a0,-94 # 1010 + 76: 110000ef jal 186 + 7a: 0fa00493 li s1,250 + if((n = write(fd, buf, SZ)) != SZ){ + 7e: 00001997 auipc s3,0x1 + 82: f9298993 addi s3,s3,-110 # 1010 + 86: 7d000613 li a2,2000 + 8a: 85ce mv a1,s3 + 8c: 854a mv a0,s2 + 8e: 32a000ef jal 3b8 + 92: 7d000793 li a5,2000 + 96: 02f51463 bne a0,a5,be + for(i = 0; i < N; i++){ + 9a: 34fd addiw s1,s1,-1 + 9c: f4ed bnez s1,86 + exit(0); + 9e: 4501 li a0,0 + a0: 2f8000ef jal 398 + printf("%s: create %s failed\n", argv[0], argv[i]); + a4: 000a3603 ld a2,0(s4) + a8: 0009b583 ld a1,0(s3) + ac: 00001517 auipc a0,0x1 + b0: 8dc50513 addi a0,a0,-1828 # 988 + b4: 70c000ef jal 7c0 + exit(1); + b8: 4505 li a0,1 + ba: 2de000ef jal 398 + printf("write failed %d\n", n); + be: 85aa mv a1,a0 + c0: 00001517 auipc a0,0x1 + c4: 8e050513 addi a0,a0,-1824 # 9a0 + c8: 6f8000ef jal 7c0 + exit(1); + cc: 4505 li a0,1 + ce: 2ca000ef jal 398 + d2: 893e mv s2,a5 + wait(&xstatus); + d4: fcc40513 addi a0,s0,-52 + d8: 2c8000ef jal 3a0 + if(xstatus != 0) + dc: fcc42503 lw a0,-52(s0) + e0: ed09 bnez a0,fa + for(int i = 1; i < argc; i++){ + e2: 0019079b addiw a5,s2,1 + e6: ff2496e3 bne s1,s2,d2 + exit(xstatus); + } + return 0; +} + ea: 4501 li a0,0 + ec: 70e2 ld ra,56(sp) + ee: 7442 ld s0,48(sp) + f0: 74a2 ld s1,40(sp) + f2: 7902 ld s2,32(sp) + f4: 69e2 ld s3,24(sp) + f6: 6121 addi sp,sp,64 + f8: 8082 ret + fa: e852 sd s4,16(sp) + exit(xstatus); + fc: 29c000ef jal 398 +} + 100: 4501 li a0,0 + 102: 8082 ret + +0000000000000104 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 104: 1141 addi sp,sp,-16 + 106: e406 sd ra,8(sp) + 108: e022 sd s0,0(sp) + 10a: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 10c: ef5ff0ef jal 0
+ exit(r); + 110: 288000ef jal 398 + +0000000000000114 : +} + +char* +strcpy(char *s, const char *t) +{ + 114: 1141 addi sp,sp,-16 + 116: e422 sd s0,8(sp) + 118: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 11a: 87aa mv a5,a0 + 11c: 0585 addi a1,a1,1 + 11e: 0785 addi a5,a5,1 + 120: fff5c703 lbu a4,-1(a1) + 124: fee78fa3 sb a4,-1(a5) + 128: fb75 bnez a4,11c + ; + return os; +} + 12a: 6422 ld s0,8(sp) + 12c: 0141 addi sp,sp,16 + 12e: 8082 ret + +0000000000000130 : + +int +strcmp(const char *p, const char *q) +{ + 130: 1141 addi sp,sp,-16 + 132: e422 sd s0,8(sp) + 134: 0800 addi s0,sp,16 + while(*p && *p == *q) + 136: 00054783 lbu a5,0(a0) + 13a: cb91 beqz a5,14e + 13c: 0005c703 lbu a4,0(a1) + 140: 00f71763 bne a4,a5,14e + p++, q++; + 144: 0505 addi a0,a0,1 + 146: 0585 addi a1,a1,1 + while(*p && *p == *q) + 148: 00054783 lbu a5,0(a0) + 14c: fbe5 bnez a5,13c + return (uchar)*p - (uchar)*q; + 14e: 0005c503 lbu a0,0(a1) +} + 152: 40a7853b subw a0,a5,a0 + 156: 6422 ld s0,8(sp) + 158: 0141 addi sp,sp,16 + 15a: 8082 ret + +000000000000015c : + +uint +strlen(const char *s) +{ + 15c: 1141 addi sp,sp,-16 + 15e: e422 sd s0,8(sp) + 160: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 162: 00054783 lbu a5,0(a0) + 166: cf91 beqz a5,182 + 168: 0505 addi a0,a0,1 + 16a: 87aa mv a5,a0 + 16c: 86be mv a3,a5 + 16e: 0785 addi a5,a5,1 + 170: fff7c703 lbu a4,-1(a5) + 174: ff65 bnez a4,16c + 176: 40a6853b subw a0,a3,a0 + 17a: 2505 addiw a0,a0,1 + ; + return n; +} + 17c: 6422 ld s0,8(sp) + 17e: 0141 addi sp,sp,16 + 180: 8082 ret + for(n = 0; s[n]; n++) + 182: 4501 li a0,0 + 184: bfe5 j 17c + +0000000000000186 : + +void* +memset(void *dst, int c, uint n) +{ + 186: 1141 addi sp,sp,-16 + 188: e422 sd s0,8(sp) + 18a: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 18c: ca19 beqz a2,1a2 + 18e: 87aa mv a5,a0 + 190: 1602 slli a2,a2,0x20 + 192: 9201 srli a2,a2,0x20 + 194: 00a60733 add a4,a2,a0 + cdst[i] = c; + 198: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 19c: 0785 addi a5,a5,1 + 19e: fee79de3 bne a5,a4,198 + } + return dst; +} + 1a2: 6422 ld s0,8(sp) + 1a4: 0141 addi sp,sp,16 + 1a6: 8082 ret + +00000000000001a8 : + +char* +strchr(const char *s, char c) +{ + 1a8: 1141 addi sp,sp,-16 + 1aa: e422 sd s0,8(sp) + 1ac: 0800 addi s0,sp,16 + for(; *s; s++) + 1ae: 00054783 lbu a5,0(a0) + 1b2: cb99 beqz a5,1c8 + if(*s == c) + 1b4: 00f58763 beq a1,a5,1c2 + for(; *s; s++) + 1b8: 0505 addi a0,a0,1 + 1ba: 00054783 lbu a5,0(a0) + 1be: fbfd bnez a5,1b4 + return (char*)s; + return 0; + 1c0: 4501 li a0,0 +} + 1c2: 6422 ld s0,8(sp) + 1c4: 0141 addi sp,sp,16 + 1c6: 8082 ret + return 0; + 1c8: 4501 li a0,0 + 1ca: bfe5 j 1c2 + +00000000000001cc : + +char* +gets(char *buf, int max) +{ + 1cc: 711d addi sp,sp,-96 + 1ce: ec86 sd ra,88(sp) + 1d0: e8a2 sd s0,80(sp) + 1d2: e4a6 sd s1,72(sp) + 1d4: e0ca sd s2,64(sp) + 1d6: fc4e sd s3,56(sp) + 1d8: f852 sd s4,48(sp) + 1da: f456 sd s5,40(sp) + 1dc: f05a sd s6,32(sp) + 1de: ec5e sd s7,24(sp) + 1e0: 1080 addi s0,sp,96 + 1e2: 8baa mv s7,a0 + 1e4: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1e6: 892a mv s2,a0 + 1e8: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1ea: 4aa9 li s5,10 + 1ec: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1ee: 89a6 mv s3,s1 + 1f0: 2485 addiw s1,s1,1 + 1f2: 0344d663 bge s1,s4,21e + cc = read(0, &c, 1); + 1f6: 4605 li a2,1 + 1f8: faf40593 addi a1,s0,-81 + 1fc: 4501 li a0,0 + 1fe: 1b2000ef jal 3b0 + if(cc < 1) + 202: 00a05e63 blez a0,21e + buf[i++] = c; + 206: faf44783 lbu a5,-81(s0) + 20a: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 20e: 01578763 beq a5,s5,21c + 212: 0905 addi s2,s2,1 + 214: fd679de3 bne a5,s6,1ee + buf[i++] = c; + 218: 89a6 mv s3,s1 + 21a: a011 j 21e + 21c: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 21e: 99de add s3,s3,s7 + 220: 00098023 sb zero,0(s3) + return buf; +} + 224: 855e mv a0,s7 + 226: 60e6 ld ra,88(sp) + 228: 6446 ld s0,80(sp) + 22a: 64a6 ld s1,72(sp) + 22c: 6906 ld s2,64(sp) + 22e: 79e2 ld s3,56(sp) + 230: 7a42 ld s4,48(sp) + 232: 7aa2 ld s5,40(sp) + 234: 7b02 ld s6,32(sp) + 236: 6be2 ld s7,24(sp) + 238: 6125 addi sp,sp,96 + 23a: 8082 ret + +000000000000023c : + +int +stat(const char *n, struct stat *st) +{ + 23c: 1101 addi sp,sp,-32 + 23e: ec06 sd ra,24(sp) + 240: e822 sd s0,16(sp) + 242: e04a sd s2,0(sp) + 244: 1000 addi s0,sp,32 + 246: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 248: 4581 li a1,0 + 24a: 18e000ef jal 3d8 + if(fd < 0) + 24e: 02054263 bltz a0,272 + 252: e426 sd s1,8(sp) + 254: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 256: 85ca mv a1,s2 + 258: 198000ef jal 3f0 + 25c: 892a mv s2,a0 + close(fd); + 25e: 8526 mv a0,s1 + 260: 160000ef jal 3c0 + return r; + 264: 64a2 ld s1,8(sp) +} + 266: 854a mv a0,s2 + 268: 60e2 ld ra,24(sp) + 26a: 6442 ld s0,16(sp) + 26c: 6902 ld s2,0(sp) + 26e: 6105 addi sp,sp,32 + 270: 8082 ret + return -1; + 272: 597d li s2,-1 + 274: bfcd j 266 + +0000000000000276 : + +int +atoi(const char *s) +{ + 276: 1141 addi sp,sp,-16 + 278: e422 sd s0,8(sp) + 27a: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 27c: 00054683 lbu a3,0(a0) + 280: fd06879b addiw a5,a3,-48 + 284: 0ff7f793 zext.b a5,a5 + 288: 4625 li a2,9 + 28a: 02f66863 bltu a2,a5,2ba + 28e: 872a mv a4,a0 + n = 0; + 290: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 292: 0705 addi a4,a4,1 + 294: 0025179b slliw a5,a0,0x2 + 298: 9fa9 addw a5,a5,a0 + 29a: 0017979b slliw a5,a5,0x1 + 29e: 9fb5 addw a5,a5,a3 + 2a0: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 2a4: 00074683 lbu a3,0(a4) + 2a8: fd06879b addiw a5,a3,-48 + 2ac: 0ff7f793 zext.b a5,a5 + 2b0: fef671e3 bgeu a2,a5,292 + return n; +} + 2b4: 6422 ld s0,8(sp) + 2b6: 0141 addi sp,sp,16 + 2b8: 8082 ret + n = 0; + 2ba: 4501 li a0,0 + 2bc: bfe5 j 2b4 + +00000000000002be : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 2be: 1141 addi sp,sp,-16 + 2c0: e422 sd s0,8(sp) + 2c2: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 2c4: 02b57463 bgeu a0,a1,2ec + while(n-- > 0) + 2c8: 00c05f63 blez a2,2e6 + 2cc: 1602 slli a2,a2,0x20 + 2ce: 9201 srli a2,a2,0x20 + 2d0: 00c507b3 add a5,a0,a2 + dst = vdst; + 2d4: 872a mv a4,a0 + *dst++ = *src++; + 2d6: 0585 addi a1,a1,1 + 2d8: 0705 addi a4,a4,1 + 2da: fff5c683 lbu a3,-1(a1) + 2de: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2e2: fef71ae3 bne a4,a5,2d6 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2e6: 6422 ld s0,8(sp) + 2e8: 0141 addi sp,sp,16 + 2ea: 8082 ret + dst += n; + 2ec: 00c50733 add a4,a0,a2 + src += n; + 2f0: 95b2 add a1,a1,a2 + while(n-- > 0) + 2f2: fec05ae3 blez a2,2e6 + 2f6: fff6079b addiw a5,a2,-1 + 2fa: 1782 slli a5,a5,0x20 + 2fc: 9381 srli a5,a5,0x20 + 2fe: fff7c793 not a5,a5 + 302: 97ba add a5,a5,a4 + *--dst = *--src; + 304: 15fd addi a1,a1,-1 + 306: 177d addi a4,a4,-1 + 308: 0005c683 lbu a3,0(a1) + 30c: 00d70023 sb a3,0(a4) + while(n-- > 0) + 310: fee79ae3 bne a5,a4,304 + 314: bfc9 j 2e6 + +0000000000000316 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 316: 1141 addi sp,sp,-16 + 318: e422 sd s0,8(sp) + 31a: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 31c: ca05 beqz a2,34c + 31e: fff6069b addiw a3,a2,-1 + 322: 1682 slli a3,a3,0x20 + 324: 9281 srli a3,a3,0x20 + 326: 0685 addi a3,a3,1 + 328: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 32a: 00054783 lbu a5,0(a0) + 32e: 0005c703 lbu a4,0(a1) + 332: 00e79863 bne a5,a4,342 + return *p1 - *p2; + } + p1++; + 336: 0505 addi a0,a0,1 + p2++; + 338: 0585 addi a1,a1,1 + while (n-- > 0) { + 33a: fed518e3 bne a0,a3,32a + } + return 0; + 33e: 4501 li a0,0 + 340: a019 j 346 + return *p1 - *p2; + 342: 40e7853b subw a0,a5,a4 +} + 346: 6422 ld s0,8(sp) + 348: 0141 addi sp,sp,16 + 34a: 8082 ret + return 0; + 34c: 4501 li a0,0 + 34e: bfe5 j 346 + +0000000000000350 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 350: 1141 addi sp,sp,-16 + 352: e406 sd ra,8(sp) + 354: e022 sd s0,0(sp) + 356: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 358: f67ff0ef jal 2be +} + 35c: 60a2 ld ra,8(sp) + 35e: 6402 ld s0,0(sp) + 360: 0141 addi sp,sp,16 + 362: 8082 ret + +0000000000000364 : + +char * +sbrk(int n) { + 364: 1141 addi sp,sp,-16 + 366: e406 sd ra,8(sp) + 368: e022 sd s0,0(sp) + 36a: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 36c: 4585 li a1,1 + 36e: 0b2000ef jal 420 +} + 372: 60a2 ld ra,8(sp) + 374: 6402 ld s0,0(sp) + 376: 0141 addi sp,sp,16 + 378: 8082 ret + +000000000000037a : + +char * +sbrklazy(int n) { + 37a: 1141 addi sp,sp,-16 + 37c: e406 sd ra,8(sp) + 37e: e022 sd s0,0(sp) + 380: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 382: 4589 li a1,2 + 384: 09c000ef jal 420 +} + 388: 60a2 ld ra,8(sp) + 38a: 6402 ld s0,0(sp) + 38c: 0141 addi sp,sp,16 + 38e: 8082 ret + +0000000000000390 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 390: 4885 li a7,1 + ecall + 392: 00000073 ecall + ret + 396: 8082 ret + +0000000000000398 : +.global exit +exit: + li a7, SYS_exit + 398: 4889 li a7,2 + ecall + 39a: 00000073 ecall + ret + 39e: 8082 ret + +00000000000003a0 : +.global wait +wait: + li a7, SYS_wait + 3a0: 488d li a7,3 + ecall + 3a2: 00000073 ecall + ret + 3a6: 8082 ret + +00000000000003a8 : +.global pipe +pipe: + li a7, SYS_pipe + 3a8: 4891 li a7,4 + ecall + 3aa: 00000073 ecall + ret + 3ae: 8082 ret + +00000000000003b0 : +.global read +read: + li a7, SYS_read + 3b0: 4895 li a7,5 + ecall + 3b2: 00000073 ecall + ret + 3b6: 8082 ret + +00000000000003b8 : +.global write +write: + li a7, SYS_write + 3b8: 48c1 li a7,16 + ecall + 3ba: 00000073 ecall + ret + 3be: 8082 ret + +00000000000003c0 : +.global close +close: + li a7, SYS_close + 3c0: 48d5 li a7,21 + ecall + 3c2: 00000073 ecall + ret + 3c6: 8082 ret + +00000000000003c8 : +.global kill +kill: + li a7, SYS_kill + 3c8: 4899 li a7,6 + ecall + 3ca: 00000073 ecall + ret + 3ce: 8082 ret + +00000000000003d0 : +.global exec +exec: + li a7, SYS_exec + 3d0: 489d li a7,7 + ecall + 3d2: 00000073 ecall + ret + 3d6: 8082 ret + +00000000000003d8 : +.global open +open: + li a7, SYS_open + 3d8: 48bd li a7,15 + ecall + 3da: 00000073 ecall + ret + 3de: 8082 ret + +00000000000003e0 : +.global mknod +mknod: + li a7, SYS_mknod + 3e0: 48c5 li a7,17 + ecall + 3e2: 00000073 ecall + ret + 3e6: 8082 ret + +00000000000003e8 : +.global unlink +unlink: + li a7, SYS_unlink + 3e8: 48c9 li a7,18 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 : +.global fstat +fstat: + li a7, SYS_fstat + 3f0: 48a1 li a7,8 + ecall + 3f2: 00000073 ecall + ret + 3f6: 8082 ret + +00000000000003f8 : +.global link +link: + li a7, SYS_link + 3f8: 48cd li a7,19 + ecall + 3fa: 00000073 ecall + ret + 3fe: 8082 ret + +0000000000000400 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 400: 48d1 li a7,20 + ecall + 402: 00000073 ecall + ret + 406: 8082 ret + +0000000000000408 : +.global chdir +chdir: + li a7, SYS_chdir + 408: 48a5 li a7,9 + ecall + 40a: 00000073 ecall + ret + 40e: 8082 ret + +0000000000000410 : +.global dup +dup: + li a7, SYS_dup + 410: 48a9 li a7,10 + ecall + 412: 00000073 ecall + ret + 416: 8082 ret + +0000000000000418 : +.global getpid +getpid: + li a7, SYS_getpid + 418: 48ad li a7,11 + ecall + 41a: 00000073 ecall + ret + 41e: 8082 ret + +0000000000000420 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 420: 48b1 li a7,12 + ecall + 422: 00000073 ecall + ret + 426: 8082 ret + +0000000000000428 : +.global pause +pause: + li a7, SYS_pause + 428: 48b5 li a7,13 + ecall + 42a: 00000073 ecall + ret + 42e: 8082 ret + +0000000000000430 : +.global uptime +uptime: + li a7, SYS_uptime + 430: 48b9 li a7,14 + ecall + 432: 00000073 ecall + ret + 436: 8082 ret + +0000000000000438 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 438: 1101 addi sp,sp,-32 + 43a: ec06 sd ra,24(sp) + 43c: e822 sd s0,16(sp) + 43e: 1000 addi s0,sp,32 + 440: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 444: 4605 li a2,1 + 446: fef40593 addi a1,s0,-17 + 44a: f6fff0ef jal 3b8 +} + 44e: 60e2 ld ra,24(sp) + 450: 6442 ld s0,16(sp) + 452: 6105 addi sp,sp,32 + 454: 8082 ret + +0000000000000456 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 456: 715d addi sp,sp,-80 + 458: e486 sd ra,72(sp) + 45a: e0a2 sd s0,64(sp) + 45c: f84a sd s2,48(sp) + 45e: 0880 addi s0,sp,80 + 460: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 462: c299 beqz a3,468 + 464: 0805c363 bltz a1,4ea + neg = 0; + 468: 4881 li a7,0 + 46a: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 46e: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 470: 00000517 auipc a0,0x0 + 474: 55050513 addi a0,a0,1360 # 9c0 + 478: 883e mv a6,a5 + 47a: 2785 addiw a5,a5,1 + 47c: 02c5f733 remu a4,a1,a2 + 480: 972a add a4,a4,a0 + 482: 00074703 lbu a4,0(a4) + 486: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 48a: 872e mv a4,a1 + 48c: 02c5d5b3 divu a1,a1,a2 + 490: 0685 addi a3,a3,1 + 492: fec773e3 bgeu a4,a2,478 + if(neg) + 496: 00088b63 beqz a7,4ac + buf[i++] = '-'; + 49a: fd078793 addi a5,a5,-48 + 49e: 97a2 add a5,a5,s0 + 4a0: 02d00713 li a4,45 + 4a4: fee78423 sb a4,-24(a5) + 4a8: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 4ac: 02f05a63 blez a5,4e0 + 4b0: fc26 sd s1,56(sp) + 4b2: f44e sd s3,40(sp) + 4b4: fb840713 addi a4,s0,-72 + 4b8: 00f704b3 add s1,a4,a5 + 4bc: fff70993 addi s3,a4,-1 + 4c0: 99be add s3,s3,a5 + 4c2: 37fd addiw a5,a5,-1 + 4c4: 1782 slli a5,a5,0x20 + 4c6: 9381 srli a5,a5,0x20 + 4c8: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 4cc: fff4c583 lbu a1,-1(s1) + 4d0: 854a mv a0,s2 + 4d2: f67ff0ef jal 438 + while(--i >= 0) + 4d6: 14fd addi s1,s1,-1 + 4d8: ff349ae3 bne s1,s3,4cc + 4dc: 74e2 ld s1,56(sp) + 4de: 79a2 ld s3,40(sp) +} + 4e0: 60a6 ld ra,72(sp) + 4e2: 6406 ld s0,64(sp) + 4e4: 7942 ld s2,48(sp) + 4e6: 6161 addi sp,sp,80 + 4e8: 8082 ret + x = -xx; + 4ea: 40b005b3 neg a1,a1 + neg = 1; + 4ee: 4885 li a7,1 + x = -xx; + 4f0: bfad j 46a + +00000000000004f2 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4f2: 711d addi sp,sp,-96 + 4f4: ec86 sd ra,88(sp) + 4f6: e8a2 sd s0,80(sp) + 4f8: e0ca sd s2,64(sp) + 4fa: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4fc: 0005c903 lbu s2,0(a1) + 500: 28090663 beqz s2,78c + 504: e4a6 sd s1,72(sp) + 506: fc4e sd s3,56(sp) + 508: f852 sd s4,48(sp) + 50a: f456 sd s5,40(sp) + 50c: f05a sd s6,32(sp) + 50e: ec5e sd s7,24(sp) + 510: e862 sd s8,16(sp) + 512: e466 sd s9,8(sp) + 514: 8b2a mv s6,a0 + 516: 8a2e mv s4,a1 + 518: 8bb2 mv s7,a2 + state = 0; + 51a: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 51c: 4481 li s1,0 + 51e: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 520: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 524: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 528: 06c00c93 li s9,108 + 52c: a005 j 54c + putc(fd, c0); + 52e: 85ca mv a1,s2 + 530: 855a mv a0,s6 + 532: f07ff0ef jal 438 + 536: a019 j 53c + } else if(state == '%'){ + 538: 03598263 beq s3,s5,55c + for(i = 0; fmt[i]; i++){ + 53c: 2485 addiw s1,s1,1 + 53e: 8726 mv a4,s1 + 540: 009a07b3 add a5,s4,s1 + 544: 0007c903 lbu s2,0(a5) + 548: 22090a63 beqz s2,77c + c0 = fmt[i] & 0xff; + 54c: 0009079b sext.w a5,s2 + if(state == 0){ + 550: fe0994e3 bnez s3,538 + if(c0 == '%'){ + 554: fd579de3 bne a5,s5,52e + state = '%'; + 558: 89be mv s3,a5 + 55a: b7cd j 53c + if(c0) c1 = fmt[i+1] & 0xff; + 55c: 00ea06b3 add a3,s4,a4 + 560: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 564: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 566: c681 beqz a3,56e + 568: 9752 add a4,a4,s4 + 56a: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 56e: 05878363 beq a5,s8,5b4 + } else if(c0 == 'l' && c1 == 'd'){ + 572: 05978d63 beq a5,s9,5cc + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 576: 07500713 li a4,117 + 57a: 0ee78763 beq a5,a4,668 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 57e: 07800713 li a4,120 + 582: 12e78963 beq a5,a4,6b4 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 586: 07000713 li a4,112 + 58a: 14e78e63 beq a5,a4,6e6 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 58e: 06300713 li a4,99 + 592: 18e78e63 beq a5,a4,72e + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 596: 07300713 li a4,115 + 59a: 1ae78463 beq a5,a4,742 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 59e: 02500713 li a4,37 + 5a2: 04e79563 bne a5,a4,5ec + putc(fd, '%'); + 5a6: 02500593 li a1,37 + 5aa: 855a mv a0,s6 + 5ac: e8dff0ef jal 438 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 5b0: 4981 li s3,0 + 5b2: b769 j 53c + printint(fd, va_arg(ap, int), 10, 1); + 5b4: 008b8913 addi s2,s7,8 + 5b8: 4685 li a3,1 + 5ba: 4629 li a2,10 + 5bc: 000ba583 lw a1,0(s7) + 5c0: 855a mv a0,s6 + 5c2: e95ff0ef jal 456 + 5c6: 8bca mv s7,s2 + state = 0; + 5c8: 4981 li s3,0 + 5ca: bf8d j 53c + } else if(c0 == 'l' && c1 == 'd'){ + 5cc: 06400793 li a5,100 + 5d0: 02f68963 beq a3,a5,602 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5d4: 06c00793 li a5,108 + 5d8: 04f68263 beq a3,a5,61c + } else if(c0 == 'l' && c1 == 'u'){ + 5dc: 07500793 li a5,117 + 5e0: 0af68063 beq a3,a5,680 + } else if(c0 == 'l' && c1 == 'x'){ + 5e4: 07800793 li a5,120 + 5e8: 0ef68263 beq a3,a5,6cc + putc(fd, '%'); + 5ec: 02500593 li a1,37 + 5f0: 855a mv a0,s6 + 5f2: e47ff0ef jal 438 + putc(fd, c0); + 5f6: 85ca mv a1,s2 + 5f8: 855a mv a0,s6 + 5fa: e3fff0ef jal 438 + state = 0; + 5fe: 4981 li s3,0 + 600: bf35 j 53c + printint(fd, va_arg(ap, uint64), 10, 1); + 602: 008b8913 addi s2,s7,8 + 606: 4685 li a3,1 + 608: 4629 li a2,10 + 60a: 000bb583 ld a1,0(s7) + 60e: 855a mv a0,s6 + 610: e47ff0ef jal 456 + i += 1; + 614: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 616: 8bca mv s7,s2 + state = 0; + 618: 4981 li s3,0 + i += 1; + 61a: b70d j 53c + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 61c: 06400793 li a5,100 + 620: 02f60763 beq a2,a5,64e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 624: 07500793 li a5,117 + 628: 06f60963 beq a2,a5,69a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 62c: 07800793 li a5,120 + 630: faf61ee3 bne a2,a5,5ec + printint(fd, va_arg(ap, uint64), 16, 0); + 634: 008b8913 addi s2,s7,8 + 638: 4681 li a3,0 + 63a: 4641 li a2,16 + 63c: 000bb583 ld a1,0(s7) + 640: 855a mv a0,s6 + 642: e15ff0ef jal 456 + i += 2; + 646: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 648: 8bca mv s7,s2 + state = 0; + 64a: 4981 li s3,0 + i += 2; + 64c: bdc5 j 53c + printint(fd, va_arg(ap, uint64), 10, 1); + 64e: 008b8913 addi s2,s7,8 + 652: 4685 li a3,1 + 654: 4629 li a2,10 + 656: 000bb583 ld a1,0(s7) + 65a: 855a mv a0,s6 + 65c: dfbff0ef jal 456 + i += 2; + 660: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 662: 8bca mv s7,s2 + state = 0; + 664: 4981 li s3,0 + i += 2; + 666: bdd9 j 53c + printint(fd, va_arg(ap, uint32), 10, 0); + 668: 008b8913 addi s2,s7,8 + 66c: 4681 li a3,0 + 66e: 4629 li a2,10 + 670: 000be583 lwu a1,0(s7) + 674: 855a mv a0,s6 + 676: de1ff0ef jal 456 + 67a: 8bca mv s7,s2 + state = 0; + 67c: 4981 li s3,0 + 67e: bd7d j 53c + printint(fd, va_arg(ap, uint64), 10, 0); + 680: 008b8913 addi s2,s7,8 + 684: 4681 li a3,0 + 686: 4629 li a2,10 + 688: 000bb583 ld a1,0(s7) + 68c: 855a mv a0,s6 + 68e: dc9ff0ef jal 456 + i += 1; + 692: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 694: 8bca mv s7,s2 + state = 0; + 696: 4981 li s3,0 + i += 1; + 698: b555 j 53c + printint(fd, va_arg(ap, uint64), 10, 0); + 69a: 008b8913 addi s2,s7,8 + 69e: 4681 li a3,0 + 6a0: 4629 li a2,10 + 6a2: 000bb583 ld a1,0(s7) + 6a6: 855a mv a0,s6 + 6a8: dafff0ef jal 456 + i += 2; + 6ac: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 6ae: 8bca mv s7,s2 + state = 0; + 6b0: 4981 li s3,0 + i += 2; + 6b2: b569 j 53c + printint(fd, va_arg(ap, uint32), 16, 0); + 6b4: 008b8913 addi s2,s7,8 + 6b8: 4681 li a3,0 + 6ba: 4641 li a2,16 + 6bc: 000be583 lwu a1,0(s7) + 6c0: 855a mv a0,s6 + 6c2: d95ff0ef jal 456 + 6c6: 8bca mv s7,s2 + state = 0; + 6c8: 4981 li s3,0 + 6ca: bd8d j 53c + printint(fd, va_arg(ap, uint64), 16, 0); + 6cc: 008b8913 addi s2,s7,8 + 6d0: 4681 li a3,0 + 6d2: 4641 li a2,16 + 6d4: 000bb583 ld a1,0(s7) + 6d8: 855a mv a0,s6 + 6da: d7dff0ef jal 456 + i += 1; + 6de: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6e0: 8bca mv s7,s2 + state = 0; + 6e2: 4981 li s3,0 + i += 1; + 6e4: bda1 j 53c + 6e6: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 6e8: 008b8d13 addi s10,s7,8 + 6ec: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6f0: 03000593 li a1,48 + 6f4: 855a mv a0,s6 + 6f6: d43ff0ef jal 438 + putc(fd, 'x'); + 6fa: 07800593 li a1,120 + 6fe: 855a mv a0,s6 + 700: d39ff0ef jal 438 + 704: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 706: 00000b97 auipc s7,0x0 + 70a: 2bab8b93 addi s7,s7,698 # 9c0 + 70e: 03c9d793 srli a5,s3,0x3c + 712: 97de add a5,a5,s7 + 714: 0007c583 lbu a1,0(a5) + 718: 855a mv a0,s6 + 71a: d1fff0ef jal 438 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 71e: 0992 slli s3,s3,0x4 + 720: 397d addiw s2,s2,-1 + 722: fe0916e3 bnez s2,70e + printptr(fd, va_arg(ap, uint64)); + 726: 8bea mv s7,s10 + state = 0; + 728: 4981 li s3,0 + 72a: 6d02 ld s10,0(sp) + 72c: bd01 j 53c + putc(fd, va_arg(ap, uint32)); + 72e: 008b8913 addi s2,s7,8 + 732: 000bc583 lbu a1,0(s7) + 736: 855a mv a0,s6 + 738: d01ff0ef jal 438 + 73c: 8bca mv s7,s2 + state = 0; + 73e: 4981 li s3,0 + 740: bbf5 j 53c + if((s = va_arg(ap, char*)) == 0) + 742: 008b8993 addi s3,s7,8 + 746: 000bb903 ld s2,0(s7) + 74a: 00090f63 beqz s2,768 + for(; *s; s++) + 74e: 00094583 lbu a1,0(s2) + 752: c195 beqz a1,776 + putc(fd, *s); + 754: 855a mv a0,s6 + 756: ce3ff0ef jal 438 + for(; *s; s++) + 75a: 0905 addi s2,s2,1 + 75c: 00094583 lbu a1,0(s2) + 760: f9f5 bnez a1,754 + if((s = va_arg(ap, char*)) == 0) + 762: 8bce mv s7,s3 + state = 0; + 764: 4981 li s3,0 + 766: bbd9 j 53c + s = "(null)"; + 768: 00000917 auipc s2,0x0 + 76c: 25090913 addi s2,s2,592 # 9b8 + for(; *s; s++) + 770: 02800593 li a1,40 + 774: b7c5 j 754 + if((s = va_arg(ap, char*)) == 0) + 776: 8bce mv s7,s3 + state = 0; + 778: 4981 li s3,0 + 77a: b3c9 j 53c + 77c: 64a6 ld s1,72(sp) + 77e: 79e2 ld s3,56(sp) + 780: 7a42 ld s4,48(sp) + 782: 7aa2 ld s5,40(sp) + 784: 7b02 ld s6,32(sp) + 786: 6be2 ld s7,24(sp) + 788: 6c42 ld s8,16(sp) + 78a: 6ca2 ld s9,8(sp) + } + } +} + 78c: 60e6 ld ra,88(sp) + 78e: 6446 ld s0,80(sp) + 790: 6906 ld s2,64(sp) + 792: 6125 addi sp,sp,96 + 794: 8082 ret + +0000000000000796 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 796: 715d addi sp,sp,-80 + 798: ec06 sd ra,24(sp) + 79a: e822 sd s0,16(sp) + 79c: 1000 addi s0,sp,32 + 79e: e010 sd a2,0(s0) + 7a0: e414 sd a3,8(s0) + 7a2: e818 sd a4,16(s0) + 7a4: ec1c sd a5,24(s0) + 7a6: 03043023 sd a6,32(s0) + 7aa: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 7ae: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 7b2: 8622 mv a2,s0 + 7b4: d3fff0ef jal 4f2 +} + 7b8: 60e2 ld ra,24(sp) + 7ba: 6442 ld s0,16(sp) + 7bc: 6161 addi sp,sp,80 + 7be: 8082 ret + +00000000000007c0 : + +void +printf(const char *fmt, ...) +{ + 7c0: 711d addi sp,sp,-96 + 7c2: ec06 sd ra,24(sp) + 7c4: e822 sd s0,16(sp) + 7c6: 1000 addi s0,sp,32 + 7c8: e40c sd a1,8(s0) + 7ca: e810 sd a2,16(s0) + 7cc: ec14 sd a3,24(s0) + 7ce: f018 sd a4,32(s0) + 7d0: f41c sd a5,40(s0) + 7d2: 03043823 sd a6,48(s0) + 7d6: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 7da: 00840613 addi a2,s0,8 + 7de: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 7e2: 85aa mv a1,a0 + 7e4: 4505 li a0,1 + 7e6: d0dff0ef jal 4f2 +} + 7ea: 60e2 ld ra,24(sp) + 7ec: 6442 ld s0,16(sp) + 7ee: 6125 addi sp,sp,96 + 7f0: 8082 ret + +00000000000007f2 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7f2: 1141 addi sp,sp,-16 + 7f4: e422 sd s0,8(sp) + 7f6: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7f8: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7fc: 00001797 auipc a5,0x1 + 800: 8047b783 ld a5,-2044(a5) # 1000 + 804: a02d j 82e + 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; + 806: 4618 lw a4,8(a2) + 808: 9f2d addw a4,a4,a1 + 80a: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 80e: 6398 ld a4,0(a5) + 810: 6310 ld a2,0(a4) + 812: a83d j 850 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 814: ff852703 lw a4,-8(a0) + 818: 9f31 addw a4,a4,a2 + 81a: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 81c: ff053683 ld a3,-16(a0) + 820: a091 j 864 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 822: 6398 ld a4,0(a5) + 824: 00e7e463 bltu a5,a4,82c + 828: 00e6ea63 bltu a3,a4,83c +{ + 82c: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 82e: fed7fae3 bgeu a5,a3,822 + 832: 6398 ld a4,0(a5) + 834: 00e6e463 bltu a3,a4,83c + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 838: fee7eae3 bltu a5,a4,82c + if(bp + bp->s.size == p->s.ptr){ + 83c: ff852583 lw a1,-8(a0) + 840: 6390 ld a2,0(a5) + 842: 02059813 slli a6,a1,0x20 + 846: 01c85713 srli a4,a6,0x1c + 84a: 9736 add a4,a4,a3 + 84c: fae60de3 beq a2,a4,806 + bp->s.ptr = p->s.ptr->s.ptr; + 850: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 854: 4790 lw a2,8(a5) + 856: 02061593 slli a1,a2,0x20 + 85a: 01c5d713 srli a4,a1,0x1c + 85e: 973e add a4,a4,a5 + 860: fae68ae3 beq a3,a4,814 + p->s.ptr = bp->s.ptr; + 864: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 866: 00000717 auipc a4,0x0 + 86a: 78f73d23 sd a5,1946(a4) # 1000 +} + 86e: 6422 ld s0,8(sp) + 870: 0141 addi sp,sp,16 + 872: 8082 ret + +0000000000000874 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 874: 7139 addi sp,sp,-64 + 876: fc06 sd ra,56(sp) + 878: f822 sd s0,48(sp) + 87a: f426 sd s1,40(sp) + 87c: ec4e sd s3,24(sp) + 87e: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 880: 02051493 slli s1,a0,0x20 + 884: 9081 srli s1,s1,0x20 + 886: 04bd addi s1,s1,15 + 888: 8091 srli s1,s1,0x4 + 88a: 0014899b addiw s3,s1,1 + 88e: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 890: 00000517 auipc a0,0x0 + 894: 77053503 ld a0,1904(a0) # 1000 + 898: c915 beqz a0,8cc + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 89a: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 89c: 4798 lw a4,8(a5) + 89e: 08977a63 bgeu a4,s1,932 + 8a2: f04a sd s2,32(sp) + 8a4: e852 sd s4,16(sp) + 8a6: e456 sd s5,8(sp) + 8a8: e05a sd s6,0(sp) + if(nu < 4096) + 8aa: 8a4e mv s4,s3 + 8ac: 0009871b sext.w a4,s3 + 8b0: 6685 lui a3,0x1 + 8b2: 00d77363 bgeu a4,a3,8b8 + 8b6: 6a05 lui s4,0x1 + 8b8: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 8bc: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 8c0: 00000917 auipc s2,0x0 + 8c4: 74090913 addi s2,s2,1856 # 1000 + if(p == SBRK_ERROR) + 8c8: 5afd li s5,-1 + 8ca: a081 j 90a + 8cc: f04a sd s2,32(sp) + 8ce: e852 sd s4,16(sp) + 8d0: e456 sd s5,8(sp) + 8d2: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 8d4: 00001797 auipc a5,0x1 + 8d8: 93478793 addi a5,a5,-1740 # 1208 + 8dc: 00000717 auipc a4,0x0 + 8e0: 72f73223 sd a5,1828(a4) # 1000 + 8e4: e39c sd a5,0(a5) + base.s.size = 0; + 8e6: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 8ea: b7c1 j 8aa + prevp->s.ptr = p->s.ptr; + 8ec: 6398 ld a4,0(a5) + 8ee: e118 sd a4,0(a0) + 8f0: a8a9 j 94a + hp->s.size = nu; + 8f2: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8f6: 0541 addi a0,a0,16 + 8f8: efbff0ef jal 7f2 + return freep; + 8fc: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 900: c12d beqz a0,962 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 902: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 904: 4798 lw a4,8(a5) + 906: 02977263 bgeu a4,s1,92a + if(p == freep) + 90a: 00093703 ld a4,0(s2) + 90e: 853e mv a0,a5 + 910: fef719e3 bne a4,a5,902 + p = sbrk(nu * sizeof(Header)); + 914: 8552 mv a0,s4 + 916: a4fff0ef jal 364 + if(p == SBRK_ERROR) + 91a: fd551ce3 bne a0,s5,8f2 + return 0; + 91e: 4501 li a0,0 + 920: 7902 ld s2,32(sp) + 922: 6a42 ld s4,16(sp) + 924: 6aa2 ld s5,8(sp) + 926: 6b02 ld s6,0(sp) + 928: a03d j 956 + 92a: 7902 ld s2,32(sp) + 92c: 6a42 ld s4,16(sp) + 92e: 6aa2 ld s5,8(sp) + 930: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 932: fae48de3 beq s1,a4,8ec + p->s.size -= nunits; + 936: 4137073b subw a4,a4,s3 + 93a: c798 sw a4,8(a5) + p += p->s.size; + 93c: 02071693 slli a3,a4,0x20 + 940: 01c6d713 srli a4,a3,0x1c + 944: 97ba add a5,a5,a4 + p->s.size = nunits; + 946: 0137a423 sw s3,8(a5) + freep = prevp; + 94a: 00000717 auipc a4,0x0 + 94e: 6aa73b23 sd a0,1718(a4) # 1000 + return (void*)(p + 1); + 952: 01078513 addi a0,a5,16 + } +} + 956: 70e2 ld ra,56(sp) + 958: 7442 ld s0,48(sp) + 95a: 74a2 ld s1,40(sp) + 95c: 69e2 ld s3,24(sp) + 95e: 6121 addi sp,sp,64 + 960: 8082 ret + 962: 7902 ld s2,32(sp) + 964: 6a42 ld s4,16(sp) + 966: 6aa2 ld s5,8(sp) + 968: 6b02 ld s6,0(sp) + 96a: b7f5 j 956 diff --git a/G12_Project2_2/user/logstress.c b/G12_Project2_2/user/logstress.c new file mode 100644 index 0000000000..a114f276f2 --- /dev/null +++ b/G12_Project2_2/user/logstress.c @@ -0,0 +1,48 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "kernel/fcntl.h" +#include "user/user.h" + +// Stress xv6 logging system by having several processes writing +// concurrently to their own file (e.g., logstress f1 f2 f3 f4) + +#define BUFSZ 500 + +char buf[BUFSZ]; + +int +main(int argc, char **argv) +{ + int fd, n; + enum { N = 250, SZ=2000 }; + + for (int i = 1; i < argc; i++){ + int pid1 = fork(); + if(pid1 < 0){ + printf("%s: fork failed\n", argv[0]); + exit(1); + } + if(pid1 == 0) { + fd = open(argv[i], O_CREATE | O_RDWR); + if(fd < 0){ + printf("%s: create %s failed\n", argv[0], argv[i]); + exit(1); + } + memset(buf, '0'+i, 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(int i = 1; i < argc; i++){ + wait(&xstatus); + if(xstatus != 0) + exit(xstatus); + } + return 0; +} diff --git a/G12_Project2_2/user/logstress.d b/G12_Project2_2/user/logstress.d new file mode 100644 index 0000000000..42def16bf4 --- /dev/null +++ b/G12_Project2_2/user/logstress.d @@ -0,0 +1,2 @@ +user/logstress.o: user/logstress.c kernel/types.h kernel/stat.h \ + kernel/fcntl.h user/user.h diff --git a/G12_Project2_2/user/logstress.o b/G12_Project2_2/user/logstress.o new file mode 100644 index 0000000000..fbdb4b74e3 Binary files /dev/null and b/G12_Project2_2/user/logstress.o differ diff --git a/G12_Project2_2/user/logstress.sym b/G12_Project2_2/user/logstress.sym new file mode 100644 index 0000000000..738b911320 --- /dev/null +++ b/G12_Project2_2/user/logstress.sym @@ -0,0 +1,66 @@ +0000000000000000 .text +0000000000000970 .rodata +00000000000009d8 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 logstress.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000438 putc +0000000000000456 printint +00000000000009c0 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001208 base +0000000000000114 strcpy +0000000000000428 pause +00000000000007c0 printf +0000000000000420 sys_sbrk +00000000000002be memmove +00000000000003e0 mknod +00000000000001cc gets +0000000000000418 getpid +0000000000000350 memcpy +0000000000000874 malloc +000000000000037a sbrklazy +00000000000003a8 pipe +00000000000003b8 write +00000000000003f0 fstat +0000000000000796 fprintf +00000000000003c8 kill +00000000000004f2 vprintf +0000000000000408 chdir +00000000000003d0 exec +00000000000003a0 wait +00000000000003b0 read +00000000000003e8 unlink +0000000000000316 memcmp +0000000000000390 fork +0000000000000364 sbrk +0000000000000430 uptime +0000000000000186 memset +0000000000000000 main +0000000000000130 strcmp +0000000000000410 dup +0000000000001010 buf +000000000000023c stat +00000000000003f8 link +0000000000000398 exit +0000000000000104 start +0000000000000276 atoi +000000000000015c strlen +00000000000003d8 open +00000000000001a8 strchr +0000000000000400 mkdir +00000000000003c0 close +00000000000007f2 free diff --git a/G12_Project2_2/user/ls.asm b/G12_Project2_2/user/ls.asm new file mode 100644 index 0000000000..e2f6c73799 --- /dev/null +++ b/G12_Project2_2/user/ls.asm @@ -0,0 +1,1745 @@ + +user/_ls: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : +#include "kernel/fs.h" +#include "kernel/fcntl.h" + +char* +fmtname(char *path) +{ + 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: 1800 addi s0,sp,48 + a: 84aa mv s1,a0 + static char buf[DIRSIZ+1]; + char *p; + + // Find first character after last slash. + for(p=path+strlen(path); p >= path && *p != '/'; p--) + c: 2b8000ef jal 2c4 + 10: 02051793 slli a5,a0,0x20 + 14: 9381 srli a5,a5,0x20 + 16: 97a6 add a5,a5,s1 + 18: 02f00693 li a3,47 + 1c: 0097e963 bltu a5,s1,2e + 20: 0007c703 lbu a4,0(a5) + 24: 00d70563 beq a4,a3,2e + 28: 17fd addi a5,a5,-1 + 2a: fe97fbe3 bgeu a5,s1,20 + ; + p++; + 2e: 00178493 addi s1,a5,1 + + // Return blank-padded name. + if(strlen(p) >= DIRSIZ) + 32: 8526 mv a0,s1 + 34: 290000ef jal 2c4 + 38: 2501 sext.w a0,a0 + 3a: 47b5 li a5,13 + 3c: 00a7f863 bgeu a5,a0,4c + return p; + memmove(buf, p, strlen(p)); + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + buf[sizeof(buf)-1] = '\0'; + return buf; +} + 40: 8526 mv a0,s1 + 42: 70a2 ld ra,40(sp) + 44: 7402 ld s0,32(sp) + 46: 64e2 ld s1,24(sp) + 48: 6145 addi sp,sp,48 + 4a: 8082 ret + 4c: e84a sd s2,16(sp) + 4e: e44e sd s3,8(sp) + memmove(buf, p, strlen(p)); + 50: 8526 mv a0,s1 + 52: 272000ef jal 2c4 + 56: 00002997 auipc s3,0x2 + 5a: fba98993 addi s3,s3,-70 # 2010 + 5e: 0005061b sext.w a2,a0 + 62: 85a6 mv a1,s1 + 64: 854e mv a0,s3 + 66: 3c0000ef jal 426 + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + 6a: 8526 mv a0,s1 + 6c: 258000ef jal 2c4 + 70: 0005091b sext.w s2,a0 + 74: 8526 mv a0,s1 + 76: 24e000ef jal 2c4 + 7a: 1902 slli s2,s2,0x20 + 7c: 02095913 srli s2,s2,0x20 + 80: 4639 li a2,14 + 82: 9e09 subw a2,a2,a0 + 84: 02000593 li a1,32 + 88: 01298533 add a0,s3,s2 + 8c: 262000ef jal 2ee + buf[sizeof(buf)-1] = '\0'; + 90: 00098723 sb zero,14(s3) + return buf; + 94: 84ce mv s1,s3 + 96: 6942 ld s2,16(sp) + 98: 69a2 ld s3,8(sp) + 9a: b75d j 40 + +000000000000009c : + +void +ls(char *path) +{ + 9c: d9010113 addi sp,sp,-624 + a0: 26113423 sd ra,616(sp) + a4: 26813023 sd s0,608(sp) + a8: 25213823 sd s2,592(sp) + ac: 1c80 addi s0,sp,624 + ae: 892a mv s2,a0 + char buf[512], *p; + int fd; + struct dirent de; + struct stat st; + + if((fd = open(path, O_RDONLY)) < 0){ + b0: 4581 li a1,0 + b2: 48e000ef jal 540 + b6: 06054363 bltz a0,11c + ba: 24913c23 sd s1,600(sp) + be: 84aa mv s1,a0 + fprintf(2, "ls: cannot open %s\n", path); + return; + } + + if(fstat(fd, &st) < 0){ + c0: d9840593 addi a1,s0,-616 + c4: 494000ef jal 558 + c8: 06054363 bltz a0,12e + fprintf(2, "ls: cannot stat %s\n", path); + close(fd); + return; + } + + switch(st.type){ + cc: da041783 lh a5,-608(s0) + d0: 4705 li a4,1 + d2: 06e78c63 beq a5,a4,14a + d6: 37f9 addiw a5,a5,-2 + d8: 17c2 slli a5,a5,0x30 + da: 93c1 srli a5,a5,0x30 + dc: 02f76263 bltu a4,a5,100 + case T_DEVICE: + case T_FILE: + printf("%s %d %d %d\n", fmtname(path), st.type, st.ino, (int) st.size); + e0: 854a mv a0,s2 + e2: f1fff0ef jal 0 + e6: 85aa mv a1,a0 + e8: da842703 lw a4,-600(s0) + ec: d9c42683 lw a3,-612(s0) + f0: da041603 lh a2,-608(s0) + f4: 00001517 auipc a0,0x1 + f8: a1c50513 addi a0,a0,-1508 # b10 + fc: 02d000ef jal 928 + } + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + } + break; + } + close(fd); + 100: 8526 mv a0,s1 + 102: 426000ef jal 528 + 106: 25813483 ld s1,600(sp) +} + 10a: 26813083 ld ra,616(sp) + 10e: 26013403 ld s0,608(sp) + 112: 25013903 ld s2,592(sp) + 116: 27010113 addi sp,sp,624 + 11a: 8082 ret + fprintf(2, "ls: cannot open %s\n", path); + 11c: 864a mv a2,s2 + 11e: 00001597 auipc a1,0x1 + 122: 9c258593 addi a1,a1,-1598 # ae0 + 126: 4509 li a0,2 + 128: 7d6000ef jal 8fe + return; + 12c: bff9 j 10a + fprintf(2, "ls: cannot stat %s\n", path); + 12e: 864a mv a2,s2 + 130: 00001597 auipc a1,0x1 + 134: 9c858593 addi a1,a1,-1592 # af8 + 138: 4509 li a0,2 + 13a: 7c4000ef jal 8fe + close(fd); + 13e: 8526 mv a0,s1 + 140: 3e8000ef jal 528 + return; + 144: 25813483 ld s1,600(sp) + 148: b7c9 j 10a + if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){ + 14a: 854a mv a0,s2 + 14c: 178000ef jal 2c4 + 150: 2541 addiw a0,a0,16 + 152: 20000793 li a5,512 + 156: 00a7f963 bgeu a5,a0,168 + printf("ls: path too long\n"); + 15a: 00001517 auipc a0,0x1 + 15e: 9c650513 addi a0,a0,-1594 # b20 + 162: 7c6000ef jal 928 + break; + 166: bf69 j 100 + 168: 25313423 sd s3,584(sp) + 16c: 25413023 sd s4,576(sp) + 170: 23513c23 sd s5,568(sp) + strcpy(buf, path); + 174: 85ca mv a1,s2 + 176: dc040513 addi a0,s0,-576 + 17a: 102000ef jal 27c + p = buf+strlen(buf); + 17e: dc040513 addi a0,s0,-576 + 182: 142000ef jal 2c4 + 186: 1502 slli a0,a0,0x20 + 188: 9101 srli a0,a0,0x20 + 18a: dc040793 addi a5,s0,-576 + 18e: 00a78933 add s2,a5,a0 + *p++ = '/'; + 192: 00190993 addi s3,s2,1 + 196: 02f00793 li a5,47 + 19a: 00f90023 sb a5,0(s2) + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + 19e: 00001a17 auipc s4,0x1 + 1a2: 972a0a13 addi s4,s4,-1678 # b10 + printf("ls: cannot stat %s\n", buf); + 1a6: 00001a97 auipc s5,0x1 + 1aa: 952a8a93 addi s5,s5,-1710 # af8 + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + 1ae: a031 j 1ba + printf("ls: cannot stat %s\n", buf); + 1b0: dc040593 addi a1,s0,-576 + 1b4: 8556 mv a0,s5 + 1b6: 772000ef jal 928 + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + 1ba: 4641 li a2,16 + 1bc: db040593 addi a1,s0,-592 + 1c0: 8526 mv a0,s1 + 1c2: 356000ef jal 518 + 1c6: 47c1 li a5,16 + 1c8: 04f51463 bne a0,a5,210 + if(de.inum == 0) + 1cc: db045783 lhu a5,-592(s0) + 1d0: d7ed beqz a5,1ba + memmove(p, de.name, DIRSIZ); + 1d2: 4639 li a2,14 + 1d4: db240593 addi a1,s0,-590 + 1d8: 854e mv a0,s3 + 1da: 24c000ef jal 426 + p[DIRSIZ] = 0; + 1de: 000907a3 sb zero,15(s2) + if(stat(buf, &st) < 0){ + 1e2: d9840593 addi a1,s0,-616 + 1e6: dc040513 addi a0,s0,-576 + 1ea: 1ba000ef jal 3a4 + 1ee: fc0541e3 bltz a0,1b0 + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + 1f2: dc040513 addi a0,s0,-576 + 1f6: e0bff0ef jal 0 + 1fa: 85aa mv a1,a0 + 1fc: da842703 lw a4,-600(s0) + 200: d9c42683 lw a3,-612(s0) + 204: da041603 lh a2,-608(s0) + 208: 8552 mv a0,s4 + 20a: 71e000ef jal 928 + 20e: b775 j 1ba + 210: 24813983 ld s3,584(sp) + 214: 24013a03 ld s4,576(sp) + 218: 23813a83 ld s5,568(sp) + 21c: b5d5 j 100 + +000000000000021e
: + +int +main(int argc, char *argv[]) +{ + 21e: 1101 addi sp,sp,-32 + 220: ec06 sd ra,24(sp) + 222: e822 sd s0,16(sp) + 224: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + 226: 4785 li a5,1 + 228: 02a7d763 bge a5,a0,256 + 22c: e426 sd s1,8(sp) + 22e: e04a sd s2,0(sp) + 230: 00858493 addi s1,a1,8 + 234: ffe5091b addiw s2,a0,-2 + 238: 02091793 slli a5,s2,0x20 + 23c: 01d7d913 srli s2,a5,0x1d + 240: 05c1 addi a1,a1,16 + 242: 992e add s2,s2,a1 + ls("."); + exit(0); + } + for(i=1; i + for(i=1; i + exit(0); + 250: 4501 li a0,0 + 252: 2ae000ef jal 500 + 256: e426 sd s1,8(sp) + 258: e04a sd s2,0(sp) + ls("."); + 25a: 00001517 auipc a0,0x1 + 25e: 8de50513 addi a0,a0,-1826 # b38 + 262: e3bff0ef jal 9c + exit(0); + 266: 4501 li a0,0 + 268: 298000ef jal 500 + +000000000000026c : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 26c: 1141 addi sp,sp,-16 + 26e: e406 sd ra,8(sp) + 270: e022 sd s0,0(sp) + 272: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 274: fabff0ef jal 21e
+ exit(r); + 278: 288000ef jal 500 + +000000000000027c : +} + +char* +strcpy(char *s, const char *t) +{ + 27c: 1141 addi sp,sp,-16 + 27e: e422 sd s0,8(sp) + 280: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 282: 87aa mv a5,a0 + 284: 0585 addi a1,a1,1 + 286: 0785 addi a5,a5,1 + 288: fff5c703 lbu a4,-1(a1) + 28c: fee78fa3 sb a4,-1(a5) + 290: fb75 bnez a4,284 + ; + return os; +} + 292: 6422 ld s0,8(sp) + 294: 0141 addi sp,sp,16 + 296: 8082 ret + +0000000000000298 : + +int +strcmp(const char *p, const char *q) +{ + 298: 1141 addi sp,sp,-16 + 29a: e422 sd s0,8(sp) + 29c: 0800 addi s0,sp,16 + while(*p && *p == *q) + 29e: 00054783 lbu a5,0(a0) + 2a2: cb91 beqz a5,2b6 + 2a4: 0005c703 lbu a4,0(a1) + 2a8: 00f71763 bne a4,a5,2b6 + p++, q++; + 2ac: 0505 addi a0,a0,1 + 2ae: 0585 addi a1,a1,1 + while(*p && *p == *q) + 2b0: 00054783 lbu a5,0(a0) + 2b4: fbe5 bnez a5,2a4 + return (uchar)*p - (uchar)*q; + 2b6: 0005c503 lbu a0,0(a1) +} + 2ba: 40a7853b subw a0,a5,a0 + 2be: 6422 ld s0,8(sp) + 2c0: 0141 addi sp,sp,16 + 2c2: 8082 ret + +00000000000002c4 : + +uint +strlen(const char *s) +{ + 2c4: 1141 addi sp,sp,-16 + 2c6: e422 sd s0,8(sp) + 2c8: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 2ca: 00054783 lbu a5,0(a0) + 2ce: cf91 beqz a5,2ea + 2d0: 0505 addi a0,a0,1 + 2d2: 87aa mv a5,a0 + 2d4: 86be mv a3,a5 + 2d6: 0785 addi a5,a5,1 + 2d8: fff7c703 lbu a4,-1(a5) + 2dc: ff65 bnez a4,2d4 + 2de: 40a6853b subw a0,a3,a0 + 2e2: 2505 addiw a0,a0,1 + ; + return n; +} + 2e4: 6422 ld s0,8(sp) + 2e6: 0141 addi sp,sp,16 + 2e8: 8082 ret + for(n = 0; s[n]; n++) + 2ea: 4501 li a0,0 + 2ec: bfe5 j 2e4 + +00000000000002ee : + +void* +memset(void *dst, int c, uint n) +{ + 2ee: 1141 addi sp,sp,-16 + 2f0: e422 sd s0,8(sp) + 2f2: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 2f4: ca19 beqz a2,30a + 2f6: 87aa mv a5,a0 + 2f8: 1602 slli a2,a2,0x20 + 2fa: 9201 srli a2,a2,0x20 + 2fc: 00a60733 add a4,a2,a0 + cdst[i] = c; + 300: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 304: 0785 addi a5,a5,1 + 306: fee79de3 bne a5,a4,300 + } + return dst; +} + 30a: 6422 ld s0,8(sp) + 30c: 0141 addi sp,sp,16 + 30e: 8082 ret + +0000000000000310 : + +char* +strchr(const char *s, char c) +{ + 310: 1141 addi sp,sp,-16 + 312: e422 sd s0,8(sp) + 314: 0800 addi s0,sp,16 + for(; *s; s++) + 316: 00054783 lbu a5,0(a0) + 31a: cb99 beqz a5,330 + if(*s == c) + 31c: 00f58763 beq a1,a5,32a + for(; *s; s++) + 320: 0505 addi a0,a0,1 + 322: 00054783 lbu a5,0(a0) + 326: fbfd bnez a5,31c + return (char*)s; + return 0; + 328: 4501 li a0,0 +} + 32a: 6422 ld s0,8(sp) + 32c: 0141 addi sp,sp,16 + 32e: 8082 ret + return 0; + 330: 4501 li a0,0 + 332: bfe5 j 32a + +0000000000000334 : + +char* +gets(char *buf, int max) +{ + 334: 711d addi sp,sp,-96 + 336: ec86 sd ra,88(sp) + 338: e8a2 sd s0,80(sp) + 33a: e4a6 sd s1,72(sp) + 33c: e0ca sd s2,64(sp) + 33e: fc4e sd s3,56(sp) + 340: f852 sd s4,48(sp) + 342: f456 sd s5,40(sp) + 344: f05a sd s6,32(sp) + 346: ec5e sd s7,24(sp) + 348: 1080 addi s0,sp,96 + 34a: 8baa mv s7,a0 + 34c: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 34e: 892a mv s2,a0 + 350: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 352: 4aa9 li s5,10 + 354: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 356: 89a6 mv s3,s1 + 358: 2485 addiw s1,s1,1 + 35a: 0344d663 bge s1,s4,386 + cc = read(0, &c, 1); + 35e: 4605 li a2,1 + 360: faf40593 addi a1,s0,-81 + 364: 4501 li a0,0 + 366: 1b2000ef jal 518 + if(cc < 1) + 36a: 00a05e63 blez a0,386 + buf[i++] = c; + 36e: faf44783 lbu a5,-81(s0) + 372: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 376: 01578763 beq a5,s5,384 + 37a: 0905 addi s2,s2,1 + 37c: fd679de3 bne a5,s6,356 + buf[i++] = c; + 380: 89a6 mv s3,s1 + 382: a011 j 386 + 384: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 386: 99de add s3,s3,s7 + 388: 00098023 sb zero,0(s3) + return buf; +} + 38c: 855e mv a0,s7 + 38e: 60e6 ld ra,88(sp) + 390: 6446 ld s0,80(sp) + 392: 64a6 ld s1,72(sp) + 394: 6906 ld s2,64(sp) + 396: 79e2 ld s3,56(sp) + 398: 7a42 ld s4,48(sp) + 39a: 7aa2 ld s5,40(sp) + 39c: 7b02 ld s6,32(sp) + 39e: 6be2 ld s7,24(sp) + 3a0: 6125 addi sp,sp,96 + 3a2: 8082 ret + +00000000000003a4 : + +int +stat(const char *n, struct stat *st) +{ + 3a4: 1101 addi sp,sp,-32 + 3a6: ec06 sd ra,24(sp) + 3a8: e822 sd s0,16(sp) + 3aa: e04a sd s2,0(sp) + 3ac: 1000 addi s0,sp,32 + 3ae: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 3b0: 4581 li a1,0 + 3b2: 18e000ef jal 540 + if(fd < 0) + 3b6: 02054263 bltz a0,3da + 3ba: e426 sd s1,8(sp) + 3bc: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 3be: 85ca mv a1,s2 + 3c0: 198000ef jal 558 + 3c4: 892a mv s2,a0 + close(fd); + 3c6: 8526 mv a0,s1 + 3c8: 160000ef jal 528 + return r; + 3cc: 64a2 ld s1,8(sp) +} + 3ce: 854a mv a0,s2 + 3d0: 60e2 ld ra,24(sp) + 3d2: 6442 ld s0,16(sp) + 3d4: 6902 ld s2,0(sp) + 3d6: 6105 addi sp,sp,32 + 3d8: 8082 ret + return -1; + 3da: 597d li s2,-1 + 3dc: bfcd j 3ce + +00000000000003de : + +int +atoi(const char *s) +{ + 3de: 1141 addi sp,sp,-16 + 3e0: e422 sd s0,8(sp) + 3e2: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 3e4: 00054683 lbu a3,0(a0) + 3e8: fd06879b addiw a5,a3,-48 + 3ec: 0ff7f793 zext.b a5,a5 + 3f0: 4625 li a2,9 + 3f2: 02f66863 bltu a2,a5,422 + 3f6: 872a mv a4,a0 + n = 0; + 3f8: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 3fa: 0705 addi a4,a4,1 + 3fc: 0025179b slliw a5,a0,0x2 + 400: 9fa9 addw a5,a5,a0 + 402: 0017979b slliw a5,a5,0x1 + 406: 9fb5 addw a5,a5,a3 + 408: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 40c: 00074683 lbu a3,0(a4) + 410: fd06879b addiw a5,a3,-48 + 414: 0ff7f793 zext.b a5,a5 + 418: fef671e3 bgeu a2,a5,3fa + return n; +} + 41c: 6422 ld s0,8(sp) + 41e: 0141 addi sp,sp,16 + 420: 8082 ret + n = 0; + 422: 4501 li a0,0 + 424: bfe5 j 41c + +0000000000000426 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 426: 1141 addi sp,sp,-16 + 428: e422 sd s0,8(sp) + 42a: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 42c: 02b57463 bgeu a0,a1,454 + while(n-- > 0) + 430: 00c05f63 blez a2,44e + 434: 1602 slli a2,a2,0x20 + 436: 9201 srli a2,a2,0x20 + 438: 00c507b3 add a5,a0,a2 + dst = vdst; + 43c: 872a mv a4,a0 + *dst++ = *src++; + 43e: 0585 addi a1,a1,1 + 440: 0705 addi a4,a4,1 + 442: fff5c683 lbu a3,-1(a1) + 446: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 44a: fef71ae3 bne a4,a5,43e + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 44e: 6422 ld s0,8(sp) + 450: 0141 addi sp,sp,16 + 452: 8082 ret + dst += n; + 454: 00c50733 add a4,a0,a2 + src += n; + 458: 95b2 add a1,a1,a2 + while(n-- > 0) + 45a: fec05ae3 blez a2,44e + 45e: fff6079b addiw a5,a2,-1 + 462: 1782 slli a5,a5,0x20 + 464: 9381 srli a5,a5,0x20 + 466: fff7c793 not a5,a5 + 46a: 97ba add a5,a5,a4 + *--dst = *--src; + 46c: 15fd addi a1,a1,-1 + 46e: 177d addi a4,a4,-1 + 470: 0005c683 lbu a3,0(a1) + 474: 00d70023 sb a3,0(a4) + while(n-- > 0) + 478: fee79ae3 bne a5,a4,46c + 47c: bfc9 j 44e + +000000000000047e : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 47e: 1141 addi sp,sp,-16 + 480: e422 sd s0,8(sp) + 482: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 484: ca05 beqz a2,4b4 + 486: fff6069b addiw a3,a2,-1 + 48a: 1682 slli a3,a3,0x20 + 48c: 9281 srli a3,a3,0x20 + 48e: 0685 addi a3,a3,1 + 490: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 492: 00054783 lbu a5,0(a0) + 496: 0005c703 lbu a4,0(a1) + 49a: 00e79863 bne a5,a4,4aa + return *p1 - *p2; + } + p1++; + 49e: 0505 addi a0,a0,1 + p2++; + 4a0: 0585 addi a1,a1,1 + while (n-- > 0) { + 4a2: fed518e3 bne a0,a3,492 + } + return 0; + 4a6: 4501 li a0,0 + 4a8: a019 j 4ae + return *p1 - *p2; + 4aa: 40e7853b subw a0,a5,a4 +} + 4ae: 6422 ld s0,8(sp) + 4b0: 0141 addi sp,sp,16 + 4b2: 8082 ret + return 0; + 4b4: 4501 li a0,0 + 4b6: bfe5 j 4ae + +00000000000004b8 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 4b8: 1141 addi sp,sp,-16 + 4ba: e406 sd ra,8(sp) + 4bc: e022 sd s0,0(sp) + 4be: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 4c0: f67ff0ef jal 426 +} + 4c4: 60a2 ld ra,8(sp) + 4c6: 6402 ld s0,0(sp) + 4c8: 0141 addi sp,sp,16 + 4ca: 8082 ret + +00000000000004cc : + +char * +sbrk(int n) { + 4cc: 1141 addi sp,sp,-16 + 4ce: e406 sd ra,8(sp) + 4d0: e022 sd s0,0(sp) + 4d2: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 4d4: 4585 li a1,1 + 4d6: 0b2000ef jal 588 +} + 4da: 60a2 ld ra,8(sp) + 4dc: 6402 ld s0,0(sp) + 4de: 0141 addi sp,sp,16 + 4e0: 8082 ret + +00000000000004e2 : + +char * +sbrklazy(int n) { + 4e2: 1141 addi sp,sp,-16 + 4e4: e406 sd ra,8(sp) + 4e6: e022 sd s0,0(sp) + 4e8: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 4ea: 4589 li a1,2 + 4ec: 09c000ef jal 588 +} + 4f0: 60a2 ld ra,8(sp) + 4f2: 6402 ld s0,0(sp) + 4f4: 0141 addi sp,sp,16 + 4f6: 8082 ret + +00000000000004f8 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 4f8: 4885 li a7,1 + ecall + 4fa: 00000073 ecall + ret + 4fe: 8082 ret + +0000000000000500 : +.global exit +exit: + li a7, SYS_exit + 500: 4889 li a7,2 + ecall + 502: 00000073 ecall + ret + 506: 8082 ret + +0000000000000508 : +.global wait +wait: + li a7, SYS_wait + 508: 488d li a7,3 + ecall + 50a: 00000073 ecall + ret + 50e: 8082 ret + +0000000000000510 : +.global pipe +pipe: + li a7, SYS_pipe + 510: 4891 li a7,4 + ecall + 512: 00000073 ecall + ret + 516: 8082 ret + +0000000000000518 : +.global read +read: + li a7, SYS_read + 518: 4895 li a7,5 + ecall + 51a: 00000073 ecall + ret + 51e: 8082 ret + +0000000000000520 : +.global write +write: + li a7, SYS_write + 520: 48c1 li a7,16 + ecall + 522: 00000073 ecall + ret + 526: 8082 ret + +0000000000000528 : +.global close +close: + li a7, SYS_close + 528: 48d5 li a7,21 + ecall + 52a: 00000073 ecall + ret + 52e: 8082 ret + +0000000000000530 : +.global kill +kill: + li a7, SYS_kill + 530: 4899 li a7,6 + ecall + 532: 00000073 ecall + ret + 536: 8082 ret + +0000000000000538 : +.global exec +exec: + li a7, SYS_exec + 538: 489d li a7,7 + ecall + 53a: 00000073 ecall + ret + 53e: 8082 ret + +0000000000000540 : +.global open +open: + li a7, SYS_open + 540: 48bd li a7,15 + ecall + 542: 00000073 ecall + ret + 546: 8082 ret + +0000000000000548 : +.global mknod +mknod: + li a7, SYS_mknod + 548: 48c5 li a7,17 + ecall + 54a: 00000073 ecall + ret + 54e: 8082 ret + +0000000000000550 : +.global unlink +unlink: + li a7, SYS_unlink + 550: 48c9 li a7,18 + ecall + 552: 00000073 ecall + ret + 556: 8082 ret + +0000000000000558 : +.global fstat +fstat: + li a7, SYS_fstat + 558: 48a1 li a7,8 + ecall + 55a: 00000073 ecall + ret + 55e: 8082 ret + +0000000000000560 : +.global link +link: + li a7, SYS_link + 560: 48cd li a7,19 + ecall + 562: 00000073 ecall + ret + 566: 8082 ret + +0000000000000568 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 568: 48d1 li a7,20 + ecall + 56a: 00000073 ecall + ret + 56e: 8082 ret + +0000000000000570 : +.global chdir +chdir: + li a7, SYS_chdir + 570: 48a5 li a7,9 + ecall + 572: 00000073 ecall + ret + 576: 8082 ret + +0000000000000578 : +.global dup +dup: + li a7, SYS_dup + 578: 48a9 li a7,10 + ecall + 57a: 00000073 ecall + ret + 57e: 8082 ret + +0000000000000580 : +.global getpid +getpid: + li a7, SYS_getpid + 580: 48ad li a7,11 + ecall + 582: 00000073 ecall + ret + 586: 8082 ret + +0000000000000588 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 588: 48b1 li a7,12 + ecall + 58a: 00000073 ecall + ret + 58e: 8082 ret + +0000000000000590 : +.global pause +pause: + li a7, SYS_pause + 590: 48b5 li a7,13 + ecall + 592: 00000073 ecall + ret + 596: 8082 ret + +0000000000000598 : +.global uptime +uptime: + li a7, SYS_uptime + 598: 48b9 li a7,14 + ecall + 59a: 00000073 ecall + ret + 59e: 8082 ret + +00000000000005a0 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 5a0: 1101 addi sp,sp,-32 + 5a2: ec06 sd ra,24(sp) + 5a4: e822 sd s0,16(sp) + 5a6: 1000 addi s0,sp,32 + 5a8: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 5ac: 4605 li a2,1 + 5ae: fef40593 addi a1,s0,-17 + 5b2: f6fff0ef jal 520 +} + 5b6: 60e2 ld ra,24(sp) + 5b8: 6442 ld s0,16(sp) + 5ba: 6105 addi sp,sp,32 + 5bc: 8082 ret + +00000000000005be : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 5be: 715d addi sp,sp,-80 + 5c0: e486 sd ra,72(sp) + 5c2: e0a2 sd s0,64(sp) + 5c4: f84a sd s2,48(sp) + 5c6: 0880 addi s0,sp,80 + 5c8: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 5ca: c299 beqz a3,5d0 + 5cc: 0805c363 bltz a1,652 + neg = 0; + 5d0: 4881 li a7,0 + 5d2: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 5d6: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 5d8: 00000517 auipc a0,0x0 + 5dc: 57050513 addi a0,a0,1392 # b48 + 5e0: 883e mv a6,a5 + 5e2: 2785 addiw a5,a5,1 + 5e4: 02c5f733 remu a4,a1,a2 + 5e8: 972a add a4,a4,a0 + 5ea: 00074703 lbu a4,0(a4) + 5ee: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 5f2: 872e mv a4,a1 + 5f4: 02c5d5b3 divu a1,a1,a2 + 5f8: 0685 addi a3,a3,1 + 5fa: fec773e3 bgeu a4,a2,5e0 + if(neg) + 5fe: 00088b63 beqz a7,614 + buf[i++] = '-'; + 602: fd078793 addi a5,a5,-48 + 606: 97a2 add a5,a5,s0 + 608: 02d00713 li a4,45 + 60c: fee78423 sb a4,-24(a5) + 610: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 614: 02f05a63 blez a5,648 + 618: fc26 sd s1,56(sp) + 61a: f44e sd s3,40(sp) + 61c: fb840713 addi a4,s0,-72 + 620: 00f704b3 add s1,a4,a5 + 624: fff70993 addi s3,a4,-1 + 628: 99be add s3,s3,a5 + 62a: 37fd addiw a5,a5,-1 + 62c: 1782 slli a5,a5,0x20 + 62e: 9381 srli a5,a5,0x20 + 630: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 634: fff4c583 lbu a1,-1(s1) + 638: 854a mv a0,s2 + 63a: f67ff0ef jal 5a0 + while(--i >= 0) + 63e: 14fd addi s1,s1,-1 + 640: ff349ae3 bne s1,s3,634 + 644: 74e2 ld s1,56(sp) + 646: 79a2 ld s3,40(sp) +} + 648: 60a6 ld ra,72(sp) + 64a: 6406 ld s0,64(sp) + 64c: 7942 ld s2,48(sp) + 64e: 6161 addi sp,sp,80 + 650: 8082 ret + x = -xx; + 652: 40b005b3 neg a1,a1 + neg = 1; + 656: 4885 li a7,1 + x = -xx; + 658: bfad j 5d2 + +000000000000065a : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 65a: 711d addi sp,sp,-96 + 65c: ec86 sd ra,88(sp) + 65e: e8a2 sd s0,80(sp) + 660: e0ca sd s2,64(sp) + 662: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 664: 0005c903 lbu s2,0(a1) + 668: 28090663 beqz s2,8f4 + 66c: e4a6 sd s1,72(sp) + 66e: fc4e sd s3,56(sp) + 670: f852 sd s4,48(sp) + 672: f456 sd s5,40(sp) + 674: f05a sd s6,32(sp) + 676: ec5e sd s7,24(sp) + 678: e862 sd s8,16(sp) + 67a: e466 sd s9,8(sp) + 67c: 8b2a mv s6,a0 + 67e: 8a2e mv s4,a1 + 680: 8bb2 mv s7,a2 + state = 0; + 682: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 684: 4481 li s1,0 + 686: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 688: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 68c: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 690: 06c00c93 li s9,108 + 694: a005 j 6b4 + putc(fd, c0); + 696: 85ca mv a1,s2 + 698: 855a mv a0,s6 + 69a: f07ff0ef jal 5a0 + 69e: a019 j 6a4 + } else if(state == '%'){ + 6a0: 03598263 beq s3,s5,6c4 + for(i = 0; fmt[i]; i++){ + 6a4: 2485 addiw s1,s1,1 + 6a6: 8726 mv a4,s1 + 6a8: 009a07b3 add a5,s4,s1 + 6ac: 0007c903 lbu s2,0(a5) + 6b0: 22090a63 beqz s2,8e4 + c0 = fmt[i] & 0xff; + 6b4: 0009079b sext.w a5,s2 + if(state == 0){ + 6b8: fe0994e3 bnez s3,6a0 + if(c0 == '%'){ + 6bc: fd579de3 bne a5,s5,696 + state = '%'; + 6c0: 89be mv s3,a5 + 6c2: b7cd j 6a4 + if(c0) c1 = fmt[i+1] & 0xff; + 6c4: 00ea06b3 add a3,s4,a4 + 6c8: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 6cc: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 6ce: c681 beqz a3,6d6 + 6d0: 9752 add a4,a4,s4 + 6d2: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 6d6: 05878363 beq a5,s8,71c + } else if(c0 == 'l' && c1 == 'd'){ + 6da: 05978d63 beq a5,s9,734 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 6de: 07500713 li a4,117 + 6e2: 0ee78763 beq a5,a4,7d0 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 6e6: 07800713 li a4,120 + 6ea: 12e78963 beq a5,a4,81c + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 6ee: 07000713 li a4,112 + 6f2: 14e78e63 beq a5,a4,84e + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 6f6: 06300713 li a4,99 + 6fa: 18e78e63 beq a5,a4,896 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 6fe: 07300713 li a4,115 + 702: 1ae78463 beq a5,a4,8aa + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 706: 02500713 li a4,37 + 70a: 04e79563 bne a5,a4,754 + putc(fd, '%'); + 70e: 02500593 li a1,37 + 712: 855a mv a0,s6 + 714: e8dff0ef jal 5a0 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 718: 4981 li s3,0 + 71a: b769 j 6a4 + printint(fd, va_arg(ap, int), 10, 1); + 71c: 008b8913 addi s2,s7,8 + 720: 4685 li a3,1 + 722: 4629 li a2,10 + 724: 000ba583 lw a1,0(s7) + 728: 855a mv a0,s6 + 72a: e95ff0ef jal 5be + 72e: 8bca mv s7,s2 + state = 0; + 730: 4981 li s3,0 + 732: bf8d j 6a4 + } else if(c0 == 'l' && c1 == 'd'){ + 734: 06400793 li a5,100 + 738: 02f68963 beq a3,a5,76a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 73c: 06c00793 li a5,108 + 740: 04f68263 beq a3,a5,784 + } else if(c0 == 'l' && c1 == 'u'){ + 744: 07500793 li a5,117 + 748: 0af68063 beq a3,a5,7e8 + } else if(c0 == 'l' && c1 == 'x'){ + 74c: 07800793 li a5,120 + 750: 0ef68263 beq a3,a5,834 + putc(fd, '%'); + 754: 02500593 li a1,37 + 758: 855a mv a0,s6 + 75a: e47ff0ef jal 5a0 + putc(fd, c0); + 75e: 85ca mv a1,s2 + 760: 855a mv a0,s6 + 762: e3fff0ef jal 5a0 + state = 0; + 766: 4981 li s3,0 + 768: bf35 j 6a4 + printint(fd, va_arg(ap, uint64), 10, 1); + 76a: 008b8913 addi s2,s7,8 + 76e: 4685 li a3,1 + 770: 4629 li a2,10 + 772: 000bb583 ld a1,0(s7) + 776: 855a mv a0,s6 + 778: e47ff0ef jal 5be + i += 1; + 77c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 77e: 8bca mv s7,s2 + state = 0; + 780: 4981 li s3,0 + i += 1; + 782: b70d j 6a4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 784: 06400793 li a5,100 + 788: 02f60763 beq a2,a5,7b6 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 78c: 07500793 li a5,117 + 790: 06f60963 beq a2,a5,802 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 794: 07800793 li a5,120 + 798: faf61ee3 bne a2,a5,754 + printint(fd, va_arg(ap, uint64), 16, 0); + 79c: 008b8913 addi s2,s7,8 + 7a0: 4681 li a3,0 + 7a2: 4641 li a2,16 + 7a4: 000bb583 ld a1,0(s7) + 7a8: 855a mv a0,s6 + 7aa: e15ff0ef jal 5be + i += 2; + 7ae: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 7b0: 8bca mv s7,s2 + state = 0; + 7b2: 4981 li s3,0 + i += 2; + 7b4: bdc5 j 6a4 + printint(fd, va_arg(ap, uint64), 10, 1); + 7b6: 008b8913 addi s2,s7,8 + 7ba: 4685 li a3,1 + 7bc: 4629 li a2,10 + 7be: 000bb583 ld a1,0(s7) + 7c2: 855a mv a0,s6 + 7c4: dfbff0ef jal 5be + i += 2; + 7c8: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 7ca: 8bca mv s7,s2 + state = 0; + 7cc: 4981 li s3,0 + i += 2; + 7ce: bdd9 j 6a4 + printint(fd, va_arg(ap, uint32), 10, 0); + 7d0: 008b8913 addi s2,s7,8 + 7d4: 4681 li a3,0 + 7d6: 4629 li a2,10 + 7d8: 000be583 lwu a1,0(s7) + 7dc: 855a mv a0,s6 + 7de: de1ff0ef jal 5be + 7e2: 8bca mv s7,s2 + state = 0; + 7e4: 4981 li s3,0 + 7e6: bd7d j 6a4 + printint(fd, va_arg(ap, uint64), 10, 0); + 7e8: 008b8913 addi s2,s7,8 + 7ec: 4681 li a3,0 + 7ee: 4629 li a2,10 + 7f0: 000bb583 ld a1,0(s7) + 7f4: 855a mv a0,s6 + 7f6: dc9ff0ef jal 5be + i += 1; + 7fa: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 7fc: 8bca mv s7,s2 + state = 0; + 7fe: 4981 li s3,0 + i += 1; + 800: b555 j 6a4 + printint(fd, va_arg(ap, uint64), 10, 0); + 802: 008b8913 addi s2,s7,8 + 806: 4681 li a3,0 + 808: 4629 li a2,10 + 80a: 000bb583 ld a1,0(s7) + 80e: 855a mv a0,s6 + 810: dafff0ef jal 5be + i += 2; + 814: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 816: 8bca mv s7,s2 + state = 0; + 818: 4981 li s3,0 + i += 2; + 81a: b569 j 6a4 + printint(fd, va_arg(ap, uint32), 16, 0); + 81c: 008b8913 addi s2,s7,8 + 820: 4681 li a3,0 + 822: 4641 li a2,16 + 824: 000be583 lwu a1,0(s7) + 828: 855a mv a0,s6 + 82a: d95ff0ef jal 5be + 82e: 8bca mv s7,s2 + state = 0; + 830: 4981 li s3,0 + 832: bd8d j 6a4 + printint(fd, va_arg(ap, uint64), 16, 0); + 834: 008b8913 addi s2,s7,8 + 838: 4681 li a3,0 + 83a: 4641 li a2,16 + 83c: 000bb583 ld a1,0(s7) + 840: 855a mv a0,s6 + 842: d7dff0ef jal 5be + i += 1; + 846: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 848: 8bca mv s7,s2 + state = 0; + 84a: 4981 li s3,0 + i += 1; + 84c: bda1 j 6a4 + 84e: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 850: 008b8d13 addi s10,s7,8 + 854: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 858: 03000593 li a1,48 + 85c: 855a mv a0,s6 + 85e: d43ff0ef jal 5a0 + putc(fd, 'x'); + 862: 07800593 li a1,120 + 866: 855a mv a0,s6 + 868: d39ff0ef jal 5a0 + 86c: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 86e: 00000b97 auipc s7,0x0 + 872: 2dab8b93 addi s7,s7,730 # b48 + 876: 03c9d793 srli a5,s3,0x3c + 87a: 97de add a5,a5,s7 + 87c: 0007c583 lbu a1,0(a5) + 880: 855a mv a0,s6 + 882: d1fff0ef jal 5a0 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 886: 0992 slli s3,s3,0x4 + 888: 397d addiw s2,s2,-1 + 88a: fe0916e3 bnez s2,876 + printptr(fd, va_arg(ap, uint64)); + 88e: 8bea mv s7,s10 + state = 0; + 890: 4981 li s3,0 + 892: 6d02 ld s10,0(sp) + 894: bd01 j 6a4 + putc(fd, va_arg(ap, uint32)); + 896: 008b8913 addi s2,s7,8 + 89a: 000bc583 lbu a1,0(s7) + 89e: 855a mv a0,s6 + 8a0: d01ff0ef jal 5a0 + 8a4: 8bca mv s7,s2 + state = 0; + 8a6: 4981 li s3,0 + 8a8: bbf5 j 6a4 + if((s = va_arg(ap, char*)) == 0) + 8aa: 008b8993 addi s3,s7,8 + 8ae: 000bb903 ld s2,0(s7) + 8b2: 00090f63 beqz s2,8d0 + for(; *s; s++) + 8b6: 00094583 lbu a1,0(s2) + 8ba: c195 beqz a1,8de + putc(fd, *s); + 8bc: 855a mv a0,s6 + 8be: ce3ff0ef jal 5a0 + for(; *s; s++) + 8c2: 0905 addi s2,s2,1 + 8c4: 00094583 lbu a1,0(s2) + 8c8: f9f5 bnez a1,8bc + if((s = va_arg(ap, char*)) == 0) + 8ca: 8bce mv s7,s3 + state = 0; + 8cc: 4981 li s3,0 + 8ce: bbd9 j 6a4 + s = "(null)"; + 8d0: 00000917 auipc s2,0x0 + 8d4: 27090913 addi s2,s2,624 # b40 + for(; *s; s++) + 8d8: 02800593 li a1,40 + 8dc: b7c5 j 8bc + if((s = va_arg(ap, char*)) == 0) + 8de: 8bce mv s7,s3 + state = 0; + 8e0: 4981 li s3,0 + 8e2: b3c9 j 6a4 + 8e4: 64a6 ld s1,72(sp) + 8e6: 79e2 ld s3,56(sp) + 8e8: 7a42 ld s4,48(sp) + 8ea: 7aa2 ld s5,40(sp) + 8ec: 7b02 ld s6,32(sp) + 8ee: 6be2 ld s7,24(sp) + 8f0: 6c42 ld s8,16(sp) + 8f2: 6ca2 ld s9,8(sp) + } + } +} + 8f4: 60e6 ld ra,88(sp) + 8f6: 6446 ld s0,80(sp) + 8f8: 6906 ld s2,64(sp) + 8fa: 6125 addi sp,sp,96 + 8fc: 8082 ret + +00000000000008fe : + +void +fprintf(int fd, const char *fmt, ...) +{ + 8fe: 715d addi sp,sp,-80 + 900: ec06 sd ra,24(sp) + 902: e822 sd s0,16(sp) + 904: 1000 addi s0,sp,32 + 906: e010 sd a2,0(s0) + 908: e414 sd a3,8(s0) + 90a: e818 sd a4,16(s0) + 90c: ec1c sd a5,24(s0) + 90e: 03043023 sd a6,32(s0) + 912: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 916: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 91a: 8622 mv a2,s0 + 91c: d3fff0ef jal 65a +} + 920: 60e2 ld ra,24(sp) + 922: 6442 ld s0,16(sp) + 924: 6161 addi sp,sp,80 + 926: 8082 ret + +0000000000000928 : + +void +printf(const char *fmt, ...) +{ + 928: 711d addi sp,sp,-96 + 92a: ec06 sd ra,24(sp) + 92c: e822 sd s0,16(sp) + 92e: 1000 addi s0,sp,32 + 930: e40c sd a1,8(s0) + 932: e810 sd a2,16(s0) + 934: ec14 sd a3,24(s0) + 936: f018 sd a4,32(s0) + 938: f41c sd a5,40(s0) + 93a: 03043823 sd a6,48(s0) + 93e: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 942: 00840613 addi a2,s0,8 + 946: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 94a: 85aa mv a1,a0 + 94c: 4505 li a0,1 + 94e: d0dff0ef jal 65a +} + 952: 60e2 ld ra,24(sp) + 954: 6442 ld s0,16(sp) + 956: 6125 addi sp,sp,96 + 958: 8082 ret + +000000000000095a : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 95a: 1141 addi sp,sp,-16 + 95c: e422 sd s0,8(sp) + 95e: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 960: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 964: 00001797 auipc a5,0x1 + 968: 69c7b783 ld a5,1692(a5) # 2000 + 96c: a02d j 996 + 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; + 96e: 4618 lw a4,8(a2) + 970: 9f2d addw a4,a4,a1 + 972: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 976: 6398 ld a4,0(a5) + 978: 6310 ld a2,0(a4) + 97a: a83d j 9b8 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 97c: ff852703 lw a4,-8(a0) + 980: 9f31 addw a4,a4,a2 + 982: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 984: ff053683 ld a3,-16(a0) + 988: a091 j 9cc + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 98a: 6398 ld a4,0(a5) + 98c: 00e7e463 bltu a5,a4,994 + 990: 00e6ea63 bltu a3,a4,9a4 +{ + 994: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 996: fed7fae3 bgeu a5,a3,98a + 99a: 6398 ld a4,0(a5) + 99c: 00e6e463 bltu a3,a4,9a4 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 9a0: fee7eae3 bltu a5,a4,994 + if(bp + bp->s.size == p->s.ptr){ + 9a4: ff852583 lw a1,-8(a0) + 9a8: 6390 ld a2,0(a5) + 9aa: 02059813 slli a6,a1,0x20 + 9ae: 01c85713 srli a4,a6,0x1c + 9b2: 9736 add a4,a4,a3 + 9b4: fae60de3 beq a2,a4,96e + bp->s.ptr = p->s.ptr->s.ptr; + 9b8: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 9bc: 4790 lw a2,8(a5) + 9be: 02061593 slli a1,a2,0x20 + 9c2: 01c5d713 srli a4,a1,0x1c + 9c6: 973e add a4,a4,a5 + 9c8: fae68ae3 beq a3,a4,97c + p->s.ptr = bp->s.ptr; + 9cc: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 9ce: 00001717 auipc a4,0x1 + 9d2: 62f73923 sd a5,1586(a4) # 2000 +} + 9d6: 6422 ld s0,8(sp) + 9d8: 0141 addi sp,sp,16 + 9da: 8082 ret + +00000000000009dc : + return freep; +} + +void* +malloc(uint nbytes) +{ + 9dc: 7139 addi sp,sp,-64 + 9de: fc06 sd ra,56(sp) + 9e0: f822 sd s0,48(sp) + 9e2: f426 sd s1,40(sp) + 9e4: ec4e sd s3,24(sp) + 9e6: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 9e8: 02051493 slli s1,a0,0x20 + 9ec: 9081 srli s1,s1,0x20 + 9ee: 04bd addi s1,s1,15 + 9f0: 8091 srli s1,s1,0x4 + 9f2: 0014899b addiw s3,s1,1 + 9f6: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 9f8: 00001517 auipc a0,0x1 + 9fc: 60853503 ld a0,1544(a0) # 2000 + a00: c915 beqz a0,a34 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + a02: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + a04: 4798 lw a4,8(a5) + a06: 08977a63 bgeu a4,s1,a9a + a0a: f04a sd s2,32(sp) + a0c: e852 sd s4,16(sp) + a0e: e456 sd s5,8(sp) + a10: e05a sd s6,0(sp) + if(nu < 4096) + a12: 8a4e mv s4,s3 + a14: 0009871b sext.w a4,s3 + a18: 6685 lui a3,0x1 + a1a: 00d77363 bgeu a4,a3,a20 + a1e: 6a05 lui s4,0x1 + a20: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + a24: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + a28: 00001917 auipc s2,0x1 + a2c: 5d890913 addi s2,s2,1496 # 2000 + if(p == SBRK_ERROR) + a30: 5afd li s5,-1 + a32: a081 j a72 + a34: f04a sd s2,32(sp) + a36: e852 sd s4,16(sp) + a38: e456 sd s5,8(sp) + a3a: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + a3c: 00001797 auipc a5,0x1 + a40: 5e478793 addi a5,a5,1508 # 2020 + a44: 00001717 auipc a4,0x1 + a48: 5af73e23 sd a5,1468(a4) # 2000 + a4c: e39c sd a5,0(a5) + base.s.size = 0; + a4e: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + a52: b7c1 j a12 + prevp->s.ptr = p->s.ptr; + a54: 6398 ld a4,0(a5) + a56: e118 sd a4,0(a0) + a58: a8a9 j ab2 + hp->s.size = nu; + a5a: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + a5e: 0541 addi a0,a0,16 + a60: efbff0ef jal 95a + return freep; + a64: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + a68: c12d beqz a0,aca + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + a6a: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + a6c: 4798 lw a4,8(a5) + a6e: 02977263 bgeu a4,s1,a92 + if(p == freep) + a72: 00093703 ld a4,0(s2) + a76: 853e mv a0,a5 + a78: fef719e3 bne a4,a5,a6a + p = sbrk(nu * sizeof(Header)); + a7c: 8552 mv a0,s4 + a7e: a4fff0ef jal 4cc + if(p == SBRK_ERROR) + a82: fd551ce3 bne a0,s5,a5a + return 0; + a86: 4501 li a0,0 + a88: 7902 ld s2,32(sp) + a8a: 6a42 ld s4,16(sp) + a8c: 6aa2 ld s5,8(sp) + a8e: 6b02 ld s6,0(sp) + a90: a03d j abe + a92: 7902 ld s2,32(sp) + a94: 6a42 ld s4,16(sp) + a96: 6aa2 ld s5,8(sp) + a98: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + a9a: fae48de3 beq s1,a4,a54 + p->s.size -= nunits; + a9e: 4137073b subw a4,a4,s3 + aa2: c798 sw a4,8(a5) + p += p->s.size; + aa4: 02071693 slli a3,a4,0x20 + aa8: 01c6d713 srli a4,a3,0x1c + aac: 97ba add a5,a5,a4 + p->s.size = nunits; + aae: 0137a423 sw s3,8(a5) + freep = prevp; + ab2: 00001717 auipc a4,0x1 + ab6: 54a73723 sd a0,1358(a4) # 2000 + return (void*)(p + 1); + aba: 01078513 addi a0,a5,16 + } +} + abe: 70e2 ld ra,56(sp) + ac0: 7442 ld s0,48(sp) + ac2: 74a2 ld s1,40(sp) + ac4: 69e2 ld s3,24(sp) + ac6: 6121 addi sp,sp,64 + ac8: 8082 ret + aca: 7902 ld s2,32(sp) + acc: 6a42 ld s4,16(sp) + ace: 6aa2 ld s5,8(sp) + ad0: 6b02 ld s6,0(sp) + ad2: b7f5 j abe diff --git a/G12_Project2_2/user/ls.c b/G12_Project2_2/user/ls.c new file mode 100644 index 0000000000..da787487ec --- /dev/null +++ b/G12_Project2_2/user/ls.c @@ -0,0 +1,88 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "user/user.h" +#include "kernel/fs.h" +#include "kernel/fcntl.h" + +char* +fmtname(char *path) +{ + static char buf[DIRSIZ+1]; + char *p; + + // Find first character after last slash. + for(p=path+strlen(path); p >= path && *p != '/'; p--) + ; + p++; + + // Return blank-padded name. + if(strlen(p) >= DIRSIZ) + return p; + memmove(buf, p, strlen(p)); + memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); + buf[sizeof(buf)-1] = '\0'; + return buf; +} + +void +ls(char *path) +{ + char buf[512], *p; + int fd; + struct dirent de; + struct stat st; + + if((fd = open(path, O_RDONLY)) < 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; + } + + switch(st.type){ + case T_DEVICE: + case T_FILE: + printf("%s %d %d %d\n", fmtname(path), st.type, st.ino, (int) st.size); + break; + + case T_DIR: + if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){ + printf("ls: path too long\n"); + break; + } + strcpy(buf, path); + p = buf+strlen(buf); + *p++ = '/'; + while(read(fd, &de, sizeof(de)) == sizeof(de)){ + if(de.inum == 0) + continue; + memmove(p, de.name, DIRSIZ); + p[DIRSIZ] = 0; + if(stat(buf, &st) < 0){ + printf("ls: cannot stat %s\n", buf); + continue; + } + printf("%s %d %d %d\n", fmtname(buf), st.type, st.ino, (int) st.size); + } + break; + } + close(fd); +} + +int +main(int argc, char *argv[]) +{ + int i; + + if(argc < 2){ + ls("."); + exit(0); + } + for(i=1; i: +#include "kernel/stat.h" +#include "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: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + 8: 4785 li a5,1 + a: 02a7d763 bge a5,a0,38 + e: e426 sd s1,8(sp) + 10: e04a sd s2,0(sp) + 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: mkdir files...\n"); + exit(1); + } + + for(i = 1; i < argc; i++){ + if(mkdir(argv[i]) < 0){ + 26: 6088 ld a0,0(s1) + 28: 33a000ef jal 362 + 2c: 02054263 bltz a0,50 + for(i = 1; i < argc; i++){ + 30: 04a1 addi s1,s1,8 + 32: ff249ae3 bne s1,s2,26 + 36: a02d j 60 + 38: e426 sd s1,8(sp) + 3a: e04a sd s2,0(sp) + fprintf(2, "Usage: mkdir files...\n"); + 3c: 00001597 auipc a1,0x1 + 40: 89458593 addi a1,a1,-1900 # 8d0 + 44: 4509 li a0,2 + 46: 6b2000ef jal 6f8 + exit(1); + 4a: 4505 li a0,1 + 4c: 2ae000ef jal 2fa + fprintf(2, "mkdir: %s failed to create\n", argv[i]); + 50: 6090 ld a2,0(s1) + 52: 00001597 auipc a1,0x1 + 56: 89658593 addi a1,a1,-1898 # 8e8 + 5a: 4509 li a0,2 + 5c: 69c000ef jal 6f8 + break; + } + } + + exit(0); + 60: 4501 li a0,0 + 62: 298000ef jal 2fa + +0000000000000066 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 66: 1141 addi sp,sp,-16 + 68: e406 sd ra,8(sp) + 6a: e022 sd s0,0(sp) + 6c: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 6e: f93ff0ef jal 0
+ exit(r); + 72: 288000ef jal 2fa + +0000000000000076 : +} + +char* +strcpy(char *s, const char *t) +{ + 76: 1141 addi sp,sp,-16 + 78: e422 sd s0,8(sp) + 7a: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 7c: 87aa mv a5,a0 + 7e: 0585 addi a1,a1,1 + 80: 0785 addi a5,a5,1 + 82: fff5c703 lbu a4,-1(a1) + 86: fee78fa3 sb a4,-1(a5) + 8a: fb75 bnez a4,7e + ; + return os; +} + 8c: 6422 ld s0,8(sp) + 8e: 0141 addi sp,sp,16 + 90: 8082 ret + +0000000000000092 : + +int +strcmp(const char *p, const char *q) +{ + 92: 1141 addi sp,sp,-16 + 94: e422 sd s0,8(sp) + 96: 0800 addi s0,sp,16 + while(*p && *p == *q) + 98: 00054783 lbu a5,0(a0) + 9c: cb91 beqz a5,b0 + 9e: 0005c703 lbu a4,0(a1) + a2: 00f71763 bne a4,a5,b0 + p++, q++; + a6: 0505 addi a0,a0,1 + a8: 0585 addi a1,a1,1 + while(*p && *p == *q) + aa: 00054783 lbu a5,0(a0) + ae: fbe5 bnez a5,9e + return (uchar)*p - (uchar)*q; + b0: 0005c503 lbu a0,0(a1) +} + b4: 40a7853b subw a0,a5,a0 + b8: 6422 ld s0,8(sp) + ba: 0141 addi sp,sp,16 + bc: 8082 ret + +00000000000000be : + +uint +strlen(const char *s) +{ + be: 1141 addi sp,sp,-16 + c0: e422 sd s0,8(sp) + c2: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + c4: 00054783 lbu a5,0(a0) + c8: cf91 beqz a5,e4 + ca: 0505 addi a0,a0,1 + cc: 87aa mv a5,a0 + ce: 86be mv a3,a5 + d0: 0785 addi a5,a5,1 + d2: fff7c703 lbu a4,-1(a5) + d6: ff65 bnez a4,ce + d8: 40a6853b subw a0,a3,a0 + dc: 2505 addiw a0,a0,1 + ; + return n; +} + de: 6422 ld s0,8(sp) + e0: 0141 addi sp,sp,16 + e2: 8082 ret + for(n = 0; s[n]; n++) + e4: 4501 li a0,0 + e6: bfe5 j de + +00000000000000e8 : + +void* +memset(void *dst, int c, uint n) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + ee: ca19 beqz a2,104 + f0: 87aa mv a5,a0 + f2: 1602 slli a2,a2,0x20 + f4: 9201 srli a2,a2,0x20 + f6: 00a60733 add a4,a2,a0 + cdst[i] = c; + fa: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + fe: 0785 addi a5,a5,1 + 100: fee79de3 bne a5,a4,fa + } + return dst; +} + 104: 6422 ld s0,8(sp) + 106: 0141 addi sp,sp,16 + 108: 8082 ret + +000000000000010a : + +char* +strchr(const char *s, char c) +{ + 10a: 1141 addi sp,sp,-16 + 10c: e422 sd s0,8(sp) + 10e: 0800 addi s0,sp,16 + for(; *s; s++) + 110: 00054783 lbu a5,0(a0) + 114: cb99 beqz a5,12a + if(*s == c) + 116: 00f58763 beq a1,a5,124 + for(; *s; s++) + 11a: 0505 addi a0,a0,1 + 11c: 00054783 lbu a5,0(a0) + 120: fbfd bnez a5,116 + return (char*)s; + return 0; + 122: 4501 li a0,0 +} + 124: 6422 ld s0,8(sp) + 126: 0141 addi sp,sp,16 + 128: 8082 ret + return 0; + 12a: 4501 li a0,0 + 12c: bfe5 j 124 + +000000000000012e : + +char* +gets(char *buf, int max) +{ + 12e: 711d addi sp,sp,-96 + 130: ec86 sd ra,88(sp) + 132: e8a2 sd s0,80(sp) + 134: e4a6 sd s1,72(sp) + 136: e0ca sd s2,64(sp) + 138: fc4e sd s3,56(sp) + 13a: f852 sd s4,48(sp) + 13c: f456 sd s5,40(sp) + 13e: f05a sd s6,32(sp) + 140: ec5e sd s7,24(sp) + 142: 1080 addi s0,sp,96 + 144: 8baa mv s7,a0 + 146: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 148: 892a mv s2,a0 + 14a: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 14c: 4aa9 li s5,10 + 14e: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 150: 89a6 mv s3,s1 + 152: 2485 addiw s1,s1,1 + 154: 0344d663 bge s1,s4,180 + cc = read(0, &c, 1); + 158: 4605 li a2,1 + 15a: faf40593 addi a1,s0,-81 + 15e: 4501 li a0,0 + 160: 1b2000ef jal 312 + if(cc < 1) + 164: 00a05e63 blez a0,180 + buf[i++] = c; + 168: faf44783 lbu a5,-81(s0) + 16c: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 170: 01578763 beq a5,s5,17e + 174: 0905 addi s2,s2,1 + 176: fd679de3 bne a5,s6,150 + buf[i++] = c; + 17a: 89a6 mv s3,s1 + 17c: a011 j 180 + 17e: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 180: 99de add s3,s3,s7 + 182: 00098023 sb zero,0(s3) + return buf; +} + 186: 855e mv a0,s7 + 188: 60e6 ld ra,88(sp) + 18a: 6446 ld s0,80(sp) + 18c: 64a6 ld s1,72(sp) + 18e: 6906 ld s2,64(sp) + 190: 79e2 ld s3,56(sp) + 192: 7a42 ld s4,48(sp) + 194: 7aa2 ld s5,40(sp) + 196: 7b02 ld s6,32(sp) + 198: 6be2 ld s7,24(sp) + 19a: 6125 addi sp,sp,96 + 19c: 8082 ret + +000000000000019e : + +int +stat(const char *n, struct stat *st) +{ + 19e: 1101 addi sp,sp,-32 + 1a0: ec06 sd ra,24(sp) + 1a2: e822 sd s0,16(sp) + 1a4: e04a sd s2,0(sp) + 1a6: 1000 addi s0,sp,32 + 1a8: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1aa: 4581 li a1,0 + 1ac: 18e000ef jal 33a + if(fd < 0) + 1b0: 02054263 bltz a0,1d4 + 1b4: e426 sd s1,8(sp) + 1b6: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1b8: 85ca mv a1,s2 + 1ba: 198000ef jal 352 + 1be: 892a mv s2,a0 + close(fd); + 1c0: 8526 mv a0,s1 + 1c2: 160000ef jal 322 + return r; + 1c6: 64a2 ld s1,8(sp) +} + 1c8: 854a mv a0,s2 + 1ca: 60e2 ld ra,24(sp) + 1cc: 6442 ld s0,16(sp) + 1ce: 6902 ld s2,0(sp) + 1d0: 6105 addi sp,sp,32 + 1d2: 8082 ret + return -1; + 1d4: 597d li s2,-1 + 1d6: bfcd j 1c8 + +00000000000001d8 : + +int +atoi(const char *s) +{ + 1d8: 1141 addi sp,sp,-16 + 1da: e422 sd s0,8(sp) + 1dc: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1de: 00054683 lbu a3,0(a0) + 1e2: fd06879b addiw a5,a3,-48 + 1e6: 0ff7f793 zext.b a5,a5 + 1ea: 4625 li a2,9 + 1ec: 02f66863 bltu a2,a5,21c + 1f0: 872a mv a4,a0 + n = 0; + 1f2: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1f4: 0705 addi a4,a4,1 + 1f6: 0025179b slliw a5,a0,0x2 + 1fa: 9fa9 addw a5,a5,a0 + 1fc: 0017979b slliw a5,a5,0x1 + 200: 9fb5 addw a5,a5,a3 + 202: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 206: 00074683 lbu a3,0(a4) + 20a: fd06879b addiw a5,a3,-48 + 20e: 0ff7f793 zext.b a5,a5 + 212: fef671e3 bgeu a2,a5,1f4 + return n; +} + 216: 6422 ld s0,8(sp) + 218: 0141 addi sp,sp,16 + 21a: 8082 ret + n = 0; + 21c: 4501 li a0,0 + 21e: bfe5 j 216 + +0000000000000220 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 220: 1141 addi sp,sp,-16 + 222: e422 sd s0,8(sp) + 224: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 226: 02b57463 bgeu a0,a1,24e + while(n-- > 0) + 22a: 00c05f63 blez a2,248 + 22e: 1602 slli a2,a2,0x20 + 230: 9201 srli a2,a2,0x20 + 232: 00c507b3 add a5,a0,a2 + dst = vdst; + 236: 872a mv a4,a0 + *dst++ = *src++; + 238: 0585 addi a1,a1,1 + 23a: 0705 addi a4,a4,1 + 23c: fff5c683 lbu a3,-1(a1) + 240: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 244: fef71ae3 bne a4,a5,238 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 248: 6422 ld s0,8(sp) + 24a: 0141 addi sp,sp,16 + 24c: 8082 ret + dst += n; + 24e: 00c50733 add a4,a0,a2 + src += n; + 252: 95b2 add a1,a1,a2 + while(n-- > 0) + 254: fec05ae3 blez a2,248 + 258: fff6079b addiw a5,a2,-1 + 25c: 1782 slli a5,a5,0x20 + 25e: 9381 srli a5,a5,0x20 + 260: fff7c793 not a5,a5 + 264: 97ba add a5,a5,a4 + *--dst = *--src; + 266: 15fd addi a1,a1,-1 + 268: 177d addi a4,a4,-1 + 26a: 0005c683 lbu a3,0(a1) + 26e: 00d70023 sb a3,0(a4) + while(n-- > 0) + 272: fee79ae3 bne a5,a4,266 + 276: bfc9 j 248 + +0000000000000278 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 278: 1141 addi sp,sp,-16 + 27a: e422 sd s0,8(sp) + 27c: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 27e: ca05 beqz a2,2ae + 280: fff6069b addiw a3,a2,-1 + 284: 1682 slli a3,a3,0x20 + 286: 9281 srli a3,a3,0x20 + 288: 0685 addi a3,a3,1 + 28a: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 28c: 00054783 lbu a5,0(a0) + 290: 0005c703 lbu a4,0(a1) + 294: 00e79863 bne a5,a4,2a4 + return *p1 - *p2; + } + p1++; + 298: 0505 addi a0,a0,1 + p2++; + 29a: 0585 addi a1,a1,1 + while (n-- > 0) { + 29c: fed518e3 bne a0,a3,28c + } + return 0; + 2a0: 4501 li a0,0 + 2a2: a019 j 2a8 + return *p1 - *p2; + 2a4: 40e7853b subw a0,a5,a4 +} + 2a8: 6422 ld s0,8(sp) + 2aa: 0141 addi sp,sp,16 + 2ac: 8082 ret + return 0; + 2ae: 4501 li a0,0 + 2b0: bfe5 j 2a8 + +00000000000002b2 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2b2: 1141 addi sp,sp,-16 + 2b4: e406 sd ra,8(sp) + 2b6: e022 sd s0,0(sp) + 2b8: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2ba: f67ff0ef jal 220 +} + 2be: 60a2 ld ra,8(sp) + 2c0: 6402 ld s0,0(sp) + 2c2: 0141 addi sp,sp,16 + 2c4: 8082 ret + +00000000000002c6 : + +char * +sbrk(int n) { + 2c6: 1141 addi sp,sp,-16 + 2c8: e406 sd ra,8(sp) + 2ca: e022 sd s0,0(sp) + 2cc: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2ce: 4585 li a1,1 + 2d0: 0b2000ef jal 382 +} + 2d4: 60a2 ld ra,8(sp) + 2d6: 6402 ld s0,0(sp) + 2d8: 0141 addi sp,sp,16 + 2da: 8082 ret + +00000000000002dc : + +char * +sbrklazy(int n) { + 2dc: 1141 addi sp,sp,-16 + 2de: e406 sd ra,8(sp) + 2e0: e022 sd s0,0(sp) + 2e2: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2e4: 4589 li a1,2 + 2e6: 09c000ef jal 382 +} + 2ea: 60a2 ld ra,8(sp) + 2ec: 6402 ld s0,0(sp) + 2ee: 0141 addi sp,sp,16 + 2f0: 8082 ret + +00000000000002f2 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2f2: 4885 li a7,1 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa : +.global exit +exit: + li a7, SYS_exit + 2fa: 4889 li a7,2 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 : +.global wait +wait: + li a7, SYS_wait + 302: 488d li a7,3 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a : +.global pipe +pipe: + li a7, SYS_pipe + 30a: 4891 li a7,4 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 : +.global read +read: + li a7, SYS_read + 312: 4895 li a7,5 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a : +.global write +write: + li a7, SYS_write + 31a: 48c1 li a7,16 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 : +.global close +close: + li a7, SYS_close + 322: 48d5 li a7,21 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a : +.global kill +kill: + li a7, SYS_kill + 32a: 4899 li a7,6 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 : +.global exec +exec: + li a7, SYS_exec + 332: 489d li a7,7 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a : +.global open +open: + li a7, SYS_open + 33a: 48bd li a7,15 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 : +.global mknod +mknod: + li a7, SYS_mknod + 342: 48c5 li a7,17 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a : +.global unlink +unlink: + li a7, SYS_unlink + 34a: 48c9 li a7,18 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 : +.global fstat +fstat: + li a7, SYS_fstat + 352: 48a1 li a7,8 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a : +.global link +link: + li a7, SYS_link + 35a: 48cd li a7,19 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 362: 48d1 li a7,20 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : +.global chdir +chdir: + li a7, SYS_chdir + 36a: 48a5 li a7,9 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 : +.global dup +dup: + li a7, SYS_dup + 372: 48a9 li a7,10 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a : +.global getpid +getpid: + li a7, SYS_getpid + 37a: 48ad li a7,11 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 382: 48b1 li a7,12 + ecall + 384: 00000073 ecall + ret + 388: 8082 ret + +000000000000038a : +.global pause +pause: + li a7, SYS_pause + 38a: 48b5 li a7,13 + ecall + 38c: 00000073 ecall + ret + 390: 8082 ret + +0000000000000392 : +.global uptime +uptime: + li a7, SYS_uptime + 392: 48b9 li a7,14 + ecall + 394: 00000073 ecall + ret + 398: 8082 ret + +000000000000039a : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 39a: 1101 addi sp,sp,-32 + 39c: ec06 sd ra,24(sp) + 39e: e822 sd s0,16(sp) + 3a0: 1000 addi s0,sp,32 + 3a2: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3a6: 4605 li a2,1 + 3a8: fef40593 addi a1,s0,-17 + 3ac: f6fff0ef jal 31a +} + 3b0: 60e2 ld ra,24(sp) + 3b2: 6442 ld s0,16(sp) + 3b4: 6105 addi sp,sp,32 + 3b6: 8082 ret + +00000000000003b8 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3b8: 715d addi sp,sp,-80 + 3ba: e486 sd ra,72(sp) + 3bc: e0a2 sd s0,64(sp) + 3be: f84a sd s2,48(sp) + 3c0: 0880 addi s0,sp,80 + 3c2: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3c4: c299 beqz a3,3ca + 3c6: 0805c363 bltz a1,44c + neg = 0; + 3ca: 4881 li a7,0 + 3cc: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3d0: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3d2: 00000517 auipc a0,0x0 + 3d6: 53e50513 addi a0,a0,1342 # 910 + 3da: 883e mv a6,a5 + 3dc: 2785 addiw a5,a5,1 + 3de: 02c5f733 remu a4,a1,a2 + 3e2: 972a add a4,a4,a0 + 3e4: 00074703 lbu a4,0(a4) + 3e8: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3ec: 872e mv a4,a1 + 3ee: 02c5d5b3 divu a1,a1,a2 + 3f2: 0685 addi a3,a3,1 + 3f4: fec773e3 bgeu a4,a2,3da + if(neg) + 3f8: 00088b63 beqz a7,40e + buf[i++] = '-'; + 3fc: fd078793 addi a5,a5,-48 + 400: 97a2 add a5,a5,s0 + 402: 02d00713 li a4,45 + 406: fee78423 sb a4,-24(a5) + 40a: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 40e: 02f05a63 blez a5,442 + 412: fc26 sd s1,56(sp) + 414: f44e sd s3,40(sp) + 416: fb840713 addi a4,s0,-72 + 41a: 00f704b3 add s1,a4,a5 + 41e: fff70993 addi s3,a4,-1 + 422: 99be add s3,s3,a5 + 424: 37fd addiw a5,a5,-1 + 426: 1782 slli a5,a5,0x20 + 428: 9381 srli a5,a5,0x20 + 42a: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 42e: fff4c583 lbu a1,-1(s1) + 432: 854a mv a0,s2 + 434: f67ff0ef jal 39a + while(--i >= 0) + 438: 14fd addi s1,s1,-1 + 43a: ff349ae3 bne s1,s3,42e + 43e: 74e2 ld s1,56(sp) + 440: 79a2 ld s3,40(sp) +} + 442: 60a6 ld ra,72(sp) + 444: 6406 ld s0,64(sp) + 446: 7942 ld s2,48(sp) + 448: 6161 addi sp,sp,80 + 44a: 8082 ret + x = -xx; + 44c: 40b005b3 neg a1,a1 + neg = 1; + 450: 4885 li a7,1 + x = -xx; + 452: bfad j 3cc + +0000000000000454 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 454: 711d addi sp,sp,-96 + 456: ec86 sd ra,88(sp) + 458: e8a2 sd s0,80(sp) + 45a: e0ca sd s2,64(sp) + 45c: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 45e: 0005c903 lbu s2,0(a1) + 462: 28090663 beqz s2,6ee + 466: e4a6 sd s1,72(sp) + 468: fc4e sd s3,56(sp) + 46a: f852 sd s4,48(sp) + 46c: f456 sd s5,40(sp) + 46e: f05a sd s6,32(sp) + 470: ec5e sd s7,24(sp) + 472: e862 sd s8,16(sp) + 474: e466 sd s9,8(sp) + 476: 8b2a mv s6,a0 + 478: 8a2e mv s4,a1 + 47a: 8bb2 mv s7,a2 + state = 0; + 47c: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 47e: 4481 li s1,0 + 480: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 482: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 486: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 48a: 06c00c93 li s9,108 + 48e: a005 j 4ae + putc(fd, c0); + 490: 85ca mv a1,s2 + 492: 855a mv a0,s6 + 494: f07ff0ef jal 39a + 498: a019 j 49e + } else if(state == '%'){ + 49a: 03598263 beq s3,s5,4be + for(i = 0; fmt[i]; i++){ + 49e: 2485 addiw s1,s1,1 + 4a0: 8726 mv a4,s1 + 4a2: 009a07b3 add a5,s4,s1 + 4a6: 0007c903 lbu s2,0(a5) + 4aa: 22090a63 beqz s2,6de + c0 = fmt[i] & 0xff; + 4ae: 0009079b sext.w a5,s2 + if(state == 0){ + 4b2: fe0994e3 bnez s3,49a + if(c0 == '%'){ + 4b6: fd579de3 bne a5,s5,490 + state = '%'; + 4ba: 89be mv s3,a5 + 4bc: b7cd j 49e + if(c0) c1 = fmt[i+1] & 0xff; + 4be: 00ea06b3 add a3,s4,a4 + 4c2: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4c6: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4c8: c681 beqz a3,4d0 + 4ca: 9752 add a4,a4,s4 + 4cc: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4d0: 05878363 beq a5,s8,516 + } else if(c0 == 'l' && c1 == 'd'){ + 4d4: 05978d63 beq a5,s9,52e + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4d8: 07500713 li a4,117 + 4dc: 0ee78763 beq a5,a4,5ca + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4e0: 07800713 li a4,120 + 4e4: 12e78963 beq a5,a4,616 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4e8: 07000713 li a4,112 + 4ec: 14e78e63 beq a5,a4,648 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4f0: 06300713 li a4,99 + 4f4: 18e78e63 beq a5,a4,690 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4f8: 07300713 li a4,115 + 4fc: 1ae78463 beq a5,a4,6a4 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 500: 02500713 li a4,37 + 504: 04e79563 bne a5,a4,54e + putc(fd, '%'); + 508: 02500593 li a1,37 + 50c: 855a mv a0,s6 + 50e: e8dff0ef jal 39a + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 512: 4981 li s3,0 + 514: b769 j 49e + printint(fd, va_arg(ap, int), 10, 1); + 516: 008b8913 addi s2,s7,8 + 51a: 4685 li a3,1 + 51c: 4629 li a2,10 + 51e: 000ba583 lw a1,0(s7) + 522: 855a mv a0,s6 + 524: e95ff0ef jal 3b8 + 528: 8bca mv s7,s2 + state = 0; + 52a: 4981 li s3,0 + 52c: bf8d j 49e + } else if(c0 == 'l' && c1 == 'd'){ + 52e: 06400793 li a5,100 + 532: 02f68963 beq a3,a5,564 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 536: 06c00793 li a5,108 + 53a: 04f68263 beq a3,a5,57e + } else if(c0 == 'l' && c1 == 'u'){ + 53e: 07500793 li a5,117 + 542: 0af68063 beq a3,a5,5e2 + } else if(c0 == 'l' && c1 == 'x'){ + 546: 07800793 li a5,120 + 54a: 0ef68263 beq a3,a5,62e + putc(fd, '%'); + 54e: 02500593 li a1,37 + 552: 855a mv a0,s6 + 554: e47ff0ef jal 39a + putc(fd, c0); + 558: 85ca mv a1,s2 + 55a: 855a mv a0,s6 + 55c: e3fff0ef jal 39a + state = 0; + 560: 4981 li s3,0 + 562: bf35 j 49e + printint(fd, va_arg(ap, uint64), 10, 1); + 564: 008b8913 addi s2,s7,8 + 568: 4685 li a3,1 + 56a: 4629 li a2,10 + 56c: 000bb583 ld a1,0(s7) + 570: 855a mv a0,s6 + 572: e47ff0ef jal 3b8 + i += 1; + 576: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 578: 8bca mv s7,s2 + state = 0; + 57a: 4981 li s3,0 + i += 1; + 57c: b70d j 49e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 57e: 06400793 li a5,100 + 582: 02f60763 beq a2,a5,5b0 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 586: 07500793 li a5,117 + 58a: 06f60963 beq a2,a5,5fc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 58e: 07800793 li a5,120 + 592: faf61ee3 bne a2,a5,54e + printint(fd, va_arg(ap, uint64), 16, 0); + 596: 008b8913 addi s2,s7,8 + 59a: 4681 li a3,0 + 59c: 4641 li a2,16 + 59e: 000bb583 ld a1,0(s7) + 5a2: 855a mv a0,s6 + 5a4: e15ff0ef jal 3b8 + i += 2; + 5a8: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5aa: 8bca mv s7,s2 + state = 0; + 5ac: 4981 li s3,0 + i += 2; + 5ae: bdc5 j 49e + printint(fd, va_arg(ap, uint64), 10, 1); + 5b0: 008b8913 addi s2,s7,8 + 5b4: 4685 li a3,1 + 5b6: 4629 li a2,10 + 5b8: 000bb583 ld a1,0(s7) + 5bc: 855a mv a0,s6 + 5be: dfbff0ef jal 3b8 + i += 2; + 5c2: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5c4: 8bca mv s7,s2 + state = 0; + 5c6: 4981 li s3,0 + i += 2; + 5c8: bdd9 j 49e + printint(fd, va_arg(ap, uint32), 10, 0); + 5ca: 008b8913 addi s2,s7,8 + 5ce: 4681 li a3,0 + 5d0: 4629 li a2,10 + 5d2: 000be583 lwu a1,0(s7) + 5d6: 855a mv a0,s6 + 5d8: de1ff0ef jal 3b8 + 5dc: 8bca mv s7,s2 + state = 0; + 5de: 4981 li s3,0 + 5e0: bd7d j 49e + printint(fd, va_arg(ap, uint64), 10, 0); + 5e2: 008b8913 addi s2,s7,8 + 5e6: 4681 li a3,0 + 5e8: 4629 li a2,10 + 5ea: 000bb583 ld a1,0(s7) + 5ee: 855a mv a0,s6 + 5f0: dc9ff0ef jal 3b8 + i += 1; + 5f4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5f6: 8bca mv s7,s2 + state = 0; + 5f8: 4981 li s3,0 + i += 1; + 5fa: b555 j 49e + printint(fd, va_arg(ap, uint64), 10, 0); + 5fc: 008b8913 addi s2,s7,8 + 600: 4681 li a3,0 + 602: 4629 li a2,10 + 604: 000bb583 ld a1,0(s7) + 608: 855a mv a0,s6 + 60a: dafff0ef jal 3b8 + i += 2; + 60e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 610: 8bca mv s7,s2 + state = 0; + 612: 4981 li s3,0 + i += 2; + 614: b569 j 49e + printint(fd, va_arg(ap, uint32), 16, 0); + 616: 008b8913 addi s2,s7,8 + 61a: 4681 li a3,0 + 61c: 4641 li a2,16 + 61e: 000be583 lwu a1,0(s7) + 622: 855a mv a0,s6 + 624: d95ff0ef jal 3b8 + 628: 8bca mv s7,s2 + state = 0; + 62a: 4981 li s3,0 + 62c: bd8d j 49e + printint(fd, va_arg(ap, uint64), 16, 0); + 62e: 008b8913 addi s2,s7,8 + 632: 4681 li a3,0 + 634: 4641 li a2,16 + 636: 000bb583 ld a1,0(s7) + 63a: 855a mv a0,s6 + 63c: d7dff0ef jal 3b8 + i += 1; + 640: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 642: 8bca mv s7,s2 + state = 0; + 644: 4981 li s3,0 + i += 1; + 646: bda1 j 49e + 648: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 64a: 008b8d13 addi s10,s7,8 + 64e: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 652: 03000593 li a1,48 + 656: 855a mv a0,s6 + 658: d43ff0ef jal 39a + putc(fd, 'x'); + 65c: 07800593 li a1,120 + 660: 855a mv a0,s6 + 662: d39ff0ef jal 39a + 666: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 668: 00000b97 auipc s7,0x0 + 66c: 2a8b8b93 addi s7,s7,680 # 910 + 670: 03c9d793 srli a5,s3,0x3c + 674: 97de add a5,a5,s7 + 676: 0007c583 lbu a1,0(a5) + 67a: 855a mv a0,s6 + 67c: d1fff0ef jal 39a + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 680: 0992 slli s3,s3,0x4 + 682: 397d addiw s2,s2,-1 + 684: fe0916e3 bnez s2,670 + printptr(fd, va_arg(ap, uint64)); + 688: 8bea mv s7,s10 + state = 0; + 68a: 4981 li s3,0 + 68c: 6d02 ld s10,0(sp) + 68e: bd01 j 49e + putc(fd, va_arg(ap, uint32)); + 690: 008b8913 addi s2,s7,8 + 694: 000bc583 lbu a1,0(s7) + 698: 855a mv a0,s6 + 69a: d01ff0ef jal 39a + 69e: 8bca mv s7,s2 + state = 0; + 6a0: 4981 li s3,0 + 6a2: bbf5 j 49e + if((s = va_arg(ap, char*)) == 0) + 6a4: 008b8993 addi s3,s7,8 + 6a8: 000bb903 ld s2,0(s7) + 6ac: 00090f63 beqz s2,6ca + for(; *s; s++) + 6b0: 00094583 lbu a1,0(s2) + 6b4: c195 beqz a1,6d8 + putc(fd, *s); + 6b6: 855a mv a0,s6 + 6b8: ce3ff0ef jal 39a + for(; *s; s++) + 6bc: 0905 addi s2,s2,1 + 6be: 00094583 lbu a1,0(s2) + 6c2: f9f5 bnez a1,6b6 + if((s = va_arg(ap, char*)) == 0) + 6c4: 8bce mv s7,s3 + state = 0; + 6c6: 4981 li s3,0 + 6c8: bbd9 j 49e + s = "(null)"; + 6ca: 00000917 auipc s2,0x0 + 6ce: 23e90913 addi s2,s2,574 # 908 + for(; *s; s++) + 6d2: 02800593 li a1,40 + 6d6: b7c5 j 6b6 + if((s = va_arg(ap, char*)) == 0) + 6d8: 8bce mv s7,s3 + state = 0; + 6da: 4981 li s3,0 + 6dc: b3c9 j 49e + 6de: 64a6 ld s1,72(sp) + 6e0: 79e2 ld s3,56(sp) + 6e2: 7a42 ld s4,48(sp) + 6e4: 7aa2 ld s5,40(sp) + 6e6: 7b02 ld s6,32(sp) + 6e8: 6be2 ld s7,24(sp) + 6ea: 6c42 ld s8,16(sp) + 6ec: 6ca2 ld s9,8(sp) + } + } +} + 6ee: 60e6 ld ra,88(sp) + 6f0: 6446 ld s0,80(sp) + 6f2: 6906 ld s2,64(sp) + 6f4: 6125 addi sp,sp,96 + 6f6: 8082 ret + +00000000000006f8 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6f8: 715d addi sp,sp,-80 + 6fa: ec06 sd ra,24(sp) + 6fc: e822 sd s0,16(sp) + 6fe: 1000 addi s0,sp,32 + 700: e010 sd a2,0(s0) + 702: e414 sd a3,8(s0) + 704: e818 sd a4,16(s0) + 706: ec1c sd a5,24(s0) + 708: 03043023 sd a6,32(s0) + 70c: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 710: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 714: 8622 mv a2,s0 + 716: d3fff0ef jal 454 +} + 71a: 60e2 ld ra,24(sp) + 71c: 6442 ld s0,16(sp) + 71e: 6161 addi sp,sp,80 + 720: 8082 ret + +0000000000000722 : + +void +printf(const char *fmt, ...) +{ + 722: 711d addi sp,sp,-96 + 724: ec06 sd ra,24(sp) + 726: e822 sd s0,16(sp) + 728: 1000 addi s0,sp,32 + 72a: e40c sd a1,8(s0) + 72c: e810 sd a2,16(s0) + 72e: ec14 sd a3,24(s0) + 730: f018 sd a4,32(s0) + 732: f41c sd a5,40(s0) + 734: 03043823 sd a6,48(s0) + 738: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 73c: 00840613 addi a2,s0,8 + 740: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 744: 85aa mv a1,a0 + 746: 4505 li a0,1 + 748: d0dff0ef jal 454 +} + 74c: 60e2 ld ra,24(sp) + 74e: 6442 ld s0,16(sp) + 750: 6125 addi sp,sp,96 + 752: 8082 ret + +0000000000000754 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 754: 1141 addi sp,sp,-16 + 756: e422 sd s0,8(sp) + 758: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 75a: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 75e: 00001797 auipc a5,0x1 + 762: 8a27b783 ld a5,-1886(a5) # 1000 + 766: a02d j 790 + 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; + 768: 4618 lw a4,8(a2) + 76a: 9f2d addw a4,a4,a1 + 76c: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 770: 6398 ld a4,0(a5) + 772: 6310 ld a2,0(a4) + 774: a83d j 7b2 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 776: ff852703 lw a4,-8(a0) + 77a: 9f31 addw a4,a4,a2 + 77c: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 77e: ff053683 ld a3,-16(a0) + 782: a091 j 7c6 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 784: 6398 ld a4,0(a5) + 786: 00e7e463 bltu a5,a4,78e + 78a: 00e6ea63 bltu a3,a4,79e +{ + 78e: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 790: fed7fae3 bgeu a5,a3,784 + 794: 6398 ld a4,0(a5) + 796: 00e6e463 bltu a3,a4,79e + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 79a: fee7eae3 bltu a5,a4,78e + if(bp + bp->s.size == p->s.ptr){ + 79e: ff852583 lw a1,-8(a0) + 7a2: 6390 ld a2,0(a5) + 7a4: 02059813 slli a6,a1,0x20 + 7a8: 01c85713 srli a4,a6,0x1c + 7ac: 9736 add a4,a4,a3 + 7ae: fae60de3 beq a2,a4,768 + bp->s.ptr = p->s.ptr->s.ptr; + 7b2: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7b6: 4790 lw a2,8(a5) + 7b8: 02061593 slli a1,a2,0x20 + 7bc: 01c5d713 srli a4,a1,0x1c + 7c0: 973e add a4,a4,a5 + 7c2: fae68ae3 beq a3,a4,776 + p->s.ptr = bp->s.ptr; + 7c6: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7c8: 00001717 auipc a4,0x1 + 7cc: 82f73c23 sd a5,-1992(a4) # 1000 +} + 7d0: 6422 ld s0,8(sp) + 7d2: 0141 addi sp,sp,16 + 7d4: 8082 ret + +00000000000007d6 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7d6: 7139 addi sp,sp,-64 + 7d8: fc06 sd ra,56(sp) + 7da: f822 sd s0,48(sp) + 7dc: f426 sd s1,40(sp) + 7de: ec4e sd s3,24(sp) + 7e0: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7e2: 02051493 slli s1,a0,0x20 + 7e6: 9081 srli s1,s1,0x20 + 7e8: 04bd addi s1,s1,15 + 7ea: 8091 srli s1,s1,0x4 + 7ec: 0014899b addiw s3,s1,1 + 7f0: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7f2: 00001517 auipc a0,0x1 + 7f6: 80e53503 ld a0,-2034(a0) # 1000 + 7fa: c915 beqz a0,82e + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7fc: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7fe: 4798 lw a4,8(a5) + 800: 08977a63 bgeu a4,s1,894 + 804: f04a sd s2,32(sp) + 806: e852 sd s4,16(sp) + 808: e456 sd s5,8(sp) + 80a: e05a sd s6,0(sp) + if(nu < 4096) + 80c: 8a4e mv s4,s3 + 80e: 0009871b sext.w a4,s3 + 812: 6685 lui a3,0x1 + 814: 00d77363 bgeu a4,a3,81a + 818: 6a05 lui s4,0x1 + 81a: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 81e: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 822: 00000917 auipc s2,0x0 + 826: 7de90913 addi s2,s2,2014 # 1000 + if(p == SBRK_ERROR) + 82a: 5afd li s5,-1 + 82c: a081 j 86c + 82e: f04a sd s2,32(sp) + 830: e852 sd s4,16(sp) + 832: e456 sd s5,8(sp) + 834: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 836: 00000797 auipc a5,0x0 + 83a: 7da78793 addi a5,a5,2010 # 1010 + 83e: 00000717 auipc a4,0x0 + 842: 7cf73123 sd a5,1986(a4) # 1000 + 846: e39c sd a5,0(a5) + base.s.size = 0; + 848: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 84c: b7c1 j 80c + prevp->s.ptr = p->s.ptr; + 84e: 6398 ld a4,0(a5) + 850: e118 sd a4,0(a0) + 852: a8a9 j 8ac + hp->s.size = nu; + 854: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 858: 0541 addi a0,a0,16 + 85a: efbff0ef jal 754 + return freep; + 85e: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 862: c12d beqz a0,8c4 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 864: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 866: 4798 lw a4,8(a5) + 868: 02977263 bgeu a4,s1,88c + if(p == freep) + 86c: 00093703 ld a4,0(s2) + 870: 853e mv a0,a5 + 872: fef719e3 bne a4,a5,864 + p = sbrk(nu * sizeof(Header)); + 876: 8552 mv a0,s4 + 878: a4fff0ef jal 2c6 + if(p == SBRK_ERROR) + 87c: fd551ce3 bne a0,s5,854 + return 0; + 880: 4501 li a0,0 + 882: 7902 ld s2,32(sp) + 884: 6a42 ld s4,16(sp) + 886: 6aa2 ld s5,8(sp) + 888: 6b02 ld s6,0(sp) + 88a: a03d j 8b8 + 88c: 7902 ld s2,32(sp) + 88e: 6a42 ld s4,16(sp) + 890: 6aa2 ld s5,8(sp) + 892: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 894: fae48de3 beq s1,a4,84e + p->s.size -= nunits; + 898: 4137073b subw a4,a4,s3 + 89c: c798 sw a4,8(a5) + p += p->s.size; + 89e: 02071693 slli a3,a4,0x20 + 8a2: 01c6d713 srli a4,a3,0x1c + 8a6: 97ba add a5,a5,a4 + p->s.size = nunits; + 8a8: 0137a423 sw s3,8(a5) + freep = prevp; + 8ac: 00000717 auipc a4,0x0 + 8b0: 74a73a23 sd a0,1876(a4) # 1000 + return (void*)(p + 1); + 8b4: 01078513 addi a0,a5,16 + } +} + 8b8: 70e2 ld ra,56(sp) + 8ba: 7442 ld s0,48(sp) + 8bc: 74a2 ld s1,40(sp) + 8be: 69e2 ld s3,24(sp) + 8c0: 6121 addi sp,sp,64 + 8c2: 8082 ret + 8c4: 7902 ld s2,32(sp) + 8c6: 6a42 ld s4,16(sp) + 8c8: 6aa2 ld s5,8(sp) + 8ca: 6b02 ld s6,0(sp) + 8cc: b7f5 j 8b8 diff --git a/G12_Project2_2/user/mkdir.c b/G12_Project2_2/user/mkdir.c new file mode 100644 index 0000000000..c2b31c1378 --- /dev/null +++ b/G12_Project2_2/user/mkdir.c @@ -0,0 +1,23 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "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/G12_Project2_2/user/mkdir.d b/G12_Project2_2/user/mkdir.d new file mode 100644 index 0000000000..7ad28bea37 --- /dev/null +++ b/G12_Project2_2/user/mkdir.d @@ -0,0 +1 @@ +user/mkdir.o: user/mkdir.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project2_2/user/mkdir.o b/G12_Project2_2/user/mkdir.o new file mode 100644 index 0000000000..436ddd84ec Binary files /dev/null and b/G12_Project2_2/user/mkdir.o differ diff --git a/G12_Project2_2/user/mkdir.sym b/G12_Project2_2/user/mkdir.sym new file mode 100644 index 0000000000..37407738ba --- /dev/null +++ b/G12_Project2_2/user/mkdir.sym @@ -0,0 +1,65 @@ +0000000000000000 .text +00000000000008d0 .rodata +0000000000000928 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 mkdir.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000039a putc +00000000000003b8 printint +0000000000000910 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000076 strcpy +000000000000038a pause +0000000000000722 printf +0000000000000382 sys_sbrk +0000000000000220 memmove +0000000000000342 mknod +000000000000012e gets +000000000000037a getpid +00000000000002b2 memcpy +00000000000007d6 malloc +00000000000002dc sbrklazy +000000000000030a pipe +000000000000031a write +0000000000000352 fstat +00000000000006f8 fprintf +000000000000032a kill +0000000000000454 vprintf +000000000000036a chdir +0000000000000332 exec +0000000000000302 wait +0000000000000312 read +000000000000034a unlink +0000000000000278 memcmp +00000000000002f2 fork +00000000000002c6 sbrk +0000000000000392 uptime +00000000000000e8 memset +0000000000000000 main +0000000000000092 strcmp +0000000000000372 dup +000000000000019e stat +000000000000035a link +00000000000002fa exit +0000000000000066 start +00000000000001d8 atoi +00000000000000be strlen +000000000000033a open +000000000000010a strchr +0000000000000362 mkdir +0000000000000322 close +0000000000000754 free diff --git a/G12_Project2_2/user/printf.c b/G12_Project2_2/user/printf.c new file mode 100644 index 0000000000..75546f4c19 --- /dev/null +++ b/G12_Project2_2/user/printf.c @@ -0,0 +1,132 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "user/user.h" + +#include + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + write(fd, &c, 1); +} + +static void +printint(int fd, long long xx, int base, int sgn) +{ + char buf[20]; + int i, neg; + unsigned long long 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, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + c0 = fmt[i] & 0xff; + if(state == 0){ + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + printint(fd, va_arg(ap, uint32), 10, 0); + } else if(c0 == 'l' && c1 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + printint(fd, va_arg(ap, uint32), 16, 0); + } else if(c0 == 'l' && c1 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + putc(fd, '%'); + } else { + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + 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/G12_Project2_2/user/printf.d b/G12_Project2_2/user/printf.d new file mode 100644 index 0000000000..17c41ba34f --- /dev/null +++ b/G12_Project2_2/user/printf.d @@ -0,0 +1,2 @@ +user/printf.o: user/printf.c kernel/types.h kernel/stat.h user/user.h \ + /usr/lib/gcc-cross/riscv64-linux-gnu/13/include/stdarg.h diff --git a/G12_Project2_2/user/printf.o b/G12_Project2_2/user/printf.o new file mode 100644 index 0000000000..b864371225 Binary files /dev/null and b/G12_Project2_2/user/printf.o differ diff --git a/G12_Project2_2/user/rm.asm b/G12_Project2_2/user/rm.asm new file mode 100644 index 0000000000..886fa2e2cf --- /dev/null +++ b/G12_Project2_2/user/rm.asm @@ -0,0 +1,1509 @@ + +user/_rm: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/stat.h" +#include "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: 1000 addi s0,sp,32 + int i; + + if(argc < 2){ + 8: 4785 li a5,1 + a: 02a7d763 bge a5,a0,38 + e: e426 sd s1,8(sp) + 10: e04a sd s2,0(sp) + 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: rm files...\n"); + exit(1); + } + + for(i = 1; i < argc; i++){ + if(unlink(argv[i]) < 0){ + 26: 6088 ld a0,0(s1) + 28: 322000ef jal 34a + 2c: 02054263 bltz a0,50 + for(i = 1; i < argc; i++){ + 30: 04a1 addi s1,s1,8 + 32: ff249ae3 bne s1,s2,26 + 36: a02d j 60 + 38: e426 sd s1,8(sp) + 3a: e04a sd s2,0(sp) + fprintf(2, "Usage: rm files...\n"); + 3c: 00001597 auipc a1,0x1 + 40: 89458593 addi a1,a1,-1900 # 8d0 + 44: 4509 li a0,2 + 46: 6b2000ef jal 6f8 + exit(1); + 4a: 4505 li a0,1 + 4c: 2ae000ef jal 2fa + fprintf(2, "rm: %s failed to delete\n", argv[i]); + 50: 6090 ld a2,0(s1) + 52: 00001597 auipc a1,0x1 + 56: 89658593 addi a1,a1,-1898 # 8e8 + 5a: 4509 li a0,2 + 5c: 69c000ef jal 6f8 + break; + } + } + + exit(0); + 60: 4501 li a0,0 + 62: 298000ef jal 2fa + +0000000000000066 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 66: 1141 addi sp,sp,-16 + 68: e406 sd ra,8(sp) + 6a: e022 sd s0,0(sp) + 6c: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 6e: f93ff0ef jal 0
+ exit(r); + 72: 288000ef jal 2fa + +0000000000000076 : +} + +char* +strcpy(char *s, const char *t) +{ + 76: 1141 addi sp,sp,-16 + 78: e422 sd s0,8(sp) + 7a: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 7c: 87aa mv a5,a0 + 7e: 0585 addi a1,a1,1 + 80: 0785 addi a5,a5,1 + 82: fff5c703 lbu a4,-1(a1) + 86: fee78fa3 sb a4,-1(a5) + 8a: fb75 bnez a4,7e + ; + return os; +} + 8c: 6422 ld s0,8(sp) + 8e: 0141 addi sp,sp,16 + 90: 8082 ret + +0000000000000092 : + +int +strcmp(const char *p, const char *q) +{ + 92: 1141 addi sp,sp,-16 + 94: e422 sd s0,8(sp) + 96: 0800 addi s0,sp,16 + while(*p && *p == *q) + 98: 00054783 lbu a5,0(a0) + 9c: cb91 beqz a5,b0 + 9e: 0005c703 lbu a4,0(a1) + a2: 00f71763 bne a4,a5,b0 + p++, q++; + a6: 0505 addi a0,a0,1 + a8: 0585 addi a1,a1,1 + while(*p && *p == *q) + aa: 00054783 lbu a5,0(a0) + ae: fbe5 bnez a5,9e + return (uchar)*p - (uchar)*q; + b0: 0005c503 lbu a0,0(a1) +} + b4: 40a7853b subw a0,a5,a0 + b8: 6422 ld s0,8(sp) + ba: 0141 addi sp,sp,16 + bc: 8082 ret + +00000000000000be : + +uint +strlen(const char *s) +{ + be: 1141 addi sp,sp,-16 + c0: e422 sd s0,8(sp) + c2: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + c4: 00054783 lbu a5,0(a0) + c8: cf91 beqz a5,e4 + ca: 0505 addi a0,a0,1 + cc: 87aa mv a5,a0 + ce: 86be mv a3,a5 + d0: 0785 addi a5,a5,1 + d2: fff7c703 lbu a4,-1(a5) + d6: ff65 bnez a4,ce + d8: 40a6853b subw a0,a3,a0 + dc: 2505 addiw a0,a0,1 + ; + return n; +} + de: 6422 ld s0,8(sp) + e0: 0141 addi sp,sp,16 + e2: 8082 ret + for(n = 0; s[n]; n++) + e4: 4501 li a0,0 + e6: bfe5 j de + +00000000000000e8 : + +void* +memset(void *dst, int c, uint n) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + ee: ca19 beqz a2,104 + f0: 87aa mv a5,a0 + f2: 1602 slli a2,a2,0x20 + f4: 9201 srli a2,a2,0x20 + f6: 00a60733 add a4,a2,a0 + cdst[i] = c; + fa: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + fe: 0785 addi a5,a5,1 + 100: fee79de3 bne a5,a4,fa + } + return dst; +} + 104: 6422 ld s0,8(sp) + 106: 0141 addi sp,sp,16 + 108: 8082 ret + +000000000000010a : + +char* +strchr(const char *s, char c) +{ + 10a: 1141 addi sp,sp,-16 + 10c: e422 sd s0,8(sp) + 10e: 0800 addi s0,sp,16 + for(; *s; s++) + 110: 00054783 lbu a5,0(a0) + 114: cb99 beqz a5,12a + if(*s == c) + 116: 00f58763 beq a1,a5,124 + for(; *s; s++) + 11a: 0505 addi a0,a0,1 + 11c: 00054783 lbu a5,0(a0) + 120: fbfd bnez a5,116 + return (char*)s; + return 0; + 122: 4501 li a0,0 +} + 124: 6422 ld s0,8(sp) + 126: 0141 addi sp,sp,16 + 128: 8082 ret + return 0; + 12a: 4501 li a0,0 + 12c: bfe5 j 124 + +000000000000012e : + +char* +gets(char *buf, int max) +{ + 12e: 711d addi sp,sp,-96 + 130: ec86 sd ra,88(sp) + 132: e8a2 sd s0,80(sp) + 134: e4a6 sd s1,72(sp) + 136: e0ca sd s2,64(sp) + 138: fc4e sd s3,56(sp) + 13a: f852 sd s4,48(sp) + 13c: f456 sd s5,40(sp) + 13e: f05a sd s6,32(sp) + 140: ec5e sd s7,24(sp) + 142: 1080 addi s0,sp,96 + 144: 8baa mv s7,a0 + 146: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 148: 892a mv s2,a0 + 14a: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 14c: 4aa9 li s5,10 + 14e: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 150: 89a6 mv s3,s1 + 152: 2485 addiw s1,s1,1 + 154: 0344d663 bge s1,s4,180 + cc = read(0, &c, 1); + 158: 4605 li a2,1 + 15a: faf40593 addi a1,s0,-81 + 15e: 4501 li a0,0 + 160: 1b2000ef jal 312 + if(cc < 1) + 164: 00a05e63 blez a0,180 + buf[i++] = c; + 168: faf44783 lbu a5,-81(s0) + 16c: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 170: 01578763 beq a5,s5,17e + 174: 0905 addi s2,s2,1 + 176: fd679de3 bne a5,s6,150 + buf[i++] = c; + 17a: 89a6 mv s3,s1 + 17c: a011 j 180 + 17e: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 180: 99de add s3,s3,s7 + 182: 00098023 sb zero,0(s3) + return buf; +} + 186: 855e mv a0,s7 + 188: 60e6 ld ra,88(sp) + 18a: 6446 ld s0,80(sp) + 18c: 64a6 ld s1,72(sp) + 18e: 6906 ld s2,64(sp) + 190: 79e2 ld s3,56(sp) + 192: 7a42 ld s4,48(sp) + 194: 7aa2 ld s5,40(sp) + 196: 7b02 ld s6,32(sp) + 198: 6be2 ld s7,24(sp) + 19a: 6125 addi sp,sp,96 + 19c: 8082 ret + +000000000000019e : + +int +stat(const char *n, struct stat *st) +{ + 19e: 1101 addi sp,sp,-32 + 1a0: ec06 sd ra,24(sp) + 1a2: e822 sd s0,16(sp) + 1a4: e04a sd s2,0(sp) + 1a6: 1000 addi s0,sp,32 + 1a8: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 1aa: 4581 li a1,0 + 1ac: 18e000ef jal 33a + if(fd < 0) + 1b0: 02054263 bltz a0,1d4 + 1b4: e426 sd s1,8(sp) + 1b6: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 1b8: 85ca mv a1,s2 + 1ba: 198000ef jal 352 + 1be: 892a mv s2,a0 + close(fd); + 1c0: 8526 mv a0,s1 + 1c2: 160000ef jal 322 + return r; + 1c6: 64a2 ld s1,8(sp) +} + 1c8: 854a mv a0,s2 + 1ca: 60e2 ld ra,24(sp) + 1cc: 6442 ld s0,16(sp) + 1ce: 6902 ld s2,0(sp) + 1d0: 6105 addi sp,sp,32 + 1d2: 8082 ret + return -1; + 1d4: 597d li s2,-1 + 1d6: bfcd j 1c8 + +00000000000001d8 : + +int +atoi(const char *s) +{ + 1d8: 1141 addi sp,sp,-16 + 1da: e422 sd s0,8(sp) + 1dc: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 1de: 00054683 lbu a3,0(a0) + 1e2: fd06879b addiw a5,a3,-48 + 1e6: 0ff7f793 zext.b a5,a5 + 1ea: 4625 li a2,9 + 1ec: 02f66863 bltu a2,a5,21c + 1f0: 872a mv a4,a0 + n = 0; + 1f2: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1f4: 0705 addi a4,a4,1 + 1f6: 0025179b slliw a5,a0,0x2 + 1fa: 9fa9 addw a5,a5,a0 + 1fc: 0017979b slliw a5,a5,0x1 + 200: 9fb5 addw a5,a5,a3 + 202: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 206: 00074683 lbu a3,0(a4) + 20a: fd06879b addiw a5,a3,-48 + 20e: 0ff7f793 zext.b a5,a5 + 212: fef671e3 bgeu a2,a5,1f4 + return n; +} + 216: 6422 ld s0,8(sp) + 218: 0141 addi sp,sp,16 + 21a: 8082 ret + n = 0; + 21c: 4501 li a0,0 + 21e: bfe5 j 216 + +0000000000000220 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 220: 1141 addi sp,sp,-16 + 222: e422 sd s0,8(sp) + 224: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 226: 02b57463 bgeu a0,a1,24e + while(n-- > 0) + 22a: 00c05f63 blez a2,248 + 22e: 1602 slli a2,a2,0x20 + 230: 9201 srli a2,a2,0x20 + 232: 00c507b3 add a5,a0,a2 + dst = vdst; + 236: 872a mv a4,a0 + *dst++ = *src++; + 238: 0585 addi a1,a1,1 + 23a: 0705 addi a4,a4,1 + 23c: fff5c683 lbu a3,-1(a1) + 240: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 244: fef71ae3 bne a4,a5,238 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 248: 6422 ld s0,8(sp) + 24a: 0141 addi sp,sp,16 + 24c: 8082 ret + dst += n; + 24e: 00c50733 add a4,a0,a2 + src += n; + 252: 95b2 add a1,a1,a2 + while(n-- > 0) + 254: fec05ae3 blez a2,248 + 258: fff6079b addiw a5,a2,-1 + 25c: 1782 slli a5,a5,0x20 + 25e: 9381 srli a5,a5,0x20 + 260: fff7c793 not a5,a5 + 264: 97ba add a5,a5,a4 + *--dst = *--src; + 266: 15fd addi a1,a1,-1 + 268: 177d addi a4,a4,-1 + 26a: 0005c683 lbu a3,0(a1) + 26e: 00d70023 sb a3,0(a4) + while(n-- > 0) + 272: fee79ae3 bne a5,a4,266 + 276: bfc9 j 248 + +0000000000000278 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 278: 1141 addi sp,sp,-16 + 27a: e422 sd s0,8(sp) + 27c: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 27e: ca05 beqz a2,2ae + 280: fff6069b addiw a3,a2,-1 + 284: 1682 slli a3,a3,0x20 + 286: 9281 srli a3,a3,0x20 + 288: 0685 addi a3,a3,1 + 28a: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 28c: 00054783 lbu a5,0(a0) + 290: 0005c703 lbu a4,0(a1) + 294: 00e79863 bne a5,a4,2a4 + return *p1 - *p2; + } + p1++; + 298: 0505 addi a0,a0,1 + p2++; + 29a: 0585 addi a1,a1,1 + while (n-- > 0) { + 29c: fed518e3 bne a0,a3,28c + } + return 0; + 2a0: 4501 li a0,0 + 2a2: a019 j 2a8 + return *p1 - *p2; + 2a4: 40e7853b subw a0,a5,a4 +} + 2a8: 6422 ld s0,8(sp) + 2aa: 0141 addi sp,sp,16 + 2ac: 8082 ret + return 0; + 2ae: 4501 li a0,0 + 2b0: bfe5 j 2a8 + +00000000000002b2 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 2b2: 1141 addi sp,sp,-16 + 2b4: e406 sd ra,8(sp) + 2b6: e022 sd s0,0(sp) + 2b8: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 2ba: f67ff0ef jal 220 +} + 2be: 60a2 ld ra,8(sp) + 2c0: 6402 ld s0,0(sp) + 2c2: 0141 addi sp,sp,16 + 2c4: 8082 ret + +00000000000002c6 : + +char * +sbrk(int n) { + 2c6: 1141 addi sp,sp,-16 + 2c8: e406 sd ra,8(sp) + 2ca: e022 sd s0,0(sp) + 2cc: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 2ce: 4585 li a1,1 + 2d0: 0b2000ef jal 382 +} + 2d4: 60a2 ld ra,8(sp) + 2d6: 6402 ld s0,0(sp) + 2d8: 0141 addi sp,sp,16 + 2da: 8082 ret + +00000000000002dc : + +char * +sbrklazy(int n) { + 2dc: 1141 addi sp,sp,-16 + 2de: e406 sd ra,8(sp) + 2e0: e022 sd s0,0(sp) + 2e2: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 2e4: 4589 li a1,2 + 2e6: 09c000ef jal 382 +} + 2ea: 60a2 ld ra,8(sp) + 2ec: 6402 ld s0,0(sp) + 2ee: 0141 addi sp,sp,16 + 2f0: 8082 ret + +00000000000002f2 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2f2: 4885 li a7,1 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa : +.global exit +exit: + li a7, SYS_exit + 2fa: 4889 li a7,2 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 : +.global wait +wait: + li a7, SYS_wait + 302: 488d li a7,3 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a : +.global pipe +pipe: + li a7, SYS_pipe + 30a: 4891 li a7,4 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 : +.global read +read: + li a7, SYS_read + 312: 4895 li a7,5 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a : +.global write +write: + li a7, SYS_write + 31a: 48c1 li a7,16 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 : +.global close +close: + li a7, SYS_close + 322: 48d5 li a7,21 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a : +.global kill +kill: + li a7, SYS_kill + 32a: 4899 li a7,6 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 : +.global exec +exec: + li a7, SYS_exec + 332: 489d li a7,7 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a : +.global open +open: + li a7, SYS_open + 33a: 48bd li a7,15 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 : +.global mknod +mknod: + li a7, SYS_mknod + 342: 48c5 li a7,17 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a : +.global unlink +unlink: + li a7, SYS_unlink + 34a: 48c9 li a7,18 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 : +.global fstat +fstat: + li a7, SYS_fstat + 352: 48a1 li a7,8 + ecall + 354: 00000073 ecall + ret + 358: 8082 ret + +000000000000035a : +.global link +link: + li a7, SYS_link + 35a: 48cd li a7,19 + ecall + 35c: 00000073 ecall + ret + 360: 8082 ret + +0000000000000362 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 362: 48d1 li a7,20 + ecall + 364: 00000073 ecall + ret + 368: 8082 ret + +000000000000036a : +.global chdir +chdir: + li a7, SYS_chdir + 36a: 48a5 li a7,9 + ecall + 36c: 00000073 ecall + ret + 370: 8082 ret + +0000000000000372 : +.global dup +dup: + li a7, SYS_dup + 372: 48a9 li a7,10 + ecall + 374: 00000073 ecall + ret + 378: 8082 ret + +000000000000037a : +.global getpid +getpid: + li a7, SYS_getpid + 37a: 48ad li a7,11 + ecall + 37c: 00000073 ecall + ret + 380: 8082 ret + +0000000000000382 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 382: 48b1 li a7,12 + ecall + 384: 00000073 ecall + ret + 388: 8082 ret + +000000000000038a : +.global pause +pause: + li a7, SYS_pause + 38a: 48b5 li a7,13 + ecall + 38c: 00000073 ecall + ret + 390: 8082 ret + +0000000000000392 : +.global uptime +uptime: + li a7, SYS_uptime + 392: 48b9 li a7,14 + ecall + 394: 00000073 ecall + ret + 398: 8082 ret + +000000000000039a : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 39a: 1101 addi sp,sp,-32 + 39c: ec06 sd ra,24(sp) + 39e: e822 sd s0,16(sp) + 3a0: 1000 addi s0,sp,32 + 3a2: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 3a6: 4605 li a2,1 + 3a8: fef40593 addi a1,s0,-17 + 3ac: f6fff0ef jal 31a +} + 3b0: 60e2 ld ra,24(sp) + 3b2: 6442 ld s0,16(sp) + 3b4: 6105 addi sp,sp,32 + 3b6: 8082 ret + +00000000000003b8 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 3b8: 715d addi sp,sp,-80 + 3ba: e486 sd ra,72(sp) + 3bc: e0a2 sd s0,64(sp) + 3be: f84a sd s2,48(sp) + 3c0: 0880 addi s0,sp,80 + 3c2: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 3c4: c299 beqz a3,3ca + 3c6: 0805c363 bltz a1,44c + neg = 0; + 3ca: 4881 li a7,0 + 3cc: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 3d0: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 3d2: 00000517 auipc a0,0x0 + 3d6: 53e50513 addi a0,a0,1342 # 910 + 3da: 883e mv a6,a5 + 3dc: 2785 addiw a5,a5,1 + 3de: 02c5f733 remu a4,a1,a2 + 3e2: 972a add a4,a4,a0 + 3e4: 00074703 lbu a4,0(a4) + 3e8: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3ec: 872e mv a4,a1 + 3ee: 02c5d5b3 divu a1,a1,a2 + 3f2: 0685 addi a3,a3,1 + 3f4: fec773e3 bgeu a4,a2,3da + if(neg) + 3f8: 00088b63 beqz a7,40e + buf[i++] = '-'; + 3fc: fd078793 addi a5,a5,-48 + 400: 97a2 add a5,a5,s0 + 402: 02d00713 li a4,45 + 406: fee78423 sb a4,-24(a5) + 40a: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 40e: 02f05a63 blez a5,442 + 412: fc26 sd s1,56(sp) + 414: f44e sd s3,40(sp) + 416: fb840713 addi a4,s0,-72 + 41a: 00f704b3 add s1,a4,a5 + 41e: fff70993 addi s3,a4,-1 + 422: 99be add s3,s3,a5 + 424: 37fd addiw a5,a5,-1 + 426: 1782 slli a5,a5,0x20 + 428: 9381 srli a5,a5,0x20 + 42a: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 42e: fff4c583 lbu a1,-1(s1) + 432: 854a mv a0,s2 + 434: f67ff0ef jal 39a + while(--i >= 0) + 438: 14fd addi s1,s1,-1 + 43a: ff349ae3 bne s1,s3,42e + 43e: 74e2 ld s1,56(sp) + 440: 79a2 ld s3,40(sp) +} + 442: 60a6 ld ra,72(sp) + 444: 6406 ld s0,64(sp) + 446: 7942 ld s2,48(sp) + 448: 6161 addi sp,sp,80 + 44a: 8082 ret + x = -xx; + 44c: 40b005b3 neg a1,a1 + neg = 1; + 450: 4885 li a7,1 + x = -xx; + 452: bfad j 3cc + +0000000000000454 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 454: 711d addi sp,sp,-96 + 456: ec86 sd ra,88(sp) + 458: e8a2 sd s0,80(sp) + 45a: e0ca sd s2,64(sp) + 45c: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 45e: 0005c903 lbu s2,0(a1) + 462: 28090663 beqz s2,6ee + 466: e4a6 sd s1,72(sp) + 468: fc4e sd s3,56(sp) + 46a: f852 sd s4,48(sp) + 46c: f456 sd s5,40(sp) + 46e: f05a sd s6,32(sp) + 470: ec5e sd s7,24(sp) + 472: e862 sd s8,16(sp) + 474: e466 sd s9,8(sp) + 476: 8b2a mv s6,a0 + 478: 8a2e mv s4,a1 + 47a: 8bb2 mv s7,a2 + state = 0; + 47c: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 47e: 4481 li s1,0 + 480: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 482: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 486: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 48a: 06c00c93 li s9,108 + 48e: a005 j 4ae + putc(fd, c0); + 490: 85ca mv a1,s2 + 492: 855a mv a0,s6 + 494: f07ff0ef jal 39a + 498: a019 j 49e + } else if(state == '%'){ + 49a: 03598263 beq s3,s5,4be + for(i = 0; fmt[i]; i++){ + 49e: 2485 addiw s1,s1,1 + 4a0: 8726 mv a4,s1 + 4a2: 009a07b3 add a5,s4,s1 + 4a6: 0007c903 lbu s2,0(a5) + 4aa: 22090a63 beqz s2,6de + c0 = fmt[i] & 0xff; + 4ae: 0009079b sext.w a5,s2 + if(state == 0){ + 4b2: fe0994e3 bnez s3,49a + if(c0 == '%'){ + 4b6: fd579de3 bne a5,s5,490 + state = '%'; + 4ba: 89be mv s3,a5 + 4bc: b7cd j 49e + if(c0) c1 = fmt[i+1] & 0xff; + 4be: 00ea06b3 add a3,s4,a4 + 4c2: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4c6: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4c8: c681 beqz a3,4d0 + 4ca: 9752 add a4,a4,s4 + 4cc: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4d0: 05878363 beq a5,s8,516 + } else if(c0 == 'l' && c1 == 'd'){ + 4d4: 05978d63 beq a5,s9,52e + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4d8: 07500713 li a4,117 + 4dc: 0ee78763 beq a5,a4,5ca + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4e0: 07800713 li a4,120 + 4e4: 12e78963 beq a5,a4,616 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4e8: 07000713 li a4,112 + 4ec: 14e78e63 beq a5,a4,648 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4f0: 06300713 li a4,99 + 4f4: 18e78e63 beq a5,a4,690 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4f8: 07300713 li a4,115 + 4fc: 1ae78463 beq a5,a4,6a4 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 500: 02500713 li a4,37 + 504: 04e79563 bne a5,a4,54e + putc(fd, '%'); + 508: 02500593 li a1,37 + 50c: 855a mv a0,s6 + 50e: e8dff0ef jal 39a + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 512: 4981 li s3,0 + 514: b769 j 49e + printint(fd, va_arg(ap, int), 10, 1); + 516: 008b8913 addi s2,s7,8 + 51a: 4685 li a3,1 + 51c: 4629 li a2,10 + 51e: 000ba583 lw a1,0(s7) + 522: 855a mv a0,s6 + 524: e95ff0ef jal 3b8 + 528: 8bca mv s7,s2 + state = 0; + 52a: 4981 li s3,0 + 52c: bf8d j 49e + } else if(c0 == 'l' && c1 == 'd'){ + 52e: 06400793 li a5,100 + 532: 02f68963 beq a3,a5,564 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 536: 06c00793 li a5,108 + 53a: 04f68263 beq a3,a5,57e + } else if(c0 == 'l' && c1 == 'u'){ + 53e: 07500793 li a5,117 + 542: 0af68063 beq a3,a5,5e2 + } else if(c0 == 'l' && c1 == 'x'){ + 546: 07800793 li a5,120 + 54a: 0ef68263 beq a3,a5,62e + putc(fd, '%'); + 54e: 02500593 li a1,37 + 552: 855a mv a0,s6 + 554: e47ff0ef jal 39a + putc(fd, c0); + 558: 85ca mv a1,s2 + 55a: 855a mv a0,s6 + 55c: e3fff0ef jal 39a + state = 0; + 560: 4981 li s3,0 + 562: bf35 j 49e + printint(fd, va_arg(ap, uint64), 10, 1); + 564: 008b8913 addi s2,s7,8 + 568: 4685 li a3,1 + 56a: 4629 li a2,10 + 56c: 000bb583 ld a1,0(s7) + 570: 855a mv a0,s6 + 572: e47ff0ef jal 3b8 + i += 1; + 576: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 578: 8bca mv s7,s2 + state = 0; + 57a: 4981 li s3,0 + i += 1; + 57c: b70d j 49e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 57e: 06400793 li a5,100 + 582: 02f60763 beq a2,a5,5b0 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 586: 07500793 li a5,117 + 58a: 06f60963 beq a2,a5,5fc + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 58e: 07800793 li a5,120 + 592: faf61ee3 bne a2,a5,54e + printint(fd, va_arg(ap, uint64), 16, 0); + 596: 008b8913 addi s2,s7,8 + 59a: 4681 li a3,0 + 59c: 4641 li a2,16 + 59e: 000bb583 ld a1,0(s7) + 5a2: 855a mv a0,s6 + 5a4: e15ff0ef jal 3b8 + i += 2; + 5a8: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5aa: 8bca mv s7,s2 + state = 0; + 5ac: 4981 li s3,0 + i += 2; + 5ae: bdc5 j 49e + printint(fd, va_arg(ap, uint64), 10, 1); + 5b0: 008b8913 addi s2,s7,8 + 5b4: 4685 li a3,1 + 5b6: 4629 li a2,10 + 5b8: 000bb583 ld a1,0(s7) + 5bc: 855a mv a0,s6 + 5be: dfbff0ef jal 3b8 + i += 2; + 5c2: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 5c4: 8bca mv s7,s2 + state = 0; + 5c6: 4981 li s3,0 + i += 2; + 5c8: bdd9 j 49e + printint(fd, va_arg(ap, uint32), 10, 0); + 5ca: 008b8913 addi s2,s7,8 + 5ce: 4681 li a3,0 + 5d0: 4629 li a2,10 + 5d2: 000be583 lwu a1,0(s7) + 5d6: 855a mv a0,s6 + 5d8: de1ff0ef jal 3b8 + 5dc: 8bca mv s7,s2 + state = 0; + 5de: 4981 li s3,0 + 5e0: bd7d j 49e + printint(fd, va_arg(ap, uint64), 10, 0); + 5e2: 008b8913 addi s2,s7,8 + 5e6: 4681 li a3,0 + 5e8: 4629 li a2,10 + 5ea: 000bb583 ld a1,0(s7) + 5ee: 855a mv a0,s6 + 5f0: dc9ff0ef jal 3b8 + i += 1; + 5f4: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5f6: 8bca mv s7,s2 + state = 0; + 5f8: 4981 li s3,0 + i += 1; + 5fa: b555 j 49e + printint(fd, va_arg(ap, uint64), 10, 0); + 5fc: 008b8913 addi s2,s7,8 + 600: 4681 li a3,0 + 602: 4629 li a2,10 + 604: 000bb583 ld a1,0(s7) + 608: 855a mv a0,s6 + 60a: dafff0ef jal 3b8 + i += 2; + 60e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 610: 8bca mv s7,s2 + state = 0; + 612: 4981 li s3,0 + i += 2; + 614: b569 j 49e + printint(fd, va_arg(ap, uint32), 16, 0); + 616: 008b8913 addi s2,s7,8 + 61a: 4681 li a3,0 + 61c: 4641 li a2,16 + 61e: 000be583 lwu a1,0(s7) + 622: 855a mv a0,s6 + 624: d95ff0ef jal 3b8 + 628: 8bca mv s7,s2 + state = 0; + 62a: 4981 li s3,0 + 62c: bd8d j 49e + printint(fd, va_arg(ap, uint64), 16, 0); + 62e: 008b8913 addi s2,s7,8 + 632: 4681 li a3,0 + 634: 4641 li a2,16 + 636: 000bb583 ld a1,0(s7) + 63a: 855a mv a0,s6 + 63c: d7dff0ef jal 3b8 + i += 1; + 640: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 642: 8bca mv s7,s2 + state = 0; + 644: 4981 li s3,0 + i += 1; + 646: bda1 j 49e + 648: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 64a: 008b8d13 addi s10,s7,8 + 64e: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 652: 03000593 li a1,48 + 656: 855a mv a0,s6 + 658: d43ff0ef jal 39a + putc(fd, 'x'); + 65c: 07800593 li a1,120 + 660: 855a mv a0,s6 + 662: d39ff0ef jal 39a + 666: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 668: 00000b97 auipc s7,0x0 + 66c: 2a8b8b93 addi s7,s7,680 # 910 + 670: 03c9d793 srli a5,s3,0x3c + 674: 97de add a5,a5,s7 + 676: 0007c583 lbu a1,0(a5) + 67a: 855a mv a0,s6 + 67c: d1fff0ef jal 39a + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 680: 0992 slli s3,s3,0x4 + 682: 397d addiw s2,s2,-1 + 684: fe0916e3 bnez s2,670 + printptr(fd, va_arg(ap, uint64)); + 688: 8bea mv s7,s10 + state = 0; + 68a: 4981 li s3,0 + 68c: 6d02 ld s10,0(sp) + 68e: bd01 j 49e + putc(fd, va_arg(ap, uint32)); + 690: 008b8913 addi s2,s7,8 + 694: 000bc583 lbu a1,0(s7) + 698: 855a mv a0,s6 + 69a: d01ff0ef jal 39a + 69e: 8bca mv s7,s2 + state = 0; + 6a0: 4981 li s3,0 + 6a2: bbf5 j 49e + if((s = va_arg(ap, char*)) == 0) + 6a4: 008b8993 addi s3,s7,8 + 6a8: 000bb903 ld s2,0(s7) + 6ac: 00090f63 beqz s2,6ca + for(; *s; s++) + 6b0: 00094583 lbu a1,0(s2) + 6b4: c195 beqz a1,6d8 + putc(fd, *s); + 6b6: 855a mv a0,s6 + 6b8: ce3ff0ef jal 39a + for(; *s; s++) + 6bc: 0905 addi s2,s2,1 + 6be: 00094583 lbu a1,0(s2) + 6c2: f9f5 bnez a1,6b6 + if((s = va_arg(ap, char*)) == 0) + 6c4: 8bce mv s7,s3 + state = 0; + 6c6: 4981 li s3,0 + 6c8: bbd9 j 49e + s = "(null)"; + 6ca: 00000917 auipc s2,0x0 + 6ce: 23e90913 addi s2,s2,574 # 908 + for(; *s; s++) + 6d2: 02800593 li a1,40 + 6d6: b7c5 j 6b6 + if((s = va_arg(ap, char*)) == 0) + 6d8: 8bce mv s7,s3 + state = 0; + 6da: 4981 li s3,0 + 6dc: b3c9 j 49e + 6de: 64a6 ld s1,72(sp) + 6e0: 79e2 ld s3,56(sp) + 6e2: 7a42 ld s4,48(sp) + 6e4: 7aa2 ld s5,40(sp) + 6e6: 7b02 ld s6,32(sp) + 6e8: 6be2 ld s7,24(sp) + 6ea: 6c42 ld s8,16(sp) + 6ec: 6ca2 ld s9,8(sp) + } + } +} + 6ee: 60e6 ld ra,88(sp) + 6f0: 6446 ld s0,80(sp) + 6f2: 6906 ld s2,64(sp) + 6f4: 6125 addi sp,sp,96 + 6f6: 8082 ret + +00000000000006f8 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6f8: 715d addi sp,sp,-80 + 6fa: ec06 sd ra,24(sp) + 6fc: e822 sd s0,16(sp) + 6fe: 1000 addi s0,sp,32 + 700: e010 sd a2,0(s0) + 702: e414 sd a3,8(s0) + 704: e818 sd a4,16(s0) + 706: ec1c sd a5,24(s0) + 708: 03043023 sd a6,32(s0) + 70c: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 710: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 714: 8622 mv a2,s0 + 716: d3fff0ef jal 454 +} + 71a: 60e2 ld ra,24(sp) + 71c: 6442 ld s0,16(sp) + 71e: 6161 addi sp,sp,80 + 720: 8082 ret + +0000000000000722 : + +void +printf(const char *fmt, ...) +{ + 722: 711d addi sp,sp,-96 + 724: ec06 sd ra,24(sp) + 726: e822 sd s0,16(sp) + 728: 1000 addi s0,sp,32 + 72a: e40c sd a1,8(s0) + 72c: e810 sd a2,16(s0) + 72e: ec14 sd a3,24(s0) + 730: f018 sd a4,32(s0) + 732: f41c sd a5,40(s0) + 734: 03043823 sd a6,48(s0) + 738: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 73c: 00840613 addi a2,s0,8 + 740: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 744: 85aa mv a1,a0 + 746: 4505 li a0,1 + 748: d0dff0ef jal 454 +} + 74c: 60e2 ld ra,24(sp) + 74e: 6442 ld s0,16(sp) + 750: 6125 addi sp,sp,96 + 752: 8082 ret + +0000000000000754 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 754: 1141 addi sp,sp,-16 + 756: e422 sd s0,8(sp) + 758: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 75a: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 75e: 00001797 auipc a5,0x1 + 762: 8a27b783 ld a5,-1886(a5) # 1000 + 766: a02d j 790 + 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; + 768: 4618 lw a4,8(a2) + 76a: 9f2d addw a4,a4,a1 + 76c: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 770: 6398 ld a4,0(a5) + 772: 6310 ld a2,0(a4) + 774: a83d j 7b2 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 776: ff852703 lw a4,-8(a0) + 77a: 9f31 addw a4,a4,a2 + 77c: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 77e: ff053683 ld a3,-16(a0) + 782: a091 j 7c6 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 784: 6398 ld a4,0(a5) + 786: 00e7e463 bltu a5,a4,78e + 78a: 00e6ea63 bltu a3,a4,79e +{ + 78e: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 790: fed7fae3 bgeu a5,a3,784 + 794: 6398 ld a4,0(a5) + 796: 00e6e463 bltu a3,a4,79e + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 79a: fee7eae3 bltu a5,a4,78e + if(bp + bp->s.size == p->s.ptr){ + 79e: ff852583 lw a1,-8(a0) + 7a2: 6390 ld a2,0(a5) + 7a4: 02059813 slli a6,a1,0x20 + 7a8: 01c85713 srli a4,a6,0x1c + 7ac: 9736 add a4,a4,a3 + 7ae: fae60de3 beq a2,a4,768 + bp->s.ptr = p->s.ptr->s.ptr; + 7b2: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 7b6: 4790 lw a2,8(a5) + 7b8: 02061593 slli a1,a2,0x20 + 7bc: 01c5d713 srli a4,a1,0x1c + 7c0: 973e add a4,a4,a5 + 7c2: fae68ae3 beq a3,a4,776 + p->s.ptr = bp->s.ptr; + 7c6: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 7c8: 00001717 auipc a4,0x1 + 7cc: 82f73c23 sd a5,-1992(a4) # 1000 +} + 7d0: 6422 ld s0,8(sp) + 7d2: 0141 addi sp,sp,16 + 7d4: 8082 ret + +00000000000007d6 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 7d6: 7139 addi sp,sp,-64 + 7d8: fc06 sd ra,56(sp) + 7da: f822 sd s0,48(sp) + 7dc: f426 sd s1,40(sp) + 7de: ec4e sd s3,24(sp) + 7e0: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 7e2: 02051493 slli s1,a0,0x20 + 7e6: 9081 srli s1,s1,0x20 + 7e8: 04bd addi s1,s1,15 + 7ea: 8091 srli s1,s1,0x4 + 7ec: 0014899b addiw s3,s1,1 + 7f0: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7f2: 00001517 auipc a0,0x1 + 7f6: 80e53503 ld a0,-2034(a0) # 1000 + 7fa: c915 beqz a0,82e + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7fc: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7fe: 4798 lw a4,8(a5) + 800: 08977a63 bgeu a4,s1,894 + 804: f04a sd s2,32(sp) + 806: e852 sd s4,16(sp) + 808: e456 sd s5,8(sp) + 80a: e05a sd s6,0(sp) + if(nu < 4096) + 80c: 8a4e mv s4,s3 + 80e: 0009871b sext.w a4,s3 + 812: 6685 lui a3,0x1 + 814: 00d77363 bgeu a4,a3,81a + 818: 6a05 lui s4,0x1 + 81a: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 81e: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 822: 00000917 auipc s2,0x0 + 826: 7de90913 addi s2,s2,2014 # 1000 + if(p == SBRK_ERROR) + 82a: 5afd li s5,-1 + 82c: a081 j 86c + 82e: f04a sd s2,32(sp) + 830: e852 sd s4,16(sp) + 832: e456 sd s5,8(sp) + 834: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 836: 00000797 auipc a5,0x0 + 83a: 7da78793 addi a5,a5,2010 # 1010 + 83e: 00000717 auipc a4,0x0 + 842: 7cf73123 sd a5,1986(a4) # 1000 + 846: e39c sd a5,0(a5) + base.s.size = 0; + 848: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 84c: b7c1 j 80c + prevp->s.ptr = p->s.ptr; + 84e: 6398 ld a4,0(a5) + 850: e118 sd a4,0(a0) + 852: a8a9 j 8ac + hp->s.size = nu; + 854: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 858: 0541 addi a0,a0,16 + 85a: efbff0ef jal 754 + return freep; + 85e: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 862: c12d beqz a0,8c4 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 864: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 866: 4798 lw a4,8(a5) + 868: 02977263 bgeu a4,s1,88c + if(p == freep) + 86c: 00093703 ld a4,0(s2) + 870: 853e mv a0,a5 + 872: fef719e3 bne a4,a5,864 + p = sbrk(nu * sizeof(Header)); + 876: 8552 mv a0,s4 + 878: a4fff0ef jal 2c6 + if(p == SBRK_ERROR) + 87c: fd551ce3 bne a0,s5,854 + return 0; + 880: 4501 li a0,0 + 882: 7902 ld s2,32(sp) + 884: 6a42 ld s4,16(sp) + 886: 6aa2 ld s5,8(sp) + 888: 6b02 ld s6,0(sp) + 88a: a03d j 8b8 + 88c: 7902 ld s2,32(sp) + 88e: 6a42 ld s4,16(sp) + 890: 6aa2 ld s5,8(sp) + 892: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 894: fae48de3 beq s1,a4,84e + p->s.size -= nunits; + 898: 4137073b subw a4,a4,s3 + 89c: c798 sw a4,8(a5) + p += p->s.size; + 89e: 02071693 slli a3,a4,0x20 + 8a2: 01c6d713 srli a4,a3,0x1c + 8a6: 97ba add a5,a5,a4 + p->s.size = nunits; + 8a8: 0137a423 sw s3,8(a5) + freep = prevp; + 8ac: 00000717 auipc a4,0x0 + 8b0: 74a73a23 sd a0,1876(a4) # 1000 + return (void*)(p + 1); + 8b4: 01078513 addi a0,a5,16 + } +} + 8b8: 70e2 ld ra,56(sp) + 8ba: 7442 ld s0,48(sp) + 8bc: 74a2 ld s1,40(sp) + 8be: 69e2 ld s3,24(sp) + 8c0: 6121 addi sp,sp,64 + 8c2: 8082 ret + 8c4: 7902 ld s2,32(sp) + 8c6: 6a42 ld s4,16(sp) + 8c8: 6aa2 ld s5,8(sp) + 8ca: 6b02 ld s6,0(sp) + 8cc: b7f5 j 8b8 diff --git a/G12_Project2_2/user/rm.c b/G12_Project2_2/user/rm.c new file mode 100644 index 0000000000..26b8f1feee --- /dev/null +++ b/G12_Project2_2/user/rm.c @@ -0,0 +1,23 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "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(unlink(argv[i]) < 0){ + fprintf(2, "rm: %s failed to delete\n", argv[i]); + break; + } + } + + exit(0); +} diff --git a/G12_Project2_2/user/rm.d b/G12_Project2_2/user/rm.d new file mode 100644 index 0000000000..bc40001ea9 --- /dev/null +++ b/G12_Project2_2/user/rm.d @@ -0,0 +1 @@ +user/rm.o: user/rm.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project2_2/user/rm.o b/G12_Project2_2/user/rm.o new file mode 100644 index 0000000000..7964dac0d0 Binary files /dev/null and b/G12_Project2_2/user/rm.o differ diff --git a/G12_Project2_2/user/rm.sym b/G12_Project2_2/user/rm.sym new file mode 100644 index 0000000000..ab5edd9b14 --- /dev/null +++ b/G12_Project2_2/user/rm.sym @@ -0,0 +1,65 @@ +0000000000000000 .text +00000000000008d0 .rodata +0000000000000928 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 rm.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000039a putc +00000000000003b8 printint +0000000000000910 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +0000000000000076 strcpy +000000000000038a pause +0000000000000722 printf +0000000000000382 sys_sbrk +0000000000000220 memmove +0000000000000342 mknod +000000000000012e gets +000000000000037a getpid +00000000000002b2 memcpy +00000000000007d6 malloc +00000000000002dc sbrklazy +000000000000030a pipe +000000000000031a write +0000000000000352 fstat +00000000000006f8 fprintf +000000000000032a kill +0000000000000454 vprintf +000000000000036a chdir +0000000000000332 exec +0000000000000302 wait +0000000000000312 read +000000000000034a unlink +0000000000000278 memcmp +00000000000002f2 fork +00000000000002c6 sbrk +0000000000000392 uptime +00000000000000e8 memset +0000000000000000 main +0000000000000092 strcmp +0000000000000372 dup +000000000000019e stat +000000000000035a link +00000000000002fa exit +0000000000000066 start +00000000000001d8 atoi +00000000000000be strlen +000000000000033a open +000000000000010a strchr +0000000000000362 mkdir +0000000000000322 close +0000000000000754 free diff --git a/G12_Project2_2/user/sh.asm b/G12_Project2_2/user/sh.asm new file mode 100644 index 0000000000..292f836966 --- /dev/null +++ b/G12_Project2_2/user/sh.asm @@ -0,0 +1,2779 @@ + +user/_sh: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + exit(0); +} + +int +getcmd(char *buf, int nbuf) +{ + 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 + c: 84aa mv s1,a0 + e: 892e mv s2,a1 + write(2, "$ ", 2); + 10: 4609 li a2,2 + 12: 00001597 auipc a1,0x1 + 16: 1fe58593 addi a1,a1,510 # 1210 + 1a: 4509 li a0,2 + 1c: 433000ef jal c4e + memset(buf, 0, nbuf); + 20: 864a mv a2,s2 + 22: 4581 li a1,0 + 24: 8526 mv a0,s1 + 26: 1f7000ef jal a1c + gets(buf, nbuf); + 2a: 85ca mv a1,s2 + 2c: 8526 mv a0,s1 + 2e: 235000ef jal a62 + if(buf[0] == 0) // EOF + 32: 0004c503 lbu a0,0(s1) + 36: 00153513 seqz a0,a0 + return -1; + return 0; +} + 3a: 40a00533 neg a0,a0 + 3e: 60e2 ld ra,24(sp) + 40: 6442 ld s0,16(sp) + 42: 64a2 ld s1,8(sp) + 44: 6902 ld s2,0(sp) + 46: 6105 addi sp,sp,32 + 48: 8082 ret + +000000000000004a : + exit(0); +} + +void +panic(char *s) +{ + 4a: 1141 addi sp,sp,-16 + 4c: e406 sd ra,8(sp) + 4e: e022 sd s0,0(sp) + 50: 0800 addi s0,sp,16 + 52: 862a mv a2,a0 + fprintf(2, "%s\n", s); + 54: 00001597 auipc a1,0x1 + 58: 1cc58593 addi a1,a1,460 # 1220 + 5c: 4509 li a0,2 + 5e: 7cf000ef jal 102c + exit(1); + 62: 4505 li a0,1 + 64: 3cb000ef jal c2e + +0000000000000068 : +} + +int +fork1(void) +{ + 68: 1141 addi sp,sp,-16 + 6a: e406 sd ra,8(sp) + 6c: e022 sd s0,0(sp) + 6e: 0800 addi s0,sp,16 + int pid; + + pid = fork(); + 70: 3b7000ef jal c26 + if(pid == -1) + 74: 57fd li a5,-1 + 76: 00f50663 beq a0,a5,82 + panic("fork"); + return pid; +} + 7a: 60a2 ld ra,8(sp) + 7c: 6402 ld s0,0(sp) + 7e: 0141 addi sp,sp,16 + 80: 8082 ret + panic("fork"); + 82: 00001517 auipc a0,0x1 + 86: 1a650513 addi a0,a0,422 # 1228 + 8a: fc1ff0ef jal 4a + +000000000000008e : +{ + 8e: 7179 addi sp,sp,-48 + 90: f406 sd ra,40(sp) + 92: f022 sd s0,32(sp) + 94: 1800 addi s0,sp,48 + if(cmd == 0) + 96: c115 beqz a0,ba + 98: ec26 sd s1,24(sp) + 9a: 84aa mv s1,a0 + switch(cmd->type){ + 9c: 4118 lw a4,0(a0) + 9e: 4795 li a5,5 + a0: 02e7e163 bltu a5,a4,c2 + a4: 00056783 lwu a5,0(a0) + a8: 078a slli a5,a5,0x2 + aa: 00001717 auipc a4,0x1 + ae: 27e70713 addi a4,a4,638 # 1328 + b2: 97ba add a5,a5,a4 + b4: 439c lw a5,0(a5) + b6: 97ba add a5,a5,a4 + b8: 8782 jr a5 + ba: ec26 sd s1,24(sp) + exit(1); + bc: 4505 li a0,1 + be: 371000ef jal c2e + panic("runcmd"); + c2: 00001517 auipc a0,0x1 + c6: 16e50513 addi a0,a0,366 # 1230 + ca: f81ff0ef jal 4a + if(ecmd->argv[0] == 0) + ce: 6508 ld a0,8(a0) + d0: c105 beqz a0,f0 + exec(ecmd->argv[0], ecmd->argv); + d2: 00848593 addi a1,s1,8 + d6: 391000ef jal c66 + fprintf(2, "exec %s failed\n", ecmd->argv[0]); + da: 6490 ld a2,8(s1) + dc: 00001597 auipc a1,0x1 + e0: 15c58593 addi a1,a1,348 # 1238 + e4: 4509 li a0,2 + e6: 747000ef jal 102c + exit(0); + ea: 4501 li a0,0 + ec: 343000ef jal c2e + exit(1); + f0: 4505 li a0,1 + f2: 33d000ef jal c2e + close(rcmd->fd); + f6: 5148 lw a0,36(a0) + f8: 35f000ef jal c56 + if(open(rcmd->file, rcmd->mode) < 0){ + fc: 508c lw a1,32(s1) + fe: 6888 ld a0,16(s1) + 100: 36f000ef jal c6e + 104: 00054563 bltz a0,10e + runcmd(rcmd->cmd); + 108: 6488 ld a0,8(s1) + 10a: f85ff0ef jal 8e + fprintf(2, "open %s failed\n", rcmd->file); + 10e: 6890 ld a2,16(s1) + 110: 00001597 auipc a1,0x1 + 114: 13858593 addi a1,a1,312 # 1248 + 118: 4509 li a0,2 + 11a: 713000ef jal 102c + exit(1); + 11e: 4505 li a0,1 + 120: 30f000ef jal c2e + if(fork1() == 0) + 124: f45ff0ef jal 68 + 128: e501 bnez a0,130 + runcmd(lcmd->left); + 12a: 6488 ld a0,8(s1) + 12c: f63ff0ef jal 8e + wait(0); + 130: 4501 li a0,0 + 132: 305000ef jal c36 + runcmd(lcmd->right); + 136: 6888 ld a0,16(s1) + 138: f57ff0ef jal 8e + if(pipe(p) < 0) + 13c: fd840513 addi a0,s0,-40 + 140: 2ff000ef jal c3e + 144: 02054763 bltz a0,172 + if(fork1() == 0){ + 148: f21ff0ef jal 68 + 14c: e90d bnez a0,17e + close(1); + 14e: 4505 li a0,1 + 150: 307000ef jal c56 + dup(p[1]); + 154: fdc42503 lw a0,-36(s0) + 158: 34f000ef jal ca6 + close(p[0]); + 15c: fd842503 lw a0,-40(s0) + 160: 2f7000ef jal c56 + close(p[1]); + 164: fdc42503 lw a0,-36(s0) + 168: 2ef000ef jal c56 + runcmd(pcmd->left); + 16c: 6488 ld a0,8(s1) + 16e: f21ff0ef jal 8e + panic("pipe"); + 172: 00001517 auipc a0,0x1 + 176: 0e650513 addi a0,a0,230 # 1258 + 17a: ed1ff0ef jal 4a + if(fork1() == 0){ + 17e: eebff0ef jal 68 + 182: e115 bnez a0,1a6 + close(0); + 184: 2d3000ef jal c56 + dup(p[0]); + 188: fd842503 lw a0,-40(s0) + 18c: 31b000ef jal ca6 + close(p[0]); + 190: fd842503 lw a0,-40(s0) + 194: 2c3000ef jal c56 + close(p[1]); + 198: fdc42503 lw a0,-36(s0) + 19c: 2bb000ef jal c56 + runcmd(pcmd->right); + 1a0: 6888 ld a0,16(s1) + 1a2: eedff0ef jal 8e + close(p[0]); + 1a6: fd842503 lw a0,-40(s0) + 1aa: 2ad000ef jal c56 + close(p[1]); + 1ae: fdc42503 lw a0,-36(s0) + 1b2: 2a5000ef jal c56 + wait(0); + 1b6: 4501 li a0,0 + 1b8: 27f000ef jal c36 + wait(0); + 1bc: 4501 li a0,0 + 1be: 279000ef jal c36 + break; + 1c2: b725 j ea + if(fork1() == 0) + 1c4: ea5ff0ef jal 68 + 1c8: f20511e3 bnez a0,ea + runcmd(bcmd->cmd); + 1cc: 6488 ld a0,8(s1) + 1ce: ec1ff0ef jal 8e + +00000000000001d2 : +//PAGEBREAK! +// Constructors + +struct cmd* +execcmd(void) +{ + 1d2: 1101 addi sp,sp,-32 + 1d4: ec06 sd ra,24(sp) + 1d6: e822 sd s0,16(sp) + 1d8: e426 sd s1,8(sp) + 1da: 1000 addi s0,sp,32 + struct execcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 1dc: 0a800513 li a0,168 + 1e0: 72b000ef jal 110a + 1e4: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 1e6: 0a800613 li a2,168 + 1ea: 4581 li a1,0 + 1ec: 031000ef jal a1c + cmd->type = EXEC; + 1f0: 4785 li a5,1 + 1f2: c09c sw a5,0(s1) + return (struct cmd*)cmd; +} + 1f4: 8526 mv a0,s1 + 1f6: 60e2 ld ra,24(sp) + 1f8: 6442 ld s0,16(sp) + 1fa: 64a2 ld s1,8(sp) + 1fc: 6105 addi sp,sp,32 + 1fe: 8082 ret + +0000000000000200 : + +struct cmd* +redircmd(struct cmd *subcmd, char *file, char *efile, int mode, int fd) +{ + 200: 7139 addi sp,sp,-64 + 202: fc06 sd ra,56(sp) + 204: f822 sd s0,48(sp) + 206: f426 sd s1,40(sp) + 208: f04a sd s2,32(sp) + 20a: ec4e sd s3,24(sp) + 20c: e852 sd s4,16(sp) + 20e: e456 sd s5,8(sp) + 210: e05a sd s6,0(sp) + 212: 0080 addi s0,sp,64 + 214: 8b2a mv s6,a0 + 216: 8aae mv s5,a1 + 218: 8a32 mv s4,a2 + 21a: 89b6 mv s3,a3 + 21c: 893a mv s2,a4 + struct redircmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 21e: 02800513 li a0,40 + 222: 6e9000ef jal 110a + 226: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 228: 02800613 li a2,40 + 22c: 4581 li a1,0 + 22e: 7ee000ef jal a1c + cmd->type = REDIR; + 232: 4789 li a5,2 + 234: c09c sw a5,0(s1) + cmd->cmd = subcmd; + 236: 0164b423 sd s6,8(s1) + cmd->file = file; + 23a: 0154b823 sd s5,16(s1) + cmd->efile = efile; + 23e: 0144bc23 sd s4,24(s1) + cmd->mode = mode; + 242: 0334a023 sw s3,32(s1) + cmd->fd = fd; + 246: 0324a223 sw s2,36(s1) + return (struct cmd*)cmd; +} + 24a: 8526 mv a0,s1 + 24c: 70e2 ld ra,56(sp) + 24e: 7442 ld s0,48(sp) + 250: 74a2 ld s1,40(sp) + 252: 7902 ld s2,32(sp) + 254: 69e2 ld s3,24(sp) + 256: 6a42 ld s4,16(sp) + 258: 6aa2 ld s5,8(sp) + 25a: 6b02 ld s6,0(sp) + 25c: 6121 addi sp,sp,64 + 25e: 8082 ret + +0000000000000260 : + +struct cmd* +pipecmd(struct cmd *left, struct cmd *right) +{ + 260: 7179 addi sp,sp,-48 + 262: f406 sd ra,40(sp) + 264: f022 sd s0,32(sp) + 266: ec26 sd s1,24(sp) + 268: e84a sd s2,16(sp) + 26a: e44e sd s3,8(sp) + 26c: 1800 addi s0,sp,48 + 26e: 89aa mv s3,a0 + 270: 892e mv s2,a1 + struct pipecmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 272: 4561 li a0,24 + 274: 697000ef jal 110a + 278: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 27a: 4661 li a2,24 + 27c: 4581 li a1,0 + 27e: 79e000ef jal a1c + cmd->type = PIPE; + 282: 478d li a5,3 + 284: c09c sw a5,0(s1) + cmd->left = left; + 286: 0134b423 sd s3,8(s1) + cmd->right = right; + 28a: 0124b823 sd s2,16(s1) + return (struct cmd*)cmd; +} + 28e: 8526 mv a0,s1 + 290: 70a2 ld ra,40(sp) + 292: 7402 ld s0,32(sp) + 294: 64e2 ld s1,24(sp) + 296: 6942 ld s2,16(sp) + 298: 69a2 ld s3,8(sp) + 29a: 6145 addi sp,sp,48 + 29c: 8082 ret + +000000000000029e : + +struct cmd* +listcmd(struct cmd *left, struct cmd *right) +{ + 29e: 7179 addi sp,sp,-48 + 2a0: f406 sd ra,40(sp) + 2a2: f022 sd s0,32(sp) + 2a4: ec26 sd s1,24(sp) + 2a6: e84a sd s2,16(sp) + 2a8: e44e sd s3,8(sp) + 2aa: 1800 addi s0,sp,48 + 2ac: 89aa mv s3,a0 + 2ae: 892e mv s2,a1 + struct listcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 2b0: 4561 li a0,24 + 2b2: 659000ef jal 110a + 2b6: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 2b8: 4661 li a2,24 + 2ba: 4581 li a1,0 + 2bc: 760000ef jal a1c + cmd->type = LIST; + 2c0: 4791 li a5,4 + 2c2: c09c sw a5,0(s1) + cmd->left = left; + 2c4: 0134b423 sd s3,8(s1) + cmd->right = right; + 2c8: 0124b823 sd s2,16(s1) + return (struct cmd*)cmd; +} + 2cc: 8526 mv a0,s1 + 2ce: 70a2 ld ra,40(sp) + 2d0: 7402 ld s0,32(sp) + 2d2: 64e2 ld s1,24(sp) + 2d4: 6942 ld s2,16(sp) + 2d6: 69a2 ld s3,8(sp) + 2d8: 6145 addi sp,sp,48 + 2da: 8082 ret + +00000000000002dc : + +struct cmd* +backcmd(struct cmd *subcmd) +{ + 2dc: 1101 addi sp,sp,-32 + 2de: ec06 sd ra,24(sp) + 2e0: e822 sd s0,16(sp) + 2e2: e426 sd s1,8(sp) + 2e4: e04a sd s2,0(sp) + 2e6: 1000 addi s0,sp,32 + 2e8: 892a mv s2,a0 + struct backcmd *cmd; + + cmd = malloc(sizeof(*cmd)); + 2ea: 4541 li a0,16 + 2ec: 61f000ef jal 110a + 2f0: 84aa mv s1,a0 + memset(cmd, 0, sizeof(*cmd)); + 2f2: 4641 li a2,16 + 2f4: 4581 li a1,0 + 2f6: 726000ef jal a1c + cmd->type = BACK; + 2fa: 4795 li a5,5 + 2fc: c09c sw a5,0(s1) + cmd->cmd = subcmd; + 2fe: 0124b423 sd s2,8(s1) + return (struct cmd*)cmd; +} + 302: 8526 mv a0,s1 + 304: 60e2 ld ra,24(sp) + 306: 6442 ld s0,16(sp) + 308: 64a2 ld s1,8(sp) + 30a: 6902 ld s2,0(sp) + 30c: 6105 addi sp,sp,32 + 30e: 8082 ret + +0000000000000310 : +char whitespace[] = " \t\r\n\v"; +char symbols[] = "<|>&;()"; + +int +gettoken(char **ps, char *es, char **q, char **eq) +{ + 310: 7139 addi sp,sp,-64 + 312: fc06 sd ra,56(sp) + 314: f822 sd s0,48(sp) + 316: f426 sd s1,40(sp) + 318: f04a sd s2,32(sp) + 31a: ec4e sd s3,24(sp) + 31c: e852 sd s4,16(sp) + 31e: e456 sd s5,8(sp) + 320: e05a sd s6,0(sp) + 322: 0080 addi s0,sp,64 + 324: 8a2a mv s4,a0 + 326: 892e mv s2,a1 + 328: 8ab2 mv s5,a2 + 32a: 8b36 mv s6,a3 + char *s; + int ret; + + s = *ps; + 32c: 6104 ld s1,0(a0) + while(s < es && strchr(whitespace, *s)) + 32e: 00002997 auipc s3,0x2 + 332: cda98993 addi s3,s3,-806 # 2008 + 336: 00b4fc63 bgeu s1,a1,34e + 33a: 0004c583 lbu a1,0(s1) + 33e: 854e mv a0,s3 + 340: 6fe000ef jal a3e + 344: c509 beqz a0,34e + s++; + 346: 0485 addi s1,s1,1 + while(s < es && strchr(whitespace, *s)) + 348: fe9919e3 bne s2,s1,33a + 34c: 84ca mv s1,s2 + if(q) + 34e: 000a8463 beqz s5,356 + *q = s; + 352: 009ab023 sd s1,0(s5) + ret = *s; + 356: 0004c783 lbu a5,0(s1) + 35a: 00078a9b sext.w s5,a5 + switch(*s){ + 35e: 03c00713 li a4,60 + 362: 06f76463 bltu a4,a5,3ca + 366: 03a00713 li a4,58 + 36a: 00f76e63 bltu a4,a5,386 + 36e: cf89 beqz a5,388 + 370: 02600713 li a4,38 + 374: 00e78963 beq a5,a4,386 + 378: fd87879b addiw a5,a5,-40 + 37c: 0ff7f793 zext.b a5,a5 + 380: 4705 li a4,1 + 382: 06f76b63 bltu a4,a5,3f8 + case '(': + case ')': + case ';': + case '&': + case '<': + s++; + 386: 0485 addi s1,s1,1 + ret = 'a'; + while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) + s++; + break; + } + if(eq) + 388: 000b0463 beqz s6,390 + *eq = s; + 38c: 009b3023 sd s1,0(s6) + + while(s < es && strchr(whitespace, *s)) + 390: 00002997 auipc s3,0x2 + 394: c7898993 addi s3,s3,-904 # 2008 + 398: 0124fc63 bgeu s1,s2,3b0 + 39c: 0004c583 lbu a1,0(s1) + 3a0: 854e mv a0,s3 + 3a2: 69c000ef jal a3e + 3a6: c509 beqz a0,3b0 + s++; + 3a8: 0485 addi s1,s1,1 + while(s < es && strchr(whitespace, *s)) + 3aa: fe9919e3 bne s2,s1,39c + 3ae: 84ca mv s1,s2 + *ps = s; + 3b0: 009a3023 sd s1,0(s4) + return ret; +} + 3b4: 8556 mv a0,s5 + 3b6: 70e2 ld ra,56(sp) + 3b8: 7442 ld s0,48(sp) + 3ba: 74a2 ld s1,40(sp) + 3bc: 7902 ld s2,32(sp) + 3be: 69e2 ld s3,24(sp) + 3c0: 6a42 ld s4,16(sp) + 3c2: 6aa2 ld s5,8(sp) + 3c4: 6b02 ld s6,0(sp) + 3c6: 6121 addi sp,sp,64 + 3c8: 8082 ret + switch(*s){ + 3ca: 03e00713 li a4,62 + 3ce: 02e79163 bne a5,a4,3f0 + s++; + 3d2: 00148693 addi a3,s1,1 + if(*s == '>'){ + 3d6: 0014c703 lbu a4,1(s1) + 3da: 03e00793 li a5,62 + s++; + 3de: 0489 addi s1,s1,2 + ret = '+'; + 3e0: 02b00a93 li s5,43 + if(*s == '>'){ + 3e4: faf702e3 beq a4,a5,388 + s++; + 3e8: 84b6 mv s1,a3 + ret = *s; + 3ea: 03e00a93 li s5,62 + 3ee: bf69 j 388 + switch(*s){ + 3f0: 07c00713 li a4,124 + 3f4: f8e789e3 beq a5,a4,386 + while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) + 3f8: 00002997 auipc s3,0x2 + 3fc: c1098993 addi s3,s3,-1008 # 2008 + 400: 00002a97 auipc s5,0x2 + 404: c00a8a93 addi s5,s5,-1024 # 2000 + 408: 0324fd63 bgeu s1,s2,442 + 40c: 0004c583 lbu a1,0(s1) + 410: 854e mv a0,s3 + 412: 62c000ef jal a3e + 416: e11d bnez a0,43c + 418: 0004c583 lbu a1,0(s1) + 41c: 8556 mv a0,s5 + 41e: 620000ef jal a3e + 422: e911 bnez a0,436 + s++; + 424: 0485 addi s1,s1,1 + while(s < es && !strchr(whitespace, *s) && !strchr(symbols, *s)) + 426: fe9913e3 bne s2,s1,40c + if(eq) + 42a: 84ca mv s1,s2 + ret = 'a'; + 42c: 06100a93 li s5,97 + if(eq) + 430: f40b1ee3 bnez s6,38c + 434: bfb5 j 3b0 + ret = 'a'; + 436: 06100a93 li s5,97 + 43a: b7b9 j 388 + 43c: 06100a93 li s5,97 + 440: b7a1 j 388 + 442: 06100a93 li s5,97 + if(eq) + 446: f40b13e3 bnez s6,38c + 44a: b79d j 3b0 + +000000000000044c : + +int +peek(char **ps, char *es, char *toks) +{ + 44c: 7139 addi sp,sp,-64 + 44e: fc06 sd ra,56(sp) + 450: f822 sd s0,48(sp) + 452: f426 sd s1,40(sp) + 454: f04a sd s2,32(sp) + 456: ec4e sd s3,24(sp) + 458: e852 sd s4,16(sp) + 45a: e456 sd s5,8(sp) + 45c: 0080 addi s0,sp,64 + 45e: 8a2a mv s4,a0 + 460: 892e mv s2,a1 + 462: 8ab2 mv s5,a2 + char *s; + + s = *ps; + 464: 6104 ld s1,0(a0) + while(s < es && strchr(whitespace, *s)) + 466: 00002997 auipc s3,0x2 + 46a: ba298993 addi s3,s3,-1118 # 2008 + 46e: 00b4fc63 bgeu s1,a1,486 + 472: 0004c583 lbu a1,0(s1) + 476: 854e mv a0,s3 + 478: 5c6000ef jal a3e + 47c: c509 beqz a0,486 + s++; + 47e: 0485 addi s1,s1,1 + while(s < es && strchr(whitespace, *s)) + 480: fe9919e3 bne s2,s1,472 + 484: 84ca mv s1,s2 + *ps = s; + 486: 009a3023 sd s1,0(s4) + return *s && strchr(toks, *s); + 48a: 0004c583 lbu a1,0(s1) + 48e: 4501 li a0,0 + 490: e991 bnez a1,4a4 +} + 492: 70e2 ld ra,56(sp) + 494: 7442 ld s0,48(sp) + 496: 74a2 ld s1,40(sp) + 498: 7902 ld s2,32(sp) + 49a: 69e2 ld s3,24(sp) + 49c: 6a42 ld s4,16(sp) + 49e: 6aa2 ld s5,8(sp) + 4a0: 6121 addi sp,sp,64 + 4a2: 8082 ret + return *s && strchr(toks, *s); + 4a4: 8556 mv a0,s5 + 4a6: 598000ef jal a3e + 4aa: 00a03533 snez a0,a0 + 4ae: b7d5 j 492 + +00000000000004b0 : + return cmd; +} + +struct cmd* +parseredirs(struct cmd *cmd, char **ps, char *es) +{ + 4b0: 711d addi sp,sp,-96 + 4b2: ec86 sd ra,88(sp) + 4b4: e8a2 sd s0,80(sp) + 4b6: e4a6 sd s1,72(sp) + 4b8: e0ca sd s2,64(sp) + 4ba: fc4e sd s3,56(sp) + 4bc: f852 sd s4,48(sp) + 4be: f456 sd s5,40(sp) + 4c0: f05a sd s6,32(sp) + 4c2: ec5e sd s7,24(sp) + 4c4: 1080 addi s0,sp,96 + 4c6: 8a2a mv s4,a0 + 4c8: 89ae mv s3,a1 + 4ca: 8932 mv s2,a2 + int tok; + char *q, *eq; + + while(peek(ps, es, "<>")){ + 4cc: 00001a97 auipc s5,0x1 + 4d0: db4a8a93 addi s5,s5,-588 # 1280 + tok = gettoken(ps, es, 0, 0); + if(gettoken(ps, es, &q, &eq) != 'a') + 4d4: 06100b13 li s6,97 + panic("missing file for redirection"); + switch(tok){ + 4d8: 03c00b93 li s7,60 + while(peek(ps, es, "<>")){ + 4dc: a00d j 4fe + panic("missing file for redirection"); + 4de: 00001517 auipc a0,0x1 + 4e2: d8250513 addi a0,a0,-638 # 1260 + 4e6: b65ff0ef jal 4a + case '<': + cmd = redircmd(cmd, q, eq, O_RDONLY, 0); + 4ea: 4701 li a4,0 + 4ec: 4681 li a3,0 + 4ee: fa043603 ld a2,-96(s0) + 4f2: fa843583 ld a1,-88(s0) + 4f6: 8552 mv a0,s4 + 4f8: d09ff0ef jal 200 + 4fc: 8a2a mv s4,a0 + while(peek(ps, es, "<>")){ + 4fe: 8656 mv a2,s5 + 500: 85ca mv a1,s2 + 502: 854e mv a0,s3 + 504: f49ff0ef jal 44c + 508: c525 beqz a0,570 + tok = gettoken(ps, es, 0, 0); + 50a: 4681 li a3,0 + 50c: 4601 li a2,0 + 50e: 85ca mv a1,s2 + 510: 854e mv a0,s3 + 512: dffff0ef jal 310 + 516: 84aa mv s1,a0 + if(gettoken(ps, es, &q, &eq) != 'a') + 518: fa040693 addi a3,s0,-96 + 51c: fa840613 addi a2,s0,-88 + 520: 85ca mv a1,s2 + 522: 854e mv a0,s3 + 524: dedff0ef jal 310 + 528: fb651be3 bne a0,s6,4de + switch(tok){ + 52c: fb748fe3 beq s1,s7,4ea + 530: 03e00793 li a5,62 + 534: 02f48263 beq s1,a5,558 + 538: 02b00793 li a5,43 + 53c: fcf491e3 bne s1,a5,4fe + 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, 1); + 540: 4705 li a4,1 + 542: 20100693 li a3,513 + 546: fa043603 ld a2,-96(s0) + 54a: fa843583 ld a1,-88(s0) + 54e: 8552 mv a0,s4 + 550: cb1ff0ef jal 200 + 554: 8a2a mv s4,a0 + break; + 556: b765 j 4fe + cmd = redircmd(cmd, q, eq, O_WRONLY|O_CREATE|O_TRUNC, 1); + 558: 4705 li a4,1 + 55a: 60100693 li a3,1537 + 55e: fa043603 ld a2,-96(s0) + 562: fa843583 ld a1,-88(s0) + 566: 8552 mv a0,s4 + 568: c99ff0ef jal 200 + 56c: 8a2a mv s4,a0 + break; + 56e: bf41 j 4fe + } + } + return cmd; +} + 570: 8552 mv a0,s4 + 572: 60e6 ld ra,88(sp) + 574: 6446 ld s0,80(sp) + 576: 64a6 ld s1,72(sp) + 578: 6906 ld s2,64(sp) + 57a: 79e2 ld s3,56(sp) + 57c: 7a42 ld s4,48(sp) + 57e: 7aa2 ld s5,40(sp) + 580: 7b02 ld s6,32(sp) + 582: 6be2 ld s7,24(sp) + 584: 6125 addi sp,sp,96 + 586: 8082 ret + +0000000000000588 : + return cmd; +} + +struct cmd* +parseexec(char **ps, char *es) +{ + 588: 7159 addi sp,sp,-112 + 58a: f486 sd ra,104(sp) + 58c: f0a2 sd s0,96(sp) + 58e: eca6 sd s1,88(sp) + 590: e0d2 sd s4,64(sp) + 592: fc56 sd s5,56(sp) + 594: 1880 addi s0,sp,112 + 596: 8a2a mv s4,a0 + 598: 8aae mv s5,a1 + char *q, *eq; + int tok, argc; + struct execcmd *cmd; + struct cmd *ret; + + if(peek(ps, es, "(")) + 59a: 00001617 auipc a2,0x1 + 59e: cee60613 addi a2,a2,-786 # 1288 + 5a2: eabff0ef jal 44c + 5a6: e915 bnez a0,5da + 5a8: e8ca sd s2,80(sp) + 5aa: e4ce sd s3,72(sp) + 5ac: f85a sd s6,48(sp) + 5ae: f45e sd s7,40(sp) + 5b0: f062 sd s8,32(sp) + 5b2: ec66 sd s9,24(sp) + 5b4: 89aa mv s3,a0 + return parseblock(ps, es); + + ret = execcmd(); + 5b6: c1dff0ef jal 1d2 + 5ba: 8c2a mv s8,a0 + cmd = (struct execcmd*)ret; + + argc = 0; + ret = parseredirs(ret, ps, es); + 5bc: 8656 mv a2,s5 + 5be: 85d2 mv a1,s4 + 5c0: ef1ff0ef jal 4b0 + 5c4: 84aa mv s1,a0 + while(!peek(ps, es, "|)&;")){ + 5c6: 008c0913 addi s2,s8,8 + 5ca: 00001b17 auipc s6,0x1 + 5ce: cdeb0b13 addi s6,s6,-802 # 12a8 + if((tok=gettoken(ps, es, &q, &eq)) == 0) + break; + if(tok != 'a') + 5d2: 06100c93 li s9,97 + panic("syntax"); + cmd->argv[argc] = q; + cmd->eargv[argc] = eq; + argc++; + if(argc >= MAXARGS) + 5d6: 4ba9 li s7,10 + while(!peek(ps, es, "|)&;")){ + 5d8: a815 j 60c + return parseblock(ps, es); + 5da: 85d6 mv a1,s5 + 5dc: 8552 mv a0,s4 + 5de: 170000ef jal 74e + 5e2: 84aa mv s1,a0 + ret = parseredirs(ret, ps, es); + } + cmd->argv[argc] = 0; + cmd->eargv[argc] = 0; + return ret; +} + 5e4: 8526 mv a0,s1 + 5e6: 70a6 ld ra,104(sp) + 5e8: 7406 ld s0,96(sp) + 5ea: 64e6 ld s1,88(sp) + 5ec: 6a06 ld s4,64(sp) + 5ee: 7ae2 ld s5,56(sp) + 5f0: 6165 addi sp,sp,112 + 5f2: 8082 ret + panic("syntax"); + 5f4: 00001517 auipc a0,0x1 + 5f8: c9c50513 addi a0,a0,-868 # 1290 + 5fc: a4fff0ef jal 4a + ret = parseredirs(ret, ps, es); + 600: 8656 mv a2,s5 + 602: 85d2 mv a1,s4 + 604: 8526 mv a0,s1 + 606: eabff0ef jal 4b0 + 60a: 84aa mv s1,a0 + while(!peek(ps, es, "|)&;")){ + 60c: 865a mv a2,s6 + 60e: 85d6 mv a1,s5 + 610: 8552 mv a0,s4 + 612: e3bff0ef jal 44c + 616: ed15 bnez a0,652 + if((tok=gettoken(ps, es, &q, &eq)) == 0) + 618: f9040693 addi a3,s0,-112 + 61c: f9840613 addi a2,s0,-104 + 620: 85d6 mv a1,s5 + 622: 8552 mv a0,s4 + 624: cedff0ef jal 310 + 628: c50d beqz a0,652 + if(tok != 'a') + 62a: fd9515e3 bne a0,s9,5f4 + cmd->argv[argc] = q; + 62e: f9843783 ld a5,-104(s0) + 632: 00f93023 sd a5,0(s2) + cmd->eargv[argc] = eq; + 636: f9043783 ld a5,-112(s0) + 63a: 04f93823 sd a5,80(s2) + argc++; + 63e: 2985 addiw s3,s3,1 + if(argc >= MAXARGS) + 640: 0921 addi s2,s2,8 + 642: fb799fe3 bne s3,s7,600 + panic("too many args"); + 646: 00001517 auipc a0,0x1 + 64a: c5250513 addi a0,a0,-942 # 1298 + 64e: 9fdff0ef jal 4a + cmd->argv[argc] = 0; + 652: 098e slli s3,s3,0x3 + 654: 9c4e add s8,s8,s3 + 656: 000c3423 sd zero,8(s8) + cmd->eargv[argc] = 0; + 65a: 040c3c23 sd zero,88(s8) + 65e: 6946 ld s2,80(sp) + 660: 69a6 ld s3,72(sp) + 662: 7b42 ld s6,48(sp) + 664: 7ba2 ld s7,40(sp) + 666: 7c02 ld s8,32(sp) + 668: 6ce2 ld s9,24(sp) + return ret; + 66a: bfad j 5e4 + +000000000000066c : +{ + 66c: 7179 addi sp,sp,-48 + 66e: f406 sd ra,40(sp) + 670: f022 sd s0,32(sp) + 672: ec26 sd s1,24(sp) + 674: e84a sd s2,16(sp) + 676: e44e sd s3,8(sp) + 678: 1800 addi s0,sp,48 + 67a: 892a mv s2,a0 + 67c: 89ae mv s3,a1 + cmd = parseexec(ps, es); + 67e: f0bff0ef jal 588 + 682: 84aa mv s1,a0 + if(peek(ps, es, "|")){ + 684: 00001617 auipc a2,0x1 + 688: c2c60613 addi a2,a2,-980 # 12b0 + 68c: 85ce mv a1,s3 + 68e: 854a mv a0,s2 + 690: dbdff0ef jal 44c + 694: e909 bnez a0,6a6 +} + 696: 8526 mv a0,s1 + 698: 70a2 ld ra,40(sp) + 69a: 7402 ld s0,32(sp) + 69c: 64e2 ld s1,24(sp) + 69e: 6942 ld s2,16(sp) + 6a0: 69a2 ld s3,8(sp) + 6a2: 6145 addi sp,sp,48 + 6a4: 8082 ret + gettoken(ps, es, 0, 0); + 6a6: 4681 li a3,0 + 6a8: 4601 li a2,0 + 6aa: 85ce mv a1,s3 + 6ac: 854a mv a0,s2 + 6ae: c63ff0ef jal 310 + cmd = pipecmd(cmd, parsepipe(ps, es)); + 6b2: 85ce mv a1,s3 + 6b4: 854a mv a0,s2 + 6b6: fb7ff0ef jal 66c + 6ba: 85aa mv a1,a0 + 6bc: 8526 mv a0,s1 + 6be: ba3ff0ef jal 260 + 6c2: 84aa mv s1,a0 + return cmd; + 6c4: bfc9 j 696 + +00000000000006c6 : +{ + 6c6: 7179 addi sp,sp,-48 + 6c8: f406 sd ra,40(sp) + 6ca: f022 sd s0,32(sp) + 6cc: ec26 sd s1,24(sp) + 6ce: e84a sd s2,16(sp) + 6d0: e44e sd s3,8(sp) + 6d2: e052 sd s4,0(sp) + 6d4: 1800 addi s0,sp,48 + 6d6: 892a mv s2,a0 + 6d8: 89ae mv s3,a1 + cmd = parsepipe(ps, es); + 6da: f93ff0ef jal 66c + 6de: 84aa mv s1,a0 + while(peek(ps, es, "&")){ + 6e0: 00001a17 auipc s4,0x1 + 6e4: bd8a0a13 addi s4,s4,-1064 # 12b8 + 6e8: a819 j 6fe + gettoken(ps, es, 0, 0); + 6ea: 4681 li a3,0 + 6ec: 4601 li a2,0 + 6ee: 85ce mv a1,s3 + 6f0: 854a mv a0,s2 + 6f2: c1fff0ef jal 310 + cmd = backcmd(cmd); + 6f6: 8526 mv a0,s1 + 6f8: be5ff0ef jal 2dc + 6fc: 84aa mv s1,a0 + while(peek(ps, es, "&")){ + 6fe: 8652 mv a2,s4 + 700: 85ce mv a1,s3 + 702: 854a mv a0,s2 + 704: d49ff0ef jal 44c + 708: f16d bnez a0,6ea + if(peek(ps, es, ";")){ + 70a: 00001617 auipc a2,0x1 + 70e: bb660613 addi a2,a2,-1098 # 12c0 + 712: 85ce mv a1,s3 + 714: 854a mv a0,s2 + 716: d37ff0ef jal 44c + 71a: e911 bnez a0,72e +} + 71c: 8526 mv a0,s1 + 71e: 70a2 ld ra,40(sp) + 720: 7402 ld s0,32(sp) + 722: 64e2 ld s1,24(sp) + 724: 6942 ld s2,16(sp) + 726: 69a2 ld s3,8(sp) + 728: 6a02 ld s4,0(sp) + 72a: 6145 addi sp,sp,48 + 72c: 8082 ret + gettoken(ps, es, 0, 0); + 72e: 4681 li a3,0 + 730: 4601 li a2,0 + 732: 85ce mv a1,s3 + 734: 854a mv a0,s2 + 736: bdbff0ef jal 310 + cmd = listcmd(cmd, parseline(ps, es)); + 73a: 85ce mv a1,s3 + 73c: 854a mv a0,s2 + 73e: f89ff0ef jal 6c6 + 742: 85aa mv a1,a0 + 744: 8526 mv a0,s1 + 746: b59ff0ef jal 29e + 74a: 84aa mv s1,a0 + return cmd; + 74c: bfc1 j 71c + +000000000000074e : +{ + 74e: 7179 addi sp,sp,-48 + 750: f406 sd ra,40(sp) + 752: f022 sd s0,32(sp) + 754: ec26 sd s1,24(sp) + 756: e84a sd s2,16(sp) + 758: e44e sd s3,8(sp) + 75a: 1800 addi s0,sp,48 + 75c: 84aa mv s1,a0 + 75e: 892e mv s2,a1 + if(!peek(ps, es, "(")) + 760: 00001617 auipc a2,0x1 + 764: b2860613 addi a2,a2,-1240 # 1288 + 768: ce5ff0ef jal 44c + 76c: c539 beqz a0,7ba + gettoken(ps, es, 0, 0); + 76e: 4681 li a3,0 + 770: 4601 li a2,0 + 772: 85ca mv a1,s2 + 774: 8526 mv a0,s1 + 776: b9bff0ef jal 310 + cmd = parseline(ps, es); + 77a: 85ca mv a1,s2 + 77c: 8526 mv a0,s1 + 77e: f49ff0ef jal 6c6 + 782: 89aa mv s3,a0 + if(!peek(ps, es, ")")) + 784: 00001617 auipc a2,0x1 + 788: b5460613 addi a2,a2,-1196 # 12d8 + 78c: 85ca mv a1,s2 + 78e: 8526 mv a0,s1 + 790: cbdff0ef jal 44c + 794: c90d beqz a0,7c6 + gettoken(ps, es, 0, 0); + 796: 4681 li a3,0 + 798: 4601 li a2,0 + 79a: 85ca mv a1,s2 + 79c: 8526 mv a0,s1 + 79e: b73ff0ef jal 310 + cmd = parseredirs(cmd, ps, es); + 7a2: 864a mv a2,s2 + 7a4: 85a6 mv a1,s1 + 7a6: 854e mv a0,s3 + 7a8: d09ff0ef jal 4b0 +} + 7ac: 70a2 ld ra,40(sp) + 7ae: 7402 ld s0,32(sp) + 7b0: 64e2 ld s1,24(sp) + 7b2: 6942 ld s2,16(sp) + 7b4: 69a2 ld s3,8(sp) + 7b6: 6145 addi sp,sp,48 + 7b8: 8082 ret + panic("parseblock"); + 7ba: 00001517 auipc a0,0x1 + 7be: b0e50513 addi a0,a0,-1266 # 12c8 + 7c2: 889ff0ef jal 4a + panic("syntax - missing )"); + 7c6: 00001517 auipc a0,0x1 + 7ca: b1a50513 addi a0,a0,-1254 # 12e0 + 7ce: 87dff0ef jal 4a + +00000000000007d2 : + +// NUL-terminate all the counted strings. +struct cmd* +nulterminate(struct cmd *cmd) +{ + 7d2: 1101 addi sp,sp,-32 + 7d4: ec06 sd ra,24(sp) + 7d6: e822 sd s0,16(sp) + 7d8: e426 sd s1,8(sp) + 7da: 1000 addi s0,sp,32 + 7dc: 84aa mv s1,a0 + struct execcmd *ecmd; + struct listcmd *lcmd; + struct pipecmd *pcmd; + struct redircmd *rcmd; + + if(cmd == 0) + 7de: c131 beqz a0,822 + return 0; + + switch(cmd->type){ + 7e0: 4118 lw a4,0(a0) + 7e2: 4795 li a5,5 + 7e4: 02e7ef63 bltu a5,a4,822 + 7e8: 00056783 lwu a5,0(a0) + 7ec: 078a slli a5,a5,0x2 + 7ee: 00001717 auipc a4,0x1 + 7f2: b5270713 addi a4,a4,-1198 # 1340 + 7f6: 97ba add a5,a5,a4 + 7f8: 439c lw a5,0(a5) + 7fa: 97ba add a5,a5,a4 + 7fc: 8782 jr a5 + case EXEC: + ecmd = (struct execcmd*)cmd; + for(i=0; ecmd->argv[i]; i++) + 7fe: 651c ld a5,8(a0) + 800: c38d beqz a5,822 + 802: 01050793 addi a5,a0,16 + *ecmd->eargv[i] = 0; + 806: 67b8 ld a4,72(a5) + 808: 00070023 sb zero,0(a4) + for(i=0; ecmd->argv[i]; i++) + 80c: 07a1 addi a5,a5,8 + 80e: ff87b703 ld a4,-8(a5) + 812: fb75 bnez a4,806 + 814: a039 j 822 + break; + + case REDIR: + rcmd = (struct redircmd*)cmd; + nulterminate(rcmd->cmd); + 816: 6508 ld a0,8(a0) + 818: fbbff0ef jal 7d2 + *rcmd->efile = 0; + 81c: 6c9c ld a5,24(s1) + 81e: 00078023 sb zero,0(a5) + bcmd = (struct backcmd*)cmd; + nulterminate(bcmd->cmd); + break; + } + return cmd; +} + 822: 8526 mv a0,s1 + 824: 60e2 ld ra,24(sp) + 826: 6442 ld s0,16(sp) + 828: 64a2 ld s1,8(sp) + 82a: 6105 addi sp,sp,32 + 82c: 8082 ret + nulterminate(pcmd->left); + 82e: 6508 ld a0,8(a0) + 830: fa3ff0ef jal 7d2 + nulterminate(pcmd->right); + 834: 6888 ld a0,16(s1) + 836: f9dff0ef jal 7d2 + break; + 83a: b7e5 j 822 + nulterminate(lcmd->left); + 83c: 6508 ld a0,8(a0) + 83e: f95ff0ef jal 7d2 + nulterminate(lcmd->right); + 842: 6888 ld a0,16(s1) + 844: f8fff0ef jal 7d2 + break; + 848: bfe9 j 822 + nulterminate(bcmd->cmd); + 84a: 6508 ld a0,8(a0) + 84c: f87ff0ef jal 7d2 + break; + 850: bfc9 j 822 + +0000000000000852 : +{ + 852: 7179 addi sp,sp,-48 + 854: f406 sd ra,40(sp) + 856: f022 sd s0,32(sp) + 858: ec26 sd s1,24(sp) + 85a: e84a sd s2,16(sp) + 85c: 1800 addi s0,sp,48 + 85e: fca43c23 sd a0,-40(s0) + es = s + strlen(s); + 862: 84aa mv s1,a0 + 864: 18e000ef jal 9f2 + 868: 1502 slli a0,a0,0x20 + 86a: 9101 srli a0,a0,0x20 + 86c: 94aa add s1,s1,a0 + cmd = parseline(&s, es); + 86e: 85a6 mv a1,s1 + 870: fd840513 addi a0,s0,-40 + 874: e53ff0ef jal 6c6 + 878: 892a mv s2,a0 + peek(&s, es, ""); + 87a: 00001617 auipc a2,0x1 + 87e: 99e60613 addi a2,a2,-1634 # 1218 + 882: 85a6 mv a1,s1 + 884: fd840513 addi a0,s0,-40 + 888: bc5ff0ef jal 44c + if(s != es){ + 88c: fd843603 ld a2,-40(s0) + 890: 00961c63 bne a2,s1,8a8 + nulterminate(cmd); + 894: 854a mv a0,s2 + 896: f3dff0ef jal 7d2 +} + 89a: 854a mv a0,s2 + 89c: 70a2 ld ra,40(sp) + 89e: 7402 ld s0,32(sp) + 8a0: 64e2 ld s1,24(sp) + 8a2: 6942 ld s2,16(sp) + 8a4: 6145 addi sp,sp,48 + 8a6: 8082 ret + fprintf(2, "leftovers: %s\n", s); + 8a8: 00001597 auipc a1,0x1 + 8ac: a5058593 addi a1,a1,-1456 # 12f8 + 8b0: 4509 li a0,2 + 8b2: 77a000ef jal 102c + panic("syntax"); + 8b6: 00001517 auipc a0,0x1 + 8ba: 9da50513 addi a0,a0,-1574 # 1290 + 8be: f8cff0ef jal 4a + +00000000000008c2
: +{ + 8c2: 7139 addi sp,sp,-64 + 8c4: fc06 sd ra,56(sp) + 8c6: f822 sd s0,48(sp) + 8c8: f426 sd s1,40(sp) + 8ca: f04a sd s2,32(sp) + 8cc: ec4e sd s3,24(sp) + 8ce: e852 sd s4,16(sp) + 8d0: e456 sd s5,8(sp) + 8d2: e05a sd s6,0(sp) + 8d4: 0080 addi s0,sp,64 + while((fd = open("console", O_RDWR)) >= 0){ + 8d6: 00001497 auipc s1,0x1 + 8da: a3248493 addi s1,s1,-1486 # 1308 + 8de: 4589 li a1,2 + 8e0: 8526 mv a0,s1 + 8e2: 38c000ef jal c6e + 8e6: 00054763 bltz a0,8f4 + if(fd >= 3){ + 8ea: 4789 li a5,2 + 8ec: fea7d9e3 bge a5,a0,8de + close(fd); + 8f0: 366000ef jal c56 + while(getcmd(buf, sizeof(buf)) >= 0){ + 8f4: 00001a17 auipc s4,0x1 + 8f8: 72ca0a13 addi s4,s4,1836 # 2020 + while (*cmd == ' ' || *cmd == '\t') + 8fc: 02000913 li s2,32 + 900: 49a5 li s3,9 + if (*cmd == '\n') // is a blank command + 902: 4aa9 li s5,10 + if(cmd[0] == 'c' && cmd[1] == 'd' && cmd[2] == ' '){ + 904: 06300b13 li s6,99 + 908: a805 j 938 + cmd++; + 90a: 0485 addi s1,s1,1 + while (*cmd == ' ' || *cmd == '\t') + 90c: 0004c783 lbu a5,0(s1) + 910: ff278de3 beq a5,s2,90a + 914: ff378be3 beq a5,s3,90a + if (*cmd == '\n') // is a blank command + 918: 03578063 beq a5,s5,938 + if(cmd[0] == 'c' && cmd[1] == 'd' && cmd[2] == ' '){ + 91c: 01679863 bne a5,s6,92c + 920: 0014c703 lbu a4,1(s1) + 924: 06400793 li a5,100 + 928: 02f70463 beq a4,a5,950 + if(fork1() == 0) + 92c: f3cff0ef jal 68 + 930: cd29 beqz a0,98a + wait(0); + 932: 4501 li a0,0 + 934: 302000ef jal c36 + while(getcmd(buf, sizeof(buf)) >= 0){ + 938: 06400593 li a1,100 + 93c: 8552 mv a0,s4 + 93e: ec2ff0ef jal 0 + 942: 04054963 bltz a0,994 + char *cmd = buf; + 946: 00001497 auipc s1,0x1 + 94a: 6da48493 addi s1,s1,1754 # 2020 + 94e: bf7d j 90c + if(cmd[0] == 'c' && cmd[1] == 'd' && cmd[2] == ' '){ + 950: 0024c783 lbu a5,2(s1) + 954: fd279ce3 bne a5,s2,92c + cmd[strlen(cmd)-1] = 0; // chop \n + 958: 8526 mv a0,s1 + 95a: 098000ef jal 9f2 + 95e: fff5079b addiw a5,a0,-1 + 962: 1782 slli a5,a5,0x20 + 964: 9381 srli a5,a5,0x20 + 966: 97a6 add a5,a5,s1 + 968: 00078023 sb zero,0(a5) + if(chdir(cmd+3) < 0) + 96c: 048d addi s1,s1,3 + 96e: 8526 mv a0,s1 + 970: 32e000ef jal c9e + 974: fc0552e3 bgez a0,938 + fprintf(2, "cannot cd %s\n", cmd+3); + 978: 8626 mv a2,s1 + 97a: 00001597 auipc a1,0x1 + 97e: 99658593 addi a1,a1,-1642 # 1310 + 982: 4509 li a0,2 + 984: 6a8000ef jal 102c + 988: bf45 j 938 + runcmd(parsecmd(cmd)); + 98a: 8526 mv a0,s1 + 98c: ec7ff0ef jal 852 + 990: efeff0ef jal 8e + exit(0); + 994: 4501 li a0,0 + 996: 298000ef jal c2e + +000000000000099a : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 99a: 1141 addi sp,sp,-16 + 99c: e406 sd ra,8(sp) + 99e: e022 sd s0,0(sp) + 9a0: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 9a2: f21ff0ef jal 8c2
+ exit(r); + 9a6: 288000ef jal c2e + +00000000000009aa : +} + +char* +strcpy(char *s, const char *t) +{ + 9aa: 1141 addi sp,sp,-16 + 9ac: e422 sd s0,8(sp) + 9ae: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 9b0: 87aa mv a5,a0 + 9b2: 0585 addi a1,a1,1 + 9b4: 0785 addi a5,a5,1 + 9b6: fff5c703 lbu a4,-1(a1) + 9ba: fee78fa3 sb a4,-1(a5) + 9be: fb75 bnez a4,9b2 + ; + return os; +} + 9c0: 6422 ld s0,8(sp) + 9c2: 0141 addi sp,sp,16 + 9c4: 8082 ret + +00000000000009c6 : + +int +strcmp(const char *p, const char *q) +{ + 9c6: 1141 addi sp,sp,-16 + 9c8: e422 sd s0,8(sp) + 9ca: 0800 addi s0,sp,16 + while(*p && *p == *q) + 9cc: 00054783 lbu a5,0(a0) + 9d0: cb91 beqz a5,9e4 + 9d2: 0005c703 lbu a4,0(a1) + 9d6: 00f71763 bne a4,a5,9e4 + p++, q++; + 9da: 0505 addi a0,a0,1 + 9dc: 0585 addi a1,a1,1 + while(*p && *p == *q) + 9de: 00054783 lbu a5,0(a0) + 9e2: fbe5 bnez a5,9d2 + return (uchar)*p - (uchar)*q; + 9e4: 0005c503 lbu a0,0(a1) +} + 9e8: 40a7853b subw a0,a5,a0 + 9ec: 6422 ld s0,8(sp) + 9ee: 0141 addi sp,sp,16 + 9f0: 8082 ret + +00000000000009f2 : + +uint +strlen(const char *s) +{ + 9f2: 1141 addi sp,sp,-16 + 9f4: e422 sd s0,8(sp) + 9f6: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 9f8: 00054783 lbu a5,0(a0) + 9fc: cf91 beqz a5,a18 + 9fe: 0505 addi a0,a0,1 + a00: 87aa mv a5,a0 + a02: 86be mv a3,a5 + a04: 0785 addi a5,a5,1 + a06: fff7c703 lbu a4,-1(a5) + a0a: ff65 bnez a4,a02 + a0c: 40a6853b subw a0,a3,a0 + a10: 2505 addiw a0,a0,1 + ; + return n; +} + a12: 6422 ld s0,8(sp) + a14: 0141 addi sp,sp,16 + a16: 8082 ret + for(n = 0; s[n]; n++) + a18: 4501 li a0,0 + a1a: bfe5 j a12 + +0000000000000a1c : + +void* +memset(void *dst, int c, uint n) +{ + a1c: 1141 addi sp,sp,-16 + a1e: e422 sd s0,8(sp) + a20: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + a22: ca19 beqz a2,a38 + a24: 87aa mv a5,a0 + a26: 1602 slli a2,a2,0x20 + a28: 9201 srli a2,a2,0x20 + a2a: 00a60733 add a4,a2,a0 + cdst[i] = c; + a2e: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + a32: 0785 addi a5,a5,1 + a34: fee79de3 bne a5,a4,a2e + } + return dst; +} + a38: 6422 ld s0,8(sp) + a3a: 0141 addi sp,sp,16 + a3c: 8082 ret + +0000000000000a3e : + +char* +strchr(const char *s, char c) +{ + a3e: 1141 addi sp,sp,-16 + a40: e422 sd s0,8(sp) + a42: 0800 addi s0,sp,16 + for(; *s; s++) + a44: 00054783 lbu a5,0(a0) + a48: cb99 beqz a5,a5e + if(*s == c) + a4a: 00f58763 beq a1,a5,a58 + for(; *s; s++) + a4e: 0505 addi a0,a0,1 + a50: 00054783 lbu a5,0(a0) + a54: fbfd bnez a5,a4a + return (char*)s; + return 0; + a56: 4501 li a0,0 +} + a58: 6422 ld s0,8(sp) + a5a: 0141 addi sp,sp,16 + a5c: 8082 ret + return 0; + a5e: 4501 li a0,0 + a60: bfe5 j a58 + +0000000000000a62 : + +char* +gets(char *buf, int max) +{ + a62: 711d addi sp,sp,-96 + a64: ec86 sd ra,88(sp) + a66: e8a2 sd s0,80(sp) + a68: e4a6 sd s1,72(sp) + a6a: e0ca sd s2,64(sp) + a6c: fc4e sd s3,56(sp) + a6e: f852 sd s4,48(sp) + a70: f456 sd s5,40(sp) + a72: f05a sd s6,32(sp) + a74: ec5e sd s7,24(sp) + a76: 1080 addi s0,sp,96 + a78: 8baa mv s7,a0 + a7a: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + a7c: 892a mv s2,a0 + a7e: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + a80: 4aa9 li s5,10 + a82: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + a84: 89a6 mv s3,s1 + a86: 2485 addiw s1,s1,1 + a88: 0344d663 bge s1,s4,ab4 + cc = read(0, &c, 1); + a8c: 4605 li a2,1 + a8e: faf40593 addi a1,s0,-81 + a92: 4501 li a0,0 + a94: 1b2000ef jal c46 + if(cc < 1) + a98: 00a05e63 blez a0,ab4 + buf[i++] = c; + a9c: faf44783 lbu a5,-81(s0) + aa0: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + aa4: 01578763 beq a5,s5,ab2 + aa8: 0905 addi s2,s2,1 + aaa: fd679de3 bne a5,s6,a84 + buf[i++] = c; + aae: 89a6 mv s3,s1 + ab0: a011 j ab4 + ab2: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + ab4: 99de add s3,s3,s7 + ab6: 00098023 sb zero,0(s3) + return buf; +} + aba: 855e mv a0,s7 + abc: 60e6 ld ra,88(sp) + abe: 6446 ld s0,80(sp) + ac0: 64a6 ld s1,72(sp) + ac2: 6906 ld s2,64(sp) + ac4: 79e2 ld s3,56(sp) + ac6: 7a42 ld s4,48(sp) + ac8: 7aa2 ld s5,40(sp) + aca: 7b02 ld s6,32(sp) + acc: 6be2 ld s7,24(sp) + ace: 6125 addi sp,sp,96 + ad0: 8082 ret + +0000000000000ad2 : + +int +stat(const char *n, struct stat *st) +{ + ad2: 1101 addi sp,sp,-32 + ad4: ec06 sd ra,24(sp) + ad6: e822 sd s0,16(sp) + ad8: e04a sd s2,0(sp) + ada: 1000 addi s0,sp,32 + adc: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + ade: 4581 li a1,0 + ae0: 18e000ef jal c6e + if(fd < 0) + ae4: 02054263 bltz a0,b08 + ae8: e426 sd s1,8(sp) + aea: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + aec: 85ca mv a1,s2 + aee: 198000ef jal c86 + af2: 892a mv s2,a0 + close(fd); + af4: 8526 mv a0,s1 + af6: 160000ef jal c56 + return r; + afa: 64a2 ld s1,8(sp) +} + afc: 854a mv a0,s2 + afe: 60e2 ld ra,24(sp) + b00: 6442 ld s0,16(sp) + b02: 6902 ld s2,0(sp) + b04: 6105 addi sp,sp,32 + b06: 8082 ret + return -1; + b08: 597d li s2,-1 + b0a: bfcd j afc + +0000000000000b0c : + +int +atoi(const char *s) +{ + b0c: 1141 addi sp,sp,-16 + b0e: e422 sd s0,8(sp) + b10: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + b12: 00054683 lbu a3,0(a0) + b16: fd06879b addiw a5,a3,-48 + b1a: 0ff7f793 zext.b a5,a5 + b1e: 4625 li a2,9 + b20: 02f66863 bltu a2,a5,b50 + b24: 872a mv a4,a0 + n = 0; + b26: 4501 li a0,0 + n = n*10 + *s++ - '0'; + b28: 0705 addi a4,a4,1 + b2a: 0025179b slliw a5,a0,0x2 + b2e: 9fa9 addw a5,a5,a0 + b30: 0017979b slliw a5,a5,0x1 + b34: 9fb5 addw a5,a5,a3 + b36: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + b3a: 00074683 lbu a3,0(a4) + b3e: fd06879b addiw a5,a3,-48 + b42: 0ff7f793 zext.b a5,a5 + b46: fef671e3 bgeu a2,a5,b28 + return n; +} + b4a: 6422 ld s0,8(sp) + b4c: 0141 addi sp,sp,16 + b4e: 8082 ret + n = 0; + b50: 4501 li a0,0 + b52: bfe5 j b4a + +0000000000000b54 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + b54: 1141 addi sp,sp,-16 + b56: e422 sd s0,8(sp) + b58: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + b5a: 02b57463 bgeu a0,a1,b82 + while(n-- > 0) + b5e: 00c05f63 blez a2,b7c + b62: 1602 slli a2,a2,0x20 + b64: 9201 srli a2,a2,0x20 + b66: 00c507b3 add a5,a0,a2 + dst = vdst; + b6a: 872a mv a4,a0 + *dst++ = *src++; + b6c: 0585 addi a1,a1,1 + b6e: 0705 addi a4,a4,1 + b70: fff5c683 lbu a3,-1(a1) + b74: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + b78: fef71ae3 bne a4,a5,b6c + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + b7c: 6422 ld s0,8(sp) + b7e: 0141 addi sp,sp,16 + b80: 8082 ret + dst += n; + b82: 00c50733 add a4,a0,a2 + src += n; + b86: 95b2 add a1,a1,a2 + while(n-- > 0) + b88: fec05ae3 blez a2,b7c + b8c: fff6079b addiw a5,a2,-1 + b90: 1782 slli a5,a5,0x20 + b92: 9381 srli a5,a5,0x20 + b94: fff7c793 not a5,a5 + b98: 97ba add a5,a5,a4 + *--dst = *--src; + b9a: 15fd addi a1,a1,-1 + b9c: 177d addi a4,a4,-1 + b9e: 0005c683 lbu a3,0(a1) + ba2: 00d70023 sb a3,0(a4) + while(n-- > 0) + ba6: fee79ae3 bne a5,a4,b9a + baa: bfc9 j b7c + +0000000000000bac : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + bac: 1141 addi sp,sp,-16 + bae: e422 sd s0,8(sp) + bb0: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + bb2: ca05 beqz a2,be2 + bb4: fff6069b addiw a3,a2,-1 + bb8: 1682 slli a3,a3,0x20 + bba: 9281 srli a3,a3,0x20 + bbc: 0685 addi a3,a3,1 + bbe: 96aa add a3,a3,a0 + if (*p1 != *p2) { + bc0: 00054783 lbu a5,0(a0) + bc4: 0005c703 lbu a4,0(a1) + bc8: 00e79863 bne a5,a4,bd8 + return *p1 - *p2; + } + p1++; + bcc: 0505 addi a0,a0,1 + p2++; + bce: 0585 addi a1,a1,1 + while (n-- > 0) { + bd0: fed518e3 bne a0,a3,bc0 + } + return 0; + bd4: 4501 li a0,0 + bd6: a019 j bdc + return *p1 - *p2; + bd8: 40e7853b subw a0,a5,a4 +} + bdc: 6422 ld s0,8(sp) + bde: 0141 addi sp,sp,16 + be0: 8082 ret + return 0; + be2: 4501 li a0,0 + be4: bfe5 j bdc + +0000000000000be6 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + be6: 1141 addi sp,sp,-16 + be8: e406 sd ra,8(sp) + bea: e022 sd s0,0(sp) + bec: 0800 addi s0,sp,16 + return memmove(dst, src, n); + bee: f67ff0ef jal b54 +} + bf2: 60a2 ld ra,8(sp) + bf4: 6402 ld s0,0(sp) + bf6: 0141 addi sp,sp,16 + bf8: 8082 ret + +0000000000000bfa : + +char * +sbrk(int n) { + bfa: 1141 addi sp,sp,-16 + bfc: e406 sd ra,8(sp) + bfe: e022 sd s0,0(sp) + c00: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + c02: 4585 li a1,1 + c04: 0b2000ef jal cb6 +} + c08: 60a2 ld ra,8(sp) + c0a: 6402 ld s0,0(sp) + c0c: 0141 addi sp,sp,16 + c0e: 8082 ret + +0000000000000c10 : + +char * +sbrklazy(int n) { + c10: 1141 addi sp,sp,-16 + c12: e406 sd ra,8(sp) + c14: e022 sd s0,0(sp) + c16: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + c18: 4589 li a1,2 + c1a: 09c000ef jal cb6 +} + c1e: 60a2 ld ra,8(sp) + c20: 6402 ld s0,0(sp) + c22: 0141 addi sp,sp,16 + c24: 8082 ret + +0000000000000c26 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + c26: 4885 li a7,1 + ecall + c28: 00000073 ecall + ret + c2c: 8082 ret + +0000000000000c2e : +.global exit +exit: + li a7, SYS_exit + c2e: 4889 li a7,2 + ecall + c30: 00000073 ecall + ret + c34: 8082 ret + +0000000000000c36 : +.global wait +wait: + li a7, SYS_wait + c36: 488d li a7,3 + ecall + c38: 00000073 ecall + ret + c3c: 8082 ret + +0000000000000c3e : +.global pipe +pipe: + li a7, SYS_pipe + c3e: 4891 li a7,4 + ecall + c40: 00000073 ecall + ret + c44: 8082 ret + +0000000000000c46 : +.global read +read: + li a7, SYS_read + c46: 4895 li a7,5 + ecall + c48: 00000073 ecall + ret + c4c: 8082 ret + +0000000000000c4e : +.global write +write: + li a7, SYS_write + c4e: 48c1 li a7,16 + ecall + c50: 00000073 ecall + ret + c54: 8082 ret + +0000000000000c56 : +.global close +close: + li a7, SYS_close + c56: 48d5 li a7,21 + ecall + c58: 00000073 ecall + ret + c5c: 8082 ret + +0000000000000c5e : +.global kill +kill: + li a7, SYS_kill + c5e: 4899 li a7,6 + ecall + c60: 00000073 ecall + ret + c64: 8082 ret + +0000000000000c66 : +.global exec +exec: + li a7, SYS_exec + c66: 489d li a7,7 + ecall + c68: 00000073 ecall + ret + c6c: 8082 ret + +0000000000000c6e : +.global open +open: + li a7, SYS_open + c6e: 48bd li a7,15 + ecall + c70: 00000073 ecall + ret + c74: 8082 ret + +0000000000000c76 : +.global mknod +mknod: + li a7, SYS_mknod + c76: 48c5 li a7,17 + ecall + c78: 00000073 ecall + ret + c7c: 8082 ret + +0000000000000c7e : +.global unlink +unlink: + li a7, SYS_unlink + c7e: 48c9 li a7,18 + ecall + c80: 00000073 ecall + ret + c84: 8082 ret + +0000000000000c86 : +.global fstat +fstat: + li a7, SYS_fstat + c86: 48a1 li a7,8 + ecall + c88: 00000073 ecall + ret + c8c: 8082 ret + +0000000000000c8e : +.global link +link: + li a7, SYS_link + c8e: 48cd li a7,19 + ecall + c90: 00000073 ecall + ret + c94: 8082 ret + +0000000000000c96 : +.global mkdir +mkdir: + li a7, SYS_mkdir + c96: 48d1 li a7,20 + ecall + c98: 00000073 ecall + ret + c9c: 8082 ret + +0000000000000c9e : +.global chdir +chdir: + li a7, SYS_chdir + c9e: 48a5 li a7,9 + ecall + ca0: 00000073 ecall + ret + ca4: 8082 ret + +0000000000000ca6 : +.global dup +dup: + li a7, SYS_dup + ca6: 48a9 li a7,10 + ecall + ca8: 00000073 ecall + ret + cac: 8082 ret + +0000000000000cae : +.global getpid +getpid: + li a7, SYS_getpid + cae: 48ad li a7,11 + ecall + cb0: 00000073 ecall + ret + cb4: 8082 ret + +0000000000000cb6 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + cb6: 48b1 li a7,12 + ecall + cb8: 00000073 ecall + ret + cbc: 8082 ret + +0000000000000cbe : +.global pause +pause: + li a7, SYS_pause + cbe: 48b5 li a7,13 + ecall + cc0: 00000073 ecall + ret + cc4: 8082 ret + +0000000000000cc6 : +.global uptime +uptime: + li a7, SYS_uptime + cc6: 48b9 li a7,14 + ecall + cc8: 00000073 ecall + ret + ccc: 8082 ret + +0000000000000cce : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + cce: 1101 addi sp,sp,-32 + cd0: ec06 sd ra,24(sp) + cd2: e822 sd s0,16(sp) + cd4: 1000 addi s0,sp,32 + cd6: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + cda: 4605 li a2,1 + cdc: fef40593 addi a1,s0,-17 + ce0: f6fff0ef jal c4e +} + ce4: 60e2 ld ra,24(sp) + ce6: 6442 ld s0,16(sp) + ce8: 6105 addi sp,sp,32 + cea: 8082 ret + +0000000000000cec : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + cec: 715d addi sp,sp,-80 + cee: e486 sd ra,72(sp) + cf0: e0a2 sd s0,64(sp) + cf2: f84a sd s2,48(sp) + cf4: 0880 addi s0,sp,80 + cf6: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + cf8: c299 beqz a3,cfe + cfa: 0805c363 bltz a1,d80 + neg = 0; + cfe: 4881 li a7,0 + d00: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + d04: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + d06: 00000517 auipc a0,0x0 + d0a: 65250513 addi a0,a0,1618 # 1358 + d0e: 883e mv a6,a5 + d10: 2785 addiw a5,a5,1 + d12: 02c5f733 remu a4,a1,a2 + d16: 972a add a4,a4,a0 + d18: 00074703 lbu a4,0(a4) + d1c: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + d20: 872e mv a4,a1 + d22: 02c5d5b3 divu a1,a1,a2 + d26: 0685 addi a3,a3,1 + d28: fec773e3 bgeu a4,a2,d0e + if(neg) + d2c: 00088b63 beqz a7,d42 + buf[i++] = '-'; + d30: fd078793 addi a5,a5,-48 + d34: 97a2 add a5,a5,s0 + d36: 02d00713 li a4,45 + d3a: fee78423 sb a4,-24(a5) + d3e: 0028079b addiw a5,a6,2 + + while(--i >= 0) + d42: 02f05a63 blez a5,d76 + d46: fc26 sd s1,56(sp) + d48: f44e sd s3,40(sp) + d4a: fb840713 addi a4,s0,-72 + d4e: 00f704b3 add s1,a4,a5 + d52: fff70993 addi s3,a4,-1 + d56: 99be add s3,s3,a5 + d58: 37fd addiw a5,a5,-1 + d5a: 1782 slli a5,a5,0x20 + d5c: 9381 srli a5,a5,0x20 + d5e: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + d62: fff4c583 lbu a1,-1(s1) + d66: 854a mv a0,s2 + d68: f67ff0ef jal cce + while(--i >= 0) + d6c: 14fd addi s1,s1,-1 + d6e: ff349ae3 bne s1,s3,d62 + d72: 74e2 ld s1,56(sp) + d74: 79a2 ld s3,40(sp) +} + d76: 60a6 ld ra,72(sp) + d78: 6406 ld s0,64(sp) + d7a: 7942 ld s2,48(sp) + d7c: 6161 addi sp,sp,80 + d7e: 8082 ret + x = -xx; + d80: 40b005b3 neg a1,a1 + neg = 1; + d84: 4885 li a7,1 + x = -xx; + d86: bfad j d00 + +0000000000000d88 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + d88: 711d addi sp,sp,-96 + d8a: ec86 sd ra,88(sp) + d8c: e8a2 sd s0,80(sp) + d8e: e0ca sd s2,64(sp) + d90: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + d92: 0005c903 lbu s2,0(a1) + d96: 28090663 beqz s2,1022 + d9a: e4a6 sd s1,72(sp) + d9c: fc4e sd s3,56(sp) + d9e: f852 sd s4,48(sp) + da0: f456 sd s5,40(sp) + da2: f05a sd s6,32(sp) + da4: ec5e sd s7,24(sp) + da6: e862 sd s8,16(sp) + da8: e466 sd s9,8(sp) + daa: 8b2a mv s6,a0 + dac: 8a2e mv s4,a1 + dae: 8bb2 mv s7,a2 + state = 0; + db0: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + db2: 4481 li s1,0 + db4: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + db6: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + dba: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + dbe: 06c00c93 li s9,108 + dc2: a005 j de2 + putc(fd, c0); + dc4: 85ca mv a1,s2 + dc6: 855a mv a0,s6 + dc8: f07ff0ef jal cce + dcc: a019 j dd2 + } else if(state == '%'){ + dce: 03598263 beq s3,s5,df2 + for(i = 0; fmt[i]; i++){ + dd2: 2485 addiw s1,s1,1 + dd4: 8726 mv a4,s1 + dd6: 009a07b3 add a5,s4,s1 + dda: 0007c903 lbu s2,0(a5) + dde: 22090a63 beqz s2,1012 + c0 = fmt[i] & 0xff; + de2: 0009079b sext.w a5,s2 + if(state == 0){ + de6: fe0994e3 bnez s3,dce + if(c0 == '%'){ + dea: fd579de3 bne a5,s5,dc4 + state = '%'; + dee: 89be mv s3,a5 + df0: b7cd j dd2 + if(c0) c1 = fmt[i+1] & 0xff; + df2: 00ea06b3 add a3,s4,a4 + df6: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + dfa: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + dfc: c681 beqz a3,e04 + dfe: 9752 add a4,a4,s4 + e00: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + e04: 05878363 beq a5,s8,e4a + } else if(c0 == 'l' && c1 == 'd'){ + e08: 05978d63 beq a5,s9,e62 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + e0c: 07500713 li a4,117 + e10: 0ee78763 beq a5,a4,efe + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + e14: 07800713 li a4,120 + e18: 12e78963 beq a5,a4,f4a + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + e1c: 07000713 li a4,112 + e20: 14e78e63 beq a5,a4,f7c + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + e24: 06300713 li a4,99 + e28: 18e78e63 beq a5,a4,fc4 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + e2c: 07300713 li a4,115 + e30: 1ae78463 beq a5,a4,fd8 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + e34: 02500713 li a4,37 + e38: 04e79563 bne a5,a4,e82 + putc(fd, '%'); + e3c: 02500593 li a1,37 + e40: 855a mv a0,s6 + e42: e8dff0ef jal cce + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + e46: 4981 li s3,0 + e48: b769 j dd2 + printint(fd, va_arg(ap, int), 10, 1); + e4a: 008b8913 addi s2,s7,8 + e4e: 4685 li a3,1 + e50: 4629 li a2,10 + e52: 000ba583 lw a1,0(s7) + e56: 855a mv a0,s6 + e58: e95ff0ef jal cec + e5c: 8bca mv s7,s2 + state = 0; + e5e: 4981 li s3,0 + e60: bf8d j dd2 + } else if(c0 == 'l' && c1 == 'd'){ + e62: 06400793 li a5,100 + e66: 02f68963 beq a3,a5,e98 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + e6a: 06c00793 li a5,108 + e6e: 04f68263 beq a3,a5,eb2 + } else if(c0 == 'l' && c1 == 'u'){ + e72: 07500793 li a5,117 + e76: 0af68063 beq a3,a5,f16 + } else if(c0 == 'l' && c1 == 'x'){ + e7a: 07800793 li a5,120 + e7e: 0ef68263 beq a3,a5,f62 + putc(fd, '%'); + e82: 02500593 li a1,37 + e86: 855a mv a0,s6 + e88: e47ff0ef jal cce + putc(fd, c0); + e8c: 85ca mv a1,s2 + e8e: 855a mv a0,s6 + e90: e3fff0ef jal cce + state = 0; + e94: 4981 li s3,0 + e96: bf35 j dd2 + printint(fd, va_arg(ap, uint64), 10, 1); + e98: 008b8913 addi s2,s7,8 + e9c: 4685 li a3,1 + e9e: 4629 li a2,10 + ea0: 000bb583 ld a1,0(s7) + ea4: 855a mv a0,s6 + ea6: e47ff0ef jal cec + i += 1; + eaa: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + eac: 8bca mv s7,s2 + state = 0; + eae: 4981 li s3,0 + i += 1; + eb0: b70d j dd2 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + eb2: 06400793 li a5,100 + eb6: 02f60763 beq a2,a5,ee4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + eba: 07500793 li a5,117 + ebe: 06f60963 beq a2,a5,f30 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + ec2: 07800793 li a5,120 + ec6: faf61ee3 bne a2,a5,e82 + printint(fd, va_arg(ap, uint64), 16, 0); + eca: 008b8913 addi s2,s7,8 + ece: 4681 li a3,0 + ed0: 4641 li a2,16 + ed2: 000bb583 ld a1,0(s7) + ed6: 855a mv a0,s6 + ed8: e15ff0ef jal cec + i += 2; + edc: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + ede: 8bca mv s7,s2 + state = 0; + ee0: 4981 li s3,0 + i += 2; + ee2: bdc5 j dd2 + printint(fd, va_arg(ap, uint64), 10, 1); + ee4: 008b8913 addi s2,s7,8 + ee8: 4685 li a3,1 + eea: 4629 li a2,10 + eec: 000bb583 ld a1,0(s7) + ef0: 855a mv a0,s6 + ef2: dfbff0ef jal cec + i += 2; + ef6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + ef8: 8bca mv s7,s2 + state = 0; + efa: 4981 li s3,0 + i += 2; + efc: bdd9 j dd2 + printint(fd, va_arg(ap, uint32), 10, 0); + efe: 008b8913 addi s2,s7,8 + f02: 4681 li a3,0 + f04: 4629 li a2,10 + f06: 000be583 lwu a1,0(s7) + f0a: 855a mv a0,s6 + f0c: de1ff0ef jal cec + f10: 8bca mv s7,s2 + state = 0; + f12: 4981 li s3,0 + f14: bd7d j dd2 + printint(fd, va_arg(ap, uint64), 10, 0); + f16: 008b8913 addi s2,s7,8 + f1a: 4681 li a3,0 + f1c: 4629 li a2,10 + f1e: 000bb583 ld a1,0(s7) + f22: 855a mv a0,s6 + f24: dc9ff0ef jal cec + i += 1; + f28: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + f2a: 8bca mv s7,s2 + state = 0; + f2c: 4981 li s3,0 + i += 1; + f2e: b555 j dd2 + printint(fd, va_arg(ap, uint64), 10, 0); + f30: 008b8913 addi s2,s7,8 + f34: 4681 li a3,0 + f36: 4629 li a2,10 + f38: 000bb583 ld a1,0(s7) + f3c: 855a mv a0,s6 + f3e: dafff0ef jal cec + i += 2; + f42: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + f44: 8bca mv s7,s2 + state = 0; + f46: 4981 li s3,0 + i += 2; + f48: b569 j dd2 + printint(fd, va_arg(ap, uint32), 16, 0); + f4a: 008b8913 addi s2,s7,8 + f4e: 4681 li a3,0 + f50: 4641 li a2,16 + f52: 000be583 lwu a1,0(s7) + f56: 855a mv a0,s6 + f58: d95ff0ef jal cec + f5c: 8bca mv s7,s2 + state = 0; + f5e: 4981 li s3,0 + f60: bd8d j dd2 + printint(fd, va_arg(ap, uint64), 16, 0); + f62: 008b8913 addi s2,s7,8 + f66: 4681 li a3,0 + f68: 4641 li a2,16 + f6a: 000bb583 ld a1,0(s7) + f6e: 855a mv a0,s6 + f70: d7dff0ef jal cec + i += 1; + f74: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + f76: 8bca mv s7,s2 + state = 0; + f78: 4981 li s3,0 + i += 1; + f7a: bda1 j dd2 + f7c: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + f7e: 008b8d13 addi s10,s7,8 + f82: 000bb983 ld s3,0(s7) + putc(fd, '0'); + f86: 03000593 li a1,48 + f8a: 855a mv a0,s6 + f8c: d43ff0ef jal cce + putc(fd, 'x'); + f90: 07800593 li a1,120 + f94: 855a mv a0,s6 + f96: d39ff0ef jal cce + f9a: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + f9c: 00000b97 auipc s7,0x0 + fa0: 3bcb8b93 addi s7,s7,956 # 1358 + fa4: 03c9d793 srli a5,s3,0x3c + fa8: 97de add a5,a5,s7 + faa: 0007c583 lbu a1,0(a5) + fae: 855a mv a0,s6 + fb0: d1fff0ef jal cce + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + fb4: 0992 slli s3,s3,0x4 + fb6: 397d addiw s2,s2,-1 + fb8: fe0916e3 bnez s2,fa4 + printptr(fd, va_arg(ap, uint64)); + fbc: 8bea mv s7,s10 + state = 0; + fbe: 4981 li s3,0 + fc0: 6d02 ld s10,0(sp) + fc2: bd01 j dd2 + putc(fd, va_arg(ap, uint32)); + fc4: 008b8913 addi s2,s7,8 + fc8: 000bc583 lbu a1,0(s7) + fcc: 855a mv a0,s6 + fce: d01ff0ef jal cce + fd2: 8bca mv s7,s2 + state = 0; + fd4: 4981 li s3,0 + fd6: bbf5 j dd2 + if((s = va_arg(ap, char*)) == 0) + fd8: 008b8993 addi s3,s7,8 + fdc: 000bb903 ld s2,0(s7) + fe0: 00090f63 beqz s2,ffe + for(; *s; s++) + fe4: 00094583 lbu a1,0(s2) + fe8: c195 beqz a1,100c + putc(fd, *s); + fea: 855a mv a0,s6 + fec: ce3ff0ef jal cce + for(; *s; s++) + ff0: 0905 addi s2,s2,1 + ff2: 00094583 lbu a1,0(s2) + ff6: f9f5 bnez a1,fea + if((s = va_arg(ap, char*)) == 0) + ff8: 8bce mv s7,s3 + state = 0; + ffa: 4981 li s3,0 + ffc: bbd9 j dd2 + s = "(null)"; + ffe: 00000917 auipc s2,0x0 + 1002: 32290913 addi s2,s2,802 # 1320 + for(; *s; s++) + 1006: 02800593 li a1,40 + 100a: b7c5 j fea + if((s = va_arg(ap, char*)) == 0) + 100c: 8bce mv s7,s3 + state = 0; + 100e: 4981 li s3,0 + 1010: b3c9 j dd2 + 1012: 64a6 ld s1,72(sp) + 1014: 79e2 ld s3,56(sp) + 1016: 7a42 ld s4,48(sp) + 1018: 7aa2 ld s5,40(sp) + 101a: 7b02 ld s6,32(sp) + 101c: 6be2 ld s7,24(sp) + 101e: 6c42 ld s8,16(sp) + 1020: 6ca2 ld s9,8(sp) + } + } +} + 1022: 60e6 ld ra,88(sp) + 1024: 6446 ld s0,80(sp) + 1026: 6906 ld s2,64(sp) + 1028: 6125 addi sp,sp,96 + 102a: 8082 ret + +000000000000102c : + +void +fprintf(int fd, const char *fmt, ...) +{ + 102c: 715d addi sp,sp,-80 + 102e: ec06 sd ra,24(sp) + 1030: e822 sd s0,16(sp) + 1032: 1000 addi s0,sp,32 + 1034: e010 sd a2,0(s0) + 1036: e414 sd a3,8(s0) + 1038: e818 sd a4,16(s0) + 103a: ec1c sd a5,24(s0) + 103c: 03043023 sd a6,32(s0) + 1040: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 1044: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 1048: 8622 mv a2,s0 + 104a: d3fff0ef jal d88 +} + 104e: 60e2 ld ra,24(sp) + 1050: 6442 ld s0,16(sp) + 1052: 6161 addi sp,sp,80 + 1054: 8082 ret + +0000000000001056 : + +void +printf(const char *fmt, ...) +{ + 1056: 711d addi sp,sp,-96 + 1058: ec06 sd ra,24(sp) + 105a: e822 sd s0,16(sp) + 105c: 1000 addi s0,sp,32 + 105e: e40c sd a1,8(s0) + 1060: e810 sd a2,16(s0) + 1062: ec14 sd a3,24(s0) + 1064: f018 sd a4,32(s0) + 1066: f41c sd a5,40(s0) + 1068: 03043823 sd a6,48(s0) + 106c: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 1070: 00840613 addi a2,s0,8 + 1074: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 1078: 85aa mv a1,a0 + 107a: 4505 li a0,1 + 107c: d0dff0ef jal d88 +} + 1080: 60e2 ld ra,24(sp) + 1082: 6442 ld s0,16(sp) + 1084: 6125 addi sp,sp,96 + 1086: 8082 ret + +0000000000001088 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 1088: 1141 addi sp,sp,-16 + 108a: e422 sd s0,8(sp) + 108c: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 108e: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 1092: 00001797 auipc a5,0x1 + 1096: f7e7b783 ld a5,-130(a5) # 2010 + 109a: a02d j 10c4 + 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; + 109c: 4618 lw a4,8(a2) + 109e: 9f2d addw a4,a4,a1 + 10a0: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 10a4: 6398 ld a4,0(a5) + 10a6: 6310 ld a2,0(a4) + 10a8: a83d j 10e6 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 10aa: ff852703 lw a4,-8(a0) + 10ae: 9f31 addw a4,a4,a2 + 10b0: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 10b2: ff053683 ld a3,-16(a0) + 10b6: a091 j 10fa + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 10b8: 6398 ld a4,0(a5) + 10ba: 00e7e463 bltu a5,a4,10c2 + 10be: 00e6ea63 bltu a3,a4,10d2 +{ + 10c2: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 10c4: fed7fae3 bgeu a5,a3,10b8 + 10c8: 6398 ld a4,0(a5) + 10ca: 00e6e463 bltu a3,a4,10d2 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 10ce: fee7eae3 bltu a5,a4,10c2 + if(bp + bp->s.size == p->s.ptr){ + 10d2: ff852583 lw a1,-8(a0) + 10d6: 6390 ld a2,0(a5) + 10d8: 02059813 slli a6,a1,0x20 + 10dc: 01c85713 srli a4,a6,0x1c + 10e0: 9736 add a4,a4,a3 + 10e2: fae60de3 beq a2,a4,109c + bp->s.ptr = p->s.ptr->s.ptr; + 10e6: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 10ea: 4790 lw a2,8(a5) + 10ec: 02061593 slli a1,a2,0x20 + 10f0: 01c5d713 srli a4,a1,0x1c + 10f4: 973e add a4,a4,a5 + 10f6: fae68ae3 beq a3,a4,10aa + p->s.ptr = bp->s.ptr; + 10fa: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 10fc: 00001717 auipc a4,0x1 + 1100: f0f73a23 sd a5,-236(a4) # 2010 +} + 1104: 6422 ld s0,8(sp) + 1106: 0141 addi sp,sp,16 + 1108: 8082 ret + +000000000000110a : + return freep; +} + +void* +malloc(uint nbytes) +{ + 110a: 7139 addi sp,sp,-64 + 110c: fc06 sd ra,56(sp) + 110e: f822 sd s0,48(sp) + 1110: f426 sd s1,40(sp) + 1112: ec4e sd s3,24(sp) + 1114: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 1116: 02051493 slli s1,a0,0x20 + 111a: 9081 srli s1,s1,0x20 + 111c: 04bd addi s1,s1,15 + 111e: 8091 srli s1,s1,0x4 + 1120: 0014899b addiw s3,s1,1 + 1124: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 1126: 00001517 auipc a0,0x1 + 112a: eea53503 ld a0,-278(a0) # 2010 + 112e: c915 beqz a0,1162 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 1130: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 1132: 4798 lw a4,8(a5) + 1134: 08977a63 bgeu a4,s1,11c8 + 1138: f04a sd s2,32(sp) + 113a: e852 sd s4,16(sp) + 113c: e456 sd s5,8(sp) + 113e: e05a sd s6,0(sp) + if(nu < 4096) + 1140: 8a4e mv s4,s3 + 1142: 0009871b sext.w a4,s3 + 1146: 6685 lui a3,0x1 + 1148: 00d77363 bgeu a4,a3,114e + 114c: 6a05 lui s4,0x1 + 114e: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 1152: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 1156: 00001917 auipc s2,0x1 + 115a: eba90913 addi s2,s2,-326 # 2010 + if(p == SBRK_ERROR) + 115e: 5afd li s5,-1 + 1160: a081 j 11a0 + 1162: f04a sd s2,32(sp) + 1164: e852 sd s4,16(sp) + 1166: e456 sd s5,8(sp) + 1168: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 116a: 00001797 auipc a5,0x1 + 116e: f1e78793 addi a5,a5,-226 # 2088 + 1172: 00001717 auipc a4,0x1 + 1176: e8f73f23 sd a5,-354(a4) # 2010 + 117a: e39c sd a5,0(a5) + base.s.size = 0; + 117c: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 1180: b7c1 j 1140 + prevp->s.ptr = p->s.ptr; + 1182: 6398 ld a4,0(a5) + 1184: e118 sd a4,0(a0) + 1186: a8a9 j 11e0 + hp->s.size = nu; + 1188: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 118c: 0541 addi a0,a0,16 + 118e: efbff0ef jal 1088 + return freep; + 1192: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 1196: c12d beqz a0,11f8 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 1198: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 119a: 4798 lw a4,8(a5) + 119c: 02977263 bgeu a4,s1,11c0 + if(p == freep) + 11a0: 00093703 ld a4,0(s2) + 11a4: 853e mv a0,a5 + 11a6: fef719e3 bne a4,a5,1198 + p = sbrk(nu * sizeof(Header)); + 11aa: 8552 mv a0,s4 + 11ac: a4fff0ef jal bfa + if(p == SBRK_ERROR) + 11b0: fd551ce3 bne a0,s5,1188 + return 0; + 11b4: 4501 li a0,0 + 11b6: 7902 ld s2,32(sp) + 11b8: 6a42 ld s4,16(sp) + 11ba: 6aa2 ld s5,8(sp) + 11bc: 6b02 ld s6,0(sp) + 11be: a03d j 11ec + 11c0: 7902 ld s2,32(sp) + 11c2: 6a42 ld s4,16(sp) + 11c4: 6aa2 ld s5,8(sp) + 11c6: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 11c8: fae48de3 beq s1,a4,1182 + p->s.size -= nunits; + 11cc: 4137073b subw a4,a4,s3 + 11d0: c798 sw a4,8(a5) + p += p->s.size; + 11d2: 02071693 slli a3,a4,0x20 + 11d6: 01c6d713 srli a4,a3,0x1c + 11da: 97ba add a5,a5,a4 + p->s.size = nunits; + 11dc: 0137a423 sw s3,8(a5) + freep = prevp; + 11e0: 00001717 auipc a4,0x1 + 11e4: e2a73823 sd a0,-464(a4) # 2010 + return (void*)(p + 1); + 11e8: 01078513 addi a0,a5,16 + } +} + 11ec: 70e2 ld ra,56(sp) + 11ee: 7442 ld s0,48(sp) + 11f0: 74a2 ld s1,40(sp) + 11f2: 69e2 ld s3,24(sp) + 11f4: 6121 addi sp,sp,64 + 11f6: 8082 ret + 11f8: 7902 ld s2,32(sp) + 11fa: 6a42 ld s4,16(sp) + 11fc: 6aa2 ld s5,8(sp) + 11fe: 6b02 ld s6,0(sp) + 1200: b7f5 j 11ec diff --git a/G12_Project2_2/user/sh.c b/G12_Project2_2/user/sh.c new file mode 100644 index 0000000000..278fb37c90 --- /dev/null +++ b/G12_Project2_2/user/sh.c @@ -0,0 +1,499 @@ +// Shell. + +#include "kernel/types.h" +#include "user/user.h" +#include "kernel/fcntl.h" + +// Parsed command representation +#define EXEC 1 +#define REDIR 2 +#define PIPE 3 +#define LIST 4 +#define BACK 5 + +#define MAXARGS 10 + +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*); +void runcmd(struct cmd*) __attribute__((noreturn)); + +// 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); + 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) +{ + write(2, "$ ", 2); + 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 = open("console", O_RDWR)) >= 0){ + if(fd >= 3){ + close(fd); + break; + } + } + + // Read and run input commands. + while(getcmd(buf, sizeof(buf)) >= 0){ + char *cmd = buf; + while (*cmd == ' ' || *cmd == '\t') + cmd++; + if (*cmd == '\n') // is a blank command + continue; + if(cmd[0] == 'c' && cmd[1] == 'd' && cmd[2] == ' '){ + // Chdir must be called by the parent, not the child. + cmd[strlen(cmd)-1] = 0; // chop \n + if(chdir(cmd+3) < 0) + fprintf(2, "cannot cd %s\n", cmd+3); + } else { + if(fork1() == 0) + runcmd(parsecmd(cmd)); + wait(0); + } + } + 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, 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; +} diff --git a/G12_Project2_2/user/sh.d b/G12_Project2_2/user/sh.d new file mode 100644 index 0000000000..d2c3f5edbc --- /dev/null +++ b/G12_Project2_2/user/sh.d @@ -0,0 +1 @@ +user/sh.o: user/sh.c kernel/types.h user/user.h kernel/fcntl.h diff --git a/G12_Project2_2/user/sh.o b/G12_Project2_2/user/sh.o new file mode 100644 index 0000000000..76c6f8194c Binary files /dev/null and b/G12_Project2_2/user/sh.o differ diff --git a/G12_Project2_2/user/sh.sym b/G12_Project2_2/user/sh.sym new file mode 100644 index 0000000000..864b0c00af --- /dev/null +++ b/G12_Project2_2/user/sh.sym @@ -0,0 +1,86 @@ +0000000000000000 .text +0000000000001208 .rodata +0000000000001370 .eh_frame +0000000000002000 .data +0000000000002010 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 sh.c +0000000000002020 buf.0 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000cce putc +0000000000000cec printint +0000000000001358 digits +0000000000000000 umalloc.c +0000000000002010 freep +0000000000002088 base +00000000000009aa strcpy +0000000000000cbe pause +0000000000001056 printf +0000000000000cb6 sys_sbrk +0000000000000b54 memmove +0000000000000c76 mknod +00000000000001d2 execcmd +0000000000000a62 gets +0000000000000cae getpid +000000000000066c parsepipe +0000000000000852 parsecmd +0000000000000be6 memcpy +00000000000002dc backcmd +000000000000044c peek +00000000000004b0 parseredirs +0000000000000310 gettoken +000000000000110a malloc +0000000000002008 whitespace +0000000000000068 fork1 +0000000000000c10 sbrklazy +00000000000007d2 nulterminate +0000000000000c3e pipe +0000000000000000 getcmd +0000000000000c4e write +0000000000000c86 fstat +000000000000102c fprintf +0000000000000c5e kill +0000000000000d88 vprintf +0000000000000c9e chdir +00000000000006c6 parseline +000000000000008e runcmd +000000000000074e parseblock +0000000000000c66 exec +0000000000000c36 wait +0000000000002000 symbols +0000000000000c46 read +0000000000000588 parseexec +0000000000000c7e unlink +000000000000004a panic +0000000000000bac memcmp +0000000000000c26 fork +0000000000000bfa sbrk +0000000000000cc6 uptime +0000000000000a1c memset +00000000000008c2 main +00000000000009c6 strcmp +0000000000000ca6 dup +0000000000000260 pipecmd +0000000000000200 redircmd +0000000000000ad2 stat +0000000000000c8e link +0000000000000c2e exit +000000000000099a start +0000000000000b0c atoi +00000000000009f2 strlen +0000000000000c6e open +0000000000000a3e strchr +0000000000000c96 mkdir +0000000000000c56 close +000000000000029e listcmd +0000000000001088 free diff --git a/G12_Project2_2/user/stressfs.asm b/G12_Project2_2/user/stressfs.asm new file mode 100644 index 0000000000..1cc3167069 --- /dev/null +++ b/G12_Project2_2/user/stressfs.asm @@ -0,0 +1,1554 @@ + +user/_stressfs: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000
: +#include "kernel/fs.h" +#include "kernel/fcntl.h" + +int +main(int argc, char *argv[]) +{ + 0: dd010113 addi sp,sp,-560 + 4: 22113423 sd ra,552(sp) + 8: 22813023 sd s0,544(sp) + c: 20913c23 sd s1,536(sp) + 10: 21213823 sd s2,528(sp) + 14: 1c00 addi s0,sp,560 + int fd, i; + char path[] = "stressfs0"; + 16: 00001797 auipc a5,0x1 + 1a: 95a78793 addi a5,a5,-1702 # 970 + 1e: 6398 ld a4,0(a5) + 20: fce43823 sd a4,-48(s0) + 24: 0087d783 lhu a5,8(a5) + 28: fcf41c23 sh a5,-40(s0) + char data[512]; + + printf("stressfs starting\n"); + 2c: 00001517 auipc a0,0x1 + 30: 91450513 addi a0,a0,-1772 # 940 + 34: 760000ef jal 794 + memset(data, 'a', sizeof(data)); + 38: 20000613 li a2,512 + 3c: 06100593 li a1,97 + 40: dd040513 addi a0,s0,-560 + 44: 116000ef jal 15a + + for(i = 0; i < 4; i++) + 48: 4481 li s1,0 + 4a: 4911 li s2,4 + if(fork() > 0) + 4c: 318000ef jal 364 + 50: 00a04563 bgtz a0,5a + for(i = 0; i < 4; i++) + 54: 2485 addiw s1,s1,1 + 56: ff249be3 bne s1,s2,4c + break; + + printf("write %d\n", i); + 5a: 85a6 mv a1,s1 + 5c: 00001517 auipc a0,0x1 + 60: 8fc50513 addi a0,a0,-1796 # 958 + 64: 730000ef jal 794 + + path[8] += i; + 68: fd844783 lbu a5,-40(s0) + 6c: 9fa5 addw a5,a5,s1 + 6e: fcf40c23 sb a5,-40(s0) + fd = open(path, O_CREATE | O_RDWR); + 72: 20200593 li a1,514 + 76: fd040513 addi a0,s0,-48 + 7a: 332000ef jal 3ac + 7e: 892a mv s2,a0 + 80: 44d1 li s1,20 + for(i = 0; i < 20; i++) +// printf(fd, "%d\n", i); + write(fd, data, sizeof(data)); + 82: 20000613 li a2,512 + 86: dd040593 addi a1,s0,-560 + 8a: 854a mv a0,s2 + 8c: 300000ef jal 38c + for(i = 0; i < 20; i++) + 90: 34fd addiw s1,s1,-1 + 92: f8e5 bnez s1,82 + close(fd); + 94: 854a mv a0,s2 + 96: 2fe000ef jal 394 + + printf("read\n"); + 9a: 00001517 auipc a0,0x1 + 9e: 8ce50513 addi a0,a0,-1842 # 968 + a2: 6f2000ef jal 794 + + fd = open(path, O_RDONLY); + a6: 4581 li a1,0 + a8: fd040513 addi a0,s0,-48 + ac: 300000ef jal 3ac + b0: 892a mv s2,a0 + b2: 44d1 li s1,20 + for (i = 0; i < 20; i++) + read(fd, data, sizeof(data)); + b4: 20000613 li a2,512 + b8: dd040593 addi a1,s0,-560 + bc: 854a mv a0,s2 + be: 2c6000ef jal 384 + for (i = 0; i < 20; i++) + c2: 34fd addiw s1,s1,-1 + c4: f8e5 bnez s1,b4 + close(fd); + c6: 854a mv a0,s2 + c8: 2cc000ef jal 394 + + wait(0); + cc: 4501 li a0,0 + ce: 2a6000ef jal 374 + + exit(0); + d2: 4501 li a0,0 + d4: 298000ef jal 36c + +00000000000000d8 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + d8: 1141 addi sp,sp,-16 + da: e406 sd ra,8(sp) + dc: e022 sd s0,0(sp) + de: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + e0: f21ff0ef jal 0
+ exit(r); + e4: 288000ef jal 36c + +00000000000000e8 : +} + +char* +strcpy(char *s, const char *t) +{ + e8: 1141 addi sp,sp,-16 + ea: e422 sd s0,8(sp) + ec: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + ee: 87aa mv a5,a0 + f0: 0585 addi a1,a1,1 + f2: 0785 addi a5,a5,1 + f4: fff5c703 lbu a4,-1(a1) + f8: fee78fa3 sb a4,-1(a5) + fc: fb75 bnez a4,f0 + ; + return os; +} + fe: 6422 ld s0,8(sp) + 100: 0141 addi sp,sp,16 + 102: 8082 ret + +0000000000000104 : + +int +strcmp(const char *p, const char *q) +{ + 104: 1141 addi sp,sp,-16 + 106: e422 sd s0,8(sp) + 108: 0800 addi s0,sp,16 + while(*p && *p == *q) + 10a: 00054783 lbu a5,0(a0) + 10e: cb91 beqz a5,122 + 110: 0005c703 lbu a4,0(a1) + 114: 00f71763 bne a4,a5,122 + p++, q++; + 118: 0505 addi a0,a0,1 + 11a: 0585 addi a1,a1,1 + while(*p && *p == *q) + 11c: 00054783 lbu a5,0(a0) + 120: fbe5 bnez a5,110 + return (uchar)*p - (uchar)*q; + 122: 0005c503 lbu a0,0(a1) +} + 126: 40a7853b subw a0,a5,a0 + 12a: 6422 ld s0,8(sp) + 12c: 0141 addi sp,sp,16 + 12e: 8082 ret + +0000000000000130 : + +uint +strlen(const char *s) +{ + 130: 1141 addi sp,sp,-16 + 132: e422 sd s0,8(sp) + 134: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 136: 00054783 lbu a5,0(a0) + 13a: cf91 beqz a5,156 + 13c: 0505 addi a0,a0,1 + 13e: 87aa mv a5,a0 + 140: 86be mv a3,a5 + 142: 0785 addi a5,a5,1 + 144: fff7c703 lbu a4,-1(a5) + 148: ff65 bnez a4,140 + 14a: 40a6853b subw a0,a3,a0 + 14e: 2505 addiw a0,a0,1 + ; + return n; +} + 150: 6422 ld s0,8(sp) + 152: 0141 addi sp,sp,16 + 154: 8082 ret + for(n = 0; s[n]; n++) + 156: 4501 li a0,0 + 158: bfe5 j 150 + +000000000000015a : + +void* +memset(void *dst, int c, uint n) +{ + 15a: 1141 addi sp,sp,-16 + 15c: e422 sd s0,8(sp) + 15e: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 160: ca19 beqz a2,176 + 162: 87aa mv a5,a0 + 164: 1602 slli a2,a2,0x20 + 166: 9201 srli a2,a2,0x20 + 168: 00a60733 add a4,a2,a0 + cdst[i] = c; + 16c: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 170: 0785 addi a5,a5,1 + 172: fee79de3 bne a5,a4,16c + } + return dst; +} + 176: 6422 ld s0,8(sp) + 178: 0141 addi sp,sp,16 + 17a: 8082 ret + +000000000000017c : + +char* +strchr(const char *s, char c) +{ + 17c: 1141 addi sp,sp,-16 + 17e: e422 sd s0,8(sp) + 180: 0800 addi s0,sp,16 + for(; *s; s++) + 182: 00054783 lbu a5,0(a0) + 186: cb99 beqz a5,19c + if(*s == c) + 188: 00f58763 beq a1,a5,196 + for(; *s; s++) + 18c: 0505 addi a0,a0,1 + 18e: 00054783 lbu a5,0(a0) + 192: fbfd bnez a5,188 + return (char*)s; + return 0; + 194: 4501 li a0,0 +} + 196: 6422 ld s0,8(sp) + 198: 0141 addi sp,sp,16 + 19a: 8082 ret + return 0; + 19c: 4501 li a0,0 + 19e: bfe5 j 196 + +00000000000001a0 : + +char* +gets(char *buf, int max) +{ + 1a0: 711d addi sp,sp,-96 + 1a2: ec86 sd ra,88(sp) + 1a4: e8a2 sd s0,80(sp) + 1a6: e4a6 sd s1,72(sp) + 1a8: e0ca sd s2,64(sp) + 1aa: fc4e sd s3,56(sp) + 1ac: f852 sd s4,48(sp) + 1ae: f456 sd s5,40(sp) + 1b0: f05a sd s6,32(sp) + 1b2: ec5e sd s7,24(sp) + 1b4: 1080 addi s0,sp,96 + 1b6: 8baa mv s7,a0 + 1b8: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 1ba: 892a mv s2,a0 + 1bc: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 1be: 4aa9 li s5,10 + 1c0: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 1c2: 89a6 mv s3,s1 + 1c4: 2485 addiw s1,s1,1 + 1c6: 0344d663 bge s1,s4,1f2 + cc = read(0, &c, 1); + 1ca: 4605 li a2,1 + 1cc: faf40593 addi a1,s0,-81 + 1d0: 4501 li a0,0 + 1d2: 1b2000ef jal 384 + if(cc < 1) + 1d6: 00a05e63 blez a0,1f2 + buf[i++] = c; + 1da: faf44783 lbu a5,-81(s0) + 1de: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 1e2: 01578763 beq a5,s5,1f0 + 1e6: 0905 addi s2,s2,1 + 1e8: fd679de3 bne a5,s6,1c2 + buf[i++] = c; + 1ec: 89a6 mv s3,s1 + 1ee: a011 j 1f2 + 1f0: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 1f2: 99de add s3,s3,s7 + 1f4: 00098023 sb zero,0(s3) + return buf; +} + 1f8: 855e mv a0,s7 + 1fa: 60e6 ld ra,88(sp) + 1fc: 6446 ld s0,80(sp) + 1fe: 64a6 ld s1,72(sp) + 200: 6906 ld s2,64(sp) + 202: 79e2 ld s3,56(sp) + 204: 7a42 ld s4,48(sp) + 206: 7aa2 ld s5,40(sp) + 208: 7b02 ld s6,32(sp) + 20a: 6be2 ld s7,24(sp) + 20c: 6125 addi sp,sp,96 + 20e: 8082 ret + +0000000000000210 : + +int +stat(const char *n, struct stat *st) +{ + 210: 1101 addi sp,sp,-32 + 212: ec06 sd ra,24(sp) + 214: e822 sd s0,16(sp) + 216: e04a sd s2,0(sp) + 218: 1000 addi s0,sp,32 + 21a: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 21c: 4581 li a1,0 + 21e: 18e000ef jal 3ac + if(fd < 0) + 222: 02054263 bltz a0,246 + 226: e426 sd s1,8(sp) + 228: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 22a: 85ca mv a1,s2 + 22c: 198000ef jal 3c4 + 230: 892a mv s2,a0 + close(fd); + 232: 8526 mv a0,s1 + 234: 160000ef jal 394 + return r; + 238: 64a2 ld s1,8(sp) +} + 23a: 854a mv a0,s2 + 23c: 60e2 ld ra,24(sp) + 23e: 6442 ld s0,16(sp) + 240: 6902 ld s2,0(sp) + 242: 6105 addi sp,sp,32 + 244: 8082 ret + return -1; + 246: 597d li s2,-1 + 248: bfcd j 23a + +000000000000024a : + +int +atoi(const char *s) +{ + 24a: 1141 addi sp,sp,-16 + 24c: e422 sd s0,8(sp) + 24e: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 250: 00054683 lbu a3,0(a0) + 254: fd06879b addiw a5,a3,-48 + 258: 0ff7f793 zext.b a5,a5 + 25c: 4625 li a2,9 + 25e: 02f66863 bltu a2,a5,28e + 262: 872a mv a4,a0 + n = 0; + 264: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 266: 0705 addi a4,a4,1 + 268: 0025179b slliw a5,a0,0x2 + 26c: 9fa9 addw a5,a5,a0 + 26e: 0017979b slliw a5,a5,0x1 + 272: 9fb5 addw a5,a5,a3 + 274: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 278: 00074683 lbu a3,0(a4) + 27c: fd06879b addiw a5,a3,-48 + 280: 0ff7f793 zext.b a5,a5 + 284: fef671e3 bgeu a2,a5,266 + return n; +} + 288: 6422 ld s0,8(sp) + 28a: 0141 addi sp,sp,16 + 28c: 8082 ret + n = 0; + 28e: 4501 li a0,0 + 290: bfe5 j 288 + +0000000000000292 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 292: 1141 addi sp,sp,-16 + 294: e422 sd s0,8(sp) + 296: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 298: 02b57463 bgeu a0,a1,2c0 + while(n-- > 0) + 29c: 00c05f63 blez a2,2ba + 2a0: 1602 slli a2,a2,0x20 + 2a2: 9201 srli a2,a2,0x20 + 2a4: 00c507b3 add a5,a0,a2 + dst = vdst; + 2a8: 872a mv a4,a0 + *dst++ = *src++; + 2aa: 0585 addi a1,a1,1 + 2ac: 0705 addi a4,a4,1 + 2ae: fff5c683 lbu a3,-1(a1) + 2b2: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 2b6: fef71ae3 bne a4,a5,2aa + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 2ba: 6422 ld s0,8(sp) + 2bc: 0141 addi sp,sp,16 + 2be: 8082 ret + dst += n; + 2c0: 00c50733 add a4,a0,a2 + src += n; + 2c4: 95b2 add a1,a1,a2 + while(n-- > 0) + 2c6: fec05ae3 blez a2,2ba + 2ca: fff6079b addiw a5,a2,-1 + 2ce: 1782 slli a5,a5,0x20 + 2d0: 9381 srli a5,a5,0x20 + 2d2: fff7c793 not a5,a5 + 2d6: 97ba add a5,a5,a4 + *--dst = *--src; + 2d8: 15fd addi a1,a1,-1 + 2da: 177d addi a4,a4,-1 + 2dc: 0005c683 lbu a3,0(a1) + 2e0: 00d70023 sb a3,0(a4) + while(n-- > 0) + 2e4: fee79ae3 bne a5,a4,2d8 + 2e8: bfc9 j 2ba + +00000000000002ea : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 2ea: 1141 addi sp,sp,-16 + 2ec: e422 sd s0,8(sp) + 2ee: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 2f0: ca05 beqz a2,320 + 2f2: fff6069b addiw a3,a2,-1 + 2f6: 1682 slli a3,a3,0x20 + 2f8: 9281 srli a3,a3,0x20 + 2fa: 0685 addi a3,a3,1 + 2fc: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 2fe: 00054783 lbu a5,0(a0) + 302: 0005c703 lbu a4,0(a1) + 306: 00e79863 bne a5,a4,316 + return *p1 - *p2; + } + p1++; + 30a: 0505 addi a0,a0,1 + p2++; + 30c: 0585 addi a1,a1,1 + while (n-- > 0) { + 30e: fed518e3 bne a0,a3,2fe + } + return 0; + 312: 4501 li a0,0 + 314: a019 j 31a + return *p1 - *p2; + 316: 40e7853b subw a0,a5,a4 +} + 31a: 6422 ld s0,8(sp) + 31c: 0141 addi sp,sp,16 + 31e: 8082 ret + return 0; + 320: 4501 li a0,0 + 322: bfe5 j 31a + +0000000000000324 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 324: 1141 addi sp,sp,-16 + 326: e406 sd ra,8(sp) + 328: e022 sd s0,0(sp) + 32a: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 32c: f67ff0ef jal 292 +} + 330: 60a2 ld ra,8(sp) + 332: 6402 ld s0,0(sp) + 334: 0141 addi sp,sp,16 + 336: 8082 ret + +0000000000000338 : + +char * +sbrk(int n) { + 338: 1141 addi sp,sp,-16 + 33a: e406 sd ra,8(sp) + 33c: e022 sd s0,0(sp) + 33e: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 340: 4585 li a1,1 + 342: 0b2000ef jal 3f4 +} + 346: 60a2 ld ra,8(sp) + 348: 6402 ld s0,0(sp) + 34a: 0141 addi sp,sp,16 + 34c: 8082 ret + +000000000000034e : + +char * +sbrklazy(int n) { + 34e: 1141 addi sp,sp,-16 + 350: e406 sd ra,8(sp) + 352: e022 sd s0,0(sp) + 354: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 356: 4589 li a1,2 + 358: 09c000ef jal 3f4 +} + 35c: 60a2 ld ra,8(sp) + 35e: 6402 ld s0,0(sp) + 360: 0141 addi sp,sp,16 + 362: 8082 ret + +0000000000000364 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 364: 4885 li a7,1 + ecall + 366: 00000073 ecall + ret + 36a: 8082 ret + +000000000000036c : +.global exit +exit: + li a7, SYS_exit + 36c: 4889 li a7,2 + ecall + 36e: 00000073 ecall + ret + 372: 8082 ret + +0000000000000374 : +.global wait +wait: + li a7, SYS_wait + 374: 488d li a7,3 + ecall + 376: 00000073 ecall + ret + 37a: 8082 ret + +000000000000037c : +.global pipe +pipe: + li a7, SYS_pipe + 37c: 4891 li a7,4 + ecall + 37e: 00000073 ecall + ret + 382: 8082 ret + +0000000000000384 : +.global read +read: + li a7, SYS_read + 384: 4895 li a7,5 + ecall + 386: 00000073 ecall + ret + 38a: 8082 ret + +000000000000038c : +.global write +write: + li a7, SYS_write + 38c: 48c1 li a7,16 + ecall + 38e: 00000073 ecall + ret + 392: 8082 ret + +0000000000000394 : +.global close +close: + li a7, SYS_close + 394: 48d5 li a7,21 + ecall + 396: 00000073 ecall + ret + 39a: 8082 ret + +000000000000039c : +.global kill +kill: + li a7, SYS_kill + 39c: 4899 li a7,6 + ecall + 39e: 00000073 ecall + ret + 3a2: 8082 ret + +00000000000003a4 : +.global exec +exec: + li a7, SYS_exec + 3a4: 489d li a7,7 + ecall + 3a6: 00000073 ecall + ret + 3aa: 8082 ret + +00000000000003ac : +.global open +open: + li a7, SYS_open + 3ac: 48bd li a7,15 + ecall + 3ae: 00000073 ecall + ret + 3b2: 8082 ret + +00000000000003b4 : +.global mknod +mknod: + li a7, SYS_mknod + 3b4: 48c5 li a7,17 + ecall + 3b6: 00000073 ecall + ret + 3ba: 8082 ret + +00000000000003bc : +.global unlink +unlink: + li a7, SYS_unlink + 3bc: 48c9 li a7,18 + ecall + 3be: 00000073 ecall + ret + 3c2: 8082 ret + +00000000000003c4 : +.global fstat +fstat: + li a7, SYS_fstat + 3c4: 48a1 li a7,8 + ecall + 3c6: 00000073 ecall + ret + 3ca: 8082 ret + +00000000000003cc : +.global link +link: + li a7, SYS_link + 3cc: 48cd li a7,19 + ecall + 3ce: 00000073 ecall + ret + 3d2: 8082 ret + +00000000000003d4 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 3d4: 48d1 li a7,20 + ecall + 3d6: 00000073 ecall + ret + 3da: 8082 ret + +00000000000003dc : +.global chdir +chdir: + li a7, SYS_chdir + 3dc: 48a5 li a7,9 + ecall + 3de: 00000073 ecall + ret + 3e2: 8082 ret + +00000000000003e4 : +.global dup +dup: + li a7, SYS_dup + 3e4: 48a9 li a7,10 + ecall + 3e6: 00000073 ecall + ret + 3ea: 8082 ret + +00000000000003ec : +.global getpid +getpid: + li a7, SYS_getpid + 3ec: 48ad li a7,11 + ecall + 3ee: 00000073 ecall + ret + 3f2: 8082 ret + +00000000000003f4 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 3f4: 48b1 li a7,12 + ecall + 3f6: 00000073 ecall + ret + 3fa: 8082 ret + +00000000000003fc : +.global pause +pause: + li a7, SYS_pause + 3fc: 48b5 li a7,13 + ecall + 3fe: 00000073 ecall + ret + 402: 8082 ret + +0000000000000404 : +.global uptime +uptime: + li a7, SYS_uptime + 404: 48b9 li a7,14 + ecall + 406: 00000073 ecall + ret + 40a: 8082 ret + +000000000000040c : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 40c: 1101 addi sp,sp,-32 + 40e: ec06 sd ra,24(sp) + 410: e822 sd s0,16(sp) + 412: 1000 addi s0,sp,32 + 414: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 418: 4605 li a2,1 + 41a: fef40593 addi a1,s0,-17 + 41e: f6fff0ef jal 38c +} + 422: 60e2 ld ra,24(sp) + 424: 6442 ld s0,16(sp) + 426: 6105 addi sp,sp,32 + 428: 8082 ret + +000000000000042a : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 42a: 715d addi sp,sp,-80 + 42c: e486 sd ra,72(sp) + 42e: e0a2 sd s0,64(sp) + 430: f84a sd s2,48(sp) + 432: 0880 addi s0,sp,80 + 434: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 436: c299 beqz a3,43c + 438: 0805c363 bltz a1,4be + neg = 0; + 43c: 4881 li a7,0 + 43e: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 442: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 444: 00000517 auipc a0,0x0 + 448: 54450513 addi a0,a0,1348 # 988 + 44c: 883e mv a6,a5 + 44e: 2785 addiw a5,a5,1 + 450: 02c5f733 remu a4,a1,a2 + 454: 972a add a4,a4,a0 + 456: 00074703 lbu a4,0(a4) + 45a: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 45e: 872e mv a4,a1 + 460: 02c5d5b3 divu a1,a1,a2 + 464: 0685 addi a3,a3,1 + 466: fec773e3 bgeu a4,a2,44c + if(neg) + 46a: 00088b63 beqz a7,480 + buf[i++] = '-'; + 46e: fd078793 addi a5,a5,-48 + 472: 97a2 add a5,a5,s0 + 474: 02d00713 li a4,45 + 478: fee78423 sb a4,-24(a5) + 47c: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 480: 02f05a63 blez a5,4b4 + 484: fc26 sd s1,56(sp) + 486: f44e sd s3,40(sp) + 488: fb840713 addi a4,s0,-72 + 48c: 00f704b3 add s1,a4,a5 + 490: fff70993 addi s3,a4,-1 + 494: 99be add s3,s3,a5 + 496: 37fd addiw a5,a5,-1 + 498: 1782 slli a5,a5,0x20 + 49a: 9381 srli a5,a5,0x20 + 49c: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 4a0: fff4c583 lbu a1,-1(s1) + 4a4: 854a mv a0,s2 + 4a6: f67ff0ef jal 40c + while(--i >= 0) + 4aa: 14fd addi s1,s1,-1 + 4ac: ff349ae3 bne s1,s3,4a0 + 4b0: 74e2 ld s1,56(sp) + 4b2: 79a2 ld s3,40(sp) +} + 4b4: 60a6 ld ra,72(sp) + 4b6: 6406 ld s0,64(sp) + 4b8: 7942 ld s2,48(sp) + 4ba: 6161 addi sp,sp,80 + 4bc: 8082 ret + x = -xx; + 4be: 40b005b3 neg a1,a1 + neg = 1; + 4c2: 4885 li a7,1 + x = -xx; + 4c4: bfad j 43e + +00000000000004c6 : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4c6: 711d addi sp,sp,-96 + 4c8: ec86 sd ra,88(sp) + 4ca: e8a2 sd s0,80(sp) + 4cc: e0ca sd s2,64(sp) + 4ce: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4d0: 0005c903 lbu s2,0(a1) + 4d4: 28090663 beqz s2,760 + 4d8: e4a6 sd s1,72(sp) + 4da: fc4e sd s3,56(sp) + 4dc: f852 sd s4,48(sp) + 4de: f456 sd s5,40(sp) + 4e0: f05a sd s6,32(sp) + 4e2: ec5e sd s7,24(sp) + 4e4: e862 sd s8,16(sp) + 4e6: e466 sd s9,8(sp) + 4e8: 8b2a mv s6,a0 + 4ea: 8a2e mv s4,a1 + 4ec: 8bb2 mv s7,a2 + state = 0; + 4ee: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4f0: 4481 li s1,0 + 4f2: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4f4: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4f8: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4fc: 06c00c93 li s9,108 + 500: a005 j 520 + putc(fd, c0); + 502: 85ca mv a1,s2 + 504: 855a mv a0,s6 + 506: f07ff0ef jal 40c + 50a: a019 j 510 + } else if(state == '%'){ + 50c: 03598263 beq s3,s5,530 + for(i = 0; fmt[i]; i++){ + 510: 2485 addiw s1,s1,1 + 512: 8726 mv a4,s1 + 514: 009a07b3 add a5,s4,s1 + 518: 0007c903 lbu s2,0(a5) + 51c: 22090a63 beqz s2,750 + c0 = fmt[i] & 0xff; + 520: 0009079b sext.w a5,s2 + if(state == 0){ + 524: fe0994e3 bnez s3,50c + if(c0 == '%'){ + 528: fd579de3 bne a5,s5,502 + state = '%'; + 52c: 89be mv s3,a5 + 52e: b7cd j 510 + if(c0) c1 = fmt[i+1] & 0xff; + 530: 00ea06b3 add a3,s4,a4 + 534: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 538: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 53a: c681 beqz a3,542 + 53c: 9752 add a4,a4,s4 + 53e: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 542: 05878363 beq a5,s8,588 + } else if(c0 == 'l' && c1 == 'd'){ + 546: 05978d63 beq a5,s9,5a0 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 54a: 07500713 li a4,117 + 54e: 0ee78763 beq a5,a4,63c + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 552: 07800713 li a4,120 + 556: 12e78963 beq a5,a4,688 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 55a: 07000713 li a4,112 + 55e: 14e78e63 beq a5,a4,6ba + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 562: 06300713 li a4,99 + 566: 18e78e63 beq a5,a4,702 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 56a: 07300713 li a4,115 + 56e: 1ae78463 beq a5,a4,716 + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 572: 02500713 li a4,37 + 576: 04e79563 bne a5,a4,5c0 + putc(fd, '%'); + 57a: 02500593 li a1,37 + 57e: 855a mv a0,s6 + 580: e8dff0ef jal 40c + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 584: 4981 li s3,0 + 586: b769 j 510 + printint(fd, va_arg(ap, int), 10, 1); + 588: 008b8913 addi s2,s7,8 + 58c: 4685 li a3,1 + 58e: 4629 li a2,10 + 590: 000ba583 lw a1,0(s7) + 594: 855a mv a0,s6 + 596: e95ff0ef jal 42a + 59a: 8bca mv s7,s2 + state = 0; + 59c: 4981 li s3,0 + 59e: bf8d j 510 + } else if(c0 == 'l' && c1 == 'd'){ + 5a0: 06400793 li a5,100 + 5a4: 02f68963 beq a3,a5,5d6 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5a8: 06c00793 li a5,108 + 5ac: 04f68263 beq a3,a5,5f0 + } else if(c0 == 'l' && c1 == 'u'){ + 5b0: 07500793 li a5,117 + 5b4: 0af68063 beq a3,a5,654 + } else if(c0 == 'l' && c1 == 'x'){ + 5b8: 07800793 li a5,120 + 5bc: 0ef68263 beq a3,a5,6a0 + putc(fd, '%'); + 5c0: 02500593 li a1,37 + 5c4: 855a mv a0,s6 + 5c6: e47ff0ef jal 40c + putc(fd, c0); + 5ca: 85ca mv a1,s2 + 5cc: 855a mv a0,s6 + 5ce: e3fff0ef jal 40c + state = 0; + 5d2: 4981 li s3,0 + 5d4: bf35 j 510 + printint(fd, va_arg(ap, uint64), 10, 1); + 5d6: 008b8913 addi s2,s7,8 + 5da: 4685 li a3,1 + 5dc: 4629 li a2,10 + 5de: 000bb583 ld a1,0(s7) + 5e2: 855a mv a0,s6 + 5e4: e47ff0ef jal 42a + i += 1; + 5e8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 5ea: 8bca mv s7,s2 + state = 0; + 5ec: 4981 li s3,0 + i += 1; + 5ee: b70d j 510 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 5f0: 06400793 li a5,100 + 5f4: 02f60763 beq a2,a5,622 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5f8: 07500793 li a5,117 + 5fc: 06f60963 beq a2,a5,66e + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 600: 07800793 li a5,120 + 604: faf61ee3 bne a2,a5,5c0 + printint(fd, va_arg(ap, uint64), 16, 0); + 608: 008b8913 addi s2,s7,8 + 60c: 4681 li a3,0 + 60e: 4641 li a2,16 + 610: 000bb583 ld a1,0(s7) + 614: 855a mv a0,s6 + 616: e15ff0ef jal 42a + i += 2; + 61a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 61c: 8bca mv s7,s2 + state = 0; + 61e: 4981 li s3,0 + i += 2; + 620: bdc5 j 510 + printint(fd, va_arg(ap, uint64), 10, 1); + 622: 008b8913 addi s2,s7,8 + 626: 4685 li a3,1 + 628: 4629 li a2,10 + 62a: 000bb583 ld a1,0(s7) + 62e: 855a mv a0,s6 + 630: dfbff0ef jal 42a + i += 2; + 634: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 636: 8bca mv s7,s2 + state = 0; + 638: 4981 li s3,0 + i += 2; + 63a: bdd9 j 510 + printint(fd, va_arg(ap, uint32), 10, 0); + 63c: 008b8913 addi s2,s7,8 + 640: 4681 li a3,0 + 642: 4629 li a2,10 + 644: 000be583 lwu a1,0(s7) + 648: 855a mv a0,s6 + 64a: de1ff0ef jal 42a + 64e: 8bca mv s7,s2 + state = 0; + 650: 4981 li s3,0 + 652: bd7d j 510 + printint(fd, va_arg(ap, uint64), 10, 0); + 654: 008b8913 addi s2,s7,8 + 658: 4681 li a3,0 + 65a: 4629 li a2,10 + 65c: 000bb583 ld a1,0(s7) + 660: 855a mv a0,s6 + 662: dc9ff0ef jal 42a + i += 1; + 666: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 668: 8bca mv s7,s2 + state = 0; + 66a: 4981 li s3,0 + i += 1; + 66c: b555 j 510 + printint(fd, va_arg(ap, uint64), 10, 0); + 66e: 008b8913 addi s2,s7,8 + 672: 4681 li a3,0 + 674: 4629 li a2,10 + 676: 000bb583 ld a1,0(s7) + 67a: 855a mv a0,s6 + 67c: dafff0ef jal 42a + i += 2; + 680: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 682: 8bca mv s7,s2 + state = 0; + 684: 4981 li s3,0 + i += 2; + 686: b569 j 510 + printint(fd, va_arg(ap, uint32), 16, 0); + 688: 008b8913 addi s2,s7,8 + 68c: 4681 li a3,0 + 68e: 4641 li a2,16 + 690: 000be583 lwu a1,0(s7) + 694: 855a mv a0,s6 + 696: d95ff0ef jal 42a + 69a: 8bca mv s7,s2 + state = 0; + 69c: 4981 li s3,0 + 69e: bd8d j 510 + printint(fd, va_arg(ap, uint64), 16, 0); + 6a0: 008b8913 addi s2,s7,8 + 6a4: 4681 li a3,0 + 6a6: 4641 li a2,16 + 6a8: 000bb583 ld a1,0(s7) + 6ac: 855a mv a0,s6 + 6ae: d7dff0ef jal 42a + i += 1; + 6b2: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 6b4: 8bca mv s7,s2 + state = 0; + 6b6: 4981 li s3,0 + i += 1; + 6b8: bda1 j 510 + 6ba: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 6bc: 008b8d13 addi s10,s7,8 + 6c0: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 6c4: 03000593 li a1,48 + 6c8: 855a mv a0,s6 + 6ca: d43ff0ef jal 40c + putc(fd, 'x'); + 6ce: 07800593 li a1,120 + 6d2: 855a mv a0,s6 + 6d4: d39ff0ef jal 40c + 6d8: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 6da: 00000b97 auipc s7,0x0 + 6de: 2aeb8b93 addi s7,s7,686 # 988 + 6e2: 03c9d793 srli a5,s3,0x3c + 6e6: 97de add a5,a5,s7 + 6e8: 0007c583 lbu a1,0(a5) + 6ec: 855a mv a0,s6 + 6ee: d1fff0ef jal 40c + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 6f2: 0992 slli s3,s3,0x4 + 6f4: 397d addiw s2,s2,-1 + 6f6: fe0916e3 bnez s2,6e2 + printptr(fd, va_arg(ap, uint64)); + 6fa: 8bea mv s7,s10 + state = 0; + 6fc: 4981 li s3,0 + 6fe: 6d02 ld s10,0(sp) + 700: bd01 j 510 + putc(fd, va_arg(ap, uint32)); + 702: 008b8913 addi s2,s7,8 + 706: 000bc583 lbu a1,0(s7) + 70a: 855a mv a0,s6 + 70c: d01ff0ef jal 40c + 710: 8bca mv s7,s2 + state = 0; + 712: 4981 li s3,0 + 714: bbf5 j 510 + if((s = va_arg(ap, char*)) == 0) + 716: 008b8993 addi s3,s7,8 + 71a: 000bb903 ld s2,0(s7) + 71e: 00090f63 beqz s2,73c + for(; *s; s++) + 722: 00094583 lbu a1,0(s2) + 726: c195 beqz a1,74a + putc(fd, *s); + 728: 855a mv a0,s6 + 72a: ce3ff0ef jal 40c + for(; *s; s++) + 72e: 0905 addi s2,s2,1 + 730: 00094583 lbu a1,0(s2) + 734: f9f5 bnez a1,728 + if((s = va_arg(ap, char*)) == 0) + 736: 8bce mv s7,s3 + state = 0; + 738: 4981 li s3,0 + 73a: bbd9 j 510 + s = "(null)"; + 73c: 00000917 auipc s2,0x0 + 740: 24490913 addi s2,s2,580 # 980 + for(; *s; s++) + 744: 02800593 li a1,40 + 748: b7c5 j 728 + if((s = va_arg(ap, char*)) == 0) + 74a: 8bce mv s7,s3 + state = 0; + 74c: 4981 li s3,0 + 74e: b3c9 j 510 + 750: 64a6 ld s1,72(sp) + 752: 79e2 ld s3,56(sp) + 754: 7a42 ld s4,48(sp) + 756: 7aa2 ld s5,40(sp) + 758: 7b02 ld s6,32(sp) + 75a: 6be2 ld s7,24(sp) + 75c: 6c42 ld s8,16(sp) + 75e: 6ca2 ld s9,8(sp) + } + } +} + 760: 60e6 ld ra,88(sp) + 762: 6446 ld s0,80(sp) + 764: 6906 ld s2,64(sp) + 766: 6125 addi sp,sp,96 + 768: 8082 ret + +000000000000076a : + +void +fprintf(int fd, const char *fmt, ...) +{ + 76a: 715d addi sp,sp,-80 + 76c: ec06 sd ra,24(sp) + 76e: e822 sd s0,16(sp) + 770: 1000 addi s0,sp,32 + 772: e010 sd a2,0(s0) + 774: e414 sd a3,8(s0) + 776: e818 sd a4,16(s0) + 778: ec1c sd a5,24(s0) + 77a: 03043023 sd a6,32(s0) + 77e: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 782: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 786: 8622 mv a2,s0 + 788: d3fff0ef jal 4c6 +} + 78c: 60e2 ld ra,24(sp) + 78e: 6442 ld s0,16(sp) + 790: 6161 addi sp,sp,80 + 792: 8082 ret + +0000000000000794 : + +void +printf(const char *fmt, ...) +{ + 794: 711d addi sp,sp,-96 + 796: ec06 sd ra,24(sp) + 798: e822 sd s0,16(sp) + 79a: 1000 addi s0,sp,32 + 79c: e40c sd a1,8(s0) + 79e: e810 sd a2,16(s0) + 7a0: ec14 sd a3,24(s0) + 7a2: f018 sd a4,32(s0) + 7a4: f41c sd a5,40(s0) + 7a6: 03043823 sd a6,48(s0) + 7aa: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 7ae: 00840613 addi a2,s0,8 + 7b2: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 7b6: 85aa mv a1,a0 + 7b8: 4505 li a0,1 + 7ba: d0dff0ef jal 4c6 +} + 7be: 60e2 ld ra,24(sp) + 7c0: 6442 ld s0,16(sp) + 7c2: 6125 addi sp,sp,96 + 7c4: 8082 ret + +00000000000007c6 : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 7c6: 1141 addi sp,sp,-16 + 7c8: e422 sd s0,8(sp) + 7ca: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 7cc: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 7d0: 00001797 auipc a5,0x1 + 7d4: 8307b783 ld a5,-2000(a5) # 1000 + 7d8: a02d j 802 + 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; + 7da: 4618 lw a4,8(a2) + 7dc: 9f2d addw a4,a4,a1 + 7de: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 7e2: 6398 ld a4,0(a5) + 7e4: 6310 ld a2,0(a4) + 7e6: a83d j 824 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 7e8: ff852703 lw a4,-8(a0) + 7ec: 9f31 addw a4,a4,a2 + 7ee: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 7f0: ff053683 ld a3,-16(a0) + 7f4: a091 j 838 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 7f6: 6398 ld a4,0(a5) + 7f8: 00e7e463 bltu a5,a4,800 + 7fc: 00e6ea63 bltu a3,a4,810 +{ + 800: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 802: fed7fae3 bgeu a5,a3,7f6 + 806: 6398 ld a4,0(a5) + 808: 00e6e463 bltu a3,a4,810 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 80c: fee7eae3 bltu a5,a4,800 + if(bp + bp->s.size == p->s.ptr){ + 810: ff852583 lw a1,-8(a0) + 814: 6390 ld a2,0(a5) + 816: 02059813 slli a6,a1,0x20 + 81a: 01c85713 srli a4,a6,0x1c + 81e: 9736 add a4,a4,a3 + 820: fae60de3 beq a2,a4,7da + bp->s.ptr = p->s.ptr->s.ptr; + 824: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 828: 4790 lw a2,8(a5) + 82a: 02061593 slli a1,a2,0x20 + 82e: 01c5d713 srli a4,a1,0x1c + 832: 973e add a4,a4,a5 + 834: fae68ae3 beq a3,a4,7e8 + p->s.ptr = bp->s.ptr; + 838: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 83a: 00000717 auipc a4,0x0 + 83e: 7cf73323 sd a5,1990(a4) # 1000 +} + 842: 6422 ld s0,8(sp) + 844: 0141 addi sp,sp,16 + 846: 8082 ret + +0000000000000848 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 848: 7139 addi sp,sp,-64 + 84a: fc06 sd ra,56(sp) + 84c: f822 sd s0,48(sp) + 84e: f426 sd s1,40(sp) + 850: ec4e sd s3,24(sp) + 852: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 854: 02051493 slli s1,a0,0x20 + 858: 9081 srli s1,s1,0x20 + 85a: 04bd addi s1,s1,15 + 85c: 8091 srli s1,s1,0x4 + 85e: 0014899b addiw s3,s1,1 + 862: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 864: 00000517 auipc a0,0x0 + 868: 79c53503 ld a0,1948(a0) # 1000 + 86c: c915 beqz a0,8a0 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 86e: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 870: 4798 lw a4,8(a5) + 872: 08977a63 bgeu a4,s1,906 + 876: f04a sd s2,32(sp) + 878: e852 sd s4,16(sp) + 87a: e456 sd s5,8(sp) + 87c: e05a sd s6,0(sp) + if(nu < 4096) + 87e: 8a4e mv s4,s3 + 880: 0009871b sext.w a4,s3 + 884: 6685 lui a3,0x1 + 886: 00d77363 bgeu a4,a3,88c + 88a: 6a05 lui s4,0x1 + 88c: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 890: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 894: 00000917 auipc s2,0x0 + 898: 76c90913 addi s2,s2,1900 # 1000 + if(p == SBRK_ERROR) + 89c: 5afd li s5,-1 + 89e: a081 j 8de + 8a0: f04a sd s2,32(sp) + 8a2: e852 sd s4,16(sp) + 8a4: e456 sd s5,8(sp) + 8a6: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 8a8: 00000797 auipc a5,0x0 + 8ac: 76878793 addi a5,a5,1896 # 1010 + 8b0: 00000717 auipc a4,0x0 + 8b4: 74f73823 sd a5,1872(a4) # 1000 + 8b8: e39c sd a5,0(a5) + base.s.size = 0; + 8ba: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 8be: b7c1 j 87e + prevp->s.ptr = p->s.ptr; + 8c0: 6398 ld a4,0(a5) + 8c2: e118 sd a4,0(a0) + 8c4: a8a9 j 91e + hp->s.size = nu; + 8c6: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 8ca: 0541 addi a0,a0,16 + 8cc: efbff0ef jal 7c6 + return freep; + 8d0: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 8d4: c12d beqz a0,936 + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8d6: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8d8: 4798 lw a4,8(a5) + 8da: 02977263 bgeu a4,s1,8fe + if(p == freep) + 8de: 00093703 ld a4,0(s2) + 8e2: 853e mv a0,a5 + 8e4: fef719e3 bne a4,a5,8d6 + p = sbrk(nu * sizeof(Header)); + 8e8: 8552 mv a0,s4 + 8ea: a4fff0ef jal 338 + if(p == SBRK_ERROR) + 8ee: fd551ce3 bne a0,s5,8c6 + return 0; + 8f2: 4501 li a0,0 + 8f4: 7902 ld s2,32(sp) + 8f6: 6a42 ld s4,16(sp) + 8f8: 6aa2 ld s5,8(sp) + 8fa: 6b02 ld s6,0(sp) + 8fc: a03d j 92a + 8fe: 7902 ld s2,32(sp) + 900: 6a42 ld s4,16(sp) + 902: 6aa2 ld s5,8(sp) + 904: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 906: fae48de3 beq s1,a4,8c0 + p->s.size -= nunits; + 90a: 4137073b subw a4,a4,s3 + 90e: c798 sw a4,8(a5) + p += p->s.size; + 910: 02071693 slli a3,a4,0x20 + 914: 01c6d713 srli a4,a3,0x1c + 918: 97ba add a5,a5,a4 + p->s.size = nunits; + 91a: 0137a423 sw s3,8(a5) + freep = prevp; + 91e: 00000717 auipc a4,0x0 + 922: 6ea73123 sd a0,1762(a4) # 1000 + return (void*)(p + 1); + 926: 01078513 addi a0,a5,16 + } +} + 92a: 70e2 ld ra,56(sp) + 92c: 7442 ld s0,48(sp) + 92e: 74a2 ld s1,40(sp) + 930: 69e2 ld s3,24(sp) + 932: 6121 addi sp,sp,64 + 934: 8082 ret + 936: 7902 ld s2,32(sp) + 938: 6a42 ld s4,16(sp) + 93a: 6aa2 ld s5,8(sp) + 93c: 6b02 ld s6,0(sp) + 93e: b7f5 j 92a diff --git a/G12_Project2_2/user/stressfs.c b/G12_Project2_2/user/stressfs.c new file mode 100644 index 0000000000..247a7a5035 --- /dev/null +++ b/G12_Project2_2/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/types.h" +#include "kernel/stat.h" +#include "user/user.h" +#include "kernel/fs.h" +#include "kernel/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/G12_Project2_2/user/stressfs.d b/G12_Project2_2/user/stressfs.d new file mode 100644 index 0000000000..027fba3704 --- /dev/null +++ b/G12_Project2_2/user/stressfs.d @@ -0,0 +1,2 @@ +user/stressfs.o: user/stressfs.c kernel/types.h kernel/stat.h user/user.h \ + kernel/fs.h kernel/fcntl.h diff --git a/G12_Project2_2/user/stressfs.o b/G12_Project2_2/user/stressfs.o new file mode 100644 index 0000000000..7fc1582e6a Binary files /dev/null and b/G12_Project2_2/user/stressfs.o differ diff --git a/G12_Project2_2/user/stressfs.sym b/G12_Project2_2/user/stressfs.sym new file mode 100644 index 0000000000..8e789bc227 --- /dev/null +++ b/G12_Project2_2/user/stressfs.sym @@ -0,0 +1,65 @@ +0000000000000000 .text +0000000000000940 .rodata +00000000000009a0 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 stressfs.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +000000000000040c putc +000000000000042a printint +0000000000000988 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +00000000000000e8 strcpy +00000000000003fc pause +0000000000000794 printf +00000000000003f4 sys_sbrk +0000000000000292 memmove +00000000000003b4 mknod +00000000000001a0 gets +00000000000003ec getpid +0000000000000324 memcpy +0000000000000848 malloc +000000000000034e sbrklazy +000000000000037c pipe +000000000000038c write +00000000000003c4 fstat +000000000000076a fprintf +000000000000039c kill +00000000000004c6 vprintf +00000000000003dc chdir +00000000000003a4 exec +0000000000000374 wait +0000000000000384 read +00000000000003bc unlink +00000000000002ea memcmp +0000000000000364 fork +0000000000000338 sbrk +0000000000000404 uptime +000000000000015a memset +0000000000000000 main +0000000000000104 strcmp +00000000000003e4 dup +0000000000000210 stat +00000000000003cc link +000000000000036c exit +00000000000000d8 start +000000000000024a atoi +0000000000000130 strlen +00000000000003ac open +000000000000017c strchr +00000000000003d4 mkdir +0000000000000394 close +00000000000007c6 free diff --git a/G12_Project2_2/user/ulib.c b/G12_Project2_2/user/ulib.c new file mode 100644 index 0000000000..45fadb087d --- /dev/null +++ b/G12_Project2_2/user/ulib.c @@ -0,0 +1,161 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "kernel/fcntl.h" +#include "kernel/riscv.h" +#include "kernel/vm.h" +#include "user/user.h" + +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + exit(r); +} + +char* +strcpy(char *s, const char *t) +{ + char *os; + + os = s; + while((*s++ = *t++) != 0) + ; + 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; + + n = 0; + while('0' <= *s && *s <= '9') + n = n*10 + *s++ - '0'; + return n; +} + +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); +} + +char * +sbrk(int n) { + return sys_sbrk(n, SBRK_EAGER); +} + +char * +sbrklazy(int n) { + return sys_sbrk(n, SBRK_LAZY); +} + diff --git a/G12_Project2_2/user/ulib.d b/G12_Project2_2/user/ulib.d new file mode 100644 index 0000000000..fa219061b6 --- /dev/null +++ b/G12_Project2_2/user/ulib.d @@ -0,0 +1,2 @@ +user/ulib.o: user/ulib.c kernel/types.h kernel/stat.h kernel/fcntl.h \ + kernel/riscv.h kernel/vm.h user/user.h diff --git a/G12_Project2_2/user/ulib.o b/G12_Project2_2/user/ulib.o new file mode 100644 index 0000000000..ffe5141012 Binary files /dev/null and b/G12_Project2_2/user/ulib.o differ diff --git a/G12_Project2_2/user/umalloc.c b/G12_Project2_2/user/umalloc.c new file mode 100644 index 0000000000..2ac6894278 --- /dev/null +++ b/G12_Project2_2/user/umalloc.c @@ -0,0 +1,90 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "user/user.h" +#include "kernel/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 == SBRK_ERROR) + 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/G12_Project2_2/user/umalloc.d b/G12_Project2_2/user/umalloc.d new file mode 100644 index 0000000000..b03b5c2edc --- /dev/null +++ b/G12_Project2_2/user/umalloc.d @@ -0,0 +1,2 @@ +user/umalloc.o: user/umalloc.c kernel/types.h kernel/stat.h user/user.h \ + kernel/param.h diff --git a/G12_Project2_2/user/umalloc.o b/G12_Project2_2/user/umalloc.o new file mode 100644 index 0000000000..7876fb1224 Binary files /dev/null and b/G12_Project2_2/user/umalloc.o differ diff --git a/user/user.h b/G12_Project2_2/user/user.h similarity index 100% rename from user/user.h rename to G12_Project2_2/user/user.h diff --git a/G12_Project2_2/user/user.ld b/G12_Project2_2/user/user.ld new file mode 100644 index 0000000000..3da93e00d5 --- /dev/null +++ b/G12_Project2_2/user/user.ld @@ -0,0 +1,39 @@ +OUTPUT_ARCH( "riscv" ) + +SECTIONS +{ + . = 0x0; + + .text : { + *(.text .text.*) + } + + .rodata : { + . = ALIGN(16); + *(.srodata .srodata.*) /* do not need to distinguish this from .rodata */ + . = ALIGN(16); + *(.rodata .rodata.*) + } + + .eh_frame : { + *(.eh_frame) + *(.eh_frame.*) + } + + . = ALIGN(0x1000); + .data : { + . = ALIGN(16); + *(.sdata .sdata.*) /* do not need to distinguish this from .data */ + . = ALIGN(16); + *(.data .data.*) + } + + .bss : { + . = ALIGN(16); + *(.sbss .sbss.*) /* do not need to distinguish this from .bss */ + . = ALIGN(16); + *(.bss .bss.*) + } + + PROVIDE(end = .); +} diff --git a/G12_Project2_2/user/usertests.asm b/G12_Project2_2/user/usertests.asm new file mode 100644 index 0000000000..be46dfe8ad --- /dev/null +++ b/G12_Project2_2/user/usertests.asm @@ -0,0 +1,9913 @@ + +user/_usertests: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : +} + +// what if you pass ridiculous string pointers to system calls? +void +copyinstr1(char *s) +{ + 0: 711d addi sp,sp,-96 + 2: ec86 sd ra,88(sp) + 4: e8a2 sd s0,80(sp) + 6: e4a6 sd s1,72(sp) + 8: e0ca sd s2,64(sp) + a: fc4e sd s3,56(sp) + c: 1080 addi s0,sp,96 + uint64 addrs[] = { 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + e: 00008797 auipc a5,0x8 + 12: 8c278793 addi a5,a5,-1854 # 78d0 + 16: 638c ld a1,0(a5) + 18: 6790 ld a2,8(a5) + 1a: 6b94 ld a3,16(a5) + 1c: 6f98 ld a4,24(a5) + 1e: 739c ld a5,32(a5) + 20: fab43423 sd a1,-88(s0) + 24: fac43823 sd a2,-80(s0) + 28: fad43c23 sd a3,-72(s0) + 2c: fce43023 sd a4,-64(s0) + 30: fcf43423 sd a5,-56(s0) + 0xffffffffffffffff }; + + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 34: fa840493 addi s1,s0,-88 + 38: fd040993 addi s3,s0,-48 + uint64 addr = addrs[ai]; + + int fd = open((char *)addr, O_CREATE|O_WRONLY); + 3c: 0004b903 ld s2,0(s1) + 40: 20100593 li a1,513 + 44: 854a mv a0,s2 + 46: 56f040ef jal 4db4 + if(fd >= 0){ + 4a: 00055c63 bgez a0,62 + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 4e: 04a1 addi s1,s1,8 + 50: ff3496e3 bne s1,s3,3c + printf("open(%p) returned %d, not -1\n", (void*)addr, fd); + exit(1); + } + } +} + 54: 60e6 ld ra,88(sp) + 56: 6446 ld s0,80(sp) + 58: 64a6 ld s1,72(sp) + 5a: 6906 ld s2,64(sp) + 5c: 79e2 ld s3,56(sp) + 5e: 6125 addi sp,sp,96 + 60: 8082 ret + printf("open(%p) returned %d, not -1\n", (void*)addr, fd); + 62: 862a mv a2,a0 + 64: 85ca mv a1,s2 + 66: 00005517 auipc a0,0x5 + 6a: 2ea50513 addi a0,a0,746 # 5350 + 6e: 12e050ef jal 519c + exit(1); + 72: 4505 li a0,1 + 74: 501040ef jal 4d74 + +0000000000000078 : +void +bsstest(char *s) +{ + int i; + + for(i = 0; i < sizeof(uninit); i++){ + 78: 0000a797 auipc a5,0xa + 7c: 53078793 addi a5,a5,1328 # a5a8 + 80: 0000d697 auipc a3,0xd + 84: c3868693 addi a3,a3,-968 # ccb8 + if(uninit[i] != '\0'){ + 88: 0007c703 lbu a4,0(a5) + 8c: e709 bnez a4,96 + for(i = 0; i < sizeof(uninit); i++){ + 8e: 0785 addi a5,a5,1 + 90: fed79ce3 bne a5,a3,88 + 94: 8082 ret +{ + 96: 1141 addi sp,sp,-16 + 98: e406 sd ra,8(sp) + 9a: e022 sd s0,0(sp) + 9c: 0800 addi s0,sp,16 + printf("%s: bss test failed\n", s); + 9e: 85aa mv a1,a0 + a0: 00005517 auipc a0,0x5 + a4: 2d050513 addi a0,a0,720 # 5370 + a8: 0f4050ef jal 519c + exit(1); + ac: 4505 li a0,1 + ae: 4c7040ef jal 4d74 + +00000000000000b2 : +{ + b2: 1101 addi sp,sp,-32 + b4: ec06 sd ra,24(sp) + b6: e822 sd s0,16(sp) + b8: e426 sd s1,8(sp) + ba: 1000 addi s0,sp,32 + bc: 84aa mv s1,a0 + fd = open("echo", 0); + be: 4581 li a1,0 + c0: 00005517 auipc a0,0x5 + c4: 2c850513 addi a0,a0,712 # 5388 + c8: 4ed040ef jal 4db4 + if(fd < 0){ + cc: 02054263 bltz a0,f0 + close(fd); + d0: 4cd040ef jal 4d9c + fd = open("doesnotexist", 0); + d4: 4581 li a1,0 + d6: 00005517 auipc a0,0x5 + da: 2d250513 addi a0,a0,722 # 53a8 + de: 4d7040ef jal 4db4 + if(fd >= 0){ + e2: 02055163 bgez a0,104 +} + e6: 60e2 ld ra,24(sp) + e8: 6442 ld s0,16(sp) + ea: 64a2 ld s1,8(sp) + ec: 6105 addi sp,sp,32 + ee: 8082 ret + printf("%s: open echo failed!\n", s); + f0: 85a6 mv a1,s1 + f2: 00005517 auipc a0,0x5 + f6: 29e50513 addi a0,a0,670 # 5390 + fa: 0a2050ef jal 519c + exit(1); + fe: 4505 li a0,1 + 100: 475040ef jal 4d74 + printf("%s: open doesnotexist succeeded!\n", s); + 104: 85a6 mv a1,s1 + 106: 00005517 auipc a0,0x5 + 10a: 2b250513 addi a0,a0,690 # 53b8 + 10e: 08e050ef jal 519c + exit(1); + 112: 4505 li a0,1 + 114: 461040ef jal 4d74 + +0000000000000118 : +{ + 118: 7179 addi sp,sp,-48 + 11a: f406 sd ra,40(sp) + 11c: f022 sd s0,32(sp) + 11e: ec26 sd s1,24(sp) + 120: e84a sd s2,16(sp) + 122: e44e sd s3,8(sp) + 124: 1800 addi s0,sp,48 + 126: 89aa mv s3,a0 + unlink("truncfile"); + 128: 00005517 auipc a0,0x5 + 12c: 2b850513 addi a0,a0,696 # 53e0 + 130: 495040ef jal 4dc4 + int fd1 = open("truncfile", O_CREATE|O_TRUNC|O_WRONLY); + 134: 60100593 li a1,1537 + 138: 00005517 auipc a0,0x5 + 13c: 2a850513 addi a0,a0,680 # 53e0 + 140: 475040ef jal 4db4 + 144: 84aa mv s1,a0 + write(fd1, "abcd", 4); + 146: 4611 li a2,4 + 148: 00005597 auipc a1,0x5 + 14c: 2a858593 addi a1,a1,680 # 53f0 + 150: 445040ef jal 4d94 + int fd2 = open("truncfile", O_TRUNC|O_WRONLY); + 154: 40100593 li a1,1025 + 158: 00005517 auipc a0,0x5 + 15c: 28850513 addi a0,a0,648 # 53e0 + 160: 455040ef jal 4db4 + 164: 892a mv s2,a0 + int n = write(fd1, "x", 1); + 166: 4605 li a2,1 + 168: 00005597 auipc a1,0x5 + 16c: 29058593 addi a1,a1,656 # 53f8 + 170: 8526 mv a0,s1 + 172: 423040ef jal 4d94 + if(n != -1){ + 176: 57fd li a5,-1 + 178: 02f51563 bne a0,a5,1a2 + unlink("truncfile"); + 17c: 00005517 auipc a0,0x5 + 180: 26450513 addi a0,a0,612 # 53e0 + 184: 441040ef jal 4dc4 + close(fd1); + 188: 8526 mv a0,s1 + 18a: 413040ef jal 4d9c + close(fd2); + 18e: 854a mv a0,s2 + 190: 40d040ef jal 4d9c +} + 194: 70a2 ld ra,40(sp) + 196: 7402 ld s0,32(sp) + 198: 64e2 ld s1,24(sp) + 19a: 6942 ld s2,16(sp) + 19c: 69a2 ld s3,8(sp) + 19e: 6145 addi sp,sp,48 + 1a0: 8082 ret + printf("%s: write returned %d, expected -1\n", s, n); + 1a2: 862a mv a2,a0 + 1a4: 85ce mv a1,s3 + 1a6: 00005517 auipc a0,0x5 + 1aa: 25a50513 addi a0,a0,602 # 5400 + 1ae: 7ef040ef jal 519c + exit(1); + 1b2: 4505 li a0,1 + 1b4: 3c1040ef jal 4d74 + +00000000000001b8 : +{ + 1b8: 7179 addi sp,sp,-48 + 1ba: f406 sd ra,40(sp) + 1bc: f022 sd s0,32(sp) + 1be: ec26 sd s1,24(sp) + 1c0: e84a sd s2,16(sp) + 1c2: 1800 addi s0,sp,48 + name[0] = 'a'; + 1c4: 06100793 li a5,97 + 1c8: fcf40c23 sb a5,-40(s0) + name[2] = '\0'; + 1cc: fc040d23 sb zero,-38(s0) + 1d0: 03000493 li s1,48 + for(i = 0; i < N; i++){ + 1d4: 06400913 li s2,100 + name[1] = '0' + i; + 1d8: fc940ca3 sb s1,-39(s0) + fd = open(name, O_CREATE|O_RDWR); + 1dc: 20200593 li a1,514 + 1e0: fd840513 addi a0,s0,-40 + 1e4: 3d1040ef jal 4db4 + close(fd); + 1e8: 3b5040ef jal 4d9c + for(i = 0; i < N; i++){ + 1ec: 2485 addiw s1,s1,1 + 1ee: 0ff4f493 zext.b s1,s1 + 1f2: ff2493e3 bne s1,s2,1d8 + name[0] = 'a'; + 1f6: 06100793 li a5,97 + 1fa: fcf40c23 sb a5,-40(s0) + name[2] = '\0'; + 1fe: fc040d23 sb zero,-38(s0) + 202: 03000493 li s1,48 + for(i = 0; i < N; i++){ + 206: 06400913 li s2,100 + name[1] = '0' + i; + 20a: fc940ca3 sb s1,-39(s0) + unlink(name); + 20e: fd840513 addi a0,s0,-40 + 212: 3b3040ef jal 4dc4 + for(i = 0; i < N; i++){ + 216: 2485 addiw s1,s1,1 + 218: 0ff4f493 zext.b s1,s1 + 21c: ff2497e3 bne s1,s2,20a +} + 220: 70a2 ld ra,40(sp) + 222: 7402 ld s0,32(sp) + 224: 64e2 ld s1,24(sp) + 226: 6942 ld s2,16(sp) + 228: 6145 addi sp,sp,48 + 22a: 8082 ret + +000000000000022c : +{ + 22c: 715d addi sp,sp,-80 + 22e: e486 sd ra,72(sp) + 230: e0a2 sd s0,64(sp) + 232: fc26 sd s1,56(sp) + 234: f84a sd s2,48(sp) + 236: f44e sd s3,40(sp) + 238: f052 sd s4,32(sp) + 23a: ec56 sd s5,24(sp) + 23c: e85a sd s6,16(sp) + 23e: e45e sd s7,8(sp) + 240: 0880 addi s0,sp,80 + 242: 8baa mv s7,a0 + unlink("bigwrite"); + 244: 00005517 auipc a0,0x5 + 248: 1e450513 addi a0,a0,484 # 5428 + 24c: 379040ef jal 4dc4 + for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ + 250: 1f300493 li s1,499 + fd = open("bigwrite", O_CREATE | O_RDWR); + 254: 00005a97 auipc s5,0x5 + 258: 1d4a8a93 addi s5,s5,468 # 5428 + int cc = write(fd, buf, sz); + 25c: 0000da17 auipc s4,0xd + 260: a5ca0a13 addi s4,s4,-1444 # ccb8 + for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ + 264: 6b0d lui s6,0x3 + 266: 1c9b0b13 addi s6,s6,457 # 31c9 + fd = open("bigwrite", O_CREATE | O_RDWR); + 26a: 20200593 li a1,514 + 26e: 8556 mv a0,s5 + 270: 345040ef jal 4db4 + 274: 892a mv s2,a0 + if(fd < 0){ + 276: 04054563 bltz a0,2c0 + int cc = write(fd, buf, sz); + 27a: 8626 mv a2,s1 + 27c: 85d2 mv a1,s4 + 27e: 317040ef jal 4d94 + 282: 89aa mv s3,a0 + if(cc != sz){ + 284: 04a49863 bne s1,a0,2d4 + int cc = write(fd, buf, sz); + 288: 8626 mv a2,s1 + 28a: 85d2 mv a1,s4 + 28c: 854a mv a0,s2 + 28e: 307040ef jal 4d94 + if(cc != sz){ + 292: 04951263 bne a0,s1,2d6 + close(fd); + 296: 854a mv a0,s2 + 298: 305040ef jal 4d9c + unlink("bigwrite"); + 29c: 8556 mv a0,s5 + 29e: 327040ef jal 4dc4 + for(sz = 499; sz < (MAXOPBLOCKS+2)*BSIZE; sz += 471){ + 2a2: 1d74849b addiw s1,s1,471 + 2a6: fd6492e3 bne s1,s6,26a +} + 2aa: 60a6 ld ra,72(sp) + 2ac: 6406 ld s0,64(sp) + 2ae: 74e2 ld s1,56(sp) + 2b0: 7942 ld s2,48(sp) + 2b2: 79a2 ld s3,40(sp) + 2b4: 7a02 ld s4,32(sp) + 2b6: 6ae2 ld s5,24(sp) + 2b8: 6b42 ld s6,16(sp) + 2ba: 6ba2 ld s7,8(sp) + 2bc: 6161 addi sp,sp,80 + 2be: 8082 ret + printf("%s: cannot create bigwrite\n", s); + 2c0: 85de mv a1,s7 + 2c2: 00005517 auipc a0,0x5 + 2c6: 17650513 addi a0,a0,374 # 5438 + 2ca: 6d3040ef jal 519c + exit(1); + 2ce: 4505 li a0,1 + 2d0: 2a5040ef jal 4d74 + if(cc != sz){ + 2d4: 89a6 mv s3,s1 + printf("%s: write(%d) ret %d\n", s, sz, cc); + 2d6: 86aa mv a3,a0 + 2d8: 864e mv a2,s3 + 2da: 85de mv a1,s7 + 2dc: 00005517 auipc a0,0x5 + 2e0: 17c50513 addi a0,a0,380 # 5458 + 2e4: 6b9040ef jal 519c + exit(1); + 2e8: 4505 li a0,1 + 2ea: 28b040ef jal 4d74 + +00000000000002ee : +// file is deleted? if the kernel has this bug, it will panic: balloc: +// out of blocks. assumed_free may need to be raised to be more than +// the number of free blocks. this test takes a long time. +void +badwrite(char *s) +{ + 2ee: 7179 addi sp,sp,-48 + 2f0: f406 sd ra,40(sp) + 2f2: f022 sd s0,32(sp) + 2f4: ec26 sd s1,24(sp) + 2f6: e84a sd s2,16(sp) + 2f8: e44e sd s3,8(sp) + 2fa: e052 sd s4,0(sp) + 2fc: 1800 addi s0,sp,48 + int assumed_free = 600; + + unlink("junk"); + 2fe: 00005517 auipc a0,0x5 + 302: 17250513 addi a0,a0,370 # 5470 + 306: 2bf040ef jal 4dc4 + 30a: 25800913 li s2,600 + for(int i = 0; i < assumed_free; i++){ + int fd = open("junk", O_CREATE|O_WRONLY); + 30e: 00005997 auipc s3,0x5 + 312: 16298993 addi s3,s3,354 # 5470 + if(fd < 0){ + printf("open junk failed\n"); + exit(1); + } + write(fd, (char*)0xffffffffffL, 1); + 316: 5a7d li s4,-1 + 318: 018a5a13 srli s4,s4,0x18 + int fd = open("junk", O_CREATE|O_WRONLY); + 31c: 20100593 li a1,513 + 320: 854e mv a0,s3 + 322: 293040ef jal 4db4 + 326: 84aa mv s1,a0 + if(fd < 0){ + 328: 04054d63 bltz a0,382 + write(fd, (char*)0xffffffffffL, 1); + 32c: 4605 li a2,1 + 32e: 85d2 mv a1,s4 + 330: 265040ef jal 4d94 + close(fd); + 334: 8526 mv a0,s1 + 336: 267040ef jal 4d9c + unlink("junk"); + 33a: 854e mv a0,s3 + 33c: 289040ef jal 4dc4 + for(int i = 0; i < assumed_free; i++){ + 340: 397d addiw s2,s2,-1 + 342: fc091de3 bnez s2,31c + } + + int fd = open("junk", O_CREATE|O_WRONLY); + 346: 20100593 li a1,513 + 34a: 00005517 auipc a0,0x5 + 34e: 12650513 addi a0,a0,294 # 5470 + 352: 263040ef jal 4db4 + 356: 84aa mv s1,a0 + if(fd < 0){ + 358: 02054e63 bltz a0,394 + printf("open junk failed\n"); + exit(1); + } + if(write(fd, "x", 1) != 1){ + 35c: 4605 li a2,1 + 35e: 00005597 auipc a1,0x5 + 362: 09a58593 addi a1,a1,154 # 53f8 + 366: 22f040ef jal 4d94 + 36a: 4785 li a5,1 + 36c: 02f50d63 beq a0,a5,3a6 + printf("write failed\n"); + 370: 00005517 auipc a0,0x5 + 374: 12050513 addi a0,a0,288 # 5490 + 378: 625040ef jal 519c + exit(1); + 37c: 4505 li a0,1 + 37e: 1f7040ef jal 4d74 + printf("open junk failed\n"); + 382: 00005517 auipc a0,0x5 + 386: 0f650513 addi a0,a0,246 # 5478 + 38a: 613040ef jal 519c + exit(1); + 38e: 4505 li a0,1 + 390: 1e5040ef jal 4d74 + printf("open junk failed\n"); + 394: 00005517 auipc a0,0x5 + 398: 0e450513 addi a0,a0,228 # 5478 + 39c: 601040ef jal 519c + exit(1); + 3a0: 4505 li a0,1 + 3a2: 1d3040ef jal 4d74 + } + close(fd); + 3a6: 8526 mv a0,s1 + 3a8: 1f5040ef jal 4d9c + unlink("junk"); + 3ac: 00005517 auipc a0,0x5 + 3b0: 0c450513 addi a0,a0,196 # 5470 + 3b4: 211040ef jal 4dc4 + + exit(0); + 3b8: 4501 li a0,0 + 3ba: 1bb040ef jal 4d74 + +00000000000003be : + } +} + +void +outofinodes(char *s) +{ + 3be: 715d addi sp,sp,-80 + 3c0: e486 sd ra,72(sp) + 3c2: e0a2 sd s0,64(sp) + 3c4: fc26 sd s1,56(sp) + 3c6: f84a sd s2,48(sp) + 3c8: f44e sd s3,40(sp) + 3ca: 0880 addi s0,sp,80 + int nzz = 32*32; + for(int i = 0; i < nzz; i++){ + 3cc: 4481 li s1,0 + char name[32]; + name[0] = 'z'; + 3ce: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 3d2: 40000993 li s3,1024 + name[0] = 'z'; + 3d6: fb240823 sb s2,-80(s0) + name[1] = 'z'; + 3da: fb2408a3 sb s2,-79(s0) + name[2] = '0' + (i / 32); + 3de: 41f4d71b sraiw a4,s1,0x1f + 3e2: 01b7571b srliw a4,a4,0x1b + 3e6: 009707bb addw a5,a4,s1 + 3ea: 4057d69b sraiw a3,a5,0x5 + 3ee: 0306869b addiw a3,a3,48 + 3f2: fad40923 sb a3,-78(s0) + name[3] = '0' + (i % 32); + 3f6: 8bfd andi a5,a5,31 + 3f8: 9f99 subw a5,a5,a4 + 3fa: 0307879b addiw a5,a5,48 + 3fe: faf409a3 sb a5,-77(s0) + name[4] = '\0'; + 402: fa040a23 sb zero,-76(s0) + unlink(name); + 406: fb040513 addi a0,s0,-80 + 40a: 1bb040ef jal 4dc4 + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + 40e: 60200593 li a1,1538 + 412: fb040513 addi a0,s0,-80 + 416: 19f040ef jal 4db4 + if(fd < 0){ + 41a: 00054763 bltz a0,428 + // failure is eventually expected. + break; + } + close(fd); + 41e: 17f040ef jal 4d9c + for(int i = 0; i < nzz; i++){ + 422: 2485 addiw s1,s1,1 + 424: fb3499e3 bne s1,s3,3d6 + 428: 4481 li s1,0 + } + + for(int i = 0; i < nzz; i++){ + char name[32]; + name[0] = 'z'; + 42a: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 42e: 40000993 li s3,1024 + name[0] = 'z'; + 432: fb240823 sb s2,-80(s0) + name[1] = 'z'; + 436: fb2408a3 sb s2,-79(s0) + name[2] = '0' + (i / 32); + 43a: 41f4d71b sraiw a4,s1,0x1f + 43e: 01b7571b srliw a4,a4,0x1b + 442: 009707bb addw a5,a4,s1 + 446: 4057d69b sraiw a3,a5,0x5 + 44a: 0306869b addiw a3,a3,48 + 44e: fad40923 sb a3,-78(s0) + name[3] = '0' + (i % 32); + 452: 8bfd andi a5,a5,31 + 454: 9f99 subw a5,a5,a4 + 456: 0307879b addiw a5,a5,48 + 45a: faf409a3 sb a5,-77(s0) + name[4] = '\0'; + 45e: fa040a23 sb zero,-76(s0) + unlink(name); + 462: fb040513 addi a0,s0,-80 + 466: 15f040ef jal 4dc4 + for(int i = 0; i < nzz; i++){ + 46a: 2485 addiw s1,s1,1 + 46c: fd3493e3 bne s1,s3,432 + } +} + 470: 60a6 ld ra,72(sp) + 472: 6406 ld s0,64(sp) + 474: 74e2 ld s1,56(sp) + 476: 7942 ld s2,48(sp) + 478: 79a2 ld s3,40(sp) + 47a: 6161 addi sp,sp,80 + 47c: 8082 ret + +000000000000047e : +{ + 47e: 7159 addi sp,sp,-112 + 480: f486 sd ra,104(sp) + 482: f0a2 sd s0,96(sp) + 484: eca6 sd s1,88(sp) + 486: e8ca sd s2,80(sp) + 488: e4ce sd s3,72(sp) + 48a: e0d2 sd s4,64(sp) + 48c: fc56 sd s5,56(sp) + 48e: 1880 addi s0,sp,112 + uint64 addrs[] = { 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 490: 00007797 auipc a5,0x7 + 494: 44078793 addi a5,a5,1088 # 78d0 + 498: 638c ld a1,0(a5) + 49a: 6790 ld a2,8(a5) + 49c: 6b94 ld a3,16(a5) + 49e: 6f98 ld a4,24(a5) + 4a0: 739c ld a5,32(a5) + 4a2: f8b43c23 sd a1,-104(s0) + 4a6: fac43023 sd a2,-96(s0) + 4aa: fad43423 sd a3,-88(s0) + 4ae: fae43823 sd a4,-80(s0) + 4b2: faf43c23 sd a5,-72(s0) + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 4b6: f9840913 addi s2,s0,-104 + 4ba: fc040a93 addi s5,s0,-64 + int fd = open("copyin1", O_CREATE|O_WRONLY); + 4be: 00005a17 auipc s4,0x5 + 4c2: fe2a0a13 addi s4,s4,-30 # 54a0 + uint64 addr = addrs[ai]; + 4c6: 00093983 ld s3,0(s2) + int fd = open("copyin1", O_CREATE|O_WRONLY); + 4ca: 20100593 li a1,513 + 4ce: 8552 mv a0,s4 + 4d0: 0e5040ef jal 4db4 + 4d4: 84aa mv s1,a0 + if(fd < 0){ + 4d6: 06054763 bltz a0,544 + int n = write(fd, (void*)addr, 8192); + 4da: 6609 lui a2,0x2 + 4dc: 85ce mv a1,s3 + 4de: 0b7040ef jal 4d94 + if(n >= 0){ + 4e2: 06055a63 bgez a0,556 + close(fd); + 4e6: 8526 mv a0,s1 + 4e8: 0b5040ef jal 4d9c + unlink("copyin1"); + 4ec: 8552 mv a0,s4 + 4ee: 0d7040ef jal 4dc4 + n = write(1, (char*)addr, 8192); + 4f2: 6609 lui a2,0x2 + 4f4: 85ce mv a1,s3 + 4f6: 4505 li a0,1 + 4f8: 09d040ef jal 4d94 + if(n > 0){ + 4fc: 06a04863 bgtz a0,56c + if(pipe(fds) < 0){ + 500: f9040513 addi a0,s0,-112 + 504: 081040ef jal 4d84 + 508: 06054d63 bltz a0,582 + n = write(fds[1], (char*)addr, 8192); + 50c: 6609 lui a2,0x2 + 50e: 85ce mv a1,s3 + 510: f9442503 lw a0,-108(s0) + 514: 081040ef jal 4d94 + if(n > 0){ + 518: 06a04e63 bgtz a0,594 + close(fds[0]); + 51c: f9042503 lw a0,-112(s0) + 520: 07d040ef jal 4d9c + close(fds[1]); + 524: f9442503 lw a0,-108(s0) + 528: 075040ef jal 4d9c + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 52c: 0921 addi s2,s2,8 + 52e: f9591ce3 bne s2,s5,4c6 +} + 532: 70a6 ld ra,104(sp) + 534: 7406 ld s0,96(sp) + 536: 64e6 ld s1,88(sp) + 538: 6946 ld s2,80(sp) + 53a: 69a6 ld s3,72(sp) + 53c: 6a06 ld s4,64(sp) + 53e: 7ae2 ld s5,56(sp) + 540: 6165 addi sp,sp,112 + 542: 8082 ret + printf("open(copyin1) failed\n"); + 544: 00005517 auipc a0,0x5 + 548: f6450513 addi a0,a0,-156 # 54a8 + 54c: 451040ef jal 519c + exit(1); + 550: 4505 li a0,1 + 552: 023040ef jal 4d74 + printf("write(fd, %p, 8192) returned %d, not -1\n", (void*)addr, n); + 556: 862a mv a2,a0 + 558: 85ce mv a1,s3 + 55a: 00005517 auipc a0,0x5 + 55e: f6650513 addi a0,a0,-154 # 54c0 + 562: 43b040ef jal 519c + exit(1); + 566: 4505 li a0,1 + 568: 00d040ef jal 4d74 + printf("write(1, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 56c: 862a mv a2,a0 + 56e: 85ce mv a1,s3 + 570: 00005517 auipc a0,0x5 + 574: f8050513 addi a0,a0,-128 # 54f0 + 578: 425040ef jal 519c + exit(1); + 57c: 4505 li a0,1 + 57e: 7f6040ef jal 4d74 + printf("pipe() failed\n"); + 582: 00005517 auipc a0,0x5 + 586: f9e50513 addi a0,a0,-98 # 5520 + 58a: 413040ef jal 519c + exit(1); + 58e: 4505 li a0,1 + 590: 7e4040ef jal 4d74 + printf("write(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 594: 862a mv a2,a0 + 596: 85ce mv a1,s3 + 598: 00005517 auipc a0,0x5 + 59c: f9850513 addi a0,a0,-104 # 5530 + 5a0: 3fd040ef jal 519c + exit(1); + 5a4: 4505 li a0,1 + 5a6: 7ce040ef jal 4d74 + +00000000000005aa : +{ + 5aa: 7119 addi sp,sp,-128 + 5ac: fc86 sd ra,120(sp) + 5ae: f8a2 sd s0,112(sp) + 5b0: f4a6 sd s1,104(sp) + 5b2: f0ca sd s2,96(sp) + 5b4: ecce sd s3,88(sp) + 5b6: e8d2 sd s4,80(sp) + 5b8: e4d6 sd s5,72(sp) + 5ba: e0da sd s6,64(sp) + 5bc: 0100 addi s0,sp,128 + uint64 addrs[] = { 0LL, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 5be: 00007797 auipc a5,0x7 + 5c2: 31278793 addi a5,a5,786 # 78d0 + 5c6: 7788 ld a0,40(a5) + 5c8: 7b8c ld a1,48(a5) + 5ca: 7f90 ld a2,56(a5) + 5cc: 63b4 ld a3,64(a5) + 5ce: 67b8 ld a4,72(a5) + 5d0: 6bbc ld a5,80(a5) + 5d2: f8a43823 sd a0,-112(s0) + 5d6: f8b43c23 sd a1,-104(s0) + 5da: fac43023 sd a2,-96(s0) + 5de: fad43423 sd a3,-88(s0) + 5e2: fae43823 sd a4,-80(s0) + 5e6: faf43c23 sd a5,-72(s0) + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 5ea: f9040913 addi s2,s0,-112 + 5ee: fc040b13 addi s6,s0,-64 + int fd = open("README", 0); + 5f2: 00005a17 auipc s4,0x5 + 5f6: f6ea0a13 addi s4,s4,-146 # 5560 + n = write(fds[1], "x", 1); + 5fa: 00005a97 auipc s5,0x5 + 5fe: dfea8a93 addi s5,s5,-514 # 53f8 + uint64 addr = addrs[ai]; + 602: 00093983 ld s3,0(s2) + int fd = open("README", 0); + 606: 4581 li a1,0 + 608: 8552 mv a0,s4 + 60a: 7aa040ef jal 4db4 + 60e: 84aa mv s1,a0 + if(fd < 0){ + 610: 06054763 bltz a0,67e + int n = read(fd, (void*)addr, 8192); + 614: 6609 lui a2,0x2 + 616: 85ce mv a1,s3 + 618: 774040ef jal 4d8c + if(n > 0){ + 61c: 06a04a63 bgtz a0,690 + close(fd); + 620: 8526 mv a0,s1 + 622: 77a040ef jal 4d9c + if(pipe(fds) < 0){ + 626: f8840513 addi a0,s0,-120 + 62a: 75a040ef jal 4d84 + 62e: 06054c63 bltz a0,6a6 + n = write(fds[1], "x", 1); + 632: 4605 li a2,1 + 634: 85d6 mv a1,s5 + 636: f8c42503 lw a0,-116(s0) + 63a: 75a040ef jal 4d94 + if(n != 1){ + 63e: 4785 li a5,1 + 640: 06f51c63 bne a0,a5,6b8 + n = read(fds[0], (void*)addr, 8192); + 644: 6609 lui a2,0x2 + 646: 85ce mv a1,s3 + 648: f8842503 lw a0,-120(s0) + 64c: 740040ef jal 4d8c + if(n > 0){ + 650: 06a04d63 bgtz a0,6ca + close(fds[0]); + 654: f8842503 lw a0,-120(s0) + 658: 744040ef jal 4d9c + close(fds[1]); + 65c: f8c42503 lw a0,-116(s0) + 660: 73c040ef jal 4d9c + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 664: 0921 addi s2,s2,8 + 666: f9691ee3 bne s2,s6,602 +} + 66a: 70e6 ld ra,120(sp) + 66c: 7446 ld s0,112(sp) + 66e: 74a6 ld s1,104(sp) + 670: 7906 ld s2,96(sp) + 672: 69e6 ld s3,88(sp) + 674: 6a46 ld s4,80(sp) + 676: 6aa6 ld s5,72(sp) + 678: 6b06 ld s6,64(sp) + 67a: 6109 addi sp,sp,128 + 67c: 8082 ret + printf("open(README) failed\n"); + 67e: 00005517 auipc a0,0x5 + 682: eea50513 addi a0,a0,-278 # 5568 + 686: 317040ef jal 519c + exit(1); + 68a: 4505 li a0,1 + 68c: 6e8040ef jal 4d74 + printf("read(fd, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 690: 862a mv a2,a0 + 692: 85ce mv a1,s3 + 694: 00005517 auipc a0,0x5 + 698: eec50513 addi a0,a0,-276 # 5580 + 69c: 301040ef jal 519c + exit(1); + 6a0: 4505 li a0,1 + 6a2: 6d2040ef jal 4d74 + printf("pipe() failed\n"); + 6a6: 00005517 auipc a0,0x5 + 6aa: e7a50513 addi a0,a0,-390 # 5520 + 6ae: 2ef040ef jal 519c + exit(1); + 6b2: 4505 li a0,1 + 6b4: 6c0040ef jal 4d74 + printf("pipe write failed\n"); + 6b8: 00005517 auipc a0,0x5 + 6bc: ef850513 addi a0,a0,-264 # 55b0 + 6c0: 2dd040ef jal 519c + exit(1); + 6c4: 4505 li a0,1 + 6c6: 6ae040ef jal 4d74 + printf("read(pipe, %p, 8192) returned %d, not -1 or 0\n", (void*)addr, n); + 6ca: 862a mv a2,a0 + 6cc: 85ce mv a1,s3 + 6ce: 00005517 auipc a0,0x5 + 6d2: efa50513 addi a0,a0,-262 # 55c8 + 6d6: 2c7040ef jal 519c + exit(1); + 6da: 4505 li a0,1 + 6dc: 698040ef jal 4d74 + +00000000000006e0 : +{ + 6e0: 711d addi sp,sp,-96 + 6e2: ec86 sd ra,88(sp) + 6e4: e8a2 sd s0,80(sp) + 6e6: e4a6 sd s1,72(sp) + 6e8: e0ca sd s2,64(sp) + 6ea: fc4e sd s3,56(sp) + 6ec: f852 sd s4,48(sp) + 6ee: f456 sd s5,40(sp) + 6f0: 1080 addi s0,sp,96 + 6f2: 8aaa mv s5,a0 + unlink("truncfile"); + 6f4: 00005517 auipc a0,0x5 + 6f8: cec50513 addi a0,a0,-788 # 53e0 + 6fc: 6c8040ef jal 4dc4 + int fd1 = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); + 700: 60100593 li a1,1537 + 704: 00005517 auipc a0,0x5 + 708: cdc50513 addi a0,a0,-804 # 53e0 + 70c: 6a8040ef jal 4db4 + 710: 84aa mv s1,a0 + write(fd1, "abcd", 4); + 712: 4611 li a2,4 + 714: 00005597 auipc a1,0x5 + 718: cdc58593 addi a1,a1,-804 # 53f0 + 71c: 678040ef jal 4d94 + close(fd1); + 720: 8526 mv a0,s1 + 722: 67a040ef jal 4d9c + int fd2 = open("truncfile", O_RDONLY); + 726: 4581 li a1,0 + 728: 00005517 auipc a0,0x5 + 72c: cb850513 addi a0,a0,-840 # 53e0 + 730: 684040ef jal 4db4 + 734: 84aa mv s1,a0 + int n = read(fd2, buf, sizeof(buf)); + 736: 02000613 li a2,32 + 73a: fa040593 addi a1,s0,-96 + 73e: 64e040ef jal 4d8c + if(n != 4){ + 742: 4791 li a5,4 + 744: 0af51863 bne a0,a5,7f4 + fd1 = open("truncfile", O_WRONLY|O_TRUNC); + 748: 40100593 li a1,1025 + 74c: 00005517 auipc a0,0x5 + 750: c9450513 addi a0,a0,-876 # 53e0 + 754: 660040ef jal 4db4 + 758: 89aa mv s3,a0 + int fd3 = open("truncfile", O_RDONLY); + 75a: 4581 li a1,0 + 75c: 00005517 auipc a0,0x5 + 760: c8450513 addi a0,a0,-892 # 53e0 + 764: 650040ef jal 4db4 + 768: 892a mv s2,a0 + n = read(fd3, buf, sizeof(buf)); + 76a: 02000613 li a2,32 + 76e: fa040593 addi a1,s0,-96 + 772: 61a040ef jal 4d8c + 776: 8a2a mv s4,a0 + if(n != 0){ + 778: e949 bnez a0,80a + n = read(fd2, buf, sizeof(buf)); + 77a: 02000613 li a2,32 + 77e: fa040593 addi a1,s0,-96 + 782: 8526 mv a0,s1 + 784: 608040ef jal 4d8c + 788: 8a2a mv s4,a0 + if(n != 0){ + 78a: e155 bnez a0,82e + write(fd1, "abcdef", 6); + 78c: 4619 li a2,6 + 78e: 00005597 auipc a1,0x5 + 792: eca58593 addi a1,a1,-310 # 5658 + 796: 854e mv a0,s3 + 798: 5fc040ef jal 4d94 + n = read(fd3, buf, sizeof(buf)); + 79c: 02000613 li a2,32 + 7a0: fa040593 addi a1,s0,-96 + 7a4: 854a mv a0,s2 + 7a6: 5e6040ef jal 4d8c + if(n != 6){ + 7aa: 4799 li a5,6 + 7ac: 0af51363 bne a0,a5,852 + n = read(fd2, buf, sizeof(buf)); + 7b0: 02000613 li a2,32 + 7b4: fa040593 addi a1,s0,-96 + 7b8: 8526 mv a0,s1 + 7ba: 5d2040ef jal 4d8c + if(n != 2){ + 7be: 4789 li a5,2 + 7c0: 0af51463 bne a0,a5,868 + unlink("truncfile"); + 7c4: 00005517 auipc a0,0x5 + 7c8: c1c50513 addi a0,a0,-996 # 53e0 + 7cc: 5f8040ef jal 4dc4 + close(fd1); + 7d0: 854e mv a0,s3 + 7d2: 5ca040ef jal 4d9c + close(fd2); + 7d6: 8526 mv a0,s1 + 7d8: 5c4040ef jal 4d9c + close(fd3); + 7dc: 854a mv a0,s2 + 7de: 5be040ef jal 4d9c +} + 7e2: 60e6 ld ra,88(sp) + 7e4: 6446 ld s0,80(sp) + 7e6: 64a6 ld s1,72(sp) + 7e8: 6906 ld s2,64(sp) + 7ea: 79e2 ld s3,56(sp) + 7ec: 7a42 ld s4,48(sp) + 7ee: 7aa2 ld s5,40(sp) + 7f0: 6125 addi sp,sp,96 + 7f2: 8082 ret + printf("%s: read %d bytes, wanted 4\n", s, n); + 7f4: 862a mv a2,a0 + 7f6: 85d6 mv a1,s5 + 7f8: 00005517 auipc a0,0x5 + 7fc: e0050513 addi a0,a0,-512 # 55f8 + 800: 19d040ef jal 519c + exit(1); + 804: 4505 li a0,1 + 806: 56e040ef jal 4d74 + printf("aaa fd3=%d\n", fd3); + 80a: 85ca mv a1,s2 + 80c: 00005517 auipc a0,0x5 + 810: e0c50513 addi a0,a0,-500 # 5618 + 814: 189040ef jal 519c + printf("%s: read %d bytes, wanted 0\n", s, n); + 818: 8652 mv a2,s4 + 81a: 85d6 mv a1,s5 + 81c: 00005517 auipc a0,0x5 + 820: e0c50513 addi a0,a0,-500 # 5628 + 824: 179040ef jal 519c + exit(1); + 828: 4505 li a0,1 + 82a: 54a040ef jal 4d74 + printf("bbb fd2=%d\n", fd2); + 82e: 85a6 mv a1,s1 + 830: 00005517 auipc a0,0x5 + 834: e1850513 addi a0,a0,-488 # 5648 + 838: 165040ef jal 519c + printf("%s: read %d bytes, wanted 0\n", s, n); + 83c: 8652 mv a2,s4 + 83e: 85d6 mv a1,s5 + 840: 00005517 auipc a0,0x5 + 844: de850513 addi a0,a0,-536 # 5628 + 848: 155040ef jal 519c + exit(1); + 84c: 4505 li a0,1 + 84e: 526040ef jal 4d74 + printf("%s: read %d bytes, wanted 6\n", s, n); + 852: 862a mv a2,a0 + 854: 85d6 mv a1,s5 + 856: 00005517 auipc a0,0x5 + 85a: e0a50513 addi a0,a0,-502 # 5660 + 85e: 13f040ef jal 519c + exit(1); + 862: 4505 li a0,1 + 864: 510040ef jal 4d74 + printf("%s: read %d bytes, wanted 2\n", s, n); + 868: 862a mv a2,a0 + 86a: 85d6 mv a1,s5 + 86c: 00005517 auipc a0,0x5 + 870: e1450513 addi a0,a0,-492 # 5680 + 874: 129040ef jal 519c + exit(1); + 878: 4505 li a0,1 + 87a: 4fa040ef jal 4d74 + +000000000000087e : +{ + 87e: 7139 addi sp,sp,-64 + 880: fc06 sd ra,56(sp) + 882: f822 sd s0,48(sp) + 884: f426 sd s1,40(sp) + 886: f04a sd s2,32(sp) + 888: ec4e sd s3,24(sp) + 88a: e852 sd s4,16(sp) + 88c: e456 sd s5,8(sp) + 88e: e05a sd s6,0(sp) + 890: 0080 addi s0,sp,64 + 892: 8b2a mv s6,a0 + fd = open("small", O_CREATE|O_RDWR); + 894: 20200593 li a1,514 + 898: 00005517 auipc a0,0x5 + 89c: e0850513 addi a0,a0,-504 # 56a0 + 8a0: 514040ef jal 4db4 + if(fd < 0){ + 8a4: 08054f63 bltz a0,942 + 8a8: 892a mv s2,a0 + 8aa: 4481 li s1,0 + if(write(fd, "aaaaaaaaaa", SZ) != SZ){ + 8ac: 00005997 auipc s3,0x5 + 8b0: e1c98993 addi s3,s3,-484 # 56c8 + if(write(fd, "bbbbbbbbbb", SZ) != SZ){ + 8b4: 00005a97 auipc s5,0x5 + 8b8: e4ca8a93 addi s5,s5,-436 # 5700 + for(i = 0; i < N; i++){ + 8bc: 06400a13 li s4,100 + if(write(fd, "aaaaaaaaaa", SZ) != SZ){ + 8c0: 4629 li a2,10 + 8c2: 85ce mv a1,s3 + 8c4: 854a mv a0,s2 + 8c6: 4ce040ef jal 4d94 + 8ca: 47a9 li a5,10 + 8cc: 08f51563 bne a0,a5,956 + if(write(fd, "bbbbbbbbbb", SZ) != SZ){ + 8d0: 4629 li a2,10 + 8d2: 85d6 mv a1,s5 + 8d4: 854a mv a0,s2 + 8d6: 4be040ef jal 4d94 + 8da: 47a9 li a5,10 + 8dc: 08f51863 bne a0,a5,96c + for(i = 0; i < N; i++){ + 8e0: 2485 addiw s1,s1,1 + 8e2: fd449fe3 bne s1,s4,8c0 + close(fd); + 8e6: 854a mv a0,s2 + 8e8: 4b4040ef jal 4d9c + fd = open("small", O_RDONLY); + 8ec: 4581 li a1,0 + 8ee: 00005517 auipc a0,0x5 + 8f2: db250513 addi a0,a0,-590 # 56a0 + 8f6: 4be040ef jal 4db4 + 8fa: 84aa mv s1,a0 + if(fd < 0){ + 8fc: 08054363 bltz a0,982 + i = read(fd, buf, N*SZ*2); + 900: 7d000613 li a2,2000 + 904: 0000c597 auipc a1,0xc + 908: 3b458593 addi a1,a1,948 # ccb8 + 90c: 480040ef jal 4d8c + if(i != N*SZ*2){ + 910: 7d000793 li a5,2000 + 914: 08f51163 bne a0,a5,996 + close(fd); + 918: 8526 mv a0,s1 + 91a: 482040ef jal 4d9c + if(unlink("small") < 0){ + 91e: 00005517 auipc a0,0x5 + 922: d8250513 addi a0,a0,-638 # 56a0 + 926: 49e040ef jal 4dc4 + 92a: 08054063 bltz a0,9aa +} + 92e: 70e2 ld ra,56(sp) + 930: 7442 ld s0,48(sp) + 932: 74a2 ld s1,40(sp) + 934: 7902 ld s2,32(sp) + 936: 69e2 ld s3,24(sp) + 938: 6a42 ld s4,16(sp) + 93a: 6aa2 ld s5,8(sp) + 93c: 6b02 ld s6,0(sp) + 93e: 6121 addi sp,sp,64 + 940: 8082 ret + printf("%s: error: creat small failed!\n", s); + 942: 85da mv a1,s6 + 944: 00005517 auipc a0,0x5 + 948: d6450513 addi a0,a0,-668 # 56a8 + 94c: 051040ef jal 519c + exit(1); + 950: 4505 li a0,1 + 952: 422040ef jal 4d74 + printf("%s: error: write aa %d new file failed\n", s, i); + 956: 8626 mv a2,s1 + 958: 85da mv a1,s6 + 95a: 00005517 auipc a0,0x5 + 95e: d7e50513 addi a0,a0,-642 # 56d8 + 962: 03b040ef jal 519c + exit(1); + 966: 4505 li a0,1 + 968: 40c040ef jal 4d74 + printf("%s: error: write bb %d new file failed\n", s, i); + 96c: 8626 mv a2,s1 + 96e: 85da mv a1,s6 + 970: 00005517 auipc a0,0x5 + 974: da050513 addi a0,a0,-608 # 5710 + 978: 025040ef jal 519c + exit(1); + 97c: 4505 li a0,1 + 97e: 3f6040ef jal 4d74 + printf("%s: error: open small failed!\n", s); + 982: 85da mv a1,s6 + 984: 00005517 auipc a0,0x5 + 988: db450513 addi a0,a0,-588 # 5738 + 98c: 011040ef jal 519c + exit(1); + 990: 4505 li a0,1 + 992: 3e2040ef jal 4d74 + printf("%s: read failed\n", s); + 996: 85da mv a1,s6 + 998: 00005517 auipc a0,0x5 + 99c: dc050513 addi a0,a0,-576 # 5758 + 9a0: 7fc040ef jal 519c + exit(1); + 9a4: 4505 li a0,1 + 9a6: 3ce040ef jal 4d74 + printf("%s: unlink small failed\n", s); + 9aa: 85da mv a1,s6 + 9ac: 00005517 auipc a0,0x5 + 9b0: dc450513 addi a0,a0,-572 # 5770 + 9b4: 7e8040ef jal 519c + exit(1); + 9b8: 4505 li a0,1 + 9ba: 3ba040ef jal 4d74 + +00000000000009be : +{ + 9be: 7139 addi sp,sp,-64 + 9c0: fc06 sd ra,56(sp) + 9c2: f822 sd s0,48(sp) + 9c4: f426 sd s1,40(sp) + 9c6: f04a sd s2,32(sp) + 9c8: ec4e sd s3,24(sp) + 9ca: e852 sd s4,16(sp) + 9cc: e456 sd s5,8(sp) + 9ce: 0080 addi s0,sp,64 + 9d0: 8aaa mv s5,a0 + fd = open("big", O_CREATE|O_RDWR); + 9d2: 20200593 li a1,514 + 9d6: 00005517 auipc a0,0x5 + 9da: dba50513 addi a0,a0,-582 # 5790 + 9de: 3d6040ef jal 4db4 + 9e2: 89aa mv s3,a0 + for(i = 0; i < MAXFILE; i++){ + 9e4: 4481 li s1,0 + ((int*)buf)[0] = i; + 9e6: 0000c917 auipc s2,0xc + 9ea: 2d290913 addi s2,s2,722 # ccb8 + for(i = 0; i < MAXFILE; i++){ + 9ee: 10c00a13 li s4,268 + if(fd < 0){ + 9f2: 06054463 bltz a0,a5a + ((int*)buf)[0] = i; + 9f6: 00992023 sw s1,0(s2) + if(write(fd, buf, BSIZE) != BSIZE){ + 9fa: 40000613 li a2,1024 + 9fe: 85ca mv a1,s2 + a00: 854e mv a0,s3 + a02: 392040ef jal 4d94 + a06: 40000793 li a5,1024 + a0a: 06f51263 bne a0,a5,a6e + for(i = 0; i < MAXFILE; i++){ + a0e: 2485 addiw s1,s1,1 + a10: ff4493e3 bne s1,s4,9f6 + close(fd); + a14: 854e mv a0,s3 + a16: 386040ef jal 4d9c + fd = open("big", O_RDONLY); + a1a: 4581 li a1,0 + a1c: 00005517 auipc a0,0x5 + a20: d7450513 addi a0,a0,-652 # 5790 + a24: 390040ef jal 4db4 + a28: 89aa mv s3,a0 + n = 0; + a2a: 4481 li s1,0 + i = read(fd, buf, BSIZE); + a2c: 0000c917 auipc s2,0xc + a30: 28c90913 addi s2,s2,652 # ccb8 + if(fd < 0){ + a34: 04054863 bltz a0,a84 + i = read(fd, buf, BSIZE); + a38: 40000613 li a2,1024 + a3c: 85ca mv a1,s2 + a3e: 854e mv a0,s3 + a40: 34c040ef jal 4d8c + if(i == 0){ + a44: c931 beqz a0,a98 + } else if(i != BSIZE){ + a46: 40000793 li a5,1024 + a4a: 08f51a63 bne a0,a5,ade + if(((int*)buf)[0] != n){ + a4e: 00092683 lw a3,0(s2) + a52: 0a969163 bne a3,s1,af4 + n++; + a56: 2485 addiw s1,s1,1 + i = read(fd, buf, BSIZE); + a58: b7c5 j a38 + printf("%s: error: creat big failed!\n", s); + a5a: 85d6 mv a1,s5 + a5c: 00005517 auipc a0,0x5 + a60: d3c50513 addi a0,a0,-708 # 5798 + a64: 738040ef jal 519c + exit(1); + a68: 4505 li a0,1 + a6a: 30a040ef jal 4d74 + printf("%s: error: write big file failed i=%d\n", s, i); + a6e: 8626 mv a2,s1 + a70: 85d6 mv a1,s5 + a72: 00005517 auipc a0,0x5 + a76: d4650513 addi a0,a0,-698 # 57b8 + a7a: 722040ef jal 519c + exit(1); + a7e: 4505 li a0,1 + a80: 2f4040ef jal 4d74 + printf("%s: error: open big failed!\n", s); + a84: 85d6 mv a1,s5 + a86: 00005517 auipc a0,0x5 + a8a: d5a50513 addi a0,a0,-678 # 57e0 + a8e: 70e040ef jal 519c + exit(1); + a92: 4505 li a0,1 + a94: 2e0040ef jal 4d74 + if(n != MAXFILE){ + a98: 10c00793 li a5,268 + a9c: 02f49663 bne s1,a5,ac8 + close(fd); + aa0: 854e mv a0,s3 + aa2: 2fa040ef jal 4d9c + if(unlink("big") < 0){ + aa6: 00005517 auipc a0,0x5 + aaa: cea50513 addi a0,a0,-790 # 5790 + aae: 316040ef jal 4dc4 + ab2: 04054c63 bltz a0,b0a +} + ab6: 70e2 ld ra,56(sp) + ab8: 7442 ld s0,48(sp) + aba: 74a2 ld s1,40(sp) + abc: 7902 ld s2,32(sp) + abe: 69e2 ld s3,24(sp) + ac0: 6a42 ld s4,16(sp) + ac2: 6aa2 ld s5,8(sp) + ac4: 6121 addi sp,sp,64 + ac6: 8082 ret + printf("%s: read only %d blocks from big", s, n); + ac8: 8626 mv a2,s1 + aca: 85d6 mv a1,s5 + acc: 00005517 auipc a0,0x5 + ad0: d3450513 addi a0,a0,-716 # 5800 + ad4: 6c8040ef jal 519c + exit(1); + ad8: 4505 li a0,1 + ada: 29a040ef jal 4d74 + printf("%s: read failed %d\n", s, i); + ade: 862a mv a2,a0 + ae0: 85d6 mv a1,s5 + ae2: 00005517 auipc a0,0x5 + ae6: d4650513 addi a0,a0,-698 # 5828 + aea: 6b2040ef jal 519c + exit(1); + aee: 4505 li a0,1 + af0: 284040ef jal 4d74 + printf("%s: read content of block %d is %d\n", s, + af4: 8626 mv a2,s1 + af6: 85d6 mv a1,s5 + af8: 00005517 auipc a0,0x5 + afc: d4850513 addi a0,a0,-696 # 5840 + b00: 69c040ef jal 519c + exit(1); + b04: 4505 li a0,1 + b06: 26e040ef jal 4d74 + printf("%s: unlink big failed\n", s); + b0a: 85d6 mv a1,s5 + b0c: 00005517 auipc a0,0x5 + b10: d5c50513 addi a0,a0,-676 # 5868 + b14: 688040ef jal 519c + exit(1); + b18: 4505 li a0,1 + b1a: 25a040ef jal 4d74 + +0000000000000b1e : +{ + b1e: 7179 addi sp,sp,-48 + b20: f406 sd ra,40(sp) + b22: f022 sd s0,32(sp) + b24: ec26 sd s1,24(sp) + b26: e84a sd s2,16(sp) + b28: e44e sd s3,8(sp) + b2a: 1800 addi s0,sp,48 + b2c: 89aa mv s3,a0 + fd = open("unlinkread", O_CREATE | O_RDWR); + b2e: 20200593 li a1,514 + b32: 00005517 auipc a0,0x5 + b36: d4e50513 addi a0,a0,-690 # 5880 + b3a: 27a040ef jal 4db4 + if(fd < 0){ + b3e: 0a054f63 bltz a0,bfc + b42: 84aa mv s1,a0 + write(fd, "hello", SZ); + b44: 4615 li a2,5 + b46: 00005597 auipc a1,0x5 + b4a: d6a58593 addi a1,a1,-662 # 58b0 + b4e: 246040ef jal 4d94 + close(fd); + b52: 8526 mv a0,s1 + b54: 248040ef jal 4d9c + fd = open("unlinkread", O_RDWR); + b58: 4589 li a1,2 + b5a: 00005517 auipc a0,0x5 + b5e: d2650513 addi a0,a0,-730 # 5880 + b62: 252040ef jal 4db4 + b66: 84aa mv s1,a0 + if(fd < 0){ + b68: 0a054463 bltz a0,c10 + if(unlink("unlinkread") != 0){ + b6c: 00005517 auipc a0,0x5 + b70: d1450513 addi a0,a0,-748 # 5880 + b74: 250040ef jal 4dc4 + b78: e555 bnez a0,c24 + fd1 = open("unlinkread", O_CREATE | O_RDWR); + b7a: 20200593 li a1,514 + b7e: 00005517 auipc a0,0x5 + b82: d0250513 addi a0,a0,-766 # 5880 + b86: 22e040ef jal 4db4 + b8a: 892a mv s2,a0 + write(fd1, "yyy", 3); + b8c: 460d li a2,3 + b8e: 00005597 auipc a1,0x5 + b92: d6a58593 addi a1,a1,-662 # 58f8 + b96: 1fe040ef jal 4d94 + close(fd1); + b9a: 854a mv a0,s2 + b9c: 200040ef jal 4d9c + if(read(fd, buf, sizeof(buf)) != SZ){ + ba0: 660d lui a2,0x3 + ba2: 0000c597 auipc a1,0xc + ba6: 11658593 addi a1,a1,278 # ccb8 + baa: 8526 mv a0,s1 + bac: 1e0040ef jal 4d8c + bb0: 4795 li a5,5 + bb2: 08f51363 bne a0,a5,c38 + if(buf[0] != 'h'){ + bb6: 0000c717 auipc a4,0xc + bba: 10274703 lbu a4,258(a4) # ccb8 + bbe: 06800793 li a5,104 + bc2: 08f71563 bne a4,a5,c4c + if(write(fd, buf, 10) != 10){ + bc6: 4629 li a2,10 + bc8: 0000c597 auipc a1,0xc + bcc: 0f058593 addi a1,a1,240 # ccb8 + bd0: 8526 mv a0,s1 + bd2: 1c2040ef jal 4d94 + bd6: 47a9 li a5,10 + bd8: 08f51463 bne a0,a5,c60 + close(fd); + bdc: 8526 mv a0,s1 + bde: 1be040ef jal 4d9c + unlink("unlinkread"); + be2: 00005517 auipc a0,0x5 + be6: c9e50513 addi a0,a0,-866 # 5880 + bea: 1da040ef jal 4dc4 +} + bee: 70a2 ld ra,40(sp) + bf0: 7402 ld s0,32(sp) + bf2: 64e2 ld s1,24(sp) + bf4: 6942 ld s2,16(sp) + bf6: 69a2 ld s3,8(sp) + bf8: 6145 addi sp,sp,48 + bfa: 8082 ret + printf("%s: create unlinkread failed\n", s); + bfc: 85ce mv a1,s3 + bfe: 00005517 auipc a0,0x5 + c02: c9250513 addi a0,a0,-878 # 5890 + c06: 596040ef jal 519c + exit(1); + c0a: 4505 li a0,1 + c0c: 168040ef jal 4d74 + printf("%s: open unlinkread failed\n", s); + c10: 85ce mv a1,s3 + c12: 00005517 auipc a0,0x5 + c16: ca650513 addi a0,a0,-858 # 58b8 + c1a: 582040ef jal 519c + exit(1); + c1e: 4505 li a0,1 + c20: 154040ef jal 4d74 + printf("%s: unlink unlinkread failed\n", s); + c24: 85ce mv a1,s3 + c26: 00005517 auipc a0,0x5 + c2a: cb250513 addi a0,a0,-846 # 58d8 + c2e: 56e040ef jal 519c + exit(1); + c32: 4505 li a0,1 + c34: 140040ef jal 4d74 + printf("%s: unlinkread read failed", s); + c38: 85ce mv a1,s3 + c3a: 00005517 auipc a0,0x5 + c3e: cc650513 addi a0,a0,-826 # 5900 + c42: 55a040ef jal 519c + exit(1); + c46: 4505 li a0,1 + c48: 12c040ef jal 4d74 + printf("%s: unlinkread wrong data\n", s); + c4c: 85ce mv a1,s3 + c4e: 00005517 auipc a0,0x5 + c52: cd250513 addi a0,a0,-814 # 5920 + c56: 546040ef jal 519c + exit(1); + c5a: 4505 li a0,1 + c5c: 118040ef jal 4d74 + printf("%s: unlinkread write failed\n", s); + c60: 85ce mv a1,s3 + c62: 00005517 auipc a0,0x5 + c66: cde50513 addi a0,a0,-802 # 5940 + c6a: 532040ef jal 519c + exit(1); + c6e: 4505 li a0,1 + c70: 104040ef jal 4d74 + +0000000000000c74 : +{ + c74: 1101 addi sp,sp,-32 + c76: ec06 sd ra,24(sp) + c78: e822 sd s0,16(sp) + c7a: e426 sd s1,8(sp) + c7c: e04a sd s2,0(sp) + c7e: 1000 addi s0,sp,32 + c80: 892a mv s2,a0 + unlink("lf1"); + c82: 00005517 auipc a0,0x5 + c86: cde50513 addi a0,a0,-802 # 5960 + c8a: 13a040ef jal 4dc4 + unlink("lf2"); + c8e: 00005517 auipc a0,0x5 + c92: cda50513 addi a0,a0,-806 # 5968 + c96: 12e040ef jal 4dc4 + fd = open("lf1", O_CREATE|O_RDWR); + c9a: 20200593 li a1,514 + c9e: 00005517 auipc a0,0x5 + ca2: cc250513 addi a0,a0,-830 # 5960 + ca6: 10e040ef jal 4db4 + if(fd < 0){ + caa: 0c054f63 bltz a0,d88 + cae: 84aa mv s1,a0 + if(write(fd, "hello", SZ) != SZ){ + cb0: 4615 li a2,5 + cb2: 00005597 auipc a1,0x5 + cb6: bfe58593 addi a1,a1,-1026 # 58b0 + cba: 0da040ef jal 4d94 + cbe: 4795 li a5,5 + cc0: 0cf51e63 bne a0,a5,d9c + close(fd); + cc4: 8526 mv a0,s1 + cc6: 0d6040ef jal 4d9c + if(link("lf1", "lf2") < 0){ + cca: 00005597 auipc a1,0x5 + cce: c9e58593 addi a1,a1,-866 # 5968 + cd2: 00005517 auipc a0,0x5 + cd6: c8e50513 addi a0,a0,-882 # 5960 + cda: 0fa040ef jal 4dd4 + cde: 0c054963 bltz a0,db0 + unlink("lf1"); + ce2: 00005517 auipc a0,0x5 + ce6: c7e50513 addi a0,a0,-898 # 5960 + cea: 0da040ef jal 4dc4 + if(open("lf1", 0) >= 0){ + cee: 4581 li a1,0 + cf0: 00005517 auipc a0,0x5 + cf4: c7050513 addi a0,a0,-912 # 5960 + cf8: 0bc040ef jal 4db4 + cfc: 0c055463 bgez a0,dc4 + fd = open("lf2", 0); + d00: 4581 li a1,0 + d02: 00005517 auipc a0,0x5 + d06: c6650513 addi a0,a0,-922 # 5968 + d0a: 0aa040ef jal 4db4 + d0e: 84aa mv s1,a0 + if(fd < 0){ + d10: 0c054463 bltz a0,dd8 + if(read(fd, buf, sizeof(buf)) != SZ){ + d14: 660d lui a2,0x3 + d16: 0000c597 auipc a1,0xc + d1a: fa258593 addi a1,a1,-94 # ccb8 + d1e: 06e040ef jal 4d8c + d22: 4795 li a5,5 + d24: 0cf51463 bne a0,a5,dec + close(fd); + d28: 8526 mv a0,s1 + d2a: 072040ef jal 4d9c + if(link("lf2", "lf2") >= 0){ + d2e: 00005597 auipc a1,0x5 + d32: c3a58593 addi a1,a1,-966 # 5968 + d36: 852e mv a0,a1 + d38: 09c040ef jal 4dd4 + d3c: 0c055263 bgez a0,e00 + unlink("lf2"); + d40: 00005517 auipc a0,0x5 + d44: c2850513 addi a0,a0,-984 # 5968 + d48: 07c040ef jal 4dc4 + if(link("lf2", "lf1") >= 0){ + d4c: 00005597 auipc a1,0x5 + d50: c1458593 addi a1,a1,-1004 # 5960 + d54: 00005517 auipc a0,0x5 + d58: c1450513 addi a0,a0,-1004 # 5968 + d5c: 078040ef jal 4dd4 + d60: 0a055a63 bgez a0,e14 + if(link(".", "lf1") >= 0){ + d64: 00005597 auipc a1,0x5 + d68: bfc58593 addi a1,a1,-1028 # 5960 + d6c: 00005517 auipc a0,0x5 + d70: d0450513 addi a0,a0,-764 # 5a70 + d74: 060040ef jal 4dd4 + d78: 0a055863 bgez a0,e28 +} + d7c: 60e2 ld ra,24(sp) + d7e: 6442 ld s0,16(sp) + d80: 64a2 ld s1,8(sp) + d82: 6902 ld s2,0(sp) + d84: 6105 addi sp,sp,32 + d86: 8082 ret + printf("%s: create lf1 failed\n", s); + d88: 85ca mv a1,s2 + d8a: 00005517 auipc a0,0x5 + d8e: be650513 addi a0,a0,-1050 # 5970 + d92: 40a040ef jal 519c + exit(1); + d96: 4505 li a0,1 + d98: 7dd030ef jal 4d74 + printf("%s: write lf1 failed\n", s); + d9c: 85ca mv a1,s2 + d9e: 00005517 auipc a0,0x5 + da2: bea50513 addi a0,a0,-1046 # 5988 + da6: 3f6040ef jal 519c + exit(1); + daa: 4505 li a0,1 + dac: 7c9030ef jal 4d74 + printf("%s: link lf1 lf2 failed\n", s); + db0: 85ca mv a1,s2 + db2: 00005517 auipc a0,0x5 + db6: bee50513 addi a0,a0,-1042 # 59a0 + dba: 3e2040ef jal 519c + exit(1); + dbe: 4505 li a0,1 + dc0: 7b5030ef jal 4d74 + printf("%s: unlinked lf1 but it is still there!\n", s); + dc4: 85ca mv a1,s2 + dc6: 00005517 auipc a0,0x5 + dca: bfa50513 addi a0,a0,-1030 # 59c0 + dce: 3ce040ef jal 519c + exit(1); + dd2: 4505 li a0,1 + dd4: 7a1030ef jal 4d74 + printf("%s: open lf2 failed\n", s); + dd8: 85ca mv a1,s2 + dda: 00005517 auipc a0,0x5 + dde: c1650513 addi a0,a0,-1002 # 59f0 + de2: 3ba040ef jal 519c + exit(1); + de6: 4505 li a0,1 + de8: 78d030ef jal 4d74 + printf("%s: read lf2 failed\n", s); + dec: 85ca mv a1,s2 + dee: 00005517 auipc a0,0x5 + df2: c1a50513 addi a0,a0,-998 # 5a08 + df6: 3a6040ef jal 519c + exit(1); + dfa: 4505 li a0,1 + dfc: 779030ef jal 4d74 + printf("%s: link lf2 lf2 succeeded! oops\n", s); + e00: 85ca mv a1,s2 + e02: 00005517 auipc a0,0x5 + e06: c1e50513 addi a0,a0,-994 # 5a20 + e0a: 392040ef jal 519c + exit(1); + e0e: 4505 li a0,1 + e10: 765030ef jal 4d74 + printf("%s: link non-existent succeeded! oops\n", s); + e14: 85ca mv a1,s2 + e16: 00005517 auipc a0,0x5 + e1a: c3250513 addi a0,a0,-974 # 5a48 + e1e: 37e040ef jal 519c + exit(1); + e22: 4505 li a0,1 + e24: 751030ef jal 4d74 + printf("%s: link . lf1 succeeded! oops\n", s); + e28: 85ca mv a1,s2 + e2a: 00005517 auipc a0,0x5 + e2e: c4e50513 addi a0,a0,-946 # 5a78 + e32: 36a040ef jal 519c + exit(1); + e36: 4505 li a0,1 + e38: 73d030ef jal 4d74 + +0000000000000e3c : +{ + e3c: 7139 addi sp,sp,-64 + e3e: fc06 sd ra,56(sp) + e40: f822 sd s0,48(sp) + e42: f426 sd s1,40(sp) + e44: f04a sd s2,32(sp) + e46: ec4e sd s3,24(sp) + e48: e852 sd s4,16(sp) + e4a: e456 sd s5,8(sp) + e4c: e05a sd s6,0(sp) + e4e: 0080 addi s0,sp,64 + e50: 8b2a mv s6,a0 + for(p = 0; p <= (uint)hi; p += PGSIZE){ + e52: 4481 li s1,0 + if(link("nosuchfile", (char*)p) != -1){ + e54: 00005997 auipc s3,0x5 + e58: c4498993 addi s3,s3,-956 # 5a98 + e5c: 597d li s2,-1 + for(p = 0; p <= (uint)hi; p += PGSIZE){ + e5e: 6a85 lui s5,0x1 + e60: 00114a37 lui s4,0x114 + if(link("nosuchfile", (char*)p) != -1){ + e64: 85a6 mv a1,s1 + e66: 854e mv a0,s3 + e68: 76d030ef jal 4dd4 + e6c: 01251f63 bne a0,s2,e8a + for(p = 0; p <= (uint)hi; p += PGSIZE){ + e70: 94d6 add s1,s1,s5 + e72: ff4499e3 bne s1,s4,e64 +} + e76: 70e2 ld ra,56(sp) + e78: 7442 ld s0,48(sp) + e7a: 74a2 ld s1,40(sp) + e7c: 7902 ld s2,32(sp) + e7e: 69e2 ld s3,24(sp) + e80: 6a42 ld s4,16(sp) + e82: 6aa2 ld s5,8(sp) + e84: 6b02 ld s6,0(sp) + e86: 6121 addi sp,sp,64 + e88: 8082 ret + printf("%s: link should not succeed\n", s); + e8a: 85da mv a1,s6 + e8c: 00005517 auipc a0,0x5 + e90: c1c50513 addi a0,a0,-996 # 5aa8 + e94: 308040ef jal 519c + exit(1); + e98: 4505 li a0,1 + e9a: 6db030ef jal 4d74 + +0000000000000e9e : +{ + e9e: 715d addi sp,sp,-80 + ea0: e486 sd ra,72(sp) + ea2: e0a2 sd s0,64(sp) + ea4: fc26 sd s1,56(sp) + ea6: f84a sd s2,48(sp) + ea8: f44e sd s3,40(sp) + eaa: f052 sd s4,32(sp) + eac: ec56 sd s5,24(sp) + eae: e85a sd s6,16(sp) + eb0: 0880 addi s0,sp,80 + eb2: 89aa mv s3,a0 + unlink("bd"); + eb4: 00005517 auipc a0,0x5 + eb8: c1450513 addi a0,a0,-1004 # 5ac8 + ebc: 709030ef jal 4dc4 + fd = open("bd", O_CREATE); + ec0: 20000593 li a1,512 + ec4: 00005517 auipc a0,0x5 + ec8: c0450513 addi a0,a0,-1020 # 5ac8 + ecc: 6e9030ef jal 4db4 + if(fd < 0){ + ed0: 0c054163 bltz a0,f92 + close(fd); + ed4: 6c9030ef jal 4d9c + for(i = 0; i < N; i++){ + ed8: 4901 li s2,0 + name[0] = 'x'; + eda: 07800a93 li s5,120 + if(link("bd", name) != 0){ + ede: 00005a17 auipc s4,0x5 + ee2: beaa0a13 addi s4,s4,-1046 # 5ac8 + for(i = 0; i < N; i++){ + ee6: 1f400b13 li s6,500 + name[0] = 'x'; + eea: fb540823 sb s5,-80(s0) + name[1] = '0' + (i / 64); + eee: 41f9571b sraiw a4,s2,0x1f + ef2: 01a7571b srliw a4,a4,0x1a + ef6: 012707bb addw a5,a4,s2 + efa: 4067d69b sraiw a3,a5,0x6 + efe: 0306869b addiw a3,a3,48 + f02: fad408a3 sb a3,-79(s0) + name[2] = '0' + (i % 64); + f06: 03f7f793 andi a5,a5,63 + f0a: 9f99 subw a5,a5,a4 + f0c: 0307879b addiw a5,a5,48 + f10: faf40923 sb a5,-78(s0) + name[3] = '\0'; + f14: fa0409a3 sb zero,-77(s0) + if(link("bd", name) != 0){ + f18: fb040593 addi a1,s0,-80 + f1c: 8552 mv a0,s4 + f1e: 6b7030ef jal 4dd4 + f22: 84aa mv s1,a0 + f24: e149 bnez a0,fa6 + for(i = 0; i < N; i++){ + f26: 2905 addiw s2,s2,1 + f28: fd6911e3 bne s2,s6,eea + unlink("bd"); + f2c: 00005517 auipc a0,0x5 + f30: b9c50513 addi a0,a0,-1124 # 5ac8 + f34: 691030ef jal 4dc4 + name[0] = 'x'; + f38: 07800913 li s2,120 + for(i = 0; i < N; i++){ + f3c: 1f400a13 li s4,500 + name[0] = 'x'; + f40: fb240823 sb s2,-80(s0) + name[1] = '0' + (i / 64); + f44: 41f4d71b sraiw a4,s1,0x1f + f48: 01a7571b srliw a4,a4,0x1a + f4c: 009707bb addw a5,a4,s1 + f50: 4067d69b sraiw a3,a5,0x6 + f54: 0306869b addiw a3,a3,48 + f58: fad408a3 sb a3,-79(s0) + name[2] = '0' + (i % 64); + f5c: 03f7f793 andi a5,a5,63 + f60: 9f99 subw a5,a5,a4 + f62: 0307879b addiw a5,a5,48 + f66: faf40923 sb a5,-78(s0) + name[3] = '\0'; + f6a: fa0409a3 sb zero,-77(s0) + if(unlink(name) != 0){ + f6e: fb040513 addi a0,s0,-80 + f72: 653030ef jal 4dc4 + f76: e529 bnez a0,fc0 + for(i = 0; i < N; i++){ + f78: 2485 addiw s1,s1,1 + f7a: fd4493e3 bne s1,s4,f40 +} + f7e: 60a6 ld ra,72(sp) + f80: 6406 ld s0,64(sp) + f82: 74e2 ld s1,56(sp) + f84: 7942 ld s2,48(sp) + f86: 79a2 ld s3,40(sp) + f88: 7a02 ld s4,32(sp) + f8a: 6ae2 ld s5,24(sp) + f8c: 6b42 ld s6,16(sp) + f8e: 6161 addi sp,sp,80 + f90: 8082 ret + printf("%s: bigdir create failed\n", s); + f92: 85ce mv a1,s3 + f94: 00005517 auipc a0,0x5 + f98: b3c50513 addi a0,a0,-1220 # 5ad0 + f9c: 200040ef jal 519c + exit(1); + fa0: 4505 li a0,1 + fa2: 5d3030ef jal 4d74 + printf("%s: bigdir i=%d link(bd, %s) failed\n", s, i, name); + fa6: fb040693 addi a3,s0,-80 + faa: 864a mv a2,s2 + fac: 85ce mv a1,s3 + fae: 00005517 auipc a0,0x5 + fb2: b4250513 addi a0,a0,-1214 # 5af0 + fb6: 1e6040ef jal 519c + exit(1); + fba: 4505 li a0,1 + fbc: 5b9030ef jal 4d74 + printf("%s: bigdir unlink failed", s); + fc0: 85ce mv a1,s3 + fc2: 00005517 auipc a0,0x5 + fc6: b5650513 addi a0,a0,-1194 # 5b18 + fca: 1d2040ef jal 519c + exit(1); + fce: 4505 li a0,1 + fd0: 5a5030ef jal 4d74 + +0000000000000fd4 : +{ + fd4: 7179 addi sp,sp,-48 + fd6: f406 sd ra,40(sp) + fd8: f022 sd s0,32(sp) + fda: ec26 sd s1,24(sp) + fdc: 1800 addi s0,sp,48 + argv[0] = 0; + fde: fc043c23 sd zero,-40(s0) + exec(big, argv); + fe2: 00008497 auipc s1,0x8 + fe6: 01e48493 addi s1,s1,30 # 9000 + fea: fd840593 addi a1,s0,-40 + fee: 6088 ld a0,0(s1) + ff0: 5bd030ef jal 4dac + pipe(big); + ff4: 6088 ld a0,0(s1) + ff6: 58f030ef jal 4d84 + exit(0); + ffa: 4501 li a0,0 + ffc: 579030ef jal 4d74 + +0000000000001000 : +{ + 1000: 7139 addi sp,sp,-64 + 1002: fc06 sd ra,56(sp) + 1004: f822 sd s0,48(sp) + 1006: f426 sd s1,40(sp) + 1008: f04a sd s2,32(sp) + 100a: ec4e sd s3,24(sp) + 100c: 0080 addi s0,sp,64 + 100e: 64b1 lui s1,0xc + 1010: 35048493 addi s1,s1,848 # c350 + argv[0] = (char*)0xffffffff; + 1014: 597d li s2,-1 + 1016: 02095913 srli s2,s2,0x20 + exec("echo", argv); + 101a: 00004997 auipc s3,0x4 + 101e: 36e98993 addi s3,s3,878 # 5388 + argv[0] = (char*)0xffffffff; + 1022: fd243023 sd s2,-64(s0) + argv[1] = 0; + 1026: fc043423 sd zero,-56(s0) + exec("echo", argv); + 102a: fc040593 addi a1,s0,-64 + 102e: 854e mv a0,s3 + 1030: 57d030ef jal 4dac + for(int i = 0; i < 50000; i++){ + 1034: 34fd addiw s1,s1,-1 + 1036: f4f5 bnez s1,1022 + exit(0); + 1038: 4501 li a0,0 + 103a: 53b030ef jal 4d74 + +000000000000103e : +{ + 103e: 7155 addi sp,sp,-208 + 1040: e586 sd ra,200(sp) + 1042: e1a2 sd s0,192(sp) + 1044: 0980 addi s0,sp,208 + for(int i = 0; i < MAXPATH; i++) + 1046: f6840793 addi a5,s0,-152 + 104a: fe840693 addi a3,s0,-24 + b[i] = 'x'; + 104e: 07800713 li a4,120 + 1052: 00e78023 sb a4,0(a5) + for(int i = 0; i < MAXPATH; i++) + 1056: 0785 addi a5,a5,1 + 1058: fed79de3 bne a5,a3,1052 + b[MAXPATH] = '\0'; + 105c: fe040423 sb zero,-24(s0) + int ret = unlink(b); + 1060: f6840513 addi a0,s0,-152 + 1064: 561030ef jal 4dc4 + if(ret != -1){ + 1068: 57fd li a5,-1 + 106a: 0cf51263 bne a0,a5,112e + int fd = open(b, O_CREATE | O_WRONLY); + 106e: 20100593 li a1,513 + 1072: f6840513 addi a0,s0,-152 + 1076: 53f030ef jal 4db4 + if(fd != -1){ + 107a: 57fd li a5,-1 + 107c: 0cf51563 bne a0,a5,1146 + ret = link(b, b); + 1080: f6840593 addi a1,s0,-152 + 1084: 852e mv a0,a1 + 1086: 54f030ef jal 4dd4 + if(ret != -1){ + 108a: 57fd li a5,-1 + 108c: 0cf51963 bne a0,a5,115e + char *args[] = { "xx", 0 }; + 1090: 00006797 auipc a5,0x6 + 1094: bd878793 addi a5,a5,-1064 # 6c68 + 1098: f4f43c23 sd a5,-168(s0) + 109c: f6043023 sd zero,-160(s0) + ret = exec(b, args); + 10a0: f5840593 addi a1,s0,-168 + 10a4: f6840513 addi a0,s0,-152 + 10a8: 505030ef jal 4dac + if(ret != -1){ + 10ac: 57fd li a5,-1 + 10ae: 0cf51563 bne a0,a5,1178 + int pid = fork(); + 10b2: 4bb030ef jal 4d6c + if(pid < 0){ + 10b6: 0c054d63 bltz a0,1190 + if(pid == 0){ + 10ba: 0e051863 bnez a0,11aa + 10be: 00008797 auipc a5,0x8 + 10c2: 4e278793 addi a5,a5,1250 # 95a0 + 10c6: 00009697 auipc a3,0x9 + 10ca: 4da68693 addi a3,a3,1242 # a5a0 + big[i] = 'x'; + 10ce: 07800713 li a4,120 + 10d2: 00e78023 sb a4,0(a5) + for(int i = 0; i < PGSIZE; i++) + 10d6: 0785 addi a5,a5,1 + 10d8: fed79de3 bne a5,a3,10d2 + big[PGSIZE] = '\0'; + 10dc: 00009797 auipc a5,0x9 + 10e0: 4c078223 sb zero,1220(a5) # a5a0 + char *args2[] = { big, big, big, 0 }; + 10e4: 00006797 auipc a5,0x6 + 10e8: 7ec78793 addi a5,a5,2028 # 78d0 + 10ec: 6fb0 ld a2,88(a5) + 10ee: 73b4 ld a3,96(a5) + 10f0: 77b8 ld a4,104(a5) + 10f2: 7bbc ld a5,112(a5) + 10f4: f2c43823 sd a2,-208(s0) + 10f8: f2d43c23 sd a3,-200(s0) + 10fc: f4e43023 sd a4,-192(s0) + 1100: f4f43423 sd a5,-184(s0) + ret = exec("echo", args2); + 1104: f3040593 addi a1,s0,-208 + 1108: 00004517 auipc a0,0x4 + 110c: 28050513 addi a0,a0,640 # 5388 + 1110: 49d030ef jal 4dac + if(ret != -1){ + 1114: 57fd li a5,-1 + 1116: 08f50663 beq a0,a5,11a2 + printf("exec(echo, BIG) returned %d, not -1\n", fd); + 111a: 55fd li a1,-1 + 111c: 00005517 auipc a0,0x5 + 1120: aa450513 addi a0,a0,-1372 # 5bc0 + 1124: 078040ef jal 519c + exit(1); + 1128: 4505 li a0,1 + 112a: 44b030ef jal 4d74 + printf("unlink(%s) returned %d, not -1\n", b, ret); + 112e: 862a mv a2,a0 + 1130: f6840593 addi a1,s0,-152 + 1134: 00005517 auipc a0,0x5 + 1138: a0450513 addi a0,a0,-1532 # 5b38 + 113c: 060040ef jal 519c + exit(1); + 1140: 4505 li a0,1 + 1142: 433030ef jal 4d74 + printf("open(%s) returned %d, not -1\n", b, fd); + 1146: 862a mv a2,a0 + 1148: f6840593 addi a1,s0,-152 + 114c: 00005517 auipc a0,0x5 + 1150: a0c50513 addi a0,a0,-1524 # 5b58 + 1154: 048040ef jal 519c + exit(1); + 1158: 4505 li a0,1 + 115a: 41b030ef jal 4d74 + printf("link(%s, %s) returned %d, not -1\n", b, b, ret); + 115e: 86aa mv a3,a0 + 1160: f6840613 addi a2,s0,-152 + 1164: 85b2 mv a1,a2 + 1166: 00005517 auipc a0,0x5 + 116a: a1250513 addi a0,a0,-1518 # 5b78 + 116e: 02e040ef jal 519c + exit(1); + 1172: 4505 li a0,1 + 1174: 401030ef jal 4d74 + printf("exec(%s) returned %d, not -1\n", b, fd); + 1178: 567d li a2,-1 + 117a: f6840593 addi a1,s0,-152 + 117e: 00005517 auipc a0,0x5 + 1182: a2250513 addi a0,a0,-1502 # 5ba0 + 1186: 016040ef jal 519c + exit(1); + 118a: 4505 li a0,1 + 118c: 3e9030ef jal 4d74 + printf("fork failed\n"); + 1190: 00006517 auipc a0,0x6 + 1194: 03050513 addi a0,a0,48 # 71c0 + 1198: 004040ef jal 519c + exit(1); + 119c: 4505 li a0,1 + 119e: 3d7030ef jal 4d74 + exit(747); // OK + 11a2: 2eb00513 li a0,747 + 11a6: 3cf030ef jal 4d74 + int st = 0; + 11aa: f4042a23 sw zero,-172(s0) + wait(&st); + 11ae: f5440513 addi a0,s0,-172 + 11b2: 3cb030ef jal 4d7c + if(st != 747){ + 11b6: f5442703 lw a4,-172(s0) + 11ba: 2eb00793 li a5,747 + 11be: 00f71663 bne a4,a5,11ca +} + 11c2: 60ae ld ra,200(sp) + 11c4: 640e ld s0,192(sp) + 11c6: 6169 addi sp,sp,208 + 11c8: 8082 ret + printf("exec(echo, BIG) succeeded, should have failed\n"); + 11ca: 00005517 auipc a0,0x5 + 11ce: a1e50513 addi a0,a0,-1506 # 5be8 + 11d2: 7cb030ef jal 519c + exit(1); + 11d6: 4505 li a0,1 + 11d8: 39d030ef jal 4d74 + +00000000000011dc : +{ + 11dc: 7159 addi sp,sp,-112 + 11de: f486 sd ra,104(sp) + 11e0: f0a2 sd s0,96(sp) + 11e2: e8ca sd s2,80(sp) + 11e4: 1880 addi s0,sp,112 + 11e6: 892a mv s2,a0 + close(open("truncfile", O_CREATE|O_TRUNC|O_WRONLY)); + 11e8: 60100593 li a1,1537 + 11ec: 00004517 auipc a0,0x4 + 11f0: 1f450513 addi a0,a0,500 # 53e0 + 11f4: 3c1030ef jal 4db4 + 11f8: 3a5030ef jal 4d9c + pid = fork(); + 11fc: 371030ef jal 4d6c + if(pid < 0){ + 1200: 06054663 bltz a0,126c + if(pid == 0){ + 1204: e55d bnez a0,12b2 + 1206: eca6 sd s1,88(sp) + 1208: e4ce sd s3,72(sp) + 120a: e0d2 sd s4,64(sp) + 120c: fc56 sd s5,56(sp) + 120e: 06400993 li s3,100 + int fd = open("truncfile", O_WRONLY); + 1212: 00004a17 auipc s4,0x4 + 1216: 1cea0a13 addi s4,s4,462 # 53e0 + int n = write(fd, "1234567890", 10); + 121a: 00005a97 auipc s5,0x5 + 121e: a2ea8a93 addi s5,s5,-1490 # 5c48 + int fd = open("truncfile", O_WRONLY); + 1222: 4585 li a1,1 + 1224: 8552 mv a0,s4 + 1226: 38f030ef jal 4db4 + 122a: 84aa mv s1,a0 + if(fd < 0){ + 122c: 04054e63 bltz a0,1288 + int n = write(fd, "1234567890", 10); + 1230: 4629 li a2,10 + 1232: 85d6 mv a1,s5 + 1234: 361030ef jal 4d94 + if(n != 10){ + 1238: 47a9 li a5,10 + 123a: 06f51163 bne a0,a5,129c + close(fd); + 123e: 8526 mv a0,s1 + 1240: 35d030ef jal 4d9c + fd = open("truncfile", O_RDONLY); + 1244: 4581 li a1,0 + 1246: 8552 mv a0,s4 + 1248: 36d030ef jal 4db4 + 124c: 84aa mv s1,a0 + read(fd, buf, sizeof(buf)); + 124e: 02000613 li a2,32 + 1252: f9840593 addi a1,s0,-104 + 1256: 337030ef jal 4d8c + close(fd); + 125a: 8526 mv a0,s1 + 125c: 341030ef jal 4d9c + for(int i = 0; i < 100; i++){ + 1260: 39fd addiw s3,s3,-1 + 1262: fc0990e3 bnez s3,1222 + exit(0); + 1266: 4501 li a0,0 + 1268: 30d030ef jal 4d74 + 126c: eca6 sd s1,88(sp) + 126e: e4ce sd s3,72(sp) + 1270: e0d2 sd s4,64(sp) + 1272: fc56 sd s5,56(sp) + printf("%s: fork failed\n", s); + 1274: 85ca mv a1,s2 + 1276: 00005517 auipc a0,0x5 + 127a: 9a250513 addi a0,a0,-1630 # 5c18 + 127e: 71f030ef jal 519c + exit(1); + 1282: 4505 li a0,1 + 1284: 2f1030ef jal 4d74 + printf("%s: open failed\n", s); + 1288: 85ca mv a1,s2 + 128a: 00005517 auipc a0,0x5 + 128e: 9a650513 addi a0,a0,-1626 # 5c30 + 1292: 70b030ef jal 519c + exit(1); + 1296: 4505 li a0,1 + 1298: 2dd030ef jal 4d74 + printf("%s: write got %d, expected 10\n", s, n); + 129c: 862a mv a2,a0 + 129e: 85ca mv a1,s2 + 12a0: 00005517 auipc a0,0x5 + 12a4: 9b850513 addi a0,a0,-1608 # 5c58 + 12a8: 6f5030ef jal 519c + exit(1); + 12ac: 4505 li a0,1 + 12ae: 2c7030ef jal 4d74 + 12b2: eca6 sd s1,88(sp) + 12b4: e4ce sd s3,72(sp) + 12b6: e0d2 sd s4,64(sp) + 12b8: fc56 sd s5,56(sp) + 12ba: 09600993 li s3,150 + int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); + 12be: 00004a17 auipc s4,0x4 + 12c2: 122a0a13 addi s4,s4,290 # 53e0 + int n = write(fd, "xxx", 3); + 12c6: 00005a97 auipc s5,0x5 + 12ca: 9b2a8a93 addi s5,s5,-1614 # 5c78 + int fd = open("truncfile", O_CREATE|O_WRONLY|O_TRUNC); + 12ce: 60100593 li a1,1537 + 12d2: 8552 mv a0,s4 + 12d4: 2e1030ef jal 4db4 + 12d8: 84aa mv s1,a0 + if(fd < 0){ + 12da: 02054d63 bltz a0,1314 + int n = write(fd, "xxx", 3); + 12de: 460d li a2,3 + 12e0: 85d6 mv a1,s5 + 12e2: 2b3030ef jal 4d94 + if(n != 3){ + 12e6: 478d li a5,3 + 12e8: 04f51063 bne a0,a5,1328 + close(fd); + 12ec: 8526 mv a0,s1 + 12ee: 2af030ef jal 4d9c + for(int i = 0; i < 150; i++){ + 12f2: 39fd addiw s3,s3,-1 + 12f4: fc099de3 bnez s3,12ce + wait(&xstatus); + 12f8: fbc40513 addi a0,s0,-68 + 12fc: 281030ef jal 4d7c + unlink("truncfile"); + 1300: 00004517 auipc a0,0x4 + 1304: 0e050513 addi a0,a0,224 # 53e0 + 1308: 2bd030ef jal 4dc4 + exit(xstatus); + 130c: fbc42503 lw a0,-68(s0) + 1310: 265030ef jal 4d74 + printf("%s: open failed\n", s); + 1314: 85ca mv a1,s2 + 1316: 00005517 auipc a0,0x5 + 131a: 91a50513 addi a0,a0,-1766 # 5c30 + 131e: 67f030ef jal 519c + exit(1); + 1322: 4505 li a0,1 + 1324: 251030ef jal 4d74 + printf("%s: write got %d, expected 3\n", s, n); + 1328: 862a mv a2,a0 + 132a: 85ca mv a1,s2 + 132c: 00005517 auipc a0,0x5 + 1330: 95450513 addi a0,a0,-1708 # 5c80 + 1334: 669030ef jal 519c + exit(1); + 1338: 4505 li a0,1 + 133a: 23b030ef jal 4d74 + +000000000000133e : +{ + 133e: 715d addi sp,sp,-80 + 1340: e486 sd ra,72(sp) + 1342: e0a2 sd s0,64(sp) + 1344: f84a sd s2,48(sp) + 1346: 0880 addi s0,sp,80 + 1348: 892a mv s2,a0 + char *echoargv[] = { "echo", "OK", 0 }; + 134a: 00004797 auipc a5,0x4 + 134e: 03e78793 addi a5,a5,62 # 5388 + 1352: fcf43023 sd a5,-64(s0) + 1356: 00005797 auipc a5,0x5 + 135a: 94a78793 addi a5,a5,-1718 # 5ca0 + 135e: fcf43423 sd a5,-56(s0) + 1362: fc043823 sd zero,-48(s0) + unlink("echo-ok"); + 1366: 00005517 auipc a0,0x5 + 136a: 94250513 addi a0,a0,-1726 # 5ca8 + 136e: 257030ef jal 4dc4 + pid = fork(); + 1372: 1fb030ef jal 4d6c + if(pid < 0) { + 1376: 02054f63 bltz a0,13b4 + 137a: fc26 sd s1,56(sp) + 137c: 84aa mv s1,a0 + if(pid == 0) { + 137e: e935 bnez a0,13f2 + close(1); + 1380: 4505 li a0,1 + 1382: 21b030ef jal 4d9c + fd = open("echo-ok", O_CREATE|O_WRONLY); + 1386: 20100593 li a1,513 + 138a: 00005517 auipc a0,0x5 + 138e: 91e50513 addi a0,a0,-1762 # 5ca8 + 1392: 223030ef jal 4db4 + if(fd < 0) { + 1396: 02054a63 bltz a0,13ca + if(fd != 1) { + 139a: 4785 li a5,1 + 139c: 04f50163 beq a0,a5,13de + printf("%s: wrong fd\n", s); + 13a0: 85ca mv a1,s2 + 13a2: 00005517 auipc a0,0x5 + 13a6: 92650513 addi a0,a0,-1754 # 5cc8 + 13aa: 5f3030ef jal 519c + exit(1); + 13ae: 4505 li a0,1 + 13b0: 1c5030ef jal 4d74 + 13b4: fc26 sd s1,56(sp) + printf("%s: fork failed\n", s); + 13b6: 85ca mv a1,s2 + 13b8: 00005517 auipc a0,0x5 + 13bc: 86050513 addi a0,a0,-1952 # 5c18 + 13c0: 5dd030ef jal 519c + exit(1); + 13c4: 4505 li a0,1 + 13c6: 1af030ef jal 4d74 + printf("%s: create failed\n", s); + 13ca: 85ca mv a1,s2 + 13cc: 00005517 auipc a0,0x5 + 13d0: 8e450513 addi a0,a0,-1820 # 5cb0 + 13d4: 5c9030ef jal 519c + exit(1); + 13d8: 4505 li a0,1 + 13da: 19b030ef jal 4d74 + if(exec("echo", echoargv) < 0){ + 13de: fc040593 addi a1,s0,-64 + 13e2: 00004517 auipc a0,0x4 + 13e6: fa650513 addi a0,a0,-90 # 5388 + 13ea: 1c3030ef jal 4dac + 13ee: 00054d63 bltz a0,1408 + if (wait(&xstatus) != pid) { + 13f2: fdc40513 addi a0,s0,-36 + 13f6: 187030ef jal 4d7c + 13fa: 02951163 bne a0,s1,141c + if(xstatus != 0) + 13fe: fdc42503 lw a0,-36(s0) + 1402: c50d beqz a0,142c + exit(xstatus); + 1404: 171030ef jal 4d74 + printf("%s: exec echo failed\n", s); + 1408: 85ca mv a1,s2 + 140a: 00005517 auipc a0,0x5 + 140e: 8ce50513 addi a0,a0,-1842 # 5cd8 + 1412: 58b030ef jal 519c + exit(1); + 1416: 4505 li a0,1 + 1418: 15d030ef jal 4d74 + printf("%s: wait failed!\n", s); + 141c: 85ca mv a1,s2 + 141e: 00005517 auipc a0,0x5 + 1422: 8d250513 addi a0,a0,-1838 # 5cf0 + 1426: 577030ef jal 519c + 142a: bfd1 j 13fe + fd = open("echo-ok", O_RDONLY); + 142c: 4581 li a1,0 + 142e: 00005517 auipc a0,0x5 + 1432: 87a50513 addi a0,a0,-1926 # 5ca8 + 1436: 17f030ef jal 4db4 + if(fd < 0) { + 143a: 02054463 bltz a0,1462 + if (read(fd, buf, 2) != 2) { + 143e: 4609 li a2,2 + 1440: fb840593 addi a1,s0,-72 + 1444: 149030ef jal 4d8c + 1448: 4789 li a5,2 + 144a: 02f50663 beq a0,a5,1476 + printf("%s: read failed\n", s); + 144e: 85ca mv a1,s2 + 1450: 00004517 auipc a0,0x4 + 1454: 30850513 addi a0,a0,776 # 5758 + 1458: 545030ef jal 519c + exit(1); + 145c: 4505 li a0,1 + 145e: 117030ef jal 4d74 + printf("%s: open failed\n", s); + 1462: 85ca mv a1,s2 + 1464: 00004517 auipc a0,0x4 + 1468: 7cc50513 addi a0,a0,1996 # 5c30 + 146c: 531030ef jal 519c + exit(1); + 1470: 4505 li a0,1 + 1472: 103030ef jal 4d74 + unlink("echo-ok"); + 1476: 00005517 auipc a0,0x5 + 147a: 83250513 addi a0,a0,-1998 # 5ca8 + 147e: 147030ef jal 4dc4 + if(buf[0] == 'O' && buf[1] == 'K') + 1482: fb844703 lbu a4,-72(s0) + 1486: 04f00793 li a5,79 + 148a: 00f71863 bne a4,a5,149a + 148e: fb944703 lbu a4,-71(s0) + 1492: 04b00793 li a5,75 + 1496: 00f70c63 beq a4,a5,14ae + printf("%s: wrong output\n", s); + 149a: 85ca mv a1,s2 + 149c: 00005517 auipc a0,0x5 + 14a0: 86c50513 addi a0,a0,-1940 # 5d08 + 14a4: 4f9030ef jal 519c + exit(1); + 14a8: 4505 li a0,1 + 14aa: 0cb030ef jal 4d74 + exit(0); + 14ae: 4501 li a0,0 + 14b0: 0c5030ef jal 4d74 + +00000000000014b4 : +{ + 14b4: 711d addi sp,sp,-96 + 14b6: ec86 sd ra,88(sp) + 14b8: e8a2 sd s0,80(sp) + 14ba: fc4e sd s3,56(sp) + 14bc: 1080 addi s0,sp,96 + 14be: 89aa mv s3,a0 + if(pipe(fds) != 0){ + 14c0: fa840513 addi a0,s0,-88 + 14c4: 0c1030ef jal 4d84 + 14c8: e92d bnez a0,153a + 14ca: e4a6 sd s1,72(sp) + 14cc: f852 sd s4,48(sp) + 14ce: 84aa mv s1,a0 + pid = fork(); + 14d0: 09d030ef jal 4d6c + 14d4: 8a2a mv s4,a0 + if(pid == 0){ + 14d6: c151 beqz a0,155a + } else if(pid > 0){ + 14d8: 14a05e63 blez a0,1634 + 14dc: e0ca sd s2,64(sp) + 14de: f456 sd s5,40(sp) + close(fds[1]); + 14e0: fac42503 lw a0,-84(s0) + 14e4: 0b9030ef jal 4d9c + total = 0; + 14e8: 8a26 mv s4,s1 + cc = 1; + 14ea: 4905 li s2,1 + while((n = read(fds[0], buf, cc)) > 0){ + 14ec: 0000ba97 auipc s5,0xb + 14f0: 7cca8a93 addi s5,s5,1996 # ccb8 + 14f4: 864a mv a2,s2 + 14f6: 85d6 mv a1,s5 + 14f8: fa842503 lw a0,-88(s0) + 14fc: 091030ef jal 4d8c + 1500: 0ea05a63 blez a0,15f4 + for(i = 0; i < n; i++){ + 1504: 0000b717 auipc a4,0xb + 1508: 7b470713 addi a4,a4,1972 # ccb8 + 150c: 00a4863b addw a2,s1,a0 + if((buf[i] & 0xff) != (seq++ & 0xff)){ + 1510: 00074683 lbu a3,0(a4) + 1514: 0ff4f793 zext.b a5,s1 + 1518: 2485 addiw s1,s1,1 + 151a: 0af69d63 bne a3,a5,15d4 + for(i = 0; i < n; i++){ + 151e: 0705 addi a4,a4,1 + 1520: fec498e3 bne s1,a2,1510 + total += n; + 1524: 00aa0a3b addw s4,s4,a0 + cc = cc * 2; + 1528: 0019179b slliw a5,s2,0x1 + 152c: 0007891b sext.w s2,a5 + if(cc > sizeof(buf)) + 1530: 670d lui a4,0x3 + 1532: fd2771e3 bgeu a4,s2,14f4 + cc = sizeof(buf); + 1536: 690d lui s2,0x3 + 1538: bf75 j 14f4 + 153a: e4a6 sd s1,72(sp) + 153c: e0ca sd s2,64(sp) + 153e: f852 sd s4,48(sp) + 1540: f456 sd s5,40(sp) + 1542: f05a sd s6,32(sp) + 1544: ec5e sd s7,24(sp) + printf("%s: pipe() failed\n", s); + 1546: 85ce mv a1,s3 + 1548: 00004517 auipc a0,0x4 + 154c: 7d850513 addi a0,a0,2008 # 5d20 + 1550: 44d030ef jal 519c + exit(1); + 1554: 4505 li a0,1 + 1556: 01f030ef jal 4d74 + 155a: e0ca sd s2,64(sp) + 155c: f456 sd s5,40(sp) + 155e: f05a sd s6,32(sp) + 1560: ec5e sd s7,24(sp) + close(fds[0]); + 1562: fa842503 lw a0,-88(s0) + 1566: 037030ef jal 4d9c + for(n = 0; n < N; n++){ + 156a: 0000bb17 auipc s6,0xb + 156e: 74eb0b13 addi s6,s6,1870 # ccb8 + 1572: 416004bb negw s1,s6 + 1576: 0ff4f493 zext.b s1,s1 + 157a: 409b0913 addi s2,s6,1033 + if(write(fds[1], buf, SZ) != SZ){ + 157e: 8bda mv s7,s6 + for(n = 0; n < N; n++){ + 1580: 6a85 lui s5,0x1 + 1582: 42da8a93 addi s5,s5,1069 # 142d +{ + 1586: 87da mv a5,s6 + buf[i] = seq++; + 1588: 0097873b addw a4,a5,s1 + 158c: 00e78023 sb a4,0(a5) + for(i = 0; i < SZ; i++) + 1590: 0785 addi a5,a5,1 + 1592: ff279be3 bne a5,s2,1588 + 1596: 409a0a1b addiw s4,s4,1033 + if(write(fds[1], buf, SZ) != SZ){ + 159a: 40900613 li a2,1033 + 159e: 85de mv a1,s7 + 15a0: fac42503 lw a0,-84(s0) + 15a4: 7f0030ef jal 4d94 + 15a8: 40900793 li a5,1033 + 15ac: 00f51a63 bne a0,a5,15c0 + for(n = 0; n < N; n++){ + 15b0: 24a5 addiw s1,s1,9 + 15b2: 0ff4f493 zext.b s1,s1 + 15b6: fd5a18e3 bne s4,s5,1586 + exit(0); + 15ba: 4501 li a0,0 + 15bc: 7b8030ef jal 4d74 + printf("%s: pipe1 oops 1\n", s); + 15c0: 85ce mv a1,s3 + 15c2: 00004517 auipc a0,0x4 + 15c6: 77650513 addi a0,a0,1910 # 5d38 + 15ca: 3d3030ef jal 519c + exit(1); + 15ce: 4505 li a0,1 + 15d0: 7a4030ef jal 4d74 + printf("%s: pipe1 oops 2\n", s); + 15d4: 85ce mv a1,s3 + 15d6: 00004517 auipc a0,0x4 + 15da: 77a50513 addi a0,a0,1914 # 5d50 + 15de: 3bf030ef jal 519c + return; + 15e2: 64a6 ld s1,72(sp) + 15e4: 6906 ld s2,64(sp) + 15e6: 7a42 ld s4,48(sp) + 15e8: 7aa2 ld s5,40(sp) +} + 15ea: 60e6 ld ra,88(sp) + 15ec: 6446 ld s0,80(sp) + 15ee: 79e2 ld s3,56(sp) + 15f0: 6125 addi sp,sp,96 + 15f2: 8082 ret + if(total != N * SZ){ + 15f4: 6785 lui a5,0x1 + 15f6: 42d78793 addi a5,a5,1069 # 142d + 15fa: 00fa0f63 beq s4,a5,1618 + 15fe: f05a sd s6,32(sp) + 1600: ec5e sd s7,24(sp) + printf("%s: pipe1 oops 3 total %d\n", s, total); + 1602: 8652 mv a2,s4 + 1604: 85ce mv a1,s3 + 1606: 00004517 auipc a0,0x4 + 160a: 76250513 addi a0,a0,1890 # 5d68 + 160e: 38f030ef jal 519c + exit(1); + 1612: 4505 li a0,1 + 1614: 760030ef jal 4d74 + 1618: f05a sd s6,32(sp) + 161a: ec5e sd s7,24(sp) + close(fds[0]); + 161c: fa842503 lw a0,-88(s0) + 1620: 77c030ef jal 4d9c + wait(&xstatus); + 1624: fa440513 addi a0,s0,-92 + 1628: 754030ef jal 4d7c + exit(xstatus); + 162c: fa442503 lw a0,-92(s0) + 1630: 744030ef jal 4d74 + 1634: e0ca sd s2,64(sp) + 1636: f456 sd s5,40(sp) + 1638: f05a sd s6,32(sp) + 163a: ec5e sd s7,24(sp) + printf("%s: fork() failed\n", s); + 163c: 85ce mv a1,s3 + 163e: 00004517 auipc a0,0x4 + 1642: 74a50513 addi a0,a0,1866 # 5d88 + 1646: 357030ef jal 519c + exit(1); + 164a: 4505 li a0,1 + 164c: 728030ef jal 4d74 + +0000000000001650 : +{ + 1650: 7139 addi sp,sp,-64 + 1652: fc06 sd ra,56(sp) + 1654: f822 sd s0,48(sp) + 1656: f426 sd s1,40(sp) + 1658: f04a sd s2,32(sp) + 165a: ec4e sd s3,24(sp) + 165c: e852 sd s4,16(sp) + 165e: 0080 addi s0,sp,64 + 1660: 8a2a mv s4,a0 + for(i = 0; i < 100; i++){ + 1662: 4901 li s2,0 + 1664: 06400993 li s3,100 + pid = fork(); + 1668: 704030ef jal 4d6c + 166c: 84aa mv s1,a0 + if(pid < 0){ + 166e: 02054863 bltz a0,169e + if(pid){ + 1672: c525 beqz a0,16da + if(wait(&xstate) != pid){ + 1674: fcc40513 addi a0,s0,-52 + 1678: 704030ef jal 4d7c + 167c: 02951b63 bne a0,s1,16b2 + if(i != xstate) { + 1680: fcc42783 lw a5,-52(s0) + 1684: 05279163 bne a5,s2,16c6 + for(i = 0; i < 100; i++){ + 1688: 2905 addiw s2,s2,1 # 3001 + 168a: fd391fe3 bne s2,s3,1668 +} + 168e: 70e2 ld ra,56(sp) + 1690: 7442 ld s0,48(sp) + 1692: 74a2 ld s1,40(sp) + 1694: 7902 ld s2,32(sp) + 1696: 69e2 ld s3,24(sp) + 1698: 6a42 ld s4,16(sp) + 169a: 6121 addi sp,sp,64 + 169c: 8082 ret + printf("%s: fork failed\n", s); + 169e: 85d2 mv a1,s4 + 16a0: 00004517 auipc a0,0x4 + 16a4: 57850513 addi a0,a0,1400 # 5c18 + 16a8: 2f5030ef jal 519c + exit(1); + 16ac: 4505 li a0,1 + 16ae: 6c6030ef jal 4d74 + printf("%s: wait wrong pid\n", s); + 16b2: 85d2 mv a1,s4 + 16b4: 00004517 auipc a0,0x4 + 16b8: 6ec50513 addi a0,a0,1772 # 5da0 + 16bc: 2e1030ef jal 519c + exit(1); + 16c0: 4505 li a0,1 + 16c2: 6b2030ef jal 4d74 + printf("%s: wait wrong exit status\n", s); + 16c6: 85d2 mv a1,s4 + 16c8: 00004517 auipc a0,0x4 + 16cc: 6f050513 addi a0,a0,1776 # 5db8 + 16d0: 2cd030ef jal 519c + exit(1); + 16d4: 4505 li a0,1 + 16d6: 69e030ef jal 4d74 + exit(i); + 16da: 854a mv a0,s2 + 16dc: 698030ef jal 4d74 + +00000000000016e0 : +{ + 16e0: 1101 addi sp,sp,-32 + 16e2: ec06 sd ra,24(sp) + 16e4: e822 sd s0,16(sp) + 16e6: e426 sd s1,8(sp) + 16e8: e04a sd s2,0(sp) + 16ea: 1000 addi s0,sp,32 + 16ec: 892a mv s2,a0 + 16ee: 3e800493 li s1,1000 + int pid1 = fork(); + 16f2: 67a030ef jal 4d6c + if(pid1 < 0){ + 16f6: 02054663 bltz a0,1722 + if(pid1 == 0){ + 16fa: cd15 beqz a0,1736 + int pid2 = fork(); + 16fc: 670030ef jal 4d6c + if(pid2 < 0){ + 1700: 02054d63 bltz a0,173a + if(pid2 == 0){ + 1704: c529 beqz a0,174e + wait(0); + 1706: 4501 li a0,0 + 1708: 674030ef jal 4d7c + wait(0); + 170c: 4501 li a0,0 + 170e: 66e030ef jal 4d7c + for(int i = 0; i < 1000; i++){ + 1712: 34fd addiw s1,s1,-1 + 1714: fcf9 bnez s1,16f2 +} + 1716: 60e2 ld ra,24(sp) + 1718: 6442 ld s0,16(sp) + 171a: 64a2 ld s1,8(sp) + 171c: 6902 ld s2,0(sp) + 171e: 6105 addi sp,sp,32 + 1720: 8082 ret + printf("%s: fork failed\n", s); + 1722: 85ca mv a1,s2 + 1724: 00004517 auipc a0,0x4 + 1728: 4f450513 addi a0,a0,1268 # 5c18 + 172c: 271030ef jal 519c + exit(1); + 1730: 4505 li a0,1 + 1732: 642030ef jal 4d74 + exit(0); + 1736: 63e030ef jal 4d74 + printf("%s: fork failed\n", s); + 173a: 85ca mv a1,s2 + 173c: 00004517 auipc a0,0x4 + 1740: 4dc50513 addi a0,a0,1244 # 5c18 + 1744: 259030ef jal 519c + exit(1); + 1748: 4505 li a0,1 + 174a: 62a030ef jal 4d74 + exit(0); + 174e: 626030ef jal 4d74 + +0000000000001752 : +{ + 1752: 7179 addi sp,sp,-48 + 1754: f406 sd ra,40(sp) + 1756: f022 sd s0,32(sp) + 1758: ec26 sd s1,24(sp) + 175a: 1800 addi s0,sp,48 + 175c: 84aa mv s1,a0 + int pid = fork(); + 175e: 60e030ef jal 4d6c + if(pid < 0){ + 1762: 02054b63 bltz a0,1798 + if(pid == 0){ + 1766: c139 beqz a0,17ac + int pid = fork(); + 1768: 604030ef jal 4d6c + if(pid < 0){ + 176c: 02054663 bltz a0,1798 + if(pid == 0){ + 1770: cd15 beqz a0,17ac + wait(&xstatus); + 1772: fdc40513 addi a0,s0,-36 + 1776: 606030ef jal 4d7c + if(xstatus != 0) { + 177a: fdc42783 lw a5,-36(s0) + 177e: ebb9 bnez a5,17d4 + wait(&xstatus); + 1780: fdc40513 addi a0,s0,-36 + 1784: 5f8030ef jal 4d7c + if(xstatus != 0) { + 1788: fdc42783 lw a5,-36(s0) + 178c: e7a1 bnez a5,17d4 +} + 178e: 70a2 ld ra,40(sp) + 1790: 7402 ld s0,32(sp) + 1792: 64e2 ld s1,24(sp) + 1794: 6145 addi sp,sp,48 + 1796: 8082 ret + printf("%s: fork failed", s); + 1798: 85a6 mv a1,s1 + 179a: 00004517 auipc a0,0x4 + 179e: 63e50513 addi a0,a0,1598 # 5dd8 + 17a2: 1fb030ef jal 519c + exit(1); + 17a6: 4505 li a0,1 + 17a8: 5cc030ef jal 4d74 +{ + 17ac: 0c800493 li s1,200 + int pid1 = fork(); + 17b0: 5bc030ef jal 4d6c + if(pid1 < 0){ + 17b4: 00054b63 bltz a0,17ca + if(pid1 == 0){ + 17b8: cd01 beqz a0,17d0 + wait(0); + 17ba: 4501 li a0,0 + 17bc: 5c0030ef jal 4d7c + for(int j = 0; j < 200; j++){ + 17c0: 34fd addiw s1,s1,-1 + 17c2: f4fd bnez s1,17b0 + exit(0); + 17c4: 4501 li a0,0 + 17c6: 5ae030ef jal 4d74 + exit(1); + 17ca: 4505 li a0,1 + 17cc: 5a8030ef jal 4d74 + exit(0); + 17d0: 5a4030ef jal 4d74 + printf("%s: fork in child failed", s); + 17d4: 85a6 mv a1,s1 + 17d6: 00004517 auipc a0,0x4 + 17da: 61250513 addi a0,a0,1554 # 5de8 + 17de: 1bf030ef jal 519c + exit(1); + 17e2: 4505 li a0,1 + 17e4: 590030ef jal 4d74 + +00000000000017e8 : +{ + 17e8: 1101 addi sp,sp,-32 + 17ea: ec06 sd ra,24(sp) + 17ec: e822 sd s0,16(sp) + 17ee: e426 sd s1,8(sp) + 17f0: 1000 addi s0,sp,32 + 17f2: 32000493 li s1,800 + int pid1 = fork(); + 17f6: 576030ef jal 4d6c + if(pid1 < 0){ + 17fa: 00054b63 bltz a0,1810 + if(pid1 == 0){ + 17fe: c115 beqz a0,1822 + wait(0); + 1800: 4501 li a0,0 + 1802: 57a030ef jal 4d7c + for(int i = 0; i < 800; i++){ + 1806: 34fd addiw s1,s1,-1 + 1808: f4fd bnez s1,17f6 + exit(0); + 180a: 4501 li a0,0 + 180c: 568030ef jal 4d74 + printf("fork failed\n"); + 1810: 00006517 auipc a0,0x6 + 1814: 9b050513 addi a0,a0,-1616 # 71c0 + 1818: 185030ef jal 519c + exit(1); + 181c: 4505 li a0,1 + 181e: 556030ef jal 4d74 + fork(); + 1822: 54a030ef jal 4d6c + fork(); + 1826: 546030ef jal 4d6c + exit(0); + 182a: 4501 li a0,0 + 182c: 548030ef jal 4d74 + +0000000000001830 : +{ + 1830: 7175 addi sp,sp,-144 + 1832: e506 sd ra,136(sp) + 1834: e122 sd s0,128(sp) + 1836: fca6 sd s1,120(sp) + 1838: f8ca sd s2,112(sp) + 183a: f4ce sd s3,104(sp) + 183c: f0d2 sd s4,96(sp) + 183e: ecd6 sd s5,88(sp) + 1840: e8da sd s6,80(sp) + 1842: e4de sd s7,72(sp) + 1844: e0e2 sd s8,64(sp) + 1846: fc66 sd s9,56(sp) + 1848: 0900 addi s0,sp,144 + 184a: 8caa mv s9,a0 + for(pi = 0; pi < NCHILD; pi++){ + 184c: 4901 li s2,0 + 184e: 4991 li s3,4 + pid = fork(); + 1850: 51c030ef jal 4d6c + 1854: 84aa mv s1,a0 + if(pid < 0){ + 1856: 02054d63 bltz a0,1890 + if(pid == 0){ + 185a: c529 beqz a0,18a4 + for(pi = 0; pi < NCHILD; pi++){ + 185c: 2905 addiw s2,s2,1 + 185e: ff3919e3 bne s2,s3,1850 + 1862: 4491 li s1,4 + wait(&xstatus); + 1864: f7c40513 addi a0,s0,-132 + 1868: 514030ef jal 4d7c + if(xstatus != 0) + 186c: f7c42903 lw s2,-132(s0) + 1870: 0a091e63 bnez s2,192c + for(pi = 0; pi < NCHILD; pi++){ + 1874: 34fd addiw s1,s1,-1 + 1876: f4fd bnez s1,1864 + name[0] = name[1] = name[2] = 0; + 1878: f8040123 sb zero,-126(s0) + 187c: 03000993 li s3,48 + 1880: 5a7d li s4,-1 + 1882: 07000c13 li s8,112 + if((i == 0 || i >= N/2) && fd < 0){ + 1886: 4b25 li s6,9 + } else if((i >= 1 && i < N/2) && fd >= 0){ + 1888: 4ba1 li s7,8 + for(pi = 0; pi < NCHILD; pi++){ + 188a: 07400a93 li s5,116 + 188e: aa39 j 19ac + printf("%s: fork failed\n", s); + 1890: 85e6 mv a1,s9 + 1892: 00004517 auipc a0,0x4 + 1896: 38650513 addi a0,a0,902 # 5c18 + 189a: 103030ef jal 519c + exit(1); + 189e: 4505 li a0,1 + 18a0: 4d4030ef jal 4d74 + name[0] = 'p' + pi; + 18a4: 0709091b addiw s2,s2,112 + 18a8: f9240023 sb s2,-128(s0) + name[2] = '\0'; + 18ac: f8040123 sb zero,-126(s0) + for(i = 0; i < N; i++){ + 18b0: 4951 li s2,20 + 18b2: a831 j 18ce + printf("%s: create failed\n", s); + 18b4: 85e6 mv a1,s9 + 18b6: 00004517 auipc a0,0x4 + 18ba: 3fa50513 addi a0,a0,1018 # 5cb0 + 18be: 0df030ef jal 519c + exit(1); + 18c2: 4505 li a0,1 + 18c4: 4b0030ef jal 4d74 + for(i = 0; i < N; i++){ + 18c8: 2485 addiw s1,s1,1 + 18ca: 05248e63 beq s1,s2,1926 + name[1] = '0' + i; + 18ce: 0304879b addiw a5,s1,48 + 18d2: f8f400a3 sb a5,-127(s0) + fd = open(name, O_CREATE | O_RDWR); + 18d6: 20200593 li a1,514 + 18da: f8040513 addi a0,s0,-128 + 18de: 4d6030ef jal 4db4 + if(fd < 0){ + 18e2: fc0549e3 bltz a0,18b4 + close(fd); + 18e6: 4b6030ef jal 4d9c + if(i > 0 && (i % 2 ) == 0){ + 18ea: 10905063 blez s1,19ea + 18ee: 0014f793 andi a5,s1,1 + 18f2: fbf9 bnez a5,18c8 + name[1] = '0' + (i / 2); + 18f4: 01f4d79b srliw a5,s1,0x1f + 18f8: 9fa5 addw a5,a5,s1 + 18fa: 4017d79b sraiw a5,a5,0x1 + 18fe: 0307879b addiw a5,a5,48 + 1902: f8f400a3 sb a5,-127(s0) + if(unlink(name) < 0){ + 1906: f8040513 addi a0,s0,-128 + 190a: 4ba030ef jal 4dc4 + 190e: fa055de3 bgez a0,18c8 + printf("%s: unlink failed\n", s); + 1912: 85e6 mv a1,s9 + 1914: 00004517 auipc a0,0x4 + 1918: 4f450513 addi a0,a0,1268 # 5e08 + 191c: 081030ef jal 519c + exit(1); + 1920: 4505 li a0,1 + 1922: 452030ef jal 4d74 + exit(0); + 1926: 4501 li a0,0 + 1928: 44c030ef jal 4d74 + exit(1); + 192c: 4505 li a0,1 + 192e: 446030ef jal 4d74 + printf("%s: oops createdelete %s didn't exist\n", s, name); + 1932: f8040613 addi a2,s0,-128 + 1936: 85e6 mv a1,s9 + 1938: 00004517 auipc a0,0x4 + 193c: 4e850513 addi a0,a0,1256 # 5e20 + 1940: 05d030ef jal 519c + exit(1); + 1944: 4505 li a0,1 + 1946: 42e030ef jal 4d74 + } else if((i >= 1 && i < N/2) && fd >= 0){ + 194a: 034bfb63 bgeu s7,s4,1980 + if(fd >= 0) + 194e: 02055663 bgez a0,197a + for(pi = 0; pi < NCHILD; pi++){ + 1952: 2485 addiw s1,s1,1 + 1954: 0ff4f493 zext.b s1,s1 + 1958: 05548263 beq s1,s5,199c + name[0] = 'p' + pi; + 195c: f8940023 sb s1,-128(s0) + name[1] = '0' + i; + 1960: f93400a3 sb s3,-127(s0) + fd = open(name, 0); + 1964: 4581 li a1,0 + 1966: f8040513 addi a0,s0,-128 + 196a: 44a030ef jal 4db4 + if((i == 0 || i >= N/2) && fd < 0){ + 196e: 00090463 beqz s2,1976 + 1972: fd2b5ce3 bge s6,s2,194a + 1976: fa054ee3 bltz a0,1932 + close(fd); + 197a: 422030ef jal 4d9c + 197e: bfd1 j 1952 + } else if((i >= 1 && i < N/2) && fd >= 0){ + 1980: fc0549e3 bltz a0,1952 + printf("%s: oops createdelete %s did exist\n", s, name); + 1984: f8040613 addi a2,s0,-128 + 1988: 85e6 mv a1,s9 + 198a: 00004517 auipc a0,0x4 + 198e: 4be50513 addi a0,a0,1214 # 5e48 + 1992: 00b030ef jal 519c + exit(1); + 1996: 4505 li a0,1 + 1998: 3dc030ef jal 4d74 + for(i = 0; i < N; i++){ + 199c: 2905 addiw s2,s2,1 + 199e: 2a05 addiw s4,s4,1 + 19a0: 2985 addiw s3,s3,1 + 19a2: 0ff9f993 zext.b s3,s3 + 19a6: 47d1 li a5,20 + 19a8: 02f90863 beq s2,a5,19d8 + for(pi = 0; pi < NCHILD; pi++){ + 19ac: 84e2 mv s1,s8 + 19ae: b77d j 195c + for(i = 0; i < N; i++){ + 19b0: 2905 addiw s2,s2,1 + 19b2: 0ff97913 zext.b s2,s2 + 19b6: 03490c63 beq s2,s4,19ee + name[0] = name[1] = name[2] = 0; + 19ba: 84d6 mv s1,s5 + name[0] = 'p' + pi; + 19bc: f8940023 sb s1,-128(s0) + name[1] = '0' + i; + 19c0: f92400a3 sb s2,-127(s0) + unlink(name); + 19c4: f8040513 addi a0,s0,-128 + 19c8: 3fc030ef jal 4dc4 + for(pi = 0; pi < NCHILD; pi++){ + 19cc: 2485 addiw s1,s1,1 + 19ce: 0ff4f493 zext.b s1,s1 + 19d2: ff3495e3 bne s1,s3,19bc + 19d6: bfe9 j 19b0 + 19d8: 03000913 li s2,48 + name[0] = name[1] = name[2] = 0; + 19dc: 07000a93 li s5,112 + for(pi = 0; pi < NCHILD; pi++){ + 19e0: 07400993 li s3,116 + for(i = 0; i < N; i++){ + 19e4: 04400a13 li s4,68 + 19e8: bfc9 j 19ba + for(i = 0; i < N; i++){ + 19ea: 2485 addiw s1,s1,1 + 19ec: b5cd j 18ce +} + 19ee: 60aa ld ra,136(sp) + 19f0: 640a ld s0,128(sp) + 19f2: 74e6 ld s1,120(sp) + 19f4: 7946 ld s2,112(sp) + 19f6: 79a6 ld s3,104(sp) + 19f8: 7a06 ld s4,96(sp) + 19fa: 6ae6 ld s5,88(sp) + 19fc: 6b46 ld s6,80(sp) + 19fe: 6ba6 ld s7,72(sp) + 1a00: 6c06 ld s8,64(sp) + 1a02: 7ce2 ld s9,56(sp) + 1a04: 6149 addi sp,sp,144 + 1a06: 8082 ret + +0000000000001a08 : +{ + 1a08: 711d addi sp,sp,-96 + 1a0a: ec86 sd ra,88(sp) + 1a0c: e8a2 sd s0,80(sp) + 1a0e: e4a6 sd s1,72(sp) + 1a10: e0ca sd s2,64(sp) + 1a12: fc4e sd s3,56(sp) + 1a14: f852 sd s4,48(sp) + 1a16: f456 sd s5,40(sp) + 1a18: f05a sd s6,32(sp) + 1a1a: ec5e sd s7,24(sp) + 1a1c: e862 sd s8,16(sp) + 1a1e: e466 sd s9,8(sp) + 1a20: 1080 addi s0,sp,96 + 1a22: 84aa mv s1,a0 + unlink("x"); + 1a24: 00004517 auipc a0,0x4 + 1a28: 9d450513 addi a0,a0,-1580 # 53f8 + 1a2c: 398030ef jal 4dc4 + pid = fork(); + 1a30: 33c030ef jal 4d6c + if(pid < 0){ + 1a34: 02054b63 bltz a0,1a6a + 1a38: 8caa mv s9,a0 + unsigned int x = (pid ? 1 : 97); + 1a3a: 06100913 li s2,97 + 1a3e: c111 beqz a0,1a42 + 1a40: 4905 li s2,1 + 1a42: 06400493 li s1,100 + x = x * 1103515245 + 12345; + 1a46: 41c65a37 lui s4,0x41c65 + 1a4a: e6da0a1b addiw s4,s4,-403 # 41c64e6d + 1a4e: 698d lui s3,0x3 + 1a50: 0399899b addiw s3,s3,57 # 3039 + if((x % 3) == 0){ + 1a54: 4a8d li s5,3 + } else if((x % 3) == 1){ + 1a56: 4b85 li s7,1 + unlink("x"); + 1a58: 00004b17 auipc s6,0x4 + 1a5c: 9a0b0b13 addi s6,s6,-1632 # 53f8 + link("cat", "x"); + 1a60: 00004c17 auipc s8,0x4 + 1a64: 410c0c13 addi s8,s8,1040 # 5e70 + 1a68: a025 j 1a90 + printf("%s: fork failed\n", s); + 1a6a: 85a6 mv a1,s1 + 1a6c: 00004517 auipc a0,0x4 + 1a70: 1ac50513 addi a0,a0,428 # 5c18 + 1a74: 728030ef jal 519c + exit(1); + 1a78: 4505 li a0,1 + 1a7a: 2fa030ef jal 4d74 + close(open("x", O_RDWR | O_CREATE)); + 1a7e: 20200593 li a1,514 + 1a82: 855a mv a0,s6 + 1a84: 330030ef jal 4db4 + 1a88: 314030ef jal 4d9c + for(i = 0; i < 100; i++){ + 1a8c: 34fd addiw s1,s1,-1 + 1a8e: c495 beqz s1,1aba + x = x * 1103515245 + 12345; + 1a90: 034907bb mulw a5,s2,s4 + 1a94: 013787bb addw a5,a5,s3 + 1a98: 0007891b sext.w s2,a5 + if((x % 3) == 0){ + 1a9c: 0357f7bb remuw a5,a5,s5 + 1aa0: 2781 sext.w a5,a5 + 1aa2: dff1 beqz a5,1a7e + } else if((x % 3) == 1){ + 1aa4: 01778663 beq a5,s7,1ab0 + unlink("x"); + 1aa8: 855a mv a0,s6 + 1aaa: 31a030ef jal 4dc4 + 1aae: bff9 j 1a8c + link("cat", "x"); + 1ab0: 85da mv a1,s6 + 1ab2: 8562 mv a0,s8 + 1ab4: 320030ef jal 4dd4 + 1ab8: bfd1 j 1a8c + if(pid) + 1aba: 020c8263 beqz s9,1ade + wait(0); + 1abe: 4501 li a0,0 + 1ac0: 2bc030ef jal 4d7c +} + 1ac4: 60e6 ld ra,88(sp) + 1ac6: 6446 ld s0,80(sp) + 1ac8: 64a6 ld s1,72(sp) + 1aca: 6906 ld s2,64(sp) + 1acc: 79e2 ld s3,56(sp) + 1ace: 7a42 ld s4,48(sp) + 1ad0: 7aa2 ld s5,40(sp) + 1ad2: 7b02 ld s6,32(sp) + 1ad4: 6be2 ld s7,24(sp) + 1ad6: 6c42 ld s8,16(sp) + 1ad8: 6ca2 ld s9,8(sp) + 1ada: 6125 addi sp,sp,96 + 1adc: 8082 ret + exit(0); + 1ade: 4501 li a0,0 + 1ae0: 294030ef jal 4d74 + +0000000000001ae4 : +{ + 1ae4: 7179 addi sp,sp,-48 + 1ae6: f406 sd ra,40(sp) + 1ae8: f022 sd s0,32(sp) + 1aea: ec26 sd s1,24(sp) + 1aec: e84a sd s2,16(sp) + 1aee: e44e sd s3,8(sp) + 1af0: 1800 addi s0,sp,48 + 1af2: 89aa mv s3,a0 + for(n=0; n + if(pid < 0) + 1afe: 06054063 bltz a0,1b5e + if(pid == 0) + 1b02: cd11 beqz a0,1b1e + for(n=0; n + printf("%s: fork claimed to work 1000 times!\n", s); + 1b0a: 85ce mv a1,s3 + 1b0c: 00004517 auipc a0,0x4 + 1b10: 3b450513 addi a0,a0,948 # 5ec0 + 1b14: 688030ef jal 519c + exit(1); + 1b18: 4505 li a0,1 + 1b1a: 25a030ef jal 4d74 + exit(0); + 1b1e: 256030ef jal 4d74 + printf("%s: no fork at all!\n", s); + 1b22: 85ce mv a1,s3 + 1b24: 00004517 auipc a0,0x4 + 1b28: 35450513 addi a0,a0,852 # 5e78 + 1b2c: 670030ef jal 519c + exit(1); + 1b30: 4505 li a0,1 + 1b32: 242030ef jal 4d74 + printf("%s: wait stopped early\n", s); + 1b36: 85ce mv a1,s3 + 1b38: 00004517 auipc a0,0x4 + 1b3c: 35850513 addi a0,a0,856 # 5e90 + 1b40: 65c030ef jal 519c + exit(1); + 1b44: 4505 li a0,1 + 1b46: 22e030ef jal 4d74 + printf("%s: wait got too many\n", s); + 1b4a: 85ce mv a1,s3 + 1b4c: 00004517 auipc a0,0x4 + 1b50: 35c50513 addi a0,a0,860 # 5ea8 + 1b54: 648030ef jal 519c + exit(1); + 1b58: 4505 li a0,1 + 1b5a: 21a030ef jal 4d74 + if (n == 0) { + 1b5e: d0f1 beqz s1,1b22 + for(; n > 0; n--){ + 1b60: 00905963 blez s1,1b72 + if(wait(0) < 0){ + 1b64: 4501 li a0,0 + 1b66: 216030ef jal 4d7c + 1b6a: fc0546e3 bltz a0,1b36 + for(; n > 0; n--){ + 1b6e: 34fd addiw s1,s1,-1 + 1b70: f8f5 bnez s1,1b64 + if(wait(0) != -1){ + 1b72: 4501 li a0,0 + 1b74: 208030ef jal 4d7c + 1b78: 57fd li a5,-1 + 1b7a: fcf518e3 bne a0,a5,1b4a +} + 1b7e: 70a2 ld ra,40(sp) + 1b80: 7402 ld s0,32(sp) + 1b82: 64e2 ld s1,24(sp) + 1b84: 6942 ld s2,16(sp) + 1b86: 69a2 ld s3,8(sp) + 1b88: 6145 addi sp,sp,48 + 1b8a: 8082 ret + +0000000000001b8c : +{ + 1b8c: 715d addi sp,sp,-80 + 1b8e: e486 sd ra,72(sp) + 1b90: e0a2 sd s0,64(sp) + 1b92: fc26 sd s1,56(sp) + 1b94: f84a sd s2,48(sp) + 1b96: f44e sd s3,40(sp) + 1b98: f052 sd s4,32(sp) + 1b9a: ec56 sd s5,24(sp) + 1b9c: 0880 addi s0,sp,80 + 1b9e: 8aaa mv s5,a0 + for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ + 1ba0: 4485 li s1,1 + 1ba2: 04fe slli s1,s1,0x1f + if(xstatus != -1) // did kernel kill child? + 1ba4: 5a7d li s4,-1 + for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ + 1ba6: 69b1 lui s3,0xc + 1ba8: 35098993 addi s3,s3,848 # c350 + 1bac: 1003d937 lui s2,0x1003d + 1bb0: 090e slli s2,s2,0x3 + 1bb2: 48090913 addi s2,s2,1152 # 1003d480 + pid = fork(); + 1bb6: 1b6030ef jal 4d6c + if(pid < 0){ + 1bba: 02054763 bltz a0,1be8 + if(pid == 0){ + 1bbe: cd1d beqz a0,1bfc + wait(&xstatus); + 1bc0: fbc40513 addi a0,s0,-68 + 1bc4: 1b8030ef jal 4d7c + if(xstatus != -1) // did kernel kill child? + 1bc8: fbc42783 lw a5,-68(s0) + 1bcc: 05479563 bne a5,s4,1c16 + for(a = (char*)(KERNBASE); a < (char*) (KERNBASE+2000000); a += 50000){ + 1bd0: 94ce add s1,s1,s3 + 1bd2: ff2492e3 bne s1,s2,1bb6 +} + 1bd6: 60a6 ld ra,72(sp) + 1bd8: 6406 ld s0,64(sp) + 1bda: 74e2 ld s1,56(sp) + 1bdc: 7942 ld s2,48(sp) + 1bde: 79a2 ld s3,40(sp) + 1be0: 7a02 ld s4,32(sp) + 1be2: 6ae2 ld s5,24(sp) + 1be4: 6161 addi sp,sp,80 + 1be6: 8082 ret + printf("%s: fork failed\n", s); + 1be8: 85d6 mv a1,s5 + 1bea: 00004517 auipc a0,0x4 + 1bee: 02e50513 addi a0,a0,46 # 5c18 + 1bf2: 5aa030ef jal 519c + exit(1); + 1bf6: 4505 li a0,1 + 1bf8: 17c030ef jal 4d74 + printf("%s: oops could read %p = %x\n", s, a, *a); + 1bfc: 0004c683 lbu a3,0(s1) + 1c00: 8626 mv a2,s1 + 1c02: 85d6 mv a1,s5 + 1c04: 00004517 auipc a0,0x4 + 1c08: 2e450513 addi a0,a0,740 # 5ee8 + 1c0c: 590030ef jal 519c + exit(1); + 1c10: 4505 li a0,1 + 1c12: 162030ef jal 4d74 + exit(1); + 1c16: 4505 li a0,1 + 1c18: 15c030ef jal 4d74 + +0000000000001c1c : +{ + 1c1c: 7179 addi sp,sp,-48 + 1c1e: f406 sd ra,40(sp) + 1c20: f022 sd s0,32(sp) + 1c22: 1800 addi s0,sp,48 + volatile uint64 a = MAXVA; + 1c24: 4785 li a5,1 + 1c26: 179a slli a5,a5,0x26 + 1c28: fcf43c23 sd a5,-40(s0) + for( ; a != 0; a <<= 1){ + 1c2c: fd843783 ld a5,-40(s0) + 1c30: cf85 beqz a5,1c68 + 1c32: ec26 sd s1,24(sp) + 1c34: e84a sd s2,16(sp) + 1c36: 892a mv s2,a0 + if(xstatus != -1) // did kernel kill child? + 1c38: 54fd li s1,-1 + pid = fork(); + 1c3a: 132030ef jal 4d6c + if(pid < 0){ + 1c3e: 02054963 bltz a0,1c70 + if(pid == 0){ + 1c42: c129 beqz a0,1c84 + wait(&xstatus); + 1c44: fd440513 addi a0,s0,-44 + 1c48: 134030ef jal 4d7c + if(xstatus != -1) // did kernel kill child? + 1c4c: fd442783 lw a5,-44(s0) + 1c50: 04979c63 bne a5,s1,1ca8 + for( ; a != 0; a <<= 1){ + 1c54: fd843783 ld a5,-40(s0) + 1c58: 0786 slli a5,a5,0x1 + 1c5a: fcf43c23 sd a5,-40(s0) + 1c5e: fd843783 ld a5,-40(s0) + 1c62: ffe1 bnez a5,1c3a + 1c64: 64e2 ld s1,24(sp) + 1c66: 6942 ld s2,16(sp) +} + 1c68: 70a2 ld ra,40(sp) + 1c6a: 7402 ld s0,32(sp) + 1c6c: 6145 addi sp,sp,48 + 1c6e: 8082 ret + printf("%s: fork failed\n", s); + 1c70: 85ca mv a1,s2 + 1c72: 00004517 auipc a0,0x4 + 1c76: fa650513 addi a0,a0,-90 # 5c18 + 1c7a: 522030ef jal 519c + exit(1); + 1c7e: 4505 li a0,1 + 1c80: 0f4030ef jal 4d74 + *(char*)a = 99; + 1c84: fd843783 ld a5,-40(s0) + 1c88: 06300713 li a4,99 + 1c8c: 00e78023 sb a4,0(a5) + printf("%s: oops wrote %p\n", s, (void*)a); + 1c90: fd843603 ld a2,-40(s0) + 1c94: 85ca mv a1,s2 + 1c96: 00004517 auipc a0,0x4 + 1c9a: 27250513 addi a0,a0,626 # 5f08 + 1c9e: 4fe030ef jal 519c + exit(1); + 1ca2: 4505 li a0,1 + 1ca4: 0d0030ef jal 4d74 + exit(1); + 1ca8: 4505 li a0,1 + 1caa: 0ca030ef jal 4d74 + +0000000000001cae : +{ + 1cae: 7179 addi sp,sp,-48 + 1cb0: f406 sd ra,40(sp) + 1cb2: f022 sd s0,32(sp) + 1cb4: ec26 sd s1,24(sp) + 1cb6: 1800 addi s0,sp,48 + 1cb8: 84aa mv s1,a0 + pid = fork(); + 1cba: 0b2030ef jal 4d6c + if(pid == 0) { + 1cbe: cd11 beqz a0,1cda + } else if(pid < 0){ + 1cc0: 02054c63 bltz a0,1cf8 + wait(&xstatus); + 1cc4: fdc40513 addi a0,s0,-36 + 1cc8: 0b4030ef jal 4d7c + if(xstatus == -1) // kernel killed child? + 1ccc: fdc42503 lw a0,-36(s0) + 1cd0: 57fd li a5,-1 + 1cd2: 02f50d63 beq a0,a5,1d0c + exit(xstatus); + 1cd6: 09e030ef jal 4d74 + +static inline uint64 +r_sp() +{ + uint64 x; + asm volatile("mv %0, sp" : "=r" (x) ); + 1cda: 870a mv a4,sp + printf("%s: stacktest: read below stack %d\n", s, *sp); + 1cdc: 77fd lui a5,0xfffff + 1cde: 97ba add a5,a5,a4 + 1ce0: 0007c603 lbu a2,0(a5) # fffffffffffff000 + 1ce4: 85a6 mv a1,s1 + 1ce6: 00004517 auipc a0,0x4 + 1cea: 23a50513 addi a0,a0,570 # 5f20 + 1cee: 4ae030ef jal 519c + exit(1); + 1cf2: 4505 li a0,1 + 1cf4: 080030ef jal 4d74 + printf("%s: fork failed\n", s); + 1cf8: 85a6 mv a1,s1 + 1cfa: 00004517 auipc a0,0x4 + 1cfe: f1e50513 addi a0,a0,-226 # 5c18 + 1d02: 49a030ef jal 519c + exit(1); + 1d06: 4505 li a0,1 + 1d08: 06c030ef jal 4d74 + exit(0); + 1d0c: 4501 li a0,0 + 1d0e: 066030ef jal 4d74 + +0000000000001d12 : +{ + 1d12: 7159 addi sp,sp,-112 + 1d14: f486 sd ra,104(sp) + 1d16: f0a2 sd s0,96(sp) + 1d18: eca6 sd s1,88(sp) + 1d1a: e8ca sd s2,80(sp) + 1d1c: e4ce sd s3,72(sp) + 1d1e: 1880 addi s0,sp,112 + 1d20: 89aa mv s3,a0 + uint64 addrs[] = { 0, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 1d22: 00006797 auipc a5,0x6 + 1d26: bae78793 addi a5,a5,-1106 # 78d0 + 1d2a: 7788 ld a0,40(a5) + 1d2c: 7b8c ld a1,48(a5) + 1d2e: 7f90 ld a2,56(a5) + 1d30: 63b4 ld a3,64(a5) + 1d32: 67b8 ld a4,72(a5) + 1d34: 6bbc ld a5,80(a5) + 1d36: f8a43c23 sd a0,-104(s0) + 1d3a: fab43023 sd a1,-96(s0) + 1d3e: fac43423 sd a2,-88(s0) + 1d42: fad43823 sd a3,-80(s0) + 1d46: fae43c23 sd a4,-72(s0) + 1d4a: fcf43023 sd a5,-64(s0) + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 1d4e: 4481 li s1,0 + 1d50: 4919 li s2,6 + pid = fork(); + 1d52: 01a030ef jal 4d6c + if(pid == 0) { + 1d56: c105 beqz a0,1d76 + } else if(pid < 0){ + 1d58: 04054263 bltz a0,1d9c + wait(&xstatus); + 1d5c: fcc40513 addi a0,s0,-52 + 1d60: 01c030ef jal 4d7c + if(xstatus == 0){ + 1d64: fcc42783 lw a5,-52(s0) + 1d68: c7a1 beqz a5,1db0 + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + 1d6a: 2485 addiw s1,s1,1 + 1d6c: ff2493e3 bne s1,s2,1d52 + exit(0); + 1d70: 4501 li a0,0 + 1d72: 002030ef jal 4d74 + volatile int *addr = (int *) addrs[ai]; + 1d76: 048e slli s1,s1,0x3 + 1d78: fd048793 addi a5,s1,-48 + 1d7c: 008784b3 add s1,a5,s0 + 1d80: fc84b603 ld a2,-56(s1) + *addr = 10; + 1d84: 47a9 li a5,10 + 1d86: c21c sw a5,0(a2) + printf("%s: write to %p did not fail!\n", s, addr); + 1d88: 85ce mv a1,s3 + 1d8a: 00004517 auipc a0,0x4 + 1d8e: 1be50513 addi a0,a0,446 # 5f48 + 1d92: 40a030ef jal 519c + exit(0); + 1d96: 4501 li a0,0 + 1d98: 7dd020ef jal 4d74 + printf("%s: fork failed\n", s); + 1d9c: 85ce mv a1,s3 + 1d9e: 00004517 auipc a0,0x4 + 1da2: e7a50513 addi a0,a0,-390 # 5c18 + 1da6: 3f6030ef jal 519c + exit(1); + 1daa: 4505 li a0,1 + 1dac: 7c9020ef jal 4d74 + exit(1); + 1db0: 4505 li a0,1 + 1db2: 7c3020ef jal 4d74 + +0000000000001db6 : +{ + 1db6: 711d addi sp,sp,-96 + 1db8: ec86 sd ra,88(sp) + 1dba: e8a2 sd s0,80(sp) + 1dbc: e4a6 sd s1,72(sp) + 1dbe: e0ca sd s2,64(sp) + 1dc0: fc4e sd s3,56(sp) + 1dc2: f456 sd s5,40(sp) + 1dc4: 1080 addi s0,sp,96 + 1dc6: 8aaa mv s5,a0 + for(int ci = 0; ci < nchildren; ci++){ + 1dc8: 4981 li s3,0 + 1dca: 4911 li s2,4 + int pid = fork(); + 1dcc: 7a1020ef jal 4d6c + 1dd0: 84aa mv s1,a0 + if(pid < 0){ + 1dd2: 02054963 bltz a0,1e04 + if(pid == 0){ + 1dd6: c139 beqz a0,1e1c + for(int ci = 0; ci < nchildren; ci++){ + 1dd8: 2985 addiw s3,s3,1 + 1dda: ff2999e3 bne s3,s2,1dcc + 1dde: f852 sd s4,48(sp) + 1de0: f05a sd s6,32(sp) + 1de2: ec5e sd s7,24(sp) + 1de4: 4491 li s1,4 + int st = 0; + 1de6: fa042423 sw zero,-88(s0) + wait(&st); + 1dea: fa840513 addi a0,s0,-88 + 1dee: 78f020ef jal 4d7c + if(st != 0) + 1df2: fa842503 lw a0,-88(s0) + 1df6: 0c051863 bnez a0,1ec6 + for(int ci = 0; ci < nchildren; ci++){ + 1dfa: 34fd addiw s1,s1,-1 + 1dfc: f4ed bnez s1,1de6 + exit(0); + 1dfe: 4501 li a0,0 + 1e00: 775020ef jal 4d74 + 1e04: f852 sd s4,48(sp) + 1e06: f05a sd s6,32(sp) + 1e08: ec5e sd s7,24(sp) + printf("fork failed\n"); + 1e0a: 00005517 auipc a0,0x5 + 1e0e: 3b650513 addi a0,a0,950 # 71c0 + 1e12: 38a030ef jal 519c + exit(1); + 1e16: 4505 li a0,1 + 1e18: 75d020ef jal 4d74 + 1e1c: f852 sd s4,48(sp) + 1e1e: f05a sd s6,32(sp) + 1e20: ec5e sd s7,24(sp) + name[0] = 'b'; + 1e22: 06200793 li a5,98 + 1e26: faf40423 sb a5,-88(s0) + name[1] = 'a' + ci; + 1e2a: 0619879b addiw a5,s3,97 + 1e2e: faf404a3 sb a5,-87(s0) + name[2] = '\0'; + 1e32: fa040523 sb zero,-86(s0) + unlink(name); + 1e36: fa840513 addi a0,s0,-88 + 1e3a: 78b020ef jal 4dc4 + 1e3e: 4bf9 li s7,30 + int cc = write(fd, buf, sz); + 1e40: 0000bb17 auipc s6,0xb + 1e44: e78b0b13 addi s6,s6,-392 # ccb8 + for(int i = 0; i < ci+1; i++){ + 1e48: 8a26 mv s4,s1 + 1e4a: 0209c863 bltz s3,1e7a + int fd = open(name, O_CREATE | O_RDWR); + 1e4e: 20200593 li a1,514 + 1e52: fa840513 addi a0,s0,-88 + 1e56: 75f020ef jal 4db4 + 1e5a: 892a mv s2,a0 + if(fd < 0){ + 1e5c: 02054d63 bltz a0,1e96 + int cc = write(fd, buf, sz); + 1e60: 660d lui a2,0x3 + 1e62: 85da mv a1,s6 + 1e64: 731020ef jal 4d94 + if(cc != sz){ + 1e68: 678d lui a5,0x3 + 1e6a: 04f51263 bne a0,a5,1eae + close(fd); + 1e6e: 854a mv a0,s2 + 1e70: 72d020ef jal 4d9c + for(int i = 0; i < ci+1; i++){ + 1e74: 2a05 addiw s4,s4,1 + 1e76: fd49dce3 bge s3,s4,1e4e + unlink(name); + 1e7a: fa840513 addi a0,s0,-88 + 1e7e: 747020ef jal 4dc4 + for(int iters = 0; iters < howmany; iters++){ + 1e82: 3bfd addiw s7,s7,-1 + 1e84: fc0b92e3 bnez s7,1e48 + unlink(name); + 1e88: fa840513 addi a0,s0,-88 + 1e8c: 739020ef jal 4dc4 + exit(0); + 1e90: 4501 li a0,0 + 1e92: 6e3020ef jal 4d74 + printf("%s: cannot create %s\n", s, name); + 1e96: fa840613 addi a2,s0,-88 + 1e9a: 85d6 mv a1,s5 + 1e9c: 00004517 auipc a0,0x4 + 1ea0: 0cc50513 addi a0,a0,204 # 5f68 + 1ea4: 2f8030ef jal 519c + exit(1); + 1ea8: 4505 li a0,1 + 1eaa: 6cb020ef jal 4d74 + printf("%s: write(%d) ret %d\n", s, sz, cc); + 1eae: 86aa mv a3,a0 + 1eb0: 660d lui a2,0x3 + 1eb2: 85d6 mv a1,s5 + 1eb4: 00003517 auipc a0,0x3 + 1eb8: 5a450513 addi a0,a0,1444 # 5458 + 1ebc: 2e0030ef jal 519c + exit(1); + 1ec0: 4505 li a0,1 + 1ec2: 6b3020ef jal 4d74 + exit(st); + 1ec6: 6af020ef jal 4d74 + +0000000000001eca : +{ + 1eca: 7179 addi sp,sp,-48 + 1ecc: f406 sd ra,40(sp) + 1ece: f022 sd s0,32(sp) + 1ed0: ec26 sd s1,24(sp) + 1ed2: 1800 addi s0,sp,48 + sbrk(8192); + 1ed4: 6509 lui a0,0x2 + 1ed6: 66b020ef jal 4d40 + uint64 top = (uint64) sbrk(0); + 1eda: 4501 li a0,0 + 1edc: 665020ef jal 4d40 + if((top % PGSIZE) != 0){ + 1ee0: 03451793 slli a5,a0,0x34 + 1ee4: e7bd bnez a5,1f52 + top = (uint64) sbrk(0); + 1ee6: 4501 li a0,0 + 1ee8: 659020ef jal 4d40 + if(top % PGSIZE){ + 1eec: 03451793 slli a5,a0,0x34 + 1ef0: ebad bnez a5,1f62 + char *b = (char *) (top - 1); + 1ef2: fff50493 addi s1,a0,-1 # 1fff + *b = 'x'; + 1ef6: 07800793 li a5,120 + 1efa: fef50fa3 sb a5,-1(a0) + int ret = unlink(b); + 1efe: 8526 mv a0,s1 + 1f00: 6c5020ef jal 4dc4 + if(ret != -1){ + 1f04: 57fd li a5,-1 + 1f06: 06f51763 bne a0,a5,1f74 + int fd = open(b, O_CREATE | O_WRONLY); + 1f0a: 20100593 li a1,513 + 1f0e: 8526 mv a0,s1 + 1f10: 6a5020ef jal 4db4 + if(fd != -1){ + 1f14: 57fd li a5,-1 + 1f16: 06f51a63 bne a0,a5,1f8a + ret = link(b, b); + 1f1a: 85a6 mv a1,s1 + 1f1c: 8526 mv a0,s1 + 1f1e: 6b7020ef jal 4dd4 + if(ret != -1){ + 1f22: 57fd li a5,-1 + 1f24: 06f51e63 bne a0,a5,1fa0 + char *args[] = { "xx", 0 }; + 1f28: 00005797 auipc a5,0x5 + 1f2c: d4078793 addi a5,a5,-704 # 6c68 + 1f30: fcf43823 sd a5,-48(s0) + 1f34: fc043c23 sd zero,-40(s0) + ret = exec(b, args); + 1f38: fd040593 addi a1,s0,-48 + 1f3c: 8526 mv a0,s1 + 1f3e: 66f020ef jal 4dac + if(ret != -1){ + 1f42: 57fd li a5,-1 + 1f44: 06f51a63 bne a0,a5,1fb8 +} + 1f48: 70a2 ld ra,40(sp) + 1f4a: 7402 ld s0,32(sp) + 1f4c: 64e2 ld s1,24(sp) + 1f4e: 6145 addi sp,sp,48 + 1f50: 8082 ret + sbrk(PGSIZE - (top % PGSIZE)); + 1f52: 0347d513 srli a0,a5,0x34 + 1f56: 6785 lui a5,0x1 + 1f58: 40a7853b subw a0,a5,a0 + 1f5c: 5e5020ef jal 4d40 + 1f60: b759 j 1ee6 + printf("oops\n"); + 1f62: 00004517 auipc a0,0x4 + 1f66: 01e50513 addi a0,a0,30 # 5f80 + 1f6a: 232030ef jal 519c + exit(1); + 1f6e: 4505 li a0,1 + 1f70: 605020ef jal 4d74 + printf("unlink(%s) returned %d, not -1\n", b, ret); + 1f74: 862a mv a2,a0 + 1f76: 85a6 mv a1,s1 + 1f78: 00004517 auipc a0,0x4 + 1f7c: bc050513 addi a0,a0,-1088 # 5b38 + 1f80: 21c030ef jal 519c + exit(1); + 1f84: 4505 li a0,1 + 1f86: 5ef020ef jal 4d74 + printf("open(%s) returned %d, not -1\n", b, fd); + 1f8a: 862a mv a2,a0 + 1f8c: 85a6 mv a1,s1 + 1f8e: 00004517 auipc a0,0x4 + 1f92: bca50513 addi a0,a0,-1078 # 5b58 + 1f96: 206030ef jal 519c + exit(1); + 1f9a: 4505 li a0,1 + 1f9c: 5d9020ef jal 4d74 + printf("link(%s, %s) returned %d, not -1\n", b, b, ret); + 1fa0: 86aa mv a3,a0 + 1fa2: 8626 mv a2,s1 + 1fa4: 85a6 mv a1,s1 + 1fa6: 00004517 auipc a0,0x4 + 1faa: bd250513 addi a0,a0,-1070 # 5b78 + 1fae: 1ee030ef jal 519c + exit(1); + 1fb2: 4505 li a0,1 + 1fb4: 5c1020ef jal 4d74 + printf("exec(%s) returned %d, not -1\n", b, fd); + 1fb8: 567d li a2,-1 + 1fba: 85a6 mv a1,s1 + 1fbc: 00004517 auipc a0,0x4 + 1fc0: be450513 addi a0,a0,-1052 # 5ba0 + 1fc4: 1d8030ef jal 519c + exit(1); + 1fc8: 4505 li a0,1 + 1fca: 5ab020ef jal 4d74 + +0000000000001fce : +{ + 1fce: 1101 addi sp,sp,-32 + 1fd0: ec06 sd ra,24(sp) + 1fd2: e822 sd s0,16(sp) + 1fd4: 1000 addi s0,sp,32 + uint64 a = (uint64) sbrk(8192); + 1fd6: 6509 lui a0,0x2 + 1fd8: 569020ef jal 4d40 + if(a == (uint64) SBRK_ERROR) { + 1fdc: 57fd li a5,-1 + 1fde: 04f50a63 beq a0,a5,2032 + 1fe2: e426 sd s1,8(sp) + 1fe4: 84aa mv s1,a0 + if (sbrk(-8192) == SBRK_ERROR) { + 1fe6: 7579 lui a0,0xffffe + 1fe8: 559020ef jal 4d40 + 1fec: 57fd li a5,-1 + 1fee: 04f50d63 beq a0,a5,2048 + 1ff2: e04a sd s2,0(sp) + fd = open("rwsbrk", O_CREATE|O_WRONLY); + 1ff4: 20100593 li a1,513 + 1ff8: 00004517 auipc a0,0x4 + 1ffc: fc850513 addi a0,a0,-56 # 5fc0 + 2000: 5b5020ef jal 4db4 + 2004: 892a mv s2,a0 + if(fd < 0){ + 2006: 04054b63 bltz a0,205c + n = write(fd, (void*)(a+PGSIZE), 1024); + 200a: 6785 lui a5,0x1 + 200c: 94be add s1,s1,a5 + 200e: 40000613 li a2,1024 + 2012: 85a6 mv a1,s1 + 2014: 581020ef jal 4d94 + 2018: 862a mv a2,a0 + if(n >= 0){ + 201a: 04054a63 bltz a0,206e + printf("write(fd, %p, 1024) returned %d, not -1\n", (void*)a+PGSIZE, n); + 201e: 85a6 mv a1,s1 + 2020: 00004517 auipc a0,0x4 + 2024: fc050513 addi a0,a0,-64 # 5fe0 + 2028: 174030ef jal 519c + exit(1); + 202c: 4505 li a0,1 + 202e: 547020ef jal 4d74 + 2032: e426 sd s1,8(sp) + 2034: e04a sd s2,0(sp) + printf("sbrk(rwsbrk) failed\n"); + 2036: 00004517 auipc a0,0x4 + 203a: f5250513 addi a0,a0,-174 # 5f88 + 203e: 15e030ef jal 519c + exit(1); + 2042: 4505 li a0,1 + 2044: 531020ef jal 4d74 + 2048: e04a sd s2,0(sp) + printf("sbrk(rwsbrk) shrink failed\n"); + 204a: 00004517 auipc a0,0x4 + 204e: f5650513 addi a0,a0,-170 # 5fa0 + 2052: 14a030ef jal 519c + exit(1); + 2056: 4505 li a0,1 + 2058: 51d020ef jal 4d74 + printf("open(rwsbrk) failed\n"); + 205c: 00004517 auipc a0,0x4 + 2060: f6c50513 addi a0,a0,-148 # 5fc8 + 2064: 138030ef jal 519c + exit(1); + 2068: 4505 li a0,1 + 206a: 50b020ef jal 4d74 + close(fd); + 206e: 854a mv a0,s2 + 2070: 52d020ef jal 4d9c + unlink("rwsbrk"); + 2074: 00004517 auipc a0,0x4 + 2078: f4c50513 addi a0,a0,-180 # 5fc0 + 207c: 549020ef jal 4dc4 + fd = open("README", O_RDONLY); + 2080: 4581 li a1,0 + 2082: 00003517 auipc a0,0x3 + 2086: 4de50513 addi a0,a0,1246 # 5560 + 208a: 52b020ef jal 4db4 + 208e: 892a mv s2,a0 + if(fd < 0){ + 2090: 02054363 bltz a0,20b6 + n = read(fd, (void*)(a+PGSIZE), 10); + 2094: 4629 li a2,10 + 2096: 85a6 mv a1,s1 + 2098: 4f5020ef jal 4d8c + 209c: 862a mv a2,a0 + if(n >= 0){ + 209e: 02054563 bltz a0,20c8 + printf("read(fd, %p, 10) returned %d, not -1\n", (void*)a+PGSIZE, n); + 20a2: 85a6 mv a1,s1 + 20a4: 00004517 auipc a0,0x4 + 20a8: f6c50513 addi a0,a0,-148 # 6010 + 20ac: 0f0030ef jal 519c + exit(1); + 20b0: 4505 li a0,1 + 20b2: 4c3020ef jal 4d74 + printf("open(README) failed\n"); + 20b6: 00003517 auipc a0,0x3 + 20ba: 4b250513 addi a0,a0,1202 # 5568 + 20be: 0de030ef jal 519c + exit(1); + 20c2: 4505 li a0,1 + 20c4: 4b1020ef jal 4d74 + close(fd); + 20c8: 854a mv a0,s2 + 20ca: 4d3020ef jal 4d9c + exit(0); + 20ce: 4501 li a0,0 + 20d0: 4a5020ef jal 4d74 + +00000000000020d4 : +{ + 20d4: 7139 addi sp,sp,-64 + 20d6: fc06 sd ra,56(sp) + 20d8: f822 sd s0,48(sp) + 20da: ec4e sd s3,24(sp) + 20dc: 0080 addi s0,sp,64 + 20de: 89aa mv s3,a0 + pid = fork(); + 20e0: 48d020ef jal 4d6c + if(pid < 0){ + 20e4: 02054b63 bltz a0,211a + if(pid == 0){ + 20e8: e939 bnez a0,213e + a = sbrk(TOOMUCH); + 20ea: 40000537 lui a0,0x40000 + 20ee: 453020ef jal 4d40 + if(a == (char*)SBRK_ERROR){ + 20f2: 57fd li a5,-1 + 20f4: 02f50f63 beq a0,a5,2132 + 20f8: f426 sd s1,40(sp) + 20fa: f04a sd s2,32(sp) + 20fc: e852 sd s4,16(sp) + for(b = a; b < a+TOOMUCH; b += PGSIZE){ + 20fe: 400007b7 lui a5,0x40000 + 2102: 97aa add a5,a5,a0 + *b = 99; + 2104: 06300693 li a3,99 + for(b = a; b < a+TOOMUCH; b += PGSIZE){ + 2108: 6705 lui a4,0x1 + *b = 99; + 210a: 00d50023 sb a3,0(a0) # 40000000 + for(b = a; b < a+TOOMUCH; b += PGSIZE){ + 210e: 953a add a0,a0,a4 + 2110: fef51de3 bne a0,a5,210a + exit(1); + 2114: 4505 li a0,1 + 2116: 45f020ef jal 4d74 + 211a: f426 sd s1,40(sp) + 211c: f04a sd s2,32(sp) + 211e: e852 sd s4,16(sp) + printf("fork failed in sbrkbasic\n"); + 2120: 00004517 auipc a0,0x4 + 2124: f1850513 addi a0,a0,-232 # 6038 + 2128: 074030ef jal 519c + exit(1); + 212c: 4505 li a0,1 + 212e: 447020ef jal 4d74 + 2132: f426 sd s1,40(sp) + 2134: f04a sd s2,32(sp) + 2136: e852 sd s4,16(sp) + exit(0); + 2138: 4501 li a0,0 + 213a: 43b020ef jal 4d74 + wait(&xstatus); + 213e: fcc40513 addi a0,s0,-52 + 2142: 43b020ef jal 4d7c + if(xstatus == 1){ + 2146: fcc42703 lw a4,-52(s0) + 214a: 4785 li a5,1 + 214c: 00f70e63 beq a4,a5,2168 + 2150: f426 sd s1,40(sp) + 2152: f04a sd s2,32(sp) + 2154: e852 sd s4,16(sp) + a = sbrk(0); + 2156: 4501 li a0,0 + 2158: 3e9020ef jal 4d40 + 215c: 84aa mv s1,a0 + for(i = 0; i < 5000; i++){ + 215e: 4901 li s2,0 + 2160: 6a05 lui s4,0x1 + 2162: 388a0a13 addi s4,s4,904 # 1388 + 2166: a839 j 2184 + 2168: f426 sd s1,40(sp) + 216a: f04a sd s2,32(sp) + 216c: e852 sd s4,16(sp) + printf("%s: too much memory allocated!\n", s); + 216e: 85ce mv a1,s3 + 2170: 00004517 auipc a0,0x4 + 2174: ee850513 addi a0,a0,-280 # 6058 + 2178: 024030ef jal 519c + exit(1); + 217c: 4505 li a0,1 + 217e: 3f7020ef jal 4d74 + 2182: 84be mv s1,a5 + b = sbrk(1); + 2184: 4505 li a0,1 + 2186: 3bb020ef jal 4d40 + if(b != a){ + 218a: 04951263 bne a0,s1,21ce + *b = 1; + 218e: 4785 li a5,1 + 2190: 00f48023 sb a5,0(s1) + a = b + 1; + 2194: 00148793 addi a5,s1,1 + for(i = 0; i < 5000; i++){ + 2198: 2905 addiw s2,s2,1 + 219a: ff4914e3 bne s2,s4,2182 + pid = fork(); + 219e: 3cf020ef jal 4d6c + 21a2: 892a mv s2,a0 + if(pid < 0){ + 21a4: 04054263 bltz a0,21e8 + c = sbrk(1); + 21a8: 4505 li a0,1 + 21aa: 397020ef jal 4d40 + c = sbrk(1); + 21ae: 4505 li a0,1 + 21b0: 391020ef jal 4d40 + if(c != a + 1){ + 21b4: 0489 addi s1,s1,2 + 21b6: 04a48363 beq s1,a0,21fc + printf("%s: sbrk test failed post-fork\n", s); + 21ba: 85ce mv a1,s3 + 21bc: 00004517 auipc a0,0x4 + 21c0: efc50513 addi a0,a0,-260 # 60b8 + 21c4: 7d9020ef jal 519c + exit(1); + 21c8: 4505 li a0,1 + 21ca: 3ab020ef jal 4d74 + printf("%s: sbrk test failed %d %p %p\n", s, i, a, b); + 21ce: 872a mv a4,a0 + 21d0: 86a6 mv a3,s1 + 21d2: 864a mv a2,s2 + 21d4: 85ce mv a1,s3 + 21d6: 00004517 auipc a0,0x4 + 21da: ea250513 addi a0,a0,-350 # 6078 + 21de: 7bf020ef jal 519c + exit(1); + 21e2: 4505 li a0,1 + 21e4: 391020ef jal 4d74 + printf("%s: sbrk test fork failed\n", s); + 21e8: 85ce mv a1,s3 + 21ea: 00004517 auipc a0,0x4 + 21ee: eae50513 addi a0,a0,-338 # 6098 + 21f2: 7ab020ef jal 519c + exit(1); + 21f6: 4505 li a0,1 + 21f8: 37d020ef jal 4d74 + if(pid == 0) + 21fc: 00091563 bnez s2,2206 + exit(0); + 2200: 4501 li a0,0 + 2202: 373020ef jal 4d74 + wait(&xstatus); + 2206: fcc40513 addi a0,s0,-52 + 220a: 373020ef jal 4d7c + exit(xstatus); + 220e: fcc42503 lw a0,-52(s0) + 2212: 363020ef jal 4d74 + +0000000000002216 : +{ + 2216: 7179 addi sp,sp,-48 + 2218: f406 sd ra,40(sp) + 221a: f022 sd s0,32(sp) + 221c: ec26 sd s1,24(sp) + 221e: e84a sd s2,16(sp) + 2220: e44e sd s3,8(sp) + 2222: e052 sd s4,0(sp) + 2224: 1800 addi s0,sp,48 + 2226: 89aa mv s3,a0 + oldbrk = sbrk(0); + 2228: 4501 li a0,0 + 222a: 317020ef jal 4d40 + 222e: 892a mv s2,a0 + a = sbrk(0); + 2230: 4501 li a0,0 + 2232: 30f020ef jal 4d40 + 2236: 84aa mv s1,a0 + p = sbrk(amt); + 2238: 06400537 lui a0,0x6400 + 223c: 9d05 subw a0,a0,s1 + 223e: 303020ef jal 4d40 + if (p != a) { + 2242: 08a49763 bne s1,a0,22d0 + *lastaddr = 99; + 2246: 064007b7 lui a5,0x6400 + 224a: 06300713 li a4,99 + 224e: fee78fa3 sb a4,-1(a5) # 63fffff + a = sbrk(0); + 2252: 4501 li a0,0 + 2254: 2ed020ef jal 4d40 + 2258: 84aa mv s1,a0 + c = sbrk(-PGSIZE); + 225a: 757d lui a0,0xfffff + 225c: 2e5020ef jal 4d40 + if(c == (char*)SBRK_ERROR){ + 2260: 57fd li a5,-1 + 2262: 08f50163 beq a0,a5,22e4 + c = sbrk(0); + 2266: 4501 li a0,0 + 2268: 2d9020ef jal 4d40 + if(c != a - PGSIZE){ + 226c: 77fd lui a5,0xfffff + 226e: 97a6 add a5,a5,s1 + 2270: 08f51463 bne a0,a5,22f8 + a = sbrk(0); + 2274: 4501 li a0,0 + 2276: 2cb020ef jal 4d40 + 227a: 84aa mv s1,a0 + c = sbrk(PGSIZE); + 227c: 6505 lui a0,0x1 + 227e: 2c3020ef jal 4d40 + 2282: 8a2a mv s4,a0 + if(c != a || sbrk(0) != a + PGSIZE){ + 2284: 08a49663 bne s1,a0,2310 + 2288: 4501 li a0,0 + 228a: 2b7020ef jal 4d40 + 228e: 6785 lui a5,0x1 + 2290: 97a6 add a5,a5,s1 + 2292: 06f51f63 bne a0,a5,2310 + if(*lastaddr == 99){ + 2296: 064007b7 lui a5,0x6400 + 229a: fff7c703 lbu a4,-1(a5) # 63fffff + 229e: 06300793 li a5,99 + 22a2: 08f70363 beq a4,a5,2328 + a = sbrk(0); + 22a6: 4501 li a0,0 + 22a8: 299020ef jal 4d40 + 22ac: 84aa mv s1,a0 + c = sbrk(-(sbrk(0) - oldbrk)); + 22ae: 4501 li a0,0 + 22b0: 291020ef jal 4d40 + 22b4: 40a9053b subw a0,s2,a0 + 22b8: 289020ef jal 4d40 + if(c != a){ + 22bc: 08a49063 bne s1,a0,233c +} + 22c0: 70a2 ld ra,40(sp) + 22c2: 7402 ld s0,32(sp) + 22c4: 64e2 ld s1,24(sp) + 22c6: 6942 ld s2,16(sp) + 22c8: 69a2 ld s3,8(sp) + 22ca: 6a02 ld s4,0(sp) + 22cc: 6145 addi sp,sp,48 + 22ce: 8082 ret + printf("%s: sbrk test failed to grow big address space; enough phys mem?\n", s); + 22d0: 85ce mv a1,s3 + 22d2: 00004517 auipc a0,0x4 + 22d6: e0650513 addi a0,a0,-506 # 60d8 + 22da: 6c3020ef jal 519c + exit(1); + 22de: 4505 li a0,1 + 22e0: 295020ef jal 4d74 + printf("%s: sbrk could not deallocate\n", s); + 22e4: 85ce mv a1,s3 + 22e6: 00004517 auipc a0,0x4 + 22ea: e3a50513 addi a0,a0,-454 # 6120 + 22ee: 6af020ef jal 519c + exit(1); + 22f2: 4505 li a0,1 + 22f4: 281020ef jal 4d74 + printf("%s: sbrk deallocation produced wrong address, a %p c %p\n", s, a, c); + 22f8: 86aa mv a3,a0 + 22fa: 8626 mv a2,s1 + 22fc: 85ce mv a1,s3 + 22fe: 00004517 auipc a0,0x4 + 2302: e4250513 addi a0,a0,-446 # 6140 + 2306: 697020ef jal 519c + exit(1); + 230a: 4505 li a0,1 + 230c: 269020ef jal 4d74 + printf("%s: sbrk re-allocation failed, a %p c %p\n", s, a, c); + 2310: 86d2 mv a3,s4 + 2312: 8626 mv a2,s1 + 2314: 85ce mv a1,s3 + 2316: 00004517 auipc a0,0x4 + 231a: e6a50513 addi a0,a0,-406 # 6180 + 231e: 67f020ef jal 519c + exit(1); + 2322: 4505 li a0,1 + 2324: 251020ef jal 4d74 + printf("%s: sbrk de-allocation didn't really deallocate\n", s); + 2328: 85ce mv a1,s3 + 232a: 00004517 auipc a0,0x4 + 232e: e8650513 addi a0,a0,-378 # 61b0 + 2332: 66b020ef jal 519c + exit(1); + 2336: 4505 li a0,1 + 2338: 23d020ef jal 4d74 + printf("%s: sbrk downsize failed, a %p c %p\n", s, a, c); + 233c: 86aa mv a3,a0 + 233e: 8626 mv a2,s1 + 2340: 85ce mv a1,s3 + 2342: 00004517 auipc a0,0x4 + 2346: ea650513 addi a0,a0,-346 # 61e8 + 234a: 653020ef jal 519c + exit(1); + 234e: 4505 li a0,1 + 2350: 225020ef jal 4d74 + +0000000000002354 : +{ + 2354: 7179 addi sp,sp,-48 + 2356: f406 sd ra,40(sp) + 2358: f022 sd s0,32(sp) + 235a: ec26 sd s1,24(sp) + 235c: e84a sd s2,16(sp) + 235e: e44e sd s3,8(sp) + 2360: 1800 addi s0,sp,48 + 2362: 89aa mv s3,a0 + a = sbrk(PGSIZE); + 2364: 6505 lui a0,0x1 + 2366: 1db020ef jal 4d40 + 236a: 892a mv s2,a0 + fd = open("sbrk", O_CREATE|O_WRONLY); + 236c: 20100593 li a1,513 + 2370: 00004517 auipc a0,0x4 + 2374: ea050513 addi a0,a0,-352 # 6210 + 2378: 23d020ef jal 4db4 + 237c: 84aa mv s1,a0 + unlink("sbrk"); + 237e: 00004517 auipc a0,0x4 + 2382: e9250513 addi a0,a0,-366 # 6210 + 2386: 23f020ef jal 4dc4 + if(fd < 0) { + 238a: 0204c963 bltz s1,23bc + if ((n = write(fd, a, PGSIZE)) < 0) { + 238e: 6605 lui a2,0x1 + 2390: 85ca mv a1,s2 + 2392: 8526 mv a0,s1 + 2394: 201020ef jal 4d94 + 2398: 02054c63 bltz a0,23d0 + close(fd); + 239c: 8526 mv a0,s1 + 239e: 1ff020ef jal 4d9c + a = sbrk(PGSIZE); + 23a2: 6505 lui a0,0x1 + 23a4: 19d020ef jal 4d40 + if(pipe((int *) a) != 0){ + 23a8: 1dd020ef jal 4d84 + 23ac: ed05 bnez a0,23e4 +} + 23ae: 70a2 ld ra,40(sp) + 23b0: 7402 ld s0,32(sp) + 23b2: 64e2 ld s1,24(sp) + 23b4: 6942 ld s2,16(sp) + 23b6: 69a2 ld s3,8(sp) + 23b8: 6145 addi sp,sp,48 + 23ba: 8082 ret + printf("%s: open sbrk failed\n", s); + 23bc: 85ce mv a1,s3 + 23be: 00004517 auipc a0,0x4 + 23c2: e5a50513 addi a0,a0,-422 # 6218 + 23c6: 5d7020ef jal 519c + exit(1); + 23ca: 4505 li a0,1 + 23cc: 1a9020ef jal 4d74 + printf("%s: write sbrk failed\n", s); + 23d0: 85ce mv a1,s3 + 23d2: 00004517 auipc a0,0x4 + 23d6: e5e50513 addi a0,a0,-418 # 6230 + 23da: 5c3020ef jal 519c + exit(1); + 23de: 4505 li a0,1 + 23e0: 195020ef jal 4d74 + printf("%s: pipe() failed\n", s); + 23e4: 85ce mv a1,s3 + 23e6: 00004517 auipc a0,0x4 + 23ea: 93a50513 addi a0,a0,-1734 # 5d20 + 23ee: 5af020ef jal 519c + exit(1); + 23f2: 4505 li a0,1 + 23f4: 181020ef jal 4d74 + +00000000000023f8 : +{ + 23f8: 1101 addi sp,sp,-32 + 23fa: ec06 sd ra,24(sp) + 23fc: e822 sd s0,16(sp) + 23fe: e426 sd s1,8(sp) + 2400: e04a sd s2,0(sp) + 2402: 1000 addi s0,sp,32 + 2404: 892a mv s2,a0 + fd = open("init", O_RDONLY); + 2406: 4581 li a1,0 + 2408: 00004517 auipc a0,0x4 + 240c: e4050513 addi a0,a0,-448 # 6248 + 2410: 1a5020ef jal 4db4 + if (fd < 0) { + 2414: 02054563 bltz a0,243e + 2418: 84aa mv s1,a0 + read(fd, sbrk(0) - 1, -1); + 241a: 4501 li a0,0 + 241c: 125020ef jal 4d40 + 2420: 567d li a2,-1 + 2422: fff50593 addi a1,a0,-1 + 2426: 8526 mv a0,s1 + 2428: 165020ef jal 4d8c + close(fd); + 242c: 8526 mv a0,s1 + 242e: 16f020ef jal 4d9c +} + 2432: 60e2 ld ra,24(sp) + 2434: 6442 ld s0,16(sp) + 2436: 64a2 ld s1,8(sp) + 2438: 6902 ld s2,0(sp) + 243a: 6105 addi sp,sp,32 + 243c: 8082 ret + printf("%s: open failed\n", s); + 243e: 85ca mv a1,s2 + 2440: 00003517 auipc a0,0x3 + 2444: 7f050513 addi a0,a0,2032 # 5c30 + 2448: 555020ef jal 519c + exit(1); + 244c: 4505 li a0,1 + 244e: 127020ef jal 4d74 + +0000000000002452 : +{ + 2452: 1141 addi sp,sp,-16 + 2454: e406 sd ra,8(sp) + 2456: e022 sd s0,0(sp) + 2458: 0800 addi s0,sp,16 + int pid = fork(); + 245a: 113020ef jal 4d6c + if(pid < 0){ + 245e: 00054c63 bltz a0,2476 + if(pid == 0){ + 2462: e11d bnez a0,2488 + int sz = (uint64) sbrk(0); + 2464: 0dd020ef jal 4d40 + sbrk(-sz); + 2468: 40a0053b negw a0,a0 + 246c: 0d5020ef jal 4d40 + exit(0); + 2470: 4501 li a0,0 + 2472: 103020ef jal 4d74 + printf("fork failed\n"); + 2476: 00005517 auipc a0,0x5 + 247a: d4a50513 addi a0,a0,-694 # 71c0 + 247e: 51f020ef jal 519c + exit(1); + 2482: 4505 li a0,1 + 2484: 0f1020ef jal 4d74 + wait(0); + 2488: 4501 li a0,0 + 248a: 0f3020ef jal 4d7c + pid = fork(); + 248e: 0df020ef jal 4d6c + if(pid < 0){ + 2492: 00054f63 bltz a0,24b0 + if(pid == 0){ + 2496: e515 bnez a0,24c2 + int sz = (uint64) sbrk(0); + 2498: 0a9020ef jal 4d40 + sbrk(-(sz - 3500)); + 249c: 6785 lui a5,0x1 + 249e: dac7879b addiw a5,a5,-596 # dac + 24a2: 40a7853b subw a0,a5,a0 + 24a6: 09b020ef jal 4d40 + exit(0); + 24aa: 4501 li a0,0 + 24ac: 0c9020ef jal 4d74 + printf("fork failed\n"); + 24b0: 00005517 auipc a0,0x5 + 24b4: d1050513 addi a0,a0,-752 # 71c0 + 24b8: 4e5020ef jal 519c + exit(1); + 24bc: 4505 li a0,1 + 24be: 0b7020ef jal 4d74 + wait(0); + 24c2: 4501 li a0,0 + 24c4: 0b9020ef jal 4d7c + pid = fork(); + 24c8: 0a5020ef jal 4d6c + if(pid < 0){ + 24cc: 02054263 bltz a0,24f0 + if(pid == 0){ + 24d0: e90d bnez a0,2502 + sbrk((10*PGSIZE + 2048) - (uint64)sbrk(0)); + 24d2: 06f020ef jal 4d40 + 24d6: 67ad lui a5,0xb + 24d8: 8007879b addiw a5,a5,-2048 # a800 + 24dc: 40a7853b subw a0,a5,a0 + 24e0: 061020ef jal 4d40 + sbrk(-10); + 24e4: 5559 li a0,-10 + 24e6: 05b020ef jal 4d40 + exit(0); + 24ea: 4501 li a0,0 + 24ec: 089020ef jal 4d74 + printf("fork failed\n"); + 24f0: 00005517 auipc a0,0x5 + 24f4: cd050513 addi a0,a0,-816 # 71c0 + 24f8: 4a5020ef jal 519c + exit(1); + 24fc: 4505 li a0,1 + 24fe: 077020ef jal 4d74 + wait(0); + 2502: 4501 li a0,0 + 2504: 079020ef jal 4d7c + exit(0); + 2508: 4501 li a0,0 + 250a: 06b020ef jal 4d74 + +000000000000250e : +{ + 250e: 7179 addi sp,sp,-48 + 2510: f406 sd ra,40(sp) + 2512: f022 sd s0,32(sp) + 2514: ec26 sd s1,24(sp) + 2516: e84a sd s2,16(sp) + 2518: e44e sd s3,8(sp) + 251a: e052 sd s4,0(sp) + 251c: 1800 addi s0,sp,48 + uint64 top = (uint64) sbrk(0); + 251e: 4501 li a0,0 + 2520: 021020ef jal 4d40 + if((top % PGSIZE) != 0) + 2524: 03451793 slli a5,a0,0x34 + 2528: ebad bnez a5,259a + sbrk(PGSIZE); + 252a: 6505 lui a0,0x1 + 252c: 015020ef jal 4d40 + sbrk(10); + 2530: 4529 li a0,10 + 2532: 00f020ef jal 4d40 + sbrk(-20); + 2536: 5531 li a0,-20 + 2538: 009020ef jal 4d40 + top = (uint64) sbrk(0); + 253c: 4501 li a0,0 + 253e: 003020ef jal 4d40 + 2542: 84aa mv s1,a0 + char *p = (char *) (top - 64); + 2544: fc050913 addi s2,a0,-64 # fc0 + p[0] = 'x'; + 2548: 07800a13 li s4,120 + 254c: fd450023 sb s4,-64(a0) + p[1] = '\0'; + 2550: fc0500a3 sb zero,-63(a0) + int fd = open(p, O_RDWR|O_CREATE); + 2554: 20200593 li a1,514 + 2558: 854a mv a0,s2 + 255a: 05b020ef jal 4db4 + 255e: 89aa mv s3,a0 + write(fd, p, 1); + 2560: 4605 li a2,1 + 2562: 85ca mv a1,s2 + 2564: 031020ef jal 4d94 + close(fd); + 2568: 854e mv a0,s3 + 256a: 033020ef jal 4d9c + fd = open(p, O_RDWR); + 256e: 4589 li a1,2 + 2570: 854a mv a0,s2 + 2572: 043020ef jal 4db4 + p[0] = '\0'; + 2576: fc048023 sb zero,-64(s1) + read(fd, p, 1); + 257a: 4605 li a2,1 + 257c: 85ca mv a1,s2 + 257e: 00f020ef jal 4d8c + if(p[0] != 'x') + 2582: fc04c783 lbu a5,-64(s1) + 2586: 03479263 bne a5,s4,25aa +} + 258a: 70a2 ld ra,40(sp) + 258c: 7402 ld s0,32(sp) + 258e: 64e2 ld s1,24(sp) + 2590: 6942 ld s2,16(sp) + 2592: 69a2 ld s3,8(sp) + 2594: 6a02 ld s4,0(sp) + 2596: 6145 addi sp,sp,48 + 2598: 8082 ret + sbrk(PGSIZE - (top % PGSIZE)); + 259a: 0347d513 srli a0,a5,0x34 + 259e: 6785 lui a5,0x1 + 25a0: 40a7853b subw a0,a5,a0 + 25a4: 79c020ef jal 4d40 + 25a8: b749 j 252a + exit(1); + 25aa: 4505 li a0,1 + 25ac: 7c8020ef jal 4d74 + +00000000000025b0 : +{ + 25b0: 1141 addi sp,sp,-16 + 25b2: e406 sd ra,8(sp) + 25b4: e022 sd s0,0(sp) + 25b6: 0800 addi s0,sp,16 + sbrk(0x80000004); + 25b8: 80000537 lui a0,0x80000 + 25bc: 0511 addi a0,a0,4 # ffffffff80000004 + 25be: 782020ef jal 4d40 + volatile char *top = sbrk(0); + 25c2: 4501 li a0,0 + 25c4: 77c020ef jal 4d40 + *(top-1) = *(top-1) + 1; + 25c8: fff54783 lbu a5,-1(a0) + 25cc: 2785 addiw a5,a5,1 # 1001 + 25ce: 0ff7f793 zext.b a5,a5 + 25d2: fef50fa3 sb a5,-1(a0) +} + 25d6: 60a2 ld ra,8(sp) + 25d8: 6402 ld s0,0(sp) + 25da: 0141 addi sp,sp,16 + 25dc: 8082 ret + +00000000000025de : +{ + 25de: 715d addi sp,sp,-80 + 25e0: e486 sd ra,72(sp) + 25e2: e0a2 sd s0,64(sp) + 25e4: fc26 sd s1,56(sp) + 25e6: f84a sd s2,48(sp) + 25e8: f44e sd s3,40(sp) + 25ea: f052 sd s4,32(sp) + 25ec: 0880 addi s0,sp,80 + for(int avail = 0; avail < 15; avail++){ + 25ee: 4901 li s2,0 + 25f0: 49bd li s3,15 + int pid = fork(); + 25f2: 77a020ef jal 4d6c + 25f6: 84aa mv s1,a0 + if(pid < 0){ + 25f8: 00054c63 bltz a0,2610 + } else if(pid == 0){ + 25fc: c11d beqz a0,2622 + wait((int*)0); + 25fe: 4501 li a0,0 + 2600: 77c020ef jal 4d7c + for(int avail = 0; avail < 15; avail++){ + 2604: 2905 addiw s2,s2,1 + 2606: ff3916e3 bne s2,s3,25f2 + exit(0); + 260a: 4501 li a0,0 + 260c: 768020ef jal 4d74 + printf("fork failed\n"); + 2610: 00005517 auipc a0,0x5 + 2614: bb050513 addi a0,a0,-1104 # 71c0 + 2618: 385020ef jal 519c + exit(1); + 261c: 4505 li a0,1 + 261e: 756020ef jal 4d74 + if(a == SBRK_ERROR) + 2622: 59fd li s3,-1 + *(a + PGSIZE - 1) = 1; + 2624: 4a05 li s4,1 + char *a = sbrk(PGSIZE); + 2626: 6505 lui a0,0x1 + 2628: 718020ef jal 4d40 + if(a == SBRK_ERROR) + 262c: 01350763 beq a0,s3,263a + *(a + PGSIZE - 1) = 1; + 2630: 6785 lui a5,0x1 + 2632: 953e add a0,a0,a5 + 2634: ff450fa3 sb s4,-1(a0) # fff + while(1){ + 2638: b7fd j 2626 + for(int i = 0; i < avail; i++) + 263a: 01205863 blez s2,264a + sbrk(-PGSIZE); + 263e: 757d lui a0,0xfffff + 2640: 700020ef jal 4d40 + for(int i = 0; i < avail; i++) + 2644: 2485 addiw s1,s1,1 + 2646: ff249ce3 bne s1,s2,263e + close(1); + 264a: 4505 li a0,1 + 264c: 750020ef jal 4d9c + char *args[] = { "echo", "x", 0 }; + 2650: 00003517 auipc a0,0x3 + 2654: d3850513 addi a0,a0,-712 # 5388 + 2658: faa43c23 sd a0,-72(s0) + 265c: 00003797 auipc a5,0x3 + 2660: d9c78793 addi a5,a5,-612 # 53f8 + 2664: fcf43023 sd a5,-64(s0) + 2668: fc043423 sd zero,-56(s0) + exec("echo", args); + 266c: fb840593 addi a1,s0,-72 + 2670: 73c020ef jal 4dac + exit(0); + 2674: 4501 li a0,0 + 2676: 6fe020ef jal 4d74 + +000000000000267a : +{ + 267a: 1101 addi sp,sp,-32 + 267c: ec06 sd ra,24(sp) + 267e: e822 sd s0,16(sp) + 2680: e426 sd s1,8(sp) + 2682: 1000 addi s0,sp,32 + 2684: 84aa mv s1,a0 + if(mkdir("12345678901234") != 0){ + 2686: 00004517 auipc a0,0x4 + 268a: d9a50513 addi a0,a0,-614 # 6420 + 268e: 74e020ef jal 4ddc + 2692: e555 bnez a0,273e + if(mkdir("12345678901234/123456789012345") != 0){ + 2694: 00004517 auipc a0,0x4 + 2698: be450513 addi a0,a0,-1052 # 6278 + 269c: 740020ef jal 4ddc + 26a0: e94d bnez a0,2752 + fd = open("123456789012345/123456789012345/123456789012345", O_CREATE); + 26a2: 20000593 li a1,512 + 26a6: 00004517 auipc a0,0x4 + 26aa: c2a50513 addi a0,a0,-982 # 62d0 + 26ae: 706020ef jal 4db4 + if(fd < 0){ + 26b2: 0a054a63 bltz a0,2766 + close(fd); + 26b6: 6e6020ef jal 4d9c + fd = open("12345678901234/12345678901234/12345678901234", 0); + 26ba: 4581 li a1,0 + 26bc: 00004517 auipc a0,0x4 + 26c0: c8c50513 addi a0,a0,-884 # 6348 + 26c4: 6f0020ef jal 4db4 + if(fd < 0){ + 26c8: 0a054963 bltz a0,277a + close(fd); + 26cc: 6d0020ef jal 4d9c + if(mkdir("12345678901234/12345678901234") == 0){ + 26d0: 00004517 auipc a0,0x4 + 26d4: ce850513 addi a0,a0,-792 # 63b8 + 26d8: 704020ef jal 4ddc + 26dc: c94d beqz a0,278e + if(mkdir("123456789012345/12345678901234") == 0){ + 26de: 00004517 auipc a0,0x4 + 26e2: d3250513 addi a0,a0,-718 # 6410 + 26e6: 6f6020ef jal 4ddc + 26ea: cd45 beqz a0,27a2 + unlink("123456789012345/12345678901234"); + 26ec: 00004517 auipc a0,0x4 + 26f0: d2450513 addi a0,a0,-732 # 6410 + 26f4: 6d0020ef jal 4dc4 + unlink("12345678901234/12345678901234"); + 26f8: 00004517 auipc a0,0x4 + 26fc: cc050513 addi a0,a0,-832 # 63b8 + 2700: 6c4020ef jal 4dc4 + unlink("12345678901234/12345678901234/12345678901234"); + 2704: 00004517 auipc a0,0x4 + 2708: c4450513 addi a0,a0,-956 # 6348 + 270c: 6b8020ef jal 4dc4 + unlink("123456789012345/123456789012345/123456789012345"); + 2710: 00004517 auipc a0,0x4 + 2714: bc050513 addi a0,a0,-1088 # 62d0 + 2718: 6ac020ef jal 4dc4 + unlink("12345678901234/123456789012345"); + 271c: 00004517 auipc a0,0x4 + 2720: b5c50513 addi a0,a0,-1188 # 6278 + 2724: 6a0020ef jal 4dc4 + unlink("12345678901234"); + 2728: 00004517 auipc a0,0x4 + 272c: cf850513 addi a0,a0,-776 # 6420 + 2730: 694020ef jal 4dc4 +} + 2734: 60e2 ld ra,24(sp) + 2736: 6442 ld s0,16(sp) + 2738: 64a2 ld s1,8(sp) + 273a: 6105 addi sp,sp,32 + 273c: 8082 ret + printf("%s: mkdir 12345678901234 failed\n", s); + 273e: 85a6 mv a1,s1 + 2740: 00004517 auipc a0,0x4 + 2744: b1050513 addi a0,a0,-1264 # 6250 + 2748: 255020ef jal 519c + exit(1); + 274c: 4505 li a0,1 + 274e: 626020ef jal 4d74 + printf("%s: mkdir 12345678901234/123456789012345 failed\n", s); + 2752: 85a6 mv a1,s1 + 2754: 00004517 auipc a0,0x4 + 2758: b4450513 addi a0,a0,-1212 # 6298 + 275c: 241020ef jal 519c + exit(1); + 2760: 4505 li a0,1 + 2762: 612020ef jal 4d74 + printf("%s: create 123456789012345/123456789012345/123456789012345 failed\n", s); + 2766: 85a6 mv a1,s1 + 2768: 00004517 auipc a0,0x4 + 276c: b9850513 addi a0,a0,-1128 # 6300 + 2770: 22d020ef jal 519c + exit(1); + 2774: 4505 li a0,1 + 2776: 5fe020ef jal 4d74 + printf("%s: open 12345678901234/12345678901234/12345678901234 failed\n", s); + 277a: 85a6 mv a1,s1 + 277c: 00004517 auipc a0,0x4 + 2780: bfc50513 addi a0,a0,-1028 # 6378 + 2784: 219020ef jal 519c + exit(1); + 2788: 4505 li a0,1 + 278a: 5ea020ef jal 4d74 + printf("%s: mkdir 12345678901234/12345678901234 succeeded!\n", s); + 278e: 85a6 mv a1,s1 + 2790: 00004517 auipc a0,0x4 + 2794: c4850513 addi a0,a0,-952 # 63d8 + 2798: 205020ef jal 519c + exit(1); + 279c: 4505 li a0,1 + 279e: 5d6020ef jal 4d74 + printf("%s: mkdir 12345678901234/123456789012345 succeeded!\n", s); + 27a2: 85a6 mv a1,s1 + 27a4: 00004517 auipc a0,0x4 + 27a8: c8c50513 addi a0,a0,-884 # 6430 + 27ac: 1f1020ef jal 519c + exit(1); + 27b0: 4505 li a0,1 + 27b2: 5c2020ef jal 4d74 + +00000000000027b6 : +{ + 27b6: b8010113 addi sp,sp,-1152 + 27ba: 46113c23 sd ra,1144(sp) + 27be: 46813823 sd s0,1136(sp) + 27c2: 46913423 sd s1,1128(sp) + 27c6: 47213023 sd s2,1120(sp) + 27ca: 45313c23 sd s3,1112(sp) + 27ce: 45413823 sd s4,1104(sp) + 27d2: 45513423 sd s5,1096(sp) + 27d6: 45613023 sd s6,1088(sp) + 27da: 43713c23 sd s7,1080(sp) + 27de: 43813823 sd s8,1072(sp) + 27e2: 43913423 sd s9,1064(sp) + 27e6: 48010413 addi s0,sp,1152 + 27ea: 8caa mv s9,a0 + unlink("diskfulldir"); + 27ec: 00004517 auipc a0,0x4 + 27f0: c7c50513 addi a0,a0,-900 # 6468 + 27f4: 5d0020ef jal 4dc4 + 27f8: 03000993 li s3,48 + name[0] = 'b'; + 27fc: 06200b13 li s6,98 + name[1] = 'i'; + 2800: 06900a93 li s5,105 + name[2] = 'g'; + 2804: 06700a13 li s4,103 + 2808: 10c00b93 li s7,268 + for(fi = 0; done == 0 && '0' + fi < 0177; fi++){ + 280c: 07f00c13 li s8,127 + 2810: aab9 j 296e + printf("%s: could not create file %s\n", s, name); + 2812: b8040613 addi a2,s0,-1152 + 2816: 85e6 mv a1,s9 + 2818: 00004517 auipc a0,0x4 + 281c: c6050513 addi a0,a0,-928 # 6478 + 2820: 17d020ef jal 519c + break; + 2824: a039 j 2832 + close(fd); + 2826: 854a mv a0,s2 + 2828: 574020ef jal 4d9c + close(fd); + 282c: 854a mv a0,s2 + 282e: 56e020ef jal 4d9c + for(int i = 0; i < nzz; i++){ + 2832: 4481 li s1,0 + name[0] = 'z'; + 2834: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 2838: 08000993 li s3,128 + name[0] = 'z'; + 283c: bb240023 sb s2,-1120(s0) + name[1] = 'z'; + 2840: bb2400a3 sb s2,-1119(s0) + name[2] = '0' + (i / 32); + 2844: 41f4d71b sraiw a4,s1,0x1f + 2848: 01b7571b srliw a4,a4,0x1b + 284c: 009707bb addw a5,a4,s1 + 2850: 4057d69b sraiw a3,a5,0x5 + 2854: 0306869b addiw a3,a3,48 + 2858: bad40123 sb a3,-1118(s0) + name[3] = '0' + (i % 32); + 285c: 8bfd andi a5,a5,31 + 285e: 9f99 subw a5,a5,a4 + 2860: 0307879b addiw a5,a5,48 + 2864: baf401a3 sb a5,-1117(s0) + name[4] = '\0'; + 2868: ba040223 sb zero,-1116(s0) + unlink(name); + 286c: ba040513 addi a0,s0,-1120 + 2870: 554020ef jal 4dc4 + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + 2874: 60200593 li a1,1538 + 2878: ba040513 addi a0,s0,-1120 + 287c: 538020ef jal 4db4 + if(fd < 0) + 2880: 00054763 bltz a0,288e + close(fd); + 2884: 518020ef jal 4d9c + for(int i = 0; i < nzz; i++){ + 2888: 2485 addiw s1,s1,1 + 288a: fb3499e3 bne s1,s3,283c + if(mkdir("diskfulldir") == 0) + 288e: 00004517 auipc a0,0x4 + 2892: bda50513 addi a0,a0,-1062 # 6468 + 2896: 546020ef jal 4ddc + 289a: 12050063 beqz a0,29ba + unlink("diskfulldir"); + 289e: 00004517 auipc a0,0x4 + 28a2: bca50513 addi a0,a0,-1078 # 6468 + 28a6: 51e020ef jal 4dc4 + for(int i = 0; i < nzz; i++){ + 28aa: 4481 li s1,0 + name[0] = 'z'; + 28ac: 07a00913 li s2,122 + for(int i = 0; i < nzz; i++){ + 28b0: 08000993 li s3,128 + name[0] = 'z'; + 28b4: bb240023 sb s2,-1120(s0) + name[1] = 'z'; + 28b8: bb2400a3 sb s2,-1119(s0) + name[2] = '0' + (i / 32); + 28bc: 41f4d71b sraiw a4,s1,0x1f + 28c0: 01b7571b srliw a4,a4,0x1b + 28c4: 009707bb addw a5,a4,s1 + 28c8: 4057d69b sraiw a3,a5,0x5 + 28cc: 0306869b addiw a3,a3,48 + 28d0: bad40123 sb a3,-1118(s0) + name[3] = '0' + (i % 32); + 28d4: 8bfd andi a5,a5,31 + 28d6: 9f99 subw a5,a5,a4 + 28d8: 0307879b addiw a5,a5,48 + 28dc: baf401a3 sb a5,-1117(s0) + name[4] = '\0'; + 28e0: ba040223 sb zero,-1116(s0) + unlink(name); + 28e4: ba040513 addi a0,s0,-1120 + 28e8: 4dc020ef jal 4dc4 + for(int i = 0; i < nzz; i++){ + 28ec: 2485 addiw s1,s1,1 + 28ee: fd3493e3 bne s1,s3,28b4 + 28f2: 03000493 li s1,48 + name[0] = 'b'; + 28f6: 06200a93 li s5,98 + name[1] = 'i'; + 28fa: 06900a13 li s4,105 + name[2] = 'g'; + 28fe: 06700993 li s3,103 + for(int i = 0; '0' + i < 0177; i++){ + 2902: 07f00913 li s2,127 + name[0] = 'b'; + 2906: bb540023 sb s5,-1120(s0) + name[1] = 'i'; + 290a: bb4400a3 sb s4,-1119(s0) + name[2] = 'g'; + 290e: bb340123 sb s3,-1118(s0) + name[3] = '0' + i; + 2912: ba9401a3 sb s1,-1117(s0) + name[4] = '\0'; + 2916: ba040223 sb zero,-1116(s0) + unlink(name); + 291a: ba040513 addi a0,s0,-1120 + 291e: 4a6020ef jal 4dc4 + for(int i = 0; '0' + i < 0177; i++){ + 2922: 2485 addiw s1,s1,1 + 2924: 0ff4f493 zext.b s1,s1 + 2928: fd249fe3 bne s1,s2,2906 +} + 292c: 47813083 ld ra,1144(sp) + 2930: 47013403 ld s0,1136(sp) + 2934: 46813483 ld s1,1128(sp) + 2938: 46013903 ld s2,1120(sp) + 293c: 45813983 ld s3,1112(sp) + 2940: 45013a03 ld s4,1104(sp) + 2944: 44813a83 ld s5,1096(sp) + 2948: 44013b03 ld s6,1088(sp) + 294c: 43813b83 ld s7,1080(sp) + 2950: 43013c03 ld s8,1072(sp) + 2954: 42813c83 ld s9,1064(sp) + 2958: 48010113 addi sp,sp,1152 + 295c: 8082 ret + close(fd); + 295e: 854a mv a0,s2 + 2960: 43c020ef jal 4d9c + for(fi = 0; done == 0 && '0' + fi < 0177; fi++){ + 2964: 2985 addiw s3,s3,1 + 2966: 0ff9f993 zext.b s3,s3 + 296a: ed8984e3 beq s3,s8,2832 + name[0] = 'b'; + 296e: b9640023 sb s6,-1152(s0) + name[1] = 'i'; + 2972: b95400a3 sb s5,-1151(s0) + name[2] = 'g'; + 2976: b9440123 sb s4,-1150(s0) + name[3] = '0' + fi; + 297a: b93401a3 sb s3,-1149(s0) + name[4] = '\0'; + 297e: b8040223 sb zero,-1148(s0) + unlink(name); + 2982: b8040513 addi a0,s0,-1152 + 2986: 43e020ef jal 4dc4 + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + 298a: 60200593 li a1,1538 + 298e: b8040513 addi a0,s0,-1152 + 2992: 422020ef jal 4db4 + 2996: 892a mv s2,a0 + if(fd < 0){ + 2998: e6054de3 bltz a0,2812 + 299c: 84de mv s1,s7 + if(write(fd, buf, BSIZE) != BSIZE){ + 299e: 40000613 li a2,1024 + 29a2: ba040593 addi a1,s0,-1120 + 29a6: 854a mv a0,s2 + 29a8: 3ec020ef jal 4d94 + 29ac: 40000793 li a5,1024 + 29b0: e6f51be3 bne a0,a5,2826 + for(int i = 0; i < MAXFILE; i++){ + 29b4: 34fd addiw s1,s1,-1 + 29b6: f4e5 bnez s1,299e + 29b8: b75d j 295e + printf("%s: mkdir(diskfulldir) unexpectedly succeeded!\n", s); + 29ba: 85e6 mv a1,s9 + 29bc: 00004517 auipc a0,0x4 + 29c0: adc50513 addi a0,a0,-1316 # 6498 + 29c4: 7d8020ef jal 519c + 29c8: bdd9 j 289e + +00000000000029ca : +{ + 29ca: 1101 addi sp,sp,-32 + 29cc: ec06 sd ra,24(sp) + 29ce: e822 sd s0,16(sp) + 29d0: e426 sd s1,8(sp) + 29d2: 1000 addi s0,sp,32 + 29d4: 84aa mv s1,a0 + if(mkdir("iputdir") < 0){ + 29d6: 00004517 auipc a0,0x4 + 29da: af250513 addi a0,a0,-1294 # 64c8 + 29de: 3fe020ef jal 4ddc + 29e2: 02054f63 bltz a0,2a20 + if(chdir("iputdir") < 0){ + 29e6: 00004517 auipc a0,0x4 + 29ea: ae250513 addi a0,a0,-1310 # 64c8 + 29ee: 3f6020ef jal 4de4 + 29f2: 04054163 bltz a0,2a34 + if(unlink("../iputdir") < 0){ + 29f6: 00004517 auipc a0,0x4 + 29fa: b1250513 addi a0,a0,-1262 # 6508 + 29fe: 3c6020ef jal 4dc4 + 2a02: 04054363 bltz a0,2a48 + if(chdir("/") < 0){ + 2a06: 00004517 auipc a0,0x4 + 2a0a: b3250513 addi a0,a0,-1230 # 6538 + 2a0e: 3d6020ef jal 4de4 + 2a12: 04054563 bltz a0,2a5c +} + 2a16: 60e2 ld ra,24(sp) + 2a18: 6442 ld s0,16(sp) + 2a1a: 64a2 ld s1,8(sp) + 2a1c: 6105 addi sp,sp,32 + 2a1e: 8082 ret + printf("%s: mkdir failed\n", s); + 2a20: 85a6 mv a1,s1 + 2a22: 00004517 auipc a0,0x4 + 2a26: aae50513 addi a0,a0,-1362 # 64d0 + 2a2a: 772020ef jal 519c + exit(1); + 2a2e: 4505 li a0,1 + 2a30: 344020ef jal 4d74 + printf("%s: chdir iputdir failed\n", s); + 2a34: 85a6 mv a1,s1 + 2a36: 00004517 auipc a0,0x4 + 2a3a: ab250513 addi a0,a0,-1358 # 64e8 + 2a3e: 75e020ef jal 519c + exit(1); + 2a42: 4505 li a0,1 + 2a44: 330020ef jal 4d74 + printf("%s: unlink ../iputdir failed\n", s); + 2a48: 85a6 mv a1,s1 + 2a4a: 00004517 auipc a0,0x4 + 2a4e: ace50513 addi a0,a0,-1330 # 6518 + 2a52: 74a020ef jal 519c + exit(1); + 2a56: 4505 li a0,1 + 2a58: 31c020ef jal 4d74 + printf("%s: chdir / failed\n", s); + 2a5c: 85a6 mv a1,s1 + 2a5e: 00004517 auipc a0,0x4 + 2a62: ae250513 addi a0,a0,-1310 # 6540 + 2a66: 736020ef jal 519c + exit(1); + 2a6a: 4505 li a0,1 + 2a6c: 308020ef jal 4d74 + +0000000000002a70 : +{ + 2a70: 7179 addi sp,sp,-48 + 2a72: f406 sd ra,40(sp) + 2a74: f022 sd s0,32(sp) + 2a76: ec26 sd s1,24(sp) + 2a78: 1800 addi s0,sp,48 + 2a7a: 84aa mv s1,a0 + pid = fork(); + 2a7c: 2f0020ef jal 4d6c + if(pid < 0){ + 2a80: 02054e63 bltz a0,2abc + if(pid == 0){ + 2a84: e541 bnez a0,2b0c + if(mkdir("iputdir") < 0){ + 2a86: 00004517 auipc a0,0x4 + 2a8a: a4250513 addi a0,a0,-1470 # 64c8 + 2a8e: 34e020ef jal 4ddc + 2a92: 02054f63 bltz a0,2ad0 + if(chdir("iputdir") < 0){ + 2a96: 00004517 auipc a0,0x4 + 2a9a: a3250513 addi a0,a0,-1486 # 64c8 + 2a9e: 346020ef jal 4de4 + 2aa2: 04054163 bltz a0,2ae4 + if(unlink("../iputdir") < 0){ + 2aa6: 00004517 auipc a0,0x4 + 2aaa: a6250513 addi a0,a0,-1438 # 6508 + 2aae: 316020ef jal 4dc4 + 2ab2: 04054363 bltz a0,2af8 + exit(0); + 2ab6: 4501 li a0,0 + 2ab8: 2bc020ef jal 4d74 + printf("%s: fork failed\n", s); + 2abc: 85a6 mv a1,s1 + 2abe: 00003517 auipc a0,0x3 + 2ac2: 15a50513 addi a0,a0,346 # 5c18 + 2ac6: 6d6020ef jal 519c + exit(1); + 2aca: 4505 li a0,1 + 2acc: 2a8020ef jal 4d74 + printf("%s: mkdir failed\n", s); + 2ad0: 85a6 mv a1,s1 + 2ad2: 00004517 auipc a0,0x4 + 2ad6: 9fe50513 addi a0,a0,-1538 # 64d0 + 2ada: 6c2020ef jal 519c + exit(1); + 2ade: 4505 li a0,1 + 2ae0: 294020ef jal 4d74 + printf("%s: child chdir failed\n", s); + 2ae4: 85a6 mv a1,s1 + 2ae6: 00004517 auipc a0,0x4 + 2aea: a7250513 addi a0,a0,-1422 # 6558 + 2aee: 6ae020ef jal 519c + exit(1); + 2af2: 4505 li a0,1 + 2af4: 280020ef jal 4d74 + printf("%s: unlink ../iputdir failed\n", s); + 2af8: 85a6 mv a1,s1 + 2afa: 00004517 auipc a0,0x4 + 2afe: a1e50513 addi a0,a0,-1506 # 6518 + 2b02: 69a020ef jal 519c + exit(1); + 2b06: 4505 li a0,1 + 2b08: 26c020ef jal 4d74 + wait(&xstatus); + 2b0c: fdc40513 addi a0,s0,-36 + 2b10: 26c020ef jal 4d7c + exit(xstatus); + 2b14: fdc42503 lw a0,-36(s0) + 2b18: 25c020ef jal 4d74 + +0000000000002b1c : +{ + 2b1c: 1101 addi sp,sp,-32 + 2b1e: ec06 sd ra,24(sp) + 2b20: e822 sd s0,16(sp) + 2b22: e426 sd s1,8(sp) + 2b24: 1000 addi s0,sp,32 + 2b26: 84aa mv s1,a0 + if(mkdir("dir0") < 0){ + 2b28: 00004517 auipc a0,0x4 + 2b2c: a4850513 addi a0,a0,-1464 # 6570 + 2b30: 2ac020ef jal 4ddc + 2b34: 02054f63 bltz a0,2b72 + if(chdir("dir0") < 0){ + 2b38: 00004517 auipc a0,0x4 + 2b3c: a3850513 addi a0,a0,-1480 # 6570 + 2b40: 2a4020ef jal 4de4 + 2b44: 04054163 bltz a0,2b86 + if(chdir("..") < 0){ + 2b48: 00004517 auipc a0,0x4 + 2b4c: a4850513 addi a0,a0,-1464 # 6590 + 2b50: 294020ef jal 4de4 + 2b54: 04054363 bltz a0,2b9a + if(unlink("dir0") < 0){ + 2b58: 00004517 auipc a0,0x4 + 2b5c: a1850513 addi a0,a0,-1512 # 6570 + 2b60: 264020ef jal 4dc4 + 2b64: 04054563 bltz a0,2bae +} + 2b68: 60e2 ld ra,24(sp) + 2b6a: 6442 ld s0,16(sp) + 2b6c: 64a2 ld s1,8(sp) + 2b6e: 6105 addi sp,sp,32 + 2b70: 8082 ret + printf("%s: mkdir failed\n", s); + 2b72: 85a6 mv a1,s1 + 2b74: 00004517 auipc a0,0x4 + 2b78: 95c50513 addi a0,a0,-1700 # 64d0 + 2b7c: 620020ef jal 519c + exit(1); + 2b80: 4505 li a0,1 + 2b82: 1f2020ef jal 4d74 + printf("%s: chdir dir0 failed\n", s); + 2b86: 85a6 mv a1,s1 + 2b88: 00004517 auipc a0,0x4 + 2b8c: 9f050513 addi a0,a0,-1552 # 6578 + 2b90: 60c020ef jal 519c + exit(1); + 2b94: 4505 li a0,1 + 2b96: 1de020ef jal 4d74 + printf("%s: chdir .. failed\n", s); + 2b9a: 85a6 mv a1,s1 + 2b9c: 00004517 auipc a0,0x4 + 2ba0: 9fc50513 addi a0,a0,-1540 # 6598 + 2ba4: 5f8020ef jal 519c + exit(1); + 2ba8: 4505 li a0,1 + 2baa: 1ca020ef jal 4d74 + printf("%s: unlink dir0 failed\n", s); + 2bae: 85a6 mv a1,s1 + 2bb0: 00004517 auipc a0,0x4 + 2bb4: a0050513 addi a0,a0,-1536 # 65b0 + 2bb8: 5e4020ef jal 519c + exit(1); + 2bbc: 4505 li a0,1 + 2bbe: 1b6020ef jal 4d74 + +0000000000002bc2 : +{ + 2bc2: 1101 addi sp,sp,-32 + 2bc4: ec06 sd ra,24(sp) + 2bc6: e822 sd s0,16(sp) + 2bc8: e426 sd s1,8(sp) + 2bca: e04a sd s2,0(sp) + 2bcc: 1000 addi s0,sp,32 + 2bce: 892a mv s2,a0 + unlink("ff"); + 2bd0: 00004517 auipc a0,0x4 + 2bd4: b2850513 addi a0,a0,-1240 # 66f8 + 2bd8: 1ec020ef jal 4dc4 + if(mkdir("dd") != 0){ + 2bdc: 00004517 auipc a0,0x4 + 2be0: 9ec50513 addi a0,a0,-1556 # 65c8 + 2be4: 1f8020ef jal 4ddc + 2be8: 2e051263 bnez a0,2ecc + fd = open("dd/ff", O_CREATE | O_RDWR); + 2bec: 20200593 li a1,514 + 2bf0: 00004517 auipc a0,0x4 + 2bf4: 9f850513 addi a0,a0,-1544 # 65e8 + 2bf8: 1bc020ef jal 4db4 + 2bfc: 84aa mv s1,a0 + if(fd < 0){ + 2bfe: 2e054163 bltz a0,2ee0 + write(fd, "ff", 2); + 2c02: 4609 li a2,2 + 2c04: 00004597 auipc a1,0x4 + 2c08: af458593 addi a1,a1,-1292 # 66f8 + 2c0c: 188020ef jal 4d94 + close(fd); + 2c10: 8526 mv a0,s1 + 2c12: 18a020ef jal 4d9c + if(unlink("dd") >= 0){ + 2c16: 00004517 auipc a0,0x4 + 2c1a: 9b250513 addi a0,a0,-1614 # 65c8 + 2c1e: 1a6020ef jal 4dc4 + 2c22: 2c055963 bgez a0,2ef4 + if(mkdir("/dd/dd") != 0){ + 2c26: 00004517 auipc a0,0x4 + 2c2a: a1a50513 addi a0,a0,-1510 # 6640 + 2c2e: 1ae020ef jal 4ddc + 2c32: 2c051b63 bnez a0,2f08 + fd = open("dd/dd/ff", O_CREATE | O_RDWR); + 2c36: 20200593 li a1,514 + 2c3a: 00004517 auipc a0,0x4 + 2c3e: a2e50513 addi a0,a0,-1490 # 6668 + 2c42: 172020ef jal 4db4 + 2c46: 84aa mv s1,a0 + if(fd < 0){ + 2c48: 2c054a63 bltz a0,2f1c + write(fd, "FF", 2); + 2c4c: 4609 li a2,2 + 2c4e: 00004597 auipc a1,0x4 + 2c52: a4a58593 addi a1,a1,-1462 # 6698 + 2c56: 13e020ef jal 4d94 + close(fd); + 2c5a: 8526 mv a0,s1 + 2c5c: 140020ef jal 4d9c + fd = open("dd/dd/../ff", 0); + 2c60: 4581 li a1,0 + 2c62: 00004517 auipc a0,0x4 + 2c66: a3e50513 addi a0,a0,-1474 # 66a0 + 2c6a: 14a020ef jal 4db4 + 2c6e: 84aa mv s1,a0 + if(fd < 0){ + 2c70: 2c054063 bltz a0,2f30 + cc = read(fd, buf, sizeof(buf)); + 2c74: 660d lui a2,0x3 + 2c76: 0000a597 auipc a1,0xa + 2c7a: 04258593 addi a1,a1,66 # ccb8 + 2c7e: 10e020ef jal 4d8c + if(cc != 2 || buf[0] != 'f'){ + 2c82: 4789 li a5,2 + 2c84: 2cf51063 bne a0,a5,2f44 + 2c88: 0000a717 auipc a4,0xa + 2c8c: 03074703 lbu a4,48(a4) # ccb8 + 2c90: 06600793 li a5,102 + 2c94: 2af71863 bne a4,a5,2f44 + close(fd); + 2c98: 8526 mv a0,s1 + 2c9a: 102020ef jal 4d9c + if(link("dd/dd/ff", "dd/dd/ffff") != 0){ + 2c9e: 00004597 auipc a1,0x4 + 2ca2: a5258593 addi a1,a1,-1454 # 66f0 + 2ca6: 00004517 auipc a0,0x4 + 2caa: 9c250513 addi a0,a0,-1598 # 6668 + 2cae: 126020ef jal 4dd4 + 2cb2: 2a051363 bnez a0,2f58 + if(unlink("dd/dd/ff") != 0){ + 2cb6: 00004517 auipc a0,0x4 + 2cba: 9b250513 addi a0,a0,-1614 # 6668 + 2cbe: 106020ef jal 4dc4 + 2cc2: 2a051563 bnez a0,2f6c + if(open("dd/dd/ff", O_RDONLY) >= 0){ + 2cc6: 4581 li a1,0 + 2cc8: 00004517 auipc a0,0x4 + 2ccc: 9a050513 addi a0,a0,-1632 # 6668 + 2cd0: 0e4020ef jal 4db4 + 2cd4: 2a055663 bgez a0,2f80 + if(chdir("dd") != 0){ + 2cd8: 00004517 auipc a0,0x4 + 2cdc: 8f050513 addi a0,a0,-1808 # 65c8 + 2ce0: 104020ef jal 4de4 + 2ce4: 2a051863 bnez a0,2f94 + if(chdir("dd/../../dd") != 0){ + 2ce8: 00004517 auipc a0,0x4 + 2cec: aa050513 addi a0,a0,-1376 # 6788 + 2cf0: 0f4020ef jal 4de4 + 2cf4: 2a051a63 bnez a0,2fa8 + if(chdir("dd/../../../dd") != 0){ + 2cf8: 00004517 auipc a0,0x4 + 2cfc: ac050513 addi a0,a0,-1344 # 67b8 + 2d00: 0e4020ef jal 4de4 + 2d04: 2a051c63 bnez a0,2fbc + if(chdir("./..") != 0){ + 2d08: 00004517 auipc a0,0x4 + 2d0c: ae850513 addi a0,a0,-1304 # 67f0 + 2d10: 0d4020ef jal 4de4 + 2d14: 2a051e63 bnez a0,2fd0 + fd = open("dd/dd/ffff", 0); + 2d18: 4581 li a1,0 + 2d1a: 00004517 auipc a0,0x4 + 2d1e: 9d650513 addi a0,a0,-1578 # 66f0 + 2d22: 092020ef jal 4db4 + 2d26: 84aa mv s1,a0 + if(fd < 0){ + 2d28: 2a054e63 bltz a0,2fe4 + if(read(fd, buf, sizeof(buf)) != 2){ + 2d2c: 660d lui a2,0x3 + 2d2e: 0000a597 auipc a1,0xa + 2d32: f8a58593 addi a1,a1,-118 # ccb8 + 2d36: 056020ef jal 4d8c + 2d3a: 4789 li a5,2 + 2d3c: 2af51e63 bne a0,a5,2ff8 + close(fd); + 2d40: 8526 mv a0,s1 + 2d42: 05a020ef jal 4d9c + if(open("dd/dd/ff", O_RDONLY) >= 0){ + 2d46: 4581 li a1,0 + 2d48: 00004517 auipc a0,0x4 + 2d4c: 92050513 addi a0,a0,-1760 # 6668 + 2d50: 064020ef jal 4db4 + 2d54: 2a055c63 bgez a0,300c + if(open("dd/ff/ff", O_CREATE|O_RDWR) >= 0){ + 2d58: 20200593 li a1,514 + 2d5c: 00004517 auipc a0,0x4 + 2d60: b2450513 addi a0,a0,-1244 # 6880 + 2d64: 050020ef jal 4db4 + 2d68: 2a055c63 bgez a0,3020 + if(open("dd/xx/ff", O_CREATE|O_RDWR) >= 0){ + 2d6c: 20200593 li a1,514 + 2d70: 00004517 auipc a0,0x4 + 2d74: b4050513 addi a0,a0,-1216 # 68b0 + 2d78: 03c020ef jal 4db4 + 2d7c: 2a055c63 bgez a0,3034 + if(open("dd", O_CREATE) >= 0){ + 2d80: 20000593 li a1,512 + 2d84: 00004517 auipc a0,0x4 + 2d88: 84450513 addi a0,a0,-1980 # 65c8 + 2d8c: 028020ef jal 4db4 + 2d90: 2a055c63 bgez a0,3048 + if(open("dd", O_RDWR) >= 0){ + 2d94: 4589 li a1,2 + 2d96: 00004517 auipc a0,0x4 + 2d9a: 83250513 addi a0,a0,-1998 # 65c8 + 2d9e: 016020ef jal 4db4 + 2da2: 2a055d63 bgez a0,305c + if(open("dd", O_WRONLY) >= 0){ + 2da6: 4585 li a1,1 + 2da8: 00004517 auipc a0,0x4 + 2dac: 82050513 addi a0,a0,-2016 # 65c8 + 2db0: 004020ef jal 4db4 + 2db4: 2a055e63 bgez a0,3070 + if(link("dd/ff/ff", "dd/dd/xx") == 0){ + 2db8: 00004597 auipc a1,0x4 + 2dbc: b8858593 addi a1,a1,-1144 # 6940 + 2dc0: 00004517 auipc a0,0x4 + 2dc4: ac050513 addi a0,a0,-1344 # 6880 + 2dc8: 00c020ef jal 4dd4 + 2dcc: 2a050c63 beqz a0,3084 + if(link("dd/xx/ff", "dd/dd/xx") == 0){ + 2dd0: 00004597 auipc a1,0x4 + 2dd4: b7058593 addi a1,a1,-1168 # 6940 + 2dd8: 00004517 auipc a0,0x4 + 2ddc: ad850513 addi a0,a0,-1320 # 68b0 + 2de0: 7f5010ef jal 4dd4 + 2de4: 2a050a63 beqz a0,3098 + if(link("dd/ff", "dd/dd/ffff") == 0){ + 2de8: 00004597 auipc a1,0x4 + 2dec: 90858593 addi a1,a1,-1784 # 66f0 + 2df0: 00003517 auipc a0,0x3 + 2df4: 7f850513 addi a0,a0,2040 # 65e8 + 2df8: 7dd010ef jal 4dd4 + 2dfc: 2a050863 beqz a0,30ac + if(mkdir("dd/ff/ff") == 0){ + 2e00: 00004517 auipc a0,0x4 + 2e04: a8050513 addi a0,a0,-1408 # 6880 + 2e08: 7d5010ef jal 4ddc + 2e0c: 2a050a63 beqz a0,30c0 + if(mkdir("dd/xx/ff") == 0){ + 2e10: 00004517 auipc a0,0x4 + 2e14: aa050513 addi a0,a0,-1376 # 68b0 + 2e18: 7c5010ef jal 4ddc + 2e1c: 2a050c63 beqz a0,30d4 + if(mkdir("dd/dd/ffff") == 0){ + 2e20: 00004517 auipc a0,0x4 + 2e24: 8d050513 addi a0,a0,-1840 # 66f0 + 2e28: 7b5010ef jal 4ddc + 2e2c: 2a050e63 beqz a0,30e8 + if(unlink("dd/xx/ff") == 0){ + 2e30: 00004517 auipc a0,0x4 + 2e34: a8050513 addi a0,a0,-1408 # 68b0 + 2e38: 78d010ef jal 4dc4 + 2e3c: 2c050063 beqz a0,30fc + if(unlink("dd/ff/ff") == 0){ + 2e40: 00004517 auipc a0,0x4 + 2e44: a4050513 addi a0,a0,-1472 # 6880 + 2e48: 77d010ef jal 4dc4 + 2e4c: 2c050263 beqz a0,3110 + if(chdir("dd/ff") == 0){ + 2e50: 00003517 auipc a0,0x3 + 2e54: 79850513 addi a0,a0,1944 # 65e8 + 2e58: 78d010ef jal 4de4 + 2e5c: 2c050463 beqz a0,3124 + if(chdir("dd/xx") == 0){ + 2e60: 00004517 auipc a0,0x4 + 2e64: c3050513 addi a0,a0,-976 # 6a90 + 2e68: 77d010ef jal 4de4 + 2e6c: 2c050663 beqz a0,3138 + if(unlink("dd/dd/ffff") != 0){ + 2e70: 00004517 auipc a0,0x4 + 2e74: 88050513 addi a0,a0,-1920 # 66f0 + 2e78: 74d010ef jal 4dc4 + 2e7c: 2c051863 bnez a0,314c + if(unlink("dd/ff") != 0){ + 2e80: 00003517 auipc a0,0x3 + 2e84: 76850513 addi a0,a0,1896 # 65e8 + 2e88: 73d010ef jal 4dc4 + 2e8c: 2c051a63 bnez a0,3160 + if(unlink("dd") == 0){ + 2e90: 00003517 auipc a0,0x3 + 2e94: 73850513 addi a0,a0,1848 # 65c8 + 2e98: 72d010ef jal 4dc4 + 2e9c: 2c050c63 beqz a0,3174 + if(unlink("dd/dd") < 0){ + 2ea0: 00004517 auipc a0,0x4 + 2ea4: c6050513 addi a0,a0,-928 # 6b00 + 2ea8: 71d010ef jal 4dc4 + 2eac: 2c054e63 bltz a0,3188 + if(unlink("dd") < 0){ + 2eb0: 00003517 auipc a0,0x3 + 2eb4: 71850513 addi a0,a0,1816 # 65c8 + 2eb8: 70d010ef jal 4dc4 + 2ebc: 2e054063 bltz a0,319c +} + 2ec0: 60e2 ld ra,24(sp) + 2ec2: 6442 ld s0,16(sp) + 2ec4: 64a2 ld s1,8(sp) + 2ec6: 6902 ld s2,0(sp) + 2ec8: 6105 addi sp,sp,32 + 2eca: 8082 ret + printf("%s: mkdir dd failed\n", s); + 2ecc: 85ca mv a1,s2 + 2ece: 00003517 auipc a0,0x3 + 2ed2: 70250513 addi a0,a0,1794 # 65d0 + 2ed6: 2c6020ef jal 519c + exit(1); + 2eda: 4505 li a0,1 + 2edc: 699010ef jal 4d74 + printf("%s: create dd/ff failed\n", s); + 2ee0: 85ca mv a1,s2 + 2ee2: 00003517 auipc a0,0x3 + 2ee6: 70e50513 addi a0,a0,1806 # 65f0 + 2eea: 2b2020ef jal 519c + exit(1); + 2eee: 4505 li a0,1 + 2ef0: 685010ef jal 4d74 + printf("%s: unlink dd (non-empty dir) succeeded!\n", s); + 2ef4: 85ca mv a1,s2 + 2ef6: 00003517 auipc a0,0x3 + 2efa: 71a50513 addi a0,a0,1818 # 6610 + 2efe: 29e020ef jal 519c + exit(1); + 2f02: 4505 li a0,1 + 2f04: 671010ef jal 4d74 + printf("%s: subdir mkdir dd/dd failed\n", s); + 2f08: 85ca mv a1,s2 + 2f0a: 00003517 auipc a0,0x3 + 2f0e: 73e50513 addi a0,a0,1854 # 6648 + 2f12: 28a020ef jal 519c + exit(1); + 2f16: 4505 li a0,1 + 2f18: 65d010ef jal 4d74 + printf("%s: create dd/dd/ff failed\n", s); + 2f1c: 85ca mv a1,s2 + 2f1e: 00003517 auipc a0,0x3 + 2f22: 75a50513 addi a0,a0,1882 # 6678 + 2f26: 276020ef jal 519c + exit(1); + 2f2a: 4505 li a0,1 + 2f2c: 649010ef jal 4d74 + printf("%s: open dd/dd/../ff failed\n", s); + 2f30: 85ca mv a1,s2 + 2f32: 00003517 auipc a0,0x3 + 2f36: 77e50513 addi a0,a0,1918 # 66b0 + 2f3a: 262020ef jal 519c + exit(1); + 2f3e: 4505 li a0,1 + 2f40: 635010ef jal 4d74 + printf("%s: dd/dd/../ff wrong content\n", s); + 2f44: 85ca mv a1,s2 + 2f46: 00003517 auipc a0,0x3 + 2f4a: 78a50513 addi a0,a0,1930 # 66d0 + 2f4e: 24e020ef jal 519c + exit(1); + 2f52: 4505 li a0,1 + 2f54: 621010ef jal 4d74 + printf("%s: link dd/dd/ff dd/dd/ffff failed\n", s); + 2f58: 85ca mv a1,s2 + 2f5a: 00003517 auipc a0,0x3 + 2f5e: 7a650513 addi a0,a0,1958 # 6700 + 2f62: 23a020ef jal 519c + exit(1); + 2f66: 4505 li a0,1 + 2f68: 60d010ef jal 4d74 + printf("%s: unlink dd/dd/ff failed\n", s); + 2f6c: 85ca mv a1,s2 + 2f6e: 00003517 auipc a0,0x3 + 2f72: 7ba50513 addi a0,a0,1978 # 6728 + 2f76: 226020ef jal 519c + exit(1); + 2f7a: 4505 li a0,1 + 2f7c: 5f9010ef jal 4d74 + printf("%s: open (unlinked) dd/dd/ff succeeded\n", s); + 2f80: 85ca mv a1,s2 + 2f82: 00003517 auipc a0,0x3 + 2f86: 7c650513 addi a0,a0,1990 # 6748 + 2f8a: 212020ef jal 519c + exit(1); + 2f8e: 4505 li a0,1 + 2f90: 5e5010ef jal 4d74 + printf("%s: chdir dd failed\n", s); + 2f94: 85ca mv a1,s2 + 2f96: 00003517 auipc a0,0x3 + 2f9a: 7da50513 addi a0,a0,2010 # 6770 + 2f9e: 1fe020ef jal 519c + exit(1); + 2fa2: 4505 li a0,1 + 2fa4: 5d1010ef jal 4d74 + printf("%s: chdir dd/../../dd failed\n", s); + 2fa8: 85ca mv a1,s2 + 2faa: 00003517 auipc a0,0x3 + 2fae: 7ee50513 addi a0,a0,2030 # 6798 + 2fb2: 1ea020ef jal 519c + exit(1); + 2fb6: 4505 li a0,1 + 2fb8: 5bd010ef jal 4d74 + printf("%s: chdir dd/../../../dd failed\n", s); + 2fbc: 85ca mv a1,s2 + 2fbe: 00004517 auipc a0,0x4 + 2fc2: 80a50513 addi a0,a0,-2038 # 67c8 + 2fc6: 1d6020ef jal 519c + exit(1); + 2fca: 4505 li a0,1 + 2fcc: 5a9010ef jal 4d74 + printf("%s: chdir ./.. failed\n", s); + 2fd0: 85ca mv a1,s2 + 2fd2: 00004517 auipc a0,0x4 + 2fd6: 82650513 addi a0,a0,-2010 # 67f8 + 2fda: 1c2020ef jal 519c + exit(1); + 2fde: 4505 li a0,1 + 2fe0: 595010ef jal 4d74 + printf("%s: open dd/dd/ffff failed\n", s); + 2fe4: 85ca mv a1,s2 + 2fe6: 00004517 auipc a0,0x4 + 2fea: 82a50513 addi a0,a0,-2006 # 6810 + 2fee: 1ae020ef jal 519c + exit(1); + 2ff2: 4505 li a0,1 + 2ff4: 581010ef jal 4d74 + printf("%s: read dd/dd/ffff wrong len\n", s); + 2ff8: 85ca mv a1,s2 + 2ffa: 00004517 auipc a0,0x4 + 2ffe: 83650513 addi a0,a0,-1994 # 6830 + 3002: 19a020ef jal 519c + exit(1); + 3006: 4505 li a0,1 + 3008: 56d010ef jal 4d74 + printf("%s: open (unlinked) dd/dd/ff succeeded!\n", s); + 300c: 85ca mv a1,s2 + 300e: 00004517 auipc a0,0x4 + 3012: 84250513 addi a0,a0,-1982 # 6850 + 3016: 186020ef jal 519c + exit(1); + 301a: 4505 li a0,1 + 301c: 559010ef jal 4d74 + printf("%s: create dd/ff/ff succeeded!\n", s); + 3020: 85ca mv a1,s2 + 3022: 00004517 auipc a0,0x4 + 3026: 86e50513 addi a0,a0,-1938 # 6890 + 302a: 172020ef jal 519c + exit(1); + 302e: 4505 li a0,1 + 3030: 545010ef jal 4d74 + printf("%s: create dd/xx/ff succeeded!\n", s); + 3034: 85ca mv a1,s2 + 3036: 00004517 auipc a0,0x4 + 303a: 88a50513 addi a0,a0,-1910 # 68c0 + 303e: 15e020ef jal 519c + exit(1); + 3042: 4505 li a0,1 + 3044: 531010ef jal 4d74 + printf("%s: create dd succeeded!\n", s); + 3048: 85ca mv a1,s2 + 304a: 00004517 auipc a0,0x4 + 304e: 89650513 addi a0,a0,-1898 # 68e0 + 3052: 14a020ef jal 519c + exit(1); + 3056: 4505 li a0,1 + 3058: 51d010ef jal 4d74 + printf("%s: open dd rdwr succeeded!\n", s); + 305c: 85ca mv a1,s2 + 305e: 00004517 auipc a0,0x4 + 3062: 8a250513 addi a0,a0,-1886 # 6900 + 3066: 136020ef jal 519c + exit(1); + 306a: 4505 li a0,1 + 306c: 509010ef jal 4d74 + printf("%s: open dd wronly succeeded!\n", s); + 3070: 85ca mv a1,s2 + 3072: 00004517 auipc a0,0x4 + 3076: 8ae50513 addi a0,a0,-1874 # 6920 + 307a: 122020ef jal 519c + exit(1); + 307e: 4505 li a0,1 + 3080: 4f5010ef jal 4d74 + printf("%s: link dd/ff/ff dd/dd/xx succeeded!\n", s); + 3084: 85ca mv a1,s2 + 3086: 00004517 auipc a0,0x4 + 308a: 8ca50513 addi a0,a0,-1846 # 6950 + 308e: 10e020ef jal 519c + exit(1); + 3092: 4505 li a0,1 + 3094: 4e1010ef jal 4d74 + printf("%s: link dd/xx/ff dd/dd/xx succeeded!\n", s); + 3098: 85ca mv a1,s2 + 309a: 00004517 auipc a0,0x4 + 309e: 8de50513 addi a0,a0,-1826 # 6978 + 30a2: 0fa020ef jal 519c + exit(1); + 30a6: 4505 li a0,1 + 30a8: 4cd010ef jal 4d74 + printf("%s: link dd/ff dd/dd/ffff succeeded!\n", s); + 30ac: 85ca mv a1,s2 + 30ae: 00004517 auipc a0,0x4 + 30b2: 8f250513 addi a0,a0,-1806 # 69a0 + 30b6: 0e6020ef jal 519c + exit(1); + 30ba: 4505 li a0,1 + 30bc: 4b9010ef jal 4d74 + printf("%s: mkdir dd/ff/ff succeeded!\n", s); + 30c0: 85ca mv a1,s2 + 30c2: 00004517 auipc a0,0x4 + 30c6: 90650513 addi a0,a0,-1786 # 69c8 + 30ca: 0d2020ef jal 519c + exit(1); + 30ce: 4505 li a0,1 + 30d0: 4a5010ef jal 4d74 + printf("%s: mkdir dd/xx/ff succeeded!\n", s); + 30d4: 85ca mv a1,s2 + 30d6: 00004517 auipc a0,0x4 + 30da: 91250513 addi a0,a0,-1774 # 69e8 + 30de: 0be020ef jal 519c + exit(1); + 30e2: 4505 li a0,1 + 30e4: 491010ef jal 4d74 + printf("%s: mkdir dd/dd/ffff succeeded!\n", s); + 30e8: 85ca mv a1,s2 + 30ea: 00004517 auipc a0,0x4 + 30ee: 91e50513 addi a0,a0,-1762 # 6a08 + 30f2: 0aa020ef jal 519c + exit(1); + 30f6: 4505 li a0,1 + 30f8: 47d010ef jal 4d74 + printf("%s: unlink dd/xx/ff succeeded!\n", s); + 30fc: 85ca mv a1,s2 + 30fe: 00004517 auipc a0,0x4 + 3102: 93250513 addi a0,a0,-1742 # 6a30 + 3106: 096020ef jal 519c + exit(1); + 310a: 4505 li a0,1 + 310c: 469010ef jal 4d74 + printf("%s: unlink dd/ff/ff succeeded!\n", s); + 3110: 85ca mv a1,s2 + 3112: 00004517 auipc a0,0x4 + 3116: 93e50513 addi a0,a0,-1730 # 6a50 + 311a: 082020ef jal 519c + exit(1); + 311e: 4505 li a0,1 + 3120: 455010ef jal 4d74 + printf("%s: chdir dd/ff succeeded!\n", s); + 3124: 85ca mv a1,s2 + 3126: 00004517 auipc a0,0x4 + 312a: 94a50513 addi a0,a0,-1718 # 6a70 + 312e: 06e020ef jal 519c + exit(1); + 3132: 4505 li a0,1 + 3134: 441010ef jal 4d74 + printf("%s: chdir dd/xx succeeded!\n", s); + 3138: 85ca mv a1,s2 + 313a: 00004517 auipc a0,0x4 + 313e: 95e50513 addi a0,a0,-1698 # 6a98 + 3142: 05a020ef jal 519c + exit(1); + 3146: 4505 li a0,1 + 3148: 42d010ef jal 4d74 + printf("%s: unlink dd/dd/ff failed\n", s); + 314c: 85ca mv a1,s2 + 314e: 00003517 auipc a0,0x3 + 3152: 5da50513 addi a0,a0,1498 # 6728 + 3156: 046020ef jal 519c + exit(1); + 315a: 4505 li a0,1 + 315c: 419010ef jal 4d74 + printf("%s: unlink dd/ff failed\n", s); + 3160: 85ca mv a1,s2 + 3162: 00004517 auipc a0,0x4 + 3166: 95650513 addi a0,a0,-1706 # 6ab8 + 316a: 032020ef jal 519c + exit(1); + 316e: 4505 li a0,1 + 3170: 405010ef jal 4d74 + printf("%s: unlink non-empty dd succeeded!\n", s); + 3174: 85ca mv a1,s2 + 3176: 00004517 auipc a0,0x4 + 317a: 96250513 addi a0,a0,-1694 # 6ad8 + 317e: 01e020ef jal 519c + exit(1); + 3182: 4505 li a0,1 + 3184: 3f1010ef jal 4d74 + printf("%s: unlink dd/dd failed\n", s); + 3188: 85ca mv a1,s2 + 318a: 00004517 auipc a0,0x4 + 318e: 97e50513 addi a0,a0,-1666 # 6b08 + 3192: 00a020ef jal 519c + exit(1); + 3196: 4505 li a0,1 + 3198: 3dd010ef jal 4d74 + printf("%s: unlink dd failed\n", s); + 319c: 85ca mv a1,s2 + 319e: 00004517 auipc a0,0x4 + 31a2: 98a50513 addi a0,a0,-1654 # 6b28 + 31a6: 7f7010ef jal 519c + exit(1); + 31aa: 4505 li a0,1 + 31ac: 3c9010ef jal 4d74 + +00000000000031b0 : +{ + 31b0: 1101 addi sp,sp,-32 + 31b2: ec06 sd ra,24(sp) + 31b4: e822 sd s0,16(sp) + 31b6: e426 sd s1,8(sp) + 31b8: 1000 addi s0,sp,32 + 31ba: 84aa mv s1,a0 + if(mkdir("dots") != 0){ + 31bc: 00004517 auipc a0,0x4 + 31c0: 98450513 addi a0,a0,-1660 # 6b40 + 31c4: 419010ef jal 4ddc + 31c8: e53d bnez a0,3236 + if(chdir("dots") != 0){ + 31ca: 00004517 auipc a0,0x4 + 31ce: 97650513 addi a0,a0,-1674 # 6b40 + 31d2: 413010ef jal 4de4 + 31d6: e935 bnez a0,324a + if(unlink(".") == 0){ + 31d8: 00003517 auipc a0,0x3 + 31dc: 89850513 addi a0,a0,-1896 # 5a70 + 31e0: 3e5010ef jal 4dc4 + 31e4: cd2d beqz a0,325e + if(unlink("..") == 0){ + 31e6: 00003517 auipc a0,0x3 + 31ea: 3aa50513 addi a0,a0,938 # 6590 + 31ee: 3d7010ef jal 4dc4 + 31f2: c141 beqz a0,3272 + if(chdir("/") != 0){ + 31f4: 00003517 auipc a0,0x3 + 31f8: 34450513 addi a0,a0,836 # 6538 + 31fc: 3e9010ef jal 4de4 + 3200: e159 bnez a0,3286 + if(unlink("dots/.") == 0){ + 3202: 00004517 auipc a0,0x4 + 3206: 9a650513 addi a0,a0,-1626 # 6ba8 + 320a: 3bb010ef jal 4dc4 + 320e: c551 beqz a0,329a + if(unlink("dots/..") == 0){ + 3210: 00004517 auipc a0,0x4 + 3214: 9c050513 addi a0,a0,-1600 # 6bd0 + 3218: 3ad010ef jal 4dc4 + 321c: c949 beqz a0,32ae + if(unlink("dots") != 0){ + 321e: 00004517 auipc a0,0x4 + 3222: 92250513 addi a0,a0,-1758 # 6b40 + 3226: 39f010ef jal 4dc4 + 322a: ed41 bnez a0,32c2 +} + 322c: 60e2 ld ra,24(sp) + 322e: 6442 ld s0,16(sp) + 3230: 64a2 ld s1,8(sp) + 3232: 6105 addi sp,sp,32 + 3234: 8082 ret + printf("%s: mkdir dots failed\n", s); + 3236: 85a6 mv a1,s1 + 3238: 00004517 auipc a0,0x4 + 323c: 91050513 addi a0,a0,-1776 # 6b48 + 3240: 75d010ef jal 519c + exit(1); + 3244: 4505 li a0,1 + 3246: 32f010ef jal 4d74 + printf("%s: chdir dots failed\n", s); + 324a: 85a6 mv a1,s1 + 324c: 00004517 auipc a0,0x4 + 3250: 91450513 addi a0,a0,-1772 # 6b60 + 3254: 749010ef jal 519c + exit(1); + 3258: 4505 li a0,1 + 325a: 31b010ef jal 4d74 + printf("%s: rm . worked!\n", s); + 325e: 85a6 mv a1,s1 + 3260: 00004517 auipc a0,0x4 + 3264: 91850513 addi a0,a0,-1768 # 6b78 + 3268: 735010ef jal 519c + exit(1); + 326c: 4505 li a0,1 + 326e: 307010ef jal 4d74 + printf("%s: rm .. worked!\n", s); + 3272: 85a6 mv a1,s1 + 3274: 00004517 auipc a0,0x4 + 3278: 91c50513 addi a0,a0,-1764 # 6b90 + 327c: 721010ef jal 519c + exit(1); + 3280: 4505 li a0,1 + 3282: 2f3010ef jal 4d74 + printf("%s: chdir / failed\n", s); + 3286: 85a6 mv a1,s1 + 3288: 00003517 auipc a0,0x3 + 328c: 2b850513 addi a0,a0,696 # 6540 + 3290: 70d010ef jal 519c + exit(1); + 3294: 4505 li a0,1 + 3296: 2df010ef jal 4d74 + printf("%s: unlink dots/. worked!\n", s); + 329a: 85a6 mv a1,s1 + 329c: 00004517 auipc a0,0x4 + 32a0: 91450513 addi a0,a0,-1772 # 6bb0 + 32a4: 6f9010ef jal 519c + exit(1); + 32a8: 4505 li a0,1 + 32aa: 2cb010ef jal 4d74 + printf("%s: unlink dots/.. worked!\n", s); + 32ae: 85a6 mv a1,s1 + 32b0: 00004517 auipc a0,0x4 + 32b4: 92850513 addi a0,a0,-1752 # 6bd8 + 32b8: 6e5010ef jal 519c + exit(1); + 32bc: 4505 li a0,1 + 32be: 2b7010ef jal 4d74 + printf("%s: unlink dots failed!\n", s); + 32c2: 85a6 mv a1,s1 + 32c4: 00004517 auipc a0,0x4 + 32c8: 93450513 addi a0,a0,-1740 # 6bf8 + 32cc: 6d1010ef jal 519c + exit(1); + 32d0: 4505 li a0,1 + 32d2: 2a3010ef jal 4d74 + +00000000000032d6 : +{ + 32d6: 1101 addi sp,sp,-32 + 32d8: ec06 sd ra,24(sp) + 32da: e822 sd s0,16(sp) + 32dc: e426 sd s1,8(sp) + 32de: e04a sd s2,0(sp) + 32e0: 1000 addi s0,sp,32 + 32e2: 892a mv s2,a0 + fd = open("dirfile", O_CREATE); + 32e4: 20000593 li a1,512 + 32e8: 00004517 auipc a0,0x4 + 32ec: 93050513 addi a0,a0,-1744 # 6c18 + 32f0: 2c5010ef jal 4db4 + if(fd < 0){ + 32f4: 0c054563 bltz a0,33be + close(fd); + 32f8: 2a5010ef jal 4d9c + if(chdir("dirfile") == 0){ + 32fc: 00004517 auipc a0,0x4 + 3300: 91c50513 addi a0,a0,-1764 # 6c18 + 3304: 2e1010ef jal 4de4 + 3308: c569 beqz a0,33d2 + fd = open("dirfile/xx", 0); + 330a: 4581 li a1,0 + 330c: 00004517 auipc a0,0x4 + 3310: 95450513 addi a0,a0,-1708 # 6c60 + 3314: 2a1010ef jal 4db4 + if(fd >= 0){ + 3318: 0c055763 bgez a0,33e6 + fd = open("dirfile/xx", O_CREATE); + 331c: 20000593 li a1,512 + 3320: 00004517 auipc a0,0x4 + 3324: 94050513 addi a0,a0,-1728 # 6c60 + 3328: 28d010ef jal 4db4 + if(fd >= 0){ + 332c: 0c055763 bgez a0,33fa + if(mkdir("dirfile/xx") == 0){ + 3330: 00004517 auipc a0,0x4 + 3334: 93050513 addi a0,a0,-1744 # 6c60 + 3338: 2a5010ef jal 4ddc + 333c: 0c050963 beqz a0,340e + if(unlink("dirfile/xx") == 0){ + 3340: 00004517 auipc a0,0x4 + 3344: 92050513 addi a0,a0,-1760 # 6c60 + 3348: 27d010ef jal 4dc4 + 334c: 0c050b63 beqz a0,3422 + if(link("README", "dirfile/xx") == 0){ + 3350: 00004597 auipc a1,0x4 + 3354: 91058593 addi a1,a1,-1776 # 6c60 + 3358: 00002517 auipc a0,0x2 + 335c: 20850513 addi a0,a0,520 # 5560 + 3360: 275010ef jal 4dd4 + 3364: 0c050963 beqz a0,3436 + if(unlink("dirfile") != 0){ + 3368: 00004517 auipc a0,0x4 + 336c: 8b050513 addi a0,a0,-1872 # 6c18 + 3370: 255010ef jal 4dc4 + 3374: 0c051b63 bnez a0,344a + fd = open(".", O_RDWR); + 3378: 4589 li a1,2 + 337a: 00002517 auipc a0,0x2 + 337e: 6f650513 addi a0,a0,1782 # 5a70 + 3382: 233010ef jal 4db4 + if(fd >= 0){ + 3386: 0c055c63 bgez a0,345e + fd = open(".", 0); + 338a: 4581 li a1,0 + 338c: 00002517 auipc a0,0x2 + 3390: 6e450513 addi a0,a0,1764 # 5a70 + 3394: 221010ef jal 4db4 + 3398: 84aa mv s1,a0 + if(write(fd, "x", 1) > 0){ + 339a: 4605 li a2,1 + 339c: 00002597 auipc a1,0x2 + 33a0: 05c58593 addi a1,a1,92 # 53f8 + 33a4: 1f1010ef jal 4d94 + 33a8: 0ca04563 bgtz a0,3472 + close(fd); + 33ac: 8526 mv a0,s1 + 33ae: 1ef010ef jal 4d9c +} + 33b2: 60e2 ld ra,24(sp) + 33b4: 6442 ld s0,16(sp) + 33b6: 64a2 ld s1,8(sp) + 33b8: 6902 ld s2,0(sp) + 33ba: 6105 addi sp,sp,32 + 33bc: 8082 ret + printf("%s: create dirfile failed\n", s); + 33be: 85ca mv a1,s2 + 33c0: 00004517 auipc a0,0x4 + 33c4: 86050513 addi a0,a0,-1952 # 6c20 + 33c8: 5d5010ef jal 519c + exit(1); + 33cc: 4505 li a0,1 + 33ce: 1a7010ef jal 4d74 + printf("%s: chdir dirfile succeeded!\n", s); + 33d2: 85ca mv a1,s2 + 33d4: 00004517 auipc a0,0x4 + 33d8: 86c50513 addi a0,a0,-1940 # 6c40 + 33dc: 5c1010ef jal 519c + exit(1); + 33e0: 4505 li a0,1 + 33e2: 193010ef jal 4d74 + printf("%s: create dirfile/xx succeeded!\n", s); + 33e6: 85ca mv a1,s2 + 33e8: 00004517 auipc a0,0x4 + 33ec: 88850513 addi a0,a0,-1912 # 6c70 + 33f0: 5ad010ef jal 519c + exit(1); + 33f4: 4505 li a0,1 + 33f6: 17f010ef jal 4d74 + printf("%s: create dirfile/xx succeeded!\n", s); + 33fa: 85ca mv a1,s2 + 33fc: 00004517 auipc a0,0x4 + 3400: 87450513 addi a0,a0,-1932 # 6c70 + 3404: 599010ef jal 519c + exit(1); + 3408: 4505 li a0,1 + 340a: 16b010ef jal 4d74 + printf("%s: mkdir dirfile/xx succeeded!\n", s); + 340e: 85ca mv a1,s2 + 3410: 00004517 auipc a0,0x4 + 3414: 88850513 addi a0,a0,-1912 # 6c98 + 3418: 585010ef jal 519c + exit(1); + 341c: 4505 li a0,1 + 341e: 157010ef jal 4d74 + printf("%s: unlink dirfile/xx succeeded!\n", s); + 3422: 85ca mv a1,s2 + 3424: 00004517 auipc a0,0x4 + 3428: 89c50513 addi a0,a0,-1892 # 6cc0 + 342c: 571010ef jal 519c + exit(1); + 3430: 4505 li a0,1 + 3432: 143010ef jal 4d74 + printf("%s: link to dirfile/xx succeeded!\n", s); + 3436: 85ca mv a1,s2 + 3438: 00004517 auipc a0,0x4 + 343c: 8b050513 addi a0,a0,-1872 # 6ce8 + 3440: 55d010ef jal 519c + exit(1); + 3444: 4505 li a0,1 + 3446: 12f010ef jal 4d74 + printf("%s: unlink dirfile failed!\n", s); + 344a: 85ca mv a1,s2 + 344c: 00004517 auipc a0,0x4 + 3450: 8c450513 addi a0,a0,-1852 # 6d10 + 3454: 549010ef jal 519c + exit(1); + 3458: 4505 li a0,1 + 345a: 11b010ef jal 4d74 + printf("%s: open . for writing succeeded!\n", s); + 345e: 85ca mv a1,s2 + 3460: 00004517 auipc a0,0x4 + 3464: 8d050513 addi a0,a0,-1840 # 6d30 + 3468: 535010ef jal 519c + exit(1); + 346c: 4505 li a0,1 + 346e: 107010ef jal 4d74 + printf("%s: write . succeeded!\n", s); + 3472: 85ca mv a1,s2 + 3474: 00004517 auipc a0,0x4 + 3478: 8e450513 addi a0,a0,-1820 # 6d58 + 347c: 521010ef jal 519c + exit(1); + 3480: 4505 li a0,1 + 3482: 0f3010ef jal 4d74 + +0000000000003486 : +{ + 3486: 7139 addi sp,sp,-64 + 3488: fc06 sd ra,56(sp) + 348a: f822 sd s0,48(sp) + 348c: f426 sd s1,40(sp) + 348e: f04a sd s2,32(sp) + 3490: ec4e sd s3,24(sp) + 3492: e852 sd s4,16(sp) + 3494: e456 sd s5,8(sp) + 3496: e05a sd s6,0(sp) + 3498: 0080 addi s0,sp,64 + 349a: 8b2a mv s6,a0 + 349c: 03300913 li s2,51 + if(mkdir("irefd") != 0){ + 34a0: 00004a17 auipc s4,0x4 + 34a4: 8d0a0a13 addi s4,s4,-1840 # 6d70 + mkdir(""); + 34a8: 00003497 auipc s1,0x3 + 34ac: 3d048493 addi s1,s1,976 # 6878 + link("README", ""); + 34b0: 00002a97 auipc s5,0x2 + 34b4: 0b0a8a93 addi s5,s5,176 # 5560 + fd = open("xx", O_CREATE); + 34b8: 00003997 auipc s3,0x3 + 34bc: 7b098993 addi s3,s3,1968 # 6c68 + 34c0: a835 j 34fc + printf("%s: mkdir irefd failed\n", s); + 34c2: 85da mv a1,s6 + 34c4: 00004517 auipc a0,0x4 + 34c8: 8b450513 addi a0,a0,-1868 # 6d78 + 34cc: 4d1010ef jal 519c + exit(1); + 34d0: 4505 li a0,1 + 34d2: 0a3010ef jal 4d74 + printf("%s: chdir irefd failed\n", s); + 34d6: 85da mv a1,s6 + 34d8: 00004517 auipc a0,0x4 + 34dc: 8b850513 addi a0,a0,-1864 # 6d90 + 34e0: 4bd010ef jal 519c + exit(1); + 34e4: 4505 li a0,1 + 34e6: 08f010ef jal 4d74 + close(fd); + 34ea: 0b3010ef jal 4d9c + 34ee: a82d j 3528 + unlink("xx"); + 34f0: 854e mv a0,s3 + 34f2: 0d3010ef jal 4dc4 + for(i = 0; i < NINODE + 1; i++){ + 34f6: 397d addiw s2,s2,-1 + 34f8: 04090263 beqz s2,353c + if(mkdir("irefd") != 0){ + 34fc: 8552 mv a0,s4 + 34fe: 0df010ef jal 4ddc + 3502: f161 bnez a0,34c2 + if(chdir("irefd") != 0){ + 3504: 8552 mv a0,s4 + 3506: 0df010ef jal 4de4 + 350a: f571 bnez a0,34d6 + mkdir(""); + 350c: 8526 mv a0,s1 + 350e: 0cf010ef jal 4ddc + link("README", ""); + 3512: 85a6 mv a1,s1 + 3514: 8556 mv a0,s5 + 3516: 0bf010ef jal 4dd4 + fd = open("", O_CREATE); + 351a: 20000593 li a1,512 + 351e: 8526 mv a0,s1 + 3520: 095010ef jal 4db4 + if(fd >= 0) + 3524: fc0553e3 bgez a0,34ea + fd = open("xx", O_CREATE); + 3528: 20000593 li a1,512 + 352c: 854e mv a0,s3 + 352e: 087010ef jal 4db4 + if(fd >= 0) + 3532: fa054fe3 bltz a0,34f0 + close(fd); + 3536: 067010ef jal 4d9c + 353a: bf5d j 34f0 + 353c: 03300493 li s1,51 + chdir(".."); + 3540: 00003997 auipc s3,0x3 + 3544: 05098993 addi s3,s3,80 # 6590 + unlink("irefd"); + 3548: 00004917 auipc s2,0x4 + 354c: 82890913 addi s2,s2,-2008 # 6d70 + chdir(".."); + 3550: 854e mv a0,s3 + 3552: 093010ef jal 4de4 + unlink("irefd"); + 3556: 854a mv a0,s2 + 3558: 06d010ef jal 4dc4 + for(i = 0; i < NINODE + 1; i++){ + 355c: 34fd addiw s1,s1,-1 + 355e: f8ed bnez s1,3550 + chdir("/"); + 3560: 00003517 auipc a0,0x3 + 3564: fd850513 addi a0,a0,-40 # 6538 + 3568: 07d010ef jal 4de4 +} + 356c: 70e2 ld ra,56(sp) + 356e: 7442 ld s0,48(sp) + 3570: 74a2 ld s1,40(sp) + 3572: 7902 ld s2,32(sp) + 3574: 69e2 ld s3,24(sp) + 3576: 6a42 ld s4,16(sp) + 3578: 6aa2 ld s5,8(sp) + 357a: 6b02 ld s6,0(sp) + 357c: 6121 addi sp,sp,64 + 357e: 8082 ret + +0000000000003580 : +{ + 3580: 7179 addi sp,sp,-48 + 3582: f406 sd ra,40(sp) + 3584: f022 sd s0,32(sp) + 3586: ec26 sd s1,24(sp) + 3588: 1800 addi s0,sp,48 + 358a: 84aa mv s1,a0 + if(mkdir("oidir") < 0){ + 358c: 00004517 auipc a0,0x4 + 3590: 81c50513 addi a0,a0,-2020 # 6da8 + 3594: 049010ef jal 4ddc + 3598: 02054a63 bltz a0,35cc + pid = fork(); + 359c: 7d0010ef jal 4d6c + if(pid < 0){ + 35a0: 04054063 bltz a0,35e0 + if(pid == 0){ + 35a4: e939 bnez a0,35fa + int fd = open("oidir", O_RDWR); + 35a6: 4589 li a1,2 + 35a8: 00004517 auipc a0,0x4 + 35ac: 80050513 addi a0,a0,-2048 # 6da8 + 35b0: 005010ef jal 4db4 + if(fd >= 0){ + 35b4: 04054063 bltz a0,35f4 + printf("%s: open directory for write succeeded\n", s); + 35b8: 85a6 mv a1,s1 + 35ba: 00004517 auipc a0,0x4 + 35be: 80e50513 addi a0,a0,-2034 # 6dc8 + 35c2: 3db010ef jal 519c + exit(1); + 35c6: 4505 li a0,1 + 35c8: 7ac010ef jal 4d74 + printf("%s: mkdir oidir failed\n", s); + 35cc: 85a6 mv a1,s1 + 35ce: 00003517 auipc a0,0x3 + 35d2: 7e250513 addi a0,a0,2018 # 6db0 + 35d6: 3c7010ef jal 519c + exit(1); + 35da: 4505 li a0,1 + 35dc: 798010ef jal 4d74 + printf("%s: fork failed\n", s); + 35e0: 85a6 mv a1,s1 + 35e2: 00002517 auipc a0,0x2 + 35e6: 63650513 addi a0,a0,1590 # 5c18 + 35ea: 3b3010ef jal 519c + exit(1); + 35ee: 4505 li a0,1 + 35f0: 784010ef jal 4d74 + exit(0); + 35f4: 4501 li a0,0 + 35f6: 77e010ef jal 4d74 + pause(1); + 35fa: 4505 li a0,1 + 35fc: 009010ef jal 4e04 + if(unlink("oidir") != 0){ + 3600: 00003517 auipc a0,0x3 + 3604: 7a850513 addi a0,a0,1960 # 6da8 + 3608: 7bc010ef jal 4dc4 + 360c: c919 beqz a0,3622 + printf("%s: unlink failed\n", s); + 360e: 85a6 mv a1,s1 + 3610: 00002517 auipc a0,0x2 + 3614: 7f850513 addi a0,a0,2040 # 5e08 + 3618: 385010ef jal 519c + exit(1); + 361c: 4505 li a0,1 + 361e: 756010ef jal 4d74 + wait(&xstatus); + 3622: fdc40513 addi a0,s0,-36 + 3626: 756010ef jal 4d7c + exit(xstatus); + 362a: fdc42503 lw a0,-36(s0) + 362e: 746010ef jal 4d74 + +0000000000003632 : +{ + 3632: 1101 addi sp,sp,-32 + 3634: ec06 sd ra,24(sp) + 3636: e822 sd s0,16(sp) + 3638: e426 sd s1,8(sp) + 363a: 1000 addi s0,sp,32 + 363c: 84aa mv s1,a0 + unlink("stopforking"); + 363e: 00003517 auipc a0,0x3 + 3642: 7b250513 addi a0,a0,1970 # 6df0 + 3646: 77e010ef jal 4dc4 + int pid = fork(); + 364a: 722010ef jal 4d6c + if(pid < 0){ + 364e: 02054b63 bltz a0,3684 + if(pid == 0){ + 3652: c139 beqz a0,3698 + pause(20); // two seconds + 3654: 4551 li a0,20 + 3656: 7ae010ef jal 4e04 + close(open("stopforking", O_CREATE|O_RDWR)); + 365a: 20200593 li a1,514 + 365e: 00003517 auipc a0,0x3 + 3662: 79250513 addi a0,a0,1938 # 6df0 + 3666: 74e010ef jal 4db4 + 366a: 732010ef jal 4d9c + wait(0); + 366e: 4501 li a0,0 + 3670: 70c010ef jal 4d7c + pause(10); // one second + 3674: 4529 li a0,10 + 3676: 78e010ef jal 4e04 +} + 367a: 60e2 ld ra,24(sp) + 367c: 6442 ld s0,16(sp) + 367e: 64a2 ld s1,8(sp) + 3680: 6105 addi sp,sp,32 + 3682: 8082 ret + printf("%s: fork failed", s); + 3684: 85a6 mv a1,s1 + 3686: 00002517 auipc a0,0x2 + 368a: 75250513 addi a0,a0,1874 # 5dd8 + 368e: 30f010ef jal 519c + exit(1); + 3692: 4505 li a0,1 + 3694: 6e0010ef jal 4d74 + int fd = open("stopforking", 0); + 3698: 00003497 auipc s1,0x3 + 369c: 75848493 addi s1,s1,1880 # 6df0 + 36a0: 4581 li a1,0 + 36a2: 8526 mv a0,s1 + 36a4: 710010ef jal 4db4 + if(fd >= 0){ + 36a8: 02055163 bgez a0,36ca + if(fork() < 0){ + 36ac: 6c0010ef jal 4d6c + 36b0: fe0558e3 bgez a0,36a0 + close(open("stopforking", O_CREATE|O_RDWR)); + 36b4: 20200593 li a1,514 + 36b8: 00003517 auipc a0,0x3 + 36bc: 73850513 addi a0,a0,1848 # 6df0 + 36c0: 6f4010ef jal 4db4 + 36c4: 6d8010ef jal 4d9c + 36c8: bfe1 j 36a0 + exit(0); + 36ca: 4501 li a0,0 + 36cc: 6a8010ef jal 4d74 + +00000000000036d0 : +{ + 36d0: 7139 addi sp,sp,-64 + 36d2: fc06 sd ra,56(sp) + 36d4: f822 sd s0,48(sp) + 36d6: f426 sd s1,40(sp) + 36d8: f04a sd s2,32(sp) + 36da: ec4e sd s3,24(sp) + 36dc: e852 sd s4,16(sp) + 36de: 0080 addi s0,sp,64 + 36e0: 8a2a mv s4,a0 + 36e2: 06400913 li s2,100 + if(xst != -1) { + 36e6: 59fd li s3,-1 + int pid1 = fork(); + 36e8: 684010ef jal 4d6c + 36ec: 84aa mv s1,a0 + if(pid1 < 0){ + 36ee: 02054763 bltz a0,371c + if(pid1 == 0){ + 36f2: cd1d beqz a0,3730 + pause(1); + 36f4: 4505 li a0,1 + 36f6: 70e010ef jal 4e04 + kill(pid1); + 36fa: 8526 mv a0,s1 + 36fc: 6a8010ef jal 4da4 + wait(&xst); + 3700: fcc40513 addi a0,s0,-52 + 3704: 678010ef jal 4d7c + if(xst != -1) { + 3708: fcc42783 lw a5,-52(s0) + 370c: 03379563 bne a5,s3,3736 + for(int i = 0; i < 100; i++){ + 3710: 397d addiw s2,s2,-1 + 3712: fc091be3 bnez s2,36e8 + exit(0); + 3716: 4501 li a0,0 + 3718: 65c010ef jal 4d74 + printf("%s: fork failed\n", s); + 371c: 85d2 mv a1,s4 + 371e: 00002517 auipc a0,0x2 + 3722: 4fa50513 addi a0,a0,1274 # 5c18 + 3726: 277010ef jal 519c + exit(1); + 372a: 4505 li a0,1 + 372c: 648010ef jal 4d74 + getpid(); + 3730: 6c4010ef jal 4df4 + while(1) { + 3734: bff5 j 3730 + printf("%s: status should be -1\n", s); + 3736: 85d2 mv a1,s4 + 3738: 00003517 auipc a0,0x3 + 373c: 6c850513 addi a0,a0,1736 # 6e00 + 3740: 25d010ef jal 519c + exit(1); + 3744: 4505 li a0,1 + 3746: 62e010ef jal 4d74 + +000000000000374a : +{ + 374a: 7139 addi sp,sp,-64 + 374c: fc06 sd ra,56(sp) + 374e: f822 sd s0,48(sp) + 3750: f426 sd s1,40(sp) + 3752: f04a sd s2,32(sp) + 3754: ec4e sd s3,24(sp) + 3756: e852 sd s4,16(sp) + 3758: 0080 addi s0,sp,64 + 375a: 892a mv s2,a0 + pid1 = fork(); + 375c: 610010ef jal 4d6c + if(pid1 < 0) { + 3760: 00054563 bltz a0,376a + 3764: 84aa mv s1,a0 + if(pid1 == 0) + 3766: ed01 bnez a0,377e + for(;;) + 3768: a001 j 3768 + printf("%s: fork failed", s); + 376a: 85ca mv a1,s2 + 376c: 00002517 auipc a0,0x2 + 3770: 66c50513 addi a0,a0,1644 # 5dd8 + 3774: 229010ef jal 519c + exit(1); + 3778: 4505 li a0,1 + 377a: 5fa010ef jal 4d74 + pid2 = fork(); + 377e: 5ee010ef jal 4d6c + 3782: 89aa mv s3,a0 + if(pid2 < 0) { + 3784: 00054463 bltz a0,378c + if(pid2 == 0) + 3788: ed01 bnez a0,37a0 + for(;;) + 378a: a001 j 378a + printf("%s: fork failed\n", s); + 378c: 85ca mv a1,s2 + 378e: 00002517 auipc a0,0x2 + 3792: 48a50513 addi a0,a0,1162 # 5c18 + 3796: 207010ef jal 519c + exit(1); + 379a: 4505 li a0,1 + 379c: 5d8010ef jal 4d74 + pipe(pfds); + 37a0: fc840513 addi a0,s0,-56 + 37a4: 5e0010ef jal 4d84 + pid3 = fork(); + 37a8: 5c4010ef jal 4d6c + 37ac: 8a2a mv s4,a0 + if(pid3 < 0) { + 37ae: 02054863 bltz a0,37de + if(pid3 == 0){ + 37b2: e921 bnez a0,3802 + close(pfds[0]); + 37b4: fc842503 lw a0,-56(s0) + 37b8: 5e4010ef jal 4d9c + if(write(pfds[1], "x", 1) != 1) + 37bc: 4605 li a2,1 + 37be: 00002597 auipc a1,0x2 + 37c2: c3a58593 addi a1,a1,-966 # 53f8 + 37c6: fcc42503 lw a0,-52(s0) + 37ca: 5ca010ef jal 4d94 + 37ce: 4785 li a5,1 + 37d0: 02f51163 bne a0,a5,37f2 + close(pfds[1]); + 37d4: fcc42503 lw a0,-52(s0) + 37d8: 5c4010ef jal 4d9c + for(;;) + 37dc: a001 j 37dc + printf("%s: fork failed\n", s); + 37de: 85ca mv a1,s2 + 37e0: 00002517 auipc a0,0x2 + 37e4: 43850513 addi a0,a0,1080 # 5c18 + 37e8: 1b5010ef jal 519c + exit(1); + 37ec: 4505 li a0,1 + 37ee: 586010ef jal 4d74 + printf("%s: preempt write error", s); + 37f2: 85ca mv a1,s2 + 37f4: 00003517 auipc a0,0x3 + 37f8: 62c50513 addi a0,a0,1580 # 6e20 + 37fc: 1a1010ef jal 519c + 3800: bfd1 j 37d4 + close(pfds[1]); + 3802: fcc42503 lw a0,-52(s0) + 3806: 596010ef jal 4d9c + if(read(pfds[0], buf, sizeof(buf)) != 1){ + 380a: 660d lui a2,0x3 + 380c: 00009597 auipc a1,0x9 + 3810: 4ac58593 addi a1,a1,1196 # ccb8 + 3814: fc842503 lw a0,-56(s0) + 3818: 574010ef jal 4d8c + 381c: 4785 li a5,1 + 381e: 02f50163 beq a0,a5,3840 + printf("%s: preempt read error", s); + 3822: 85ca mv a1,s2 + 3824: 00003517 auipc a0,0x3 + 3828: 61450513 addi a0,a0,1556 # 6e38 + 382c: 171010ef jal 519c +} + 3830: 70e2 ld ra,56(sp) + 3832: 7442 ld s0,48(sp) + 3834: 74a2 ld s1,40(sp) + 3836: 7902 ld s2,32(sp) + 3838: 69e2 ld s3,24(sp) + 383a: 6a42 ld s4,16(sp) + 383c: 6121 addi sp,sp,64 + 383e: 8082 ret + close(pfds[0]); + 3840: fc842503 lw a0,-56(s0) + 3844: 558010ef jal 4d9c + printf("kill... "); + 3848: 00003517 auipc a0,0x3 + 384c: 60850513 addi a0,a0,1544 # 6e50 + 3850: 14d010ef jal 519c + kill(pid1); + 3854: 8526 mv a0,s1 + 3856: 54e010ef jal 4da4 + kill(pid2); + 385a: 854e mv a0,s3 + 385c: 548010ef jal 4da4 + kill(pid3); + 3860: 8552 mv a0,s4 + 3862: 542010ef jal 4da4 + printf("wait... "); + 3866: 00003517 auipc a0,0x3 + 386a: 5fa50513 addi a0,a0,1530 # 6e60 + 386e: 12f010ef jal 519c + wait(0); + 3872: 4501 li a0,0 + 3874: 508010ef jal 4d7c + wait(0); + 3878: 4501 li a0,0 + 387a: 502010ef jal 4d7c + wait(0); + 387e: 4501 li a0,0 + 3880: 4fc010ef jal 4d7c + 3884: b775 j 3830 + +0000000000003886 : +{ + 3886: 7179 addi sp,sp,-48 + 3888: f406 sd ra,40(sp) + 388a: f022 sd s0,32(sp) + 388c: ec26 sd s1,24(sp) + 388e: e84a sd s2,16(sp) + 3890: e44e sd s3,8(sp) + 3892: e052 sd s4,0(sp) + 3894: 1800 addi s0,sp,48 + 3896: 89aa mv s3,a0 + int master_pid = getpid(); + 3898: 55c010ef jal 4df4 + 389c: 8a2a mv s4,a0 + 389e: 0c800913 li s2,200 + int pid = fork(); + 38a2: 4ca010ef jal 4d6c + 38a6: 84aa mv s1,a0 + if(pid < 0){ + 38a8: 00054e63 bltz a0,38c4 + if(pid){ + 38ac: c121 beqz a0,38ec + if(wait(0) != pid){ + 38ae: 4501 li a0,0 + 38b0: 4cc010ef jal 4d7c + 38b4: 02951263 bne a0,s1,38d8 + for(int i = 0; i < 200; i++){ + 38b8: 397d addiw s2,s2,-1 + 38ba: fe0914e3 bnez s2,38a2 + exit(0); + 38be: 4501 li a0,0 + 38c0: 4b4010ef jal 4d74 + printf("%s: fork failed\n", s); + 38c4: 85ce mv a1,s3 + 38c6: 00002517 auipc a0,0x2 + 38ca: 35250513 addi a0,a0,850 # 5c18 + 38ce: 0cf010ef jal 519c + exit(1); + 38d2: 4505 li a0,1 + 38d4: 4a0010ef jal 4d74 + printf("%s: wait wrong pid\n", s); + 38d8: 85ce mv a1,s3 + 38da: 00002517 auipc a0,0x2 + 38de: 4c650513 addi a0,a0,1222 # 5da0 + 38e2: 0bb010ef jal 519c + exit(1); + 38e6: 4505 li a0,1 + 38e8: 48c010ef jal 4d74 + int pid2 = fork(); + 38ec: 480010ef jal 4d6c + if(pid2 < 0){ + 38f0: 00054563 bltz a0,38fa + exit(0); + 38f4: 4501 li a0,0 + 38f6: 47e010ef jal 4d74 + kill(master_pid); + 38fa: 8552 mv a0,s4 + 38fc: 4a8010ef jal 4da4 + exit(1); + 3900: 4505 li a0,1 + 3902: 472010ef jal 4d74 + +0000000000003906 : +{ + 3906: 7175 addi sp,sp,-144 + 3908: e506 sd ra,136(sp) + 390a: e122 sd s0,128(sp) + 390c: fca6 sd s1,120(sp) + 390e: f8ca sd s2,112(sp) + 3910: f4ce sd s3,104(sp) + 3912: f0d2 sd s4,96(sp) + 3914: ecd6 sd s5,88(sp) + 3916: e8da sd s6,80(sp) + 3918: e4de sd s7,72(sp) + 391a: 0900 addi s0,sp,144 + 391c: 8b2a mv s6,a0 + if(pipe(fds) != 0){ + 391e: fa040513 addi a0,s0,-96 + 3922: 462010ef jal 4d84 + 3926: e919 bnez a0,393c + 3928: 8aaa mv s5,a0 + 392a: f7040493 addi s1,s0,-144 + 392e: f9840993 addi s3,s0,-104 + 3932: 8926 mv s2,s1 + if(pids[i] != -1) { + 3934: 5a7d li s4,-1 + if(scratch == '0') + 3936: 03000b93 li s7,48 + 393a: a08d j 399c + printf("%s: pipe() failed\n", s); + 393c: 85da mv a1,s6 + 393e: 00002517 auipc a0,0x2 + 3942: 3e250513 addi a0,a0,994 # 5d20 + 3946: 057010ef jal 519c + exit(1); + 394a: 4505 li a0,1 + 394c: 428010ef jal 4d74 + if (sbrk(BIG - (uint64)sbrk(0)) == (char*)SBRK_ERROR) + 3950: 3f0010ef jal 4d40 + 3954: 064007b7 lui a5,0x6400 + 3958: 40a7853b subw a0,a5,a0 + 395c: 3e4010ef jal 4d40 + 3960: 57fd li a5,-1 + 3962: 02f50063 beq a0,a5,3982 + write(fds[1], "1", 1); + 3966: 4605 li a2,1 + 3968: 00004597 auipc a1,0x4 + 396c: c8058593 addi a1,a1,-896 # 75e8 + 3970: fa442503 lw a0,-92(s0) + 3974: 420010ef jal 4d94 + for(;;) pause(1000); + 3978: 3e800513 li a0,1000 + 397c: 488010ef jal 4e04 + 3980: bfe5 j 3978 + write(fds[1], "0", 1); + 3982: 4605 li a2,1 + 3984: 00003597 auipc a1,0x3 + 3988: 4ec58593 addi a1,a1,1260 # 6e70 + 398c: fa442503 lw a0,-92(s0) + 3990: 404010ef jal 4d94 + 3994: b7d5 j 3978 + for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ + 3996: 0911 addi s2,s2,4 + 3998: 03390663 beq s2,s3,39c4 + if((pids[i] = fork()) == 0){ + 399c: 3d0010ef jal 4d6c + 39a0: 00a92023 sw a0,0(s2) + 39a4: d555 beqz a0,3950 + if(pids[i] != -1) { + 39a6: ff4508e3 beq a0,s4,3996 + read(fds[0], &scratch, 1); + 39aa: 4605 li a2,1 + 39ac: f9f40593 addi a1,s0,-97 + 39b0: fa042503 lw a0,-96(s0) + 39b4: 3d8010ef jal 4d8c + if(scratch == '0') + 39b8: f9f44783 lbu a5,-97(s0) + 39bc: fd779de3 bne a5,s7,3996 + failed = 1; + 39c0: 4a85 li s5,1 + 39c2: bfd1 j 3996 + if(!failed) { + 39c4: 000a8863 beqz s5,39d4 + c = sbrk(PGSIZE); + 39c8: 6505 lui a0,0x1 + 39ca: 376010ef jal 4d40 + 39ce: 8a2a mv s4,a0 + if(pids[i] == -1) + 39d0: 597d li s2,-1 + 39d2: a821 j 39ea + printf("%s: no allocation failed; allocate more?\n", s); + 39d4: 85da mv a1,s6 + 39d6: 00003517 auipc a0,0x3 + 39da: 4a250513 addi a0,a0,1186 # 6e78 + 39de: 7be010ef jal 519c + 39e2: b7dd j 39c8 + for(i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){ + 39e4: 0491 addi s1,s1,4 + 39e6: 01348b63 beq s1,s3,39fc + if(pids[i] == -1) + 39ea: 4088 lw a0,0(s1) + 39ec: ff250ce3 beq a0,s2,39e4 + kill(pids[i]); + 39f0: 3b4010ef jal 4da4 + wait(0); + 39f4: 4501 li a0,0 + 39f6: 386010ef jal 4d7c + 39fa: b7ed j 39e4 + if(c == (char*)SBRK_ERROR){ + 39fc: 57fd li a5,-1 + 39fe: 02fa0a63 beq s4,a5,3a32 + pid = fork(); + 3a02: 36a010ef jal 4d6c + if(pid < 0){ + 3a06: 04054063 bltz a0,3a46 + if(pid == 0){ + 3a0a: e939 bnez a0,3a60 + a = sbrk(10*BIG); + 3a0c: 3e800537 lui a0,0x3e800 + 3a10: 330010ef jal 4d40 + if(a == (char*)SBRK_ERROR){ + 3a14: 57fd li a5,-1 + 3a16: 04f50263 beq a0,a5,3a5a + printf("%s: allocate a lot of memory succeeded %d\n", s, 10*BIG); + 3a1a: 3e800637 lui a2,0x3e800 + 3a1e: 85da mv a1,s6 + 3a20: 00003517 auipc a0,0x3 + 3a24: 4a850513 addi a0,a0,1192 # 6ec8 + 3a28: 774010ef jal 519c + exit(1); + 3a2c: 4505 li a0,1 + 3a2e: 346010ef jal 4d74 + printf("%s: failed sbrk leaked memory\n", s); + 3a32: 85da mv a1,s6 + 3a34: 00003517 auipc a0,0x3 + 3a38: 47450513 addi a0,a0,1140 # 6ea8 + 3a3c: 760010ef jal 519c + exit(1); + 3a40: 4505 li a0,1 + 3a42: 332010ef jal 4d74 + printf("%s: fork failed\n", s); + 3a46: 85da mv a1,s6 + 3a48: 00002517 auipc a0,0x2 + 3a4c: 1d050513 addi a0,a0,464 # 5c18 + 3a50: 74c010ef jal 519c + exit(1); + 3a54: 4505 li a0,1 + 3a56: 31e010ef jal 4d74 + exit(0); + 3a5a: 4501 li a0,0 + 3a5c: 318010ef jal 4d74 + wait(&xstatus); + 3a60: fac40513 addi a0,s0,-84 + 3a64: 318010ef jal 4d7c + if(xstatus != 0) + 3a68: fac42783 lw a5,-84(s0) + 3a6c: ef81 bnez a5,3a84 +} + 3a6e: 60aa ld ra,136(sp) + 3a70: 640a ld s0,128(sp) + 3a72: 74e6 ld s1,120(sp) + 3a74: 7946 ld s2,112(sp) + 3a76: 79a6 ld s3,104(sp) + 3a78: 7a06 ld s4,96(sp) + 3a7a: 6ae6 ld s5,88(sp) + 3a7c: 6b46 ld s6,80(sp) + 3a7e: 6ba6 ld s7,72(sp) + 3a80: 6149 addi sp,sp,144 + 3a82: 8082 ret + exit(1); + 3a84: 4505 li a0,1 + 3a86: 2ee010ef jal 4d74 + +0000000000003a8a : +{ + 3a8a: 7139 addi sp,sp,-64 + 3a8c: fc06 sd ra,56(sp) + 3a8e: f822 sd s0,48(sp) + 3a90: f426 sd s1,40(sp) + 3a92: f04a sd s2,32(sp) + 3a94: ec4e sd s3,24(sp) + 3a96: 0080 addi s0,sp,64 + 3a98: 89aa mv s3,a0 + if((pid = fork()) == 0){ + 3a9a: 2d2010ef jal 4d6c + m1 = 0; + 3a9e: 4481 li s1,0 + while((m2 = malloc(10001)) != 0){ + 3aa0: 6909 lui s2,0x2 + 3aa2: 71190913 addi s2,s2,1809 # 2711 + if((pid = fork()) == 0){ + 3aa6: cd11 beqz a0,3ac2 + wait(&xstatus); + 3aa8: fcc40513 addi a0,s0,-52 + 3aac: 2d0010ef jal 4d7c + if(xstatus == -1){ + 3ab0: fcc42503 lw a0,-52(s0) + 3ab4: 57fd li a5,-1 + 3ab6: 04f50363 beq a0,a5,3afc + exit(xstatus); + 3aba: 2ba010ef jal 4d74 + *(char**)m2 = m1; + 3abe: e104 sd s1,0(a0) + m1 = m2; + 3ac0: 84aa mv s1,a0 + while((m2 = malloc(10001)) != 0){ + 3ac2: 854a mv a0,s2 + 3ac4: 78c010ef jal 5250 + 3ac8: f97d bnez a0,3abe + while(m1){ + 3aca: c491 beqz s1,3ad6 + m2 = *(char**)m1; + 3acc: 8526 mv a0,s1 + 3ace: 6084 ld s1,0(s1) + free(m1); + 3ad0: 6fe010ef jal 51ce + while(m1){ + 3ad4: fce5 bnez s1,3acc + m1 = malloc(1024*20); + 3ad6: 6515 lui a0,0x5 + 3ad8: 778010ef jal 5250 + if(m1 == 0){ + 3adc: c511 beqz a0,3ae8 + free(m1); + 3ade: 6f0010ef jal 51ce + exit(0); + 3ae2: 4501 li a0,0 + 3ae4: 290010ef jal 4d74 + printf("%s: couldn't allocate mem?!!\n", s); + 3ae8: 85ce mv a1,s3 + 3aea: 00003517 auipc a0,0x3 + 3aee: 40e50513 addi a0,a0,1038 # 6ef8 + 3af2: 6aa010ef jal 519c + exit(1); + 3af6: 4505 li a0,1 + 3af8: 27c010ef jal 4d74 + exit(0); + 3afc: 4501 li a0,0 + 3afe: 276010ef jal 4d74 + +0000000000003b02 : +{ + 3b02: 7159 addi sp,sp,-112 + 3b04: f486 sd ra,104(sp) + 3b06: f0a2 sd s0,96(sp) + 3b08: e0d2 sd s4,64(sp) + 3b0a: 1880 addi s0,sp,112 + 3b0c: 8a2a mv s4,a0 + unlink("sharedfd"); + 3b0e: 00003517 auipc a0,0x3 + 3b12: 40a50513 addi a0,a0,1034 # 6f18 + 3b16: 2ae010ef jal 4dc4 + fd = open("sharedfd", O_CREATE|O_RDWR); + 3b1a: 20200593 li a1,514 + 3b1e: 00003517 auipc a0,0x3 + 3b22: 3fa50513 addi a0,a0,1018 # 6f18 + 3b26: 28e010ef jal 4db4 + if(fd < 0){ + 3b2a: 04054863 bltz a0,3b7a + 3b2e: eca6 sd s1,88(sp) + 3b30: e8ca sd s2,80(sp) + 3b32: e4ce sd s3,72(sp) + 3b34: fc56 sd s5,56(sp) + 3b36: f85a sd s6,48(sp) + 3b38: f45e sd s7,40(sp) + 3b3a: 892a mv s2,a0 + pid = fork(); + 3b3c: 230010ef jal 4d6c + 3b40: 89aa mv s3,a0 + memset(buf, pid==0?'c':'p', sizeof(buf)); + 3b42: 07000593 li a1,112 + 3b46: e119 bnez a0,3b4c + 3b48: 06300593 li a1,99 + 3b4c: 4629 li a2,10 + 3b4e: fa040513 addi a0,s0,-96 + 3b52: 010010ef jal 4b62 + 3b56: 3e800493 li s1,1000 + if(write(fd, buf, sizeof(buf)) != sizeof(buf)){ + 3b5a: 4629 li a2,10 + 3b5c: fa040593 addi a1,s0,-96 + 3b60: 854a mv a0,s2 + 3b62: 232010ef jal 4d94 + 3b66: 47a9 li a5,10 + 3b68: 02f51963 bne a0,a5,3b9a + for(i = 0; i < N; i++){ + 3b6c: 34fd addiw s1,s1,-1 + 3b6e: f4f5 bnez s1,3b5a + if(pid == 0) { + 3b70: 02099f63 bnez s3,3bae + exit(0); + 3b74: 4501 li a0,0 + 3b76: 1fe010ef jal 4d74 + 3b7a: eca6 sd s1,88(sp) + 3b7c: e8ca sd s2,80(sp) + 3b7e: e4ce sd s3,72(sp) + 3b80: fc56 sd s5,56(sp) + 3b82: f85a sd s6,48(sp) + 3b84: f45e sd s7,40(sp) + printf("%s: cannot open sharedfd for writing", s); + 3b86: 85d2 mv a1,s4 + 3b88: 00003517 auipc a0,0x3 + 3b8c: 3a050513 addi a0,a0,928 # 6f28 + 3b90: 60c010ef jal 519c + exit(1); + 3b94: 4505 li a0,1 + 3b96: 1de010ef jal 4d74 + printf("%s: write sharedfd failed\n", s); + 3b9a: 85d2 mv a1,s4 + 3b9c: 00003517 auipc a0,0x3 + 3ba0: 3b450513 addi a0,a0,948 # 6f50 + 3ba4: 5f8010ef jal 519c + exit(1); + 3ba8: 4505 li a0,1 + 3baa: 1ca010ef jal 4d74 + wait(&xstatus); + 3bae: f9c40513 addi a0,s0,-100 + 3bb2: 1ca010ef jal 4d7c + if(xstatus != 0) + 3bb6: f9c42983 lw s3,-100(s0) + 3bba: 00098563 beqz s3,3bc4 + exit(xstatus); + 3bbe: 854e mv a0,s3 + 3bc0: 1b4010ef jal 4d74 + close(fd); + 3bc4: 854a mv a0,s2 + 3bc6: 1d6010ef jal 4d9c + fd = open("sharedfd", 0); + 3bca: 4581 li a1,0 + 3bcc: 00003517 auipc a0,0x3 + 3bd0: 34c50513 addi a0,a0,844 # 6f18 + 3bd4: 1e0010ef jal 4db4 + 3bd8: 8baa mv s7,a0 + nc = np = 0; + 3bda: 8ace mv s5,s3 + if(fd < 0){ + 3bdc: 02054363 bltz a0,3c02 + 3be0: faa40913 addi s2,s0,-86 + if(buf[i] == 'c') + 3be4: 06300493 li s1,99 + if(buf[i] == 'p') + 3be8: 07000b13 li s6,112 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3bec: 4629 li a2,10 + 3bee: fa040593 addi a1,s0,-96 + 3bf2: 855e mv a0,s7 + 3bf4: 198010ef jal 4d8c + 3bf8: 02a05b63 blez a0,3c2e + 3bfc: fa040793 addi a5,s0,-96 + 3c00: a839 j 3c1e + printf("%s: cannot open sharedfd for reading\n", s); + 3c02: 85d2 mv a1,s4 + 3c04: 00003517 auipc a0,0x3 + 3c08: 36c50513 addi a0,a0,876 # 6f70 + 3c0c: 590010ef jal 519c + exit(1); + 3c10: 4505 li a0,1 + 3c12: 162010ef jal 4d74 + nc++; + 3c16: 2985 addiw s3,s3,1 + for(i = 0; i < sizeof(buf); i++){ + 3c18: 0785 addi a5,a5,1 # 6400001 + 3c1a: fd2789e3 beq a5,s2,3bec + if(buf[i] == 'c') + 3c1e: 0007c703 lbu a4,0(a5) + 3c22: fe970ae3 beq a4,s1,3c16 + if(buf[i] == 'p') + 3c26: ff6719e3 bne a4,s6,3c18 + np++; + 3c2a: 2a85 addiw s5,s5,1 + 3c2c: b7f5 j 3c18 + close(fd); + 3c2e: 855e mv a0,s7 + 3c30: 16c010ef jal 4d9c + unlink("sharedfd"); + 3c34: 00003517 auipc a0,0x3 + 3c38: 2e450513 addi a0,a0,740 # 6f18 + 3c3c: 188010ef jal 4dc4 + if(nc == N*SZ && np == N*SZ){ + 3c40: 6789 lui a5,0x2 + 3c42: 71078793 addi a5,a5,1808 # 2710 + 3c46: 00f99763 bne s3,a5,3c54 + 3c4a: 6789 lui a5,0x2 + 3c4c: 71078793 addi a5,a5,1808 # 2710 + 3c50: 00fa8c63 beq s5,a5,3c68 + printf("%s: nc/np test fails\n", s); + 3c54: 85d2 mv a1,s4 + 3c56: 00003517 auipc a0,0x3 + 3c5a: 34250513 addi a0,a0,834 # 6f98 + 3c5e: 53e010ef jal 519c + exit(1); + 3c62: 4505 li a0,1 + 3c64: 110010ef jal 4d74 + exit(0); + 3c68: 4501 li a0,0 + 3c6a: 10a010ef jal 4d74 + +0000000000003c6e : +{ + 3c6e: 7135 addi sp,sp,-160 + 3c70: ed06 sd ra,152(sp) + 3c72: e922 sd s0,144(sp) + 3c74: e526 sd s1,136(sp) + 3c76: e14a sd s2,128(sp) + 3c78: fcce sd s3,120(sp) + 3c7a: f8d2 sd s4,112(sp) + 3c7c: f4d6 sd s5,104(sp) + 3c7e: f0da sd s6,96(sp) + 3c80: ecde sd s7,88(sp) + 3c82: e8e2 sd s8,80(sp) + 3c84: e4e6 sd s9,72(sp) + 3c86: e0ea sd s10,64(sp) + 3c88: fc6e sd s11,56(sp) + 3c8a: 1100 addi s0,sp,160 + 3c8c: 8caa mv s9,a0 + char *names[] = { "f0", "f1", "f2", "f3" }; + 3c8e: 00003797 auipc a5,0x3 + 3c92: 32278793 addi a5,a5,802 # 6fb0 + 3c96: f6f43823 sd a5,-144(s0) + 3c9a: 00003797 auipc a5,0x3 + 3c9e: 31e78793 addi a5,a5,798 # 6fb8 + 3ca2: f6f43c23 sd a5,-136(s0) + 3ca6: 00003797 auipc a5,0x3 + 3caa: 31a78793 addi a5,a5,794 # 6fc0 + 3cae: f8f43023 sd a5,-128(s0) + 3cb2: 00003797 auipc a5,0x3 + 3cb6: 31678793 addi a5,a5,790 # 6fc8 + 3cba: f8f43423 sd a5,-120(s0) + for(pi = 0; pi < NCHILD; pi++){ + 3cbe: f7040b93 addi s7,s0,-144 + char *names[] = { "f0", "f1", "f2", "f3" }; + 3cc2: 895e mv s2,s7 + for(pi = 0; pi < NCHILD; pi++){ + 3cc4: 4481 li s1,0 + 3cc6: 4a11 li s4,4 + fname = names[pi]; + 3cc8: 00093983 ld s3,0(s2) + unlink(fname); + 3ccc: 854e mv a0,s3 + 3cce: 0f6010ef jal 4dc4 + pid = fork(); + 3cd2: 09a010ef jal 4d6c + if(pid < 0){ + 3cd6: 02054e63 bltz a0,3d12 + if(pid == 0){ + 3cda: c531 beqz a0,3d26 + for(pi = 0; pi < NCHILD; pi++){ + 3cdc: 2485 addiw s1,s1,1 + 3cde: 0921 addi s2,s2,8 + 3ce0: ff4494e3 bne s1,s4,3cc8 + 3ce4: 4491 li s1,4 + wait(&xstatus); + 3ce6: f6c40513 addi a0,s0,-148 + 3cea: 092010ef jal 4d7c + if(xstatus != 0) + 3cee: f6c42a83 lw s5,-148(s0) + 3cf2: 0a0a9463 bnez s5,3d9a + for(pi = 0; pi < NCHILD; pi++){ + 3cf6: 34fd addiw s1,s1,-1 + 3cf8: f4fd bnez s1,3ce6 + 3cfa: 03000b13 li s6,48 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3cfe: 00009a17 auipc s4,0x9 + 3d02: fbaa0a13 addi s4,s4,-70 # ccb8 + if(total != N*SZ){ + 3d06: 6d05 lui s10,0x1 + 3d08: 770d0d13 addi s10,s10,1904 # 1770 + for(i = 0; i < NCHILD; i++){ + 3d0c: 03400d93 li s11,52 + 3d10: a0ed j 3dfa + printf("%s: fork failed\n", s); + 3d12: 85e6 mv a1,s9 + 3d14: 00002517 auipc a0,0x2 + 3d18: f0450513 addi a0,a0,-252 # 5c18 + 3d1c: 480010ef jal 519c + exit(1); + 3d20: 4505 li a0,1 + 3d22: 052010ef jal 4d74 + fd = open(fname, O_CREATE | O_RDWR); + 3d26: 20200593 li a1,514 + 3d2a: 854e mv a0,s3 + 3d2c: 088010ef jal 4db4 + 3d30: 892a mv s2,a0 + if(fd < 0){ + 3d32: 04054163 bltz a0,3d74 + memset(buf, '0'+pi, SZ); + 3d36: 1f400613 li a2,500 + 3d3a: 0304859b addiw a1,s1,48 + 3d3e: 00009517 auipc a0,0x9 + 3d42: f7a50513 addi a0,a0,-134 # ccb8 + 3d46: 61d000ef jal 4b62 + 3d4a: 44b1 li s1,12 + if((n = write(fd, buf, SZ)) != SZ){ + 3d4c: 00009997 auipc s3,0x9 + 3d50: f6c98993 addi s3,s3,-148 # ccb8 + 3d54: 1f400613 li a2,500 + 3d58: 85ce mv a1,s3 + 3d5a: 854a mv a0,s2 + 3d5c: 038010ef jal 4d94 + 3d60: 85aa mv a1,a0 + 3d62: 1f400793 li a5,500 + 3d66: 02f51163 bne a0,a5,3d88 + for(i = 0; i < N; i++){ + 3d6a: 34fd addiw s1,s1,-1 + 3d6c: f4e5 bnez s1,3d54 + exit(0); + 3d6e: 4501 li a0,0 + 3d70: 004010ef jal 4d74 + printf("%s: create failed\n", s); + 3d74: 85e6 mv a1,s9 + 3d76: 00002517 auipc a0,0x2 + 3d7a: f3a50513 addi a0,a0,-198 # 5cb0 + 3d7e: 41e010ef jal 519c + exit(1); + 3d82: 4505 li a0,1 + 3d84: 7f1000ef jal 4d74 + printf("write failed %d\n", n); + 3d88: 00003517 auipc a0,0x3 + 3d8c: 24850513 addi a0,a0,584 # 6fd0 + 3d90: 40c010ef jal 519c + exit(1); + 3d94: 4505 li a0,1 + 3d96: 7df000ef jal 4d74 + exit(xstatus); + 3d9a: 8556 mv a0,s5 + 3d9c: 7d9000ef jal 4d74 + printf("%s: wrong char\n", s); + 3da0: 85e6 mv a1,s9 + 3da2: 00003517 auipc a0,0x3 + 3da6: 24650513 addi a0,a0,582 # 6fe8 + 3daa: 3f2010ef jal 519c + exit(1); + 3dae: 4505 li a0,1 + 3db0: 7c5000ef jal 4d74 + total += n; + 3db4: 00a9093b addw s2,s2,a0 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3db8: 660d lui a2,0x3 + 3dba: 85d2 mv a1,s4 + 3dbc: 854e mv a0,s3 + 3dbe: 7cf000ef jal 4d8c + 3dc2: 02a05063 blez a0,3de2 + 3dc6: 00009797 auipc a5,0x9 + 3dca: ef278793 addi a5,a5,-270 # ccb8 + 3dce: 00f506b3 add a3,a0,a5 + if(buf[j] != '0'+i){ + 3dd2: 0007c703 lbu a4,0(a5) + 3dd6: fc9715e3 bne a4,s1,3da0 + for(j = 0; j < n; j++){ + 3dda: 0785 addi a5,a5,1 + 3ddc: fed79be3 bne a5,a3,3dd2 + 3de0: bfd1 j 3db4 + close(fd); + 3de2: 854e mv a0,s3 + 3de4: 7b9000ef jal 4d9c + if(total != N*SZ){ + 3de8: 03a91463 bne s2,s10,3e10 + unlink(fname); + 3dec: 8562 mv a0,s8 + 3dee: 7d7000ef jal 4dc4 + for(i = 0; i < NCHILD; i++){ + 3df2: 0ba1 addi s7,s7,8 + 3df4: 2b05 addiw s6,s6,1 + 3df6: 03bb0763 beq s6,s11,3e24 + fname = names[i]; + 3dfa: 000bbc03 ld s8,0(s7) + fd = open(fname, 0); + 3dfe: 4581 li a1,0 + 3e00: 8562 mv a0,s8 + 3e02: 7b3000ef jal 4db4 + 3e06: 89aa mv s3,a0 + total = 0; + 3e08: 8956 mv s2,s5 + if(buf[j] != '0'+i){ + 3e0a: 000b049b sext.w s1,s6 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 3e0e: b76d j 3db8 + printf("wrong length %d\n", total); + 3e10: 85ca mv a1,s2 + 3e12: 00003517 auipc a0,0x3 + 3e16: 1e650513 addi a0,a0,486 # 6ff8 + 3e1a: 382010ef jal 519c + exit(1); + 3e1e: 4505 li a0,1 + 3e20: 755000ef jal 4d74 +} + 3e24: 60ea ld ra,152(sp) + 3e26: 644a ld s0,144(sp) + 3e28: 64aa ld s1,136(sp) + 3e2a: 690a ld s2,128(sp) + 3e2c: 79e6 ld s3,120(sp) + 3e2e: 7a46 ld s4,112(sp) + 3e30: 7aa6 ld s5,104(sp) + 3e32: 7b06 ld s6,96(sp) + 3e34: 6be6 ld s7,88(sp) + 3e36: 6c46 ld s8,80(sp) + 3e38: 6ca6 ld s9,72(sp) + 3e3a: 6d06 ld s10,64(sp) + 3e3c: 7de2 ld s11,56(sp) + 3e3e: 610d addi sp,sp,160 + 3e40: 8082 ret + +0000000000003e42 : +{ + 3e42: 7135 addi sp,sp,-160 + 3e44: ed06 sd ra,152(sp) + 3e46: e922 sd s0,144(sp) + 3e48: e526 sd s1,136(sp) + 3e4a: e14a sd s2,128(sp) + 3e4c: fcce sd s3,120(sp) + 3e4e: f8d2 sd s4,112(sp) + 3e50: f4d6 sd s5,104(sp) + 3e52: f0da sd s6,96(sp) + 3e54: ecde sd s7,88(sp) + 3e56: 1100 addi s0,sp,160 + 3e58: 89aa mv s3,a0 + file[0] = 'C'; + 3e5a: 04300793 li a5,67 + 3e5e: faf40423 sb a5,-88(s0) + file[2] = '\0'; + 3e62: fa040523 sb zero,-86(s0) + for(i = 0; i < N; i++){ + 3e66: 4901 li s2,0 + if(pid && (i % 3) == 1){ + 3e68: 4b0d li s6,3 + 3e6a: 4a85 li s5,1 + link("C0", file); + 3e6c: 00003b97 auipc s7,0x3 + 3e70: 1a4b8b93 addi s7,s7,420 # 7010 + for(i = 0; i < N; i++){ + 3e74: 02800a13 li s4,40 + 3e78: a41d j 409e + link("C0", file); + 3e7a: fa840593 addi a1,s0,-88 + 3e7e: 855e mv a0,s7 + 3e80: 755000ef jal 4dd4 + if(pid == 0) { + 3e84: a411 j 4088 + } else if(pid == 0 && (i % 5) == 1){ + 3e86: 4795 li a5,5 + 3e88: 02f9693b remw s2,s2,a5 + 3e8c: 4785 li a5,1 + 3e8e: 02f90563 beq s2,a5,3eb8 + fd = open(file, O_CREATE | O_RDWR); + 3e92: 20200593 li a1,514 + 3e96: fa840513 addi a0,s0,-88 + 3e9a: 71b000ef jal 4db4 + if(fd < 0){ + 3e9e: 1e055063 bgez a0,407e + printf("concreate create %s failed\n", file); + 3ea2: fa840593 addi a1,s0,-88 + 3ea6: 00003517 auipc a0,0x3 + 3eaa: 17250513 addi a0,a0,370 # 7018 + 3eae: 2ee010ef jal 519c + exit(1); + 3eb2: 4505 li a0,1 + 3eb4: 6c1000ef jal 4d74 + link("C0", file); + 3eb8: fa840593 addi a1,s0,-88 + 3ebc: 00003517 auipc a0,0x3 + 3ec0: 15450513 addi a0,a0,340 # 7010 + 3ec4: 711000ef jal 4dd4 + exit(0); + 3ec8: 4501 li a0,0 + 3eca: 6ab000ef jal 4d74 + exit(1); + 3ece: 4505 li a0,1 + 3ed0: 6a5000ef jal 4d74 + memset(fa, 0, sizeof(fa)); + 3ed4: 02800613 li a2,40 + 3ed8: 4581 li a1,0 + 3eda: f8040513 addi a0,s0,-128 + 3ede: 485000ef jal 4b62 + fd = open(".", 0); + 3ee2: 4581 li a1,0 + 3ee4: 00002517 auipc a0,0x2 + 3ee8: b8c50513 addi a0,a0,-1140 # 5a70 + 3eec: 6c9000ef jal 4db4 + 3ef0: 892a mv s2,a0 + n = 0; + 3ef2: 8aa6 mv s5,s1 + if(de.name[0] == 'C' && de.name[2] == '\0'){ + 3ef4: 04300a13 li s4,67 + if(i < 0 || i >= sizeof(fa)){ + 3ef8: 02700b13 li s6,39 + fa[i] = 1; + 3efc: 4b85 li s7,1 + while(read(fd, &de, sizeof(de)) > 0){ + 3efe: 4641 li a2,16 + 3f00: f7040593 addi a1,s0,-144 + 3f04: 854a mv a0,s2 + 3f06: 687000ef jal 4d8c + 3f0a: 06a05a63 blez a0,3f7e + if(de.inum == 0) + 3f0e: f7045783 lhu a5,-144(s0) + 3f12: d7f5 beqz a5,3efe + if(de.name[0] == 'C' && de.name[2] == '\0'){ + 3f14: f7244783 lbu a5,-142(s0) + 3f18: ff4793e3 bne a5,s4,3efe + 3f1c: f7444783 lbu a5,-140(s0) + 3f20: fff9 bnez a5,3efe + i = de.name[1] - '0'; + 3f22: f7344783 lbu a5,-141(s0) + 3f26: fd07879b addiw a5,a5,-48 + 3f2a: 0007871b sext.w a4,a5 + if(i < 0 || i >= sizeof(fa)){ + 3f2e: 02eb6063 bltu s6,a4,3f4e + if(fa[i]){ + 3f32: fb070793 addi a5,a4,-80 + 3f36: 97a2 add a5,a5,s0 + 3f38: fd07c783 lbu a5,-48(a5) + 3f3c: e78d bnez a5,3f66 + fa[i] = 1; + 3f3e: fb070793 addi a5,a4,-80 + 3f42: 00878733 add a4,a5,s0 + 3f46: fd770823 sb s7,-48(a4) + n++; + 3f4a: 2a85 addiw s5,s5,1 + 3f4c: bf4d j 3efe + printf("%s: concreate weird file %s\n", s, de.name); + 3f4e: f7240613 addi a2,s0,-142 + 3f52: 85ce mv a1,s3 + 3f54: 00003517 auipc a0,0x3 + 3f58: 0e450513 addi a0,a0,228 # 7038 + 3f5c: 240010ef jal 519c + exit(1); + 3f60: 4505 li a0,1 + 3f62: 613000ef jal 4d74 + printf("%s: concreate duplicate file %s\n", s, de.name); + 3f66: f7240613 addi a2,s0,-142 + 3f6a: 85ce mv a1,s3 + 3f6c: 00003517 auipc a0,0x3 + 3f70: 0ec50513 addi a0,a0,236 # 7058 + 3f74: 228010ef jal 519c + exit(1); + 3f78: 4505 li a0,1 + 3f7a: 5fb000ef jal 4d74 + close(fd); + 3f7e: 854a mv a0,s2 + 3f80: 61d000ef jal 4d9c + if(n != N){ + 3f84: 02800793 li a5,40 + 3f88: 00fa9763 bne s5,a5,3f96 + if(((i % 3) == 0 && pid == 0) || + 3f8c: 4a8d li s5,3 + 3f8e: 4b05 li s6,1 + for(i = 0; i < N; i++){ + 3f90: 02800a13 li s4,40 + 3f94: a079 j 4022 + printf("%s: concreate not enough files in directory listing\n", s); + 3f96: 85ce mv a1,s3 + 3f98: 00003517 auipc a0,0x3 + 3f9c: 0e850513 addi a0,a0,232 # 7080 + 3fa0: 1fc010ef jal 519c + exit(1); + 3fa4: 4505 li a0,1 + 3fa6: 5cf000ef jal 4d74 + printf("%s: fork failed\n", s); + 3faa: 85ce mv a1,s3 + 3fac: 00002517 auipc a0,0x2 + 3fb0: c6c50513 addi a0,a0,-916 # 5c18 + 3fb4: 1e8010ef jal 519c + exit(1); + 3fb8: 4505 li a0,1 + 3fba: 5bb000ef jal 4d74 + close(open(file, 0)); + 3fbe: 4581 li a1,0 + 3fc0: fa840513 addi a0,s0,-88 + 3fc4: 5f1000ef jal 4db4 + 3fc8: 5d5000ef jal 4d9c + close(open(file, 0)); + 3fcc: 4581 li a1,0 + 3fce: fa840513 addi a0,s0,-88 + 3fd2: 5e3000ef jal 4db4 + 3fd6: 5c7000ef jal 4d9c + close(open(file, 0)); + 3fda: 4581 li a1,0 + 3fdc: fa840513 addi a0,s0,-88 + 3fe0: 5d5000ef jal 4db4 + 3fe4: 5b9000ef jal 4d9c + close(open(file, 0)); + 3fe8: 4581 li a1,0 + 3fea: fa840513 addi a0,s0,-88 + 3fee: 5c7000ef jal 4db4 + 3ff2: 5ab000ef jal 4d9c + close(open(file, 0)); + 3ff6: 4581 li a1,0 + 3ff8: fa840513 addi a0,s0,-88 + 3ffc: 5b9000ef jal 4db4 + 4000: 59d000ef jal 4d9c + close(open(file, 0)); + 4004: 4581 li a1,0 + 4006: fa840513 addi a0,s0,-88 + 400a: 5ab000ef jal 4db4 + 400e: 58f000ef jal 4d9c + if(pid == 0) + 4012: 06090363 beqz s2,4078 + wait(0); + 4016: 4501 li a0,0 + 4018: 565000ef jal 4d7c + for(i = 0; i < N; i++){ + 401c: 2485 addiw s1,s1,1 + 401e: 0b448963 beq s1,s4,40d0 + file[1] = '0' + i; + 4022: 0304879b addiw a5,s1,48 + 4026: faf404a3 sb a5,-87(s0) + pid = fork(); + 402a: 543000ef jal 4d6c + 402e: 892a mv s2,a0 + if(pid < 0){ + 4030: f6054de3 bltz a0,3faa + if(((i % 3) == 0 && pid == 0) || + 4034: 0354e73b remw a4,s1,s5 + 4038: 00a767b3 or a5,a4,a0 + 403c: 2781 sext.w a5,a5 + 403e: d3c1 beqz a5,3fbe + 4040: 01671363 bne a4,s6,4046 + ((i % 3) == 1 && pid != 0)){ + 4044: fd2d bnez a0,3fbe + unlink(file); + 4046: fa840513 addi a0,s0,-88 + 404a: 57b000ef jal 4dc4 + unlink(file); + 404e: fa840513 addi a0,s0,-88 + 4052: 573000ef jal 4dc4 + unlink(file); + 4056: fa840513 addi a0,s0,-88 + 405a: 56b000ef jal 4dc4 + unlink(file); + 405e: fa840513 addi a0,s0,-88 + 4062: 563000ef jal 4dc4 + unlink(file); + 4066: fa840513 addi a0,s0,-88 + 406a: 55b000ef jal 4dc4 + unlink(file); + 406e: fa840513 addi a0,s0,-88 + 4072: 553000ef jal 4dc4 + 4076: bf71 j 4012 + exit(0); + 4078: 4501 li a0,0 + 407a: 4fb000ef jal 4d74 + close(fd); + 407e: 51f000ef jal 4d9c + if(pid == 0) { + 4082: b599 j 3ec8 + close(fd); + 4084: 519000ef jal 4d9c + wait(&xstatus); + 4088: f6c40513 addi a0,s0,-148 + 408c: 4f1000ef jal 4d7c + if(xstatus != 0) + 4090: f6c42483 lw s1,-148(s0) + 4094: e2049de3 bnez s1,3ece + for(i = 0; i < N; i++){ + 4098: 2905 addiw s2,s2,1 + 409a: e3490de3 beq s2,s4,3ed4 + file[1] = '0' + i; + 409e: 0309079b addiw a5,s2,48 + 40a2: faf404a3 sb a5,-87(s0) + unlink(file); + 40a6: fa840513 addi a0,s0,-88 + 40aa: 51b000ef jal 4dc4 + pid = fork(); + 40ae: 4bf000ef jal 4d6c + if(pid && (i % 3) == 1){ + 40b2: dc050ae3 beqz a0,3e86 + 40b6: 036967bb remw a5,s2,s6 + 40ba: dd5780e3 beq a5,s5,3e7a + fd = open(file, O_CREATE | O_RDWR); + 40be: 20200593 li a1,514 + 40c2: fa840513 addi a0,s0,-88 + 40c6: 4ef000ef jal 4db4 + if(fd < 0){ + 40ca: fa055de3 bgez a0,4084 + 40ce: bbd1 j 3ea2 +} + 40d0: 60ea ld ra,152(sp) + 40d2: 644a ld s0,144(sp) + 40d4: 64aa ld s1,136(sp) + 40d6: 690a ld s2,128(sp) + 40d8: 79e6 ld s3,120(sp) + 40da: 7a46 ld s4,112(sp) + 40dc: 7aa6 ld s5,104(sp) + 40de: 7b06 ld s6,96(sp) + 40e0: 6be6 ld s7,88(sp) + 40e2: 610d addi sp,sp,160 + 40e4: 8082 ret + +00000000000040e6 : +{ + 40e6: 7139 addi sp,sp,-64 + 40e8: fc06 sd ra,56(sp) + 40ea: f822 sd s0,48(sp) + 40ec: f426 sd s1,40(sp) + 40ee: f04a sd s2,32(sp) + 40f0: ec4e sd s3,24(sp) + 40f2: e852 sd s4,16(sp) + 40f4: e456 sd s5,8(sp) + 40f6: 0080 addi s0,sp,64 + 40f8: 8aaa mv s5,a0 + unlink("bigfile.dat"); + 40fa: 00003517 auipc a0,0x3 + 40fe: fbe50513 addi a0,a0,-66 # 70b8 + 4102: 4c3000ef jal 4dc4 + fd = open("bigfile.dat", O_CREATE | O_RDWR); + 4106: 20200593 li a1,514 + 410a: 00003517 auipc a0,0x3 + 410e: fae50513 addi a0,a0,-82 # 70b8 + 4112: 4a3000ef jal 4db4 + 4116: 89aa mv s3,a0 + for(i = 0; i < N; i++){ + 4118: 4481 li s1,0 + memset(buf, i, SZ); + 411a: 00009917 auipc s2,0x9 + 411e: b9e90913 addi s2,s2,-1122 # ccb8 + for(i = 0; i < N; i++){ + 4122: 4a51 li s4,20 + if(fd < 0){ + 4124: 08054663 bltz a0,41b0 + memset(buf, i, SZ); + 4128: 25800613 li a2,600 + 412c: 85a6 mv a1,s1 + 412e: 854a mv a0,s2 + 4130: 233000ef jal 4b62 + if(write(fd, buf, SZ) != SZ){ + 4134: 25800613 li a2,600 + 4138: 85ca mv a1,s2 + 413a: 854e mv a0,s3 + 413c: 459000ef jal 4d94 + 4140: 25800793 li a5,600 + 4144: 08f51063 bne a0,a5,41c4 + for(i = 0; i < N; i++){ + 4148: 2485 addiw s1,s1,1 + 414a: fd449fe3 bne s1,s4,4128 + close(fd); + 414e: 854e mv a0,s3 + 4150: 44d000ef jal 4d9c + fd = open("bigfile.dat", 0); + 4154: 4581 li a1,0 + 4156: 00003517 auipc a0,0x3 + 415a: f6250513 addi a0,a0,-158 # 70b8 + 415e: 457000ef jal 4db4 + 4162: 8a2a mv s4,a0 + total = 0; + 4164: 4981 li s3,0 + for(i = 0; ; i++){ + 4166: 4481 li s1,0 + cc = read(fd, buf, SZ/2); + 4168: 00009917 auipc s2,0x9 + 416c: b5090913 addi s2,s2,-1200 # ccb8 + if(fd < 0){ + 4170: 06054463 bltz a0,41d8 + cc = read(fd, buf, SZ/2); + 4174: 12c00613 li a2,300 + 4178: 85ca mv a1,s2 + 417a: 8552 mv a0,s4 + 417c: 411000ef jal 4d8c + if(cc < 0){ + 4180: 06054663 bltz a0,41ec + if(cc == 0) + 4184: c155 beqz a0,4228 + if(cc != SZ/2){ + 4186: 12c00793 li a5,300 + 418a: 06f51b63 bne a0,a5,4200 + if(buf[0] != i/2 || buf[SZ/2-1] != i/2){ + 418e: 01f4d79b srliw a5,s1,0x1f + 4192: 9fa5 addw a5,a5,s1 + 4194: 4017d79b sraiw a5,a5,0x1 + 4198: 00094703 lbu a4,0(s2) + 419c: 06f71c63 bne a4,a5,4214 + 41a0: 12b94703 lbu a4,299(s2) + 41a4: 06f71863 bne a4,a5,4214 + total += cc; + 41a8: 12c9899b addiw s3,s3,300 + for(i = 0; ; i++){ + 41ac: 2485 addiw s1,s1,1 + cc = read(fd, buf, SZ/2); + 41ae: b7d9 j 4174 + printf("%s: cannot create bigfile", s); + 41b0: 85d6 mv a1,s5 + 41b2: 00003517 auipc a0,0x3 + 41b6: f1650513 addi a0,a0,-234 # 70c8 + 41ba: 7e3000ef jal 519c + exit(1); + 41be: 4505 li a0,1 + 41c0: 3b5000ef jal 4d74 + printf("%s: write bigfile failed\n", s); + 41c4: 85d6 mv a1,s5 + 41c6: 00003517 auipc a0,0x3 + 41ca: f2250513 addi a0,a0,-222 # 70e8 + 41ce: 7cf000ef jal 519c + exit(1); + 41d2: 4505 li a0,1 + 41d4: 3a1000ef jal 4d74 + printf("%s: cannot open bigfile\n", s); + 41d8: 85d6 mv a1,s5 + 41da: 00003517 auipc a0,0x3 + 41de: f2e50513 addi a0,a0,-210 # 7108 + 41e2: 7bb000ef jal 519c + exit(1); + 41e6: 4505 li a0,1 + 41e8: 38d000ef jal 4d74 + printf("%s: read bigfile failed\n", s); + 41ec: 85d6 mv a1,s5 + 41ee: 00003517 auipc a0,0x3 + 41f2: f3a50513 addi a0,a0,-198 # 7128 + 41f6: 7a7000ef jal 519c + exit(1); + 41fa: 4505 li a0,1 + 41fc: 379000ef jal 4d74 + printf("%s: short read bigfile\n", s); + 4200: 85d6 mv a1,s5 + 4202: 00003517 auipc a0,0x3 + 4206: f4650513 addi a0,a0,-186 # 7148 + 420a: 793000ef jal 519c + exit(1); + 420e: 4505 li a0,1 + 4210: 365000ef jal 4d74 + printf("%s: read bigfile wrong data\n", s); + 4214: 85d6 mv a1,s5 + 4216: 00003517 auipc a0,0x3 + 421a: f4a50513 addi a0,a0,-182 # 7160 + 421e: 77f000ef jal 519c + exit(1); + 4222: 4505 li a0,1 + 4224: 351000ef jal 4d74 + close(fd); + 4228: 8552 mv a0,s4 + 422a: 373000ef jal 4d9c + if(total != N*SZ){ + 422e: 678d lui a5,0x3 + 4230: ee078793 addi a5,a5,-288 # 2ee0 + 4234: 02f99163 bne s3,a5,4256 + unlink("bigfile.dat"); + 4238: 00003517 auipc a0,0x3 + 423c: e8050513 addi a0,a0,-384 # 70b8 + 4240: 385000ef jal 4dc4 +} + 4244: 70e2 ld ra,56(sp) + 4246: 7442 ld s0,48(sp) + 4248: 74a2 ld s1,40(sp) + 424a: 7902 ld s2,32(sp) + 424c: 69e2 ld s3,24(sp) + 424e: 6a42 ld s4,16(sp) + 4250: 6aa2 ld s5,8(sp) + 4252: 6121 addi sp,sp,64 + 4254: 8082 ret + printf("%s: read bigfile wrong total\n", s); + 4256: 85d6 mv a1,s5 + 4258: 00003517 auipc a0,0x3 + 425c: f2850513 addi a0,a0,-216 # 7180 + 4260: 73d000ef jal 519c + exit(1); + 4264: 4505 li a0,1 + 4266: 30f000ef jal 4d74 + +000000000000426a : +{ + 426a: 7121 addi sp,sp,-448 + 426c: ff06 sd ra,440(sp) + 426e: fb22 sd s0,432(sp) + 4270: f726 sd s1,424(sp) + 4272: 0380 addi s0,sp,448 + 4274: 84aa mv s1,a0 + unlink("bigarg-ok"); + 4276: 00003517 auipc a0,0x3 + 427a: f2a50513 addi a0,a0,-214 # 71a0 + 427e: 347000ef jal 4dc4 + pid = fork(); + 4282: 2eb000ef jal 4d6c + if(pid == 0){ + 4286: c915 beqz a0,42ba + } else if(pid < 0){ + 4288: 08054a63 bltz a0,431c + wait(&xstatus); + 428c: fdc40513 addi a0,s0,-36 + 4290: 2ed000ef jal 4d7c + if(xstatus != 0) + 4294: fdc42503 lw a0,-36(s0) + 4298: ed41 bnez a0,4330 + fd = open("bigarg-ok", 0); + 429a: 4581 li a1,0 + 429c: 00003517 auipc a0,0x3 + 42a0: f0450513 addi a0,a0,-252 # 71a0 + 42a4: 311000ef jal 4db4 + if(fd < 0){ + 42a8: 08054663 bltz a0,4334 + close(fd); + 42ac: 2f1000ef jal 4d9c +} + 42b0: 70fa ld ra,440(sp) + 42b2: 745a ld s0,432(sp) + 42b4: 74ba ld s1,424(sp) + 42b6: 6139 addi sp,sp,448 + 42b8: 8082 ret + memset(big, ' ', sizeof(big)); + 42ba: 19000613 li a2,400 + 42be: 02000593 li a1,32 + 42c2: e4840513 addi a0,s0,-440 + 42c6: 09d000ef jal 4b62 + big[sizeof(big)-1] = '\0'; + 42ca: fc040ba3 sb zero,-41(s0) + for(i = 0; i < MAXARG-1; i++) + 42ce: 00005797 auipc a5,0x5 + 42d2: 1d278793 addi a5,a5,466 # 94a0 + 42d6: 00005697 auipc a3,0x5 + 42da: 2c268693 addi a3,a3,706 # 9598 + args[i] = big; + 42de: e4840713 addi a4,s0,-440 + 42e2: e398 sd a4,0(a5) + for(i = 0; i < MAXARG-1; i++) + 42e4: 07a1 addi a5,a5,8 + 42e6: fed79ee3 bne a5,a3,42e2 + args[MAXARG-1] = 0; + 42ea: 00005597 auipc a1,0x5 + 42ee: 1b658593 addi a1,a1,438 # 94a0 + 42f2: 0e05bc23 sd zero,248(a1) + exec("echo", args); + 42f6: 00001517 auipc a0,0x1 + 42fa: 09250513 addi a0,a0,146 # 5388 + 42fe: 2af000ef jal 4dac + fd = open("bigarg-ok", O_CREATE); + 4302: 20000593 li a1,512 + 4306: 00003517 auipc a0,0x3 + 430a: e9a50513 addi a0,a0,-358 # 71a0 + 430e: 2a7000ef jal 4db4 + close(fd); + 4312: 28b000ef jal 4d9c + exit(0); + 4316: 4501 li a0,0 + 4318: 25d000ef jal 4d74 + printf("%s: bigargtest: fork failed\n", s); + 431c: 85a6 mv a1,s1 + 431e: 00003517 auipc a0,0x3 + 4322: e9250513 addi a0,a0,-366 # 71b0 + 4326: 677000ef jal 519c + exit(1); + 432a: 4505 li a0,1 + 432c: 249000ef jal 4d74 + exit(xstatus); + 4330: 245000ef jal 4d74 + printf("%s: bigarg test failed!\n", s); + 4334: 85a6 mv a1,s1 + 4336: 00003517 auipc a0,0x3 + 433a: e9a50513 addi a0,a0,-358 # 71d0 + 433e: 65f000ef jal 519c + exit(1); + 4342: 4505 li a0,1 + 4344: 231000ef jal 4d74 + +0000000000004348 : +{ + 4348: 1141 addi sp,sp,-16 + 434a: e406 sd ra,8(sp) + 434c: e022 sd s0,0(sp) + 434e: 0800 addi s0,sp,16 + prev_end = sbrklazy(REGION_SZ); + 4350: 40000537 lui a0,0x40000 + 4354: 203000ef jal 4d56 + if (prev_end == (char *) SBRK_ERROR) { + 4358: 57fd li a5,-1 + 435a: 02f50a63 beq a0,a5,438e + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) + 435e: 6605 lui a2,0x1 + 4360: 962a add a2,a2,a0 + 4362: 400017b7 lui a5,0x40001 + 4366: 00f50733 add a4,a0,a5 + 436a: 87b2 mv a5,a2 + 436c: 000406b7 lui a3,0x40 + *(char **)i = i; + 4370: e39c sd a5,0(a5) + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) + 4372: 97b6 add a5,a5,a3 + 4374: fee79ee3 bne a5,a4,4370 + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) { + 4378: 000406b7 lui a3,0x40 + if (*(char **)i != i) { + 437c: 621c ld a5,0(a2) + 437e: 02c79163 bne a5,a2,43a0 + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) { + 4382: 9636 add a2,a2,a3 + 4384: fee61ce3 bne a2,a4,437c + exit(0); + 4388: 4501 li a0,0 + 438a: 1eb000ef jal 4d74 + printf("sbrklazy() failed\n"); + 438e: 00003517 auipc a0,0x3 + 4392: e6250513 addi a0,a0,-414 # 71f0 + 4396: 607000ef jal 519c + exit(1); + 439a: 4505 li a0,1 + 439c: 1d9000ef jal 4d74 + printf("failed to read value from memory\n"); + 43a0: 00003517 auipc a0,0x3 + 43a4: e6850513 addi a0,a0,-408 # 7208 + 43a8: 5f5000ef jal 519c + exit(1); + 43ac: 4505 li a0,1 + 43ae: 1c7000ef jal 4d74 + +00000000000043b2 : +{ + 43b2: 7139 addi sp,sp,-64 + 43b4: fc06 sd ra,56(sp) + 43b6: f822 sd s0,48(sp) + 43b8: 0080 addi s0,sp,64 + prev_end = sbrklazy(REGION_SZ); + 43ba: 40000537 lui a0,0x40000 + 43be: 199000ef jal 4d56 + if (prev_end == (char*)SBRK_ERROR) { + 43c2: 57fd li a5,-1 + 43c4: 04f50663 beq a0,a5,4410 + 43c8: f426 sd s1,40(sp) + 43ca: f04a sd s2,32(sp) + 43cc: ec4e sd s3,24(sp) + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) + 43ce: 6905 lui s2,0x1 + 43d0: 992a add s2,s2,a0 + 43d2: 400017b7 lui a5,0x40001 + 43d6: 00f504b3 add s1,a0,a5 + 43da: 87ca mv a5,s2 + 43dc: 01000737 lui a4,0x1000 + *(char **)i = i; + 43e0: e39c sd a5,0(a5) + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) + 43e2: 97ba add a5,a5,a4 + 43e4: fe979ee3 bne a5,s1,43e0 + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) { + 43e8: 010009b7 lui s3,0x1000 + pid = fork(); + 43ec: 181000ef jal 4d6c + if (pid < 0) { + 43f0: 02054c63 bltz a0,4428 + } else if (pid == 0) { + 43f4: c139 beqz a0,443a + wait(&status); + 43f6: fcc40513 addi a0,s0,-52 + 43fa: 183000ef jal 4d7c + if (status == 0) { + 43fe: fcc42783 lw a5,-52(s0) + 4402: c7a9 beqz a5,444c + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) { + 4404: 994e add s2,s2,s3 + 4406: fe9913e3 bne s2,s1,43ec + exit(0); + 440a: 4501 li a0,0 + 440c: 169000ef jal 4d74 + 4410: f426 sd s1,40(sp) + 4412: f04a sd s2,32(sp) + 4414: ec4e sd s3,24(sp) + printf("sbrklazy() failed\n"); + 4416: 00003517 auipc a0,0x3 + 441a: dda50513 addi a0,a0,-550 # 71f0 + 441e: 57f000ef jal 519c + exit(1); + 4422: 4505 li a0,1 + 4424: 151000ef jal 4d74 + printf("error forking\n"); + 4428: 00003517 auipc a0,0x3 + 442c: e0850513 addi a0,a0,-504 # 7230 + 4430: 56d000ef jal 519c + exit(1); + 4434: 4505 li a0,1 + 4436: 13f000ef jal 4d74 + sbrklazy(-1L * REGION_SZ); + 443a: c0000537 lui a0,0xc0000 + 443e: 119000ef jal 4d56 + *(char **)i = i; + 4442: 01293023 sd s2,0(s2) # 1000 + exit(0); + 4446: 4501 li a0,0 + 4448: 12d000ef jal 4d74 + printf("memory not unmapped\n"); + 444c: 00003517 auipc a0,0x3 + 4450: df450513 addi a0,a0,-524 # 7240 + 4454: 549000ef jal 519c + exit(1); + 4458: 4505 li a0,1 + 445a: 11b000ef jal 4d74 + +000000000000445e : +{ + 445e: 7159 addi sp,sp,-112 + 4460: f486 sd ra,104(sp) + 4462: f0a2 sd s0,96(sp) + 4464: eca6 sd s1,88(sp) + 4466: e8ca sd s2,80(sp) + 4468: e4ce sd s3,72(sp) + 446a: e0d2 sd s4,64(sp) + 446c: fc56 sd s5,56(sp) + 446e: f85a sd s6,48(sp) + 4470: 1880 addi s0,sp,112 + char *p = sbrk(0); + 4472: 4501 li a0,0 + 4474: 0cd000ef jal 4d40 + 4478: 84aa mv s1,a0 + sbrklazy(4*PGSIZE); + 447a: 6511 lui a0,0x4 + 447c: 0db000ef jal 4d56 + open(p + 8192, 0); + 4480: 4581 li a1,0 + 4482: 6509 lui a0,0x2 + 4484: 9526 add a0,a0,s1 + 4486: 12f000ef jal 4db4 + void *xx = sbrk(0); + 448a: 4501 li a0,0 + 448c: 0b5000ef jal 4d40 + 4490: 84aa mv s1,a0 + void *ret = sbrk(-(((uint64) xx)+1)); + 4492: fff54513 not a0,a0 + 4496: 2501 sext.w a0,a0 + 4498: 0a9000ef jal 4d40 + if(ret != xx){ + 449c: 00a48c63 beq s1,a0,44b4 + 44a0: 85aa mv a1,a0 + printf("sbrk(sbrk(0)+1) returned %p, not old sz\n", ret); + 44a2: 00003517 auipc a0,0x3 + 44a6: db650513 addi a0,a0,-586 # 7258 + 44aa: 4f3000ef jal 519c + exit(1); + 44ae: 4505 li a0,1 + 44b0: 0c5000ef jal 4d74 + unsigned long bad[] = { + 44b4: 00003797 auipc a5,0x3 + 44b8: 41c78793 addi a5,a5,1052 # 78d0 + 44bc: 7fa8 ld a0,120(a5) + 44be: 63cc ld a1,128(a5) + 44c0: 67d0 ld a2,136(a5) + 44c2: 6bd4 ld a3,144(a5) + 44c4: 6fd8 ld a4,152(a5) + 44c6: 73dc ld a5,160(a5) + 44c8: f8a43823 sd a0,-112(s0) + 44cc: f8b43c23 sd a1,-104(s0) + 44d0: fac43023 sd a2,-96(s0) + 44d4: fad43423 sd a3,-88(s0) + 44d8: fae43823 sd a4,-80(s0) + 44dc: faf43c23 sd a5,-72(s0) + for(int i = 0; i < sizeof(bad)/sizeof(bad[0]); i++){ + 44e0: f9040913 addi s2,s0,-112 + 44e4: fc040b13 addi s6,s0,-64 + int fd = open("README", 0); + 44e8: 00001a17 auipc s4,0x1 + 44ec: 078a0a13 addi s4,s4,120 # 5560 + fd = open("junk", O_CREATE|O_RDWR|O_TRUNC); + 44f0: 00001a97 auipc s5,0x1 + 44f4: f80a8a93 addi s5,s5,-128 # 5470 + int fd = open("README", 0); + 44f8: 4581 li a1,0 + 44fa: 8552 mv a0,s4 + 44fc: 0b9000ef jal 4db4 + 4500: 84aa mv s1,a0 + if(fd < 0) { printf("cannot open README\n"); exit(1); } + 4502: 04054663 bltz a0,454e + if(read(fd, (char*)bad[i], 512) >= 0) { printf("read succeeded\n"); exit(1); } + 4506: 00093983 ld s3,0(s2) + 450a: 20000613 li a2,512 + 450e: 85ce mv a1,s3 + 4510: 07d000ef jal 4d8c + 4514: 04055663 bgez a0,4560 + close(fd); + 4518: 8526 mv a0,s1 + 451a: 083000ef jal 4d9c + fd = open("junk", O_CREATE|O_RDWR|O_TRUNC); + 451e: 60200593 li a1,1538 + 4522: 8556 mv a0,s5 + 4524: 091000ef jal 4db4 + 4528: 84aa mv s1,a0 + if(fd < 0) { printf("cannot open junk\n"); exit(1); } + 452a: 04054463 bltz a0,4572 + if(write(fd, (char*)bad[i], 512) >= 0) { printf("write succeeded\n"); exit(1); } + 452e: 20000613 li a2,512 + 4532: 85ce mv a1,s3 + 4534: 061000ef jal 4d94 + 4538: 04055663 bgez a0,4584 + close(fd); + 453c: 8526 mv a0,s1 + 453e: 05f000ef jal 4d9c + for(int i = 0; i < sizeof(bad)/sizeof(bad[0]); i++){ + 4542: 0921 addi s2,s2,8 + 4544: fb691ae3 bne s2,s6,44f8 + exit(0); + 4548: 4501 li a0,0 + 454a: 02b000ef jal 4d74 + if(fd < 0) { printf("cannot open README\n"); exit(1); } + 454e: 00003517 auipc a0,0x3 + 4552: d3a50513 addi a0,a0,-710 # 7288 + 4556: 447000ef jal 519c + 455a: 4505 li a0,1 + 455c: 019000ef jal 4d74 + if(read(fd, (char*)bad[i], 512) >= 0) { printf("read succeeded\n"); exit(1); } + 4560: 00003517 auipc a0,0x3 + 4564: d4050513 addi a0,a0,-704 # 72a0 + 4568: 435000ef jal 519c + 456c: 4505 li a0,1 + 456e: 007000ef jal 4d74 + if(fd < 0) { printf("cannot open junk\n"); exit(1); } + 4572: 00003517 auipc a0,0x3 + 4576: d3e50513 addi a0,a0,-706 # 72b0 + 457a: 423000ef jal 519c + 457e: 4505 li a0,1 + 4580: 7f4000ef jal 4d74 + if(write(fd, (char*)bad[i], 512) >= 0) { printf("write succeeded\n"); exit(1); } + 4584: 00003517 auipc a0,0x3 + 4588: d4450513 addi a0,a0,-700 # 72c8 + 458c: 411000ef jal 519c + 4590: 4505 li a0,1 + 4592: 7e2000ef jal 4d74 + +0000000000004596 : +{ + 4596: 1101 addi sp,sp,-32 + 4598: ec06 sd ra,24(sp) + 459a: e822 sd s0,16(sp) + 459c: e426 sd s1,8(sp) + 459e: e04a sd s2,0(sp) + 45a0: 1000 addi s0,sp,32 + char *p = sbrk(0); + 45a2: 4501 li a0,0 + 45a4: 79c000ef jal 4d40 + 45a8: 84aa mv s1,a0 + while ((uint64)p < MAXVA-(1<<30)) { + 45aa: 0ff00793 li a5,255 + 45ae: 07fa slli a5,a5,0x1e + 45b0: 00f57d63 bgeu a0,a5,45ca + 45b4: 893e mv s2,a5 + p = sbrklazy(1<<30); + 45b6: 40000537 lui a0,0x40000 + 45ba: 79c000ef jal 4d56 + p = sbrklazy(0); + 45be: 4501 li a0,0 + 45c0: 796000ef jal 4d56 + 45c4: 84aa mv s1,a0 + while ((uint64)p < MAXVA-(1<<30)) { + 45c6: ff2568e3 bltu a0,s2,45b6 + int n = TRAPFRAME-PGSIZE-(uint64)p; + 45ca: 7975 lui s2,0xffffd + 45cc: 4099093b subw s2,s2,s1 + char *p1 = sbrklazy(n); + 45d0: 854a mv a0,s2 + 45d2: 784000ef jal 4d56 + 45d6: 862a mv a2,a0 + if (p1 < 0 || p1 != p) { + 45d8: 00950d63 beq a0,s1,45f2 + printf("sbrklazy(%d) returned %p, not expected %p\n", n, p1, p); + 45dc: 86a6 mv a3,s1 + 45de: 85ca mv a1,s2 + 45e0: 00003517 auipc a0,0x3 + 45e4: d0050513 addi a0,a0,-768 # 72e0 + 45e8: 3b5000ef jal 519c + exit(1); + 45ec: 4505 li a0,1 + 45ee: 786000ef jal 4d74 + p = sbrk(PGSIZE); + 45f2: 6505 lui a0,0x1 + 45f4: 74c000ef jal 4d40 + 45f8: 862a mv a2,a0 + if (p < 0 || (uint64)p != TRAPFRAME-PGSIZE) { + 45fa: 040007b7 lui a5,0x4000 + 45fe: 17f5 addi a5,a5,-3 # 3fffffd + 4600: 07b2 slli a5,a5,0xc + 4602: 00f50c63 beq a0,a5,461a + printf("sbrk(%d) returned %p, not expected TRAPFRAME-PGSIZE\n", PGSIZE, p); + 4606: 6585 lui a1,0x1 + 4608: 00003517 auipc a0,0x3 + 460c: d0850513 addi a0,a0,-760 # 7310 + 4610: 38d000ef jal 519c + exit(1); + 4614: 4505 li a0,1 + 4616: 75e000ef jal 4d74 + p[0] = 1; + 461a: 040007b7 lui a5,0x4000 + 461e: 17f5 addi a5,a5,-3 # 3fffffd + 4620: 07b2 slli a5,a5,0xc + 4622: 4705 li a4,1 + 4624: 00e78023 sb a4,0(a5) + if (p[1] != 0) { + 4628: 0017c783 lbu a5,1(a5) + 462c: cb91 beqz a5,4640 + printf("sbrk() returned non-zero-filled memory\n"); + 462e: 00003517 auipc a0,0x3 + 4632: d1a50513 addi a0,a0,-742 # 7348 + 4636: 367000ef jal 519c + exit(1); + 463a: 4505 li a0,1 + 463c: 738000ef jal 4d74 + p = sbrk(1); + 4640: 4505 li a0,1 + 4642: 6fe000ef jal 4d40 + 4646: 85aa mv a1,a0 + if ((uint64)p != -1) { + 4648: 57fd li a5,-1 + 464a: 00f50b63 beq a0,a5,4660 + printf("sbrk(1) returned %p, expected error\n", p); + 464e: 00003517 auipc a0,0x3 + 4652: d2250513 addi a0,a0,-734 # 7370 + 4656: 347000ef jal 519c + exit(1); + 465a: 4505 li a0,1 + 465c: 718000ef jal 4d74 + p = sbrklazy(1); + 4660: 4505 li a0,1 + 4662: 6f4000ef jal 4d56 + 4666: 85aa mv a1,a0 + if ((uint64)p != -1) { + 4668: 57fd li a5,-1 + 466a: 00f50b63 beq a0,a5,4680 + printf("sbrklazy(1) returned %p, expected error\n", p); + 466e: 00003517 auipc a0,0x3 + 4672: d2a50513 addi a0,a0,-726 # 7398 + 4676: 327000ef jal 519c + exit(1); + 467a: 4505 li a0,1 + 467c: 6f8000ef jal 4d74 + exit(0); + 4680: 4501 li a0,0 + 4682: 6f2000ef jal 4d74 + +0000000000004686 : +{ + 4686: 7135 addi sp,sp,-160 + 4688: ed06 sd ra,152(sp) + 468a: e922 sd s0,144(sp) + 468c: e526 sd s1,136(sp) + 468e: e14a sd s2,128(sp) + 4690: fcce sd s3,120(sp) + 4692: f8d2 sd s4,112(sp) + 4694: f4d6 sd s5,104(sp) + 4696: f0da sd s6,96(sp) + 4698: ecde sd s7,88(sp) + 469a: e8e2 sd s8,80(sp) + 469c: e4e6 sd s9,72(sp) + 469e: e0ea sd s10,64(sp) + 46a0: 1100 addi s0,sp,160 + printf("fsfull test\n"); + 46a2: 00003517 auipc a0,0x3 + 46a6: d2650513 addi a0,a0,-730 # 73c8 + 46aa: 2f3000ef jal 519c + for(nfiles = 0; ; nfiles++){ + 46ae: 4481 li s1,0 + name[0] = 'f'; + 46b0: 06600d13 li s10,102 + name[1] = '0' + nfiles / 1000; + 46b4: 3e800c13 li s8,1000 + name[2] = '0' + (nfiles % 1000) / 100; + 46b8: 06400b93 li s7,100 + name[3] = '0' + (nfiles % 100) / 10; + 46bc: 4b29 li s6,10 + printf("writing %s\n", name); + 46be: 00003c97 auipc s9,0x3 + 46c2: d1ac8c93 addi s9,s9,-742 # 73d8 + name[0] = 'f'; + 46c6: f7a40023 sb s10,-160(s0) + name[1] = '0' + nfiles / 1000; + 46ca: 0384c7bb divw a5,s1,s8 + 46ce: 0307879b addiw a5,a5,48 + 46d2: f6f400a3 sb a5,-159(s0) + name[2] = '0' + (nfiles % 1000) / 100; + 46d6: 0384e7bb remw a5,s1,s8 + 46da: 0377c7bb divw a5,a5,s7 + 46de: 0307879b addiw a5,a5,48 + 46e2: f6f40123 sb a5,-158(s0) + name[3] = '0' + (nfiles % 100) / 10; + 46e6: 0374e7bb remw a5,s1,s7 + 46ea: 0367c7bb divw a5,a5,s6 + 46ee: 0307879b addiw a5,a5,48 + 46f2: f6f401a3 sb a5,-157(s0) + name[4] = '0' + (nfiles % 10); + 46f6: 0364e7bb remw a5,s1,s6 + 46fa: 0307879b addiw a5,a5,48 + 46fe: f6f40223 sb a5,-156(s0) + name[5] = '\0'; + 4702: f60402a3 sb zero,-155(s0) + printf("writing %s\n", name); + 4706: f6040593 addi a1,s0,-160 + 470a: 8566 mv a0,s9 + 470c: 291000ef jal 519c + int fd = open(name, O_CREATE|O_RDWR); + 4710: 20200593 li a1,514 + 4714: f6040513 addi a0,s0,-160 + 4718: 69c000ef jal 4db4 + 471c: 892a mv s2,a0 + if(fd < 0){ + 471e: 08055f63 bgez a0,47bc + printf("open %s failed\n", name); + 4722: f6040593 addi a1,s0,-160 + 4726: 00003517 auipc a0,0x3 + 472a: cc250513 addi a0,a0,-830 # 73e8 + 472e: 26f000ef jal 519c + while(nfiles >= 0){ + 4732: 0604c163 bltz s1,4794 + name[0] = 'f'; + 4736: 06600b13 li s6,102 + name[1] = '0' + nfiles / 1000; + 473a: 3e800a13 li s4,1000 + name[2] = '0' + (nfiles % 1000) / 100; + 473e: 06400993 li s3,100 + name[3] = '0' + (nfiles % 100) / 10; + 4742: 4929 li s2,10 + while(nfiles >= 0){ + 4744: 5afd li s5,-1 + name[0] = 'f'; + 4746: f7640023 sb s6,-160(s0) + name[1] = '0' + nfiles / 1000; + 474a: 0344c7bb divw a5,s1,s4 + 474e: 0307879b addiw a5,a5,48 + 4752: f6f400a3 sb a5,-159(s0) + name[2] = '0' + (nfiles % 1000) / 100; + 4756: 0344e7bb remw a5,s1,s4 + 475a: 0337c7bb divw a5,a5,s3 + 475e: 0307879b addiw a5,a5,48 + 4762: f6f40123 sb a5,-158(s0) + name[3] = '0' + (nfiles % 100) / 10; + 4766: 0334e7bb remw a5,s1,s3 + 476a: 0327c7bb divw a5,a5,s2 + 476e: 0307879b addiw a5,a5,48 + 4772: f6f401a3 sb a5,-157(s0) + name[4] = '0' + (nfiles % 10); + 4776: 0324e7bb remw a5,s1,s2 + 477a: 0307879b addiw a5,a5,48 + 477e: f6f40223 sb a5,-156(s0) + name[5] = '\0'; + 4782: f60402a3 sb zero,-155(s0) + unlink(name); + 4786: f6040513 addi a0,s0,-160 + 478a: 63a000ef jal 4dc4 + nfiles--; + 478e: 34fd addiw s1,s1,-1 + while(nfiles >= 0){ + 4790: fb549be3 bne s1,s5,4746 + printf("fsfull test finished\n"); + 4794: 00003517 auipc a0,0x3 + 4798: c7450513 addi a0,a0,-908 # 7408 + 479c: 201000ef jal 519c +} + 47a0: 60ea ld ra,152(sp) + 47a2: 644a ld s0,144(sp) + 47a4: 64aa ld s1,136(sp) + 47a6: 690a ld s2,128(sp) + 47a8: 79e6 ld s3,120(sp) + 47aa: 7a46 ld s4,112(sp) + 47ac: 7aa6 ld s5,104(sp) + 47ae: 7b06 ld s6,96(sp) + 47b0: 6be6 ld s7,88(sp) + 47b2: 6c46 ld s8,80(sp) + 47b4: 6ca6 ld s9,72(sp) + 47b6: 6d06 ld s10,64(sp) + 47b8: 610d addi sp,sp,160 + 47ba: 8082 ret + int total = 0; + 47bc: 4981 li s3,0 + int cc = write(fd, buf, BSIZE); + 47be: 00008a97 auipc s5,0x8 + 47c2: 4faa8a93 addi s5,s5,1274 # ccb8 + if(cc < BSIZE) + 47c6: 3ff00a13 li s4,1023 + int cc = write(fd, buf, BSIZE); + 47ca: 40000613 li a2,1024 + 47ce: 85d6 mv a1,s5 + 47d0: 854a mv a0,s2 + 47d2: 5c2000ef jal 4d94 + if(cc < BSIZE) + 47d6: 00aa5563 bge s4,a0,47e0 + total += cc; + 47da: 00a989bb addw s3,s3,a0 + while(1){ + 47de: b7f5 j 47ca + printf("wrote %d bytes\n", total); + 47e0: 85ce mv a1,s3 + 47e2: 00003517 auipc a0,0x3 + 47e6: c1650513 addi a0,a0,-1002 # 73f8 + 47ea: 1b3000ef jal 519c + close(fd); + 47ee: 854a mv a0,s2 + 47f0: 5ac000ef jal 4d9c + if(total == 0) + 47f4: f2098fe3 beqz s3,4732 + for(nfiles = 0; ; nfiles++){ + 47f8: 2485 addiw s1,s1,1 + 47fa: b5f1 j 46c6 + +00000000000047fc : +// + +// run each test in its own process. run returns 1 if child's exit() +// indicates success. +int +run(void f(char *), char *s) { + 47fc: 7179 addi sp,sp,-48 + 47fe: f406 sd ra,40(sp) + 4800: f022 sd s0,32(sp) + 4802: ec26 sd s1,24(sp) + 4804: e84a sd s2,16(sp) + 4806: 1800 addi s0,sp,48 + 4808: 84aa mv s1,a0 + 480a: 892e mv s2,a1 + int pid; + int xstatus; + + printf("test %s: ", s); + 480c: 00003517 auipc a0,0x3 + 4810: c1450513 addi a0,a0,-1004 # 7420 + 4814: 189000ef jal 519c + if((pid = fork()) < 0) { + 4818: 554000ef jal 4d6c + 481c: 02054a63 bltz a0,4850 + printf("runtest: fork error\n"); + exit(1); + } + if(pid == 0) { + 4820: c129 beqz a0,4862 + f(s); + exit(0); + } else { + wait(&xstatus); + 4822: fdc40513 addi a0,s0,-36 + 4826: 556000ef jal 4d7c + if(xstatus != 0) + 482a: fdc42783 lw a5,-36(s0) + 482e: cf9d beqz a5,486c + printf("FAILED\n"); + 4830: 00003517 auipc a0,0x3 + 4834: c1850513 addi a0,a0,-1000 # 7448 + 4838: 165000ef jal 519c + else + printf("OK\n"); + return xstatus == 0; + 483c: fdc42503 lw a0,-36(s0) + } +} + 4840: 00153513 seqz a0,a0 + 4844: 70a2 ld ra,40(sp) + 4846: 7402 ld s0,32(sp) + 4848: 64e2 ld s1,24(sp) + 484a: 6942 ld s2,16(sp) + 484c: 6145 addi sp,sp,48 + 484e: 8082 ret + printf("runtest: fork error\n"); + 4850: 00003517 auipc a0,0x3 + 4854: be050513 addi a0,a0,-1056 # 7430 + 4858: 145000ef jal 519c + exit(1); + 485c: 4505 li a0,1 + 485e: 516000ef jal 4d74 + f(s); + 4862: 854a mv a0,s2 + 4864: 9482 jalr s1 + exit(0); + 4866: 4501 li a0,0 + 4868: 50c000ef jal 4d74 + printf("OK\n"); + 486c: 00003517 auipc a0,0x3 + 4870: be450513 addi a0,a0,-1052 # 7450 + 4874: 129000ef jal 519c + 4878: b7d1 j 483c + +000000000000487a : + +int +runtests(struct test *tests, char *justone, int continuous) { + 487a: 7139 addi sp,sp,-64 + 487c: fc06 sd ra,56(sp) + 487e: f822 sd s0,48(sp) + 4880: f426 sd s1,40(sp) + 4882: ec4e sd s3,24(sp) + 4884: 0080 addi s0,sp,64 + 4886: 84aa mv s1,a0 + int ntests = 0; + for (struct test *t = tests; t->s != 0; t++) { + 4888: 6508 ld a0,8(a0) + 488a: cd39 beqz a0,48e8 + 488c: f04a sd s2,32(sp) + 488e: e852 sd s4,16(sp) + 4890: e456 sd s5,8(sp) + 4892: 892e mv s2,a1 + 4894: 8a32 mv s4,a2 + int ntests = 0; + 4896: 4981 li s3,0 + if((justone == 0) || strcmp(t->s, justone) == 0) { + ntests++; + if(!run(t->f, t->s)){ + if(continuous != 2){ + 4898: 4a89 li s5,2 + 489a: a021 j 48a2 + for (struct test *t = tests; t->s != 0; t++) { + 489c: 04c1 addi s1,s1,16 + 489e: 6488 ld a0,8(s1) + 48a0: c915 beqz a0,48d4 + if((justone == 0) || strcmp(t->s, justone) == 0) { + 48a2: 00090663 beqz s2,48ae + 48a6: 85ca mv a1,s2 + 48a8: 264000ef jal 4b0c + 48ac: f965 bnez a0,489c + ntests++; + 48ae: 2985 addiw s3,s3,1 # 1000001 + if(!run(t->f, t->s)){ + 48b0: 648c ld a1,8(s1) + 48b2: 6088 ld a0,0(s1) + 48b4: f49ff0ef jal 47fc + 48b8: f175 bnez a0,489c + if(continuous != 2){ + 48ba: ff5a01e3 beq s4,s5,489c + printf("SOME TESTS FAILED\n"); + 48be: 00003517 auipc a0,0x3 + 48c2: b9a50513 addi a0,a0,-1126 # 7458 + 48c6: 0d7000ef jal 519c + return -1; + 48ca: 59fd li s3,-1 + 48cc: 7902 ld s2,32(sp) + 48ce: 6a42 ld s4,16(sp) + 48d0: 6aa2 ld s5,8(sp) + 48d2: a021 j 48da + 48d4: 7902 ld s2,32(sp) + 48d6: 6a42 ld s4,16(sp) + 48d8: 6aa2 ld s5,8(sp) + } + } + } + } + return ntests; +} + 48da: 854e mv a0,s3 + 48dc: 70e2 ld ra,56(sp) + 48de: 7442 ld s0,48(sp) + 48e0: 74a2 ld s1,40(sp) + 48e2: 69e2 ld s3,24(sp) + 48e4: 6121 addi sp,sp,64 + 48e6: 8082 ret + return ntests; + 48e8: 4981 li s3,0 + 48ea: bfc5 j 48da + +00000000000048ec : + + +// use sbrk() to count how many free physical memory pages there are. +int +countfree() +{ + 48ec: 7179 addi sp,sp,-48 + 48ee: f406 sd ra,40(sp) + 48f0: f022 sd s0,32(sp) + 48f2: ec26 sd s1,24(sp) + 48f4: e84a sd s2,16(sp) + 48f6: e44e sd s3,8(sp) + 48f8: 1800 addi s0,sp,48 + int n = 0; + uint64 sz0 = (uint64)sbrk(0); + 48fa: 4501 li a0,0 + 48fc: 444000ef jal 4d40 + 4900: 89aa mv s3,a0 + int n = 0; + 4902: 4481 li s1,0 + while(1){ + char *a = sbrk(PGSIZE); + if(a == SBRK_ERROR){ + 4904: 597d li s2,-1 + 4906: a011 j 490a + break; + } + n += 1; + 4908: 2485 addiw s1,s1,1 + char *a = sbrk(PGSIZE); + 490a: 6505 lui a0,0x1 + 490c: 434000ef jal 4d40 + if(a == SBRK_ERROR){ + 4910: ff251ce3 bne a0,s2,4908 + } + sbrk(-((uint64)sbrk(0) - sz0)); + 4914: 4501 li a0,0 + 4916: 42a000ef jal 4d40 + 491a: 40a9853b subw a0,s3,a0 + 491e: 422000ef jal 4d40 + return n; +} + 4922: 8526 mv a0,s1 + 4924: 70a2 ld ra,40(sp) + 4926: 7402 ld s0,32(sp) + 4928: 64e2 ld s1,24(sp) + 492a: 6942 ld s2,16(sp) + 492c: 69a2 ld s3,8(sp) + 492e: 6145 addi sp,sp,48 + 4930: 8082 ret + +0000000000004932 : + +int +drivetests(int quick, int continuous, char *justone) { + 4932: 7159 addi sp,sp,-112 + 4934: f486 sd ra,104(sp) + 4936: f0a2 sd s0,96(sp) + 4938: eca6 sd s1,88(sp) + 493a: e8ca sd s2,80(sp) + 493c: e4ce sd s3,72(sp) + 493e: e0d2 sd s4,64(sp) + 4940: fc56 sd s5,56(sp) + 4942: f85a sd s6,48(sp) + 4944: f45e sd s7,40(sp) + 4946: f062 sd s8,32(sp) + 4948: ec66 sd s9,24(sp) + 494a: e86a sd s10,16(sp) + 494c: e46e sd s11,8(sp) + 494e: 1880 addi s0,sp,112 + 4950: 8aaa mv s5,a0 + 4952: 89ae mv s3,a1 + 4954: 8a32 mv s4,a2 + do { + printf("usertests starting\n"); + 4956: 00003c17 auipc s8,0x3 + 495a: b1ac0c13 addi s8,s8,-1254 # 7470 + int free0 = countfree(); + int free1 = 0; + int ntests = 0; + int n; + n = runtests(quicktests, justone, continuous); + 495e: 00004b97 auipc s7,0x4 + 4962: 6b2b8b93 addi s7,s7,1714 # 9010 + if (n < 0) { + if(continuous != 2) { + 4966: 4b09 li s6,2 + ntests += n; + } + if(!quick) { + if (justone == 0) + printf("usertests slow tests starting\n"); + n = runtests(slowtests, justone, continuous); + 4968: 00005c97 auipc s9,0x5 + 496c: ab8c8c93 addi s9,s9,-1352 # 9420 + printf("usertests slow tests starting\n"); + 4970: 00003d97 auipc s11,0x3 + 4974: b18d8d93 addi s11,s11,-1256 # 7488 + } else { + ntests += n; + } + } + if((free1 = countfree()) < free0) { + printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); + 4978: 00003d17 auipc s10,0x3 + 497c: b30d0d13 addi s10,s10,-1232 # 74a8 + 4980: a025 j 49a8 + if(continuous != 2) { + 4982: 09699063 bne s3,s6,4a02 + int ntests = 0; + 4986: 4481 li s1,0 + 4988: a835 j 49c4 + printf("usertests slow tests starting\n"); + 498a: 856e mv a0,s11 + 498c: 011000ef jal 519c + 4990: a835 j 49cc + if(continuous != 2) { + 4992: 07699a63 bne s3,s6,4a06 + if((free1 = countfree()) < free0) { + 4996: f57ff0ef jal 48ec + 499a: 05254263 blt a0,s2,49de + if(continuous != 2) { + return 1; + } + } + if (justone != 0 && ntests == 0) { + 499e: 000a0363 beqz s4,49a4 + 49a2: c8a1 beqz s1,49f2 + printf("NO TESTS EXECUTED\n"); + return 1; + } + } while(continuous); + 49a4: 06098563 beqz s3,4a0e + printf("usertests starting\n"); + 49a8: 8562 mv a0,s8 + 49aa: 7f2000ef jal 519c + int free0 = countfree(); + 49ae: f3fff0ef jal 48ec + 49b2: 892a mv s2,a0 + n = runtests(quicktests, justone, continuous); + 49b4: 864e mv a2,s3 + 49b6: 85d2 mv a1,s4 + 49b8: 855e mv a0,s7 + 49ba: ec1ff0ef jal 487a + 49be: 84aa mv s1,a0 + if (n < 0) { + 49c0: fc0541e3 bltz a0,4982 + if(!quick) { + 49c4: fc0a99e3 bnez s5,4996 + if (justone == 0) + 49c8: fc0a01e3 beqz s4,498a + n = runtests(slowtests, justone, continuous); + 49cc: 864e mv a2,s3 + 49ce: 85d2 mv a1,s4 + 49d0: 8566 mv a0,s9 + 49d2: ea9ff0ef jal 487a + if (n < 0) { + 49d6: fa054ee3 bltz a0,4992 + ntests += n; + 49da: 9ca9 addw s1,s1,a0 + 49dc: bf6d j 4996 + printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); + 49de: 864a mv a2,s2 + 49e0: 85aa mv a1,a0 + 49e2: 856a mv a0,s10 + 49e4: 7b8000ef jal 519c + if(continuous != 2) { + 49e8: 03699163 bne s3,s6,4a0a + if (justone != 0 && ntests == 0) { + 49ec: fa0a1be3 bnez s4,49a2 + 49f0: bf65 j 49a8 + printf("NO TESTS EXECUTED\n"); + 49f2: 00003517 auipc a0,0x3 + 49f6: ae650513 addi a0,a0,-1306 # 74d8 + 49fa: 7a2000ef jal 519c + return 1; + 49fe: 4505 li a0,1 + 4a00: a801 j 4a10 + return 1; + 4a02: 4505 li a0,1 + 4a04: a031 j 4a10 + return 1; + 4a06: 4505 li a0,1 + 4a08: a021 j 4a10 + return 1; + 4a0a: 4505 li a0,1 + 4a0c: a011 j 4a10 + return 0; + 4a0e: 854e mv a0,s3 +} + 4a10: 70a6 ld ra,104(sp) + 4a12: 7406 ld s0,96(sp) + 4a14: 64e6 ld s1,88(sp) + 4a16: 6946 ld s2,80(sp) + 4a18: 69a6 ld s3,72(sp) + 4a1a: 6a06 ld s4,64(sp) + 4a1c: 7ae2 ld s5,56(sp) + 4a1e: 7b42 ld s6,48(sp) + 4a20: 7ba2 ld s7,40(sp) + 4a22: 7c02 ld s8,32(sp) + 4a24: 6ce2 ld s9,24(sp) + 4a26: 6d42 ld s10,16(sp) + 4a28: 6da2 ld s11,8(sp) + 4a2a: 6165 addi sp,sp,112 + 4a2c: 8082 ret + +0000000000004a2e
: + +int +main(int argc, char *argv[]) +{ + 4a2e: 1101 addi sp,sp,-32 + 4a30: ec06 sd ra,24(sp) + 4a32: e822 sd s0,16(sp) + 4a34: e426 sd s1,8(sp) + 4a36: e04a sd s2,0(sp) + 4a38: 1000 addi s0,sp,32 + 4a3a: 84aa mv s1,a0 + int continuous = 0; + int quick = 0; + char *justone = 0; + + if(argc == 2 && strcmp(argv[1], "-q") == 0){ + 4a3c: 4789 li a5,2 + 4a3e: 00f50e63 beq a0,a5,4a5a + 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){ + 4a42: 4785 li a5,1 + 4a44: 06a7c663 blt a5,a0,4ab0 + char *justone = 0; + 4a48: 4601 li a2,0 + int quick = 0; + 4a4a: 4501 li a0,0 + int continuous = 0; + 4a4c: 4581 li a1,0 + printf("Usage: usertests [-c] [-C] [-q] [testname]\n"); + exit(1); + } + if (drivetests(quick, continuous, justone)) { + 4a4e: ee5ff0ef jal 4932 + 4a52: cd35 beqz a0,4ace + exit(1); + 4a54: 4505 li a0,1 + 4a56: 31e000ef jal 4d74 + 4a5a: 892e mv s2,a1 + if(argc == 2 && strcmp(argv[1], "-q") == 0){ + 4a5c: 00003597 auipc a1,0x3 + 4a60: a9458593 addi a1,a1,-1388 # 74f0 + 4a64: 00893503 ld a0,8(s2) # ffffffffffffd008 + 4a68: 0a4000ef jal 4b0c + 4a6c: 85aa mv a1,a0 + 4a6e: e501 bnez a0,4a76 + char *justone = 0; + 4a70: 4601 li a2,0 + quick = 1; + 4a72: 4505 li a0,1 + 4a74: bfe9 j 4a4e + } else if(argc == 2 && strcmp(argv[1], "-c") == 0){ + 4a76: 00003597 auipc a1,0x3 + 4a7a: a8258593 addi a1,a1,-1406 # 74f8 + 4a7e: 00893503 ld a0,8(s2) + 4a82: 08a000ef jal 4b0c + 4a86: cd15 beqz a0,4ac2 + } else if(argc == 2 && strcmp(argv[1], "-C") == 0){ + 4a88: 00003597 auipc a1,0x3 + 4a8c: ac058593 addi a1,a1,-1344 # 7548 + 4a90: 00893503 ld a0,8(s2) + 4a94: 078000ef jal 4b0c + 4a98: c905 beqz a0,4ac8 + } else if(argc == 2 && argv[1][0] != '-'){ + 4a9a: 00893603 ld a2,8(s2) + 4a9e: 00064703 lbu a4,0(a2) # 1000 + 4aa2: 02d00793 li a5,45 + 4aa6: 00f70563 beq a4,a5,4ab0 + int quick = 0; + 4aaa: 4501 li a0,0 + int continuous = 0; + 4aac: 4581 li a1,0 + 4aae: b745 j 4a4e + printf("Usage: usertests [-c] [-C] [-q] [testname]\n"); + 4ab0: 00003517 auipc a0,0x3 + 4ab4: a5050513 addi a0,a0,-1456 # 7500 + 4ab8: 6e4000ef jal 519c + exit(1); + 4abc: 4505 li a0,1 + 4abe: 2b6000ef jal 4d74 + char *justone = 0; + 4ac2: 4601 li a2,0 + continuous = 1; + 4ac4: 4585 li a1,1 + 4ac6: b761 j 4a4e + continuous = 2; + 4ac8: 85a6 mv a1,s1 + char *justone = 0; + 4aca: 4601 li a2,0 + 4acc: b749 j 4a4e + } + printf("ALL TESTS PASSED\n"); + 4ace: 00003517 auipc a0,0x3 + 4ad2: a6250513 addi a0,a0,-1438 # 7530 + 4ad6: 6c6000ef jal 519c + exit(0); + 4ada: 4501 li a0,0 + 4adc: 298000ef jal 4d74 + +0000000000004ae0 : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 4ae0: 1141 addi sp,sp,-16 + 4ae2: e406 sd ra,8(sp) + 4ae4: e022 sd s0,0(sp) + 4ae6: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 4ae8: f47ff0ef jal 4a2e
+ exit(r); + 4aec: 288000ef jal 4d74 + +0000000000004af0 : +} + +char* +strcpy(char *s, const char *t) +{ + 4af0: 1141 addi sp,sp,-16 + 4af2: e422 sd s0,8(sp) + 4af4: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 4af6: 87aa mv a5,a0 + 4af8: 0585 addi a1,a1,1 + 4afa: 0785 addi a5,a5,1 + 4afc: fff5c703 lbu a4,-1(a1) + 4b00: fee78fa3 sb a4,-1(a5) + 4b04: fb75 bnez a4,4af8 + ; + return os; +} + 4b06: 6422 ld s0,8(sp) + 4b08: 0141 addi sp,sp,16 + 4b0a: 8082 ret + +0000000000004b0c : + +int +strcmp(const char *p, const char *q) +{ + 4b0c: 1141 addi sp,sp,-16 + 4b0e: e422 sd s0,8(sp) + 4b10: 0800 addi s0,sp,16 + while(*p && *p == *q) + 4b12: 00054783 lbu a5,0(a0) + 4b16: cb91 beqz a5,4b2a + 4b18: 0005c703 lbu a4,0(a1) + 4b1c: 00f71763 bne a4,a5,4b2a + p++, q++; + 4b20: 0505 addi a0,a0,1 + 4b22: 0585 addi a1,a1,1 + while(*p && *p == *q) + 4b24: 00054783 lbu a5,0(a0) + 4b28: fbe5 bnez a5,4b18 + return (uchar)*p - (uchar)*q; + 4b2a: 0005c503 lbu a0,0(a1) +} + 4b2e: 40a7853b subw a0,a5,a0 + 4b32: 6422 ld s0,8(sp) + 4b34: 0141 addi sp,sp,16 + 4b36: 8082 ret + +0000000000004b38 : + +uint +strlen(const char *s) +{ + 4b38: 1141 addi sp,sp,-16 + 4b3a: e422 sd s0,8(sp) + 4b3c: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 4b3e: 00054783 lbu a5,0(a0) + 4b42: cf91 beqz a5,4b5e + 4b44: 0505 addi a0,a0,1 + 4b46: 87aa mv a5,a0 + 4b48: 86be mv a3,a5 + 4b4a: 0785 addi a5,a5,1 + 4b4c: fff7c703 lbu a4,-1(a5) + 4b50: ff65 bnez a4,4b48 + 4b52: 40a6853b subw a0,a3,a0 + 4b56: 2505 addiw a0,a0,1 + ; + return n; +} + 4b58: 6422 ld s0,8(sp) + 4b5a: 0141 addi sp,sp,16 + 4b5c: 8082 ret + for(n = 0; s[n]; n++) + 4b5e: 4501 li a0,0 + 4b60: bfe5 j 4b58 + +0000000000004b62 : + +void* +memset(void *dst, int c, uint n) +{ + 4b62: 1141 addi sp,sp,-16 + 4b64: e422 sd s0,8(sp) + 4b66: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 4b68: ca19 beqz a2,4b7e + 4b6a: 87aa mv a5,a0 + 4b6c: 1602 slli a2,a2,0x20 + 4b6e: 9201 srli a2,a2,0x20 + 4b70: 00a60733 add a4,a2,a0 + cdst[i] = c; + 4b74: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 4b78: 0785 addi a5,a5,1 + 4b7a: fee79de3 bne a5,a4,4b74 + } + return dst; +} + 4b7e: 6422 ld s0,8(sp) + 4b80: 0141 addi sp,sp,16 + 4b82: 8082 ret + +0000000000004b84 : + +char* +strchr(const char *s, char c) +{ + 4b84: 1141 addi sp,sp,-16 + 4b86: e422 sd s0,8(sp) + 4b88: 0800 addi s0,sp,16 + for(; *s; s++) + 4b8a: 00054783 lbu a5,0(a0) + 4b8e: cb99 beqz a5,4ba4 + if(*s == c) + 4b90: 00f58763 beq a1,a5,4b9e + for(; *s; s++) + 4b94: 0505 addi a0,a0,1 + 4b96: 00054783 lbu a5,0(a0) + 4b9a: fbfd bnez a5,4b90 + return (char*)s; + return 0; + 4b9c: 4501 li a0,0 +} + 4b9e: 6422 ld s0,8(sp) + 4ba0: 0141 addi sp,sp,16 + 4ba2: 8082 ret + return 0; + 4ba4: 4501 li a0,0 + 4ba6: bfe5 j 4b9e + +0000000000004ba8 : + +char* +gets(char *buf, int max) +{ + 4ba8: 711d addi sp,sp,-96 + 4baa: ec86 sd ra,88(sp) + 4bac: e8a2 sd s0,80(sp) + 4bae: e4a6 sd s1,72(sp) + 4bb0: e0ca sd s2,64(sp) + 4bb2: fc4e sd s3,56(sp) + 4bb4: f852 sd s4,48(sp) + 4bb6: f456 sd s5,40(sp) + 4bb8: f05a sd s6,32(sp) + 4bba: ec5e sd s7,24(sp) + 4bbc: 1080 addi s0,sp,96 + 4bbe: 8baa mv s7,a0 + 4bc0: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 4bc2: 892a mv s2,a0 + 4bc4: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 4bc6: 4aa9 li s5,10 + 4bc8: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 4bca: 89a6 mv s3,s1 + 4bcc: 2485 addiw s1,s1,1 + 4bce: 0344d663 bge s1,s4,4bfa + cc = read(0, &c, 1); + 4bd2: 4605 li a2,1 + 4bd4: faf40593 addi a1,s0,-81 + 4bd8: 4501 li a0,0 + 4bda: 1b2000ef jal 4d8c + if(cc < 1) + 4bde: 00a05e63 blez a0,4bfa + buf[i++] = c; + 4be2: faf44783 lbu a5,-81(s0) + 4be6: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 4bea: 01578763 beq a5,s5,4bf8 + 4bee: 0905 addi s2,s2,1 + 4bf0: fd679de3 bne a5,s6,4bca + buf[i++] = c; + 4bf4: 89a6 mv s3,s1 + 4bf6: a011 j 4bfa + 4bf8: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 4bfa: 99de add s3,s3,s7 + 4bfc: 00098023 sb zero,0(s3) + return buf; +} + 4c00: 855e mv a0,s7 + 4c02: 60e6 ld ra,88(sp) + 4c04: 6446 ld s0,80(sp) + 4c06: 64a6 ld s1,72(sp) + 4c08: 6906 ld s2,64(sp) + 4c0a: 79e2 ld s3,56(sp) + 4c0c: 7a42 ld s4,48(sp) + 4c0e: 7aa2 ld s5,40(sp) + 4c10: 7b02 ld s6,32(sp) + 4c12: 6be2 ld s7,24(sp) + 4c14: 6125 addi sp,sp,96 + 4c16: 8082 ret + +0000000000004c18 : + +int +stat(const char *n, struct stat *st) +{ + 4c18: 1101 addi sp,sp,-32 + 4c1a: ec06 sd ra,24(sp) + 4c1c: e822 sd s0,16(sp) + 4c1e: e04a sd s2,0(sp) + 4c20: 1000 addi s0,sp,32 + 4c22: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 4c24: 4581 li a1,0 + 4c26: 18e000ef jal 4db4 + if(fd < 0) + 4c2a: 02054263 bltz a0,4c4e + 4c2e: e426 sd s1,8(sp) + 4c30: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 4c32: 85ca mv a1,s2 + 4c34: 198000ef jal 4dcc + 4c38: 892a mv s2,a0 + close(fd); + 4c3a: 8526 mv a0,s1 + 4c3c: 160000ef jal 4d9c + return r; + 4c40: 64a2 ld s1,8(sp) +} + 4c42: 854a mv a0,s2 + 4c44: 60e2 ld ra,24(sp) + 4c46: 6442 ld s0,16(sp) + 4c48: 6902 ld s2,0(sp) + 4c4a: 6105 addi sp,sp,32 + 4c4c: 8082 ret + return -1; + 4c4e: 597d li s2,-1 + 4c50: bfcd j 4c42 + +0000000000004c52 : + +int +atoi(const char *s) +{ + 4c52: 1141 addi sp,sp,-16 + 4c54: e422 sd s0,8(sp) + 4c56: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 4c58: 00054683 lbu a3,0(a0) + 4c5c: fd06879b addiw a5,a3,-48 # 3ffd0 + 4c60: 0ff7f793 zext.b a5,a5 + 4c64: 4625 li a2,9 + 4c66: 02f66863 bltu a2,a5,4c96 + 4c6a: 872a mv a4,a0 + n = 0; + 4c6c: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 4c6e: 0705 addi a4,a4,1 # 1000001 + 4c70: 0025179b slliw a5,a0,0x2 + 4c74: 9fa9 addw a5,a5,a0 + 4c76: 0017979b slliw a5,a5,0x1 + 4c7a: 9fb5 addw a5,a5,a3 + 4c7c: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 4c80: 00074683 lbu a3,0(a4) + 4c84: fd06879b addiw a5,a3,-48 + 4c88: 0ff7f793 zext.b a5,a5 + 4c8c: fef671e3 bgeu a2,a5,4c6e + return n; +} + 4c90: 6422 ld s0,8(sp) + 4c92: 0141 addi sp,sp,16 + 4c94: 8082 ret + n = 0; + 4c96: 4501 li a0,0 + 4c98: bfe5 j 4c90 + +0000000000004c9a : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 4c9a: 1141 addi sp,sp,-16 + 4c9c: e422 sd s0,8(sp) + 4c9e: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 4ca0: 02b57463 bgeu a0,a1,4cc8 + while(n-- > 0) + 4ca4: 00c05f63 blez a2,4cc2 + 4ca8: 1602 slli a2,a2,0x20 + 4caa: 9201 srli a2,a2,0x20 + 4cac: 00c507b3 add a5,a0,a2 + dst = vdst; + 4cb0: 872a mv a4,a0 + *dst++ = *src++; + 4cb2: 0585 addi a1,a1,1 + 4cb4: 0705 addi a4,a4,1 + 4cb6: fff5c683 lbu a3,-1(a1) + 4cba: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 4cbe: fef71ae3 bne a4,a5,4cb2 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 4cc2: 6422 ld s0,8(sp) + 4cc4: 0141 addi sp,sp,16 + 4cc6: 8082 ret + dst += n; + 4cc8: 00c50733 add a4,a0,a2 + src += n; + 4ccc: 95b2 add a1,a1,a2 + while(n-- > 0) + 4cce: fec05ae3 blez a2,4cc2 + 4cd2: fff6079b addiw a5,a2,-1 + 4cd6: 1782 slli a5,a5,0x20 + 4cd8: 9381 srli a5,a5,0x20 + 4cda: fff7c793 not a5,a5 + 4cde: 97ba add a5,a5,a4 + *--dst = *--src; + 4ce0: 15fd addi a1,a1,-1 + 4ce2: 177d addi a4,a4,-1 + 4ce4: 0005c683 lbu a3,0(a1) + 4ce8: 00d70023 sb a3,0(a4) + while(n-- > 0) + 4cec: fee79ae3 bne a5,a4,4ce0 + 4cf0: bfc9 j 4cc2 + +0000000000004cf2 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 4cf2: 1141 addi sp,sp,-16 + 4cf4: e422 sd s0,8(sp) + 4cf6: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 4cf8: ca05 beqz a2,4d28 + 4cfa: fff6069b addiw a3,a2,-1 + 4cfe: 1682 slli a3,a3,0x20 + 4d00: 9281 srli a3,a3,0x20 + 4d02: 0685 addi a3,a3,1 + 4d04: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 4d06: 00054783 lbu a5,0(a0) + 4d0a: 0005c703 lbu a4,0(a1) + 4d0e: 00e79863 bne a5,a4,4d1e + return *p1 - *p2; + } + p1++; + 4d12: 0505 addi a0,a0,1 + p2++; + 4d14: 0585 addi a1,a1,1 + while (n-- > 0) { + 4d16: fed518e3 bne a0,a3,4d06 + } + return 0; + 4d1a: 4501 li a0,0 + 4d1c: a019 j 4d22 + return *p1 - *p2; + 4d1e: 40e7853b subw a0,a5,a4 +} + 4d22: 6422 ld s0,8(sp) + 4d24: 0141 addi sp,sp,16 + 4d26: 8082 ret + return 0; + 4d28: 4501 li a0,0 + 4d2a: bfe5 j 4d22 + +0000000000004d2c : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 4d2c: 1141 addi sp,sp,-16 + 4d2e: e406 sd ra,8(sp) + 4d30: e022 sd s0,0(sp) + 4d32: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 4d34: f67ff0ef jal 4c9a +} + 4d38: 60a2 ld ra,8(sp) + 4d3a: 6402 ld s0,0(sp) + 4d3c: 0141 addi sp,sp,16 + 4d3e: 8082 ret + +0000000000004d40 : + +char * +sbrk(int n) { + 4d40: 1141 addi sp,sp,-16 + 4d42: e406 sd ra,8(sp) + 4d44: e022 sd s0,0(sp) + 4d46: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 4d48: 4585 li a1,1 + 4d4a: 0b2000ef jal 4dfc +} + 4d4e: 60a2 ld ra,8(sp) + 4d50: 6402 ld s0,0(sp) + 4d52: 0141 addi sp,sp,16 + 4d54: 8082 ret + +0000000000004d56 : + +char * +sbrklazy(int n) { + 4d56: 1141 addi sp,sp,-16 + 4d58: e406 sd ra,8(sp) + 4d5a: e022 sd s0,0(sp) + 4d5c: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 4d5e: 4589 li a1,2 + 4d60: 09c000ef jal 4dfc +} + 4d64: 60a2 ld ra,8(sp) + 4d66: 6402 ld s0,0(sp) + 4d68: 0141 addi sp,sp,16 + 4d6a: 8082 ret + +0000000000004d6c : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 4d6c: 4885 li a7,1 + ecall + 4d6e: 00000073 ecall + ret + 4d72: 8082 ret + +0000000000004d74 : +.global exit +exit: + li a7, SYS_exit + 4d74: 4889 li a7,2 + ecall + 4d76: 00000073 ecall + ret + 4d7a: 8082 ret + +0000000000004d7c : +.global wait +wait: + li a7, SYS_wait + 4d7c: 488d li a7,3 + ecall + 4d7e: 00000073 ecall + ret + 4d82: 8082 ret + +0000000000004d84 : +.global pipe +pipe: + li a7, SYS_pipe + 4d84: 4891 li a7,4 + ecall + 4d86: 00000073 ecall + ret + 4d8a: 8082 ret + +0000000000004d8c : +.global read +read: + li a7, SYS_read + 4d8c: 4895 li a7,5 + ecall + 4d8e: 00000073 ecall + ret + 4d92: 8082 ret + +0000000000004d94 : +.global write +write: + li a7, SYS_write + 4d94: 48c1 li a7,16 + ecall + 4d96: 00000073 ecall + ret + 4d9a: 8082 ret + +0000000000004d9c : +.global close +close: + li a7, SYS_close + 4d9c: 48d5 li a7,21 + ecall + 4d9e: 00000073 ecall + ret + 4da2: 8082 ret + +0000000000004da4 : +.global kill +kill: + li a7, SYS_kill + 4da4: 4899 li a7,6 + ecall + 4da6: 00000073 ecall + ret + 4daa: 8082 ret + +0000000000004dac : +.global exec +exec: + li a7, SYS_exec + 4dac: 489d li a7,7 + ecall + 4dae: 00000073 ecall + ret + 4db2: 8082 ret + +0000000000004db4 : +.global open +open: + li a7, SYS_open + 4db4: 48bd li a7,15 + ecall + 4db6: 00000073 ecall + ret + 4dba: 8082 ret + +0000000000004dbc : +.global mknod +mknod: + li a7, SYS_mknod + 4dbc: 48c5 li a7,17 + ecall + 4dbe: 00000073 ecall + ret + 4dc2: 8082 ret + +0000000000004dc4 : +.global unlink +unlink: + li a7, SYS_unlink + 4dc4: 48c9 li a7,18 + ecall + 4dc6: 00000073 ecall + ret + 4dca: 8082 ret + +0000000000004dcc : +.global fstat +fstat: + li a7, SYS_fstat + 4dcc: 48a1 li a7,8 + ecall + 4dce: 00000073 ecall + ret + 4dd2: 8082 ret + +0000000000004dd4 : +.global link +link: + li a7, SYS_link + 4dd4: 48cd li a7,19 + ecall + 4dd6: 00000073 ecall + ret + 4dda: 8082 ret + +0000000000004ddc : +.global mkdir +mkdir: + li a7, SYS_mkdir + 4ddc: 48d1 li a7,20 + ecall + 4dde: 00000073 ecall + ret + 4de2: 8082 ret + +0000000000004de4 : +.global chdir +chdir: + li a7, SYS_chdir + 4de4: 48a5 li a7,9 + ecall + 4de6: 00000073 ecall + ret + 4dea: 8082 ret + +0000000000004dec : +.global dup +dup: + li a7, SYS_dup + 4dec: 48a9 li a7,10 + ecall + 4dee: 00000073 ecall + ret + 4df2: 8082 ret + +0000000000004df4 : +.global getpid +getpid: + li a7, SYS_getpid + 4df4: 48ad li a7,11 + ecall + 4df6: 00000073 ecall + ret + 4dfa: 8082 ret + +0000000000004dfc : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 4dfc: 48b1 li a7,12 + ecall + 4dfe: 00000073 ecall + ret + 4e02: 8082 ret + +0000000000004e04 : +.global pause +pause: + li a7, SYS_pause + 4e04: 48b5 li a7,13 + ecall + 4e06: 00000073 ecall + ret + 4e0a: 8082 ret + +0000000000004e0c : +.global uptime +uptime: + li a7, SYS_uptime + 4e0c: 48b9 li a7,14 + ecall + 4e0e: 00000073 ecall + ret + 4e12: 8082 ret + +0000000000004e14 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 4e14: 1101 addi sp,sp,-32 + 4e16: ec06 sd ra,24(sp) + 4e18: e822 sd s0,16(sp) + 4e1a: 1000 addi s0,sp,32 + 4e1c: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 4e20: 4605 li a2,1 + 4e22: fef40593 addi a1,s0,-17 + 4e26: f6fff0ef jal 4d94 +} + 4e2a: 60e2 ld ra,24(sp) + 4e2c: 6442 ld s0,16(sp) + 4e2e: 6105 addi sp,sp,32 + 4e30: 8082 ret + +0000000000004e32 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 4e32: 715d addi sp,sp,-80 + 4e34: e486 sd ra,72(sp) + 4e36: e0a2 sd s0,64(sp) + 4e38: f84a sd s2,48(sp) + 4e3a: 0880 addi s0,sp,80 + 4e3c: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 4e3e: c299 beqz a3,4e44 + 4e40: 0805c363 bltz a1,4ec6 + neg = 0; + 4e44: 4881 li a7,0 + 4e46: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 4e4a: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 4e4c: 00003517 auipc a0,0x3 + 4e50: b2c50513 addi a0,a0,-1236 # 7978 + 4e54: 883e mv a6,a5 + 4e56: 2785 addiw a5,a5,1 + 4e58: 02c5f733 remu a4,a1,a2 + 4e5c: 972a add a4,a4,a0 + 4e5e: 00074703 lbu a4,0(a4) + 4e62: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 4e66: 872e mv a4,a1 + 4e68: 02c5d5b3 divu a1,a1,a2 + 4e6c: 0685 addi a3,a3,1 + 4e6e: fec773e3 bgeu a4,a2,4e54 + if(neg) + 4e72: 00088b63 beqz a7,4e88 + buf[i++] = '-'; + 4e76: fd078793 addi a5,a5,-48 + 4e7a: 97a2 add a5,a5,s0 + 4e7c: 02d00713 li a4,45 + 4e80: fee78423 sb a4,-24(a5) + 4e84: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 4e88: 02f05a63 blez a5,4ebc + 4e8c: fc26 sd s1,56(sp) + 4e8e: f44e sd s3,40(sp) + 4e90: fb840713 addi a4,s0,-72 + 4e94: 00f704b3 add s1,a4,a5 + 4e98: fff70993 addi s3,a4,-1 + 4e9c: 99be add s3,s3,a5 + 4e9e: 37fd addiw a5,a5,-1 + 4ea0: 1782 slli a5,a5,0x20 + 4ea2: 9381 srli a5,a5,0x20 + 4ea4: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 4ea8: fff4c583 lbu a1,-1(s1) + 4eac: 854a mv a0,s2 + 4eae: f67ff0ef jal 4e14 + while(--i >= 0) + 4eb2: 14fd addi s1,s1,-1 + 4eb4: ff349ae3 bne s1,s3,4ea8 + 4eb8: 74e2 ld s1,56(sp) + 4eba: 79a2 ld s3,40(sp) +} + 4ebc: 60a6 ld ra,72(sp) + 4ebe: 6406 ld s0,64(sp) + 4ec0: 7942 ld s2,48(sp) + 4ec2: 6161 addi sp,sp,80 + 4ec4: 8082 ret + x = -xx; + 4ec6: 40b005b3 neg a1,a1 + neg = 1; + 4eca: 4885 li a7,1 + x = -xx; + 4ecc: bfad j 4e46 + +0000000000004ece : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 4ece: 711d addi sp,sp,-96 + 4ed0: ec86 sd ra,88(sp) + 4ed2: e8a2 sd s0,80(sp) + 4ed4: e0ca sd s2,64(sp) + 4ed6: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 4ed8: 0005c903 lbu s2,0(a1) + 4edc: 28090663 beqz s2,5168 + 4ee0: e4a6 sd s1,72(sp) + 4ee2: fc4e sd s3,56(sp) + 4ee4: f852 sd s4,48(sp) + 4ee6: f456 sd s5,40(sp) + 4ee8: f05a sd s6,32(sp) + 4eea: ec5e sd s7,24(sp) + 4eec: e862 sd s8,16(sp) + 4eee: e466 sd s9,8(sp) + 4ef0: 8b2a mv s6,a0 + 4ef2: 8a2e mv s4,a1 + 4ef4: 8bb2 mv s7,a2 + state = 0; + 4ef6: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 4ef8: 4481 li s1,0 + 4efa: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 4efc: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 4f00: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 4f04: 06c00c93 li s9,108 + 4f08: a005 j 4f28 + putc(fd, c0); + 4f0a: 85ca mv a1,s2 + 4f0c: 855a mv a0,s6 + 4f0e: f07ff0ef jal 4e14 + 4f12: a019 j 4f18 + } else if(state == '%'){ + 4f14: 03598263 beq s3,s5,4f38 + for(i = 0; fmt[i]; i++){ + 4f18: 2485 addiw s1,s1,1 + 4f1a: 8726 mv a4,s1 + 4f1c: 009a07b3 add a5,s4,s1 + 4f20: 0007c903 lbu s2,0(a5) + 4f24: 22090a63 beqz s2,5158 + c0 = fmt[i] & 0xff; + 4f28: 0009079b sext.w a5,s2 + if(state == 0){ + 4f2c: fe0994e3 bnez s3,4f14 + if(c0 == '%'){ + 4f30: fd579de3 bne a5,s5,4f0a + state = '%'; + 4f34: 89be mv s3,a5 + 4f36: b7cd j 4f18 + if(c0) c1 = fmt[i+1] & 0xff; + 4f38: 00ea06b3 add a3,s4,a4 + 4f3c: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 4f40: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 4f42: c681 beqz a3,4f4a + 4f44: 9752 add a4,a4,s4 + 4f46: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 4f4a: 05878363 beq a5,s8,4f90 + } else if(c0 == 'l' && c1 == 'd'){ + 4f4e: 05978d63 beq a5,s9,4fa8 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 4f52: 07500713 li a4,117 + 4f56: 0ee78763 beq a5,a4,5044 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 4f5a: 07800713 li a4,120 + 4f5e: 12e78963 beq a5,a4,5090 + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4f62: 07000713 li a4,112 + 4f66: 14e78e63 beq a5,a4,50c2 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4f6a: 06300713 li a4,99 + 4f6e: 18e78e63 beq a5,a4,510a + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4f72: 07300713 li a4,115 + 4f76: 1ae78463 beq a5,a4,511e + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4f7a: 02500713 li a4,37 + 4f7e: 04e79563 bne a5,a4,4fc8 + putc(fd, '%'); + 4f82: 02500593 li a1,37 + 4f86: 855a mv a0,s6 + 4f88: e8dff0ef jal 4e14 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 4f8c: 4981 li s3,0 + 4f8e: b769 j 4f18 + printint(fd, va_arg(ap, int), 10, 1); + 4f90: 008b8913 addi s2,s7,8 + 4f94: 4685 li a3,1 + 4f96: 4629 li a2,10 + 4f98: 000ba583 lw a1,0(s7) + 4f9c: 855a mv a0,s6 + 4f9e: e95ff0ef jal 4e32 + 4fa2: 8bca mv s7,s2 + state = 0; + 4fa4: 4981 li s3,0 + 4fa6: bf8d j 4f18 + } else if(c0 == 'l' && c1 == 'd'){ + 4fa8: 06400793 li a5,100 + 4fac: 02f68963 beq a3,a5,4fde + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 4fb0: 06c00793 li a5,108 + 4fb4: 04f68263 beq a3,a5,4ff8 + } else if(c0 == 'l' && c1 == 'u'){ + 4fb8: 07500793 li a5,117 + 4fbc: 0af68063 beq a3,a5,505c + } else if(c0 == 'l' && c1 == 'x'){ + 4fc0: 07800793 li a5,120 + 4fc4: 0ef68263 beq a3,a5,50a8 + putc(fd, '%'); + 4fc8: 02500593 li a1,37 + 4fcc: 855a mv a0,s6 + 4fce: e47ff0ef jal 4e14 + putc(fd, c0); + 4fd2: 85ca mv a1,s2 + 4fd4: 855a mv a0,s6 + 4fd6: e3fff0ef jal 4e14 + state = 0; + 4fda: 4981 li s3,0 + 4fdc: bf35 j 4f18 + printint(fd, va_arg(ap, uint64), 10, 1); + 4fde: 008b8913 addi s2,s7,8 + 4fe2: 4685 li a3,1 + 4fe4: 4629 li a2,10 + 4fe6: 000bb583 ld a1,0(s7) + 4fea: 855a mv a0,s6 + 4fec: e47ff0ef jal 4e32 + i += 1; + 4ff0: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 4ff2: 8bca mv s7,s2 + state = 0; + 4ff4: 4981 li s3,0 + i += 1; + 4ff6: b70d j 4f18 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 4ff8: 06400793 li a5,100 + 4ffc: 02f60763 beq a2,a5,502a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 5000: 07500793 li a5,117 + 5004: 06f60963 beq a2,a5,5076 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 5008: 07800793 li a5,120 + 500c: faf61ee3 bne a2,a5,4fc8 + printint(fd, va_arg(ap, uint64), 16, 0); + 5010: 008b8913 addi s2,s7,8 + 5014: 4681 li a3,0 + 5016: 4641 li a2,16 + 5018: 000bb583 ld a1,0(s7) + 501c: 855a mv a0,s6 + 501e: e15ff0ef jal 4e32 + i += 2; + 5022: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 5024: 8bca mv s7,s2 + state = 0; + 5026: 4981 li s3,0 + i += 2; + 5028: bdc5 j 4f18 + printint(fd, va_arg(ap, uint64), 10, 1); + 502a: 008b8913 addi s2,s7,8 + 502e: 4685 li a3,1 + 5030: 4629 li a2,10 + 5032: 000bb583 ld a1,0(s7) + 5036: 855a mv a0,s6 + 5038: dfbff0ef jal 4e32 + i += 2; + 503c: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 503e: 8bca mv s7,s2 + state = 0; + 5040: 4981 li s3,0 + i += 2; + 5042: bdd9 j 4f18 + printint(fd, va_arg(ap, uint32), 10, 0); + 5044: 008b8913 addi s2,s7,8 + 5048: 4681 li a3,0 + 504a: 4629 li a2,10 + 504c: 000be583 lwu a1,0(s7) + 5050: 855a mv a0,s6 + 5052: de1ff0ef jal 4e32 + 5056: 8bca mv s7,s2 + state = 0; + 5058: 4981 li s3,0 + 505a: bd7d j 4f18 + printint(fd, va_arg(ap, uint64), 10, 0); + 505c: 008b8913 addi s2,s7,8 + 5060: 4681 li a3,0 + 5062: 4629 li a2,10 + 5064: 000bb583 ld a1,0(s7) + 5068: 855a mv a0,s6 + 506a: dc9ff0ef jal 4e32 + i += 1; + 506e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5070: 8bca mv s7,s2 + state = 0; + 5072: 4981 li s3,0 + i += 1; + 5074: b555 j 4f18 + printint(fd, va_arg(ap, uint64), 10, 0); + 5076: 008b8913 addi s2,s7,8 + 507a: 4681 li a3,0 + 507c: 4629 li a2,10 + 507e: 000bb583 ld a1,0(s7) + 5082: 855a mv a0,s6 + 5084: dafff0ef jal 4e32 + i += 2; + 5088: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 508a: 8bca mv s7,s2 + state = 0; + 508c: 4981 li s3,0 + i += 2; + 508e: b569 j 4f18 + printint(fd, va_arg(ap, uint32), 16, 0); + 5090: 008b8913 addi s2,s7,8 + 5094: 4681 li a3,0 + 5096: 4641 li a2,16 + 5098: 000be583 lwu a1,0(s7) + 509c: 855a mv a0,s6 + 509e: d95ff0ef jal 4e32 + 50a2: 8bca mv s7,s2 + state = 0; + 50a4: 4981 li s3,0 + 50a6: bd8d j 4f18 + printint(fd, va_arg(ap, uint64), 16, 0); + 50a8: 008b8913 addi s2,s7,8 + 50ac: 4681 li a3,0 + 50ae: 4641 li a2,16 + 50b0: 000bb583 ld a1,0(s7) + 50b4: 855a mv a0,s6 + 50b6: d7dff0ef jal 4e32 + i += 1; + 50ba: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 50bc: 8bca mv s7,s2 + state = 0; + 50be: 4981 li s3,0 + i += 1; + 50c0: bda1 j 4f18 + 50c2: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 50c4: 008b8d13 addi s10,s7,8 + 50c8: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 50cc: 03000593 li a1,48 + 50d0: 855a mv a0,s6 + 50d2: d43ff0ef jal 4e14 + putc(fd, 'x'); + 50d6: 07800593 li a1,120 + 50da: 855a mv a0,s6 + 50dc: d39ff0ef jal 4e14 + 50e0: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 50e2: 00003b97 auipc s7,0x3 + 50e6: 896b8b93 addi s7,s7,-1898 # 7978 + 50ea: 03c9d793 srli a5,s3,0x3c + 50ee: 97de add a5,a5,s7 + 50f0: 0007c583 lbu a1,0(a5) + 50f4: 855a mv a0,s6 + 50f6: d1fff0ef jal 4e14 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 50fa: 0992 slli s3,s3,0x4 + 50fc: 397d addiw s2,s2,-1 + 50fe: fe0916e3 bnez s2,50ea + printptr(fd, va_arg(ap, uint64)); + 5102: 8bea mv s7,s10 + state = 0; + 5104: 4981 li s3,0 + 5106: 6d02 ld s10,0(sp) + 5108: bd01 j 4f18 + putc(fd, va_arg(ap, uint32)); + 510a: 008b8913 addi s2,s7,8 + 510e: 000bc583 lbu a1,0(s7) + 5112: 855a mv a0,s6 + 5114: d01ff0ef jal 4e14 + 5118: 8bca mv s7,s2 + state = 0; + 511a: 4981 li s3,0 + 511c: bbf5 j 4f18 + if((s = va_arg(ap, char*)) == 0) + 511e: 008b8993 addi s3,s7,8 + 5122: 000bb903 ld s2,0(s7) + 5126: 00090f63 beqz s2,5144 + for(; *s; s++) + 512a: 00094583 lbu a1,0(s2) + 512e: c195 beqz a1,5152 + putc(fd, *s); + 5130: 855a mv a0,s6 + 5132: ce3ff0ef jal 4e14 + for(; *s; s++) + 5136: 0905 addi s2,s2,1 + 5138: 00094583 lbu a1,0(s2) + 513c: f9f5 bnez a1,5130 + if((s = va_arg(ap, char*)) == 0) + 513e: 8bce mv s7,s3 + state = 0; + 5140: 4981 li s3,0 + 5142: bbd9 j 4f18 + s = "(null)"; + 5144: 00002917 auipc s2,0x2 + 5148: 78490913 addi s2,s2,1924 # 78c8 + for(; *s; s++) + 514c: 02800593 li a1,40 + 5150: b7c5 j 5130 + if((s = va_arg(ap, char*)) == 0) + 5152: 8bce mv s7,s3 + state = 0; + 5154: 4981 li s3,0 + 5156: b3c9 j 4f18 + 5158: 64a6 ld s1,72(sp) + 515a: 79e2 ld s3,56(sp) + 515c: 7a42 ld s4,48(sp) + 515e: 7aa2 ld s5,40(sp) + 5160: 7b02 ld s6,32(sp) + 5162: 6be2 ld s7,24(sp) + 5164: 6c42 ld s8,16(sp) + 5166: 6ca2 ld s9,8(sp) + } + } +} + 5168: 60e6 ld ra,88(sp) + 516a: 6446 ld s0,80(sp) + 516c: 6906 ld s2,64(sp) + 516e: 6125 addi sp,sp,96 + 5170: 8082 ret + +0000000000005172 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 5172: 715d addi sp,sp,-80 + 5174: ec06 sd ra,24(sp) + 5176: e822 sd s0,16(sp) + 5178: 1000 addi s0,sp,32 + 517a: e010 sd a2,0(s0) + 517c: e414 sd a3,8(s0) + 517e: e818 sd a4,16(s0) + 5180: ec1c sd a5,24(s0) + 5182: 03043023 sd a6,32(s0) + 5186: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 518a: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 518e: 8622 mv a2,s0 + 5190: d3fff0ef jal 4ece +} + 5194: 60e2 ld ra,24(sp) + 5196: 6442 ld s0,16(sp) + 5198: 6161 addi sp,sp,80 + 519a: 8082 ret + +000000000000519c : + +void +printf(const char *fmt, ...) +{ + 519c: 711d addi sp,sp,-96 + 519e: ec06 sd ra,24(sp) + 51a0: e822 sd s0,16(sp) + 51a2: 1000 addi s0,sp,32 + 51a4: e40c sd a1,8(s0) + 51a6: e810 sd a2,16(s0) + 51a8: ec14 sd a3,24(s0) + 51aa: f018 sd a4,32(s0) + 51ac: f41c sd a5,40(s0) + 51ae: 03043823 sd a6,48(s0) + 51b2: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 51b6: 00840613 addi a2,s0,8 + 51ba: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 51be: 85aa mv a1,a0 + 51c0: 4505 li a0,1 + 51c2: d0dff0ef jal 4ece +} + 51c6: 60e2 ld ra,24(sp) + 51c8: 6442 ld s0,16(sp) + 51ca: 6125 addi sp,sp,96 + 51cc: 8082 ret + +00000000000051ce : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 51ce: 1141 addi sp,sp,-16 + 51d0: e422 sd s0,8(sp) + 51d2: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 51d4: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 51d8: 00004797 auipc a5,0x4 + 51dc: 2b87b783 ld a5,696(a5) # 9490 + 51e0: a02d j 520a + 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; + 51e2: 4618 lw a4,8(a2) + 51e4: 9f2d addw a4,a4,a1 + 51e6: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 51ea: 6398 ld a4,0(a5) + 51ec: 6310 ld a2,0(a4) + 51ee: a83d j 522c + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 51f0: ff852703 lw a4,-8(a0) + 51f4: 9f31 addw a4,a4,a2 + 51f6: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 51f8: ff053683 ld a3,-16(a0) + 51fc: a091 j 5240 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 51fe: 6398 ld a4,0(a5) + 5200: 00e7e463 bltu a5,a4,5208 + 5204: 00e6ea63 bltu a3,a4,5218 +{ + 5208: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 520a: fed7fae3 bgeu a5,a3,51fe + 520e: 6398 ld a4,0(a5) + 5210: 00e6e463 bltu a3,a4,5218 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 5214: fee7eae3 bltu a5,a4,5208 + if(bp + bp->s.size == p->s.ptr){ + 5218: ff852583 lw a1,-8(a0) + 521c: 6390 ld a2,0(a5) + 521e: 02059813 slli a6,a1,0x20 + 5222: 01c85713 srli a4,a6,0x1c + 5226: 9736 add a4,a4,a3 + 5228: fae60de3 beq a2,a4,51e2 + bp->s.ptr = p->s.ptr->s.ptr; + 522c: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 5230: 4790 lw a2,8(a5) + 5232: 02061593 slli a1,a2,0x20 + 5236: 01c5d713 srli a4,a1,0x1c + 523a: 973e add a4,a4,a5 + 523c: fae68ae3 beq a3,a4,51f0 + p->s.ptr = bp->s.ptr; + 5240: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 5242: 00004717 auipc a4,0x4 + 5246: 24f73723 sd a5,590(a4) # 9490 +} + 524a: 6422 ld s0,8(sp) + 524c: 0141 addi sp,sp,16 + 524e: 8082 ret + +0000000000005250 : + return freep; +} + +void* +malloc(uint nbytes) +{ + 5250: 7139 addi sp,sp,-64 + 5252: fc06 sd ra,56(sp) + 5254: f822 sd s0,48(sp) + 5256: f426 sd s1,40(sp) + 5258: ec4e sd s3,24(sp) + 525a: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 525c: 02051493 slli s1,a0,0x20 + 5260: 9081 srli s1,s1,0x20 + 5262: 04bd addi s1,s1,15 + 5264: 8091 srli s1,s1,0x4 + 5266: 0014899b addiw s3,s1,1 + 526a: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 526c: 00004517 auipc a0,0x4 + 5270: 22453503 ld a0,548(a0) # 9490 + 5274: c915 beqz a0,52a8 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 5276: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 5278: 4798 lw a4,8(a5) + 527a: 08977a63 bgeu a4,s1,530e + 527e: f04a sd s2,32(sp) + 5280: e852 sd s4,16(sp) + 5282: e456 sd s5,8(sp) + 5284: e05a sd s6,0(sp) + if(nu < 4096) + 5286: 8a4e mv s4,s3 + 5288: 0009871b sext.w a4,s3 + 528c: 6685 lui a3,0x1 + 528e: 00d77363 bgeu a4,a3,5294 + 5292: 6a05 lui s4,0x1 + 5294: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 5298: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 529c: 00004917 auipc s2,0x4 + 52a0: 1f490913 addi s2,s2,500 # 9490 + if(p == SBRK_ERROR) + 52a4: 5afd li s5,-1 + 52a6: a081 j 52e6 + 52a8: f04a sd s2,32(sp) + 52aa: e852 sd s4,16(sp) + 52ac: e456 sd s5,8(sp) + 52ae: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 52b0: 0000b797 auipc a5,0xb + 52b4: a0878793 addi a5,a5,-1528 # fcb8 + 52b8: 00004717 auipc a4,0x4 + 52bc: 1cf73c23 sd a5,472(a4) # 9490 + 52c0: e39c sd a5,0(a5) + base.s.size = 0; + 52c2: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 52c6: b7c1 j 5286 + prevp->s.ptr = p->s.ptr; + 52c8: 6398 ld a4,0(a5) + 52ca: e118 sd a4,0(a0) + 52cc: a8a9 j 5326 + hp->s.size = nu; + 52ce: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 52d2: 0541 addi a0,a0,16 + 52d4: efbff0ef jal 51ce + return freep; + 52d8: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 52dc: c12d beqz a0,533e + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 52de: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 52e0: 4798 lw a4,8(a5) + 52e2: 02977263 bgeu a4,s1,5306 + if(p == freep) + 52e6: 00093703 ld a4,0(s2) + 52ea: 853e mv a0,a5 + 52ec: fef719e3 bne a4,a5,52de + p = sbrk(nu * sizeof(Header)); + 52f0: 8552 mv a0,s4 + 52f2: a4fff0ef jal 4d40 + if(p == SBRK_ERROR) + 52f6: fd551ce3 bne a0,s5,52ce + return 0; + 52fa: 4501 li a0,0 + 52fc: 7902 ld s2,32(sp) + 52fe: 6a42 ld s4,16(sp) + 5300: 6aa2 ld s5,8(sp) + 5302: 6b02 ld s6,0(sp) + 5304: a03d j 5332 + 5306: 7902 ld s2,32(sp) + 5308: 6a42 ld s4,16(sp) + 530a: 6aa2 ld s5,8(sp) + 530c: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 530e: fae48de3 beq s1,a4,52c8 + p->s.size -= nunits; + 5312: 4137073b subw a4,a4,s3 + 5316: c798 sw a4,8(a5) + p += p->s.size; + 5318: 02071693 slli a3,a4,0x20 + 531c: 01c6d713 srli a4,a3,0x1c + 5320: 97ba add a5,a5,a4 + p->s.size = nunits; + 5322: 0137a423 sw s3,8(a5) + freep = prevp; + 5326: 00004717 auipc a4,0x4 + 532a: 16a73523 sd a0,362(a4) # 9490 + return (void*)(p + 1); + 532e: 01078513 addi a0,a5,16 + } +} + 5332: 70e2 ld ra,56(sp) + 5334: 7442 ld s0,48(sp) + 5336: 74a2 ld s1,40(sp) + 5338: 69e2 ld s3,24(sp) + 533a: 6121 addi sp,sp,64 + 533c: 8082 ret + 533e: 7902 ld s2,32(sp) + 5340: 6a42 ld s4,16(sp) + 5342: 6aa2 ld s5,8(sp) + 5344: 6b02 ld s6,0(sp) + 5346: b7f5 j 5332 diff --git a/G12_Project2_2/user/usertests.c b/G12_Project2_2/user/usertests.c new file mode 100644 index 0000000000..214936df80 --- /dev/null +++ b/G12_Project2_2/user/usertests.c @@ -0,0 +1,3248 @@ +#include "kernel/param.h" +#include "kernel/types.h" +#include "kernel/stat.h" +#include "user/user.h" +#include "kernel/fs.h" +#include "kernel/fcntl.h" +#include "kernel/syscall.h" +#include "kernel/memlayout.h" +#include "kernel/riscv.h" + +// +// Tests xv6 system calls. usertests without arguments runs them all +// and usertests runs 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 BUFSZ ((MAXOPBLOCKS+2)*BSIZE) + +char buf[BUFSZ]; + +// +// Section with tests that run fairly quickly. Use -q if you want to +// run just those. Without -q usertests also runs the ones that take a +// fair amount of time. +// + +// what if you pass ridiculous pointers to system calls +// that read user memory with copyin? +void +copyin(char *s) +{ + uint64 addrs[] = { 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 0xffffffffffffffff }; + + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); 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", (void*)addr, n); + exit(1); + } + close(fd); + unlink("copyin1"); + + n = write(1, (char*)addr, 8192); + if(n > 0){ + printf("write(1, %p, 8192) returned %d, not -1 or 0\n", (void*)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", (void*)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[] = { 0LL, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 0xffffffffffffffff }; + + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); 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", (void*)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", (void*)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, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 0xffffffffffffffff }; + + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); 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", (void*)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 = unlink(b); + if(ret != -1){ + printf("unlink(%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 = unlink(b); + if(ret != -1){ + printf("unlink(%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); + } +} + +// See if the kernel refuses to read/write user memory that the +// application doesn't have anymore, because it returned it. +void +rwsbrk(char *s) +{ + int fd, n; + + uint64 a = (uint64) sbrk(8192); + + if(a == (uint64) SBRK_ERROR) { + printf("sbrk(rwsbrk) failed\n"); + exit(1); + } + + if (sbrk(-8192) == SBRK_ERROR) { + printf("sbrk(rwsbrk) shrink failed\n"); + exit(1); + } + + fd = open("rwsbrk", O_CREATE|O_WRONLY); + if(fd < 0){ + printf("open(rwsbrk) failed\n"); + exit(1); + } + n = write(fd, (void*)(a+PGSIZE), 1024); + if(n >= 0){ + printf("write(fd, %p, 1024) returned %d, not -1\n", (void*)a+PGSIZE, n); + exit(1); + } + close(fd); + unlink("rwsbrk"); + + fd = open("README", O_RDONLY); + if(fd < 0){ + printf("open(README) failed\n"); + exit(1); + } + n = read(fd, (void*)(a+PGSIZE), 10); + if(n >= 0){ + printf("read(fd, %p, 10) returned %d, not -1\n", (void*)a+PGSIZE, n); + exit(1); + } + close(fd); + + exit(0); +} + +// test O_TRUNC. +void +truncate1(char *s) +{ + char buf[32]; + + unlink("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); + } + + unlink("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) +{ + unlink("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); + } + + unlink("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); + unlink("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(unlink("../iputdir") < 0){ + printf("%s: unlink ../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(unlink("../iputdir") < 0){ + printf("%s: unlink ../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); + } + pause(1); + if(unlink("oidir") != 0){ + printf("%s: unlink 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", s, i); + exit(1); + } + if(write(fd, "bbbbbbbbbb", SZ) != SZ){ + printf("%s: error: write bb %d new file failed\n", s, 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(unlink("small") < 0){ + printf("%s: unlink 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 i=%d\n", s, 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){ + printf("%s: read only %d blocks from big", s, n); + exit(1); + } + break; + } else if(i != BSIZE){ + printf("%s: read failed %d\n", s, i); + exit(1); + } + if(((int*)buf)[0] != n){ + printf("%s: read content of block %d is %d\n", s, + n, ((int*)buf)[0]); + exit(1); + } + n++; + } + close(fd); + if(unlink("big") < 0){ + printf("%s: unlink big failed\n", s); + exit(1); + } +} + +// many creates, followed by unlink test +void +createtest(char *s) +{ + int i, fd; + enum { N=52 }; + + char name[3]; + 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; + unlink(name); + } +} + +void dirtest(char *s) +{ + 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(unlink("dir0") < 0){ + printf("%s: unlink dir0 failed\n", s); + exit(1); + } +} + +void +exectest(char *s) +{ + int fd, xstatus, pid; + char *echoargv[] = { "echo", "OK", 0 }; + char buf[3]; + + unlink("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); + } + unlink("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", s, total); + exit(1); + } + close(fds[0]); + wait(&xstatus); + exit(xstatus); + } else { + printf("%s: fork() failed\n", s); + exit(1); + } +} + + +// test if child is killed (status = -1) +void +killstatus(char *s) +{ + int xst; + + for(int i = 0; i < 100; i++){ + int pid1 = fork(); + if(pid1 < 0){ + printf("%s: fork failed\n", s); + exit(1); + } + if(pid1 == 0){ + while(1) { + getpid(); + } + exit(0); + } + pause(1); + kill(pid1); + wait(&xst); + if(xst != -1) { + printf("%s: status should be -1\n", s); + exit(1); + } + } + exit(0); +} + +// 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", s); + 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", s); + close(pfds[1]); + for(;;) + ; + } + + close(pfds[1]); + if(read(pfds[0], buf, sizeof(buf)) != 1){ + printf("%s: preempt read error", s); + 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) +{ + unlink("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); + } + + pause(20); // two seconds + close(open("stopforking", O_CREATE|O_RDWR)); + wait(0); + pause(10); // one second +} + +// 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("%s: 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]; + + unlink("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); + unlink("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]; + unlink(fname); + + pid = fork(); + if(pid < 0){ + printf("%s: fork failed\n", s); + exit(1); + } + + if(pid == 0){ + fd = open(fname, O_CREATE | O_RDWR); + if(fd < 0){ + printf("%s: 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("%s: wrong char\n", s); + exit(1); + } + } + total += n; + } + close(fd); + if(total != N*SZ){ + printf("wrong length %d\n", total); + exit(1); + } + unlink(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]; + + for(pi = 0; pi < NCHILD; pi++){ + pid = fork(); + if(pid < 0){ + printf("%s: 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; + fd = open(name, O_CREATE | O_RDWR); + if(fd < 0){ + printf("%s: create failed\n", s); + exit(1); + } + close(fd); + if(i > 0 && (i % 2 ) == 0){ + name[1] = '0' + (i / 2); + if(unlink(name) < 0){ + printf("%s: unlink 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; + 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; + unlink(name); + } + } +} + +// can I unlink a file and still read it? +void +unlinkread(char *s) +{ + enum { SZ = 5 }; + int fd, fd1; + + fd = open("unlinkread", O_CREATE | O_RDWR); + if(fd < 0){ + printf("%s: create unlinkread failed\n", s); + exit(1); + } + write(fd, "hello", SZ); + close(fd); + + fd = open("unlinkread", O_RDWR); + if(fd < 0){ + printf("%s: open unlinkread failed\n", s); + exit(1); + } + if(unlink("unlinkread") != 0){ + printf("%s: unlink unlinkread failed\n", s); + exit(1); + } + + fd1 = open("unlinkread", O_CREATE | O_RDWR); + write(fd1, "yyy", 3); + close(fd1); + + if(read(fd, buf, sizeof(buf)) != SZ){ + printf("%s: unlinkread read failed", s); + exit(1); + } + if(buf[0] != 'h'){ + printf("%s: unlinkread wrong data\n", s); + exit(1); + } + if(write(fd, buf, 10) != 10){ + printf("%s: unlinkread write failed\n", s); + exit(1); + } + close(fd); + unlink("unlinkread"); +} + +void +linktest(char *s) +{ + enum { SZ = 5 }; + int fd; + + unlink("lf1"); + unlink("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); + } + unlink("lf1"); + + if(open("lf1", 0) >= 0){ + printf("%s: unlinked 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); + } + + unlink("lf2"); + if(link("lf2", "lf1") >= 0){ + printf("%s: link non-existent succeeded! oops\n", s); + exit(1); + } + + if(link(".", "lf1") >= 0){ + printf("%s: link . lf1 succeeded! oops\n", s); + exit(1); + } +} + +// test concurrent create/link/unlink 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; + unlink(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 { + unlink(file); + unlink(file); + unlink(file); + unlink(file); + unlink(file); + unlink(file); + } + if(pid == 0) + exit(0); + else + wait(0); + } +} + +// another concurrent link/unlink/create test, +// to look for deadlocks. +void +linkunlink(char *s) +{ + int pid, i; + + unlink("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 { + unlink("x"); + } + } + + if(pid) + wait(0); + else + exit(0); +} + + +void +subdir(char *s) +{ + int fd, cc; + + unlink("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(unlink("dd") >= 0){ + printf("%s: unlink dd (non-empty dir) succeeded!\n", s); + exit(1); + } + + if(mkdir("/dd/dd") != 0){ + printf("%s: 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("%s: link dd/dd/ff dd/dd/ffff failed\n", s); + exit(1); + } + + if(unlink("dd/dd/ff") != 0){ + printf("%s: unlink dd/dd/ff failed\n", s); + exit(1); + } + if(open("dd/dd/ff", O_RDONLY) >= 0){ + printf("%s: open (unlinked) 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("%s: 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 (unlinked) 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(unlink("dd/xx/ff") == 0){ + printf("%s: unlink dd/xx/ff succeeded!\n", s); + exit(1); + } + if(unlink("dd/ff/ff") == 0){ + printf("%s: unlink 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(unlink("dd/dd/ffff") != 0){ + printf("%s: unlink dd/dd/ff failed\n", s); + exit(1); + } + if(unlink("dd/ff") != 0){ + printf("%s: unlink dd/ff failed\n", s); + exit(1); + } + if(unlink("dd") == 0){ + printf("%s: unlink non-empty dd succeeded!\n", s); + exit(1); + } + if(unlink("dd/dd") < 0){ + printf("%s: unlink dd/dd failed\n", s); + exit(1); + } + if(unlink("dd") < 0){ + printf("%s: unlink dd failed\n", s); + exit(1); + } +} + +// test writes that are larger than the log. +void +bigwrite(char *s) +{ + int fd, sz; + + unlink("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); + unlink("bigwrite"); + } +} + + +void +bigfile(char *s) +{ + enum { N = 20, SZ=600 }; + int fd, i, total, cc; + + unlink("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); + } + unlink("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 + unlink("123456789012345/12345678901234"); + unlink("12345678901234/12345678901234"); + unlink("12345678901234/12345678901234/12345678901234"); + unlink("123456789012345/123456789012345/123456789012345"); + unlink("12345678901234/123456789012345"); + unlink("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(unlink(".") == 0){ + printf("%s: rm . worked!\n", s); + exit(1); + } + if(unlink("..") == 0){ + printf("%s: rm .. worked!\n", s); + exit(1); + } + if(chdir("/") != 0){ + printf("%s: chdir / failed\n", s); + exit(1); + } + if(unlink("dots/.") == 0){ + printf("%s: unlink dots/. worked!\n", s); + exit(1); + } + if(unlink("dots/..") == 0){ + printf("%s: unlink dots/.. worked!\n", s); + exit(1); + } + if(unlink("dots") != 0){ + printf("%s: unlink 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(unlink("dirfile/xx") == 0){ + printf("%s: unlink 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(unlink("dirfile") != 0){ + printf("%s: unlink 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 + 1; 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); + unlink("xx"); + } + + // clean up + for(i = 0; i < NINODE + 1; i++){ + chdir(".."); + unlink("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 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*)SBRK_ERROR){ + // it's OK if this fails. + exit(0); + } + + for(b = a; b < a+TOOMUCH; b += PGSIZE){ + *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 %p %p\n", s, 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=100*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); + } + + lastaddr = (char*) (BIG-1); + *lastaddr = 99; + + // can one de-allocate? + a = sbrk(0); + c = sbrk(-PGSIZE); + if(c == (char*)SBRK_ERROR){ + 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 %p c %p\n", s, 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 %p c %p\n", s, 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 %p c %p\n", s, 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 %p = %x\n", s, a, *a); + exit(1); + } + int xstatus; + wait(&xstatus); + if(xstatus != -1) // did kernel kill child? + exit(1); + } +} + +// user code should not be able to write to addresses above MAXVA. +void +MAXVAplus(char *s) +{ + volatile uint64 a = MAXVA; + for( ; a != 0; a <<= 1){ + int pid; + pid = fork(); + if(pid < 0){ + printf("%s: fork failed\n", s); + exit(1); + } + if(pid == 0){ + *(char*)a = 99; + printf("%s: oops wrote %p\n", s, (void*)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; + int failed; + + failed = 0; + 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 + if (sbrk(BIG - (uint64)sbrk(0)) == (char*)SBRK_ERROR) + write(fds[1], "0", 1); + else + write(fds[1], "1", 1); + // sit around until killed + for(;;) pause(1000); + } + if(pids[i] != -1) { + read(fds[0], &scratch, 1); + if(scratch == '0') + failed = 1; + } + } + if(!failed) { + printf("%s: no allocation failed; allocate more?\n", s); + } + + // 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*)SBRK_ERROR){ + 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 an error + a = sbrk(10*BIG); + if(a == (char*)SBRK_ERROR){ + exit(0); + } + printf("%s: allocate a lot of memory succeeded %d\n", s, 10*BIG); + exit(1); + } + wait(&xstatus); + if(xstatus != 0) + 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); + unlink("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(link("nosuchfile", (char*)p) != -1){ + printf("%s: link should not succeed\n", s); + exit(1); + } + } +} + +// does uninitialized 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; + + unlink("bigarg-ok"); + pid = fork(); + if(pid == 0){ + static char *args[MAXARG]; + int i; + char big[400]; + memset(big, ' ', sizeof(big)); + big[sizeof(big)-1] = '\0'; + for(i = 0; i < MAXARG-1; i++) + args[i] = big; + args[MAXARG-1] = 0; + // this exec() should fail (and return) because the + // arguments are too large. + 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); +} + +// 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("writing %s\n", name); + int fd = open(name, O_CREATE|O_RDWR); + if(fd < 0){ + printf("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("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'; + unlink(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); +} + +// 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 -= USERSTACK*PGSIZE; + // the *sp should cause a trap. + printf("%s: stacktest: read below stack %d\n", s, *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); +} + +// check that writes to a few forbidden addresses +// cause a fault, e.g. process's text and TRAMPOLINE. +void +nowrite(char *s) +{ + int pid; + int xstatus; + uint64 addrs[] = { 0, 0x80000000LL, 0x3fffffe000, 0x3ffffff000, 0x4000000000, + 0xffffffffffffffff }; + + for(int ai = 0; ai < sizeof(addrs)/sizeof(addrs[0]); ai++){ + pid = fork(); + if(pid == 0) { + volatile int *addr = (int *) addrs[ai]; + *addr = 10; + printf("%s: write to %p did not fail!\n", s, addr); + exit(0); + } else if(pid < 0){ + printf("%s: fork failed\n", s); + exit(1); + } + wait(&xstatus); + if(xstatus == 0){ + // kernel did not kill child! + exit(1); + } + } + exit(0); +} + +// 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 *big = (void*) 0xeaeb0b5b00002f5e; +void +pgbug(char *s) +{ + char *argv[1]; + argv[0] = 0; + exec(big, argv); + pipe(big); + + 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*PGSIZE + 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); +} + +// if process size was somewhat more than a page boundary, and then +// shrunk to be somewhat less than that page boundary, can the kernel +// still copyin() from addresses in the last page? +void +sbrklast(char *s) +{ + uint64 top = (uint64) sbrk(0); + if((top % PGSIZE) != 0) + sbrk(PGSIZE - (top % PGSIZE)); + sbrk(PGSIZE); + sbrk(10); + sbrk(-20); + top = (uint64) sbrk(0); + char *p = (char *) (top - 64); + p[0] = 'x'; + p[1] = '\0'; + int fd = open(p, O_RDWR|O_CREATE); + write(fd, p, 1); + close(fd); + fd = open(p, O_RDWR); + p[0] = '\0'; + read(fd, p, 1); + if(p[0] != 'x') + exit(1); +} + + +// does sbrk handle signed int32 wrap-around with +// negative arguments? +void +sbrk8000(char *s) +{ + sbrk(0x80000004); + volatile char *top = sbrk(0); + *(top-1) = *(top-1) + 1; +} + + + +// 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); +} + +#define REGION_SZ (1024 * 1024 * 1024) + +// Touch a page every 64 pages, which with lazy allocation +// causes one page to be allocated. +void +lazy_alloc(char *s) +{ + char *i, *prev_end, *new_end; + + prev_end = sbrklazy(REGION_SZ); + if (prev_end == (char *) SBRK_ERROR) { + printf("sbrklazy() failed\n"); + exit(1); + } + new_end = prev_end + REGION_SZ; + + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) + *(char **)i = i; + + for (i = prev_end + PGSIZE; i < new_end; i += 64 * PGSIZE) { + if (*(char **)i != i) { + printf("failed to read value from memory\n"); + exit(1); + } + } + + exit(0); +} + +// Touch a page every 64 pages in region, which with lazy allocation +// causes one page to be allocated. Check that freeing the region +// frees the allocated pages. +void +lazy_unmap(char *s) +{ + int pid; + char *i, *prev_end, *new_end; + + prev_end = sbrklazy(REGION_SZ); + if (prev_end == (char*)SBRK_ERROR) { + printf("sbrklazy() failed\n"); + exit(1); + } + new_end = prev_end + REGION_SZ; + + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) + *(char **)i = i; + + for (i = prev_end + PGSIZE; i < new_end; i += PGSIZE * PGSIZE) { + pid = fork(); + if (pid < 0) { + printf("error forking\n"); + exit(1); + } else if (pid == 0) { + sbrklazy(-1L * REGION_SZ); + *(char **)i = i; + exit(0); + } else { + int status; + wait(&status); + if (status == 0) { + printf("memory not unmapped\n"); + exit(1); + } + } + } + + exit(0); +} + +void +lazy_copy(char *s) +{ + // copyinstr on lazy page + { + char *p = sbrk(0); + sbrklazy(4*PGSIZE); + open(p + 8192, 0); + } + + { + void *xx = sbrk(0); + void *ret = sbrk(-(((uint64) xx)+1)); + if(ret != xx){ + printf("sbrk(sbrk(0)+1) returned %p, not old sz\n", ret); + exit(1); + } + } + + + // read() and write() to these addresses should fail. + unsigned long bad[] = { + 0x3fffffc000, + 0x3fffffd000, + 0x3fffffe000, + 0x3ffffff000, + 0x4000000000, + 0x8000000000, + }; + for(int i = 0; i < sizeof(bad)/sizeof(bad[0]); i++){ + int fd = open("README", 0); + if(fd < 0) { printf("cannot open README\n"); exit(1); } + if(read(fd, (char*)bad[i], 512) >= 0) { printf("read succeeded\n"); exit(1); } + close(fd); + fd = open("junk", O_CREATE|O_RDWR|O_TRUNC); + if(fd < 0) { printf("cannot open junk\n"); exit(1); } + if(write(fd, (char*)bad[i], 512) >= 0) { printf("write succeeded\n"); exit(1); } + close(fd); + } + + exit(0); +} + +void +lazy_sbrk(char *s) +{ + // sbrk() takes just int, so take 2^30-sized steps towards MAXVA + char *p = sbrk(0); + while ((uint64)p < MAXVA-(1<<30)) { + p = sbrklazy(1<<30); + if (p < 0) { + printf("sbrklazy(%d) returned %p\n", 1<<30, p); + exit(1); + } + + p = sbrklazy(0); + } + + int n = TRAPFRAME-PGSIZE-(uint64)p; + + char *p1 = sbrklazy(n); + if (p1 < 0 || p1 != p) { + printf("sbrklazy(%d) returned %p, not expected %p\n", n, p1, p); + exit(1); + } + + p = sbrk(PGSIZE); + if (p < 0 || (uint64)p != TRAPFRAME-PGSIZE) { + printf("sbrk(%d) returned %p, not expected TRAPFRAME-PGSIZE\n", PGSIZE, p); + exit(1); + } + + p[0] = 1; + if (p[1] != 0) { + printf("sbrk() returned non-zero-filled memory\n"); + exit(1); + } + + p = sbrk(1); + if ((uint64)p != -1) { + printf("sbrk(1) returned %p, expected error\n", p); + exit(1); + } + + p = sbrklazy(1); + if ((uint64)p != -1) { + printf("sbrklazy(1) returned %p, expected error\n", p); + exit(1); + } + + exit(0); +} + +struct test { + void (*f)(char *); + char *s; +} quicktests[] = { + {copyin, "copyin"}, + {copyout, "copyout"}, + {copyinstr1, "copyinstr1"}, + {copyinstr2, "copyinstr2"}, + {copyinstr3, "copyinstr3"}, + {rwsbrk, "rwsbrk" }, + {truncate1, "truncate1"}, + {truncate2, "truncate2"}, + {truncate3, "truncate3"}, + {openiputtest, "openiput"}, + {exitiputtest, "exitiput"}, + {iputtest, "iput"}, + {opentest, "opentest"}, + {writetest, "writetest"}, + {writebig, "writebig"}, + {createtest, "createtest"}, + {dirtest, "dirtest"}, + {exectest, "exectest"}, + {pipe1, "pipe1"}, + {killstatus, "killstatus"}, + {preempt, "preempt"}, + {exitwait, "exitwait"}, + {reparent, "reparent" }, + {twochildren, "twochildren"}, + {forkfork, "forkfork"}, + {forkforkfork, "forkforkfork"}, + {reparent2, "reparent2"}, + {mem, "mem"}, + {sharedfd, "sharedfd"}, + {fourfiles, "fourfiles"}, + {createdelete, "createdelete"}, + {unlinkread, "unlinkread"}, + {linktest, "linktest"}, + {concreate, "concreate"}, + {linkunlink, "linkunlink"}, + {subdir, "subdir"}, + {bigwrite, "bigwrite"}, + {bigfile, "bigfile"}, + {fourteen, "fourteen"}, + {rmdot, "rmdot"}, + {dirfile, "dirfile"}, + {iref, "iref"}, + {forktest, "forktest"}, + {sbrkbasic, "sbrkbasic"}, + {sbrkmuch, "sbrkmuch"}, + {kernmem, "kernmem"}, + {MAXVAplus, "MAXVAplus"}, + {sbrkfail, "sbrkfail"}, + {sbrkarg, "sbrkarg"}, + {validatetest, "validatetest"}, + {bsstest, "bsstest"}, + {bigargtest, "bigargtest"}, + {argptest, "argptest"}, + {stacktest, "stacktest"}, + {nowrite, "nowrite"}, + {pgbug, "pgbug" }, + {sbrkbugs, "sbrkbugs" }, + {sbrklast, "sbrklast"}, + {sbrk8000, "sbrk8000"}, + {badarg, "badarg" }, + {lazy_alloc, "lazy_alloc"}, + {lazy_unmap, "lazy_unmap"}, + {lazy_copy, "lazy_copy"}, + {lazy_sbrk, "lazy_sbrk"}, + { 0, 0}, +}; + +// +// Section with tests that take a fair bit of time +// + +// directory that uses indirect blocks +void +bigdir(char *s) +{ + enum { N = 500 }; + int i, fd; + char name[10]; + + unlink("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 i=%d link(bd, %s) failed\n", s, i, name); + exit(1); + } + } + + unlink("bd"); + for(i = 0; i < N; i++){ + name[0] = 'x'; + name[1] = '0' + (i / 64); + name[2] = '0' + (i % 64); + name[3] = '\0'; + if(unlink(name) != 0){ + printf("%s: bigdir unlink failed", s); + exit(1); + } + } +} + +// concurrent writes to try to provoke deadlock in the virtio disk +// driver. +void +manywrites(char *s) +{ + int nchildren = 4; + int howmany = 30; // increase to look for deadlock + + for(int ci = 0; ci < nchildren; ci++){ + int pid = fork(); + if(pid < 0){ + printf("fork failed\n"); + exit(1); + } + + if(pid == 0){ + char name[3]; + name[0] = 'b'; + name[1] = 'a' + ci; + name[2] = '\0'; + unlink(name); + + for(int iters = 0; iters < howmany; iters++){ + for(int i = 0; i < ci+1; i++){ + int fd = open(name, O_CREATE | O_RDWR); + if(fd < 0){ + printf("%s: cannot create %s\n", s, name); + exit(1); + } + int sz = sizeof(buf); + int cc = write(fd, buf, sz); + if(cc != sz){ + printf("%s: write(%d) ret %d\n", s, sz, cc); + exit(1); + } + close(fd); + } + unlink(name); + } + + unlink(name); + exit(0); + } + } + + for(int ci = 0; ci < nchildren; ci++){ + int st = 0; + wait(&st); + if(st != 0) + exit(st); + } + 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; + + unlink("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); + unlink("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); + unlink("junk"); + + 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){ + char *a = sbrk(PGSIZE); + if(a == SBRK_ERROR) + break; + *(a + PGSIZE - 1) = 1; + } + + // free a few pages, in order to let exec() make some + // progress. + for(int i = 0; i < avail; i++) + sbrk(-PGSIZE); + + close(1); + char *args[] = { "echo", "x", 0 }; + exec("echo", args); + exit(0); + } else { + wait((int*)0); + } + } + + exit(0); +} + +// can the kernel tolerate running out of disk space? +void +diskfull(char *s) +{ + int fi; + int done = 0; + + unlink("diskfulldir"); + + for(fi = 0; done == 0 && '0' + fi < 0177; fi++){ + char name[32]; + name[0] = 'b'; + name[1] = 'i'; + name[2] = 'g'; + name[3] = '0' + fi; + name[4] = '\0'; + unlink(name); + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + if(fd < 0){ + // oops, ran out of inodes before running out of blocks. + printf("%s: could not create file %s\n", s, name); + done = 1; + break; + } + for(int i = 0; i < MAXFILE; i++){ + char buf[BSIZE]; + if(write(fd, buf, BSIZE) != BSIZE){ + done = 1; + close(fd); + break; + } + } + close(fd); + } + + // now that there are no free blocks, test that dirlink() + // merely fails (doesn't panic) if it can't extend + // directory content. one of these file creations + // is expected to fail. + int nzz = 128; + for(int i = 0; i < nzz; i++){ + char name[32]; + name[0] = 'z'; + name[1] = 'z'; + name[2] = '0' + (i / 32); + name[3] = '0' + (i % 32); + name[4] = '\0'; + unlink(name); + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + if(fd < 0) + break; + close(fd); + } + + // this mkdir() is expected to fail. + if(mkdir("diskfulldir") == 0) + printf("%s: mkdir(diskfulldir) unexpectedly succeeded!\n", s); + + unlink("diskfulldir"); + + for(int i = 0; i < nzz; i++){ + char name[32]; + name[0] = 'z'; + name[1] = 'z'; + name[2] = '0' + (i / 32); + name[3] = '0' + (i % 32); + name[4] = '\0'; + unlink(name); + } + + for(int i = 0; '0' + i < 0177; i++){ + char name[32]; + name[0] = 'b'; + name[1] = 'i'; + name[2] = 'g'; + name[3] = '0' + i; + name[4] = '\0'; + unlink(name); + } +} + +void +outofinodes(char *s) +{ + int nzz = 32*32; + for(int i = 0; i < nzz; i++){ + char name[32]; + name[0] = 'z'; + name[1] = 'z'; + name[2] = '0' + (i / 32); + name[3] = '0' + (i % 32); + name[4] = '\0'; + unlink(name); + int fd = open(name, O_CREATE|O_RDWR|O_TRUNC); + if(fd < 0){ + // failure is eventually expected. + break; + } + close(fd); + } + + for(int i = 0; i < nzz; i++){ + char name[32]; + name[0] = 'z'; + name[1] = 'z'; + name[2] = '0' + (i / 32); + name[3] = '0' + (i % 32); + name[4] = '\0'; + unlink(name); + } +} + +struct test slowtests[] = { + {bigdir, "bigdir"}, + {manywrites, "manywrites"}, + {badwrite, "badwrite" }, + {execout, "execout"}, + {diskfull, "diskfull"}, + {outofinodes, "outofinodes"}, + + { 0, 0}, +}; + +// +// drive tests +// + +// 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 +runtests(struct test *tests, char *justone, int continuous) { + int ntests = 0; + for (struct test *t = tests; t->s != 0; t++) { + if((justone == 0) || strcmp(t->s, justone) == 0) { + ntests++; + if(!run(t->f, t->s)){ + if(continuous != 2){ + printf("SOME TESTS FAILED\n"); + return -1; + } + } + } + } + return ntests; +} + + +// use sbrk() to count how many free physical memory pages there are. +int +countfree() +{ + int n = 0; + uint64 sz0 = (uint64)sbrk(0); + while(1){ + char *a = sbrk(PGSIZE); + if(a == SBRK_ERROR){ + break; + } + n += 1; + } + sbrk(-((uint64)sbrk(0) - sz0)); + return n; +} + +int +drivetests(int quick, int continuous, char *justone) { + do { + printf("usertests starting\n"); + int free0 = countfree(); + int free1 = 0; + int ntests = 0; + int n; + n = runtests(quicktests, justone, continuous); + if (n < 0) { + if(continuous != 2) { + return 1; + } + } else { + ntests += n; + } + if(!quick) { + if (justone == 0) + printf("usertests slow tests starting\n"); + n = runtests(slowtests, justone, continuous); + if (n < 0) { + if(continuous != 2) { + return 1; + } + } else { + ntests += n; + } + } + if((free1 = countfree()) < free0) { + printf("FAILED -- lost some free pages %d (out of %d)\n", free1, free0); + if(continuous != 2) { + return 1; + } + } + if (justone != 0 && ntests == 0) { + printf("NO TESTS EXECUTED\n"); + return 1; + } + } while(continuous); + return 0; +} + +int +main(int argc, char *argv[]) +{ + int continuous = 0; + int quick = 0; + char *justone = 0; + + if(argc == 2 && strcmp(argv[1], "-q") == 0){ + quick = 1; + } else 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] [-C] [-q] [testname]\n"); + exit(1); + } + if (drivetests(quick, continuous, justone)) { + exit(1); + } + printf("ALL TESTS PASSED\n"); + exit(0); +} diff --git a/G12_Project2_2/user/usertests.d b/G12_Project2_2/user/usertests.d new file mode 100644 index 0000000000..c76551d18b --- /dev/null +++ b/G12_Project2_2/user/usertests.d @@ -0,0 +1,3 @@ +user/usertests.o: user/usertests.c kernel/param.h kernel/types.h \ + kernel/stat.h user/user.h kernel/fs.h kernel/fcntl.h kernel/syscall.h \ + kernel/memlayout.h kernel/riscv.h diff --git a/G12_Project2_2/user/usertests.o b/G12_Project2_2/user/usertests.o new file mode 100644 index 0000000000..11f1938209 Binary files /dev/null and b/G12_Project2_2/user/usertests.o differ diff --git a/G12_Project2_2/user/usertests.sym b/G12_Project2_2/user/usertests.sym new file mode 100644 index 0000000000..d310f49e77 --- /dev/null +++ b/G12_Project2_2/user/usertests.sym @@ -0,0 +1,147 @@ +0000000000000000 .text +0000000000005348 .rodata +0000000000007990 .eh_frame +0000000000009000 .data +0000000000009490 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_ranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 usertests.c +00000000000095a0 big.0 +00000000000094a0 args.1 +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000004e14 putc +0000000000004e32 printint +0000000000007978 digits +0000000000000000 umalloc.c +0000000000009490 freep +000000000000fcb8 base +00000000000009be writebig +00000000000025b0 sbrk8000 +0000000000004af0 strcpy +0000000000001650 exitwait +0000000000001db6 manywrites +0000000000004e04 pause +000000000000519c printf +0000000000004dfc sys_sbrk +00000000000003be outofinodes +000000000000426a bigargtest +0000000000004c9a memmove +0000000000003580 openiputtest +0000000000004dbc mknod +0000000000003886 reparent +0000000000004ba8 gets +000000000000445e lazy_copy +0000000000004df4 getpid +00000000000014b4 pipe1 +0000000000004d2c memcpy +0000000000003486 iref +0000000000000fd4 pgbug +0000000000001d12 nowrite +0000000000005250 malloc +00000000000005aa copyout +0000000000001cae stacktest +00000000000025de execout +0000000000002452 sbrkbugs +0000000000002a70 exitiputtest +0000000000004686 fsfull +0000000000000e9e bigdir +0000000000001ae4 forktest +0000000000004d56 sbrklazy +0000000000001fce rwsbrk +00000000000011dc truncate3 +000000000000022c bigwrite +0000000000003b02 sharedfd +0000000000004d84 pipe +00000000000036d0 killstatus +000000000000a5a8 uninit +00000000000032d6 dirfile +0000000000004d94 write +0000000000000078 bsstest +0000000000004dcc fstat +0000000000005172 fprintf +0000000000004da4 kill +00000000000027b6 diskfull +0000000000000e3c validatetest +0000000000009010 quicktests +00000000000031b0 rmdot +000000000000047e copyin +0000000000004ece vprintf +0000000000000118 truncate2 +0000000000004de4 chdir +0000000000009000 big +000000000000133e exectest +0000000000004dac exec +00000000000002ee badwrite +0000000000004d7c wait +0000000000004d8c read +0000000000004596 lazy_sbrk +00000000000043b2 lazy_unmap +000000000000374a preempt +0000000000004dc4 unlink +0000000000001000 badarg +00000000000023f8 argptest +0000000000003a8a mem +000000000000487a runtests +0000000000004cf2 memcmp +0000000000004d6c fork +000000000000250e sbrklast +0000000000001eca copyinstr3 +0000000000001752 forkfork +0000000000004d40 sbrk +0000000000009420 slowtests +0000000000004e0c uptime +00000000000016e0 twochildren +0000000000001c1c MAXVAplus +0000000000004b62 memset +0000000000001b8c kernmem +00000000000001b8 createtest +0000000000004a2e main +0000000000001830 createdelete +0000000000003632 forkforkfork +0000000000003906 sbrkfail +0000000000004b0c strcmp +000000000000087e writetest +0000000000004dec dup +00000000000006e0 truncate1 +00000000000000b2 opentest +00000000000047fc run +0000000000004348 lazy_alloc +0000000000002bc2 subdir +000000000000103e copyinstr2 +0000000000000c74 linktest +000000000000ccb8 buf +0000000000002b1c dirtest +0000000000004932 drivetests +0000000000002354 sbrkarg +00000000000029ca iputtest +0000000000004c18 stat +00000000000040e6 bigfile +00000000000048ec countfree +0000000000000b1e unlinkread +0000000000004dd4 link +0000000000004d74 exit +0000000000004ae0 start +0000000000004c52 atoi +0000000000000000 copyinstr1 +0000000000001a08 linkunlink +00000000000020d4 sbrkbasic +0000000000004b38 strlen +0000000000004db4 open +0000000000004b84 strchr +0000000000003e42 concreate +000000000000267a fourteen +0000000000003c6e fourfiles +0000000000002216 sbrkmuch +0000000000004ddc mkdir +0000000000004d9c close +00000000000017e8 reparent2 +00000000000051ce free diff --git a/G12_Project2_2/user/usys.S b/G12_Project2_2/user/usys.S new file mode 100644 index 0000000000..ee3f2e75f3 --- /dev/null +++ b/G12_Project2_2/user/usys.S @@ -0,0 +1,107 @@ +# generated by usys.pl - do not edit +#include "kernel/syscall.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 mknod +mknod: + li a7, SYS_mknod + ecall + ret +.global unlink +unlink: + li a7, SYS_unlink + ecall + ret +.global fstat +fstat: + li a7, SYS_fstat + ecall + ret +.global link +link: + li a7, SYS_link + 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 sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + ecall + ret +.global pause +pause: + li a7, SYS_pause + ecall + ret +.global uptime +uptime: + li a7, SYS_uptime + ecall + ret diff --git a/G12_Project2_2/user/usys.d b/G12_Project2_2/user/usys.d new file mode 100644 index 0000000000..80c63fdf89 --- /dev/null +++ b/G12_Project2_2/user/usys.d @@ -0,0 +1 @@ +user/usys.o: user/usys.S kernel/syscall.h diff --git a/G12_Project2_2/user/usys.o b/G12_Project2_2/user/usys.o new file mode 100644 index 0000000000..2e361923d9 Binary files /dev/null and b/G12_Project2_2/user/usys.o differ diff --git a/user/usys.pl b/G12_Project2_2/user/usys.pl similarity index 100% rename from user/usys.pl rename to G12_Project2_2/user/usys.pl diff --git a/G12_Project2_2/user/wc.asm b/G12_Project2_2/user/wc.asm new file mode 100644 index 0000000000..ae9cda5958 --- /dev/null +++ b/G12_Project2_2/user/wc.asm @@ -0,0 +1,1642 @@ + +user/_wc: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 : + +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: 4901 li s2,0 + l = w = c = 0; + 28: 4d01 li s10,0 + 2a: 4c81 li s9,0 + 2c: 4c01 li s8,0 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 2e: 00001d97 auipc s11,0x1 + 32: fe2d8d93 addi s11,s11,-30 # 1010 + for(i=0; i + inword = 0; + 40: 4b81 li s7,0 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 42: a035 j 6e + if(strchr(" \r\t\n\v", buf[i])) + 44: 8552 mv a0,s4 + 46: 1ba000ef jal 200 + 4a: c919 beqz a0,60 + inword = 0; + 4c: 895e mv s2,s7 + for(i=0; i + if(buf[i] == '\n') + 54: 0004c583 lbu a1,0(s1) + 58: ff5596e3 bne a1,s5,44 + l++; + 5c: 2c05 addiw s8,s8,1 + 5e: b7dd j 44 + else if(!inword){ + 60: fe0917e3 bnez s2,4e + w++; + 64: 2c85 addiw s9,s9,1 + inword = 1; + 66: 4905 li s2,1 + 68: b7dd j 4e + 6a: 01ab0d3b addw s10,s6,s10 + while((n = read(fd, buf, sizeof(buf))) > 0){ + 6e: 20000613 li a2,512 + 72: 85ee mv a1,s11 + 74: f8843503 ld a0,-120(s0) + 78: 390000ef jal 408 + 7c: 8b2a mv s6,a0 + 7e: 00a05963 blez a0,90 + for(i=0; i + 8a: 009509b3 add s3,a0,s1 + 8e: b7d9 j 54 + } + } + } + if(n < 0){ + 90: 02054c63 bltz a0,c8 + printf("wc: read error\n"); + exit(1); + } + printf("%d %d %d %s\n", l, w, c, name); + 94: f8043703 ld a4,-128(s0) + 98: 86ea mv a3,s10 + 9a: 8666 mv a2,s9 + 9c: 85e2 mv a1,s8 + 9e: 00001517 auipc a0,0x1 + a2: 95250513 addi a0,a0,-1710 # 9f0 + a6: 772000ef jal 818 +} + aa: 70e6 ld ra,120(sp) + ac: 7446 ld s0,112(sp) + ae: 74a6 ld s1,104(sp) + b0: 7906 ld s2,96(sp) + b2: 69e6 ld s3,88(sp) + b4: 6a46 ld s4,80(sp) + b6: 6aa6 ld s5,72(sp) + b8: 6b06 ld s6,64(sp) + ba: 7be2 ld s7,56(sp) + bc: 7c42 ld s8,48(sp) + be: 7ca2 ld s9,40(sp) + c0: 7d02 ld s10,32(sp) + c2: 6de2 ld s11,24(sp) + c4: 6109 addi sp,sp,128 + c6: 8082 ret + printf("wc: read error\n"); + c8: 00001517 auipc a0,0x1 + cc: 91850513 addi a0,a0,-1768 # 9e0 + d0: 748000ef jal 818 + exit(1); + d4: 4505 li a0,1 + d6: 31a000ef jal 3f0 + +00000000000000da
: + +int +main(int argc, char *argv[]) +{ + da: 7179 addi sp,sp,-48 + dc: f406 sd ra,40(sp) + de: f022 sd s0,32(sp) + e0: 1800 addi s0,sp,48 + int fd, i; + + if(argc <= 1){ + e2: 4785 li a5,1 + e4: 04a7d463 bge a5,a0,12c + e8: ec26 sd s1,24(sp) + ea: e84a sd s2,16(sp) + ec: e44e sd s3,8(sp) + ee: 00858913 addi s2,a1,8 + f2: ffe5099b addiw s3,a0,-2 + f6: 02099793 slli a5,s3,0x20 + fa: 01d7d993 srli s3,a5,0x1d + fe: 05c1 addi a1,a1,16 + 100: 99ae add s3,s3,a1 + wc(0, ""); + exit(0); + } + + for(i = 1; i < argc; i++){ + if((fd = open(argv[i], O_RDONLY)) < 0){ + 102: 4581 li a1,0 + 104: 00093503 ld a0,0(s2) + 108: 328000ef jal 430 + 10c: 84aa mv s1,a0 + 10e: 02054c63 bltz a0,146 + printf("wc: cannot open %s\n", argv[i]); + exit(1); + } + wc(fd, argv[i]); + 112: 00093583 ld a1,0(s2) + 116: eebff0ef jal 0 + close(fd); + 11a: 8526 mv a0,s1 + 11c: 2fc000ef jal 418 + for(i = 1; i < argc; i++){ + 120: 0921 addi s2,s2,8 + 122: ff3910e3 bne s2,s3,102 + } + exit(0); + 126: 4501 li a0,0 + 128: 2c8000ef jal 3f0 + 12c: ec26 sd s1,24(sp) + 12e: e84a sd s2,16(sp) + 130: e44e sd s3,8(sp) + wc(0, ""); + 132: 00001597 auipc a1,0x1 + 136: 8a658593 addi a1,a1,-1882 # 9d8 + 13a: 4501 li a0,0 + 13c: ec5ff0ef jal 0 + exit(0); + 140: 4501 li a0,0 + 142: 2ae000ef jal 3f0 + printf("wc: cannot open %s\n", argv[i]); + 146: 00093583 ld a1,0(s2) + 14a: 00001517 auipc a0,0x1 + 14e: 8b650513 addi a0,a0,-1866 # a00 + 152: 6c6000ef jal 818 + exit(1); + 156: 4505 li a0,1 + 158: 298000ef jal 3f0 + +000000000000015c : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 15c: 1141 addi sp,sp,-16 + 15e: e406 sd ra,8(sp) + 160: e022 sd s0,0(sp) + 162: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 164: f77ff0ef jal da
+ exit(r); + 168: 288000ef jal 3f0 + +000000000000016c : +} + +char* +strcpy(char *s, const char *t) +{ + 16c: 1141 addi sp,sp,-16 + 16e: e422 sd s0,8(sp) + 170: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 172: 87aa mv a5,a0 + 174: 0585 addi a1,a1,1 + 176: 0785 addi a5,a5,1 + 178: fff5c703 lbu a4,-1(a1) + 17c: fee78fa3 sb a4,-1(a5) + 180: fb75 bnez a4,174 + ; + return os; +} + 182: 6422 ld s0,8(sp) + 184: 0141 addi sp,sp,16 + 186: 8082 ret + +0000000000000188 : + +int +strcmp(const char *p, const char *q) +{ + 188: 1141 addi sp,sp,-16 + 18a: e422 sd s0,8(sp) + 18c: 0800 addi s0,sp,16 + while(*p && *p == *q) + 18e: 00054783 lbu a5,0(a0) + 192: cb91 beqz a5,1a6 + 194: 0005c703 lbu a4,0(a1) + 198: 00f71763 bne a4,a5,1a6 + p++, q++; + 19c: 0505 addi a0,a0,1 + 19e: 0585 addi a1,a1,1 + while(*p && *p == *q) + 1a0: 00054783 lbu a5,0(a0) + 1a4: fbe5 bnez a5,194 + return (uchar)*p - (uchar)*q; + 1a6: 0005c503 lbu a0,0(a1) +} + 1aa: 40a7853b subw a0,a5,a0 + 1ae: 6422 ld s0,8(sp) + 1b0: 0141 addi sp,sp,16 + 1b2: 8082 ret + +00000000000001b4 : + +uint +strlen(const char *s) +{ + 1b4: 1141 addi sp,sp,-16 + 1b6: e422 sd s0,8(sp) + 1b8: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 1ba: 00054783 lbu a5,0(a0) + 1be: cf91 beqz a5,1da + 1c0: 0505 addi a0,a0,1 + 1c2: 87aa mv a5,a0 + 1c4: 86be mv a3,a5 + 1c6: 0785 addi a5,a5,1 + 1c8: fff7c703 lbu a4,-1(a5) + 1cc: ff65 bnez a4,1c4 + 1ce: 40a6853b subw a0,a3,a0 + 1d2: 2505 addiw a0,a0,1 + ; + return n; +} + 1d4: 6422 ld s0,8(sp) + 1d6: 0141 addi sp,sp,16 + 1d8: 8082 ret + for(n = 0; s[n]; n++) + 1da: 4501 li a0,0 + 1dc: bfe5 j 1d4 + +00000000000001de : + +void* +memset(void *dst, int c, uint n) +{ + 1de: 1141 addi sp,sp,-16 + 1e0: e422 sd s0,8(sp) + 1e2: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + 1e4: ca19 beqz a2,1fa + 1e6: 87aa mv a5,a0 + 1e8: 1602 slli a2,a2,0x20 + 1ea: 9201 srli a2,a2,0x20 + 1ec: 00a60733 add a4,a2,a0 + cdst[i] = c; + 1f0: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + 1f4: 0785 addi a5,a5,1 + 1f6: fee79de3 bne a5,a4,1f0 + } + return dst; +} + 1fa: 6422 ld s0,8(sp) + 1fc: 0141 addi sp,sp,16 + 1fe: 8082 ret + +0000000000000200 : + +char* +strchr(const char *s, char c) +{ + 200: 1141 addi sp,sp,-16 + 202: e422 sd s0,8(sp) + 204: 0800 addi s0,sp,16 + for(; *s; s++) + 206: 00054783 lbu a5,0(a0) + 20a: cb99 beqz a5,220 + if(*s == c) + 20c: 00f58763 beq a1,a5,21a + for(; *s; s++) + 210: 0505 addi a0,a0,1 + 212: 00054783 lbu a5,0(a0) + 216: fbfd bnez a5,20c + return (char*)s; + return 0; + 218: 4501 li a0,0 +} + 21a: 6422 ld s0,8(sp) + 21c: 0141 addi sp,sp,16 + 21e: 8082 ret + return 0; + 220: 4501 li a0,0 + 222: bfe5 j 21a + +0000000000000224 : + +char* +gets(char *buf, int max) +{ + 224: 711d addi sp,sp,-96 + 226: ec86 sd ra,88(sp) + 228: e8a2 sd s0,80(sp) + 22a: e4a6 sd s1,72(sp) + 22c: e0ca sd s2,64(sp) + 22e: fc4e sd s3,56(sp) + 230: f852 sd s4,48(sp) + 232: f456 sd s5,40(sp) + 234: f05a sd s6,32(sp) + 236: ec5e sd s7,24(sp) + 238: 1080 addi s0,sp,96 + 23a: 8baa mv s7,a0 + 23c: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 23e: 892a mv s2,a0 + 240: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 242: 4aa9 li s5,10 + 244: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 246: 89a6 mv s3,s1 + 248: 2485 addiw s1,s1,1 + 24a: 0344d663 bge s1,s4,276 + cc = read(0, &c, 1); + 24e: 4605 li a2,1 + 250: faf40593 addi a1,s0,-81 + 254: 4501 li a0,0 + 256: 1b2000ef jal 408 + if(cc < 1) + 25a: 00a05e63 blez a0,276 + buf[i++] = c; + 25e: faf44783 lbu a5,-81(s0) + 262: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 266: 01578763 beq a5,s5,274 + 26a: 0905 addi s2,s2,1 + 26c: fd679de3 bne a5,s6,246 + buf[i++] = c; + 270: 89a6 mv s3,s1 + 272: a011 j 276 + 274: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 276: 99de add s3,s3,s7 + 278: 00098023 sb zero,0(s3) + return buf; +} + 27c: 855e mv a0,s7 + 27e: 60e6 ld ra,88(sp) + 280: 6446 ld s0,80(sp) + 282: 64a6 ld s1,72(sp) + 284: 6906 ld s2,64(sp) + 286: 79e2 ld s3,56(sp) + 288: 7a42 ld s4,48(sp) + 28a: 7aa2 ld s5,40(sp) + 28c: 7b02 ld s6,32(sp) + 28e: 6be2 ld s7,24(sp) + 290: 6125 addi sp,sp,96 + 292: 8082 ret + +0000000000000294 : + +int +stat(const char *n, struct stat *st) +{ + 294: 1101 addi sp,sp,-32 + 296: ec06 sd ra,24(sp) + 298: e822 sd s0,16(sp) + 29a: e04a sd s2,0(sp) + 29c: 1000 addi s0,sp,32 + 29e: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 2a0: 4581 li a1,0 + 2a2: 18e000ef jal 430 + if(fd < 0) + 2a6: 02054263 bltz a0,2ca + 2aa: e426 sd s1,8(sp) + 2ac: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 2ae: 85ca mv a1,s2 + 2b0: 198000ef jal 448 + 2b4: 892a mv s2,a0 + close(fd); + 2b6: 8526 mv a0,s1 + 2b8: 160000ef jal 418 + return r; + 2bc: 64a2 ld s1,8(sp) +} + 2be: 854a mv a0,s2 + 2c0: 60e2 ld ra,24(sp) + 2c2: 6442 ld s0,16(sp) + 2c4: 6902 ld s2,0(sp) + 2c6: 6105 addi sp,sp,32 + 2c8: 8082 ret + return -1; + 2ca: 597d li s2,-1 + 2cc: bfcd j 2be + +00000000000002ce : + +int +atoi(const char *s) +{ + 2ce: 1141 addi sp,sp,-16 + 2d0: e422 sd s0,8(sp) + 2d2: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 2d4: 00054683 lbu a3,0(a0) + 2d8: fd06879b addiw a5,a3,-48 + 2dc: 0ff7f793 zext.b a5,a5 + 2e0: 4625 li a2,9 + 2e2: 02f66863 bltu a2,a5,312 + 2e6: 872a mv a4,a0 + n = 0; + 2e8: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 2ea: 0705 addi a4,a4,1 + 2ec: 0025179b slliw a5,a0,0x2 + 2f0: 9fa9 addw a5,a5,a0 + 2f2: 0017979b slliw a5,a5,0x1 + 2f6: 9fb5 addw a5,a5,a3 + 2f8: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 2fc: 00074683 lbu a3,0(a4) + 300: fd06879b addiw a5,a3,-48 + 304: 0ff7f793 zext.b a5,a5 + 308: fef671e3 bgeu a2,a5,2ea + return n; +} + 30c: 6422 ld s0,8(sp) + 30e: 0141 addi sp,sp,16 + 310: 8082 ret + n = 0; + 312: 4501 li a0,0 + 314: bfe5 j 30c + +0000000000000316 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 316: 1141 addi sp,sp,-16 + 318: e422 sd s0,8(sp) + 31a: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 31c: 02b57463 bgeu a0,a1,344 + while(n-- > 0) + 320: 00c05f63 blez a2,33e + 324: 1602 slli a2,a2,0x20 + 326: 9201 srli a2,a2,0x20 + 328: 00c507b3 add a5,a0,a2 + dst = vdst; + 32c: 872a mv a4,a0 + *dst++ = *src++; + 32e: 0585 addi a1,a1,1 + 330: 0705 addi a4,a4,1 + 332: fff5c683 lbu a3,-1(a1) + 336: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 33a: fef71ae3 bne a4,a5,32e + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 33e: 6422 ld s0,8(sp) + 340: 0141 addi sp,sp,16 + 342: 8082 ret + dst += n; + 344: 00c50733 add a4,a0,a2 + src += n; + 348: 95b2 add a1,a1,a2 + while(n-- > 0) + 34a: fec05ae3 blez a2,33e + 34e: fff6079b addiw a5,a2,-1 + 352: 1782 slli a5,a5,0x20 + 354: 9381 srli a5,a5,0x20 + 356: fff7c793 not a5,a5 + 35a: 97ba add a5,a5,a4 + *--dst = *--src; + 35c: 15fd addi a1,a1,-1 + 35e: 177d addi a4,a4,-1 + 360: 0005c683 lbu a3,0(a1) + 364: 00d70023 sb a3,0(a4) + while(n-- > 0) + 368: fee79ae3 bne a5,a4,35c + 36c: bfc9 j 33e + +000000000000036e : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 36e: 1141 addi sp,sp,-16 + 370: e422 sd s0,8(sp) + 372: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 374: ca05 beqz a2,3a4 + 376: fff6069b addiw a3,a2,-1 + 37a: 1682 slli a3,a3,0x20 + 37c: 9281 srli a3,a3,0x20 + 37e: 0685 addi a3,a3,1 + 380: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 382: 00054783 lbu a5,0(a0) + 386: 0005c703 lbu a4,0(a1) + 38a: 00e79863 bne a5,a4,39a + return *p1 - *p2; + } + p1++; + 38e: 0505 addi a0,a0,1 + p2++; + 390: 0585 addi a1,a1,1 + while (n-- > 0) { + 392: fed518e3 bne a0,a3,382 + } + return 0; + 396: 4501 li a0,0 + 398: a019 j 39e + return *p1 - *p2; + 39a: 40e7853b subw a0,a5,a4 +} + 39e: 6422 ld s0,8(sp) + 3a0: 0141 addi sp,sp,16 + 3a2: 8082 ret + return 0; + 3a4: 4501 li a0,0 + 3a6: bfe5 j 39e + +00000000000003a8 : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 3a8: 1141 addi sp,sp,-16 + 3aa: e406 sd ra,8(sp) + 3ac: e022 sd s0,0(sp) + 3ae: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 3b0: f67ff0ef jal 316 +} + 3b4: 60a2 ld ra,8(sp) + 3b6: 6402 ld s0,0(sp) + 3b8: 0141 addi sp,sp,16 + 3ba: 8082 ret + +00000000000003bc : + +char * +sbrk(int n) { + 3bc: 1141 addi sp,sp,-16 + 3be: e406 sd ra,8(sp) + 3c0: e022 sd s0,0(sp) + 3c2: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 3c4: 4585 li a1,1 + 3c6: 0b2000ef jal 478 +} + 3ca: 60a2 ld ra,8(sp) + 3cc: 6402 ld s0,0(sp) + 3ce: 0141 addi sp,sp,16 + 3d0: 8082 ret + +00000000000003d2 : + +char * +sbrklazy(int n) { + 3d2: 1141 addi sp,sp,-16 + 3d4: e406 sd ra,8(sp) + 3d6: e022 sd s0,0(sp) + 3d8: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 3da: 4589 li a1,2 + 3dc: 09c000ef jal 478 +} + 3e0: 60a2 ld ra,8(sp) + 3e2: 6402 ld s0,0(sp) + 3e4: 0141 addi sp,sp,16 + 3e6: 8082 ret + +00000000000003e8 : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 3e8: 4885 li a7,1 + ecall + 3ea: 00000073 ecall + ret + 3ee: 8082 ret + +00000000000003f0 : +.global exit +exit: + li a7, SYS_exit + 3f0: 4889 li a7,2 + ecall + 3f2: 00000073 ecall + ret + 3f6: 8082 ret + +00000000000003f8 : +.global wait +wait: + li a7, SYS_wait + 3f8: 488d li a7,3 + ecall + 3fa: 00000073 ecall + ret + 3fe: 8082 ret + +0000000000000400 : +.global pipe +pipe: + li a7, SYS_pipe + 400: 4891 li a7,4 + ecall + 402: 00000073 ecall + ret + 406: 8082 ret + +0000000000000408 : +.global read +read: + li a7, SYS_read + 408: 4895 li a7,5 + ecall + 40a: 00000073 ecall + ret + 40e: 8082 ret + +0000000000000410 : +.global write +write: + li a7, SYS_write + 410: 48c1 li a7,16 + ecall + 412: 00000073 ecall + ret + 416: 8082 ret + +0000000000000418 : +.global close +close: + li a7, SYS_close + 418: 48d5 li a7,21 + ecall + 41a: 00000073 ecall + ret + 41e: 8082 ret + +0000000000000420 : +.global kill +kill: + li a7, SYS_kill + 420: 4899 li a7,6 + ecall + 422: 00000073 ecall + ret + 426: 8082 ret + +0000000000000428 : +.global exec +exec: + li a7, SYS_exec + 428: 489d li a7,7 + ecall + 42a: 00000073 ecall + ret + 42e: 8082 ret + +0000000000000430 : +.global open +open: + li a7, SYS_open + 430: 48bd li a7,15 + ecall + 432: 00000073 ecall + ret + 436: 8082 ret + +0000000000000438 : +.global mknod +mknod: + li a7, SYS_mknod + 438: 48c5 li a7,17 + ecall + 43a: 00000073 ecall + ret + 43e: 8082 ret + +0000000000000440 : +.global unlink +unlink: + li a7, SYS_unlink + 440: 48c9 li a7,18 + ecall + 442: 00000073 ecall + ret + 446: 8082 ret + +0000000000000448 : +.global fstat +fstat: + li a7, SYS_fstat + 448: 48a1 li a7,8 + ecall + 44a: 00000073 ecall + ret + 44e: 8082 ret + +0000000000000450 : +.global link +link: + li a7, SYS_link + 450: 48cd li a7,19 + ecall + 452: 00000073 ecall + ret + 456: 8082 ret + +0000000000000458 : +.global mkdir +mkdir: + li a7, SYS_mkdir + 458: 48d1 li a7,20 + ecall + 45a: 00000073 ecall + ret + 45e: 8082 ret + +0000000000000460 : +.global chdir +chdir: + li a7, SYS_chdir + 460: 48a5 li a7,9 + ecall + 462: 00000073 ecall + ret + 466: 8082 ret + +0000000000000468 : +.global dup +dup: + li a7, SYS_dup + 468: 48a9 li a7,10 + ecall + 46a: 00000073 ecall + ret + 46e: 8082 ret + +0000000000000470 : +.global getpid +getpid: + li a7, SYS_getpid + 470: 48ad li a7,11 + ecall + 472: 00000073 ecall + ret + 476: 8082 ret + +0000000000000478 : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 478: 48b1 li a7,12 + ecall + 47a: 00000073 ecall + ret + 47e: 8082 ret + +0000000000000480 : +.global pause +pause: + li a7, SYS_pause + 480: 48b5 li a7,13 + ecall + 482: 00000073 ecall + ret + 486: 8082 ret + +0000000000000488 : +.global uptime +uptime: + li a7, SYS_uptime + 488: 48b9 li a7,14 + ecall + 48a: 00000073 ecall + ret + 48e: 8082 ret + +0000000000000490 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 490: 1101 addi sp,sp,-32 + 492: ec06 sd ra,24(sp) + 494: e822 sd s0,16(sp) + 496: 1000 addi s0,sp,32 + 498: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 49c: 4605 li a2,1 + 49e: fef40593 addi a1,s0,-17 + 4a2: f6fff0ef jal 410 +} + 4a6: 60e2 ld ra,24(sp) + 4a8: 6442 ld s0,16(sp) + 4aa: 6105 addi sp,sp,32 + 4ac: 8082 ret + +00000000000004ae : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 4ae: 715d addi sp,sp,-80 + 4b0: e486 sd ra,72(sp) + 4b2: e0a2 sd s0,64(sp) + 4b4: f84a sd s2,48(sp) + 4b6: 0880 addi s0,sp,80 + 4b8: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 4ba: c299 beqz a3,4c0 + 4bc: 0805c363 bltz a1,542 + neg = 0; + 4c0: 4881 li a7,0 + 4c2: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 4c6: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 4c8: 00000517 auipc a0,0x0 + 4cc: 55850513 addi a0,a0,1368 # a20 + 4d0: 883e mv a6,a5 + 4d2: 2785 addiw a5,a5,1 + 4d4: 02c5f733 remu a4,a1,a2 + 4d8: 972a add a4,a4,a0 + 4da: 00074703 lbu a4,0(a4) + 4de: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 4e2: 872e mv a4,a1 + 4e4: 02c5d5b3 divu a1,a1,a2 + 4e8: 0685 addi a3,a3,1 + 4ea: fec773e3 bgeu a4,a2,4d0 + if(neg) + 4ee: 00088b63 beqz a7,504 + buf[i++] = '-'; + 4f2: fd078793 addi a5,a5,-48 + 4f6: 97a2 add a5,a5,s0 + 4f8: 02d00713 li a4,45 + 4fc: fee78423 sb a4,-24(a5) + 500: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 504: 02f05a63 blez a5,538 + 508: fc26 sd s1,56(sp) + 50a: f44e sd s3,40(sp) + 50c: fb840713 addi a4,s0,-72 + 510: 00f704b3 add s1,a4,a5 + 514: fff70993 addi s3,a4,-1 + 518: 99be add s3,s3,a5 + 51a: 37fd addiw a5,a5,-1 + 51c: 1782 slli a5,a5,0x20 + 51e: 9381 srli a5,a5,0x20 + 520: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 524: fff4c583 lbu a1,-1(s1) + 528: 854a mv a0,s2 + 52a: f67ff0ef jal 490 + while(--i >= 0) + 52e: 14fd addi s1,s1,-1 + 530: ff349ae3 bne s1,s3,524 + 534: 74e2 ld s1,56(sp) + 536: 79a2 ld s3,40(sp) +} + 538: 60a6 ld ra,72(sp) + 53a: 6406 ld s0,64(sp) + 53c: 7942 ld s2,48(sp) + 53e: 6161 addi sp,sp,80 + 540: 8082 ret + x = -xx; + 542: 40b005b3 neg a1,a1 + neg = 1; + 546: 4885 li a7,1 + x = -xx; + 548: bfad j 4c2 + +000000000000054a : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 54a: 711d addi sp,sp,-96 + 54c: ec86 sd ra,88(sp) + 54e: e8a2 sd s0,80(sp) + 550: e0ca sd s2,64(sp) + 552: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 554: 0005c903 lbu s2,0(a1) + 558: 28090663 beqz s2,7e4 + 55c: e4a6 sd s1,72(sp) + 55e: fc4e sd s3,56(sp) + 560: f852 sd s4,48(sp) + 562: f456 sd s5,40(sp) + 564: f05a sd s6,32(sp) + 566: ec5e sd s7,24(sp) + 568: e862 sd s8,16(sp) + 56a: e466 sd s9,8(sp) + 56c: 8b2a mv s6,a0 + 56e: 8a2e mv s4,a1 + 570: 8bb2 mv s7,a2 + state = 0; + 572: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 574: 4481 li s1,0 + 576: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 578: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 57c: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 580: 06c00c93 li s9,108 + 584: a005 j 5a4 + putc(fd, c0); + 586: 85ca mv a1,s2 + 588: 855a mv a0,s6 + 58a: f07ff0ef jal 490 + 58e: a019 j 594 + } else if(state == '%'){ + 590: 03598263 beq s3,s5,5b4 + for(i = 0; fmt[i]; i++){ + 594: 2485 addiw s1,s1,1 + 596: 8726 mv a4,s1 + 598: 009a07b3 add a5,s4,s1 + 59c: 0007c903 lbu s2,0(a5) + 5a0: 22090a63 beqz s2,7d4 + c0 = fmt[i] & 0xff; + 5a4: 0009079b sext.w a5,s2 + if(state == 0){ + 5a8: fe0994e3 bnez s3,590 + if(c0 == '%'){ + 5ac: fd579de3 bne a5,s5,586 + state = '%'; + 5b0: 89be mv s3,a5 + 5b2: b7cd j 594 + if(c0) c1 = fmt[i+1] & 0xff; + 5b4: 00ea06b3 add a3,s4,a4 + 5b8: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 5bc: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 5be: c681 beqz a3,5c6 + 5c0: 9752 add a4,a4,s4 + 5c2: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 5c6: 05878363 beq a5,s8,60c + } else if(c0 == 'l' && c1 == 'd'){ + 5ca: 05978d63 beq a5,s9,624 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 5ce: 07500713 li a4,117 + 5d2: 0ee78763 beq a5,a4,6c0 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 5d6: 07800713 li a4,120 + 5da: 12e78963 beq a5,a4,70c + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 5de: 07000713 li a4,112 + 5e2: 14e78e63 beq a5,a4,73e + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 5e6: 06300713 li a4,99 + 5ea: 18e78e63 beq a5,a4,786 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 5ee: 07300713 li a4,115 + 5f2: 1ae78463 beq a5,a4,79a + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 5f6: 02500713 li a4,37 + 5fa: 04e79563 bne a5,a4,644 + putc(fd, '%'); + 5fe: 02500593 li a1,37 + 602: 855a mv a0,s6 + 604: e8dff0ef jal 490 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 608: 4981 li s3,0 + 60a: b769 j 594 + printint(fd, va_arg(ap, int), 10, 1); + 60c: 008b8913 addi s2,s7,8 + 610: 4685 li a3,1 + 612: 4629 li a2,10 + 614: 000ba583 lw a1,0(s7) + 618: 855a mv a0,s6 + 61a: e95ff0ef jal 4ae + 61e: 8bca mv s7,s2 + state = 0; + 620: 4981 li s3,0 + 622: bf8d j 594 + } else if(c0 == 'l' && c1 == 'd'){ + 624: 06400793 li a5,100 + 628: 02f68963 beq a3,a5,65a + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 62c: 06c00793 li a5,108 + 630: 04f68263 beq a3,a5,674 + } else if(c0 == 'l' && c1 == 'u'){ + 634: 07500793 li a5,117 + 638: 0af68063 beq a3,a5,6d8 + } else if(c0 == 'l' && c1 == 'x'){ + 63c: 07800793 li a5,120 + 640: 0ef68263 beq a3,a5,724 + putc(fd, '%'); + 644: 02500593 li a1,37 + 648: 855a mv a0,s6 + 64a: e47ff0ef jal 490 + putc(fd, c0); + 64e: 85ca mv a1,s2 + 650: 855a mv a0,s6 + 652: e3fff0ef jal 490 + state = 0; + 656: 4981 li s3,0 + 658: bf35 j 594 + printint(fd, va_arg(ap, uint64), 10, 1); + 65a: 008b8913 addi s2,s7,8 + 65e: 4685 li a3,1 + 660: 4629 li a2,10 + 662: 000bb583 ld a1,0(s7) + 666: 855a mv a0,s6 + 668: e47ff0ef jal 4ae + i += 1; + 66c: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 66e: 8bca mv s7,s2 + state = 0; + 670: 4981 li s3,0 + i += 1; + 672: b70d j 594 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 674: 06400793 li a5,100 + 678: 02f60763 beq a2,a5,6a6 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 67c: 07500793 li a5,117 + 680: 06f60963 beq a2,a5,6f2 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 684: 07800793 li a5,120 + 688: faf61ee3 bne a2,a5,644 + printint(fd, va_arg(ap, uint64), 16, 0); + 68c: 008b8913 addi s2,s7,8 + 690: 4681 li a3,0 + 692: 4641 li a2,16 + 694: 000bb583 ld a1,0(s7) + 698: 855a mv a0,s6 + 69a: e15ff0ef jal 4ae + i += 2; + 69e: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 6a0: 8bca mv s7,s2 + state = 0; + 6a2: 4981 li s3,0 + i += 2; + 6a4: bdc5 j 594 + printint(fd, va_arg(ap, uint64), 10, 1); + 6a6: 008b8913 addi s2,s7,8 + 6aa: 4685 li a3,1 + 6ac: 4629 li a2,10 + 6ae: 000bb583 ld a1,0(s7) + 6b2: 855a mv a0,s6 + 6b4: dfbff0ef jal 4ae + i += 2; + 6b8: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 6ba: 8bca mv s7,s2 + state = 0; + 6bc: 4981 li s3,0 + i += 2; + 6be: bdd9 j 594 + printint(fd, va_arg(ap, uint32), 10, 0); + 6c0: 008b8913 addi s2,s7,8 + 6c4: 4681 li a3,0 + 6c6: 4629 li a2,10 + 6c8: 000be583 lwu a1,0(s7) + 6cc: 855a mv a0,s6 + 6ce: de1ff0ef jal 4ae + 6d2: 8bca mv s7,s2 + state = 0; + 6d4: 4981 li s3,0 + 6d6: bd7d j 594 + printint(fd, va_arg(ap, uint64), 10, 0); + 6d8: 008b8913 addi s2,s7,8 + 6dc: 4681 li a3,0 + 6de: 4629 li a2,10 + 6e0: 000bb583 ld a1,0(s7) + 6e4: 855a mv a0,s6 + 6e6: dc9ff0ef jal 4ae + i += 1; + 6ea: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 6ec: 8bca mv s7,s2 + state = 0; + 6ee: 4981 li s3,0 + i += 1; + 6f0: b555 j 594 + printint(fd, va_arg(ap, uint64), 10, 0); + 6f2: 008b8913 addi s2,s7,8 + 6f6: 4681 li a3,0 + 6f8: 4629 li a2,10 + 6fa: 000bb583 ld a1,0(s7) + 6fe: 855a mv a0,s6 + 700: dafff0ef jal 4ae + i += 2; + 704: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 706: 8bca mv s7,s2 + state = 0; + 708: 4981 li s3,0 + i += 2; + 70a: b569 j 594 + printint(fd, va_arg(ap, uint32), 16, 0); + 70c: 008b8913 addi s2,s7,8 + 710: 4681 li a3,0 + 712: 4641 li a2,16 + 714: 000be583 lwu a1,0(s7) + 718: 855a mv a0,s6 + 71a: d95ff0ef jal 4ae + 71e: 8bca mv s7,s2 + state = 0; + 720: 4981 li s3,0 + 722: bd8d j 594 + printint(fd, va_arg(ap, uint64), 16, 0); + 724: 008b8913 addi s2,s7,8 + 728: 4681 li a3,0 + 72a: 4641 li a2,16 + 72c: 000bb583 ld a1,0(s7) + 730: 855a mv a0,s6 + 732: d7dff0ef jal 4ae + i += 1; + 736: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 738: 8bca mv s7,s2 + state = 0; + 73a: 4981 li s3,0 + i += 1; + 73c: bda1 j 594 + 73e: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 740: 008b8d13 addi s10,s7,8 + 744: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 748: 03000593 li a1,48 + 74c: 855a mv a0,s6 + 74e: d43ff0ef jal 490 + putc(fd, 'x'); + 752: 07800593 li a1,120 + 756: 855a mv a0,s6 + 758: d39ff0ef jal 490 + 75c: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 75e: 00000b97 auipc s7,0x0 + 762: 2c2b8b93 addi s7,s7,706 # a20 + 766: 03c9d793 srli a5,s3,0x3c + 76a: 97de add a5,a5,s7 + 76c: 0007c583 lbu a1,0(a5) + 770: 855a mv a0,s6 + 772: d1fff0ef jal 490 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 776: 0992 slli s3,s3,0x4 + 778: 397d addiw s2,s2,-1 + 77a: fe0916e3 bnez s2,766 + printptr(fd, va_arg(ap, uint64)); + 77e: 8bea mv s7,s10 + state = 0; + 780: 4981 li s3,0 + 782: 6d02 ld s10,0(sp) + 784: bd01 j 594 + putc(fd, va_arg(ap, uint32)); + 786: 008b8913 addi s2,s7,8 + 78a: 000bc583 lbu a1,0(s7) + 78e: 855a mv a0,s6 + 790: d01ff0ef jal 490 + 794: 8bca mv s7,s2 + state = 0; + 796: 4981 li s3,0 + 798: bbf5 j 594 + if((s = va_arg(ap, char*)) == 0) + 79a: 008b8993 addi s3,s7,8 + 79e: 000bb903 ld s2,0(s7) + 7a2: 00090f63 beqz s2,7c0 + for(; *s; s++) + 7a6: 00094583 lbu a1,0(s2) + 7aa: c195 beqz a1,7ce + putc(fd, *s); + 7ac: 855a mv a0,s6 + 7ae: ce3ff0ef jal 490 + for(; *s; s++) + 7b2: 0905 addi s2,s2,1 + 7b4: 00094583 lbu a1,0(s2) + 7b8: f9f5 bnez a1,7ac + if((s = va_arg(ap, char*)) == 0) + 7ba: 8bce mv s7,s3 + state = 0; + 7bc: 4981 li s3,0 + 7be: bbd9 j 594 + s = "(null)"; + 7c0: 00000917 auipc s2,0x0 + 7c4: 25890913 addi s2,s2,600 # a18 + for(; *s; s++) + 7c8: 02800593 li a1,40 + 7cc: b7c5 j 7ac + if((s = va_arg(ap, char*)) == 0) + 7ce: 8bce mv s7,s3 + state = 0; + 7d0: 4981 li s3,0 + 7d2: b3c9 j 594 + 7d4: 64a6 ld s1,72(sp) + 7d6: 79e2 ld s3,56(sp) + 7d8: 7a42 ld s4,48(sp) + 7da: 7aa2 ld s5,40(sp) + 7dc: 7b02 ld s6,32(sp) + 7de: 6be2 ld s7,24(sp) + 7e0: 6c42 ld s8,16(sp) + 7e2: 6ca2 ld s9,8(sp) + } + } +} + 7e4: 60e6 ld ra,88(sp) + 7e6: 6446 ld s0,80(sp) + 7e8: 6906 ld s2,64(sp) + 7ea: 6125 addi sp,sp,96 + 7ec: 8082 ret + +00000000000007ee : + +void +fprintf(int fd, const char *fmt, ...) +{ + 7ee: 715d addi sp,sp,-80 + 7f0: ec06 sd ra,24(sp) + 7f2: e822 sd s0,16(sp) + 7f4: 1000 addi s0,sp,32 + 7f6: e010 sd a2,0(s0) + 7f8: e414 sd a3,8(s0) + 7fa: e818 sd a4,16(s0) + 7fc: ec1c sd a5,24(s0) + 7fe: 03043023 sd a6,32(s0) + 802: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 806: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 80a: 8622 mv a2,s0 + 80c: d3fff0ef jal 54a +} + 810: 60e2 ld ra,24(sp) + 812: 6442 ld s0,16(sp) + 814: 6161 addi sp,sp,80 + 816: 8082 ret + +0000000000000818 : + +void +printf(const char *fmt, ...) +{ + 818: 711d addi sp,sp,-96 + 81a: ec06 sd ra,24(sp) + 81c: e822 sd s0,16(sp) + 81e: 1000 addi s0,sp,32 + 820: e40c sd a1,8(s0) + 822: e810 sd a2,16(s0) + 824: ec14 sd a3,24(s0) + 826: f018 sd a4,32(s0) + 828: f41c sd a5,40(s0) + 82a: 03043823 sd a6,48(s0) + 82e: 03143c23 sd a7,56(s0) + va_list ap; + + va_start(ap, fmt); + 832: 00840613 addi a2,s0,8 + 836: fec43423 sd a2,-24(s0) + vprintf(1, fmt, ap); + 83a: 85aa mv a1,a0 + 83c: 4505 li a0,1 + 83e: d0dff0ef jal 54a +} + 842: 60e2 ld ra,24(sp) + 844: 6442 ld s0,16(sp) + 846: 6125 addi sp,sp,96 + 848: 8082 ret + +000000000000084a : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 84a: 1141 addi sp,sp,-16 + 84c: e422 sd s0,8(sp) + 84e: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 850: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 854: 00000797 auipc a5,0x0 + 858: 7ac7b783 ld a5,1964(a5) # 1000 + 85c: a02d j 886 + 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; + 85e: 4618 lw a4,8(a2) + 860: 9f2d addw a4,a4,a1 + 862: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 866: 6398 ld a4,0(a5) + 868: 6310 ld a2,0(a4) + 86a: a83d j 8a8 + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 86c: ff852703 lw a4,-8(a0) + 870: 9f31 addw a4,a4,a2 + 872: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 874: ff053683 ld a3,-16(a0) + 878: a091 j 8bc + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 87a: 6398 ld a4,0(a5) + 87c: 00e7e463 bltu a5,a4,884 + 880: 00e6ea63 bltu a3,a4,894 +{ + 884: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 886: fed7fae3 bgeu a5,a3,87a + 88a: 6398 ld a4,0(a5) + 88c: 00e6e463 bltu a3,a4,894 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 890: fee7eae3 bltu a5,a4,884 + if(bp + bp->s.size == p->s.ptr){ + 894: ff852583 lw a1,-8(a0) + 898: 6390 ld a2,0(a5) + 89a: 02059813 slli a6,a1,0x20 + 89e: 01c85713 srli a4,a6,0x1c + 8a2: 9736 add a4,a4,a3 + 8a4: fae60de3 beq a2,a4,85e + bp->s.ptr = p->s.ptr->s.ptr; + 8a8: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 8ac: 4790 lw a2,8(a5) + 8ae: 02061593 slli a1,a2,0x20 + 8b2: 01c5d713 srli a4,a1,0x1c + 8b6: 973e add a4,a4,a5 + 8b8: fae68ae3 beq a3,a4,86c + p->s.ptr = bp->s.ptr; + 8bc: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 8be: 00000717 auipc a4,0x0 + 8c2: 74f73123 sd a5,1858(a4) # 1000 +} + 8c6: 6422 ld s0,8(sp) + 8c8: 0141 addi sp,sp,16 + 8ca: 8082 ret + +00000000000008cc : + return freep; +} + +void* +malloc(uint nbytes) +{ + 8cc: 7139 addi sp,sp,-64 + 8ce: fc06 sd ra,56(sp) + 8d0: f822 sd s0,48(sp) + 8d2: f426 sd s1,40(sp) + 8d4: ec4e sd s3,24(sp) + 8d6: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 8d8: 02051493 slli s1,a0,0x20 + 8dc: 9081 srli s1,s1,0x20 + 8de: 04bd addi s1,s1,15 + 8e0: 8091 srli s1,s1,0x4 + 8e2: 0014899b addiw s3,s1,1 + 8e6: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 8e8: 00000517 auipc a0,0x0 + 8ec: 71853503 ld a0,1816(a0) # 1000 + 8f0: c915 beqz a0,924 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 8f2: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 8f4: 4798 lw a4,8(a5) + 8f6: 08977a63 bgeu a4,s1,98a + 8fa: f04a sd s2,32(sp) + 8fc: e852 sd s4,16(sp) + 8fe: e456 sd s5,8(sp) + 900: e05a sd s6,0(sp) + if(nu < 4096) + 902: 8a4e mv s4,s3 + 904: 0009871b sext.w a4,s3 + 908: 6685 lui a3,0x1 + 90a: 00d77363 bgeu a4,a3,910 + 90e: 6a05 lui s4,0x1 + 910: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 914: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 918: 00000917 auipc s2,0x0 + 91c: 6e890913 addi s2,s2,1768 # 1000 + if(p == SBRK_ERROR) + 920: 5afd li s5,-1 + 922: a081 j 962 + 924: f04a sd s2,32(sp) + 926: e852 sd s4,16(sp) + 928: e456 sd s5,8(sp) + 92a: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 92c: 00001797 auipc a5,0x1 + 930: 8e478793 addi a5,a5,-1820 # 1210 + 934: 00000717 auipc a4,0x0 + 938: 6cf73623 sd a5,1740(a4) # 1000 + 93c: e39c sd a5,0(a5) + base.s.size = 0; + 93e: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 942: b7c1 j 902 + prevp->s.ptr = p->s.ptr; + 944: 6398 ld a4,0(a5) + 946: e118 sd a4,0(a0) + 948: a8a9 j 9a2 + hp->s.size = nu; + 94a: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 94e: 0541 addi a0,a0,16 + 950: efbff0ef jal 84a + return freep; + 954: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 958: c12d beqz a0,9ba + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 95a: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 95c: 4798 lw a4,8(a5) + 95e: 02977263 bgeu a4,s1,982 + if(p == freep) + 962: 00093703 ld a4,0(s2) + 966: 853e mv a0,a5 + 968: fef719e3 bne a4,a5,95a + p = sbrk(nu * sizeof(Header)); + 96c: 8552 mv a0,s4 + 96e: a4fff0ef jal 3bc + if(p == SBRK_ERROR) + 972: fd551ce3 bne a0,s5,94a + return 0; + 976: 4501 li a0,0 + 978: 7902 ld s2,32(sp) + 97a: 6a42 ld s4,16(sp) + 97c: 6aa2 ld s5,8(sp) + 97e: 6b02 ld s6,0(sp) + 980: a03d j 9ae + 982: 7902 ld s2,32(sp) + 984: 6a42 ld s4,16(sp) + 986: 6aa2 ld s5,8(sp) + 988: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 98a: fae48de3 beq s1,a4,944 + p->s.size -= nunits; + 98e: 4137073b subw a4,a4,s3 + 992: c798 sw a4,8(a5) + p += p->s.size; + 994: 02071693 slli a3,a4,0x20 + 998: 01c6d713 srli a4,a3,0x1c + 99c: 97ba add a5,a5,a4 + p->s.size = nunits; + 99e: 0137a423 sw s3,8(a5) + freep = prevp; + 9a2: 00000717 auipc a4,0x0 + 9a6: 64a73f23 sd a0,1630(a4) # 1000 + return (void*)(p + 1); + 9aa: 01078513 addi a0,a5,16 + } +} + 9ae: 70e2 ld ra,56(sp) + 9b0: 7442 ld s0,48(sp) + 9b2: 74a2 ld s1,40(sp) + 9b4: 69e2 ld s3,24(sp) + 9b6: 6121 addi sp,sp,64 + 9b8: 8082 ret + 9ba: 7902 ld s2,32(sp) + 9bc: 6a42 ld s4,16(sp) + 9be: 6aa2 ld s5,8(sp) + 9c0: 6b02 ld s6,0(sp) + 9c2: b7f5 j 9ae diff --git a/G12_Project2_2/user/wc.c b/G12_Project2_2/user/wc.c new file mode 100644 index 0000000000..d8f3b2ad01 --- /dev/null +++ b/G12_Project2_2/user/wc.c @@ -0,0 +1,55 @@ +#include "kernel/types.h" +#include "kernel/stat.h" +#include "kernel/fcntl.h" +#include "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: +#include "kernel/stat.h" +#include "user/user.h" + +int +main(void) +{ + 0: 1141 addi sp,sp,-16 + 2: e406 sd ra,8(sp) + 4: e022 sd s0,0(sp) + 6: 0800 addi s0,sp,16 + if(fork() > 0) + 8: 2a2000ef jal 2aa + c: 00a04563 bgtz a0,16 + pause(5); // Let child exit before parent. + exit(0); + 10: 4501 li a0,0 + 12: 2a0000ef jal 2b2 + pause(5); // Let child exit before parent. + 16: 4515 li a0,5 + 18: 32a000ef jal 342 + 1c: bfd5 j 10 + +000000000000001e : +// +// wrapper so that it's OK if main() does not call exit(). +// +void +start(int argc, char **argv) +{ + 1e: 1141 addi sp,sp,-16 + 20: e406 sd ra,8(sp) + 22: e022 sd s0,0(sp) + 24: 0800 addi s0,sp,16 + int r; + extern int main(int argc, char **argv); + r = main(argc, argv); + 26: fdbff0ef jal 0
+ exit(r); + 2a: 288000ef jal 2b2 + +000000000000002e : +} + +char* +strcpy(char *s, const char *t) +{ + 2e: 1141 addi sp,sp,-16 + 30: e422 sd s0,8(sp) + 32: 0800 addi s0,sp,16 + char *os; + + os = s; + while((*s++ = *t++) != 0) + 34: 87aa mv a5,a0 + 36: 0585 addi a1,a1,1 + 38: 0785 addi a5,a5,1 + 3a: fff5c703 lbu a4,-1(a1) + 3e: fee78fa3 sb a4,-1(a5) + 42: fb75 bnez a4,36 + ; + return os; +} + 44: 6422 ld s0,8(sp) + 46: 0141 addi sp,sp,16 + 48: 8082 ret + +000000000000004a : + +int +strcmp(const char *p, const char *q) +{ + 4a: 1141 addi sp,sp,-16 + 4c: e422 sd s0,8(sp) + 4e: 0800 addi s0,sp,16 + while(*p && *p == *q) + 50: 00054783 lbu a5,0(a0) + 54: cb91 beqz a5,68 + 56: 0005c703 lbu a4,0(a1) + 5a: 00f71763 bne a4,a5,68 + p++, q++; + 5e: 0505 addi a0,a0,1 + 60: 0585 addi a1,a1,1 + while(*p && *p == *q) + 62: 00054783 lbu a5,0(a0) + 66: fbe5 bnez a5,56 + return (uchar)*p - (uchar)*q; + 68: 0005c503 lbu a0,0(a1) +} + 6c: 40a7853b subw a0,a5,a0 + 70: 6422 ld s0,8(sp) + 72: 0141 addi sp,sp,16 + 74: 8082 ret + +0000000000000076 : + +uint +strlen(const char *s) +{ + 76: 1141 addi sp,sp,-16 + 78: e422 sd s0,8(sp) + 7a: 0800 addi s0,sp,16 + int n; + + for(n = 0; s[n]; n++) + 7c: 00054783 lbu a5,0(a0) + 80: cf91 beqz a5,9c + 82: 0505 addi a0,a0,1 + 84: 87aa mv a5,a0 + 86: 86be mv a3,a5 + 88: 0785 addi a5,a5,1 + 8a: fff7c703 lbu a4,-1(a5) + 8e: ff65 bnez a4,86 + 90: 40a6853b subw a0,a3,a0 + 94: 2505 addiw a0,a0,1 + ; + return n; +} + 96: 6422 ld s0,8(sp) + 98: 0141 addi sp,sp,16 + 9a: 8082 ret + for(n = 0; s[n]; n++) + 9c: 4501 li a0,0 + 9e: bfe5 j 96 + +00000000000000a0 : + +void* +memset(void *dst, int c, uint n) +{ + a0: 1141 addi sp,sp,-16 + a2: e422 sd s0,8(sp) + a4: 0800 addi s0,sp,16 + char *cdst = (char *) dst; + int i; + for(i = 0; i < n; i++){ + a6: ca19 beqz a2,bc + a8: 87aa mv a5,a0 + aa: 1602 slli a2,a2,0x20 + ac: 9201 srli a2,a2,0x20 + ae: 00a60733 add a4,a2,a0 + cdst[i] = c; + b2: 00b78023 sb a1,0(a5) + for(i = 0; i < n; i++){ + b6: 0785 addi a5,a5,1 + b8: fee79de3 bne a5,a4,b2 + } + return dst; +} + bc: 6422 ld s0,8(sp) + be: 0141 addi sp,sp,16 + c0: 8082 ret + +00000000000000c2 : + +char* +strchr(const char *s, char c) +{ + c2: 1141 addi sp,sp,-16 + c4: e422 sd s0,8(sp) + c6: 0800 addi s0,sp,16 + for(; *s; s++) + c8: 00054783 lbu a5,0(a0) + cc: cb99 beqz a5,e2 + if(*s == c) + ce: 00f58763 beq a1,a5,dc + for(; *s; s++) + d2: 0505 addi a0,a0,1 + d4: 00054783 lbu a5,0(a0) + d8: fbfd bnez a5,ce + return (char*)s; + return 0; + da: 4501 li a0,0 +} + dc: 6422 ld s0,8(sp) + de: 0141 addi sp,sp,16 + e0: 8082 ret + return 0; + e2: 4501 li a0,0 + e4: bfe5 j dc + +00000000000000e6 : + +char* +gets(char *buf, int max) +{ + e6: 711d addi sp,sp,-96 + e8: ec86 sd ra,88(sp) + ea: e8a2 sd s0,80(sp) + ec: e4a6 sd s1,72(sp) + ee: e0ca sd s2,64(sp) + f0: fc4e sd s3,56(sp) + f2: f852 sd s4,48(sp) + f4: f456 sd s5,40(sp) + f6: f05a sd s6,32(sp) + f8: ec5e sd s7,24(sp) + fa: 1080 addi s0,sp,96 + fc: 8baa mv s7,a0 + fe: 8a2e mv s4,a1 + int i, cc; + char c; + + for(i=0; i+1 < max; ){ + 100: 892a mv s2,a0 + 102: 4481 li s1,0 + cc = read(0, &c, 1); + if(cc < 1) + break; + buf[i++] = c; + if(c == '\n' || c == '\r') + 104: 4aa9 li s5,10 + 106: 4b35 li s6,13 + for(i=0; i+1 < max; ){ + 108: 89a6 mv s3,s1 + 10a: 2485 addiw s1,s1,1 + 10c: 0344d663 bge s1,s4,138 + cc = read(0, &c, 1); + 110: 4605 li a2,1 + 112: faf40593 addi a1,s0,-81 + 116: 4501 li a0,0 + 118: 1b2000ef jal 2ca + if(cc < 1) + 11c: 00a05e63 blez a0,138 + buf[i++] = c; + 120: faf44783 lbu a5,-81(s0) + 124: 00f90023 sb a5,0(s2) + if(c == '\n' || c == '\r') + 128: 01578763 beq a5,s5,136 + 12c: 0905 addi s2,s2,1 + 12e: fd679de3 bne a5,s6,108 + buf[i++] = c; + 132: 89a6 mv s3,s1 + 134: a011 j 138 + 136: 89a6 mv s3,s1 + break; + } + buf[i] = '\0'; + 138: 99de add s3,s3,s7 + 13a: 00098023 sb zero,0(s3) + return buf; +} + 13e: 855e mv a0,s7 + 140: 60e6 ld ra,88(sp) + 142: 6446 ld s0,80(sp) + 144: 64a6 ld s1,72(sp) + 146: 6906 ld s2,64(sp) + 148: 79e2 ld s3,56(sp) + 14a: 7a42 ld s4,48(sp) + 14c: 7aa2 ld s5,40(sp) + 14e: 7b02 ld s6,32(sp) + 150: 6be2 ld s7,24(sp) + 152: 6125 addi sp,sp,96 + 154: 8082 ret + +0000000000000156 : + +int +stat(const char *n, struct stat *st) +{ + 156: 1101 addi sp,sp,-32 + 158: ec06 sd ra,24(sp) + 15a: e822 sd s0,16(sp) + 15c: e04a sd s2,0(sp) + 15e: 1000 addi s0,sp,32 + 160: 892e mv s2,a1 + int fd; + int r; + + fd = open(n, O_RDONLY); + 162: 4581 li a1,0 + 164: 18e000ef jal 2f2 + if(fd < 0) + 168: 02054263 bltz a0,18c + 16c: e426 sd s1,8(sp) + 16e: 84aa mv s1,a0 + return -1; + r = fstat(fd, st); + 170: 85ca mv a1,s2 + 172: 198000ef jal 30a + 176: 892a mv s2,a0 + close(fd); + 178: 8526 mv a0,s1 + 17a: 160000ef jal 2da + return r; + 17e: 64a2 ld s1,8(sp) +} + 180: 854a mv a0,s2 + 182: 60e2 ld ra,24(sp) + 184: 6442 ld s0,16(sp) + 186: 6902 ld s2,0(sp) + 188: 6105 addi sp,sp,32 + 18a: 8082 ret + return -1; + 18c: 597d li s2,-1 + 18e: bfcd j 180 + +0000000000000190 : + +int +atoi(const char *s) +{ + 190: 1141 addi sp,sp,-16 + 192: e422 sd s0,8(sp) + 194: 0800 addi s0,sp,16 + int n; + + n = 0; + while('0' <= *s && *s <= '9') + 196: 00054683 lbu a3,0(a0) + 19a: fd06879b addiw a5,a3,-48 + 19e: 0ff7f793 zext.b a5,a5 + 1a2: 4625 li a2,9 + 1a4: 02f66863 bltu a2,a5,1d4 + 1a8: 872a mv a4,a0 + n = 0; + 1aa: 4501 li a0,0 + n = n*10 + *s++ - '0'; + 1ac: 0705 addi a4,a4,1 + 1ae: 0025179b slliw a5,a0,0x2 + 1b2: 9fa9 addw a5,a5,a0 + 1b4: 0017979b slliw a5,a5,0x1 + 1b8: 9fb5 addw a5,a5,a3 + 1ba: fd07851b addiw a0,a5,-48 + while('0' <= *s && *s <= '9') + 1be: 00074683 lbu a3,0(a4) + 1c2: fd06879b addiw a5,a3,-48 + 1c6: 0ff7f793 zext.b a5,a5 + 1ca: fef671e3 bgeu a2,a5,1ac + return n; +} + 1ce: 6422 ld s0,8(sp) + 1d0: 0141 addi sp,sp,16 + 1d2: 8082 ret + n = 0; + 1d4: 4501 li a0,0 + 1d6: bfe5 j 1ce + +00000000000001d8 : + +void* +memmove(void *vdst, const void *vsrc, int n) +{ + 1d8: 1141 addi sp,sp,-16 + 1da: e422 sd s0,8(sp) + 1dc: 0800 addi s0,sp,16 + char *dst; + const char *src; + + dst = vdst; + src = vsrc; + if (src > dst) { + 1de: 02b57463 bgeu a0,a1,206 + while(n-- > 0) + 1e2: 00c05f63 blez a2,200 + 1e6: 1602 slli a2,a2,0x20 + 1e8: 9201 srli a2,a2,0x20 + 1ea: 00c507b3 add a5,a0,a2 + dst = vdst; + 1ee: 872a mv a4,a0 + *dst++ = *src++; + 1f0: 0585 addi a1,a1,1 + 1f2: 0705 addi a4,a4,1 + 1f4: fff5c683 lbu a3,-1(a1) + 1f8: fed70fa3 sb a3,-1(a4) + while(n-- > 0) + 1fc: fef71ae3 bne a4,a5,1f0 + src += n; + while(n-- > 0) + *--dst = *--src; + } + return vdst; +} + 200: 6422 ld s0,8(sp) + 202: 0141 addi sp,sp,16 + 204: 8082 ret + dst += n; + 206: 00c50733 add a4,a0,a2 + src += n; + 20a: 95b2 add a1,a1,a2 + while(n-- > 0) + 20c: fec05ae3 blez a2,200 + 210: fff6079b addiw a5,a2,-1 + 214: 1782 slli a5,a5,0x20 + 216: 9381 srli a5,a5,0x20 + 218: fff7c793 not a5,a5 + 21c: 97ba add a5,a5,a4 + *--dst = *--src; + 21e: 15fd addi a1,a1,-1 + 220: 177d addi a4,a4,-1 + 222: 0005c683 lbu a3,0(a1) + 226: 00d70023 sb a3,0(a4) + while(n-- > 0) + 22a: fee79ae3 bne a5,a4,21e + 22e: bfc9 j 200 + +0000000000000230 : + +int +memcmp(const void *s1, const void *s2, uint n) +{ + 230: 1141 addi sp,sp,-16 + 232: e422 sd s0,8(sp) + 234: 0800 addi s0,sp,16 + const char *p1 = s1, *p2 = s2; + while (n-- > 0) { + 236: ca05 beqz a2,266 + 238: fff6069b addiw a3,a2,-1 + 23c: 1682 slli a3,a3,0x20 + 23e: 9281 srli a3,a3,0x20 + 240: 0685 addi a3,a3,1 + 242: 96aa add a3,a3,a0 + if (*p1 != *p2) { + 244: 00054783 lbu a5,0(a0) + 248: 0005c703 lbu a4,0(a1) + 24c: 00e79863 bne a5,a4,25c + return *p1 - *p2; + } + p1++; + 250: 0505 addi a0,a0,1 + p2++; + 252: 0585 addi a1,a1,1 + while (n-- > 0) { + 254: fed518e3 bne a0,a3,244 + } + return 0; + 258: 4501 li a0,0 + 25a: a019 j 260 + return *p1 - *p2; + 25c: 40e7853b subw a0,a5,a4 +} + 260: 6422 ld s0,8(sp) + 262: 0141 addi sp,sp,16 + 264: 8082 ret + return 0; + 266: 4501 li a0,0 + 268: bfe5 j 260 + +000000000000026a : + +void * +memcpy(void *dst, const void *src, uint n) +{ + 26a: 1141 addi sp,sp,-16 + 26c: e406 sd ra,8(sp) + 26e: e022 sd s0,0(sp) + 270: 0800 addi s0,sp,16 + return memmove(dst, src, n); + 272: f67ff0ef jal 1d8 +} + 276: 60a2 ld ra,8(sp) + 278: 6402 ld s0,0(sp) + 27a: 0141 addi sp,sp,16 + 27c: 8082 ret + +000000000000027e : + +char * +sbrk(int n) { + 27e: 1141 addi sp,sp,-16 + 280: e406 sd ra,8(sp) + 282: e022 sd s0,0(sp) + 284: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_EAGER); + 286: 4585 li a1,1 + 288: 0b2000ef jal 33a +} + 28c: 60a2 ld ra,8(sp) + 28e: 6402 ld s0,0(sp) + 290: 0141 addi sp,sp,16 + 292: 8082 ret + +0000000000000294 : + +char * +sbrklazy(int n) { + 294: 1141 addi sp,sp,-16 + 296: e406 sd ra,8(sp) + 298: e022 sd s0,0(sp) + 29a: 0800 addi s0,sp,16 + return sys_sbrk(n, SBRK_LAZY); + 29c: 4589 li a1,2 + 29e: 09c000ef jal 33a +} + 2a2: 60a2 ld ra,8(sp) + 2a4: 6402 ld s0,0(sp) + 2a6: 0141 addi sp,sp,16 + 2a8: 8082 ret + +00000000000002aa : +# generated by usys.pl - do not edit +#include "kernel/syscall.h" +.global fork +fork: + li a7, SYS_fork + 2aa: 4885 li a7,1 + ecall + 2ac: 00000073 ecall + ret + 2b0: 8082 ret + +00000000000002b2 : +.global exit +exit: + li a7, SYS_exit + 2b2: 4889 li a7,2 + ecall + 2b4: 00000073 ecall + ret + 2b8: 8082 ret + +00000000000002ba : +.global wait +wait: + li a7, SYS_wait + 2ba: 488d li a7,3 + ecall + 2bc: 00000073 ecall + ret + 2c0: 8082 ret + +00000000000002c2 : +.global pipe +pipe: + li a7, SYS_pipe + 2c2: 4891 li a7,4 + ecall + 2c4: 00000073 ecall + ret + 2c8: 8082 ret + +00000000000002ca : +.global read +read: + li a7, SYS_read + 2ca: 4895 li a7,5 + ecall + 2cc: 00000073 ecall + ret + 2d0: 8082 ret + +00000000000002d2 : +.global write +write: + li a7, SYS_write + 2d2: 48c1 li a7,16 + ecall + 2d4: 00000073 ecall + ret + 2d8: 8082 ret + +00000000000002da : +.global close +close: + li a7, SYS_close + 2da: 48d5 li a7,21 + ecall + 2dc: 00000073 ecall + ret + 2e0: 8082 ret + +00000000000002e2 : +.global kill +kill: + li a7, SYS_kill + 2e2: 4899 li a7,6 + ecall + 2e4: 00000073 ecall + ret + 2e8: 8082 ret + +00000000000002ea : +.global exec +exec: + li a7, SYS_exec + 2ea: 489d li a7,7 + ecall + 2ec: 00000073 ecall + ret + 2f0: 8082 ret + +00000000000002f2 : +.global open +open: + li a7, SYS_open + 2f2: 48bd li a7,15 + ecall + 2f4: 00000073 ecall + ret + 2f8: 8082 ret + +00000000000002fa : +.global mknod +mknod: + li a7, SYS_mknod + 2fa: 48c5 li a7,17 + ecall + 2fc: 00000073 ecall + ret + 300: 8082 ret + +0000000000000302 : +.global unlink +unlink: + li a7, SYS_unlink + 302: 48c9 li a7,18 + ecall + 304: 00000073 ecall + ret + 308: 8082 ret + +000000000000030a : +.global fstat +fstat: + li a7, SYS_fstat + 30a: 48a1 li a7,8 + ecall + 30c: 00000073 ecall + ret + 310: 8082 ret + +0000000000000312 : +.global link +link: + li a7, SYS_link + 312: 48cd li a7,19 + ecall + 314: 00000073 ecall + ret + 318: 8082 ret + +000000000000031a : +.global mkdir +mkdir: + li a7, SYS_mkdir + 31a: 48d1 li a7,20 + ecall + 31c: 00000073 ecall + ret + 320: 8082 ret + +0000000000000322 : +.global chdir +chdir: + li a7, SYS_chdir + 322: 48a5 li a7,9 + ecall + 324: 00000073 ecall + ret + 328: 8082 ret + +000000000000032a : +.global dup +dup: + li a7, SYS_dup + 32a: 48a9 li a7,10 + ecall + 32c: 00000073 ecall + ret + 330: 8082 ret + +0000000000000332 : +.global getpid +getpid: + li a7, SYS_getpid + 332: 48ad li a7,11 + ecall + 334: 00000073 ecall + ret + 338: 8082 ret + +000000000000033a : +.global sys_sbrk +sys_sbrk: + li a7, SYS_sbrk + 33a: 48b1 li a7,12 + ecall + 33c: 00000073 ecall + ret + 340: 8082 ret + +0000000000000342 : +.global pause +pause: + li a7, SYS_pause + 342: 48b5 li a7,13 + ecall + 344: 00000073 ecall + ret + 348: 8082 ret + +000000000000034a : +.global uptime +uptime: + li a7, SYS_uptime + 34a: 48b9 li a7,14 + ecall + 34c: 00000073 ecall + ret + 350: 8082 ret + +0000000000000352 : + +static char digits[] = "0123456789ABCDEF"; + +static void +putc(int fd, char c) +{ + 352: 1101 addi sp,sp,-32 + 354: ec06 sd ra,24(sp) + 356: e822 sd s0,16(sp) + 358: 1000 addi s0,sp,32 + 35a: feb407a3 sb a1,-17(s0) + write(fd, &c, 1); + 35e: 4605 li a2,1 + 360: fef40593 addi a1,s0,-17 + 364: f6fff0ef jal 2d2 +} + 368: 60e2 ld ra,24(sp) + 36a: 6442 ld s0,16(sp) + 36c: 6105 addi sp,sp,32 + 36e: 8082 ret + +0000000000000370 : + +static void +printint(int fd, long long xx, int base, int sgn) +{ + 370: 715d addi sp,sp,-80 + 372: e486 sd ra,72(sp) + 374: e0a2 sd s0,64(sp) + 376: f84a sd s2,48(sp) + 378: 0880 addi s0,sp,80 + 37a: 892a mv s2,a0 + char buf[20]; + int i, neg; + unsigned long long x; + + neg = 0; + if(sgn && xx < 0){ + 37c: c299 beqz a3,382 + 37e: 0805c363 bltz a1,404 + neg = 0; + 382: 4881 li a7,0 + 384: fb840693 addi a3,s0,-72 + x = -xx; + } else { + x = xx; + } + + i = 0; + 388: 4781 li a5,0 + do{ + buf[i++] = digits[x % base]; + 38a: 00000517 auipc a0,0x0 + 38e: 50e50513 addi a0,a0,1294 # 898 + 392: 883e mv a6,a5 + 394: 2785 addiw a5,a5,1 + 396: 02c5f733 remu a4,a1,a2 + 39a: 972a add a4,a4,a0 + 39c: 00074703 lbu a4,0(a4) + 3a0: 00e68023 sb a4,0(a3) + }while((x /= base) != 0); + 3a4: 872e mv a4,a1 + 3a6: 02c5d5b3 divu a1,a1,a2 + 3aa: 0685 addi a3,a3,1 + 3ac: fec773e3 bgeu a4,a2,392 + if(neg) + 3b0: 00088b63 beqz a7,3c6 + buf[i++] = '-'; + 3b4: fd078793 addi a5,a5,-48 + 3b8: 97a2 add a5,a5,s0 + 3ba: 02d00713 li a4,45 + 3be: fee78423 sb a4,-24(a5) + 3c2: 0028079b addiw a5,a6,2 + + while(--i >= 0) + 3c6: 02f05a63 blez a5,3fa + 3ca: fc26 sd s1,56(sp) + 3cc: f44e sd s3,40(sp) + 3ce: fb840713 addi a4,s0,-72 + 3d2: 00f704b3 add s1,a4,a5 + 3d6: fff70993 addi s3,a4,-1 + 3da: 99be add s3,s3,a5 + 3dc: 37fd addiw a5,a5,-1 + 3de: 1782 slli a5,a5,0x20 + 3e0: 9381 srli a5,a5,0x20 + 3e2: 40f989b3 sub s3,s3,a5 + putc(fd, buf[i]); + 3e6: fff4c583 lbu a1,-1(s1) + 3ea: 854a mv a0,s2 + 3ec: f67ff0ef jal 352 + while(--i >= 0) + 3f0: 14fd addi s1,s1,-1 + 3f2: ff349ae3 bne s1,s3,3e6 + 3f6: 74e2 ld s1,56(sp) + 3f8: 79a2 ld s3,40(sp) +} + 3fa: 60a6 ld ra,72(sp) + 3fc: 6406 ld s0,64(sp) + 3fe: 7942 ld s2,48(sp) + 400: 6161 addi sp,sp,80 + 402: 8082 ret + x = -xx; + 404: 40b005b3 neg a1,a1 + neg = 1; + 408: 4885 li a7,1 + x = -xx; + 40a: bfad j 384 + +000000000000040c : +} + +// Print to the given fd. Only understands %d, %x, %p, %c, %s. +void +vprintf(int fd, const char *fmt, va_list ap) +{ + 40c: 711d addi sp,sp,-96 + 40e: ec86 sd ra,88(sp) + 410: e8a2 sd s0,80(sp) + 412: e0ca sd s2,64(sp) + 414: 1080 addi s0,sp,96 + char *s; + int c0, c1, c2, i, state; + + state = 0; + for(i = 0; fmt[i]; i++){ + 416: 0005c903 lbu s2,0(a1) + 41a: 28090663 beqz s2,6a6 + 41e: e4a6 sd s1,72(sp) + 420: fc4e sd s3,56(sp) + 422: f852 sd s4,48(sp) + 424: f456 sd s5,40(sp) + 426: f05a sd s6,32(sp) + 428: ec5e sd s7,24(sp) + 42a: e862 sd s8,16(sp) + 42c: e466 sd s9,8(sp) + 42e: 8b2a mv s6,a0 + 430: 8a2e mv s4,a1 + 432: 8bb2 mv s7,a2 + state = 0; + 434: 4981 li s3,0 + for(i = 0; fmt[i]; i++){ + 436: 4481 li s1,0 + 438: 4701 li a4,0 + if(c0 == '%'){ + state = '%'; + } else { + putc(fd, c0); + } + } else if(state == '%'){ + 43a: 02500a93 li s5,37 + c1 = c2 = 0; + if(c0) c1 = fmt[i+1] & 0xff; + if(c1) c2 = fmt[i+2] & 0xff; + if(c0 == 'd'){ + 43e: 06400c13 li s8,100 + printint(fd, va_arg(ap, int), 10, 1); + } else if(c0 == 'l' && c1 == 'd'){ + 442: 06c00c93 li s9,108 + 446: a005 j 466 + putc(fd, c0); + 448: 85ca mv a1,s2 + 44a: 855a mv a0,s6 + 44c: f07ff0ef jal 352 + 450: a019 j 456 + } else if(state == '%'){ + 452: 03598263 beq s3,s5,476 + for(i = 0; fmt[i]; i++){ + 456: 2485 addiw s1,s1,1 + 458: 8726 mv a4,s1 + 45a: 009a07b3 add a5,s4,s1 + 45e: 0007c903 lbu s2,0(a5) + 462: 22090a63 beqz s2,696 + c0 = fmt[i] & 0xff; + 466: 0009079b sext.w a5,s2 + if(state == 0){ + 46a: fe0994e3 bnez s3,452 + if(c0 == '%'){ + 46e: fd579de3 bne a5,s5,448 + state = '%'; + 472: 89be mv s3,a5 + 474: b7cd j 456 + if(c0) c1 = fmt[i+1] & 0xff; + 476: 00ea06b3 add a3,s4,a4 + 47a: 0016c683 lbu a3,1(a3) + c1 = c2 = 0; + 47e: 8636 mv a2,a3 + if(c1) c2 = fmt[i+2] & 0xff; + 480: c681 beqz a3,488 + 482: 9752 add a4,a4,s4 + 484: 00274603 lbu a2,2(a4) + if(c0 == 'd'){ + 488: 05878363 beq a5,s8,4ce + } else if(c0 == 'l' && c1 == 'd'){ + 48c: 05978d63 beq a5,s9,4e6 + printint(fd, va_arg(ap, uint64), 10, 1); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + printint(fd, va_arg(ap, uint64), 10, 1); + i += 2; + } else if(c0 == 'u'){ + 490: 07500713 li a4,117 + 494: 0ee78763 beq a5,a4,582 + printint(fd, va_arg(ap, uint64), 10, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + printint(fd, va_arg(ap, uint64), 10, 0); + i += 2; + } else if(c0 == 'x'){ + 498: 07800713 li a4,120 + 49c: 12e78963 beq a5,a4,5ce + printint(fd, va_arg(ap, uint64), 16, 0); + i += 1; + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + printint(fd, va_arg(ap, uint64), 16, 0); + i += 2; + } else if(c0 == 'p'){ + 4a0: 07000713 li a4,112 + 4a4: 14e78e63 beq a5,a4,600 + printptr(fd, va_arg(ap, uint64)); + } else if(c0 == 'c'){ + 4a8: 06300713 li a4,99 + 4ac: 18e78e63 beq a5,a4,648 + putc(fd, va_arg(ap, uint32)); + } else if(c0 == 's'){ + 4b0: 07300713 li a4,115 + 4b4: 1ae78463 beq a5,a4,65c + if((s = va_arg(ap, char*)) == 0) + s = "(null)"; + for(; *s; s++) + putc(fd, *s); + } else if(c0 == '%'){ + 4b8: 02500713 li a4,37 + 4bc: 04e79563 bne a5,a4,506 + putc(fd, '%'); + 4c0: 02500593 li a1,37 + 4c4: 855a mv a0,s6 + 4c6: e8dff0ef jal 352 + // Unknown % sequence. Print it to draw attention. + putc(fd, '%'); + putc(fd, c0); + } + + state = 0; + 4ca: 4981 li s3,0 + 4cc: b769 j 456 + printint(fd, va_arg(ap, int), 10, 1); + 4ce: 008b8913 addi s2,s7,8 + 4d2: 4685 li a3,1 + 4d4: 4629 li a2,10 + 4d6: 000ba583 lw a1,0(s7) + 4da: 855a mv a0,s6 + 4dc: e95ff0ef jal 370 + 4e0: 8bca mv s7,s2 + state = 0; + 4e2: 4981 li s3,0 + 4e4: bf8d j 456 + } else if(c0 == 'l' && c1 == 'd'){ + 4e6: 06400793 li a5,100 + 4ea: 02f68963 beq a3,a5,51c + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 4ee: 06c00793 li a5,108 + 4f2: 04f68263 beq a3,a5,536 + } else if(c0 == 'l' && c1 == 'u'){ + 4f6: 07500793 li a5,117 + 4fa: 0af68063 beq a3,a5,59a + } else if(c0 == 'l' && c1 == 'x'){ + 4fe: 07800793 li a5,120 + 502: 0ef68263 beq a3,a5,5e6 + putc(fd, '%'); + 506: 02500593 li a1,37 + 50a: 855a mv a0,s6 + 50c: e47ff0ef jal 352 + putc(fd, c0); + 510: 85ca mv a1,s2 + 512: 855a mv a0,s6 + 514: e3fff0ef jal 352 + state = 0; + 518: 4981 li s3,0 + 51a: bf35 j 456 + printint(fd, va_arg(ap, uint64), 10, 1); + 51c: 008b8913 addi s2,s7,8 + 520: 4685 li a3,1 + 522: 4629 li a2,10 + 524: 000bb583 ld a1,0(s7) + 528: 855a mv a0,s6 + 52a: e47ff0ef jal 370 + i += 1; + 52e: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 1); + 530: 8bca mv s7,s2 + state = 0; + 532: 4981 li s3,0 + i += 1; + 534: b70d j 456 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'd'){ + 536: 06400793 li a5,100 + 53a: 02f60763 beq a2,a5,568 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'u'){ + 53e: 07500793 li a5,117 + 542: 06f60963 beq a2,a5,5b4 + } else if(c0 == 'l' && c1 == 'l' && c2 == 'x'){ + 546: 07800793 li a5,120 + 54a: faf61ee3 bne a2,a5,506 + printint(fd, va_arg(ap, uint64), 16, 0); + 54e: 008b8913 addi s2,s7,8 + 552: 4681 li a3,0 + 554: 4641 li a2,16 + 556: 000bb583 ld a1,0(s7) + 55a: 855a mv a0,s6 + 55c: e15ff0ef jal 370 + i += 2; + 560: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 16, 0); + 562: 8bca mv s7,s2 + state = 0; + 564: 4981 li s3,0 + i += 2; + 566: bdc5 j 456 + printint(fd, va_arg(ap, uint64), 10, 1); + 568: 008b8913 addi s2,s7,8 + 56c: 4685 li a3,1 + 56e: 4629 li a2,10 + 570: 000bb583 ld a1,0(s7) + 574: 855a mv a0,s6 + 576: dfbff0ef jal 370 + i += 2; + 57a: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 1); + 57c: 8bca mv s7,s2 + state = 0; + 57e: 4981 li s3,0 + i += 2; + 580: bdd9 j 456 + printint(fd, va_arg(ap, uint32), 10, 0); + 582: 008b8913 addi s2,s7,8 + 586: 4681 li a3,0 + 588: 4629 li a2,10 + 58a: 000be583 lwu a1,0(s7) + 58e: 855a mv a0,s6 + 590: de1ff0ef jal 370 + 594: 8bca mv s7,s2 + state = 0; + 596: 4981 li s3,0 + 598: bd7d j 456 + printint(fd, va_arg(ap, uint64), 10, 0); + 59a: 008b8913 addi s2,s7,8 + 59e: 4681 li a3,0 + 5a0: 4629 li a2,10 + 5a2: 000bb583 ld a1,0(s7) + 5a6: 855a mv a0,s6 + 5a8: dc9ff0ef jal 370 + i += 1; + 5ac: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 10, 0); + 5ae: 8bca mv s7,s2 + state = 0; + 5b0: 4981 li s3,0 + i += 1; + 5b2: b555 j 456 + printint(fd, va_arg(ap, uint64), 10, 0); + 5b4: 008b8913 addi s2,s7,8 + 5b8: 4681 li a3,0 + 5ba: 4629 li a2,10 + 5bc: 000bb583 ld a1,0(s7) + 5c0: 855a mv a0,s6 + 5c2: dafff0ef jal 370 + i += 2; + 5c6: 2489 addiw s1,s1,2 + printint(fd, va_arg(ap, uint64), 10, 0); + 5c8: 8bca mv s7,s2 + state = 0; + 5ca: 4981 li s3,0 + i += 2; + 5cc: b569 j 456 + printint(fd, va_arg(ap, uint32), 16, 0); + 5ce: 008b8913 addi s2,s7,8 + 5d2: 4681 li a3,0 + 5d4: 4641 li a2,16 + 5d6: 000be583 lwu a1,0(s7) + 5da: 855a mv a0,s6 + 5dc: d95ff0ef jal 370 + 5e0: 8bca mv s7,s2 + state = 0; + 5e2: 4981 li s3,0 + 5e4: bd8d j 456 + printint(fd, va_arg(ap, uint64), 16, 0); + 5e6: 008b8913 addi s2,s7,8 + 5ea: 4681 li a3,0 + 5ec: 4641 li a2,16 + 5ee: 000bb583 ld a1,0(s7) + 5f2: 855a mv a0,s6 + 5f4: d7dff0ef jal 370 + i += 1; + 5f8: 2485 addiw s1,s1,1 + printint(fd, va_arg(ap, uint64), 16, 0); + 5fa: 8bca mv s7,s2 + state = 0; + 5fc: 4981 li s3,0 + i += 1; + 5fe: bda1 j 456 + 600: e06a sd s10,0(sp) + printptr(fd, va_arg(ap, uint64)); + 602: 008b8d13 addi s10,s7,8 + 606: 000bb983 ld s3,0(s7) + putc(fd, '0'); + 60a: 03000593 li a1,48 + 60e: 855a mv a0,s6 + 610: d43ff0ef jal 352 + putc(fd, 'x'); + 614: 07800593 li a1,120 + 618: 855a mv a0,s6 + 61a: d39ff0ef jal 352 + 61e: 4941 li s2,16 + putc(fd, digits[x >> (sizeof(uint64) * 8 - 4)]); + 620: 00000b97 auipc s7,0x0 + 624: 278b8b93 addi s7,s7,632 # 898 + 628: 03c9d793 srli a5,s3,0x3c + 62c: 97de add a5,a5,s7 + 62e: 0007c583 lbu a1,0(a5) + 632: 855a mv a0,s6 + 634: d1fff0ef jal 352 + for (i = 0; i < (sizeof(uint64) * 2); i++, x <<= 4) + 638: 0992 slli s3,s3,0x4 + 63a: 397d addiw s2,s2,-1 + 63c: fe0916e3 bnez s2,628 + printptr(fd, va_arg(ap, uint64)); + 640: 8bea mv s7,s10 + state = 0; + 642: 4981 li s3,0 + 644: 6d02 ld s10,0(sp) + 646: bd01 j 456 + putc(fd, va_arg(ap, uint32)); + 648: 008b8913 addi s2,s7,8 + 64c: 000bc583 lbu a1,0(s7) + 650: 855a mv a0,s6 + 652: d01ff0ef jal 352 + 656: 8bca mv s7,s2 + state = 0; + 658: 4981 li s3,0 + 65a: bbf5 j 456 + if((s = va_arg(ap, char*)) == 0) + 65c: 008b8993 addi s3,s7,8 + 660: 000bb903 ld s2,0(s7) + 664: 00090f63 beqz s2,682 + for(; *s; s++) + 668: 00094583 lbu a1,0(s2) + 66c: c195 beqz a1,690 + putc(fd, *s); + 66e: 855a mv a0,s6 + 670: ce3ff0ef jal 352 + for(; *s; s++) + 674: 0905 addi s2,s2,1 + 676: 00094583 lbu a1,0(s2) + 67a: f9f5 bnez a1,66e + if((s = va_arg(ap, char*)) == 0) + 67c: 8bce mv s7,s3 + state = 0; + 67e: 4981 li s3,0 + 680: bbd9 j 456 + s = "(null)"; + 682: 00000917 auipc s2,0x0 + 686: 20e90913 addi s2,s2,526 # 890 + for(; *s; s++) + 68a: 02800593 li a1,40 + 68e: b7c5 j 66e + if((s = va_arg(ap, char*)) == 0) + 690: 8bce mv s7,s3 + state = 0; + 692: 4981 li s3,0 + 694: b3c9 j 456 + 696: 64a6 ld s1,72(sp) + 698: 79e2 ld s3,56(sp) + 69a: 7a42 ld s4,48(sp) + 69c: 7aa2 ld s5,40(sp) + 69e: 7b02 ld s6,32(sp) + 6a0: 6be2 ld s7,24(sp) + 6a2: 6c42 ld s8,16(sp) + 6a4: 6ca2 ld s9,8(sp) + } + } +} + 6a6: 60e6 ld ra,88(sp) + 6a8: 6446 ld s0,80(sp) + 6aa: 6906 ld s2,64(sp) + 6ac: 6125 addi sp,sp,96 + 6ae: 8082 ret + +00000000000006b0 : + +void +fprintf(int fd, const char *fmt, ...) +{ + 6b0: 715d addi sp,sp,-80 + 6b2: ec06 sd ra,24(sp) + 6b4: e822 sd s0,16(sp) + 6b6: 1000 addi s0,sp,32 + 6b8: e010 sd a2,0(s0) + 6ba: e414 sd a3,8(s0) + 6bc: e818 sd a4,16(s0) + 6be: ec1c sd a5,24(s0) + 6c0: 03043023 sd a6,32(s0) + 6c4: 03143423 sd a7,40(s0) + va_list ap; + + va_start(ap, fmt); + 6c8: fe843423 sd s0,-24(s0) + vprintf(fd, fmt, ap); + 6cc: 8622 mv a2,s0 + 6ce: d3fff0ef jal 40c +} + 6d2: 60e2 ld ra,24(sp) + 6d4: 6442 ld s0,16(sp) + 6d6: 6161 addi sp,sp,80 + 6d8: 8082 ret + +00000000000006da : + +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: d0dff0ef jal 40c +} + 704: 60e2 ld ra,24(sp) + 706: 6442 ld s0,16(sp) + 708: 6125 addi sp,sp,96 + 70a: 8082 ret + +000000000000070c : +static Header base; +static Header *freep; + +void +free(void *ap) +{ + 70c: 1141 addi sp,sp,-16 + 70e: e422 sd s0,8(sp) + 710: 0800 addi s0,sp,16 + Header *bp, *p; + + bp = (Header*)ap - 1; + 712: ff050693 addi a3,a0,-16 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 716: 00001797 auipc a5,0x1 + 71a: 8ea7b783 ld a5,-1814(a5) # 1000 + 71e: a02d j 748 + 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; + 720: 4618 lw a4,8(a2) + 722: 9f2d addw a4,a4,a1 + 724: fee52c23 sw a4,-8(a0) + bp->s.ptr = p->s.ptr->s.ptr; + 728: 6398 ld a4,0(a5) + 72a: 6310 ld a2,0(a4) + 72c: a83d j 76a + } else + bp->s.ptr = p->s.ptr; + if(p + p->s.size == bp){ + p->s.size += bp->s.size; + 72e: ff852703 lw a4,-8(a0) + 732: 9f31 addw a4,a4,a2 + 734: c798 sw a4,8(a5) + p->s.ptr = bp->s.ptr; + 736: ff053683 ld a3,-16(a0) + 73a: a091 j 77e + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 73c: 6398 ld a4,0(a5) + 73e: 00e7e463 bltu a5,a4,746 + 742: 00e6ea63 bltu a3,a4,756 +{ + 746: 87ba mv a5,a4 + for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) + 748: fed7fae3 bgeu a5,a3,73c + 74c: 6398 ld a4,0(a5) + 74e: 00e6e463 bltu a3,a4,756 + if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) + 752: fee7eae3 bltu a5,a4,746 + if(bp + bp->s.size == p->s.ptr){ + 756: ff852583 lw a1,-8(a0) + 75a: 6390 ld a2,0(a5) + 75c: 02059813 slli a6,a1,0x20 + 760: 01c85713 srli a4,a6,0x1c + 764: 9736 add a4,a4,a3 + 766: fae60de3 beq a2,a4,720 + bp->s.ptr = p->s.ptr->s.ptr; + 76a: fec53823 sd a2,-16(a0) + if(p + p->s.size == bp){ + 76e: 4790 lw a2,8(a5) + 770: 02061593 slli a1,a2,0x20 + 774: 01c5d713 srli a4,a1,0x1c + 778: 973e add a4,a4,a5 + 77a: fae68ae3 beq a3,a4,72e + p->s.ptr = bp->s.ptr; + 77e: e394 sd a3,0(a5) + } else + p->s.ptr = bp; + freep = p; + 780: 00001717 auipc a4,0x1 + 784: 88f73023 sd a5,-1920(a4) # 1000 +} + 788: 6422 ld s0,8(sp) + 78a: 0141 addi sp,sp,16 + 78c: 8082 ret + +000000000000078e : + return freep; +} + +void* +malloc(uint nbytes) +{ + 78e: 7139 addi sp,sp,-64 + 790: fc06 sd ra,56(sp) + 792: f822 sd s0,48(sp) + 794: f426 sd s1,40(sp) + 796: ec4e sd s3,24(sp) + 798: 0080 addi s0,sp,64 + Header *p, *prevp; + uint nunits; + + nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; + 79a: 02051493 slli s1,a0,0x20 + 79e: 9081 srli s1,s1,0x20 + 7a0: 04bd addi s1,s1,15 + 7a2: 8091 srli s1,s1,0x4 + 7a4: 0014899b addiw s3,s1,1 + 7a8: 0485 addi s1,s1,1 + if((prevp = freep) == 0){ + 7aa: 00001517 auipc a0,0x1 + 7ae: 85653503 ld a0,-1962(a0) # 1000 + 7b2: c915 beqz a0,7e6 + base.s.ptr = freep = prevp = &base; + base.s.size = 0; + } + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 7b4: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 7b6: 4798 lw a4,8(a5) + 7b8: 08977a63 bgeu a4,s1,84c + 7bc: f04a sd s2,32(sp) + 7be: e852 sd s4,16(sp) + 7c0: e456 sd s5,8(sp) + 7c2: e05a sd s6,0(sp) + if(nu < 4096) + 7c4: 8a4e mv s4,s3 + 7c6: 0009871b sext.w a4,s3 + 7ca: 6685 lui a3,0x1 + 7cc: 00d77363 bgeu a4,a3,7d2 + 7d0: 6a05 lui s4,0x1 + 7d2: 000a0b1b sext.w s6,s4 + p = sbrk(nu * sizeof(Header)); + 7d6: 004a1a1b slliw s4,s4,0x4 + p->s.size = nunits; + } + freep = prevp; + return (void*)(p + 1); + } + if(p == freep) + 7da: 00001917 auipc s2,0x1 + 7de: 82690913 addi s2,s2,-2010 # 1000 + if(p == SBRK_ERROR) + 7e2: 5afd li s5,-1 + 7e4: a081 j 824 + 7e6: f04a sd s2,32(sp) + 7e8: e852 sd s4,16(sp) + 7ea: e456 sd s5,8(sp) + 7ec: e05a sd s6,0(sp) + base.s.ptr = freep = prevp = &base; + 7ee: 00001797 auipc a5,0x1 + 7f2: 82278793 addi a5,a5,-2014 # 1010 + 7f6: 00001717 auipc a4,0x1 + 7fa: 80f73523 sd a5,-2038(a4) # 1000 + 7fe: e39c sd a5,0(a5) + base.s.size = 0; + 800: 0007a423 sw zero,8(a5) + if(p->s.size >= nunits){ + 804: b7c1 j 7c4 + prevp->s.ptr = p->s.ptr; + 806: 6398 ld a4,0(a5) + 808: e118 sd a4,0(a0) + 80a: a8a9 j 864 + hp->s.size = nu; + 80c: 01652423 sw s6,8(a0) + free((void*)(hp + 1)); + 810: 0541 addi a0,a0,16 + 812: efbff0ef jal 70c + return freep; + 816: 00093503 ld a0,0(s2) + if((p = morecore(nunits)) == 0) + 81a: c12d beqz a0,87c + for(p = prevp->s.ptr; ; prevp = p, p = p->s.ptr){ + 81c: 611c ld a5,0(a0) + if(p->s.size >= nunits){ + 81e: 4798 lw a4,8(a5) + 820: 02977263 bgeu a4,s1,844 + if(p == freep) + 824: 00093703 ld a4,0(s2) + 828: 853e mv a0,a5 + 82a: fef719e3 bne a4,a5,81c + p = sbrk(nu * sizeof(Header)); + 82e: 8552 mv a0,s4 + 830: a4fff0ef jal 27e + if(p == SBRK_ERROR) + 834: fd551ce3 bne a0,s5,80c + return 0; + 838: 4501 li a0,0 + 83a: 7902 ld s2,32(sp) + 83c: 6a42 ld s4,16(sp) + 83e: 6aa2 ld s5,8(sp) + 840: 6b02 ld s6,0(sp) + 842: a03d j 870 + 844: 7902 ld s2,32(sp) + 846: 6a42 ld s4,16(sp) + 848: 6aa2 ld s5,8(sp) + 84a: 6b02 ld s6,0(sp) + if(p->s.size == nunits) + 84c: fae48de3 beq s1,a4,806 + p->s.size -= nunits; + 850: 4137073b subw a4,a4,s3 + 854: c798 sw a4,8(a5) + p += p->s.size; + 856: 02071693 slli a3,a4,0x20 + 85a: 01c6d713 srli a4,a3,0x1c + 85e: 97ba add a5,a5,a4 + p->s.size = nunits; + 860: 0137a423 sw s3,8(a5) + freep = prevp; + 864: 00000717 auipc a4,0x0 + 868: 78a73e23 sd a0,1948(a4) # 1000 + return (void*)(p + 1); + 86c: 01078513 addi a0,a5,16 + } +} + 870: 70e2 ld ra,56(sp) + 872: 7442 ld s0,48(sp) + 874: 74a2 ld s1,40(sp) + 876: 69e2 ld s3,24(sp) + 878: 6121 addi sp,sp,64 + 87a: 8082 ret + 87c: 7902 ld s2,32(sp) + 87e: 6a42 ld s4,16(sp) + 880: 6aa2 ld s5,8(sp) + 882: 6b02 ld s6,0(sp) + 884: b7f5 j 870 diff --git a/G12_Project2_2/user/zombie.c b/G12_Project2_2/user/zombie.c new file mode 100644 index 0000000000..d59dc03f80 --- /dev/null +++ b/G12_Project2_2/user/zombie.c @@ -0,0 +1,14 @@ +// Create a zombie process that +// must be reparented at exit. + +#include "kernel/types.h" +#include "kernel/stat.h" +#include "user/user.h" + +int +main(void) +{ + if(fork() > 0) + pause(5); // Let child exit before parent. + exit(0); +} diff --git a/G12_Project2_2/user/zombie.d b/G12_Project2_2/user/zombie.d new file mode 100644 index 0000000000..588534d858 --- /dev/null +++ b/G12_Project2_2/user/zombie.d @@ -0,0 +1 @@ +user/zombie.o: user/zombie.c kernel/types.h kernel/stat.h user/user.h diff --git a/G12_Project2_2/user/zombie.o b/G12_Project2_2/user/zombie.o new file mode 100644 index 0000000000..8ab48cd1e6 Binary files /dev/null and b/G12_Project2_2/user/zombie.o differ diff --git a/G12_Project2_2/user/zombie.sym b/G12_Project2_2/user/zombie.sym new file mode 100644 index 0000000000..b4d2be4e7e --- /dev/null +++ b/G12_Project2_2/user/zombie.sym @@ -0,0 +1,65 @@ +0000000000000000 .text +0000000000000888 .rodata +00000000000008b0 .eh_frame +0000000000001000 .data +0000000000001000 .bss +0000000000000000 .debug_info +0000000000000000 .debug_abbrev +0000000000000000 .debug_loc +0000000000000000 .debug_aranges +0000000000000000 .debug_line +0000000000000000 .debug_str +0000000000000000 .comment +0000000000000000 .riscv.attributes +0000000000000000 .debug_ranges +0000000000000000 zombie.c +0000000000000000 ulib.c +0000000000000000 usys.o +0000000000000000 printf.c +0000000000000352 putc +0000000000000370 printint +0000000000000898 digits +0000000000000000 umalloc.c +0000000000001000 freep +0000000000001010 base +000000000000002e strcpy +0000000000000342 pause +00000000000006da printf +000000000000033a sys_sbrk +00000000000001d8 memmove +00000000000002fa mknod +00000000000000e6 gets +0000000000000332 getpid +000000000000026a memcpy +000000000000078e malloc +0000000000000294 sbrklazy +00000000000002c2 pipe +00000000000002d2 write +000000000000030a fstat +00000000000006b0 fprintf +00000000000002e2 kill +000000000000040c vprintf +0000000000000322 chdir +00000000000002ea exec +00000000000002ba wait +00000000000002ca read +0000000000000302 unlink +0000000000000230 memcmp +00000000000002aa fork +000000000000027e sbrk +000000000000034a uptime +00000000000000a0 memset +0000000000000000 main +000000000000004a strcmp +000000000000032a dup +0000000000000156 stat +0000000000000312 link +00000000000002b2 exit +000000000000001e start +0000000000000190 atoi +0000000000000076 strlen +00000000000002f2 open +00000000000000c2 strchr +000000000000031a mkdir +00000000000002da close +000000000000070c free diff --git a/README.md b/README.md new file mode 100644 index 0000000000..f4ac2dcec9 --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +# MLFQ Scheduling (Project 2) + +## Overview + +This program implements the Multilevel Feedback Queue (MLFQ) scheduling algorithm using a simple array-based approach. + +It simulates how processes are scheduled across multiple priority queues based on their CPU usage. + +--- + +## Algorithm + +The scheduler uses 3 queues: + +* Q0 → Time slice = 1 (highest priority) +* Q1 → Time slice = 2 +* Q2 → Time slice = 4 (lowest priority) + +### Working: + +* All processes start in Q0 +* If a process uses its full time slice → it is moved to a lower queue +* Scheduler always selects from the highest priority queue available + +--- + +## Input + +Processes used: + +``` +P1: AT=0, BT=5 +P2: AT=1, BT=3 +P3: AT=2, BT=4 +``` + +--- + +## Output + +### Timeline + +``` +| T0:P1(Q0) | T1:P2(Q0) | T2:P3(Q0) | T3:P1(Q1) | T4:P1(Q1) | +| T5:P2(Q1) | T6:P2(Q1) | T7:P3(Q1) | T8:P3(Q1) | +| T9:P1(Q2) | T10:P1(Q2) | T11:P3(Q2) | +``` + +--- + +### Metrics + +* Completion Time (CT) +* Turnaround Time (TAT = CT - AT) +* Waiting Time (WT = TAT - BT) + +Average values: + +* Average Turnaround Time = 9.00 +* Average Waiting Time = 5.00 + +--- + +## How to Run + +``` +gcc mlfq.c -o mlfq +./mlfq +``` + +--- + +## Key Features + +* Array-based implementation +* Multiple priority queues +* Dynamic priority adjustment (demotion) +* Clear timeline visualization +* Performance metrics calculation